From 978c5abf82889771dedefdaba27e9c6ad666ddcf Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Thu, 7 Dec 2023 21:21:44 +0000 Subject: [PATCH] deploy: 6eccbf36dd147b286519204b279cd514ad2c465f --- .nojekyll | 0 2022-08-12-network/index.html | 37 + 2022-08-12-sre/index.html | 46 + 2022-08-31-consensus/index.html | 109 + 2022-09-01-ledger/index.html | 46 + 2022-09-16-ledger/index.html | 49 + 2022-09-19-db-sync/index.html | 43 + 2022-09-20-consensus/index.html | 77 + 2022-09-27-network/index.html | 55 + 2022-09-30-ledger/index.html | 50 + 2022-10-02-consensus/index.html | 76 + 2022-10-04-db-sync/index.html | 43 + 2022-10-04-node-cli-api/index.html | 24 + 2022-10-05-consensus/index.html | 52 + 2022-10-14-hydra/index.html | 24 + 2022-10-14-ledger/index.html | 53 + 2022-10-18-consensus/index.html | 64 + 2022-10-19-node-cli-api/index.html | 24 + 2022-10-21-hydra/index.html | 29 + 2022-10-27-crypto/index.html | 28 + 2022-10-28-hydra/index.html | 29 + 2022-10-28-network/index.html | 60 + 2022-10-28-performance-and-tracing/index.html | 24 + 2022-10-31-open-source/index.html | 45 + 2022-11-01-db-sync/index.html | 35 + 2022-11-02-ledger/index.html | 52 + 2022-11-02-node-cli-api/index.html | 24 + 2022-11-02-release/index.html | 25 + 2022-11-02-system-test/index.html | 24 + 2022-11-03-embedding-quality/index.html | 25 + 2022-11-04-hydra/index.html | 24 + 2022-11-04-mithril/index.html | 24 + 2022-11-11-crypto/index.html | 24 + 2022-11-11-hydra/index.html | 25 + 2022-11-11-ledger/index.html | 56 + 2022-11-11-network/index.html | 37 + 2022-11-16-consensus/index.html | 84 + 2022-11-16-node-cli-api/index.html | 24 + 2022-11-16-performance-and-tracing/index.html | 24 + 2022-11-18-hydra/index.html | 24 + 2022-11-18-mithril/index.html | 24 + 2022-11-23-ledger/index.html | 50 + 2022-11-25-crypto/index.html | 24 + 2022-11-25-hydra/index.html | 24 + 2022-11-28-network/index.html | 64 + 2022-11-30-consensus/index.html | 54 + 2022-11-30-node-cli-api/index.html | 24 + 2022-11-30-performance-and-tracing/index.html | 26 + 2022-12-01-db-sync/index.html | 36 + 2022-12-01-mithril/index.html | 24 + 2022-12-01-system-test/index.html | 25 + 2022-12-02-hydra/index.html | 31 + 2022-12-09-crypto/index.html | 24 + 2022-12-09-hydra/index.html | 24 + 2022-12-09-ledger/index.html | 59 + 2022-12-12-network/index.html | 28 + 2022-12-14-consensus/index.html | 65 + 2022-12-14-db-sync/index.html | 33 + 2022-12-14-node-cli-api/index.html | 24 + 2022-12-14-performance-and-tracing/index.html | 28 + 2022-12-15-mithril/index.html | 24 + 2022-12-16-hydra/index.html | 24 + 2022-12-28-node-cli-api/index.html | 24 + 2023-01-05-ledger/index.html | 71 + 2023-01-06-crypto/index.html | 24 + 2023-01-11-consensus/index.html | 53 + 2023-01-11-performance-and-tracing/index.html | 26 + 2023-01-12-mithril/index.html | 24 + 2023-01-13-hydra/index.html | 37 + 2023-01-13-release/index.html | 26 + 2023-01-13-system-test/index.html | 27 + 2023-01-14-db-sync/index.html | 29 + 2023-01-19-ledger/index.html | 48 + 2023-01-20-crypto/index.html | 24 + 2023-01-20-hydra/index.html | 31 + 2023-01-20-network/index.html | 34 + 2023-01-20-sre/index.html | 25 + 2023-01-25-consensus/index.html | 53 + 2023-01-25-node-cli-api/index.html | 24 + 2023-01-26-mithril/index.html | 24 + 2023-01-27-hydra/index.html | 32 + 2023-02-02-ledger/index.html | 35 + 2023-02-03-crypto/index.html | 24 + 2023-02-03-goedel/index.html | 30 + 2023-02-03-hydra/index.html | 31 + 2023-02-08-consensus/index.html | 42 + 2023-02-08-node-cli-api/index.html | 24 + 2023-02-08-performance-and-tracing/index.html | 24 + 2023-02-09-mithril/index.html | 24 + 2023-02-10-hydra/index.html | 31 + 2023-02-17-crypto/index.html | 24 + 2023-02-17-goedel/index.html | 31 + 2023-02-17-hydra/index.html | 28 + 2023-02-17-ledger/index.html | 47 + 2023-02-17-network/index.html | 32 + 2023-02-21-db-sync/index.html | 35 + 2023-02-22-consensus/index.html | 59 + 2023-02-22-node-cli-api/index.html | 24 + 2023-02-23-mithril/index.html | 24 + 2023-02-23-performance-and-tracing/index.html | 24 + 2023-02-24-hydra/index.html | 37 + 2023-03-02-network/index.html | 44 + 2023-03-03-crypto/index.html | 24 + 2023-03-03-goedel/index.html | 34 + 2023-03-03-hydra/index.html | 33 + 2023-03-03-ledger/index.html | 35 + 2023-03-08-consensus/index.html | 53 + 2023-03-08-node-cli-api/index.html | 24 + 2023-03-08-performance-and-tracing/index.html | 29 + 2023-03-09-mithril/index.html | 24 + 2023-03-10-hydra/index.html | 28 + 2023-03-16-goedel/index.html | 31 + 2023-03-17-crypto/index.html | 24 + 2023-03-17-hydra/index.html | 36 + 2023-03-17-ledger/index.html | 33 + 2023-03-21-network/index.html | 41 + 2023-03-22-consensus/index.html | 30 + 2023-03-22-node-cli-api/index.html | 24 + 2023-03-22-performance-and-tracing/index.html | 30 + 2023-03-23-db-sync/index.html | 33 + 2023-03-23-mithril/index.html | 24 + 2023-03-24-hydra/index.html | 29 + 2023-03-27-system-test/index.html | 24 + 2023-03-31-crypto/index.html | 24 + 2023-03-31-goedel/index.html | 29 + 2023-03-31-hydra/index.html | 29 + 2023-03-31-ledger/index.html | 37 + 2023-04-05-consensus/index.html | 33 + 2023-04-05-node-cli-api/index.html | 24 + 2023-04-05-performance-and-tracing/index.html | 32 + 2023-04-06-mithril/index.html | 24 + 2023-04-07-hydra/index.html | 31 + 2023-04-14-goedel/index.html | 27 + 2023-04-14-hydra/index.html | 30 + 2023-04-17-ledger/index.html | 27 + 2023-04-19-consensus/index.html | 35 + 2023-04-19-performance-and-tracing/index.html | 37 + 2023-04-20-mithril/index.html | 24 + 2023-04-20-node-cli-api/index.html | 24 + 2023-04-21-hydra/index.html | 30 + 2023-04-21-ledger/index.html | 27 + 2023-04-27-hydra/index.html | 34 + 2023-04-28-crypto/index.html | 24 + 2023-04-28-goedel/index.html | 27 + 2023-04-28-network/index.html | 31 + 2023-05-01-db-sync/index.html | 29 + 2023-05-03-consensus/index.html | 50 + 2023-05-03-performance-and-tracing/index.html | 32 + 2023-05-04-mithril/index.html | 24 + 2023-05-05-ledger/index.html | 36 + 2023-05-05-node-cli-api/index.html | 24 + 2023-05-12-crypto/index.html | 24 + 2023-05-12-goedel/index.html | 28 + 2023-05-12-hydra/index.html | 33 + 2023-05-12-network/index.html | 41 + 2023-05-17-consensus/index.html | 24 + 2023-05-17-mithril/index.html | 24 + 2023-05-17-performance-and-tracing/index.html | 37 + 2023-05-19-hydra/index.html | 24 + 2023-05-24-node-cli-api/index.html | 24 + 2023-05-26-goedel/index.html | 27 + 2023-05-26-hydra/index.html | 32 + 2023-05-26-ledger/index.html | 28 + 2023-05-26-network/index.html | 28 + 2023-05-31-consensus/index.html | 24 + 2023-05-31-performance-and-tracing/index.html | 35 + 2023-06-01-mithril/index.html | 24 + 2023-06-02-hydra/index.html | 33 + 2023-06-07-node-cli-api/index.html | 24 + 2023-06-08-db-sync/index.html | 31 + 2023-06-08-goedel/index.html | 31 + 2023-06-08-sre/index.html | 24 + 2023-06-08-system-test/index.html | 24 + 2023-06-09-crypto/index.html | 24 + 2023-06-09-developer-experience/index.html | 24 + 2023-06-09-hydra/index.html | 32 + 2023-06-12-network/index.html | 43 + 2023-06-14-consensus/index.html | 27 + 2023-06-14-performance-and-tracing/index.html | 30 + 2023-06-15-mithril/index.html | 24 + 2023-06-16-hydra/index.html | 27 + 2023-06-23-goedel/index.html | 26 + 2023-06-23-hydra/index.html | 34 + 2023-06-23-network/index.html | 43 + 2023-06-23-sre/index.html | 24 + 2023-06-28-consensus/index.html | 24 + 2023-06-28-performance-and-tracing/index.html | 24 + 2023-06-29-mithril/index.html | 24 + 2023-06-30-hydra/index.html | 30 + 2023-07-04-db-sync/index.html | 30 + 2023-07-04-node-cli-api/index.html | 24 + 2023-07-06-developer-experience/index.html | 24 + 2023-07-07-crypto/index.html | 25 + 2023-07-07-goedel/index.html | 28 + 2023-07-07-hydra/index.html | 31 + 2023-07-07-sre/index.html | 24 + 2023-07-12-consensus/index.html | 24 + 2023-07-12-performance-and-tracing/index.html | 24 + 2023-07-13-mithril/index.html | 24 + 2023-07-14-hydra/index.html | 29 + 2023-07-18-node-cli-api/index.html | 24 + 2023-07-20-goedel/index.html | 30 + 2023-07-21-hydra/index.html | 34 + 2023-07-21-ledger/index.html | 28 + 2023-07-21-sre/index.html | 24 + 2023-07-26-consensus/index.html | 26 + 2023-07-27-mithril/index.html | 24 + 2023-07-28-hydra/index.html | 31 + 2023-07-31-network/index.html | 38 + 2023-08-01-node-cli-api/index.html | 24 + 2023-08-04-crypto/index.html | 25 + 2023-08-04-goedel/index.html | 29 + 2023-08-04-hydra/index.html | 31 + 2023-08-04-ledger/index.html | 27 + 2023-08-04-network/index.html | 44 + 2023-08-04-performance-and-tracing/index.html | 31 + 2023-08-04-sre/index.html | 24 + 2023-08-09-consensus/index.html | 24 + 2023-08-10-mithril/index.html | 24 + 2023-08-11-hydra/index.html | 32 + 2023-08-11-performance-and-tracing/index.html | 28 + 2023-08-15-node-cli-api/index.html | 24 + 2023-08-17-crypto/index.html | 24 + 2023-08-17-db-sync/index.html | 32 + 2023-08-17-secp-issue/index.html | 31 + 2023-08-18-goedel/index.html | 33 + 2023-08-18-hydra/index.html | 34 + 2023-08-18-ledger/index.html | 29 + 2023-08-18-network/index.html | 46 + 2023-08-18-sre/index.html | 24 + 2023-08-23-consensus/index.html | 25 + 2023-08-24-performance-and-tracing/index.html | 26 + 2023-08-25-hydra/index.html | 30 + 2023-08-28-mithril/index.html | 24 + 2023-08-29-node-cli-api/index.html | 24 + 2023-09-01-goedel/index.html | 28 + 2023-09-01-hydra/index.html | 28 + 2023-09-01-ledger/index.html | 24 + 2023-09-01-network/index.html | 53 + 2023-09-01-sre/index.html | 24 + 2023-09-06-consensus/index.html | 26 + 2023-09-07-mithril/index.html | 24 + 2023-09-07-performance-and-tracing/index.html | 29 + 2023-09-08-hydra/index.html | 41 + 2023-09-12-node-cli-api/index.html | 28 + 2023-09-14-db-sync/index.html | 32 + 2023-09-15-goedel/index.html | 27 + 2023-09-15-hydra/index.html | 30 + 2023-09-15-ledger/index.html | 30 + 2023-09-15-network/index.html | 42 + 2023-09-15-sre/index.html | 24 + 2023-09-20-consensus/index.html | 30 + 2023-09-20-mithril/index.html | 24 + 2023-09-22-hydra/index.html | 46 + 2023-09-22-performance-and-tracing/index.html | 35 + 2023-09-26-node-cli-api/index.html | 24 + 2023-09-27-mithril/index.html | 24 + 2023-09-29-goedel/index.html | 28 + 2023-09-29-hydra/index.html | 27 + 2023-09-29-ledger/index.html | 32 + 2023-09-29-sre/index.html | 24 + 2023-10-02-network/index.html | 42 + 2023-10-04-consensus/index.html | 25 + 2023-10-04-mithril/index.html | 24 + 2023-10-06-hydra/index.html | 24 + 2023-10-06-performance-and-tracing/index.html | 32 + 2023-10-10-node-cli-api/index.html | 24 + 2023-10-11-mithril/index.html | 24 + 2023-10-13-hydra/index.html | 24 + 2023-10-13-ledger/index.html | 30 + 2023-10-13-sre/index.html | 24 + 2023-10-15-network/index.html | 30 + 2023-10-18-consensus/index.html | 24 + 2023-10-18-mithril/index.html | 24 + 2023-10-20-hydra/index.html | 26 + 2023-10-24-node-cli-api/index.html | 24 + 2023-10-25-mithril/index.html | 24 + 2023-10-27-hydra/index.html | 34 + 2023-10-27-network/index.html | 35 + 2023-10-27-sre/index.html | 24 + 2023-11-01-consensus/index.html | 26 + 2023-11-01-mithril/index.html | 24 + 2023-11-08-ledger/index.html | 34 + 2023-11-08-mithril/index.html | 24 + 2023-11-09-db-sync/index.html | 32 + 2023-11-10-hydra/index.html | 51 + 2023-11-10-sre/index.html | 24 + 2023-11-14-node-cli-api/index.html | 24 + 2023-11-15-consensus/index.html | 28 + 2023-11-15-mithril/index.html | 24 + 2023-11-16-network/index.html | 28 + 2023-11-17-hydra/index.html | 31 + 2023-11-17-performance-and-tracing/index.html | 34 + 2023-11-20-cip1694/index.html | 25 + 2023-11-22-ledger/index.html | 28 + 2023-11-22-mithril/index.html | 24 + 2023-11-24-hydra/index.html | 47 + 2023-11-24-sre/index.html | 24 + 2023-11-29-consensus/index.html | 29 + 2023-11-29-mithril/index.html | 24 + 2023-12-01-hydra/index.html | 38 + 2023-12-04-performance-and-tracing/index.html | 28 + 2023-12-06-ledger/index.html | 30 + 2023-12-06-mithril/index.html | 24 + 404.html | 24 + archive/index.html | 24 + assets/css/styles.1b2b551c.css | 1 + ...4-UCL-60c46564c5dee25b0060304c060ab1cf.pdf | Bin 0 -> 389191 bytes ...eline-9fd0e0e080975cc6cfbe035731b4f38d.svg | 2277 ++++++ ...liced-77ff018af70191b4122b1e7cf56c79b8.svg | 2041 ++++++ ...aders-55bb0b4d41e8f0cff0066e1bec91bdd2.png | Bin 0 -> 27290 bytes ...batch-c6570a71c4a5d53b10cb7309d2cc742c.png | Bin 0 -> 33248 bytes ...ering-e49aa27a0e549f0195373203da971ba7.png | Bin 0 -> 52161 bytes ...hmark-c46be3db45ff5480ed104e0d520711a6.png | Bin 0 -> 83821 bytes ...marks-dcf6daaf5460de7591a60db1457d2e58.png | Bin 0 -> 76970 bytes ...marks-6b129a1acaa4bb48443ee81add51fd39.png | Bin 0 -> 104414 bytes ...gress-194a909569eebb016b1f24fb8941e2cc.png | Bin 0 -> 85638 bytes ...elays-8e5be189ad8437375c5067026c003556.png | Bin 0 -> 325791 bytes ...sions-0a8d445e1b0f3a793ccdd94f4aacd421.png | Bin 0 -> 356758 bytes ...elays-1b3da3da7ec3915f63ca8668bd38aff9.png | Bin 0 -> 326185 bytes ...sions-a689a96e93e12ee1c78dfe14229f0ea9.png | Bin 0 -> 379198 bytes ...elays-75c2baf57ea9346a40f0098b2abb4a99.png | Bin 0 -> 324130 bytes ...sions-5168d3ed0ad365a18e86263fcccffd23.png | Bin 0 -> 377636 bytes ...graph-ded65e814bfe6d927faa1c5c66bbbfad.png | Bin 0 -> 164771 bytes ...marks-74f9d76c2602f09652f584cc4d6a0962.png | Bin 0 -> 58311 bytes ...ption-cd944582f02809777c58be53e13453c5.png | Bin 0 -> 158649 bytes ...pdown-35e13cbe46c9923327f30a76a90bff3b.png | Bin 0 -> 25427 bytes ...nch-1-2c33ba45f44a086415e703fe8f0f7ad1.svg | 1812 +++++ ...nch-2-e23d2986ddef0a187df9ce336b2db116.svg | 1888 +++++ ...relim-5bbe2e2a20a2740e6238a7c73e618168.svg | 1424 ++++ ...pdown-f0d995e751e7656a1b0dbbc1134e49c2.png | Bin 0 -> 27841 bytes assets/js/0048047b.7e1f75e8.js | 1 + assets/js/007e4c05.e45fd96d.js | 1 + assets/js/00bb8269.def94b86.js | 1 + assets/js/015be621.e0570f17.js | 1 + assets/js/017cd6b7.6c855c6e.js | 1 + assets/js/019bb279.7e5077df.js | 1 + assets/js/01a85c17.545379d8.js | 1 + assets/js/0281a492.3b7b7eac.js | 1 + assets/js/034a14a6.3aafc153.js | 1 + assets/js/03d856aa.52e2f164.js | 1 + assets/js/042169f6.41e4831f.js | 1 + assets/js/0431617f.5c919503.js | 1 + assets/js/04326247.8876239e.js | 1 + assets/js/046dd16d.729d4d40.js | 1 + assets/js/04c3317f.e2f79174.js | 1 + assets/js/04cbd10c.9008202b.js | 1 + assets/js/05f2862f.32b47b8d.js | 1 + assets/js/0645cd02.fa280ace.js | 1 + assets/js/06a283ef.b8b2b1f9.js | 1 + assets/js/07541956.2c467b7c.js | 1 + assets/js/07fdf123.654288cb.js | 1 + assets/js/0801ba5a.ebcbb7d6.js | 1 + assets/js/089154c4.cd4dba30.js | 1 + assets/js/08c82b6d.8647aa4f.js | 1 + assets/js/09abc415.e2f175c7.js | 1 + assets/js/0a44a251.e62524d6.js | 1 + assets/js/0ade4266.b7cf47d6.js | 1 + assets/js/0af81f82.4b115c93.js | 1 + assets/js/0b0bfceb.29fc63d0.js | 1 + assets/js/0b1b72af.a3f1baa4.js | 1 + assets/js/0b5e25e7.c75d5f30.js | 1 + assets/js/0c10bcf4.c8aa7ca2.js | 1 + assets/js/0c11045c.7ecdd83c.js | 1 + assets/js/0c48efb1.01a06fce.js | 1 + assets/js/0d671897.dc5836f3.js | 1 + assets/js/0d7612e9.c2555544.js | 1 + assets/js/0d889cfb.7f793126.js | 1 + assets/js/0db650db.bac77798.js | 1 + assets/js/0dc0e43e.00835288.js | 1 + assets/js/0de82e28.ff3d9525.js | 1 + assets/js/0dea9a3b.e1158297.js | 1 + assets/js/0dfea636.45223f2a.js | 1 + assets/js/0e0c98f4.b615e9a6.js | 1 + assets/js/0e384e19.2cd17c73.js | 1 + assets/js/0e717c32.e588556c.js | 1 + assets/js/0e828f3a.84204c63.js | 1 + assets/js/0ee9866d.aa05b5be.js | 1 + assets/js/0fa2fd29.15fed629.js | 1 + assets/js/10532414.69c8af62.js | 1 + assets/js/10659ce5.04295867.js | 1 + assets/js/113fed8c.43bf9228.js | 1 + assets/js/11423591.8e82ecb7.js | 1 + assets/js/1147f4da.c6a37e99.js | 1 + assets/js/120c0b00.b79d45ef.js | 1 + assets/js/12208c5e.498a6ea8.js | 1 + assets/js/12525f14.359b7596.js | 1 + assets/js/12637b23.8c689cc8.js | 1 + assets/js/126e82e6.4290e249.js | 1 + assets/js/12a1613f.0e2fe3c1.js | 1 + assets/js/12c83d8a.ebd0fc40.js | 1 + assets/js/12d5d907.1addbe15.js | 1 + assets/js/12ef8706.114e8e85.js | 1 + assets/js/1377d1fa.d6f4b9df.js | 1 + assets/js/144cea98.f99162b0.js | 1 + assets/js/144cf255.88218aa6.js | 1 + assets/js/14eb3368.75d4fe89.js | 1 + assets/js/14fc0a72.a4681214.js | 1 + assets/js/14ffac04.cf60f381.js | 1 + assets/js/15072f11.49e121a3.js | 1 + assets/js/154dea53.1fc8ba85.js | 1 + assets/js/15691c1d.51e197de.js | 1 + assets/js/15dc596d.ecdc1050.js | 1 + assets/js/166775fd.be23135f.js | 1 + assets/js/16a93549.ab7d990e.js | 1 + assets/js/1752e4e5.873d8644.js | 1 + assets/js/17630979.ef34abf8.js | 1 + assets/js/177280a4.d0786185.js | 1 + assets/js/17896441.12db7610.js | 1 + assets/js/17e76f05.72c79f2a.js | 1 + assets/js/17f4ca64.bfe3c38a.js | 1 + assets/js/187056c8.90cfbf91.js | 1 + assets/js/18c41134.31284dc4.js | 1 + assets/js/1a21d6a2.8c1f975e.js | 1 + assets/js/1a657a20.8a85f02f.js | 1 + assets/js/1a932c01.6aaf6224.js | 1 + assets/js/1afca88e.5924808c.js | 1 + assets/js/1b0bebd5.e1bd57de.js | 1 + assets/js/1b2a226f.ac20107e.js | 1 + assets/js/1b2c892c.dc757eff.js | 1 + assets/js/1b2c8e6e.9c8b7196.js | 1 + assets/js/1b34f23d.944aa387.js | 1 + assets/js/1be78505.eb072735.js | 1 + assets/js/1be923a7.8d35f70e.js | 1 + assets/js/1c192ca4.8659f9df.js | 1 + assets/js/1caacab6.f165aa95.js | 1 + assets/js/1d10bd9e.e7b9cd1c.js | 1 + assets/js/1da92289.64c6b1ce.js | 1 + assets/js/1e0f95a7.4185e54d.js | 1 + assets/js/1e24dd00.03c90e48.js | 1 + assets/js/1e4232ab.8f20f4ae.js | 1 + assets/js/1e57c0e2.66497df8.js | 1 + assets/js/1f391b9e.4c243540.js | 1 + assets/js/1f965afe.e03ac866.js | 1 + assets/js/1f9c0c9c.5dc5eee7.js | 1 + assets/js/2073b851.3d1c7c5a.js | 1 + assets/js/209bf559.8a8670ee.js | 1 + assets/js/20bc6fcd.6a2cce37.js | 1 + assets/js/20ca2c37.5368fb83.js | 1 + assets/js/2154b8e4.4635d227.js | 1 + assets/js/21735eff.0b009fcd.js | 1 + assets/js/21857c8f.db26831e.js | 1 + assets/js/219856ee.fc647f5b.js | 1 + assets/js/2276e554.dfa87ea9.js | 1 + assets/js/237aa4d6.8db3819a.js | 1 + assets/js/23a95b4f.a0a27f60.js | 1 + assets/js/2455acc4.54c4fd43.js | 1 + assets/js/245ecae9.0554e2e3.js | 1 + assets/js/246d9f04.1a9615d1.js | 1 + assets/js/2494f6fc.cb95a366.js | 1 + assets/js/24d5a6d9.56e383b8.js | 1 + assets/js/2529.3a3a1ec8.js | 1 + assets/js/255b72b4.c906285c.js | 1 + assets/js/26678b7e.706c9ffb.js | 1 + assets/js/26a4b8b3.b55c0ab6.js | 1 + assets/js/274d7200.08e977b8.js | 1 + assets/js/27c15961.1370e42d.js | 1 + assets/js/27c463c7.c17177cd.js | 1 + assets/js/28874657.18164af4.js | 1 + assets/js/28bc1d1b.e033ce8a.js | 1 + assets/js/28d85025.84af456e.js | 1 + assets/js/29801efc.c897fcb8.js | 1 + assets/js/2a8f0182.70e085a1.js | 1 + assets/js/2b637fd9.56e9f371.js | 1 + assets/js/2bc04bf6.977be0a1.js | 1 + assets/js/2c045882.801eedcd.js | 1 + assets/js/2d0da244.cbe1ecb9.js | 1 + assets/js/2d52a685.16ff720d.js | 1 + assets/js/2d72833d.b2ed8410.js | 1 + assets/js/2d91c21f.2b35d919.js | 1 + assets/js/2dd2949a.e4a51357.js | 1 + assets/js/2e28eb6b.9479c2e3.js | 1 + assets/js/2e2abe90.2e84cbdd.js | 1 + assets/js/2e52ad4e.1909c27b.js | 1 + assets/js/2e69cd33.7723f713.js | 1 + assets/js/2eba0b82.d58fcc5f.js | 1 + assets/js/2ebccc4d.b7a55404.js | 1 + assets/js/2f97c20a.ce7c08f0.js | 1 + assets/js/2fa57f55.9c6c3715.js | 1 + assets/js/2fd426fa.ac550511.js | 1 + assets/js/301cd1f4.2e5b4d2a.js | 1 + assets/js/31025fde.797a7c77.js | 1 + assets/js/3143eb67.b959afc8.js | 1 + assets/js/31889a8f.911b77aa.js | 1 + assets/js/324138c8.0ffe20ee.js | 1 + assets/js/32d4ad41.059e2e13.js | 1 + assets/js/3328a3bf.2a0ee70d.js | 1 + assets/js/335868d9.3ea9cbb3.js | 1 + assets/js/3399a664.cb1ecec9.js | 1 + assets/js/34012593.05c2493c.js | 1 + assets/js/347c3e4d.648bedec.js | 1 + assets/js/34c17ec8.6d76c4fb.js | 1 + assets/js/35369e36.c570c97c.js | 1 + assets/js/354f96c6.f214d6fc.js | 1 + assets/js/35785fae.0a17f637.js | 1 + assets/js/35961293.d0fa4575.js | 1 + assets/js/359aa856.a7e87b7a.js | 1 + assets/js/35c3586e.55caad30.js | 1 + assets/js/35e2a0c5.c76faf09.js | 1 + assets/js/35ef34ae.d5d7c472.js | 1 + assets/js/35f1ce0d.c093fa38.js | 1 + assets/js/36a96f5a.9a5af48d.js | 1 + assets/js/370c5287.99fe1c0a.js | 1 + assets/js/372219b0.103948fa.js | 1 + assets/js/376dd8e8.2261b7dd.js | 1 + assets/js/37b247a8.bcaeb502.js | 1 + assets/js/37b2e4a4.2c8ca832.js | 1 + assets/js/38284ae5.6211d81b.js | 1 + assets/js/387f3426.93ddf683.js | 1 + assets/js/388f6888.258f2772.js | 1 + assets/js/391126a1.ec0b455d.js | 1 + assets/js/393be207.17ef41bf.js | 1 + assets/js/393cd824.593da712.js | 1 + assets/js/397686d4.61d37a76.js | 1 + assets/js/3a3a2602.b09aebb4.js | 1 + assets/js/3a40f46b.b5ec8c54.js | 1 + assets/js/3a493dd8.735658ae.js | 1 + assets/js/3ab5f4e0.04ccd5a8.js | 1 + assets/js/3ac14561.1cd1f4d0.js | 1 + assets/js/3ac610ff.316c8e11.js | 1 + assets/js/3bb06773.29b34cb1.js | 1 + assets/js/3bb415e3.ede0fcad.js | 1 + assets/js/3bc8fe23.54d3883d.js | 1 + assets/js/3be95f92.45db99c1.js | 1 + assets/js/3c2e75b4.1fb064d3.js | 1 + assets/js/3c3d2bff.6a9b8a9e.js | 1 + assets/js/3c8518bb.e3668a02.js | 1 + assets/js/3cb4be67.1f1b2aaa.js | 1 + assets/js/3cb9fdac.eb9b02da.js | 1 + assets/js/3ce290cc.49694d77.js | 1 + assets/js/3dbbac8a.56fe0fb3.js | 1 + assets/js/3e93a65d.c81741e5.js | 1 + assets/js/3eae7101.1c3bfdde.js | 1 + assets/js/3ede3d79.3f739406.js | 1 + assets/js/3ee2c73a.56f15864.js | 1 + assets/js/3f2108ba.00951b81.js | 1 + assets/js/3f64a4c5.7672a1fc.js | 1 + assets/js/3f9060c3.e4eac2b7.js | 1 + assets/js/40367786.801454be.js | 1 + assets/js/40718b14.5ad5937f.js | 1 + assets/js/40a4cbba.c44c73f4.js | 1 + assets/js/40e498fa.7e0d2b44.js | 1 + assets/js/41244b80.81b0a059.js | 1 + assets/js/415f2cd9.064a1e9b.js | 1 + assets/js/41606842.90043f12.js | 1 + assets/js/417fc4b4.4f4a2695.js | 1 + assets/js/41d087d7.f106b6c0.js | 1 + assets/js/425dfc0f.51e517b1.js | 1 + assets/js/42ad0ca4.784088d6.js | 1 + assets/js/43289e4d.c91734fc.js | 1 + assets/js/435d8b4c.89bf5b70.js | 1 + assets/js/437db4bf.f20821a1.js | 1 + assets/js/439b9a57.c4abecba.js | 1 + assets/js/43aa4824.940228f0.js | 1 + assets/js/43ab8474.0e965728.js | 1 + assets/js/43bbbae7.8ce14775.js | 1 + assets/js/444dad87.29aa76a0.js | 1 + assets/js/44642b2f.9ca08045.js | 1 + assets/js/44e33f80.842bca3f.js | 1 + assets/js/459dd1ef.7604d487.js | 1 + assets/js/45a10ae8.de178977.js | 1 + assets/js/469935bd.daaef810.js | 1 + assets/js/46c51ef6.7652a0cc.js | 1 + assets/js/46d9aab0.40f77729.js | 1 + assets/js/4735cd81.21fed183.js | 1 + assets/js/47658b82.e1d6cb38.js | 1 + assets/js/47cae651.5e63cd4e.js | 1 + assets/js/47da279e.0dc7a732.js | 1 + assets/js/48292e37.4e1a58d5.js | 1 + assets/js/485c7377.08d81db4.js | 1 + assets/js/4883d618.0d6007b2.js | 1 + assets/js/4906b8e6.48c4df9c.js | 1 + assets/js/492dc159.444114ca.js | 1 + assets/js/496cb9ef.aaee1128.js | 1 + assets/js/4972.a20ea76a.js | 1 + assets/js/49d642c9.3891d7a8.js | 1 + assets/js/49d88be4.57145c14.js | 1 + assets/js/49db7061.7d2045e9.js | 1 + assets/js/4aaac366.4801cea2.js | 1 + assets/js/4ab012ff.891d7eda.js | 1 + assets/js/4b62dc40.f3efb060.js | 1 + assets/js/4b90674f.c49340db.js | 1 + assets/js/4b996e44.f9c2f0cd.js | 1 + assets/js/4be9a3a6.9e933a24.js | 1 + assets/js/4bed0e48.0ec05e19.js | 1 + assets/js/4c4f8ee1.35fd4774.js | 1 + assets/js/4c7d0c08.57bb3429.js | 1 + assets/js/4c91b9ee.800884f9.js | 1 + assets/js/4ce06e64.8c5577b4.js | 1 + assets/js/4cecd320.50a66533.js | 1 + assets/js/4d3eb7e7.deb360a8.js | 1 + assets/js/4d7c8e78.a7f8c06f.js | 1 + assets/js/4da01d42.55b2a465.js | 1 + assets/js/4dc3be72.1b8e67d2.js | 1 + assets/js/4de4e659.cb788841.js | 1 + assets/js/4df30499.579d0d55.js | 1 + assets/js/4e45b006.d8b869ce.js | 1 + assets/js/4ed83391.31eb1d59.js | 1 + assets/js/4ef71b5f.e4f1978f.js | 1 + assets/js/4fb1471a.876221eb.js | 1 + assets/js/4fd8c72a.6da59da0.js | 1 + assets/js/4fe12b4b.941e6176.js | 1 + assets/js/4fe88e48.fa1e775a.js | 1 + assets/js/4febca42.f94e02ae.js | 1 + assets/js/50135b75.e3faee2b.js | 1 + assets/js/50d0e663.0674ac23.js | 1 + assets/js/51068.b4d6108e.js | 1 + assets/js/51457b0b.bd558a45.js | 1 + assets/js/51bf60d9.2a2866d6.js | 1 + assets/js/51cf8946.e4f02867.js | 1 + assets/js/5226ad4f.b1d14706.js | 1 + assets/js/5296f864.dabe31b3.js | 1 + assets/js/52b8fa8a.b3e53016.js | 1 + assets/js/533a09ca.3d88b763.js | 1 + assets/js/533bb9dc.b96dad64.js | 1 + assets/js/53f26dca.4f1881f6.js | 1 + assets/js/54597942.94ae773b.js | 1 + assets/js/548ef7ca.87502d26.js | 1 + assets/js/54a7c81e.d059c59c.js | 1 + assets/js/550cdc1d.5c224350.js | 1 + assets/js/551db1ac.ee42f66f.js | 1 + assets/js/55b9667a.9fc9a6eb.js | 1 + assets/js/55e35eab.f696c438.js | 1 + assets/js/563fcf2e.dc6fb4c7.js | 1 + assets/js/565f686e.5a6ec3a7.js | 1 + assets/js/5668eccd.20b5304f.js | 1 + assets/js/5674f153.b4eb130b.js | 1 + assets/js/56b3fab8.8ae61492.js | 1 + assets/js/56f35d85.c3eab92c.js | 1 + assets/js/57008883.11bb08cb.js | 1 + assets/js/5733c82d.3d490188.js | 1 + assets/js/57700755.3e57e6d9.js | 1 + assets/js/5778ca6b.8bc37115.js | 1 + assets/js/578d3f15.ece3e377.js | 1 + assets/js/57e0ab98.71940d4e.js | 1 + assets/js/5889a844.62933b70.js | 1 + assets/js/588e4efd.70f41653.js | 1 + assets/js/59a262d5.9dd70cc0.js | 1 + assets/js/5a843cd2.63c9493e.js | 1 + assets/js/5af0f4f9.98e85c8f.js | 1 + assets/js/5c5c653f.17cac15c.js | 1 + assets/js/5c868d36.01487d90.js | 1 + assets/js/5c8fca76.d1a16dc0.js | 1 + assets/js/5cc32405.fd1def08.js | 1 + assets/js/5cf7c214.36586195.js | 1 + assets/js/5d0266be.e028d3f3.js | 1 + assets/js/5d5964ec.d720c839.js | 1 + assets/js/5df8a536.f44554bd.js | 1 + assets/js/5e3dc99b.c7aa10e4.js | 1 + assets/js/5e730d4f.bf3e3989.js | 1 + assets/js/5e9a4be9.9e7aea0b.js | 1 + assets/js/6004d2a4.ab1b5f3f.js | 1 + assets/js/600e4190.0bee7b6c.js | 1 + assets/js/60a77258.17d58a0f.js | 1 + assets/js/60c9cc01.8f5bc5c6.js | 1 + assets/js/60e1630c.96901eb9.js | 1 + assets/js/60fae5f4.0a220c69.js | 1 + assets/js/611f3a9e.dc1be487.js | 1 + assets/js/6190b2fb.6cb691e4.js | 1 + assets/js/61d299e1.76807eb6.js | 1 + assets/js/61e62d68.b6c5bb67.js | 1 + assets/js/61f1e7c8.3b0a1c29.js | 1 + assets/js/6226ba71.40eb13ae.js | 1 + assets/js/622f92df.5ca5ec26.js | 1 + assets/js/62422ab6.648df983.js | 1 + assets/js/62a53033.08859e4a.js | 1 + assets/js/62dc90a1.3f3d2412.js | 1 + assets/js/62ec9f43.b063b2d8.js | 1 + assets/js/62f46a38.200c43f2.js | 1 + assets/js/632979e8.1945c14a.js | 1 + assets/js/637356df.030a1e3f.js | 1 + assets/js/63fae4f0.c9242707.js | 1 + assets/js/65d0391b.cf9502af.js | 1 + assets/js/65ecf6d5.9b390ce8.js | 1 + assets/js/6610396c.3cf94bee.js | 1 + assets/js/66326f4e.78fd62e9.js | 1 + assets/js/66345e96.e312da06.js | 1 + assets/js/66be9998.833c32ac.js | 1 + assets/js/67ce4884.ec575d6b.js | 1 + assets/js/684a796f.c08bc3c2.js | 1 + assets/js/68585f67.eb9cce0f.js | 1 + assets/js/6875c492.16502a56.js | 1 + assets/js/68fb9d2f.2531ccaa.js | 1 + assets/js/691b1ed7.406ee554.js | 1 + assets/js/692497e1.a2ed0b7c.js | 1 + assets/js/6927f7c4.bee27a35.js | 1 + assets/js/69c7a5a7.4519d82c.js | 1 + assets/js/6a2140b3.b4a88233.js | 1 + assets/js/6a75c57a.f8e5de89.js | 1 + assets/js/6b16e156.2e2f483e.js | 1 + assets/js/6b51f988.6976254a.js | 1 + assets/js/6b553c5c.fe679aa9.js | 1 + assets/js/6b6054d2.1032f2af.js | 1 + assets/js/6bae8700.1896d76a.js | 1 + assets/js/6c658908.1afc9614.js | 1 + assets/js/6c8b7ad4.3b4a3f73.js | 1 + assets/js/6d22e028.a5fcbc6b.js | 1 + assets/js/6d25229c.2394cdc6.js | 1 + assets/js/6d371395.59984cd7.js | 1 + assets/js/6d826f51.2c78b028.js | 1 + assets/js/6da0a796.a9cb8072.js | 1 + assets/js/6e43d302.e737c437.js | 1 + assets/js/6e743f1b.64602d6e.js | 1 + assets/js/6e7b669d.61ef66f9.js | 1 + assets/js/6eecfaae.6cbf1fce.js | 1 + assets/js/6f700e99.66ebd5a7.js | 1 + assets/js/6fb45133.8780f9a7.js | 1 + assets/js/7030fa2f.ac2104c3.js | 1 + assets/js/70372002.8347b491.js | 1 + assets/js/70396aa3.b3e5d301.js | 1 + assets/js/704e5bb8.fbbc39f4.js | 1 + assets/js/709abed9.708c231e.js | 1 + assets/js/71d215be.87d3dda2.js | 1 + assets/js/71e4641a.c575aa4b.js | 1 + assets/js/7221b837.a070d45c.js | 1 + assets/js/72c81964.0dc8e201.js | 1 + assets/js/7312b66d.97615e9e.js | 1 + assets/js/7325235b.554ee35f.js | 1 + assets/js/733f2214.260f1743.js | 1 + assets/js/73a1bc7a.eede1bae.js | 1 + assets/js/73a96f39.b97f3a8a.js | 1 + assets/js/73bbd4d7.28eef603.js | 1 + assets/js/73f0dde0.f2c110fe.js | 1 + assets/js/7439ef37.e15faba5.js | 1 + assets/js/74d66224.39d38542.js | 1 + assets/js/752b6ead.8868ca89.js | 1 + assets/js/7574ff34.785c26ac.js | 1 + assets/js/76794a21.2d5266e5.js | 1 + assets/js/769eb34c.4403be81.js | 1 + assets/js/76c61a3b.3a82d970.js | 1 + assets/js/771f29e6.38c2d771.js | 1 + assets/js/77215fb3.5fcc484d.js | 1 + assets/js/77550e96.e668c8a1.js | 1 + assets/js/778ef860.762eeabd.js | 1 + assets/js/77d69aed.613ab23b.js | 1 + assets/js/77d820b6.ed642bc4.js | 1 + assets/js/77e9cceb.9b232c45.js | 1 + assets/js/789f2cca.39f99462.js | 1 + assets/js/78c763b8.c42d19d7.js | 1 + assets/js/78d554ba.66ab6334.js | 1 + assets/js/78d8ce1d.84441dbe.js | 1 + assets/js/78df8d65.119ba796.js | 1 + assets/js/79239208.68e37e23.js | 1 + assets/js/795480a5.e692d8ea.js | 1 + assets/js/79730245.14cda0d8.js | 1 + assets/js/798d160f.fc29dc61.js | 1 + assets/js/79d76848.47b0a3f4.js | 1 + assets/js/7a263bfa.1c805219.js | 1 + assets/js/7a4b421f.f75b7a16.js | 1 + assets/js/7a6174e7.93ed69fb.js | 1 + assets/js/7a7e39bb.20054c14.js | 1 + assets/js/7aaa65e3.2ad8effb.js | 1 + assets/js/7b73b4cd.d7498fa0.js | 1 + assets/js/7c359f4d.0c522b73.js | 1 + assets/js/7c815b5e.a5522061.js | 1 + assets/js/7c895c96.960a5ba4.js | 1 + assets/js/7d4ab4f9.0ec0db41.js | 1 + assets/js/7d6aa09c.fba7f48c.js | 1 + assets/js/7de7ce98.caa95da2.js | 1 + assets/js/7de83161.6e30b750.js | 1 + assets/js/7e644b1f.ef2c8f6f.js | 1 + assets/js/7e87972d.24662f86.js | 1 + assets/js/7e8e081f.455c9b12.js | 1 + assets/js/7fa9de70.cff3c34e.js | 1 + assets/js/7faccef9.aac12434.js | 1 + assets/js/7ff27d5d.5960fd00.js | 1 + assets/js/7ff38eb4.f5ac8427.js | 1 + assets/js/80057f85.edc1c235.js | 1 + assets/js/80210.245c42c2.js | 1 + assets/js/80537537.5725cfd8.js | 1 + assets/js/805fc822.c864d419.js | 1 + assets/js/80617771.3351af55.js | 1 + assets/js/8084428b.0eba4435.js | 1 + assets/js/80c54634.fd705a3e.js | 1 + assets/js/81528b00.9aeb470f.js | 1 + assets/js/81bb24c9.76693a73.js | 1 + assets/js/82209890.d5e4ff65.js | 1 + assets/js/822bd8ab.dfb2cd17.js | 1 + assets/js/82c38436.f7c1816e.js | 1 + assets/js/82db709e.075c055a.js | 1 + assets/js/82ed4471.838c38ab.js | 1 + assets/js/82f24945.8746cef5.js | 1 + assets/js/830ba2c4.c975997b.js | 1 + assets/js/831d95cb.0c66da8a.js | 1 + assets/js/8395f67d.798e5dd2.js | 1 + assets/js/83e7e4db.6c511419.js | 1 + assets/js/84189288.e5afffc2.js | 1 + assets/js/84677cf0.55a9266a.js | 1 + assets/js/8470e3c7.4090b9b2.js | 1 + assets/js/84823557.5b494971.js | 1 + assets/js/8534c2dd.8ec8dbda.js | 1 + assets/js/859b6012.9836dc83.js | 1 + assets/js/86c4d158.2e916fa2.js | 1 + assets/js/86cc1b5f.c4aa4649.js | 1 + assets/js/86e0423a.929b4796.js | 1 + assets/js/87088759.90416017.js | 1 + assets/js/871691d4.358d342f.js | 1 + assets/js/876c34e9.eaf9747b.js | 1 + assets/js/878c8163.fc733a29.js | 1 + assets/js/884eee03.9c216150.js | 1 + assets/js/8864b77b.cb1a7306.js | 1 + assets/js/8914fa7e.0fe96f3b.js | 1 + assets/js/89211367.d2f211db.js | 1 + assets/js/89931013.c6ff4cfa.js | 1 + assets/js/89a43a90.47af50cd.js | 1 + assets/js/8a6fc2ec.f5b11d20.js | 1 + assets/js/8a766cbb.70e76067.js | 1 + assets/js/8b4d9039.1f86965b.js | 1 + assets/js/8bfc66fb.c75678d4.js | 1 + assets/js/8c574ba2.ca3a46e5.js | 1 + assets/js/8c6dbeca.57f339f6.js | 1 + assets/js/8c75942c.5e08e3a4.js | 1 + assets/js/8ccf5d9f.108f5ee1.js | 1 + assets/js/8cd47ea9.cf455658.js | 1 + assets/js/8d0075ff.7598228c.js | 1 + assets/js/8d209506.e4591885.js | 1 + assets/js/8d306cf9.aa58ca4c.js | 1 + assets/js/8d3da32e.efff0598.js | 1 + assets/js/8e410d22.c34ee40e.js | 1 + assets/js/8ed15298.d65354c1.js | 1 + assets/js/8f7e10a3.d241f9ad.js | 1 + assets/js/8fddd37c.2e76cb01.js | 1 + assets/js/8fe062a7.d7311ede.js | 1 + assets/js/8fea44ca.9d9d62e9.js | 1 + assets/js/90bf9c2d.ecec42d7.js | 1 + assets/js/90cc522f.bcba69c4.js | 1 + assets/js/90f359c5.bdc4672e.js | 1 + assets/js/9136968b.5abe266e.js | 1 + assets/js/913aac40.95dd1cb5.js | 1 + assets/js/91595845.dbcc8865.js | 1 + assets/js/91831590.028d52d9.js | 1 + assets/js/91b05c51.41ca190f.js | 1 + assets/js/924be064.77e5f297.js | 1 + assets/js/925feafa.07b667eb.js | 1 + assets/js/9291df2e.9b87d940.js | 1 + assets/js/934a8f8d.939addfb.js | 1 + assets/js/935f2afb.12b4c978.js | 1 + assets/js/93729337.24640633.js | 1 + assets/js/93b15a8c.d2a93a61.js | 1 + assets/js/94133299.4eaf7b31.js | 1 + assets/js/9440f007.f4a7587d.js | 1 + assets/js/9450fd8f.f4c685b8.js | 1 + assets/js/94780c38.71d2b83d.js | 1 + assets/js/948ff80d.35bdc0f3.js | 1 + assets/js/94a907c9.b1899393.js | 1 + assets/js/94c6d911.ce947e81.js | 1 + assets/js/94dc91d7.e956eef6.js | 1 + assets/js/95f12e12.89a759bd.js | 1 + assets/js/960e3390.9a5d2160.js | 1 + assets/js/965e9e9a.ae2a813a.js | 1 + assets/js/9668e24b.a1fef7db.js | 1 + assets/js/97407dee.1346e5b9.js | 1 + assets/js/97cbe67b.9fa74904.js | 1 + assets/js/97daee08.077f549d.js | 1 + assets/js/98277053.8204ac95.js | 1 + assets/js/986e43da.f541f01c.js | 1 + assets/js/98b2ca25.58b9f52d.js | 1 + assets/js/98e6984f.26f25dbd.js | 1 + assets/js/9945c128.4d1fc2f5.js | 1 + assets/js/996aa714.48a86a7d.js | 1 + assets/js/99881079.7399a249.js | 1 + assets/js/999e2b46.b9eca61e.js | 1 + assets/js/99b0bd12.4ff93e6b.js | 1 + assets/js/9a01d9b0.da592dca.js | 1 + assets/js/9a03c440.55017adb.js | 1 + assets/js/9a4c05df.566cf4df.js | 1 + assets/js/9b5ce5fa.860ab49e.js | 1 + assets/js/9b6092d7.8ac0135c.js | 1 + assets/js/9b7a95a2.ff1a9f67.js | 1 + assets/js/9ba26136.1faa833c.js | 1 + assets/js/9bcfaf7c.459a8722.js | 1 + assets/js/9c662d1f.abf660e9.js | 1 + assets/js/9c7979b1.e1cf42fe.js | 1 + assets/js/9c96fa11.ea8e50f7.js | 1 + assets/js/9cab6d73.47f4f611.js | 1 + assets/js/9ce37f6e.77804269.js | 1 + assets/js/9d43e047.df69749e.js | 1 + assets/js/9d7869bb.35b4854a.js | 1 + assets/js/9dce568f.09ea27c7.js | 1 + assets/js/9dee36e7.c9cec439.js | 1 + assets/js/9e4087bc.47006cd4.js | 1 + assets/js/9e570fef.3918b741.js | 1 + assets/js/9e834cf3.1e4d257a.js | 1 + assets/js/9e9bda24.2571a9f9.js | 1 + assets/js/9f70a142.92a32352.js | 1 + assets/js/9f761678.efd79bb9.js | 1 + assets/js/9f7c2154.b8bd5c7b.js | 1 + assets/js/9fba849d.b41ee22a.js | 1 + assets/js/a040c838.3f6e8559.js | 1 + assets/js/a0d18a99.9c37ba0b.js | 1 + assets/js/a0fc6770.402665bb.js | 1 + assets/js/a14fd889.9bf1cea0.js | 1 + assets/js/a1597564.186e8185.js | 1 + assets/js/a1ac97eb.58460967.js | 1 + assets/js/a1b4c76a.51af9271.js | 1 + assets/js/a1cde312.838f2c04.js | 1 + assets/js/a1d1f035.546a3e7f.js | 1 + assets/js/a1d4a798.53b252bf.js | 1 + assets/js/a1f2945e.cd202afc.js | 1 + assets/js/a2a63bac.f350ae76.js | 1 + assets/js/a2ee852b.3deb7f04.js | 1 + assets/js/a34b3179.fc92e4ec.js | 1 + assets/js/a3889346.f4b45fc1.js | 1 + assets/js/a48d66c0.554b9825.js | 1 + assets/js/a572b6ff.fac7438c.js | 1 + assets/js/a5bf291f.f146d996.js | 1 + assets/js/a6238997.20176f92.js | 1 + assets/js/a687dd04.bb48cff5.js | 1 + assets/js/a69f0deb.4d5ff44c.js | 1 + assets/js/a6aa9e1f.3167acc2.js | 1 + assets/js/a6afc437.c755f9a0.js | 1 + assets/js/a6e1d45a.affc557f.js | 1 + assets/js/a6e5ff3c.f8f8d3c0.js | 1 + assets/js/a7418040.313e46d8.js | 1 + assets/js/a7a31948.7327cf2d.js | 1 + assets/js/a8723288.631293b3.js | 1 + assets/js/a8738e5f.f18e47da.js | 1 + assets/js/a9019578.618a0894.js | 1 + assets/js/a9347c1b.a93f84b5.js | 1 + assets/js/aa4c9cc8.6f769daf.js | 1 + assets/js/aafd9eaa.e577fb53.js | 1 + assets/js/ab4c3279.cc8e8278.js | 1 + assets/js/ac12bff3.f511d815.js | 1 + assets/js/ac56cb0b.5e036803.js | 1 + assets/js/ac87db6a.c0500c01.js | 1 + assets/js/ac8a5a87.fb97dd70.js | 1 + assets/js/acd2edbe.7d8cc863.js | 1 + assets/js/ace79a55.6028e600.js | 1 + assets/js/add555bf.8ea1e3df.js | 1 + assets/js/ae2d2424.be7ef5ae.js | 1 + assets/js/ae455379.e0af4636.js | 1 + assets/js/ae521593.22fed2a0.js | 1 + assets/js/ae7f7c70.147dae80.js | 1 + assets/js/afa83c07.67905eb7.js | 1 + assets/js/b020ac17.f01a9412.js | 1 + assets/js/b032e7ab.b1a9961b.js | 1 + assets/js/b03d4a4e.5d00abc3.js | 1 + assets/js/b073a55d.87d95835.js | 1 + assets/js/b073edd1.1e4774ca.js | 1 + assets/js/b13803f3.f0a1384b.js | 1 + assets/js/b242687d.9e8010a3.js | 1 + assets/js/b28a1077.d4571d53.js | 1 + assets/js/b3041b60.04095479.js | 1 + assets/js/b3043f02.38a94c82.js | 1 + assets/js/b41783a8.f909dc33.js | 1 + assets/js/b4645a09.58164e44.js | 1 + assets/js/b4cc2dd2.ac8372ad.js | 1 + assets/js/b4f5b98b.d8a4a2ab.js | 1 + assets/js/b512dd46.0c3c6eed.js | 1 + assets/js/b5164349.8a4ed5f9.js | 1 + assets/js/b57687d8.ad244a62.js | 1 + assets/js/b6145ff0.7ca20c32.js | 1 + assets/js/b65e5ec2.d8fca806.js | 1 + assets/js/b6ef4fcb.68ecccd5.js | 1 + assets/js/b78698d9.e2fd1721.js | 1 + assets/js/b7dd63dc.a0a6b412.js | 1 + assets/js/b8465b4d.c76114e0.js | 1 + assets/js/b88c8fa9.9fdee81f.js | 1 + assets/js/b8a3fbda.c9a4283c.js | 1 + assets/js/b8bcf1d1.204838b0.js | 1 + assets/js/b92c36fd.da51b229.js | 1 + assets/js/b96b3223.99af26b5.js | 1 + assets/js/b9d87023.3ccfd671.js | 1 + assets/js/ba0b6dbd.00ad8d78.js | 1 + assets/js/baed1590.d9d74d98.js | 1 + assets/js/bb44f9e3.0939305b.js | 1 + assets/js/bb465a37.a85dd0e6.js | 1 + assets/js/bbc31819.a65c3848.js | 1 + assets/js/bbe7c3bd.224be55a.js | 1 + assets/js/bc6b65d9.f1413473.js | 1 + assets/js/bccb35b7.5dbc8a59.js | 1 + assets/js/bcf46d9c.dc0dfba9.js | 1 + assets/js/bd65afd9.b89ce463.js | 1 + assets/js/bda3e1c7.8c9d07fa.js | 1 + assets/js/bdc4c1ed.c2a461dc.js | 1 + assets/js/be16a434.031b2037.js | 1 + assets/js/be1e6782.4ec13c11.js | 1 + assets/js/be26e761.724d58c0.js | 1 + assets/js/be32a6ec.24f1e527.js | 1 + assets/js/bf071e0b.76b7ab70.js | 1 + assets/js/c0354ce6.09b0b808.js | 1 + assets/js/c036f08e.230d3185.js | 1 + assets/js/c061e3b1.52557f8e.js | 1 + assets/js/c063df1b.518f2336.js | 1 + assets/js/c08c0f47.416aafe8.js | 1 + assets/js/c091c5d8.ce22eeb2.js | 1 + assets/js/c0ac1524.13b59269.js | 1 + assets/js/c0cf6239.cd90552c.js | 1 + assets/js/c10365f3.472f2046.js | 1 + assets/js/c178b56c.3e187747.js | 1 + assets/js/c1c5c6f5.bba09171.js | 1 + assets/js/c2b4dd94.778afa9a.js | 1 + assets/js/c2eec07f.f7406fac.js | 1 + assets/js/c315164d.90ef02cc.js | 1 + assets/js/c4479859.8309a90c.js | 1 + assets/js/c511c40f.0dd3f662.js | 1 + assets/js/c5858ebd.c70ee4f9.js | 1 + assets/js/c60581f2.f0c60a3a.js | 1 + assets/js/c6259fbb.fdd3fb9d.js | 1 + assets/js/c63933b3.19137cb7.js | 1 + assets/js/c6ae40c2.fcdab135.js | 1 + assets/js/c6f90b29.8b77bc39.js | 1 + assets/js/c7337d4e.6cea3bb1.js | 1 + assets/js/c7e43a05.c308de8a.js | 1 + assets/js/c831575d.33f5874b.js | 1 + assets/js/c90fb258.9c89e222.js | 1 + assets/js/c9210b26.f9c92b06.js | 1 + assets/js/c94f306d.475fec2b.js | 1 + assets/js/ca3b5bc8.d750be9f.js | 1 + assets/js/ca6829cb.00bb58af.js | 1 + assets/js/caab1e2e.790da899.js | 1 + assets/js/cb7a1a0b.fc91c3ee.js | 1 + assets/js/cc267639.9995a73a.js | 1 + assets/js/cc30e037.47fc6eda.js | 1 + assets/js/cc5c2602.db9902d7.js | 1 + assets/js/ccb7a847.7e3751a5.js | 1 + assets/js/ccc49370.66cad8e9.js | 1 + assets/js/cced6026.061e2055.js | 1 + assets/js/ccf451f9.7efe9c4d.js | 1 + assets/js/ccfc9222.e04c413b.js | 1 + assets/js/cd0ded60.0db37d65.js | 1 + assets/js/cd612773.d9b87bb0.js | 1 + assets/js/ce17d78b.b895a29b.js | 1 + assets/js/ce6dcc9e.38a5e04e.js | 1 + assets/js/ce7ed51f.8bdb2215.js | 1 + assets/js/cf1bc381.4cd9437b.js | 1 + assets/js/cfb82551.e63304fb.js | 1 + assets/js/cfdb38ee.97cf8400.js | 1 + assets/js/d0639dee.f18be2c7.js | 1 + assets/js/d077dadd.9fa7f5a1.js | 1 + assets/js/d0a351c0.258067ed.js | 1 + assets/js/d0e182b9.835c5b63.js | 1 + assets/js/d10ad4a6.af42a029.js | 1 + assets/js/d124c703.15587654.js | 1 + assets/js/d15a0787.33318e9f.js | 1 + assets/js/d19a344f.3d64c4eb.js | 1 + assets/js/d1d47ba3.c8bfd78a.js | 1 + assets/js/d200e7a4.e30d362a.js | 1 + assets/js/d2ab2776.0b7a25c4.js | 1 + assets/js/d2aca35e.86129eca.js | 1 + assets/js/d2ea5af2.447b9563.js | 1 + assets/js/d343e3e1.3cb5767a.js | 1 + assets/js/d3a595c1.813f9114.js | 1 + assets/js/d3f3f546.88297ed1.js | 1 + assets/js/d442e1d8.854196c8.js | 1 + assets/js/d5676bf9.f90c55bb.js | 1 + assets/js/d5cc3122.33b4ba11.js | 1 + assets/js/d5f27176.938b3c42.js | 1 + assets/js/d65b9dd2.7da8dd3d.js | 1 + assets/js/d6a3b4a5.0e85b9f0.js | 1 + assets/js/d6a93ba7.2190ecb6.js | 1 + assets/js/d6b66cf4.24242dbb.js | 1 + assets/js/d6c09ac2.62736fde.js | 1 + assets/js/d6f20405.d88dddb4.js | 1 + assets/js/d70b4c5f.9e25feed.js | 1 + assets/js/d7836792.8920f6e8.js | 1 + assets/js/d7899fea.8822e22a.js | 1 + assets/js/d79a4bb7.a815c560.js | 1 + assets/js/d7c69167.06afceb4.js | 1 + assets/js/d7d2f3e9.262520e6.js | 1 + assets/js/d83d9042.fc0ecb0d.js | 1 + assets/js/d857251e.5d7f7fca.js | 1 + assets/js/d863ede2.11363200.js | 1 + assets/js/d8668f0c.be2330b5.js | 1 + assets/js/d8c4fe87.808f0700.js | 1 + assets/js/d92df848.9daf110c.js | 1 + assets/js/d957ac34.2fafdb70.js | 1 + assets/js/d967308c.4b0b548a.js | 1 + assets/js/d96cfa54.2939f4b2.js | 1 + assets/js/d988d084.3a371a78.js | 1 + assets/js/d99d594e.0abb20d4.js | 1 + assets/js/d9b708eb.a7b8ca27.js | 1 + assets/js/d9ccb35d.cea6c556.js | 1 + assets/js/d9e42018.8af86b03.js | 1 + assets/js/da04b7b0.390ca13a.js | 1 + assets/js/da7937f0.7cc22aaa.js | 1 + assets/js/daa3e20a.f1391e79.js | 1 + assets/js/daace409.1ea8e0b2.js | 1 + assets/js/db138d7c.1b8b9080.js | 1 + assets/js/db50202c.71a9a110.js | 1 + assets/js/db5663d1.a1ed76f8.js | 1 + assets/js/dceb6e64.eb5e94a8.js | 1 + assets/js/ddcb8bff.0be505e0.js | 1 + assets/js/ddce0bff.2c93fa43.js | 1 + assets/js/de5b481b.565b362c.js | 1 + assets/js/de790939.74e01666.js | 1 + assets/js/decc8fa8.03de18e2.js | 1 + assets/js/dee5d2d9.044804a9.js | 1 + assets/js/df778edc.6398e671.js | 1 + assets/js/dfd49ee8.8d5945b5.js | 1 + assets/js/dff1c289.c8e36228.js | 1 + assets/js/dff84d74.7af6b65c.js | 1 + assets/js/e06746c7.a59320ce.js | 1 + assets/js/e0a90ddc.a29272eb.js | 1 + assets/js/e0b45b46.004f9296.js | 1 + assets/js/e135bd86.35a0a708.js | 1 + assets/js/e158fd47.041cd656.js | 1 + assets/js/e1f21c3f.7f2072d9.js | 1 + assets/js/e2011657.8d35be8c.js | 1 + assets/js/e25ae581.b6c5260b.js | 1 + assets/js/e2a7c340.17f426f9.js | 1 + assets/js/e2c8baed.fe76b678.js | 1 + assets/js/e3067ecd.64e66e32.js | 1 + assets/js/e356bfd0.a7639fa4.js | 1 + assets/js/e38c8545.52bffd2c.js | 1 + assets/js/e3c3ef1c.61c2b7ed.js | 1 + assets/js/e406e44d.c4e96dd4.js | 1 + assets/js/e44a2883.8da70635.js | 1 + assets/js/e4619b9c.0e5fd447.js | 1 + assets/js/e4a61baa.347ef4cf.js | 1 + assets/js/e54fb861.dc652803.js | 1 + assets/js/e56a9a29.d1d0f3d4.js | 1 + assets/js/e57d1f62.5be8a504.js | 1 + assets/js/e5a8e689.c5c3df95.js | 1 + assets/js/e5b737ed.3fd1fabf.js | 1 + assets/js/e5dd9161.eed06922.js | 1 + assets/js/e6402687.8934f415.js | 1 + assets/js/e695f231.2dfaf583.js | 1 + assets/js/e6ea9b03.a0904c0a.js | 1 + assets/js/e70f68c6.0a94e2cb.js | 1 + assets/js/e716e5b6.99afaa36.js | 1 + assets/js/e7486169.d066da59.js | 1 + assets/js/e7a72da0.d7b2d45e.js | 1 + assets/js/e80f56fd.6510f040.js | 1 + assets/js/e84709f6.bffbbe4e.js | 1 + assets/js/e86dcd26.125084b6.js | 1 + assets/js/e8d4d6c0.20140c19.js | 1 + assets/js/e8f5afda.eb7f2404.js | 1 + assets/js/e90b2ff0.7fbed957.js | 1 + assets/js/e9310706.e46f5ee8.js | 1 + assets/js/ea2603ff.ae5b22eb.js | 1 + assets/js/ea5726b6.2672f5db.js | 1 + assets/js/ea7f8016.7c07b525.js | 1 + assets/js/ea84a009.36271ad3.js | 1 + assets/js/eab6de32.8354251c.js | 1 + assets/js/eac6bb0a.1aa24d10.js | 1 + assets/js/eac9cf07.e77df8c6.js | 1 + assets/js/eb0e2fb1.07255769.js | 1 + assets/js/ebf8adea.dcda8491.js | 1 + assets/js/ec06fa8a.8d919f1b.js | 1 + assets/js/ec344652.83a054ec.js | 1 + assets/js/ec53298b.c7e575ce.js | 1 + assets/js/ed730a1d.19e36255.js | 1 + assets/js/ed930750.a3d3ae4d.js | 1 + assets/js/ed99d55f.e3582b94.js | 1 + assets/js/eda7cf83.e9a49dd3.js | 1 + assets/js/edca0251.665a94cd.js | 1 + assets/js/ee0b7a59.f2d5e972.js | 1 + assets/js/ee94a44f.72450e08.js | 1 + assets/js/ef2b1d07.41206daf.js | 1 + assets/js/ef2b6a3f.276cebb0.js | 1 + assets/js/ef4801f7.5d3fc9af.js | 1 + assets/js/ef4f60e7.f66551bc.js | 1 + assets/js/efad53df.45dcc7a1.js | 1 + assets/js/eff08811.39187769.js | 1 + assets/js/f0418a99.2c34ef4d.js | 1 + assets/js/f117ec90.7fad2391.js | 1 + assets/js/f13a89c7.c87b817b.js | 1 + assets/js/f1bfc30d.4bc1270e.js | 1 + assets/js/f1df5007.afbfc914.js | 1 + assets/js/f210b4b5.8690c2eb.js | 1 + assets/js/f2180c0a.2c802d5e.js | 1 + assets/js/f2423430.bec1d3ae.js | 1 + assets/js/f2b32cff.39abae3b.js | 1 + assets/js/f2deb2f1.b1733abd.js | 1 + assets/js/f302e248.841b73d3.js | 1 + assets/js/f3c06362.96ecb4f3.js | 1 + assets/js/f452efc5.b66888d2.js | 1 + assets/js/f4548430.7eb98ed2.js | 1 + assets/js/f47d214c.7885e24c.js | 1 + assets/js/f48535bf.29fcdfb3.js | 1 + assets/js/f4cb7e87.0c2f8fe1.js | 1 + assets/js/f51bb76d.7f54a00b.js | 1 + assets/js/f522921c.3a805440.js | 1 + assets/js/f530b85c.90d61588.js | 1 + assets/js/f55d3e7a.f786acd2.js | 1 + assets/js/f59c978c.51f789b1.js | 1 + assets/js/f5a24224.d169d439.js | 1 + assets/js/f5b1250e.5a405e64.js | 1 + assets/js/f5d27437.a48dcb5c.js | 1 + assets/js/f5e5d1cf.409624be.js | 1 + assets/js/f5f103cc.b1cf07d2.js | 1 + assets/js/f63b6b72.003220d2.js | 1 + assets/js/f6a3ab66.dd8c87cc.js | 1 + assets/js/f6aa5556.97793938.js | 1 + assets/js/f6b8faad.decb8bc1.js | 1 + assets/js/f6ec1152.c2043e3a.js | 1 + assets/js/f7e5e70a.061609b3.js | 1 + assets/js/f850a5f3.536e35f2.js | 1 + assets/js/f8681695.f50d9273.js | 1 + assets/js/f872275a.dbdfeb4f.js | 1 + assets/js/f89a4337.d99ad3e6.js | 1 + assets/js/f96c80d6.4ce4cb71.js | 1 + assets/js/f96c80dc.85f32d0b.js | 1 + assets/js/fa00d705.cb0aaed6.js | 1 + assets/js/fa0b1b5d.f62143b4.js | 1 + assets/js/fa57bfdd.f14710cf.js | 1 + assets/js/fa5dce7e.e833700b.js | 1 + assets/js/faece773.2d8cf6c5.js | 1 + assets/js/fb0b9e22.7e06c8d0.js | 1 + assets/js/fb63aa20.850437a9.js | 1 + assets/js/fb793160.b4e7853d.js | 1 + assets/js/fb8d4667.f082283b.js | 1 + assets/js/fba052bd.92a16ec4.js | 1 + assets/js/fbdc54bf.80a293fa.js | 1 + assets/js/fc0eac3b.320a4227.js | 1 + assets/js/fc8c3309.746176a0.js | 1 + assets/js/fce7e268.e65bf999.js | 1 + assets/js/fd6fd4a3.1f94006f.js | 1 + assets/js/fdba8f98.8aadb32b.js | 1 + assets/js/fdfeff52.d2d4df98.js | 1 + assets/js/fe184e91.4c2cc153.js | 1 + assets/js/fee99998.1c695705.js | 1 + assets/js/ff276f6a.72f5da9b.js | 1 + assets/js/ff8cfcf7.83f44d88.js | 1 + assets/js/ffbc2281.bed0db17.js | 1 + assets/js/main.bc51b93f.js | 2 + assets/js/main.bc51b93f.js.LICENSE.txt | 53 + assets/js/runtime~main.0180faa2.js | 1 + atom.xml | 6233 +++++++++++++++++ docs/category/tutorial---basics/index.html | 24 + docs/category/tutorial---extras/index.html | 24 + docs/intro/index.html | 24 + .../congratulations/index.html | 24 + .../create-a-blog-post/index.html | 24 + .../create-a-document/index.html | 24 + docs/tutorial-basics/create-a-page/index.html | 24 + .../deploy-your-site/index.html | 24 + .../markdown-features/index.html | 24 + .../manage-docs-versions/index.html | 24 + .../translate-your-site/index.html | 24 + feed.json | 4558 ++++++++++++ .../2022-11-02-csj-vs-baseline-sliced.svg | 2041 ++++++ .../consensus/2022-11-02-csj-vs-baseline.svg | 2277 ++++++ .../2022-11-16-comparing-TICKF-batch.png | Bin 0 -> 33248 bytes .../2022-11-16-removed-stuttering.png | Bin 0 -> 52161 bytes .../2022-12-14-ledger-ops-benchmark.png | Bin 0 -> 83821 bytes .../2023-01-11-utxo-hd-replay-benchmarks.png | Bin 0 -> 76970 bytes ...nsus-utxo-hd-read-and-flush-benchmarks.png | Bin 0 -> 104414 bytes images/consensus/2023-Q2-beacon-graph.png | Bin 0 -> 164771 bytes ...2023-Q2-utxo-hd-sync-ad-hoc-benchmarks.png | Bin 0 -> 58311 bytes images/happy-path-csj-prototype-bench-1.svg | 1812 +++++ images/happy-path-csj-prototype-bench-2.svg | 1888 +++++ images/happy-path-csj-prototype-prelim.svg | 1424 ++++ images/haskell-logo.png | Bin 0 -> 5674 bytes images/network/2022-11-11-noticed-headers.png | Bin 0 -> 27290 bytes images/network/2023-07-06-p2p-progress.png | Bin 0 -> 85638 bytes images/network/2023-08-31-p2p-relays.png | Bin 0 -> 325791 bytes images/network/2023-08-31-relay-versions.png | Bin 0 -> 356758 bytes images/network/2023-09-14-p2p-relays.png | Bin 0 -> 326185 bytes images/network/2023-09-14-relay-versions.png | Bin 0 -> 379198 bytes images/network/2023-10-04-p2p-relays.png | Bin 0 -> 324130 bytes images/network/2023-10-04-relay-versions.png | Bin 0 -> 377636 bytes images/p2p-relay-5.mp4 | 3 + img/doc-adoption.png | Bin 0 -> 158649 bytes img/docusaurus.png | Bin 0 -> 5142 bytes img/favicon.ico | Bin 0 -> 3782 bytes img/logo.png | Bin 0 -> 91295 bytes img/logo.svg | 72 + index.html | 53 + markdown-page/index.html | 24 + p2p-relay3.mp4 | 3 + page/10/index.html | 54 + page/11/index.html | 50 + page/12/index.html | 60 + page/13/index.html | 52 + page/14/index.html | 57 + page/15/index.html | 42 + page/16/index.html | 61 + page/17/index.html | 51 + page/18/index.html | 37 + page/19/index.html | 54 + page/2/index.html | 51 + page/20/index.html | 57 + page/21/index.html | 39 + page/22/index.html | 29 + page/23/index.html | 37 + page/24/index.html | 32 + page/25/index.html | 56 + page/26/index.html | 52 + page/27/index.html | 46 + page/28/index.html | 44 + page/29/index.html | 43 + page/3/index.html | 50 + page/30/index.html | 37 + page/31/index.html | 66 + page/32/index.html | 63 + page/33/index.html | 53 + page/34/index.html | 51 + page/35/index.html | 49 + page/36/index.html | 42 + page/37/index.html | 51 + page/38/index.html | 53 + page/39/index.html | 56 + page/4/index.html | 59 + page/40/index.html | 68 + page/41/index.html | 77 + page/42/index.html | 70 + page/43/index.html | 73 + page/44/index.html | 42 + page/45/index.html | 56 + page/46/index.html | 70 + page/47/index.html | 69 + page/48/index.html | 58 + page/49/index.html | 112 + page/5/index.html | 46 + page/50/index.html | 41 + page/51/index.html | 78 + page/52/index.html | 97 + page/53/index.html | 50 + page/54/index.html | 85 + page/55/index.html | 90 + page/56/index.html | 106 + page/57/index.html | 76 + page/58/index.html | 95 + page/59/index.html | 100 + page/6/index.html | 37 + page/60/index.html | 178 + page/61/index.html | 144 + page/7/index.html | 36 + page/8/index.html | 32 + page/9/index.html | 50 + pdf/network/2022-11-24-UCL.pdf | Bin 0 -> 389191 bytes quarterly/2022-10-07-node-cli-api/index.html | 24 + quarterly/2022-11-07-ledger/index.html | 27 + quarterly/2022-11-09-network/index.html | 66 + quarterly/2022-11-15-consensus/index.html | 63 + quarterly/2023-01-13-network/index.html | 47 + quarterly/2023-01-13-open-source/index.html | 53 + quarterly/2023-01-18-consensus/index.html | 59 + quarterly/2023-04-03-ledger/index.html | 164 + quarterly/2023-04-04-network/index.html | 38 + quarterly/2023-04-25-consensus/index.html | 43 + quarterly/2023-Q2-consensus/index.html | 32 + quarterly/2023-Q2-network/index.html | 77 + quarterly/2023-Q2-sre/index.html | 24 + .../index.html | 34 + quarterly/2023-Q3-sre/index.html | 24 + quarterly/archive/index.html | 24 + quarterly/atom.xml | 620 ++ quarterly/index.html | 326 + quarterly/page/2/index.html | 137 + quarterly/rss.xml | 562 ++ quarterly/tags/cli-api-quarterly/index.html | 24 + quarterly/tags/consensus/index.html | 125 + quarterly/tags/index.html | 24 + quarterly/tags/ledger/index.html | 167 + quarterly/tags/network/index.html | 156 + quarterly/tags/open-source/index.html | 53 + quarterly/tags/performance-tracing/index.html | 34 + quarterly/tags/sre/index.html | 24 + rss.xml | 5003 +++++++++++++ sitemap.xml | 1 + tags/cip-1694/index.html | 25 + tags/cli-api/index.html | 28 + tags/cli-api/page/2/index.html | 24 + tags/cli-api/page/3/index.html | 24 + tags/cli-api/page/4/index.html | 24 + tags/cli-api/page/5/index.html | 24 + tags/cli-api/page/6/index.html | 24 + tags/consensus/index.html | 36 + tags/consensus/page/2/index.html | 35 + tags/consensus/page/3/index.html | 27 + tags/consensus/page/4/index.html | 105 + tags/consensus/page/5/index.html | 176 + tags/consensus/page/6/index.html | 234 + tags/consensus/page/7/index.html | 162 + tags/crypto/index.html | 33 + tags/crypto/page/2/index.html | 24 + tags/crypto/page/3/index.html | 24 + tags/crypto/page/4/index.html | 28 + tags/db-sync/index.html | 61 + tags/db-sync/page/2/index.html | 63 + tags/db-sync/page/3/index.html | 85 + tags/devx/index.html | 24 + tags/embedding-quality/index.html | 25 + tags/goedel/index.html | 49 + tags/goedel/page/2/index.html | 46 + tags/goedel/page/3/index.html | 46 + tags/goedel/page/4/index.html | 47 + tags/hydra/index.html | 105 + tags/hydra/page/10/index.html | 31 + tags/hydra/page/11/index.html | 35 + tags/hydra/page/2/index.html | 51 + tags/hydra/page/3/index.html | 67 + tags/hydra/page/4/index.html | 61 + tags/hydra/page/5/index.html | 58 + tags/hydra/page/6/index.html | 60 + tags/hydra/page/7/index.html | 53 + tags/hydra/page/8/index.html | 66 + tags/hydra/page/9/index.html | 66 + tags/index.html | 24 + tags/ledger/index.html | 51 + tags/ledger/page/2/index.html | 46 + tags/ledger/page/3/index.html | 50 + tags/ledger/page/4/index.html | 91 + tags/ledger/page/5/index.html | 188 + tags/ledger/page/6/index.html | 154 + tags/mithril/index.html | 24 + tags/mithril/page/2/index.html | 24 + tags/mithril/page/3/index.html | 24 + tags/mithril/page/4/index.html | 24 + tags/mithril/page/5/index.html | 24 + tags/mithril/page/6/index.html | 24 + tags/mithril/page/7/index.html | 24 + tags/network/index.html | 81 + tags/network/page/2/index.html | 128 + tags/network/page/3/index.html | 88 + tags/network/page/4/index.html | 106 + tags/network/page/5/index.html | 117 + tags/open-source/index.html | 45 + tags/performance-tracing/index.html | 62 + tags/performance-tracing/page/2/index.html | 37 + tags/performance-tracing/page/3/index.html | 75 + tags/performance-tracing/page/4/index.html | 43 + tags/performance-tracing/page/5/index.html | 32 + tags/release/index.html | 81 + tags/security/index.html | 25 + tags/sre/index.html | 24 + tags/sre/page/2/index.html | 24 + tags/sre/page/3/index.html | 47 + tags/system-test/index.html | 28 + 1422 files changed, 56311 insertions(+) create mode 100644 .nojekyll create mode 100644 2022-08-12-network/index.html create mode 100644 2022-08-12-sre/index.html create mode 100644 2022-08-31-consensus/index.html create mode 100644 2022-09-01-ledger/index.html create mode 100644 2022-09-16-ledger/index.html create mode 100644 2022-09-19-db-sync/index.html create mode 100644 2022-09-20-consensus/index.html create mode 100644 2022-09-27-network/index.html create mode 100644 2022-09-30-ledger/index.html create mode 100644 2022-10-02-consensus/index.html create mode 100644 2022-10-04-db-sync/index.html create mode 100644 2022-10-04-node-cli-api/index.html create mode 100644 2022-10-05-consensus/index.html create mode 100644 2022-10-14-hydra/index.html create mode 100644 2022-10-14-ledger/index.html create mode 100644 2022-10-18-consensus/index.html create mode 100644 2022-10-19-node-cli-api/index.html create mode 100644 2022-10-21-hydra/index.html create mode 100644 2022-10-27-crypto/index.html create mode 100644 2022-10-28-hydra/index.html create mode 100644 2022-10-28-network/index.html create mode 100644 2022-10-28-performance-and-tracing/index.html create mode 100644 2022-10-31-open-source/index.html create mode 100644 2022-11-01-db-sync/index.html create mode 100644 2022-11-02-ledger/index.html create mode 100644 2022-11-02-node-cli-api/index.html create mode 100644 2022-11-02-release/index.html create mode 100644 2022-11-02-system-test/index.html create mode 100644 2022-11-03-embedding-quality/index.html create mode 100644 2022-11-04-hydra/index.html create mode 100644 2022-11-04-mithril/index.html create mode 100644 2022-11-11-crypto/index.html create mode 100644 2022-11-11-hydra/index.html create mode 100644 2022-11-11-ledger/index.html create mode 100644 2022-11-11-network/index.html create mode 100644 2022-11-16-consensus/index.html create mode 100644 2022-11-16-node-cli-api/index.html create mode 100644 2022-11-16-performance-and-tracing/index.html create mode 100644 2022-11-18-hydra/index.html create mode 100644 2022-11-18-mithril/index.html create mode 100644 2022-11-23-ledger/index.html create mode 100644 2022-11-25-crypto/index.html create mode 100644 2022-11-25-hydra/index.html create mode 100644 2022-11-28-network/index.html create mode 100644 2022-11-30-consensus/index.html create mode 100644 2022-11-30-node-cli-api/index.html create mode 100644 2022-11-30-performance-and-tracing/index.html create mode 100644 2022-12-01-db-sync/index.html create mode 100644 2022-12-01-mithril/index.html create mode 100644 2022-12-01-system-test/index.html create mode 100644 2022-12-02-hydra/index.html create mode 100644 2022-12-09-crypto/index.html create mode 100644 2022-12-09-hydra/index.html create mode 100644 2022-12-09-ledger/index.html create mode 100644 2022-12-12-network/index.html create mode 100644 2022-12-14-consensus/index.html create mode 100644 2022-12-14-db-sync/index.html create mode 100644 2022-12-14-node-cli-api/index.html create mode 100644 2022-12-14-performance-and-tracing/index.html create mode 100644 2022-12-15-mithril/index.html create mode 100644 2022-12-16-hydra/index.html create mode 100644 2022-12-28-node-cli-api/index.html create mode 100644 2023-01-05-ledger/index.html create mode 100644 2023-01-06-crypto/index.html create mode 100644 2023-01-11-consensus/index.html create mode 100644 2023-01-11-performance-and-tracing/index.html create mode 100644 2023-01-12-mithril/index.html create mode 100644 2023-01-13-hydra/index.html create mode 100644 2023-01-13-release/index.html create mode 100644 2023-01-13-system-test/index.html create mode 100644 2023-01-14-db-sync/index.html create mode 100644 2023-01-19-ledger/index.html create mode 100644 2023-01-20-crypto/index.html create mode 100644 2023-01-20-hydra/index.html create mode 100644 2023-01-20-network/index.html create mode 100644 2023-01-20-sre/index.html create mode 100644 2023-01-25-consensus/index.html create mode 100644 2023-01-25-node-cli-api/index.html create mode 100644 2023-01-26-mithril/index.html create mode 100644 2023-01-27-hydra/index.html create mode 100644 2023-02-02-ledger/index.html create mode 100644 2023-02-03-crypto/index.html create mode 100644 2023-02-03-goedel/index.html create mode 100644 2023-02-03-hydra/index.html create mode 100644 2023-02-08-consensus/index.html create mode 100644 2023-02-08-node-cli-api/index.html create mode 100644 2023-02-08-performance-and-tracing/index.html create mode 100644 2023-02-09-mithril/index.html create mode 100644 2023-02-10-hydra/index.html create mode 100644 2023-02-17-crypto/index.html create mode 100644 2023-02-17-goedel/index.html create mode 100644 2023-02-17-hydra/index.html create mode 100644 2023-02-17-ledger/index.html create mode 100644 2023-02-17-network/index.html create mode 100644 2023-02-21-db-sync/index.html create mode 100644 2023-02-22-consensus/index.html create mode 100644 2023-02-22-node-cli-api/index.html create mode 100644 2023-02-23-mithril/index.html create mode 100644 2023-02-23-performance-and-tracing/index.html create mode 100644 2023-02-24-hydra/index.html create mode 100644 2023-03-02-network/index.html create mode 100644 2023-03-03-crypto/index.html create mode 100644 2023-03-03-goedel/index.html create mode 100644 2023-03-03-hydra/index.html create mode 100644 2023-03-03-ledger/index.html create mode 100644 2023-03-08-consensus/index.html create mode 100644 2023-03-08-node-cli-api/index.html create mode 100644 2023-03-08-performance-and-tracing/index.html create mode 100644 2023-03-09-mithril/index.html create mode 100644 2023-03-10-hydra/index.html create mode 100644 2023-03-16-goedel/index.html create mode 100644 2023-03-17-crypto/index.html create mode 100644 2023-03-17-hydra/index.html create mode 100644 2023-03-17-ledger/index.html create mode 100644 2023-03-21-network/index.html create mode 100644 2023-03-22-consensus/index.html create mode 100644 2023-03-22-node-cli-api/index.html create mode 100644 2023-03-22-performance-and-tracing/index.html create mode 100644 2023-03-23-db-sync/index.html create mode 100644 2023-03-23-mithril/index.html create mode 100644 2023-03-24-hydra/index.html create mode 100644 2023-03-27-system-test/index.html create mode 100644 2023-03-31-crypto/index.html create mode 100644 2023-03-31-goedel/index.html create mode 100644 2023-03-31-hydra/index.html create mode 100644 2023-03-31-ledger/index.html create mode 100644 2023-04-05-consensus/index.html create mode 100644 2023-04-05-node-cli-api/index.html create mode 100644 2023-04-05-performance-and-tracing/index.html create mode 100644 2023-04-06-mithril/index.html create mode 100644 2023-04-07-hydra/index.html create mode 100644 2023-04-14-goedel/index.html create mode 100644 2023-04-14-hydra/index.html create mode 100644 2023-04-17-ledger/index.html create mode 100644 2023-04-19-consensus/index.html create mode 100644 2023-04-19-performance-and-tracing/index.html create mode 100644 2023-04-20-mithril/index.html create mode 100644 2023-04-20-node-cli-api/index.html create mode 100644 2023-04-21-hydra/index.html create mode 100644 2023-04-21-ledger/index.html create mode 100644 2023-04-27-hydra/index.html create mode 100644 2023-04-28-crypto/index.html create mode 100644 2023-04-28-goedel/index.html create mode 100644 2023-04-28-network/index.html create mode 100644 2023-05-01-db-sync/index.html create mode 100644 2023-05-03-consensus/index.html create mode 100644 2023-05-03-performance-and-tracing/index.html create mode 100644 2023-05-04-mithril/index.html create mode 100644 2023-05-05-ledger/index.html create mode 100644 2023-05-05-node-cli-api/index.html create mode 100644 2023-05-12-crypto/index.html create mode 100644 2023-05-12-goedel/index.html create mode 100644 2023-05-12-hydra/index.html create mode 100644 2023-05-12-network/index.html create mode 100644 2023-05-17-consensus/index.html create mode 100644 2023-05-17-mithril/index.html create mode 100644 2023-05-17-performance-and-tracing/index.html create mode 100644 2023-05-19-hydra/index.html create mode 100644 2023-05-24-node-cli-api/index.html create mode 100644 2023-05-26-goedel/index.html create mode 100644 2023-05-26-hydra/index.html create mode 100644 2023-05-26-ledger/index.html create mode 100644 2023-05-26-network/index.html create mode 100644 2023-05-31-consensus/index.html create mode 100644 2023-05-31-performance-and-tracing/index.html create mode 100644 2023-06-01-mithril/index.html create mode 100644 2023-06-02-hydra/index.html create mode 100644 2023-06-07-node-cli-api/index.html create mode 100644 2023-06-08-db-sync/index.html create mode 100644 2023-06-08-goedel/index.html create mode 100644 2023-06-08-sre/index.html create mode 100644 2023-06-08-system-test/index.html create mode 100644 2023-06-09-crypto/index.html create mode 100644 2023-06-09-developer-experience/index.html create mode 100644 2023-06-09-hydra/index.html create mode 100644 2023-06-12-network/index.html create mode 100644 2023-06-14-consensus/index.html create mode 100644 2023-06-14-performance-and-tracing/index.html create mode 100644 2023-06-15-mithril/index.html create mode 100644 2023-06-16-hydra/index.html create mode 100644 2023-06-23-goedel/index.html create mode 100644 2023-06-23-hydra/index.html create mode 100644 2023-06-23-network/index.html create mode 100644 2023-06-23-sre/index.html create mode 100644 2023-06-28-consensus/index.html create mode 100644 2023-06-28-performance-and-tracing/index.html create mode 100644 2023-06-29-mithril/index.html create mode 100644 2023-06-30-hydra/index.html create mode 100644 2023-07-04-db-sync/index.html create mode 100644 2023-07-04-node-cli-api/index.html create mode 100644 2023-07-06-developer-experience/index.html create mode 100644 2023-07-07-crypto/index.html create mode 100644 2023-07-07-goedel/index.html create mode 100644 2023-07-07-hydra/index.html create mode 100644 2023-07-07-sre/index.html create mode 100644 2023-07-12-consensus/index.html create mode 100644 2023-07-12-performance-and-tracing/index.html create mode 100644 2023-07-13-mithril/index.html create mode 100644 2023-07-14-hydra/index.html create mode 100644 2023-07-18-node-cli-api/index.html create mode 100644 2023-07-20-goedel/index.html create mode 100644 2023-07-21-hydra/index.html create mode 100644 2023-07-21-ledger/index.html create mode 100644 2023-07-21-sre/index.html create mode 100644 2023-07-26-consensus/index.html create mode 100644 2023-07-27-mithril/index.html create mode 100644 2023-07-28-hydra/index.html create mode 100644 2023-07-31-network/index.html create mode 100644 2023-08-01-node-cli-api/index.html create mode 100644 2023-08-04-crypto/index.html create mode 100644 2023-08-04-goedel/index.html create mode 100644 2023-08-04-hydra/index.html create mode 100644 2023-08-04-ledger/index.html create mode 100644 2023-08-04-network/index.html create mode 100644 2023-08-04-performance-and-tracing/index.html create mode 100644 2023-08-04-sre/index.html create mode 100644 2023-08-09-consensus/index.html create mode 100644 2023-08-10-mithril/index.html create mode 100644 2023-08-11-hydra/index.html create mode 100644 2023-08-11-performance-and-tracing/index.html create mode 100644 2023-08-15-node-cli-api/index.html create mode 100644 2023-08-17-crypto/index.html create mode 100644 2023-08-17-db-sync/index.html create mode 100644 2023-08-17-secp-issue/index.html create mode 100644 2023-08-18-goedel/index.html create mode 100644 2023-08-18-hydra/index.html create mode 100644 2023-08-18-ledger/index.html create mode 100644 2023-08-18-network/index.html create mode 100644 2023-08-18-sre/index.html create mode 100644 2023-08-23-consensus/index.html create mode 100644 2023-08-24-performance-and-tracing/index.html create mode 100644 2023-08-25-hydra/index.html create mode 100644 2023-08-28-mithril/index.html create mode 100644 2023-08-29-node-cli-api/index.html create mode 100644 2023-09-01-goedel/index.html create mode 100644 2023-09-01-hydra/index.html create mode 100644 2023-09-01-ledger/index.html create mode 100644 2023-09-01-network/index.html create mode 100644 2023-09-01-sre/index.html create mode 100644 2023-09-06-consensus/index.html create mode 100644 2023-09-07-mithril/index.html create mode 100644 2023-09-07-performance-and-tracing/index.html create mode 100644 2023-09-08-hydra/index.html create mode 100644 2023-09-12-node-cli-api/index.html create mode 100644 2023-09-14-db-sync/index.html create mode 100644 2023-09-15-goedel/index.html create mode 100644 2023-09-15-hydra/index.html create mode 100644 2023-09-15-ledger/index.html create mode 100644 2023-09-15-network/index.html create mode 100644 2023-09-15-sre/index.html create mode 100644 2023-09-20-consensus/index.html create mode 100644 2023-09-20-mithril/index.html create mode 100644 2023-09-22-hydra/index.html create mode 100644 2023-09-22-performance-and-tracing/index.html create mode 100644 2023-09-26-node-cli-api/index.html create mode 100644 2023-09-27-mithril/index.html create mode 100644 2023-09-29-goedel/index.html create mode 100644 2023-09-29-hydra/index.html create mode 100644 2023-09-29-ledger/index.html create mode 100644 2023-09-29-sre/index.html create mode 100644 2023-10-02-network/index.html create mode 100644 2023-10-04-consensus/index.html create mode 100644 2023-10-04-mithril/index.html create mode 100644 2023-10-06-hydra/index.html create mode 100644 2023-10-06-performance-and-tracing/index.html create mode 100644 2023-10-10-node-cli-api/index.html create mode 100644 2023-10-11-mithril/index.html create mode 100644 2023-10-13-hydra/index.html create mode 100644 2023-10-13-ledger/index.html create mode 100644 2023-10-13-sre/index.html create mode 100644 2023-10-15-network/index.html create mode 100644 2023-10-18-consensus/index.html create mode 100644 2023-10-18-mithril/index.html create mode 100644 2023-10-20-hydra/index.html create mode 100644 2023-10-24-node-cli-api/index.html create mode 100644 2023-10-25-mithril/index.html create mode 100644 2023-10-27-hydra/index.html create mode 100644 2023-10-27-network/index.html create mode 100644 2023-10-27-sre/index.html create mode 100644 2023-11-01-consensus/index.html create mode 100644 2023-11-01-mithril/index.html create mode 100644 2023-11-08-ledger/index.html create mode 100644 2023-11-08-mithril/index.html create mode 100644 2023-11-09-db-sync/index.html create mode 100644 2023-11-10-hydra/index.html create mode 100644 2023-11-10-sre/index.html create mode 100644 2023-11-14-node-cli-api/index.html create mode 100644 2023-11-15-consensus/index.html create mode 100644 2023-11-15-mithril/index.html create mode 100644 2023-11-16-network/index.html create mode 100644 2023-11-17-hydra/index.html create mode 100644 2023-11-17-performance-and-tracing/index.html create mode 100644 2023-11-20-cip1694/index.html create mode 100644 2023-11-22-ledger/index.html create mode 100644 2023-11-22-mithril/index.html create mode 100644 2023-11-24-hydra/index.html create mode 100644 2023-11-24-sre/index.html create mode 100644 2023-11-29-consensus/index.html create mode 100644 2023-11-29-mithril/index.html create mode 100644 2023-12-01-hydra/index.html create mode 100644 2023-12-04-performance-and-tracing/index.html create mode 100644 2023-12-06-ledger/index.html create mode 100644 2023-12-06-mithril/index.html create mode 100644 404.html create mode 100644 archive/index.html create mode 100644 assets/css/styles.1b2b551c.css create mode 100644 assets/files/2022-11-24-UCL-60c46564c5dee25b0060304c060ab1cf.pdf create mode 100644 assets/images/2022-11-02-csj-vs-baseline-9fd0e0e080975cc6cfbe035731b4f38d.svg create mode 100644 assets/images/2022-11-02-csj-vs-baseline-sliced-77ff018af70191b4122b1e7cf56c79b8.svg create mode 100644 assets/images/2022-11-11-noticed-headers-55bb0b4d41e8f0cff0066e1bec91bdd2.png create mode 100644 assets/images/2022-11-16-comparing-TICKF-batch-c6570a71c4a5d53b10cb7309d2cc742c.png create mode 100644 assets/images/2022-11-16-removed-stuttering-e49aa27a0e549f0195373203da971ba7.png create mode 100644 assets/images/2022-12-14-ledger-ops-benchmark-c46be3db45ff5480ed104e0d520711a6.png create mode 100644 assets/images/2023-01-11-utxo-hd-replay-benchmarks-dcf6daaf5460de7591a60db1457d2e58.png create mode 100644 assets/images/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks-6b129a1acaa4bb48443ee81add51fd39.png create mode 100644 assets/images/2023-07-06-p2p-progress-194a909569eebb016b1f24fb8941e2cc.png create mode 100644 assets/images/2023-08-31-p2p-relays-8e5be189ad8437375c5067026c003556.png create mode 100644 assets/images/2023-08-31-relay-versions-0a8d445e1b0f3a793ccdd94f4aacd421.png create mode 100644 assets/images/2023-09-14-p2p-relays-1b3da3da7ec3915f63ca8668bd38aff9.png create mode 100644 assets/images/2023-09-14-relay-versions-a689a96e93e12ee1c78dfe14229f0ea9.png create mode 100644 assets/images/2023-10-04-p2p-relays-75c2baf57ea9346a40f0098b2abb4a99.png create mode 100644 assets/images/2023-10-04-relay-versions-5168d3ed0ad365a18e86263fcccffd23.png create mode 100644 assets/images/2023-Q2-beacon-graph-ded65e814bfe6d927faa1c5c66bbbfad.png create mode 100644 assets/images/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks-74f9d76c2602f09652f584cc4d6a0962.png create mode 100644 assets/images/doc-adoption-cd944582f02809777c58be53e13453c5.png create mode 100644 assets/images/docsVersionDropdown-35e13cbe46c9923327f30a76a90bff3b.png create mode 100644 assets/images/happy-path-csj-prototype-bench-1-2c33ba45f44a086415e703fe8f0f7ad1.svg create mode 100644 assets/images/happy-path-csj-prototype-bench-2-e23d2986ddef0a187df9ce336b2db116.svg create mode 100644 assets/images/happy-path-csj-prototype-prelim-5bbe2e2a20a2740e6238a7c73e618168.svg create mode 100644 assets/images/localeDropdown-f0d995e751e7656a1b0dbbc1134e49c2.png create mode 100644 assets/js/0048047b.7e1f75e8.js create mode 100644 assets/js/007e4c05.e45fd96d.js create mode 100644 assets/js/00bb8269.def94b86.js create mode 100644 assets/js/015be621.e0570f17.js create mode 100644 assets/js/017cd6b7.6c855c6e.js create mode 100644 assets/js/019bb279.7e5077df.js create mode 100644 assets/js/01a85c17.545379d8.js create mode 100644 assets/js/0281a492.3b7b7eac.js create mode 100644 assets/js/034a14a6.3aafc153.js create mode 100644 assets/js/03d856aa.52e2f164.js create mode 100644 assets/js/042169f6.41e4831f.js create mode 100644 assets/js/0431617f.5c919503.js create mode 100644 assets/js/04326247.8876239e.js create mode 100644 assets/js/046dd16d.729d4d40.js create mode 100644 assets/js/04c3317f.e2f79174.js create mode 100644 assets/js/04cbd10c.9008202b.js create mode 100644 assets/js/05f2862f.32b47b8d.js create mode 100644 assets/js/0645cd02.fa280ace.js create mode 100644 assets/js/06a283ef.b8b2b1f9.js create mode 100644 assets/js/07541956.2c467b7c.js create mode 100644 assets/js/07fdf123.654288cb.js create mode 100644 assets/js/0801ba5a.ebcbb7d6.js create mode 100644 assets/js/089154c4.cd4dba30.js create mode 100644 assets/js/08c82b6d.8647aa4f.js create mode 100644 assets/js/09abc415.e2f175c7.js create mode 100644 assets/js/0a44a251.e62524d6.js create mode 100644 assets/js/0ade4266.b7cf47d6.js create mode 100644 assets/js/0af81f82.4b115c93.js create mode 100644 assets/js/0b0bfceb.29fc63d0.js create mode 100644 assets/js/0b1b72af.a3f1baa4.js create mode 100644 assets/js/0b5e25e7.c75d5f30.js create mode 100644 assets/js/0c10bcf4.c8aa7ca2.js create mode 100644 assets/js/0c11045c.7ecdd83c.js create mode 100644 assets/js/0c48efb1.01a06fce.js create mode 100644 assets/js/0d671897.dc5836f3.js create mode 100644 assets/js/0d7612e9.c2555544.js create mode 100644 assets/js/0d889cfb.7f793126.js create mode 100644 assets/js/0db650db.bac77798.js create mode 100644 assets/js/0dc0e43e.00835288.js create mode 100644 assets/js/0de82e28.ff3d9525.js create mode 100644 assets/js/0dea9a3b.e1158297.js create mode 100644 assets/js/0dfea636.45223f2a.js create mode 100644 assets/js/0e0c98f4.b615e9a6.js create mode 100644 assets/js/0e384e19.2cd17c73.js create mode 100644 assets/js/0e717c32.e588556c.js create mode 100644 assets/js/0e828f3a.84204c63.js create mode 100644 assets/js/0ee9866d.aa05b5be.js create mode 100644 assets/js/0fa2fd29.15fed629.js create mode 100644 assets/js/10532414.69c8af62.js create mode 100644 assets/js/10659ce5.04295867.js create mode 100644 assets/js/113fed8c.43bf9228.js create mode 100644 assets/js/11423591.8e82ecb7.js create mode 100644 assets/js/1147f4da.c6a37e99.js create mode 100644 assets/js/120c0b00.b79d45ef.js create mode 100644 assets/js/12208c5e.498a6ea8.js create mode 100644 assets/js/12525f14.359b7596.js create mode 100644 assets/js/12637b23.8c689cc8.js create mode 100644 assets/js/126e82e6.4290e249.js create mode 100644 assets/js/12a1613f.0e2fe3c1.js create mode 100644 assets/js/12c83d8a.ebd0fc40.js create mode 100644 assets/js/12d5d907.1addbe15.js create mode 100644 assets/js/12ef8706.114e8e85.js create mode 100644 assets/js/1377d1fa.d6f4b9df.js create mode 100644 assets/js/144cea98.f99162b0.js create mode 100644 assets/js/144cf255.88218aa6.js create mode 100644 assets/js/14eb3368.75d4fe89.js create mode 100644 assets/js/14fc0a72.a4681214.js create mode 100644 assets/js/14ffac04.cf60f381.js create mode 100644 assets/js/15072f11.49e121a3.js create mode 100644 assets/js/154dea53.1fc8ba85.js create mode 100644 assets/js/15691c1d.51e197de.js create mode 100644 assets/js/15dc596d.ecdc1050.js create mode 100644 assets/js/166775fd.be23135f.js create mode 100644 assets/js/16a93549.ab7d990e.js create mode 100644 assets/js/1752e4e5.873d8644.js create mode 100644 assets/js/17630979.ef34abf8.js create mode 100644 assets/js/177280a4.d0786185.js create mode 100644 assets/js/17896441.12db7610.js create mode 100644 assets/js/17e76f05.72c79f2a.js create mode 100644 assets/js/17f4ca64.bfe3c38a.js create mode 100644 assets/js/187056c8.90cfbf91.js create mode 100644 assets/js/18c41134.31284dc4.js create mode 100644 assets/js/1a21d6a2.8c1f975e.js create mode 100644 assets/js/1a657a20.8a85f02f.js create mode 100644 assets/js/1a932c01.6aaf6224.js create mode 100644 assets/js/1afca88e.5924808c.js create mode 100644 assets/js/1b0bebd5.e1bd57de.js create mode 100644 assets/js/1b2a226f.ac20107e.js create mode 100644 assets/js/1b2c892c.dc757eff.js create mode 100644 assets/js/1b2c8e6e.9c8b7196.js create mode 100644 assets/js/1b34f23d.944aa387.js create mode 100644 assets/js/1be78505.eb072735.js create mode 100644 assets/js/1be923a7.8d35f70e.js create mode 100644 assets/js/1c192ca4.8659f9df.js create mode 100644 assets/js/1caacab6.f165aa95.js create mode 100644 assets/js/1d10bd9e.e7b9cd1c.js create mode 100644 assets/js/1da92289.64c6b1ce.js create mode 100644 assets/js/1e0f95a7.4185e54d.js create mode 100644 assets/js/1e24dd00.03c90e48.js create mode 100644 assets/js/1e4232ab.8f20f4ae.js create mode 100644 assets/js/1e57c0e2.66497df8.js create mode 100644 assets/js/1f391b9e.4c243540.js create mode 100644 assets/js/1f965afe.e03ac866.js create mode 100644 assets/js/1f9c0c9c.5dc5eee7.js create mode 100644 assets/js/2073b851.3d1c7c5a.js create mode 100644 assets/js/209bf559.8a8670ee.js create mode 100644 assets/js/20bc6fcd.6a2cce37.js create mode 100644 assets/js/20ca2c37.5368fb83.js create mode 100644 assets/js/2154b8e4.4635d227.js create mode 100644 assets/js/21735eff.0b009fcd.js create mode 100644 assets/js/21857c8f.db26831e.js create mode 100644 assets/js/219856ee.fc647f5b.js create mode 100644 assets/js/2276e554.dfa87ea9.js create mode 100644 assets/js/237aa4d6.8db3819a.js create mode 100644 assets/js/23a95b4f.a0a27f60.js create mode 100644 assets/js/2455acc4.54c4fd43.js create mode 100644 assets/js/245ecae9.0554e2e3.js create mode 100644 assets/js/246d9f04.1a9615d1.js create mode 100644 assets/js/2494f6fc.cb95a366.js create mode 100644 assets/js/24d5a6d9.56e383b8.js create mode 100644 assets/js/2529.3a3a1ec8.js create mode 100644 assets/js/255b72b4.c906285c.js create mode 100644 assets/js/26678b7e.706c9ffb.js create mode 100644 assets/js/26a4b8b3.b55c0ab6.js create mode 100644 assets/js/274d7200.08e977b8.js create mode 100644 assets/js/27c15961.1370e42d.js create mode 100644 assets/js/27c463c7.c17177cd.js create mode 100644 assets/js/28874657.18164af4.js create mode 100644 assets/js/28bc1d1b.e033ce8a.js create mode 100644 assets/js/28d85025.84af456e.js create mode 100644 assets/js/29801efc.c897fcb8.js create mode 100644 assets/js/2a8f0182.70e085a1.js create mode 100644 assets/js/2b637fd9.56e9f371.js create mode 100644 assets/js/2bc04bf6.977be0a1.js create mode 100644 assets/js/2c045882.801eedcd.js create mode 100644 assets/js/2d0da244.cbe1ecb9.js create mode 100644 assets/js/2d52a685.16ff720d.js create mode 100644 assets/js/2d72833d.b2ed8410.js create mode 100644 assets/js/2d91c21f.2b35d919.js create mode 100644 assets/js/2dd2949a.e4a51357.js create mode 100644 assets/js/2e28eb6b.9479c2e3.js create mode 100644 assets/js/2e2abe90.2e84cbdd.js create mode 100644 assets/js/2e52ad4e.1909c27b.js create mode 100644 assets/js/2e69cd33.7723f713.js create mode 100644 assets/js/2eba0b82.d58fcc5f.js create mode 100644 assets/js/2ebccc4d.b7a55404.js create mode 100644 assets/js/2f97c20a.ce7c08f0.js create mode 100644 assets/js/2fa57f55.9c6c3715.js create mode 100644 assets/js/2fd426fa.ac550511.js create mode 100644 assets/js/301cd1f4.2e5b4d2a.js create mode 100644 assets/js/31025fde.797a7c77.js create mode 100644 assets/js/3143eb67.b959afc8.js create mode 100644 assets/js/31889a8f.911b77aa.js create mode 100644 assets/js/324138c8.0ffe20ee.js create mode 100644 assets/js/32d4ad41.059e2e13.js create mode 100644 assets/js/3328a3bf.2a0ee70d.js create mode 100644 assets/js/335868d9.3ea9cbb3.js create mode 100644 assets/js/3399a664.cb1ecec9.js create mode 100644 assets/js/34012593.05c2493c.js create mode 100644 assets/js/347c3e4d.648bedec.js create mode 100644 assets/js/34c17ec8.6d76c4fb.js create mode 100644 assets/js/35369e36.c570c97c.js create mode 100644 assets/js/354f96c6.f214d6fc.js create mode 100644 assets/js/35785fae.0a17f637.js create mode 100644 assets/js/35961293.d0fa4575.js create mode 100644 assets/js/359aa856.a7e87b7a.js create mode 100644 assets/js/35c3586e.55caad30.js create mode 100644 assets/js/35e2a0c5.c76faf09.js create mode 100644 assets/js/35ef34ae.d5d7c472.js create mode 100644 assets/js/35f1ce0d.c093fa38.js create mode 100644 assets/js/36a96f5a.9a5af48d.js create mode 100644 assets/js/370c5287.99fe1c0a.js create mode 100644 assets/js/372219b0.103948fa.js create mode 100644 assets/js/376dd8e8.2261b7dd.js create mode 100644 assets/js/37b247a8.bcaeb502.js create mode 100644 assets/js/37b2e4a4.2c8ca832.js create mode 100644 assets/js/38284ae5.6211d81b.js create mode 100644 assets/js/387f3426.93ddf683.js create mode 100644 assets/js/388f6888.258f2772.js create mode 100644 assets/js/391126a1.ec0b455d.js create mode 100644 assets/js/393be207.17ef41bf.js create mode 100644 assets/js/393cd824.593da712.js create mode 100644 assets/js/397686d4.61d37a76.js create mode 100644 assets/js/3a3a2602.b09aebb4.js create mode 100644 assets/js/3a40f46b.b5ec8c54.js create mode 100644 assets/js/3a493dd8.735658ae.js create mode 100644 assets/js/3ab5f4e0.04ccd5a8.js create mode 100644 assets/js/3ac14561.1cd1f4d0.js create mode 100644 assets/js/3ac610ff.316c8e11.js create mode 100644 assets/js/3bb06773.29b34cb1.js create mode 100644 assets/js/3bb415e3.ede0fcad.js create mode 100644 assets/js/3bc8fe23.54d3883d.js create mode 100644 assets/js/3be95f92.45db99c1.js create mode 100644 assets/js/3c2e75b4.1fb064d3.js create mode 100644 assets/js/3c3d2bff.6a9b8a9e.js create mode 100644 assets/js/3c8518bb.e3668a02.js create mode 100644 assets/js/3cb4be67.1f1b2aaa.js create mode 100644 assets/js/3cb9fdac.eb9b02da.js create mode 100644 assets/js/3ce290cc.49694d77.js create mode 100644 assets/js/3dbbac8a.56fe0fb3.js create mode 100644 assets/js/3e93a65d.c81741e5.js create mode 100644 assets/js/3eae7101.1c3bfdde.js create mode 100644 assets/js/3ede3d79.3f739406.js create mode 100644 assets/js/3ee2c73a.56f15864.js create mode 100644 assets/js/3f2108ba.00951b81.js create mode 100644 assets/js/3f64a4c5.7672a1fc.js create mode 100644 assets/js/3f9060c3.e4eac2b7.js create mode 100644 assets/js/40367786.801454be.js create mode 100644 assets/js/40718b14.5ad5937f.js create mode 100644 assets/js/40a4cbba.c44c73f4.js create mode 100644 assets/js/40e498fa.7e0d2b44.js create mode 100644 assets/js/41244b80.81b0a059.js create mode 100644 assets/js/415f2cd9.064a1e9b.js create mode 100644 assets/js/41606842.90043f12.js create mode 100644 assets/js/417fc4b4.4f4a2695.js create mode 100644 assets/js/41d087d7.f106b6c0.js create mode 100644 assets/js/425dfc0f.51e517b1.js create mode 100644 assets/js/42ad0ca4.784088d6.js create mode 100644 assets/js/43289e4d.c91734fc.js create mode 100644 assets/js/435d8b4c.89bf5b70.js create mode 100644 assets/js/437db4bf.f20821a1.js create mode 100644 assets/js/439b9a57.c4abecba.js create mode 100644 assets/js/43aa4824.940228f0.js create mode 100644 assets/js/43ab8474.0e965728.js create mode 100644 assets/js/43bbbae7.8ce14775.js create mode 100644 assets/js/444dad87.29aa76a0.js create mode 100644 assets/js/44642b2f.9ca08045.js create mode 100644 assets/js/44e33f80.842bca3f.js create mode 100644 assets/js/459dd1ef.7604d487.js create mode 100644 assets/js/45a10ae8.de178977.js create mode 100644 assets/js/469935bd.daaef810.js create mode 100644 assets/js/46c51ef6.7652a0cc.js create mode 100644 assets/js/46d9aab0.40f77729.js create mode 100644 assets/js/4735cd81.21fed183.js create mode 100644 assets/js/47658b82.e1d6cb38.js create mode 100644 assets/js/47cae651.5e63cd4e.js create mode 100644 assets/js/47da279e.0dc7a732.js create mode 100644 assets/js/48292e37.4e1a58d5.js create mode 100644 assets/js/485c7377.08d81db4.js create mode 100644 assets/js/4883d618.0d6007b2.js create mode 100644 assets/js/4906b8e6.48c4df9c.js create mode 100644 assets/js/492dc159.444114ca.js create mode 100644 assets/js/496cb9ef.aaee1128.js create mode 100644 assets/js/4972.a20ea76a.js create mode 100644 assets/js/49d642c9.3891d7a8.js create mode 100644 assets/js/49d88be4.57145c14.js create mode 100644 assets/js/49db7061.7d2045e9.js create mode 100644 assets/js/4aaac366.4801cea2.js create mode 100644 assets/js/4ab012ff.891d7eda.js create mode 100644 assets/js/4b62dc40.f3efb060.js create mode 100644 assets/js/4b90674f.c49340db.js create mode 100644 assets/js/4b996e44.f9c2f0cd.js create mode 100644 assets/js/4be9a3a6.9e933a24.js create mode 100644 assets/js/4bed0e48.0ec05e19.js create mode 100644 assets/js/4c4f8ee1.35fd4774.js create mode 100644 assets/js/4c7d0c08.57bb3429.js create mode 100644 assets/js/4c91b9ee.800884f9.js create mode 100644 assets/js/4ce06e64.8c5577b4.js create mode 100644 assets/js/4cecd320.50a66533.js create mode 100644 assets/js/4d3eb7e7.deb360a8.js create mode 100644 assets/js/4d7c8e78.a7f8c06f.js create mode 100644 assets/js/4da01d42.55b2a465.js create mode 100644 assets/js/4dc3be72.1b8e67d2.js create mode 100644 assets/js/4de4e659.cb788841.js create mode 100644 assets/js/4df30499.579d0d55.js create mode 100644 assets/js/4e45b006.d8b869ce.js create mode 100644 assets/js/4ed83391.31eb1d59.js create mode 100644 assets/js/4ef71b5f.e4f1978f.js create mode 100644 assets/js/4fb1471a.876221eb.js create mode 100644 assets/js/4fd8c72a.6da59da0.js create mode 100644 assets/js/4fe12b4b.941e6176.js create mode 100644 assets/js/4fe88e48.fa1e775a.js create mode 100644 assets/js/4febca42.f94e02ae.js create mode 100644 assets/js/50135b75.e3faee2b.js create mode 100644 assets/js/50d0e663.0674ac23.js create mode 100644 assets/js/51068.b4d6108e.js create mode 100644 assets/js/51457b0b.bd558a45.js create mode 100644 assets/js/51bf60d9.2a2866d6.js create mode 100644 assets/js/51cf8946.e4f02867.js create mode 100644 assets/js/5226ad4f.b1d14706.js create mode 100644 assets/js/5296f864.dabe31b3.js create mode 100644 assets/js/52b8fa8a.b3e53016.js create mode 100644 assets/js/533a09ca.3d88b763.js create mode 100644 assets/js/533bb9dc.b96dad64.js create mode 100644 assets/js/53f26dca.4f1881f6.js create mode 100644 assets/js/54597942.94ae773b.js create mode 100644 assets/js/548ef7ca.87502d26.js create mode 100644 assets/js/54a7c81e.d059c59c.js create mode 100644 assets/js/550cdc1d.5c224350.js create mode 100644 assets/js/551db1ac.ee42f66f.js create mode 100644 assets/js/55b9667a.9fc9a6eb.js create mode 100644 assets/js/55e35eab.f696c438.js create mode 100644 assets/js/563fcf2e.dc6fb4c7.js create mode 100644 assets/js/565f686e.5a6ec3a7.js create mode 100644 assets/js/5668eccd.20b5304f.js create mode 100644 assets/js/5674f153.b4eb130b.js create mode 100644 assets/js/56b3fab8.8ae61492.js create mode 100644 assets/js/56f35d85.c3eab92c.js create mode 100644 assets/js/57008883.11bb08cb.js create mode 100644 assets/js/5733c82d.3d490188.js create mode 100644 assets/js/57700755.3e57e6d9.js create mode 100644 assets/js/5778ca6b.8bc37115.js create mode 100644 assets/js/578d3f15.ece3e377.js create mode 100644 assets/js/57e0ab98.71940d4e.js create mode 100644 assets/js/5889a844.62933b70.js create mode 100644 assets/js/588e4efd.70f41653.js create mode 100644 assets/js/59a262d5.9dd70cc0.js create mode 100644 assets/js/5a843cd2.63c9493e.js create mode 100644 assets/js/5af0f4f9.98e85c8f.js create mode 100644 assets/js/5c5c653f.17cac15c.js create mode 100644 assets/js/5c868d36.01487d90.js create mode 100644 assets/js/5c8fca76.d1a16dc0.js create mode 100644 assets/js/5cc32405.fd1def08.js create mode 100644 assets/js/5cf7c214.36586195.js create mode 100644 assets/js/5d0266be.e028d3f3.js create mode 100644 assets/js/5d5964ec.d720c839.js create mode 100644 assets/js/5df8a536.f44554bd.js create mode 100644 assets/js/5e3dc99b.c7aa10e4.js create mode 100644 assets/js/5e730d4f.bf3e3989.js create mode 100644 assets/js/5e9a4be9.9e7aea0b.js create mode 100644 assets/js/6004d2a4.ab1b5f3f.js create mode 100644 assets/js/600e4190.0bee7b6c.js create mode 100644 assets/js/60a77258.17d58a0f.js create mode 100644 assets/js/60c9cc01.8f5bc5c6.js create mode 100644 assets/js/60e1630c.96901eb9.js create mode 100644 assets/js/60fae5f4.0a220c69.js create mode 100644 assets/js/611f3a9e.dc1be487.js create mode 100644 assets/js/6190b2fb.6cb691e4.js create mode 100644 assets/js/61d299e1.76807eb6.js create mode 100644 assets/js/61e62d68.b6c5bb67.js create mode 100644 assets/js/61f1e7c8.3b0a1c29.js create mode 100644 assets/js/6226ba71.40eb13ae.js create mode 100644 assets/js/622f92df.5ca5ec26.js create mode 100644 assets/js/62422ab6.648df983.js create mode 100644 assets/js/62a53033.08859e4a.js create mode 100644 assets/js/62dc90a1.3f3d2412.js create mode 100644 assets/js/62ec9f43.b063b2d8.js create mode 100644 assets/js/62f46a38.200c43f2.js create mode 100644 assets/js/632979e8.1945c14a.js create mode 100644 assets/js/637356df.030a1e3f.js create mode 100644 assets/js/63fae4f0.c9242707.js create mode 100644 assets/js/65d0391b.cf9502af.js create mode 100644 assets/js/65ecf6d5.9b390ce8.js create mode 100644 assets/js/6610396c.3cf94bee.js create mode 100644 assets/js/66326f4e.78fd62e9.js create mode 100644 assets/js/66345e96.e312da06.js create mode 100644 assets/js/66be9998.833c32ac.js create mode 100644 assets/js/67ce4884.ec575d6b.js create mode 100644 assets/js/684a796f.c08bc3c2.js create mode 100644 assets/js/68585f67.eb9cce0f.js create mode 100644 assets/js/6875c492.16502a56.js create mode 100644 assets/js/68fb9d2f.2531ccaa.js create mode 100644 assets/js/691b1ed7.406ee554.js create mode 100644 assets/js/692497e1.a2ed0b7c.js create mode 100644 assets/js/6927f7c4.bee27a35.js create mode 100644 assets/js/69c7a5a7.4519d82c.js create mode 100644 assets/js/6a2140b3.b4a88233.js create mode 100644 assets/js/6a75c57a.f8e5de89.js create mode 100644 assets/js/6b16e156.2e2f483e.js create mode 100644 assets/js/6b51f988.6976254a.js create mode 100644 assets/js/6b553c5c.fe679aa9.js create mode 100644 assets/js/6b6054d2.1032f2af.js create mode 100644 assets/js/6bae8700.1896d76a.js create mode 100644 assets/js/6c658908.1afc9614.js create mode 100644 assets/js/6c8b7ad4.3b4a3f73.js create mode 100644 assets/js/6d22e028.a5fcbc6b.js create mode 100644 assets/js/6d25229c.2394cdc6.js create mode 100644 assets/js/6d371395.59984cd7.js create mode 100644 assets/js/6d826f51.2c78b028.js create mode 100644 assets/js/6da0a796.a9cb8072.js create mode 100644 assets/js/6e43d302.e737c437.js create mode 100644 assets/js/6e743f1b.64602d6e.js create mode 100644 assets/js/6e7b669d.61ef66f9.js create mode 100644 assets/js/6eecfaae.6cbf1fce.js create mode 100644 assets/js/6f700e99.66ebd5a7.js create mode 100644 assets/js/6fb45133.8780f9a7.js create mode 100644 assets/js/7030fa2f.ac2104c3.js create mode 100644 assets/js/70372002.8347b491.js create mode 100644 assets/js/70396aa3.b3e5d301.js create mode 100644 assets/js/704e5bb8.fbbc39f4.js create mode 100644 assets/js/709abed9.708c231e.js create mode 100644 assets/js/71d215be.87d3dda2.js create mode 100644 assets/js/71e4641a.c575aa4b.js create mode 100644 assets/js/7221b837.a070d45c.js create mode 100644 assets/js/72c81964.0dc8e201.js create mode 100644 assets/js/7312b66d.97615e9e.js create mode 100644 assets/js/7325235b.554ee35f.js create mode 100644 assets/js/733f2214.260f1743.js create mode 100644 assets/js/73a1bc7a.eede1bae.js create mode 100644 assets/js/73a96f39.b97f3a8a.js create mode 100644 assets/js/73bbd4d7.28eef603.js create mode 100644 assets/js/73f0dde0.f2c110fe.js create mode 100644 assets/js/7439ef37.e15faba5.js create mode 100644 assets/js/74d66224.39d38542.js create mode 100644 assets/js/752b6ead.8868ca89.js create mode 100644 assets/js/7574ff34.785c26ac.js create mode 100644 assets/js/76794a21.2d5266e5.js create mode 100644 assets/js/769eb34c.4403be81.js create mode 100644 assets/js/76c61a3b.3a82d970.js create mode 100644 assets/js/771f29e6.38c2d771.js create mode 100644 assets/js/77215fb3.5fcc484d.js create mode 100644 assets/js/77550e96.e668c8a1.js create mode 100644 assets/js/778ef860.762eeabd.js create mode 100644 assets/js/77d69aed.613ab23b.js create mode 100644 assets/js/77d820b6.ed642bc4.js create mode 100644 assets/js/77e9cceb.9b232c45.js create mode 100644 assets/js/789f2cca.39f99462.js create mode 100644 assets/js/78c763b8.c42d19d7.js create mode 100644 assets/js/78d554ba.66ab6334.js create mode 100644 assets/js/78d8ce1d.84441dbe.js create mode 100644 assets/js/78df8d65.119ba796.js create mode 100644 assets/js/79239208.68e37e23.js create mode 100644 assets/js/795480a5.e692d8ea.js create mode 100644 assets/js/79730245.14cda0d8.js create mode 100644 assets/js/798d160f.fc29dc61.js create mode 100644 assets/js/79d76848.47b0a3f4.js create mode 100644 assets/js/7a263bfa.1c805219.js create mode 100644 assets/js/7a4b421f.f75b7a16.js create mode 100644 assets/js/7a6174e7.93ed69fb.js create mode 100644 assets/js/7a7e39bb.20054c14.js create mode 100644 assets/js/7aaa65e3.2ad8effb.js create mode 100644 assets/js/7b73b4cd.d7498fa0.js create mode 100644 assets/js/7c359f4d.0c522b73.js create mode 100644 assets/js/7c815b5e.a5522061.js create mode 100644 assets/js/7c895c96.960a5ba4.js create mode 100644 assets/js/7d4ab4f9.0ec0db41.js create mode 100644 assets/js/7d6aa09c.fba7f48c.js create mode 100644 assets/js/7de7ce98.caa95da2.js create mode 100644 assets/js/7de83161.6e30b750.js create mode 100644 assets/js/7e644b1f.ef2c8f6f.js create mode 100644 assets/js/7e87972d.24662f86.js create mode 100644 assets/js/7e8e081f.455c9b12.js create mode 100644 assets/js/7fa9de70.cff3c34e.js create mode 100644 assets/js/7faccef9.aac12434.js create mode 100644 assets/js/7ff27d5d.5960fd00.js create mode 100644 assets/js/7ff38eb4.f5ac8427.js create mode 100644 assets/js/80057f85.edc1c235.js create mode 100644 assets/js/80210.245c42c2.js create mode 100644 assets/js/80537537.5725cfd8.js create mode 100644 assets/js/805fc822.c864d419.js create mode 100644 assets/js/80617771.3351af55.js create mode 100644 assets/js/8084428b.0eba4435.js create mode 100644 assets/js/80c54634.fd705a3e.js create mode 100644 assets/js/81528b00.9aeb470f.js create mode 100644 assets/js/81bb24c9.76693a73.js create mode 100644 assets/js/82209890.d5e4ff65.js create mode 100644 assets/js/822bd8ab.dfb2cd17.js create mode 100644 assets/js/82c38436.f7c1816e.js create mode 100644 assets/js/82db709e.075c055a.js create mode 100644 assets/js/82ed4471.838c38ab.js create mode 100644 assets/js/82f24945.8746cef5.js create mode 100644 assets/js/830ba2c4.c975997b.js create mode 100644 assets/js/831d95cb.0c66da8a.js create mode 100644 assets/js/8395f67d.798e5dd2.js create mode 100644 assets/js/83e7e4db.6c511419.js create mode 100644 assets/js/84189288.e5afffc2.js create mode 100644 assets/js/84677cf0.55a9266a.js create mode 100644 assets/js/8470e3c7.4090b9b2.js create mode 100644 assets/js/84823557.5b494971.js create mode 100644 assets/js/8534c2dd.8ec8dbda.js create mode 100644 assets/js/859b6012.9836dc83.js create mode 100644 assets/js/86c4d158.2e916fa2.js create mode 100644 assets/js/86cc1b5f.c4aa4649.js create mode 100644 assets/js/86e0423a.929b4796.js create mode 100644 assets/js/87088759.90416017.js create mode 100644 assets/js/871691d4.358d342f.js create mode 100644 assets/js/876c34e9.eaf9747b.js create mode 100644 assets/js/878c8163.fc733a29.js create mode 100644 assets/js/884eee03.9c216150.js create mode 100644 assets/js/8864b77b.cb1a7306.js create mode 100644 assets/js/8914fa7e.0fe96f3b.js create mode 100644 assets/js/89211367.d2f211db.js create mode 100644 assets/js/89931013.c6ff4cfa.js create mode 100644 assets/js/89a43a90.47af50cd.js create mode 100644 assets/js/8a6fc2ec.f5b11d20.js create mode 100644 assets/js/8a766cbb.70e76067.js create mode 100644 assets/js/8b4d9039.1f86965b.js create mode 100644 assets/js/8bfc66fb.c75678d4.js create mode 100644 assets/js/8c574ba2.ca3a46e5.js create mode 100644 assets/js/8c6dbeca.57f339f6.js create mode 100644 assets/js/8c75942c.5e08e3a4.js create mode 100644 assets/js/8ccf5d9f.108f5ee1.js create mode 100644 assets/js/8cd47ea9.cf455658.js create mode 100644 assets/js/8d0075ff.7598228c.js create mode 100644 assets/js/8d209506.e4591885.js create mode 100644 assets/js/8d306cf9.aa58ca4c.js create mode 100644 assets/js/8d3da32e.efff0598.js create mode 100644 assets/js/8e410d22.c34ee40e.js create mode 100644 assets/js/8ed15298.d65354c1.js create mode 100644 assets/js/8f7e10a3.d241f9ad.js create mode 100644 assets/js/8fddd37c.2e76cb01.js create mode 100644 assets/js/8fe062a7.d7311ede.js create mode 100644 assets/js/8fea44ca.9d9d62e9.js create mode 100644 assets/js/90bf9c2d.ecec42d7.js create mode 100644 assets/js/90cc522f.bcba69c4.js create mode 100644 assets/js/90f359c5.bdc4672e.js create mode 100644 assets/js/9136968b.5abe266e.js create mode 100644 assets/js/913aac40.95dd1cb5.js create mode 100644 assets/js/91595845.dbcc8865.js create mode 100644 assets/js/91831590.028d52d9.js create mode 100644 assets/js/91b05c51.41ca190f.js create mode 100644 assets/js/924be064.77e5f297.js create mode 100644 assets/js/925feafa.07b667eb.js create mode 100644 assets/js/9291df2e.9b87d940.js create mode 100644 assets/js/934a8f8d.939addfb.js create mode 100644 assets/js/935f2afb.12b4c978.js create mode 100644 assets/js/93729337.24640633.js create mode 100644 assets/js/93b15a8c.d2a93a61.js create mode 100644 assets/js/94133299.4eaf7b31.js create mode 100644 assets/js/9440f007.f4a7587d.js create mode 100644 assets/js/9450fd8f.f4c685b8.js create mode 100644 assets/js/94780c38.71d2b83d.js create mode 100644 assets/js/948ff80d.35bdc0f3.js create mode 100644 assets/js/94a907c9.b1899393.js create mode 100644 assets/js/94c6d911.ce947e81.js create mode 100644 assets/js/94dc91d7.e956eef6.js create mode 100644 assets/js/95f12e12.89a759bd.js create mode 100644 assets/js/960e3390.9a5d2160.js create mode 100644 assets/js/965e9e9a.ae2a813a.js create mode 100644 assets/js/9668e24b.a1fef7db.js create mode 100644 assets/js/97407dee.1346e5b9.js create mode 100644 assets/js/97cbe67b.9fa74904.js create mode 100644 assets/js/97daee08.077f549d.js create mode 100644 assets/js/98277053.8204ac95.js create mode 100644 assets/js/986e43da.f541f01c.js create mode 100644 assets/js/98b2ca25.58b9f52d.js create mode 100644 assets/js/98e6984f.26f25dbd.js create mode 100644 assets/js/9945c128.4d1fc2f5.js create mode 100644 assets/js/996aa714.48a86a7d.js create mode 100644 assets/js/99881079.7399a249.js create mode 100644 assets/js/999e2b46.b9eca61e.js create mode 100644 assets/js/99b0bd12.4ff93e6b.js create mode 100644 assets/js/9a01d9b0.da592dca.js create mode 100644 assets/js/9a03c440.55017adb.js create mode 100644 assets/js/9a4c05df.566cf4df.js create mode 100644 assets/js/9b5ce5fa.860ab49e.js create mode 100644 assets/js/9b6092d7.8ac0135c.js create mode 100644 assets/js/9b7a95a2.ff1a9f67.js create mode 100644 assets/js/9ba26136.1faa833c.js create mode 100644 assets/js/9bcfaf7c.459a8722.js create mode 100644 assets/js/9c662d1f.abf660e9.js create mode 100644 assets/js/9c7979b1.e1cf42fe.js create mode 100644 assets/js/9c96fa11.ea8e50f7.js create mode 100644 assets/js/9cab6d73.47f4f611.js create mode 100644 assets/js/9ce37f6e.77804269.js create mode 100644 assets/js/9d43e047.df69749e.js create mode 100644 assets/js/9d7869bb.35b4854a.js create mode 100644 assets/js/9dce568f.09ea27c7.js create mode 100644 assets/js/9dee36e7.c9cec439.js create mode 100644 assets/js/9e4087bc.47006cd4.js create mode 100644 assets/js/9e570fef.3918b741.js create mode 100644 assets/js/9e834cf3.1e4d257a.js create mode 100644 assets/js/9e9bda24.2571a9f9.js create mode 100644 assets/js/9f70a142.92a32352.js create mode 100644 assets/js/9f761678.efd79bb9.js create mode 100644 assets/js/9f7c2154.b8bd5c7b.js create mode 100644 assets/js/9fba849d.b41ee22a.js create mode 100644 assets/js/a040c838.3f6e8559.js create mode 100644 assets/js/a0d18a99.9c37ba0b.js create mode 100644 assets/js/a0fc6770.402665bb.js create mode 100644 assets/js/a14fd889.9bf1cea0.js create mode 100644 assets/js/a1597564.186e8185.js create mode 100644 assets/js/a1ac97eb.58460967.js create mode 100644 assets/js/a1b4c76a.51af9271.js create mode 100644 assets/js/a1cde312.838f2c04.js create mode 100644 assets/js/a1d1f035.546a3e7f.js create mode 100644 assets/js/a1d4a798.53b252bf.js create mode 100644 assets/js/a1f2945e.cd202afc.js create mode 100644 assets/js/a2a63bac.f350ae76.js create mode 100644 assets/js/a2ee852b.3deb7f04.js create mode 100644 assets/js/a34b3179.fc92e4ec.js create mode 100644 assets/js/a3889346.f4b45fc1.js create mode 100644 assets/js/a48d66c0.554b9825.js create mode 100644 assets/js/a572b6ff.fac7438c.js create mode 100644 assets/js/a5bf291f.f146d996.js create mode 100644 assets/js/a6238997.20176f92.js create mode 100644 assets/js/a687dd04.bb48cff5.js create mode 100644 assets/js/a69f0deb.4d5ff44c.js create mode 100644 assets/js/a6aa9e1f.3167acc2.js create mode 100644 assets/js/a6afc437.c755f9a0.js create mode 100644 assets/js/a6e1d45a.affc557f.js create mode 100644 assets/js/a6e5ff3c.f8f8d3c0.js create mode 100644 assets/js/a7418040.313e46d8.js create mode 100644 assets/js/a7a31948.7327cf2d.js create mode 100644 assets/js/a8723288.631293b3.js create mode 100644 assets/js/a8738e5f.f18e47da.js create mode 100644 assets/js/a9019578.618a0894.js create mode 100644 assets/js/a9347c1b.a93f84b5.js create mode 100644 assets/js/aa4c9cc8.6f769daf.js create mode 100644 assets/js/aafd9eaa.e577fb53.js create mode 100644 assets/js/ab4c3279.cc8e8278.js create mode 100644 assets/js/ac12bff3.f511d815.js create mode 100644 assets/js/ac56cb0b.5e036803.js create mode 100644 assets/js/ac87db6a.c0500c01.js create mode 100644 assets/js/ac8a5a87.fb97dd70.js create mode 100644 assets/js/acd2edbe.7d8cc863.js create mode 100644 assets/js/ace79a55.6028e600.js create mode 100644 assets/js/add555bf.8ea1e3df.js create mode 100644 assets/js/ae2d2424.be7ef5ae.js create mode 100644 assets/js/ae455379.e0af4636.js create mode 100644 assets/js/ae521593.22fed2a0.js create mode 100644 assets/js/ae7f7c70.147dae80.js create mode 100644 assets/js/afa83c07.67905eb7.js create mode 100644 assets/js/b020ac17.f01a9412.js create mode 100644 assets/js/b032e7ab.b1a9961b.js create mode 100644 assets/js/b03d4a4e.5d00abc3.js create mode 100644 assets/js/b073a55d.87d95835.js create mode 100644 assets/js/b073edd1.1e4774ca.js create mode 100644 assets/js/b13803f3.f0a1384b.js create mode 100644 assets/js/b242687d.9e8010a3.js create mode 100644 assets/js/b28a1077.d4571d53.js create mode 100644 assets/js/b3041b60.04095479.js create mode 100644 assets/js/b3043f02.38a94c82.js create mode 100644 assets/js/b41783a8.f909dc33.js create mode 100644 assets/js/b4645a09.58164e44.js create mode 100644 assets/js/b4cc2dd2.ac8372ad.js create mode 100644 assets/js/b4f5b98b.d8a4a2ab.js create mode 100644 assets/js/b512dd46.0c3c6eed.js create mode 100644 assets/js/b5164349.8a4ed5f9.js create mode 100644 assets/js/b57687d8.ad244a62.js create mode 100644 assets/js/b6145ff0.7ca20c32.js create mode 100644 assets/js/b65e5ec2.d8fca806.js create mode 100644 assets/js/b6ef4fcb.68ecccd5.js create mode 100644 assets/js/b78698d9.e2fd1721.js create mode 100644 assets/js/b7dd63dc.a0a6b412.js create mode 100644 assets/js/b8465b4d.c76114e0.js create mode 100644 assets/js/b88c8fa9.9fdee81f.js create mode 100644 assets/js/b8a3fbda.c9a4283c.js create mode 100644 assets/js/b8bcf1d1.204838b0.js create mode 100644 assets/js/b92c36fd.da51b229.js create mode 100644 assets/js/b96b3223.99af26b5.js create mode 100644 assets/js/b9d87023.3ccfd671.js create mode 100644 assets/js/ba0b6dbd.00ad8d78.js create mode 100644 assets/js/baed1590.d9d74d98.js create mode 100644 assets/js/bb44f9e3.0939305b.js create mode 100644 assets/js/bb465a37.a85dd0e6.js create mode 100644 assets/js/bbc31819.a65c3848.js create mode 100644 assets/js/bbe7c3bd.224be55a.js create mode 100644 assets/js/bc6b65d9.f1413473.js create mode 100644 assets/js/bccb35b7.5dbc8a59.js create mode 100644 assets/js/bcf46d9c.dc0dfba9.js create mode 100644 assets/js/bd65afd9.b89ce463.js create mode 100644 assets/js/bda3e1c7.8c9d07fa.js create mode 100644 assets/js/bdc4c1ed.c2a461dc.js create mode 100644 assets/js/be16a434.031b2037.js create mode 100644 assets/js/be1e6782.4ec13c11.js create mode 100644 assets/js/be26e761.724d58c0.js create mode 100644 assets/js/be32a6ec.24f1e527.js create mode 100644 assets/js/bf071e0b.76b7ab70.js create mode 100644 assets/js/c0354ce6.09b0b808.js create mode 100644 assets/js/c036f08e.230d3185.js create mode 100644 assets/js/c061e3b1.52557f8e.js create mode 100644 assets/js/c063df1b.518f2336.js create mode 100644 assets/js/c08c0f47.416aafe8.js create mode 100644 assets/js/c091c5d8.ce22eeb2.js create mode 100644 assets/js/c0ac1524.13b59269.js create mode 100644 assets/js/c0cf6239.cd90552c.js create mode 100644 assets/js/c10365f3.472f2046.js create mode 100644 assets/js/c178b56c.3e187747.js create mode 100644 assets/js/c1c5c6f5.bba09171.js create mode 100644 assets/js/c2b4dd94.778afa9a.js create mode 100644 assets/js/c2eec07f.f7406fac.js create mode 100644 assets/js/c315164d.90ef02cc.js create mode 100644 assets/js/c4479859.8309a90c.js create mode 100644 assets/js/c511c40f.0dd3f662.js create mode 100644 assets/js/c5858ebd.c70ee4f9.js create mode 100644 assets/js/c60581f2.f0c60a3a.js create mode 100644 assets/js/c6259fbb.fdd3fb9d.js create mode 100644 assets/js/c63933b3.19137cb7.js create mode 100644 assets/js/c6ae40c2.fcdab135.js create mode 100644 assets/js/c6f90b29.8b77bc39.js create mode 100644 assets/js/c7337d4e.6cea3bb1.js create mode 100644 assets/js/c7e43a05.c308de8a.js create mode 100644 assets/js/c831575d.33f5874b.js create mode 100644 assets/js/c90fb258.9c89e222.js create mode 100644 assets/js/c9210b26.f9c92b06.js create mode 100644 assets/js/c94f306d.475fec2b.js create mode 100644 assets/js/ca3b5bc8.d750be9f.js create mode 100644 assets/js/ca6829cb.00bb58af.js create mode 100644 assets/js/caab1e2e.790da899.js create mode 100644 assets/js/cb7a1a0b.fc91c3ee.js create mode 100644 assets/js/cc267639.9995a73a.js create mode 100644 assets/js/cc30e037.47fc6eda.js create mode 100644 assets/js/cc5c2602.db9902d7.js create mode 100644 assets/js/ccb7a847.7e3751a5.js create mode 100644 assets/js/ccc49370.66cad8e9.js create mode 100644 assets/js/cced6026.061e2055.js create mode 100644 assets/js/ccf451f9.7efe9c4d.js create mode 100644 assets/js/ccfc9222.e04c413b.js create mode 100644 assets/js/cd0ded60.0db37d65.js create mode 100644 assets/js/cd612773.d9b87bb0.js create mode 100644 assets/js/ce17d78b.b895a29b.js create mode 100644 assets/js/ce6dcc9e.38a5e04e.js create mode 100644 assets/js/ce7ed51f.8bdb2215.js create mode 100644 assets/js/cf1bc381.4cd9437b.js create mode 100644 assets/js/cfb82551.e63304fb.js create mode 100644 assets/js/cfdb38ee.97cf8400.js create mode 100644 assets/js/d0639dee.f18be2c7.js create mode 100644 assets/js/d077dadd.9fa7f5a1.js create mode 100644 assets/js/d0a351c0.258067ed.js create mode 100644 assets/js/d0e182b9.835c5b63.js create mode 100644 assets/js/d10ad4a6.af42a029.js create mode 100644 assets/js/d124c703.15587654.js create mode 100644 assets/js/d15a0787.33318e9f.js create mode 100644 assets/js/d19a344f.3d64c4eb.js create mode 100644 assets/js/d1d47ba3.c8bfd78a.js create mode 100644 assets/js/d200e7a4.e30d362a.js create mode 100644 assets/js/d2ab2776.0b7a25c4.js create mode 100644 assets/js/d2aca35e.86129eca.js create mode 100644 assets/js/d2ea5af2.447b9563.js create mode 100644 assets/js/d343e3e1.3cb5767a.js create mode 100644 assets/js/d3a595c1.813f9114.js create mode 100644 assets/js/d3f3f546.88297ed1.js create mode 100644 assets/js/d442e1d8.854196c8.js create mode 100644 assets/js/d5676bf9.f90c55bb.js create mode 100644 assets/js/d5cc3122.33b4ba11.js create mode 100644 assets/js/d5f27176.938b3c42.js create mode 100644 assets/js/d65b9dd2.7da8dd3d.js create mode 100644 assets/js/d6a3b4a5.0e85b9f0.js create mode 100644 assets/js/d6a93ba7.2190ecb6.js create mode 100644 assets/js/d6b66cf4.24242dbb.js create mode 100644 assets/js/d6c09ac2.62736fde.js create mode 100644 assets/js/d6f20405.d88dddb4.js create mode 100644 assets/js/d70b4c5f.9e25feed.js create mode 100644 assets/js/d7836792.8920f6e8.js create mode 100644 assets/js/d7899fea.8822e22a.js create mode 100644 assets/js/d79a4bb7.a815c560.js create mode 100644 assets/js/d7c69167.06afceb4.js create mode 100644 assets/js/d7d2f3e9.262520e6.js create mode 100644 assets/js/d83d9042.fc0ecb0d.js create mode 100644 assets/js/d857251e.5d7f7fca.js create mode 100644 assets/js/d863ede2.11363200.js create mode 100644 assets/js/d8668f0c.be2330b5.js create mode 100644 assets/js/d8c4fe87.808f0700.js create mode 100644 assets/js/d92df848.9daf110c.js create mode 100644 assets/js/d957ac34.2fafdb70.js create mode 100644 assets/js/d967308c.4b0b548a.js create mode 100644 assets/js/d96cfa54.2939f4b2.js create mode 100644 assets/js/d988d084.3a371a78.js create mode 100644 assets/js/d99d594e.0abb20d4.js create mode 100644 assets/js/d9b708eb.a7b8ca27.js create mode 100644 assets/js/d9ccb35d.cea6c556.js create mode 100644 assets/js/d9e42018.8af86b03.js create mode 100644 assets/js/da04b7b0.390ca13a.js create mode 100644 assets/js/da7937f0.7cc22aaa.js create mode 100644 assets/js/daa3e20a.f1391e79.js create mode 100644 assets/js/daace409.1ea8e0b2.js create mode 100644 assets/js/db138d7c.1b8b9080.js create mode 100644 assets/js/db50202c.71a9a110.js create mode 100644 assets/js/db5663d1.a1ed76f8.js create mode 100644 assets/js/dceb6e64.eb5e94a8.js create mode 100644 assets/js/ddcb8bff.0be505e0.js create mode 100644 assets/js/ddce0bff.2c93fa43.js create mode 100644 assets/js/de5b481b.565b362c.js create mode 100644 assets/js/de790939.74e01666.js create mode 100644 assets/js/decc8fa8.03de18e2.js create mode 100644 assets/js/dee5d2d9.044804a9.js create mode 100644 assets/js/df778edc.6398e671.js create mode 100644 assets/js/dfd49ee8.8d5945b5.js create mode 100644 assets/js/dff1c289.c8e36228.js create mode 100644 assets/js/dff84d74.7af6b65c.js create mode 100644 assets/js/e06746c7.a59320ce.js create mode 100644 assets/js/e0a90ddc.a29272eb.js create mode 100644 assets/js/e0b45b46.004f9296.js create mode 100644 assets/js/e135bd86.35a0a708.js create mode 100644 assets/js/e158fd47.041cd656.js create mode 100644 assets/js/e1f21c3f.7f2072d9.js create mode 100644 assets/js/e2011657.8d35be8c.js create mode 100644 assets/js/e25ae581.b6c5260b.js create mode 100644 assets/js/e2a7c340.17f426f9.js create mode 100644 assets/js/e2c8baed.fe76b678.js create mode 100644 assets/js/e3067ecd.64e66e32.js create mode 100644 assets/js/e356bfd0.a7639fa4.js create mode 100644 assets/js/e38c8545.52bffd2c.js create mode 100644 assets/js/e3c3ef1c.61c2b7ed.js create mode 100644 assets/js/e406e44d.c4e96dd4.js create mode 100644 assets/js/e44a2883.8da70635.js create mode 100644 assets/js/e4619b9c.0e5fd447.js create mode 100644 assets/js/e4a61baa.347ef4cf.js create mode 100644 assets/js/e54fb861.dc652803.js create mode 100644 assets/js/e56a9a29.d1d0f3d4.js create mode 100644 assets/js/e57d1f62.5be8a504.js create mode 100644 assets/js/e5a8e689.c5c3df95.js create mode 100644 assets/js/e5b737ed.3fd1fabf.js create mode 100644 assets/js/e5dd9161.eed06922.js create mode 100644 assets/js/e6402687.8934f415.js create mode 100644 assets/js/e695f231.2dfaf583.js create mode 100644 assets/js/e6ea9b03.a0904c0a.js create mode 100644 assets/js/e70f68c6.0a94e2cb.js create mode 100644 assets/js/e716e5b6.99afaa36.js create mode 100644 assets/js/e7486169.d066da59.js create mode 100644 assets/js/e7a72da0.d7b2d45e.js create mode 100644 assets/js/e80f56fd.6510f040.js create mode 100644 assets/js/e84709f6.bffbbe4e.js create mode 100644 assets/js/e86dcd26.125084b6.js create mode 100644 assets/js/e8d4d6c0.20140c19.js create mode 100644 assets/js/e8f5afda.eb7f2404.js create mode 100644 assets/js/e90b2ff0.7fbed957.js create mode 100644 assets/js/e9310706.e46f5ee8.js create mode 100644 assets/js/ea2603ff.ae5b22eb.js create mode 100644 assets/js/ea5726b6.2672f5db.js create mode 100644 assets/js/ea7f8016.7c07b525.js create mode 100644 assets/js/ea84a009.36271ad3.js create mode 100644 assets/js/eab6de32.8354251c.js create mode 100644 assets/js/eac6bb0a.1aa24d10.js create mode 100644 assets/js/eac9cf07.e77df8c6.js create mode 100644 assets/js/eb0e2fb1.07255769.js create mode 100644 assets/js/ebf8adea.dcda8491.js create mode 100644 assets/js/ec06fa8a.8d919f1b.js create mode 100644 assets/js/ec344652.83a054ec.js create mode 100644 assets/js/ec53298b.c7e575ce.js create mode 100644 assets/js/ed730a1d.19e36255.js create mode 100644 assets/js/ed930750.a3d3ae4d.js create mode 100644 assets/js/ed99d55f.e3582b94.js create mode 100644 assets/js/eda7cf83.e9a49dd3.js create mode 100644 assets/js/edca0251.665a94cd.js create mode 100644 assets/js/ee0b7a59.f2d5e972.js create mode 100644 assets/js/ee94a44f.72450e08.js create mode 100644 assets/js/ef2b1d07.41206daf.js create mode 100644 assets/js/ef2b6a3f.276cebb0.js create mode 100644 assets/js/ef4801f7.5d3fc9af.js create mode 100644 assets/js/ef4f60e7.f66551bc.js create mode 100644 assets/js/efad53df.45dcc7a1.js create mode 100644 assets/js/eff08811.39187769.js create mode 100644 assets/js/f0418a99.2c34ef4d.js create mode 100644 assets/js/f117ec90.7fad2391.js create mode 100644 assets/js/f13a89c7.c87b817b.js create mode 100644 assets/js/f1bfc30d.4bc1270e.js create mode 100644 assets/js/f1df5007.afbfc914.js create mode 100644 assets/js/f210b4b5.8690c2eb.js create mode 100644 assets/js/f2180c0a.2c802d5e.js create mode 100644 assets/js/f2423430.bec1d3ae.js create mode 100644 assets/js/f2b32cff.39abae3b.js create mode 100644 assets/js/f2deb2f1.b1733abd.js create mode 100644 assets/js/f302e248.841b73d3.js create mode 100644 assets/js/f3c06362.96ecb4f3.js create mode 100644 assets/js/f452efc5.b66888d2.js create mode 100644 assets/js/f4548430.7eb98ed2.js create mode 100644 assets/js/f47d214c.7885e24c.js create mode 100644 assets/js/f48535bf.29fcdfb3.js create mode 100644 assets/js/f4cb7e87.0c2f8fe1.js create mode 100644 assets/js/f51bb76d.7f54a00b.js create mode 100644 assets/js/f522921c.3a805440.js create mode 100644 assets/js/f530b85c.90d61588.js create mode 100644 assets/js/f55d3e7a.f786acd2.js create mode 100644 assets/js/f59c978c.51f789b1.js create mode 100644 assets/js/f5a24224.d169d439.js create mode 100644 assets/js/f5b1250e.5a405e64.js create mode 100644 assets/js/f5d27437.a48dcb5c.js create mode 100644 assets/js/f5e5d1cf.409624be.js create mode 100644 assets/js/f5f103cc.b1cf07d2.js create mode 100644 assets/js/f63b6b72.003220d2.js create mode 100644 assets/js/f6a3ab66.dd8c87cc.js create mode 100644 assets/js/f6aa5556.97793938.js create mode 100644 assets/js/f6b8faad.decb8bc1.js create mode 100644 assets/js/f6ec1152.c2043e3a.js create mode 100644 assets/js/f7e5e70a.061609b3.js create mode 100644 assets/js/f850a5f3.536e35f2.js create mode 100644 assets/js/f8681695.f50d9273.js create mode 100644 assets/js/f872275a.dbdfeb4f.js create mode 100644 assets/js/f89a4337.d99ad3e6.js create mode 100644 assets/js/f96c80d6.4ce4cb71.js create mode 100644 assets/js/f96c80dc.85f32d0b.js create mode 100644 assets/js/fa00d705.cb0aaed6.js create mode 100644 assets/js/fa0b1b5d.f62143b4.js create mode 100644 assets/js/fa57bfdd.f14710cf.js create mode 100644 assets/js/fa5dce7e.e833700b.js create mode 100644 assets/js/faece773.2d8cf6c5.js create mode 100644 assets/js/fb0b9e22.7e06c8d0.js create mode 100644 assets/js/fb63aa20.850437a9.js create mode 100644 assets/js/fb793160.b4e7853d.js create mode 100644 assets/js/fb8d4667.f082283b.js create mode 100644 assets/js/fba052bd.92a16ec4.js create mode 100644 assets/js/fbdc54bf.80a293fa.js create mode 100644 assets/js/fc0eac3b.320a4227.js create mode 100644 assets/js/fc8c3309.746176a0.js create mode 100644 assets/js/fce7e268.e65bf999.js create mode 100644 assets/js/fd6fd4a3.1f94006f.js create mode 100644 assets/js/fdba8f98.8aadb32b.js create mode 100644 assets/js/fdfeff52.d2d4df98.js create mode 100644 assets/js/fe184e91.4c2cc153.js create mode 100644 assets/js/fee99998.1c695705.js create mode 100644 assets/js/ff276f6a.72f5da9b.js create mode 100644 assets/js/ff8cfcf7.83f44d88.js create mode 100644 assets/js/ffbc2281.bed0db17.js create mode 100644 assets/js/main.bc51b93f.js create mode 100644 assets/js/main.bc51b93f.js.LICENSE.txt create mode 100644 assets/js/runtime~main.0180faa2.js create mode 100644 atom.xml create mode 100644 docs/category/tutorial---basics/index.html create mode 100644 docs/category/tutorial---extras/index.html create mode 100644 docs/intro/index.html create mode 100644 docs/tutorial-basics/congratulations/index.html create mode 100644 docs/tutorial-basics/create-a-blog-post/index.html create mode 100644 docs/tutorial-basics/create-a-document/index.html create mode 100644 docs/tutorial-basics/create-a-page/index.html create mode 100644 docs/tutorial-basics/deploy-your-site/index.html create mode 100644 docs/tutorial-basics/markdown-features/index.html create mode 100644 docs/tutorial-extras/manage-docs-versions/index.html create mode 100644 docs/tutorial-extras/translate-your-site/index.html create mode 100644 feed.json create mode 100644 images/consensus/2022-11-02-csj-vs-baseline-sliced.svg create mode 100644 images/consensus/2022-11-02-csj-vs-baseline.svg create mode 100644 images/consensus/2022-11-16-comparing-TICKF-batch.png create mode 100644 images/consensus/2022-11-16-removed-stuttering.png create mode 100644 images/consensus/2022-12-14-ledger-ops-benchmark.png create mode 100644 images/consensus/2023-01-11-utxo-hd-replay-benchmarks.png create mode 100644 images/consensus/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks.png create mode 100644 images/consensus/2023-Q2-beacon-graph.png create mode 100644 images/consensus/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks.png create mode 100644 images/happy-path-csj-prototype-bench-1.svg create mode 100644 images/happy-path-csj-prototype-bench-2.svg create mode 100644 images/happy-path-csj-prototype-prelim.svg create mode 100644 images/haskell-logo.png create mode 100644 images/network/2022-11-11-noticed-headers.png create mode 100644 images/network/2023-07-06-p2p-progress.png create mode 100644 images/network/2023-08-31-p2p-relays.png create mode 100644 images/network/2023-08-31-relay-versions.png create mode 100644 images/network/2023-09-14-p2p-relays.png create mode 100644 images/network/2023-09-14-relay-versions.png create mode 100644 images/network/2023-10-04-p2p-relays.png create mode 100644 images/network/2023-10-04-relay-versions.png create mode 100644 images/p2p-relay-5.mp4 create mode 100644 img/doc-adoption.png create mode 100644 img/docusaurus.png create mode 100644 img/favicon.ico create mode 100644 img/logo.png create mode 100644 img/logo.svg create mode 100644 index.html create mode 100644 markdown-page/index.html create mode 100644 p2p-relay3.mp4 create mode 100644 page/10/index.html create mode 100644 page/11/index.html create mode 100644 page/12/index.html create mode 100644 page/13/index.html create mode 100644 page/14/index.html create mode 100644 page/15/index.html create mode 100644 page/16/index.html create mode 100644 page/17/index.html create mode 100644 page/18/index.html create mode 100644 page/19/index.html create mode 100644 page/2/index.html create mode 100644 page/20/index.html create mode 100644 page/21/index.html create mode 100644 page/22/index.html create mode 100644 page/23/index.html create mode 100644 page/24/index.html create mode 100644 page/25/index.html create mode 100644 page/26/index.html create mode 100644 page/27/index.html create mode 100644 page/28/index.html create mode 100644 page/29/index.html create mode 100644 page/3/index.html create mode 100644 page/30/index.html create mode 100644 page/31/index.html create mode 100644 page/32/index.html create mode 100644 page/33/index.html create mode 100644 page/34/index.html create mode 100644 page/35/index.html create mode 100644 page/36/index.html create mode 100644 page/37/index.html create mode 100644 page/38/index.html create mode 100644 page/39/index.html create mode 100644 page/4/index.html create mode 100644 page/40/index.html create mode 100644 page/41/index.html create mode 100644 page/42/index.html create mode 100644 page/43/index.html create mode 100644 page/44/index.html create mode 100644 page/45/index.html create mode 100644 page/46/index.html create mode 100644 page/47/index.html create mode 100644 page/48/index.html create mode 100644 page/49/index.html create mode 100644 page/5/index.html create mode 100644 page/50/index.html create mode 100644 page/51/index.html create mode 100644 page/52/index.html create mode 100644 page/53/index.html create mode 100644 page/54/index.html create mode 100644 page/55/index.html create mode 100644 page/56/index.html create mode 100644 page/57/index.html create mode 100644 page/58/index.html create mode 100644 page/59/index.html create mode 100644 page/6/index.html create mode 100644 page/60/index.html create mode 100644 page/61/index.html create mode 100644 page/7/index.html create mode 100644 page/8/index.html create mode 100644 page/9/index.html create mode 100644 pdf/network/2022-11-24-UCL.pdf create mode 100644 quarterly/2022-10-07-node-cli-api/index.html create mode 100644 quarterly/2022-11-07-ledger/index.html create mode 100644 quarterly/2022-11-09-network/index.html create mode 100644 quarterly/2022-11-15-consensus/index.html create mode 100644 quarterly/2023-01-13-network/index.html create mode 100644 quarterly/2023-01-13-open-source/index.html create mode 100644 quarterly/2023-01-18-consensus/index.html create mode 100644 quarterly/2023-04-03-ledger/index.html create mode 100644 quarterly/2023-04-04-network/index.html create mode 100644 quarterly/2023-04-25-consensus/index.html create mode 100644 quarterly/2023-Q2-consensus/index.html create mode 100644 quarterly/2023-Q2-network/index.html create mode 100644 quarterly/2023-Q2-sre/index.html create mode 100644 quarterly/2023-Q3-performance-and-tracing/index.html create mode 100644 quarterly/2023-Q3-sre/index.html create mode 100644 quarterly/archive/index.html create mode 100644 quarterly/atom.xml create mode 100644 quarterly/index.html create mode 100644 quarterly/page/2/index.html create mode 100644 quarterly/rss.xml create mode 100644 quarterly/tags/cli-api-quarterly/index.html create mode 100644 quarterly/tags/consensus/index.html create mode 100644 quarterly/tags/index.html create mode 100644 quarterly/tags/ledger/index.html create mode 100644 quarterly/tags/network/index.html create mode 100644 quarterly/tags/open-source/index.html create mode 100644 quarterly/tags/performance-tracing/index.html create mode 100644 quarterly/tags/sre/index.html create mode 100644 rss.xml create mode 100644 sitemap.xml create mode 100644 tags/cip-1694/index.html create mode 100644 tags/cli-api/index.html create mode 100644 tags/cli-api/page/2/index.html create mode 100644 tags/cli-api/page/3/index.html create mode 100644 tags/cli-api/page/4/index.html create mode 100644 tags/cli-api/page/5/index.html create mode 100644 tags/cli-api/page/6/index.html create mode 100644 tags/consensus/index.html create mode 100644 tags/consensus/page/2/index.html create mode 100644 tags/consensus/page/3/index.html create mode 100644 tags/consensus/page/4/index.html create mode 100644 tags/consensus/page/5/index.html create mode 100644 tags/consensus/page/6/index.html create mode 100644 tags/consensus/page/7/index.html create mode 100644 tags/crypto/index.html create mode 100644 tags/crypto/page/2/index.html create mode 100644 tags/crypto/page/3/index.html create mode 100644 tags/crypto/page/4/index.html create mode 100644 tags/db-sync/index.html create mode 100644 tags/db-sync/page/2/index.html create mode 100644 tags/db-sync/page/3/index.html create mode 100644 tags/devx/index.html create mode 100644 tags/embedding-quality/index.html create mode 100644 tags/goedel/index.html create mode 100644 tags/goedel/page/2/index.html create mode 100644 tags/goedel/page/3/index.html create mode 100644 tags/goedel/page/4/index.html create mode 100644 tags/hydra/index.html create mode 100644 tags/hydra/page/10/index.html create mode 100644 tags/hydra/page/11/index.html create mode 100644 tags/hydra/page/2/index.html create mode 100644 tags/hydra/page/3/index.html create mode 100644 tags/hydra/page/4/index.html create mode 100644 tags/hydra/page/5/index.html create mode 100644 tags/hydra/page/6/index.html create mode 100644 tags/hydra/page/7/index.html create mode 100644 tags/hydra/page/8/index.html create mode 100644 tags/hydra/page/9/index.html create mode 100644 tags/index.html create mode 100644 tags/ledger/index.html create mode 100644 tags/ledger/page/2/index.html create mode 100644 tags/ledger/page/3/index.html create mode 100644 tags/ledger/page/4/index.html create mode 100644 tags/ledger/page/5/index.html create mode 100644 tags/ledger/page/6/index.html create mode 100644 tags/mithril/index.html create mode 100644 tags/mithril/page/2/index.html create mode 100644 tags/mithril/page/3/index.html create mode 100644 tags/mithril/page/4/index.html create mode 100644 tags/mithril/page/5/index.html create mode 100644 tags/mithril/page/6/index.html create mode 100644 tags/mithril/page/7/index.html create mode 100644 tags/network/index.html create mode 100644 tags/network/page/2/index.html create mode 100644 tags/network/page/3/index.html create mode 100644 tags/network/page/4/index.html create mode 100644 tags/network/page/5/index.html create mode 100644 tags/open-source/index.html create mode 100644 tags/performance-tracing/index.html create mode 100644 tags/performance-tracing/page/2/index.html create mode 100644 tags/performance-tracing/page/3/index.html create mode 100644 tags/performance-tracing/page/4/index.html create mode 100644 tags/performance-tracing/page/5/index.html create mode 100644 tags/release/index.html create mode 100644 tags/security/index.html create mode 100644 tags/sre/index.html create mode 100644 tags/sre/page/2/index.html create mode 100644 tags/sre/page/3/index.html create mode 100644 tags/system-test/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/2022-08-12-network/index.html b/2022-08-12-network/index.html new file mode 100644 index 00000000000..c9d81f7e5ac --- /dev/null +++ b/2022-08-12-network/index.html @@ -0,0 +1,37 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· One min read
Marcin Szamotulski

The networking team took an active part in the project iteration (PI) planning +session, see cardano-node backlog for detailed +outcomes.

  • We started working on a detailed design / implementation plan for gossip.

  • We merged input-output-hk/ouroboros-network#3859 which +sets the ouroboros-network repository for the single relay release.

  • We identified a bug in the network simulator, which is fixed in the +input-output-hk/ouroboros-network#3852. +The above PR was reviewed.

  • We set the tracing configuration for nodes which we deploy and fixed and +identified some deployment hiccups. We identified some bugs in the RT view +which were registered by the maintainers. +input-output-hk/ouroboros-network-ops#4

  • We fixed typos in network-mux library: +input-output-hk/ouroboros-network#3921

  • For easy of debugging we renamed a trace point: +input-output-hk/ouroboros-network#3922

  • Duncan iterated on his simulation / visualisation. He also was able to +identify and fix a bug in the simulator. The simulation contains 50 nodes. +Dashed lines indicate and established connection, while solid lines indicate +a TCP connection with fully open TCP window.

+ + + + \ No newline at end of file diff --git a/2022-08-12-sre/index.html b/2022-08-12-sre/index.html new file mode 100644 index 00000000000..f2c8902a05a --- /dev/null +++ b/2022-08-12-sre/index.html @@ -0,0 +1,46 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 4 min read
Michael Fellinger

High level summary

The SRE team is heavily working on the Equinix Metal migration, replacing Hydra +with Cicero, and a new version of Spongix.

Lower level summary

OpenZiti

  • Work is ongoing on our OpenZiti integration into Bitte in [bitte-zt].
  • CI-World deployment of Darwin CI Ziti service in [ci-world-commit-d40f4d].
  • Multiple issues filed, and a lot of discussion with the OpenZiti developers, +we're making pretty rapid progress thanks to them.
  • Work on getting Equinix baremetal machines integrated into AWS World Bitte +clusters utilizing a Ziti ZTNA network overlay to bridge the networking of +the two environments and get IAM extension to Equinix machine for Nomad +client onboarding.
  • A Nix Flake for most of our OpenZiti dependencies including the Console, +Controller, Edge Tunnel, and Router is now at [openziti-bins].
  • The Flake also includes a WiP NixOS modules for these components.
  • Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with +no issues seen so far
  • Moved the console to traefik routing service (zac.$DOMAIN) and +controller/edge router stay at zt.$DOMAIN, but have registered consul +services

Cicero & Tullia Integrations

Cicero & Tullia Features

  • Improvements to Tullia task aggregation to make [cardano-addresses] build +correctly.
  • Better tullia CUE lib default for tags [tullia-commit-4df3c5d].
  • Put cache.nixos.org back in cache.iog.io's upstreams. This is now +considered a public cache again, and without it some Cicero evaluations had +to build huge packages.
  • Started working on a flake-parts module for Tullia.
  • Started working on cutting down Tullia task build time by putting facts in +JSON files.
  • Fixed running into kernel arg limit by reading tullia's DAG from a file
  • Merged [tullia-pull-9] that fixes several issues related to error reporting. +and escaping.
  • Added Mac builders in Cicero on CI-World.
  • Started work on Tullia invocation caching.

Spongix

  • A lot of progress on an SQlite backed version of Spongix, it already supports +the full HTTP binary cache protocol but still lacks comprehensive testing and +some tuning, as well as recursive lookups.
  • First steps in the implementation of the nix-daemon ssh-ng protocol so +Spongix can be used via SSH and we can get rid of basic auth.

Bugs

  • Discovered Cicero bug where Nomad reschedules cause the Github commit status +to get stuck in pending
  • Discovered Cicero race condition bug around concurrent transactions for +codependent actions.
  • Fixed tullia task order bug in [cardano-addresses]
  • Diagnose Cicero action not triggered in [abcirdc]
  • Fixed meta/description of the Tullia package in [tullia-pull-7]
  • Add Vault token loop alerts in [bitte-cells-pull-40]
  • Ongoing investigation on recurring Patroni and nomad-follower issues related +to token rotation.
+ + + + \ No newline at end of file diff --git a/2022-08-31-consensus/index.html b/2022-08-31-consensus/index.html new file mode 100644 index 00000000000..c1e683ff628 --- /dev/null +++ b/2022-08-31-consensus/index.html @@ -0,0 +1,109 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 9 min read
Damian Nadales

Executive summary

  • We did most of the heavy lifting required to integrate the Conway era.
  • We have property tests for the UTxO HD backing store API implementations. A +possible bug was identified. Work is ongoing to make sure the property-tests +cover all the relevant cases.
  • We implemented and benchmarked the "anti-diff" prototype to speed up the UTxO +HD functionality. Results show a rough speedup of 4x to 5.5x across +several scenarios. Note that: "Data reported by tasty-bench is only of +indicative and comparative significance.". +We are investigating additional performance improvements. The "anti-diff" +prototype and benchmarks are still pending code review.
  • We elaborated a draft specification for the Genesis implementation and +ChainSync jumping optimization.

Workstreams

Conway

  • Integration PR of the minimal Conway era (Issue #3963, PR +#3971).
  • Discussions with Ledger revealed possible sources of confusion about which +data should be changed in the Conway era. As a result, a new technical debt +issue was raised, which does not block the integration of the Conway era +(Issue #3976).

UTxO HD

  • Issue #3954, branch: The functionality of a +backing store, which is the interface to the on-disk part of ledger state in +UTxO-HD, is tested at a high level through the OnDisk tests. However, some +functionalities remain untested, e.g., reads of ranges of keys. As such, we +have implemented quickcheck-state-machine tests that exercise backing stores +directly. The tests are reusable for different backing store implementations +because the tests are implementation-agnostic: Any backing store that conforms +to the backing store interface can be plugged into the tests. Work is still +ongoing to label/monitor the tests, such that we can verify that interesting +cases are being tested. Furthermore, a possible bug has been identified in the +LMDB backing store with respect to range reads, though the bug has not been +resolved yet.

  • Issue #3946, branch, PR #3882: The +"anti-diff" prototype proposes an alternative approach to keeping track of +sequences (more specifically, FingerTrees) of diffs. These diff sequences +are a component of the in-memory parts of the ledger state in UTxO-HD. Since +the consensus code often requires the cumulative diff of a sequence of diffs, +the current implementation "caches" cumulative diffs of each subtree in the +diff sequence. This caching allows relatively fast reconstruction of the total +cumulative diff, but this caching proved to incur a non-negligible cost: when +we manipulate diff sequences through splits and appends, we force re-computing +a logarithmic number of caches. This is problematic, since we often split and +append in consensus: we split when we flush diffs to a backing store or when +we roll back blocks, and we append when pushing blocks. The new approach +should reduce the overhead of this caching.

    We implemented micro-benchmarks for the "anti-diff" prototype: we +first generate a sequence of commands (Forward, Push, Flush, or +Rollback) through a simulation, after which we measure the performance of +applying the commands to a diff sequence. In this context, Forward means +forwarding of values through a diff, whereas Rollback means switching to +a different fork by rolling back diffs/blocks and pushing new ones. +Moreover, we compare the performance for the two implementations: the +"legacy" approach, and the anti-diff approach.

    Some preliminary results were positive, but we needed to revisit the +benchmark's configuration to obtain more definitive results. After a +discussion with @dcoutts and the consensus team about this configuration +(e.g., number of commands generated, choice of the security parameter k), +the benchmarks should now be closer to the realistic setting. The following +configuration specifies the default configuration that is used in the +benchmarking code:

    • Number of commands generated: 10_000
    • Security parameter k: 2160
    • Number of initial backing values: 100
    • Number of key-value pairs deleted by a push: 50
    • Number of key-value pairs inserted by a push: 50
    • Number of key-value pairs forwarded by a forward: 50
    • Probability of a large (in the range [1000, 2000]) rollback: 0.05
    • Probability of a small (in the range [1, 10]) rollback: 0.95
    • Order of commands:
      • An equal number of forward and pushes.
      • 1 flush every 10 pushes.
      • 1 rollback every 100 pushes

    Moreover, we run four benchmark scenarios:

    • Default configuration
    • Without rollbacks
    • With only small rollbacks
    • Without rollbacks, larger flushes (1 flush every 100 pushes)

    How to read results

    Note: this section uses documentation from the +tasty-bench package to +explain how to read the results of running our benchmarks.

    Running a benchmark scenario gives us the following (curated) output:

    ...
    AntiDiff: OK (18.27s)
    2.527 s ± 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x
    LegacyDiff: OK (32.73s)
    10.829 s ± 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory
    ...

    The output says that the first benchmark, which exercises the anti-diff +prototype, was repeatedly executed for 18.27 seconds (wall-clock time), +its predicted mean CPU time was 2.527 seconds and means of individual +samples do not often diverge from it further than ± 47 milliseconds +(double standard deviation). We also configure the RTS to collect GC +statistics, which enables tasty-bench to estimate and report memory usage. +This data is reported as per RTSStats fields: allocated_bytes, +copied_bytes and max_mem_in_use_bytes. So, the output of the first +benchmark says that a total of 2.1 GB of memory was allocated, that a +total of 544 MB of memory were copied, and that the peak memory in usage +was 2.2 GB. We read the output for the second benchmark in the same way.

    Furthermore, the benchmark compares the mean CPU times for +both the anti-diff and legacy approaches: In this case, the mean CPU time +for the anti-diff approach is ~0.23x the mean CPU time for the legacy +approach. Conversely, the mean CPU time for the legacy approach is +1 / 0.23 ~= 4.35x the mean CPU time for the anti-diff approach. We will +call 0.23x the improvement factor. We will call 4.35x the speedup.

    Note that these improvement factors (and reported results) are subject to +noise, randomness, the specific configuration parameters, and the whims +of statistics. Data reported by tasty-bench is only of indicative and +comparative significance.

    Results

    For each of the 4 scenarios, we list the results of running the anti-diff and +legacy approaches 5 times. We run the benchmarks 5 times to get an indication +of whether the results are similar across multiple runs. Furthermore, we +calculate the accompanying ranges (if applicable) of improvement factors and +speedups.

    Note also the decrease in total bytes allocated and total bytes copied for +the anti-diff approach compared to the legacy approach.

    Default configuration

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff2.533 s (0.23x)4.7 ms2.1 GB557 MB2.4 GB
    Run 1: LegacyDiff10.792 s162 ms6.8 GB2.3 GB2.4 GB
    Run 2: AntiDiff2.508 s (0.23x)245 ms2.1 GB515 MB2.2 GB
    Run 2: LegacyDiff10.850 s30 ms6.9 GB2.3 GB2.2 GB
    Run 3: AntiDiff2.562 s (0.23x)5.0 ms2.1 GB552 MB2.2 GB
    Run 3: LegacyDiff10.993 s149 ms6.9 GB2.3 GB2.2 GB
    Run 4: AntiDiff2.168 s (0.22x)5.3 ms1.8 GB434 MB2.0 GB
    Run 4: LegacyDiff9.976 s39 ms6.3 GB2.0 GB2.0 GB
    Run 5: AntiDiff2.527 s (0.23x)47 ms2.1 GB544 MB2.2 GB
    Run 5: LegacyDiff10.829 s148 ms6.8 GB2.3 GB2.2 GB
    • Improvement factor: [0.22, 0.23]
    • Speedup : [1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]

    No rollbacks

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff1.638 s (0.19x)36 ms1.4 GB181 MB2.4 GB
    Run 1: LegacyDiff8.656 s207 ms5.7 GB1.5 GB2.4 GB
    Run 2: AntiDiff1.638 s (0.19x)75 ms1.4 GB181 MB2.2 GB
    Run 2: LegacyDiff8.654 s322 ms5.7 GB1.5 GB2.2 GB
    Run 3: AntiDiff1.663 s (0.19x)74 ms1.4 GB181 MB2.2 GB
    Run 3: LegacyDiff8.799 s216 ms5.7 GB1.5 GB2.2 GB
    Run 4: AntiDiff1.645 s (0.19x)51 ms1.4 GB181 MB2.0 GB
    Run 4: LegacyDiff8.732 s261 ms5.7 GB1.5 GB2.0 GB
    Run 5: AntiDiff1.639 s (0.19x)19 ms1.4 GB181 MB2.2 GB
    Run 5: LegacyDiff8.653 s234 ms5.7 GB1.5 GB2.2 GB
    • Improvement factor: 0.19
    • Speedup : 1 / 0.19 ~= 5.25

Only small rollbacks

NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
Run 1: AntiDiff1.833 s (0.18x)36 ms1.5 GB185 MB2.4 GB
Run 1: LegacyDiff10.362 s867 ms5.8 GB1.6 GB2.4 GB
Run 2: AntiDiff1.696 s (0.19x)30 ms1.5 GB185 MB2.2 GB
Run 2: LegacyDiff8.822 s106 ms5.8 GB1.5 GB2.2 GB
Run 3: AntiDiff1.702 s (0.19x)44 ms1.5 GB186 MB2.2 GB
Run 3: LegacyDiff8.906 s147 ms5.8 GB1.5 GB2.2 GB
Run 4: AntiDiff1.701 s (0.19x)47 ms1.5 GB185 MB2.0 GB
Run 4: LegacyDiff8.949 s197 ms5.8 GB1.5 GB2.0 GB
Run 5: AntiDiff1.677 s (0.19x)55 ms1.5 GB186 MB2.2 GB
Run 5: LegacyDiff8.856 s177 ms5.8 GB1.5 GB2.2 GB
  • Improvement factor: [0.18, 0.19]

  • Speedup : [1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]

    No rollbacks, larger flushes (every 100 pushes)

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff1.643 s (0.25x)21 ms1.5 GB196 MB2.4 GB
    Run 1: LegacyDiff6.591 s351 ms4.0 GB1.4 GB2.4 GB
    Run 2: AntiDiff1.616 s (0.25x)47 ms1.5 GB196 MB2.2 GB
    Run 2: LegacyDiff6.520 s232 ms4.0 GB1.4 GB2.2 GB
    Run 3: AntiDiff1.640 s (0.25x)34 ms1.5 GB196 MB2.2 GB
    Run 3: LegacyDiff6.540 s150 ms4.0 GB1.4 GB2.2 GB
    Run 4: AntiDiff1.635 s (0.25x)76 ms1.5 GB196 MB2.0 GB
    Run 4: LegacyDiff6.589 s131 ms4.0 GB1.4 GB2.0 GB
    Run 5: AntiDiff1.628 s (0.25x)19 ms1.5 GB196 MB2.2 GB
    Run 5: LegacyDiff6.490 s5.9 ms4.0 GB1.4 GB2.2 GB
  • Improvement factor: 0.25

  • Speedup : 1 / 0.25 ~= 4

Genesis

  • We elaborated a draft of the specification of the Genesis implementation and +the ChainSync Jumping optimization. In particular, this includes a proof +sketch that the latter preserves liveness and safety in all cases (Issue +3964).
    • @nfrisby's main realization during this sprint was that he had been +focusing so far on the case where the selected chain is an extension of +the intersection of our peers' ChainSync candidates.
    • This is the main case, ie an "absorbing" state, but it's not the only +case.
    • The new proof sketch begins by case splitting on that predicate, and +that made the sketch quite a bit easier to follow.
  • We continued working on the "happy path" ChainSync Jumping prototype (Issue +3960).

Technical debt

  • We started working on the issues required to re-enable nightly CI runs.. +Nightly CI runs have far more lax time constraints, which gives the option to +run significantly more property tests than in our regular CI. To this end, we +merged a PR to easily adapt the number of tests globally (PR +#3947).
+ + + + \ No newline at end of file diff --git a/2022-09-01-ledger/index.html b/2022-09-01-ledger/index.html new file mode 100644 index 00000000000..47ee2c65f56 --- /dev/null +++ b/2022-09-01-ledger/index.html @@ -0,0 +1,46 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

Ledger Update

Since finishing up support for the Vasil Hardfork, the ledger team has been +focused on two main things: a new ledger era and technical debt.

New minimal ledger era

We have implemented a new ledger era named conway which is nearly identical +to the babbage era. This has been the first time that we have been able to see +what a minimal ledger era looks like. We have finished this task, modulo any +integration issues that might come up. The only thing that the conway era +does differently from the babbage era is provide support for rotating +the master keys using the hardfork combinator's state translation. +We may end up adding features to the conway era, but it is a nice exercise +seeing what it looks like to get a minimal ledger era supported in all the +downstream components.

Addressing technical debt

We have been addressing technical debt, mostly in an effort to make the +repository a more friendly code base to work in.

  • We have begun work on a ledger API, called cardano-ledger-api.
  • We have done a big re-design of the major type classes used in the ledger. +With hindsight on our side, we now have something much more organized and +easier to use.
  • We have done a lot of re-naming. The names across eras are now much more +uniform, avoid certain confusions that plagued us, and are clearer in where +they are from.
  • We have reduced a lot of code duplication that could lead to bugs if you +do not have the whole code base in your head.
  • We have added a handful of performance improvements.
  • We added type safety in a number of locations. In particular, the type of +values that can be minted in a transaction no longer allow for Lovelace +in the type, and some functions which used to handle both timelock scripts +and plutus script now correctly enoforce at the type level that only one of +them can be used.
  • We made our generators so that they now produce a much richer set of +valid serializations. There is room within CBOR to serialize the same +data structure in multiple ways, and it is helpful to have the generators +use a wide variety.
  • We have begun re-organizing our test suites.
+ + + + \ No newline at end of file diff --git a/2022-09-16-ledger/index.html b/2022-09-16-ledger/index.html new file mode 100644 index 00000000000..4b2a82a886d --- /dev/null +++ b/2022-09-16-ledger/index.html @@ -0,0 +1,49 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

Ledger Update

We have been focused nearly entirely on addressing technical debt.

  • We introduced more consistent naming across eras, this time for the auxiliary data. +See 3032.
  • We made clear how the consumed functions differs between eras (which was a previous source of +confusion), and added some related support to the fledgling ledger API. +See 3016.
  • We added clarity and organizational consistency to the main ledger era type synonyms. +See 3017.
  • We removed code duplication related to the input data hashes. +See 3018.
  • We split up a large module into smaller components. The large module was actually causing our +CI to time out. +See 3020.
  • We cleaned up stale information in our cabal files, and upgraded cabal 3.8. +See 3023, +3031, +and 3028.
  • We made consistent, standalone TxOut (transaction output) modules for every era. +See 3024.
  • We brought consistency to a maddening inconsistent use of type variables indicating the specific +choice of cryptographic primitives. In particular, all uses of crypto have been renamed to c. +See 3027.
  • We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric +types that will compose better in the future and which simplifies the constraints. +See 3029.
  • We consolidated some existing fragmented logic regarding how we gather the scripts needed for a +given transaction. This is a much needed cleanup to prevent future mistakes. +See 3019.
  • We fixed a problem with our generators that was causing a fair number of our property tests to +fail in CI. +See 3039.
  • We have started the work to update Plutus. This will bring support for SECP in the next major +protocol version, and also address a +problem +that we current have evolving the cost models. +See 3030.
  • We addressed a small issue that came up when integrating the conway era downstream, namely +the lack of some serialization instances. +See 3022.
+ + + + \ No newline at end of file diff --git a/2022-09-19-db-sync/index.html b/2022-09-19-db-sync/index.html new file mode 100644 index 00000000000..46e50f7fd44 --- /dev/null +++ b/2022-09-19-db-sync/index.html @@ -0,0 +1,43 @@ + + + + + +DB Sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB Sync Team Update

· 2 min read
Kostas Dermentzis

DBSync Update

New Tag

We created a new db-sync tag 13.0.5 which addresses shortcomings of the last +release 13.0.4. It is currently under testing. +The Changelog is +here and in more details:

  • We fixed fees for tx with phase 2 failure that didn't include a total collateral field. +1248

  • We fixed an issue that could cause db-sync to crash if a specific rollback occured. +1247

  • DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but +could result in the wrong CBOR encoding being inserted. +1217

  • All the fixes above come with unit tests which validates the fix.

  • Added support for preprod and preview from docker. DBSync no longer needs to include the configs +for different networks, these are directly fetched from the cardano world. +1254

  • We added better support from docker for the new disable options and the overall documentation. +1260

All the above were also backported to the master branch

Open source

We made the db-sync board public, so +everyone can have access on the issues we prioritise. +We also added new tasks to the board, some of them could be approachable to newcomers or people who +want to contribute.

Progress on tech debt and new features

  • 1223 was merged, which removes the +foreign keys from the db schema. This opens the road to a number of optimizations.

  • An additional fix on top of the previous work was added +1250

  • An initial version where DBSync does not rollback on restart is done here +1266. +This allows db-sync to restart much faster, without the need to delete data and reinsert them. In +the future it can also facilitate migrations in cases where the ledger snapshots have a breaking +change, without the need to resync everything from genesis.

+ + + + \ No newline at end of file diff --git a/2022-09-20-consensus/index.html b/2022-09-20-consensus/index.html new file mode 100644 index 00000000000..847c456eaa9 --- /dev/null +++ b/2022-09-20-consensus/index.html @@ -0,0 +1,77 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 4 min read
Damian Nadales
  • We proposed a fix for the performance degradation observed when running +distributed multi-node benchmarks in the UTxO HD feature branch. While this +fixed the problems observed when running local benchmarks, it broke the +ThreadNet tests due to concurrency issues. Therefore, we think it is wise to +start redesigning the UTxO HD mempool integration.
  • We did several rounds of code review on the alternative implementation of +diff-sequences required by the UTxO HD feature based on the idea of +anti-diffs. This alternative implementation is close to being merged, and the +next step is to integrate this to the UTxO HD branch, so that we can run +ad-hoc replaying and syncing from scratch benchmarks and compare these with +the baseline. The micro-benchmarks we elaborated for the alternative +implementation show speedups of up to 4x, so we are optimistic about the +performance of replaying and syncing from scratch benchmarks, however it is +important to notice that due to the nature of UTxO HD we will still be +slower than the baseline.
  • The final draft of the Genesis implementation specification is ready for +review.
  • We implemented a prototype for the happy path of Genesis' ChainSync Jumping +(CSJ). The prototype is slower than the baseline, however it is not the latest +version of the prototype and the jump interval is very small.
  • Work on integrating Conway has stopped since +priorities have changed.
  • We started work on benchmarking epoch-boundaries and epoch overhead +pr-4014. To this end, we made use of a modified version of our +db-analyser tool. We ran the new benchmarking setup using the Cardano +mainnet chain, and we can see that block tick and application take +substantially longer at epoch boundaries, although there are a couple of slots +during an epoch in which these computations take more than normal. We notified +the ledger team about these findings. We will use this modified version of +db-analyser to investigate the epoch overhead.

Workstreams

UTxO HD

  • Spent quite some time investigating the root cause of the degradation in +performance observed in the benchmarks. We run the make forge-stress +benchmarks locally in order to debug this behavior.

    • Transaction batching doesn't make a notable difference in the outcome +(considering we are using the in-memory backend).

    • The mempool batching implementation required asynchronous transaction +validation which is a violation of the LocalTxSubmission protocol +contract and therefore if we continued on that route, the impact would +have been quite big.

    • The STM logic we implemented by using a TMVar for the mempool internal +state was buggy and under certain circumstances it seemed to lock. +Reverting the mempool internal state to be stored in a TVar seems to +solve this problem.

    • The results we get after this change look almost identical to the ones +from the baseline.

  • The anti-diff prototype (PR +#3997) has +been reviewed and is close to being merged.

    • A follow-up issue (issue +#4010) +to integrate the anti-diff prototype in the various consensus packages +was created. A first version of the integration exists, and all tests +pass. A next step is to get some indication of the "real" performance gain +by profiling db-analyser (or cardano-node).

Genesis

  • Final draft of the Genesis implementation specification, now up for review.

  • Local benchmark setup for parameter tuning via the happy path ChainSync +Jumping (CSJ) prototype (Issue 3987).

    • Context: Our Genesis design requires us to check in with a large (~20) +number of servers periodically while syncing. These servers are offered +jump requests via the ChainSync protocol (hence the name), which they can +accept or decline. If a peer declines, the Genesis rule allows us to +determine whether a node actually has a better chain.

    • The "happy path" is when no peer declines a jump. We want this to have +close to no overhead compared to status quo, i.e. syncing without Genesis.

    • We implemented a prototype for this happy path, and are now starting to +test in various configurations (number of peers, latency, bandwidth) to +tune the performance of ChainSync jumping, i.e. how complicated our logic +of choosing when to jump needs to be.

      Example:

    • Simulated connection: 50 MBit/s, 50ms latency

    • Jump interval: 3000 slots (on the low end, could be increased to up to +3k/f)

    • Red: baseline (1.35.3), one peer in topology file

    • Blue: Preliminary version of our prototype, with 10 peers.

      It is slower by about ~30%, but it is not the latest version of the +prototype, and the jump interval is very small, making CSJ more of a +bottleneck.

Technical debt

  • Fix flakiness in ChainDB QSM tests (PR 3990).
+ + + + \ No newline at end of file diff --git a/2022-09-27-network/index.html b/2022-09-27-network/index.html new file mode 100644 index 00000000000..d3350214472 --- /dev/null +++ b/2022-09-27-network/index.html @@ -0,0 +1,55 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 3 min read
Marcin Szamotulski

Network Update

Ouroboros Network

Ouroboros Consensus

  • Recently we found out that the consensus does not log exceptions thrown during +intiialisation. This was fixed in +PR input-output-hk/ouroboros-network#4015 +As part of this pull request we also changed that all exceptions rethrown by +the connection handler thread are wrapped in ExceptionInHandler.

Some older items, which were not announced

  • We identified and fixed an issue related to socket activation (socket options +where not set for sockets passed through socket activation). +PR input-output-hk/cardano-node#3979 +This fix will be released in the next cardano-node release.

Cardano Node

  • We extended the NixOs service module so that one can modify socketPath, +runtimeDir, databasePath, traceSocketPathAccept, +traceSocketPathConnect and stateDir options. +PR input-output-hk/cardano-node#4196

IO-Sim

We resolved a number of issues before release of io-sim on hackage:

See PR #24.

We also improved experience for contributors of io-sim and typed-protocols by adding issue templates:

Typed Protocols

Input Endorsers Simulation

New features include:

  • Histograms of block arrival frequency, for both network (inbound) and CPU +(block validation). This is interesting to check that we're not overloading +the CPU block validation capacity, or network link capacity. Or alternatively +to observe the behaviour in an overload situation if we set the block +generation rate high enough.

  • Pie chart of utilisation of TCP links. This shows how small a fraction of +links are being used at any one time, and shows that once the system "warms +up" and is operating stably, most block delivery is ballistic.

  • Showing off the new screen layout combinators, that let us put multiple +charts, titles etc on screen at once and scale them to whatever screen or +video resolution we like without having to tweak numbers (this example is +scaled to fit 1080HD video resolution).

+ + + + \ No newline at end of file diff --git a/2022-09-30-ledger/index.html b/2022-09-30-ledger/index.html new file mode 100644 index 00000000000..6c6e29d879d --- /dev/null +++ b/2022-09-30-ledger/index.html @@ -0,0 +1,50 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

Ledger Update

We have continued focusing nearly entirely on addressing technical debt. +A lot of design work has begun for the next ledger era, +but we do not yet have anything concrete to share.

Technical debt issues completed

  • [issue-1676][pull-2992] We have finally removed the ledger dependency on the +cardano-prelude package. It was barely used in the ledger repository, and it added a dependency +that we did not want to maintain. It was a bit difficult to remove, and we had +to coordinate removing it from cardano-base. +A lot ended up going into pull-2992, due to the coordination effort, and we ended +up updating Plutus as well. +This means that we've now also made a lot of progress on the problematic cost model serialization +issues described in issue-2902. +In particular, after we resolve issue-3014, we will not have to wait an epoch before +releasing a cost model for a new version of Plutus, as we had to do for the Vasil HF.
  • [issue-3046][pull-3055] We moved a module that is now only used in Byron to a Byron package.
  • [issue-3047][pull-3054] We improved the interface to the Value (multi-asset) type.
  • [pull-3044] We debugged and fixed a tricky compilation issue. Certain kinds of field updates +were adding approximately 20 minutes to our compile time!
  • [issue-2932][pull-3036] As a part of our ongoing re-organization of the codebase, we +have added a Cardano.Ledger.[Era].Core module to each ledger era that has a TxBody class. +Most classes defined in the era should go in this new module. +We also re-export the Cardno.Ledger.Core module and the previous Cardano.Ledger.[Era].Core +modules from each era.

Technical debt in progress

  • [issue-3034][issue-3035][node-issue-4421] We are continuing to write benchmarks to understand exactly where +all the time is being spent on executing the TICKF transition. +The consolidation of the per-stake-credential stake distribution to the per-stake-pool +distribution does seem to account for a large amount of time (near a second as written, which we +have down to about half a second with some optimizations), +but this does not account for everything. +Applying the reward update may also be a big contributing factor.
  • [pull-3033][pull-3038][pull-3041] A separate team is working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort.
  • The nix scripts used to build our new +formal ledger model +do not work consistently for everyone, and we have been working on fixing these issues.
  • [issue-3014] We are still working on adding a versioning scheme to all of the ledger +serializers.
+ + + + \ No newline at end of file diff --git a/2022-10-02-consensus/index.html b/2022-10-02-consensus/index.html new file mode 100644 index 00000000000..8b10b18870a --- /dev/null +++ b/2022-10-02-consensus/index.html @@ -0,0 +1,76 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 4 min read
Damian Nadales

High-level summary

During the past two weeks, the consensus team continued its work on testing the +UTxO HD prototype. We completed the era-transition and backing store tests, and +the mempool tests are advancing at a steady pace. Regarding our work in the +Genesis design, we continued our collaboration with the research and networking +teams, and we continue investigating strategies for making the chain-sync +jumping prototype faster.

High-level status report

  • Finish the UTxO HD prototype: on track.
    • We worked on state-machine tests for the mempool, and spotted potential bugs +in the implementation. Investigation is ongoing.
    • We have a set of property tests for the backing store. We still need to +incorporate the improvements to the LMDB cursor API that these tests +made possible.
    • We merged the era-transition tests PR.
  • Genesis: on track.
    • Design work around Genesis continues in collaboration with researchers and +the networking team.
    • We continued trying to improve the performance of the chain-sync jumping +prototype. We gained additional insight on which parameters to tweak next. +In spite of the baseline still being faster, the current prototype already +achieves a significant speedup when compared to the naive approach of simply +running full chain-sync with all peers.
  • Tech debt: on track.
    • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

Workstreams

Finish the UTxO HD prototype

We continued working on property-tests for the UTxO HD prototype. In particular +we merged the era-transition tests +PR.

Backing store property tests

The backing store property tests +PR has been +reviewed. The next steps are:

  • Improve error handling and command generation.
  • Add coverage testing to check that we are not failing to cover interesting +test cases.

The monadic cursor API +went through its first review round. The API is in a relatively stable state. +This PR also unifies the cborg and serialise-based interfaces to LMDB +operations. The next steps are:

  • Write +quickcheck-dynamic +state-machine tests for this API.
  • Adapt the changes in the serialisation interface in the backing store property +tests. This will involve adding boilerplate code in consensus to make up for +the removal of the cborg-based interface.

LSM tree implementation

We worked on the LSM tree +prototype. In +particular, we focused on tuning the LSM tree design to the different workloads +that consensus has (eg syncing, normal node operation, etc).

Benchmarking the CSJ prototype

Work on improving the chain-sync jumping performance is ongoing. In particular +we compared the performance of different jump intervals, which, somewhat +surprisingly, do not make a significant difference. In particular, we are seeing +periodic "plateaus" where the chain-sync tip does not progress, but they are +much longer for the prototype. Our hypothesis is that this seem to be due to a +combination of the garbage collector (GC) pauses, and the actual time it takes +the non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo +fragment.

In the coming weeks we will try to shorten these plateaus via a combination of +tweaking GC options and less synchronisation in the CSJ governor.

The following plot shows the performance of the chain-sync jumping prototype +using different jumping intervals. It compares the syncing progress by plotting +the slots of adopted blocks against time. The baseline is still faster, however +it is worth noting that the current prototype already achieves a significant +speedup when compared to the naive approach of simply running full chain-sync +with all peers.

The second plot shows the syncing progress sliced to a chosen ~5min interval, +and includes, in addition to the slots of adopted blocks, the slots of the tip +of the ChainSync fragment. This allows us to see how far ahead of the selected +tip the CS dynamo is, i.e. how much room we have for BlockFetch not to get +stalled. It shows periodic behaviour (due to the forecasting limit), and shows +that the CS fragment tip is not progressing for significant periods +("plateaus").

Technical debt

We clarified a +common source of confusion around VRF tie-breaking and cross-era chain +selection. This PR involved correcting potentially misleading names of +VRF-related functions, and providing context for a particular VRF value is +used for tie-breaking.

+ + + + \ No newline at end of file diff --git a/2022-10-04-db-sync/index.html b/2022-10-04-db-sync/index.html new file mode 100644 index 00000000000..befa8ebbc82 --- /dev/null +++ b/2022-10-04-db-sync/index.html @@ -0,0 +1,43 @@ + + + + + +DB Sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB Sync Team Update

· 2 min read
Kostas Dermentzis

DBSync Update

Fast restarts

We fixed a long overdue issue in db-sync which caused long delays on restarts +1266. This has been +one of db-sync main objectives for this period. Restarts are now very fast, +because db-sync deletes almost nothing from the db, it just replays the ledger rules until it +reaches the tip of the db. The fix also improves reconnection speed, in cases where the node +restarts or the connection is temporarily lost. It also speeds up even more in cases where due to a +deployment mess up a very old snapshot or no snapshot at all is used.

Property based testing

We added stateful property based testing, using quickcheck-state-machine +1269. These tests use empty or +almost empty blocks to test the new behaviour of restarts and rollbacks.

These tests generate arbitrarily a list of symbolic commands from these:

RollForward Int
RollBack BlockNo
StopDBSync
StartDBSync
RestartNode
AssertBlockNo BlockNo

The commands are translated into real commands. For example RollForward Int will forge a new block +that fits on the current chain. These real commands are executed against db-sync using the mock +chain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync +which looks like this:

  Model
{ serverTip :: BlockNo
, dbSyncTip :: BlockNo
, dbSynsIsOn :: Bool
, dbSynsHasSynced :: Bool
}

Finally a number of postconditions are checked, related to the eventual block number of db-sync.

Tech Debt

We handled a number of tech debt in +1275 +This improves the code format of db-sync, deletes many queries that were never used and groups the +others. This tech debt resolution not only improves the experience of working in db-sync, but can +facilitate some of our other objectives, as it makes it very explicit which queries are used +during syncing and which indexes are necessary.

Smash

We worked on fixing an issue related to fetching pool metadata +1276. +The issue which is described in +1270

+ + + + \ No newline at end of file diff --git a/2022-10-04-node-cli-api/index.html b/2022-10-04-node-cli-api/index.html new file mode 100644 index 00000000000..0f14ab83f12 --- /dev/null +++ b/2022-10-04-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· One min read
Jordan Millar

Node-Api-Cli Update

2022-10-04 - 2022-10-18

Executive Summary

The majority of the team's time was spent between getting 1.34.4 ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to cardano-cli.

Completed

cardano-cli

cardano-api

cardano-node

In Progress

cardano-cli

cardano-api

cardano-node

+ + + + \ No newline at end of file diff --git a/2022-10-05-consensus/index.html b/2022-10-05-consensus/index.html new file mode 100644 index 00000000000..68ca5739db3 --- /dev/null +++ b/2022-10-05-consensus/index.html @@ -0,0 +1,52 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

During the past two weeks, the consensus team worked on improving the +performance of the ChainSync jumping logic, which is needed for Genesis. We also +rewrote the implementation of the mempool in the UTxO HD prototype which solved +the issues that prevented us from running system level benchmarks. Also on the +UTxO HD front, we have an improved implementation of the sequence-of-differences +(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for +the UTxO HD feature.

Executive summary

  • With the latest implementation of ChainSync jumping we are closer to the +baseline performance. In particular, the prototype seems to benefit from the +extra concurrency provided by additional capabilities.
  • We rewrote the implementation of the mempool in the UTxO HD prototype. This +rewrite was required due to performance problems we observed when running the +workbench. +These performance problems prevented us from running system level benchmarks. +The rewrite solved these issues. After the UTxO-HD: mempool +rewrite PR is +merged, we will contact the Benchmarking team so that they run the system +level benchmarks.
  • The implementation of sequences of differences based on anti-diffs was +integrated into the UTxO HD prototype. It is pending +review and +we also need to run replay and syncing benchmarks to confirm that this will +deliver a performance improvement, as observed in our micro-benchmarks.
  • The UTxO HD prototype +inspection +resulted in a list of +tests +needed for consensus to consider the UTxO HD prototype as fully tested.

Additional information

Genesis

Benchmarking setup: 50MBit/s, 50ms latency

  • Red: baseline
  • Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.

As ChainSync Jumping involves many concurrent network operations at every jump, +we tried to run the node with 6 instead of the default 2 capabilties.

  • Orange: baseline with 6 capabilities
  • Blue: CSJ prototype with 6 capabilities

This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

Further work includes whether we can tune the prototype to better handle few +capabilities, or to adapt the default number of capabilities (potentially just +while syncing).

+ + + + \ No newline at end of file diff --git a/2022-10-14-hydra/index.html b/2022-10-14-hydra/index.html new file mode 100644 index 00000000000..eba9f3c0a15 --- /dev/null +++ b/2022-10-14-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High level summary

This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the hydra-node over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks "past the opening of a Head". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.

What did the team achieve this week

  • Last week we thought we were done with ADR18, but were not ...
  • ... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence.
  • Implemented a first version for persistence #187 in response.
  • Enhanced CI to publish test results on our website
  • Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!
  • Pulled static executable feature #200 into scope, implemented it and merged it!
  • Received and read through a project proposal by a vendor (building a Hydra platform).

What are the goals of next week

  • Get backup/recovery #187 done with proper event sourcing (ADR18)
  • Cut the next release, version 0.8.0
  • Address open comments on specification document & complete the list of identified gaps between specification and implementation #452
  • Have the CI build macos artifacts
+ + + + \ No newline at end of file diff --git a/2022-10-14-ledger/index.html b/2022-10-14-ledger/index.html new file mode 100644 index 00000000000..5fcad40970d --- /dev/null +++ b/2022-10-14-ledger/index.html @@ -0,0 +1,53 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

High level summary

The ledger team is still primarily focused on addressing +technical +debt. +We now have the infrastructure for versioning our serialization schemes, +which we continue to put into action. +We have made first steps towards getting proper support for the +formal ledger repository +(in particular, we've added nix builds and +continuous integration support). +We are wrapping up an investigation of the performance of a critical +function used by the consensus layer for leader checks. +Finally, we are improving the packaging and versioning of our code.

Lower level summary

Completed Technical Debt

  • Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of +our code lives in the cardano-ledger-shelley package, though with hindsight we can say that +much of it should live in cardano-ledger-core. +We continue to move things to cardano-ledger-core, and have much more to come. [pull-3059]
  • We now have the infrastructure to support versioned serialization schemes. +The inability to do this has caused us a lot difficulties, +such as [issue-3003], [issue-2965] and [issue-2444]. +We are still in the process of switching to the versioned serialization scheme +(such as [pull-3078]), +but the infrastructure was completed in [pull-3063].
  • We now have proper nix and CI support for the formal ledger project. [pull-19]
  • A separate team is helping bring support for +CHaP +to all the cardano-node repositories. +We have been helping out with this effort.
  • A separate team continues working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. +We have been helping out with this effort.

In-progress Technical Debt

We also have several fairly large pull-requests in review +that we are working on.

  • In an on-going attempt to build out a more user-friendly API, +we continue to remove HasField instances in place of using micro-lenses. +The protocol parameters, in particular, are being worked on. [pull-3045]
  • We are also renaming record fields to be consistent across the repository. [pull-3062]
  • We are now cleaning up all the work we did to understand the performance +of the TICKF transition. We have some improvements to the computatation +as well. [pull-3068]
  • We are adding more documentation, in particular to our Twiddler functionality. [pull-3073]
  • The formal ledger is adding support for finite set theory. [pull-20]
+ + + + \ No newline at end of file diff --git a/2022-10-18-consensus/index.html b/2022-10-18-consensus/index.html new file mode 100644 index 00000000000..13f60b18480 --- /dev/null +++ b/2022-10-18-consensus/index.html @@ -0,0 +1,64 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 4 min read
Damian Nadales

High-level summary

During the past two weeks, the consensus team worked on adding property test for +different aspects of the UTxO HD prototype: era transitions, mempool, and +backing store. Thanks to these tests we were able to uncover a bug in the +prototype. On the Genesis front, we benchmarked a different version of the +ChainSync jumping prototype to try to improve its performance, but this did not +result in any noticeable speedup.

High-level status report

  • Finish the UTxO HD prototype: on track.
    • We focused on increasing test coverage for the UTxO-HD prototype:
      • We started implementing Cadano-eras transition property-tests.
      • We started implementing state-machine property-tests for the mempool.
      • We merged the mempool rewrite.
      • We started working on state-machine tests for the backing store. This +uncovered a bug in the range-read implementation of the LMDB backing +store.
  • Genesis: on track.
    • We benchmarked a version of the Genesis ChainSync Jumping prototype that +spreads out the ChainSync updates over a longer period of time. This did not +result in any noticeable speedup.
    • We investigated the overhead introduced by non-ChainSync components, but no +conclusions could be drawn from the benchmarks we ran.

Workstreams

Finish the UTxO HD prototype

We focused on increasing test coverage for the UTxO HD prototype. We also merged +the mempool +rewrite.

Era transition property tests

We started implementing Cardano era transition property +tests, +which are needed for making sure that the ledger tables get updated in the +right way when we move from one era to the next. There are at the moment two +important transitions.

  • Byron to Shelley: where all the UTxO is transferred from in-memory Byron +state (which has no tables) to the ledger tables of the Shelley state.
  • Shelley to Allegra: where the AVVM addresses must be deleted.

We have tests for the Byron to Shelley transitions. We are working on adding +the remaining ones.

Mempool state-machine tests

We started implementing state-machine property tests for the +mempool. +The mempool is currently tested via pure property tests, and use a ledger +state without tables. With the introduction of UTxO HD, testing the concurrent +behavior of the mempool became of crucial importance (eg now we have to +acquire locks to flush the backing store). In addition, we need to test a +ledger state with tables. These needs led to the creation of a new set of +property tests. In particular we aim to run parallel state-machine tests that +exercise the mempool in a way similar to how the node would make use of it.

Backing store property tests

We started working on state-machine tests for the backing +store that UTxO +HD uses. The property tests uncovered errors in the range-reads implementation +of the LMDB backing store. To facilitate fixing this bug, we made +changes to the Haskell +LMDB bindings.

Benchmarking the CSJ prototype

Prompted by previous benchmarks showing significant improvements in sync time by +using more capabilities, we implemented a way to spread out the ChainSync +updates over a larger period instead of firing them all at the same time. This +didn't result in a noticeable speedup.

We also benchmarked the prototype with CSJ disabled (such that just the dynamo +peer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule +out/confirm overhead by non-ChainSync (mainly BlockFetch) related components. +This results in era-specific behavior (speed is like the prototype in Byron, but +like the baseline in Shelley). This deserves a closer look in the future.

This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

  • Red: baseline
  • Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps.
  • Blue: like Green, jumps are spread out.
  • Orange: variant with no jumping, to measure unrelated overhead.

+ + + + \ No newline at end of file diff --git a/2022-10-19-node-cli-api/index.html b/2022-10-19-node-cli-api/index.html new file mode 100644 index 00000000000..ae706992f62 --- /dev/null +++ b/2022-10-19-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2022-10-19 - 2022-11-01

High level summary

This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:

  • Ask the node about the current mempool's capacity and sizes
  • Request the next transaction from the mempool's current list
  • Query if a particular transaction exists in the mempool

Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric tx_submit_fail_count has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:

  • Documentation improvments
  • Release 1.35.4 was merged & released
  • Exported various types from cardano-api that were requested by community members

Completed

cardano-cli

cardano-api

cardano-submit-api

cardano-node

cardano-testnet

  • None

In Progress

cardano-cli

cardano-api

cardano-node

+ + + + \ No newline at end of file diff --git a/2022-10-21-hydra/index.html b/2022-10-21-hydra/index.html new file mode 100644 index 00000000000..b170fdc45ae --- /dev/null +++ b/2022-10-21-hydra/index.html @@ -0,0 +1,29 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High level summary

This week, the hydra team reviewed and addressed several open comments on the +new HeadV1 specification, completing a list the of identified gaps between +specification and implementation while doing so. In the wake of the recent +demonstration of SundaeSwap running their DEX in a Hydra Head, they met with +them to capture feature ideas & incorporate their feedback on the roadmap, as +well as potential research avenues.

What did the team achieve this week

What are the goals of next week

  • Complete the last two items required for a version 0.8.0.
  • Cut the next release, version 0.8.0
  • Get backup/recovery #187 done with proper event sourcing (ADR18)
  • Have the CI build macos artifacts
+ + + + \ No newline at end of file diff --git a/2022-10-27-crypto/index.html b/2022-10-27-crypto/index.html new file mode 100644 index 00000000000..a63f2f64f1f --- /dev/null +++ b/2022-10-27-crypto/index.html @@ -0,0 +1,28 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level overview

The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to +meeting the acceptance criteria in cardano-base, +which lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and +we are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution, +but also progressing on the implementation.

Low level overview

SECP built-ins

  • (missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in PR 313
  • CIP-0049 was addressed in the editors meeting, and PR 250 was merged
  • The unit-tests PR 320 is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.

KES agent

  • We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them.
  • We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).
+ + + + \ No newline at end of file diff --git a/2022-10-28-hydra/index.html b/2022-10-28-hydra/index.html new file mode 100644 index 00000000000..2292dd99b3d --- /dev/null +++ b/2022-10-28-hydra/index.html @@ -0,0 +1,29 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High level summary

This week, the hydra team completed several user experience improvements to the +hydra-tui and hydra-node, and delivered a first version of persisted head +states by publishing release version +0.8.0. +Besides this, they met with researchers on topic of the HeadV1 specification and +kicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation.

What did the team achieve this week

  • Completed the UX improvements on the hydra-tui
  • Released version 0.8.0, which delivers a first version of persisted head states
  • Met with researchers on the HeadV1 specification
  • Started work on the RFP for our external audit

What are the goals of next week

  • Complete ADR18 implementation and get it merged
  • Start work on event-sourced persistence #580
  • Have a first plutus script gap closed #452
  • Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)
+ + + + \ No newline at end of file diff --git a/2022-10-28-network/index.html b/2022-10-28-network/index.html new file mode 100644 index 00000000000..317b020ba1d --- /dev/null +++ b/2022-10-28-network/index.html @@ -0,0 +1,60 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 3 min read
Marcin Szamotulski

High-level summary

The team has focused on debuging & fixing bugs for the P2P single relay release, which included

  • diagnosing, fixing and writing tests for a bug in peer-state-actions which +fortunately hasn't been released;
  • diagnosing & preventing misconfiguration of DNS

We also focused on developing peer sharing. We also held a session with +the scientists on eclipse evasion.

Detailed description

P2P Network Stack

During the past two weeks the team focused on p2p single relay release and peer +sharing. We found and fixed an important bug recently introduced in one of the +components of p2p networking stack (fortunately never released). Together with +a fix, we designed a unit test diffusion simulation as well as quickcheck +property test (both could reproduce it). We also changed the code in a way that +if such a bug is reintroduced in the future, it will be obvious to diagnose. +For more see:

Initial benchmarking run of the P2P code was executed. The results where +unlike what we see on the mainnet. We found a possible misconfiguration of the +cluster (caused by 0 TTL on domain names), which could be the direct cause of +it. We wrote a PR which rules out such misconfiguration. We are awaiting on +the next benchmarking results. See more at:

ouroboros-network#4106

We also started working on P2P single relay release. The PR +ouroboros-network#4120 +includes 108 patches cherry-picked from the master branch. We started +working toward integration these changes against the release branch of +cardano-node. Early next week we ought to be able to have an early version +of cardano-node with non experimental P2P support!

For more detailed release plan please see P2P - Single +Relay +issue.

Consensus

We identified and fixed missing error reporting in consensus +initialisation phase. See more at +ouroboros-network#4015

Cardano Node

We also made changes in cardano-node in order to give better experience for +node operators. This includes updating severities of some of the traces as +well as implementing new format of the p2p topology file. For more see:

Peer Sharing

We continued working on implementation of peer sharing. We have an early +implementation which will be reviewed and analysed in next weeks. We started +working on cardano-node integration. We need +PR #4392 to be merged +before such integration will be able to land in cardano-node, although this +is not blocking us currently. See more at:

Eclipse Evasion

We held a session which included Alexander Russel, Sandro Coretti-Drayton and +Nick Frisby from the consensus team. We discussed high lever design of the +eclipse evasion scheme, which is important for the design and implementation of +ouroboros-genesis. We got a positive feedback from the researchers.

IO-Sim

In this period we made little progress towards releasing IO-Sim on Hackage. +A single PR which added +a few missing instances of the STM monad.

Open Source

We made sure the CI runs for PRs which comes from forks (which is important to +accept contributions from 3rd parties).

Mithril Cardano Integration

We held initial discussions with Arnaud Bailly about possible path to integrate +mithril to cardano-node and take advantage of the ouroboros-network +diffusion layer.

+ + + + \ No newline at end of file diff --git a/2022-10-28-performance-and-tracing/index.html b/2022-10-28-performance-and-tracing/index.html new file mode 100644 index 00000000000..55db75c97be --- /dev/null +++ b/2022-10-28-performance-and-tracing/index.html @@ -0,0 +1,24 @@ + + + + + +Performance & Tracing Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & Tracing Team Update

· 2 min read
Serge Kosyrev

High level summary

On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline.

On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario.

Executive summary

  • The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale.
  • The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment.
  • The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.
+ + + + \ No newline at end of file diff --git a/2022-10-31-open-source/index.html b/2022-10-31-open-source/index.html new file mode 100644 index 00000000000..4877e88b07f --- /dev/null +++ b/2022-10-31-open-source/index.html @@ -0,0 +1,45 @@ + + + + + +Open-Source Team | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Open-Source Team

· 2 min read
Marcin Szamotulski

High Level Summary

  • We've been working toward publishing Cardano Backlog, currently its in +review by the IOG communication team.
  • We identified a number of libraries which can be published.
  • We setup and enhanced cardano-updates.

Detailed description

I am glad to announce that I was given the role of open-source advocate for +cardano project. In last few weeks we were making steps towards publishing our +backlog. It's currently under review by the communication team, although most +of the issues are already visible across various repositories.

The open-source initiatives have their own +project. It is set up +to help us track our major open-source activities. Right now there are two +work streams:

We identifies a number of libraries across all the teams which contribute to +Cardano which we would like publish to publish, see the following +link. Arnauld Bailly recently published +quickcheck-dynamic +library on Hackage. The networking team is slowly progressing towards +publishing io-sim and related packages, checkout the progress +here.

Thanks to Arnaud Bailly our Cardano Updates website has +a new look & feel! It's using docusaurus.io.

Christian Taylor carried recently a detailed analysis of our open-source +repositories. He collected many interesting metrics, which allows us to see +where we need to improve as an open-source project to make the Cardano project +and many smaller related libraries which we maintain be more open and available +for open-source contributors.

The graph below shows which documents the 55 most important Cardano +repositories are missing the most: +Documentation Adoption +You can expect we will improve in these metrics in the coming weeks.

+ + + + \ No newline at end of file diff --git a/2022-11-01-db-sync/index.html b/2022-11-01-db-sync/index.html new file mode 100644 index 00000000000..41a1bda3a01 --- /dev/null +++ b/2022-11-01-db-sync/index.html @@ -0,0 +1,35 @@ + + + + + +DB Sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB Sync Team Update

· One min read
Kostas Dermentzis

High level summary

The DBSync team is preparing a release which introduces schema simplifications, removes indexes, +unique and foreign keys. It also provides a way to fix older values and migrates without the need to +resync from genesis.

Lower level summary

Schema simplifications

Indexes, Unique and Foreign keys are removed in order to speedup syncing +#1295 +The same pr also introduces a different way to rollback, which doesn't rely on foreign keys and +indexes.

Performance

The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A +conservative number of these will be included in the next release and the rest can be found in +performance view.

Migrations and resyncing

The next release will be 13.1.0, it will enable a migration without the need to resync. It will also +introduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases +#1294

Release

The release has been mostly cherry-picked from master +#1294 and its scope can be seen +release view

+ + + + \ No newline at end of file diff --git a/2022-11-02-ledger/index.html b/2022-11-02-ledger/index.html new file mode 100644 index 00000000000..6c053d74a4d --- /dev/null +++ b/2022-11-02-ledger/index.html @@ -0,0 +1,52 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

High level summary

We have made the decision to use the +formal ledger repository +in place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure +to the model. In particular, we now have a lot of support for axiomatic set theory. +While the next ledger era is still in the design phase, most of the team remains working +on technical debt. +In particular, we have moved a lot more code out of the Shelley specific modules and into +a ledger core module, we have finished up our benchmarking around the problematic TICKF +ledger transition (while improving the performance), made conveniences to the development +environment, cleaned up all the recent changes to the cost model, added a lot of documentation, +fixed some flaky tests, and deleted some dead code.

Lower level summary

Axiomatic Set Theory

The formal ledger model now has support for much of the set theory that we make use of in +the formal ledger specifications. See [pull-20].

Completed Technical Debt

  • We have addressed issues with two of our most problematic and flaky tests. +See [pull-3039] and [pull-3093].
  • We have added more documentation and tests to the Twiddler module. This is a module which +makes our CBOR serialization round-trip tests much more robust, and will also hopefully +help enforce the mandate for downstream libraries to never re-serialize data that needs +to be hashed. See [pull-3073] and [pull-3095] +(we cannot merge 3095 just yet, due to a preference for merging other features).
  • We have finished our long analysis of the problematic TICKF transition. +We now have a lot of benchmarks surrounding this code, and have added performance improvements. +See [pull-3068] and [issue-3035].
  • We have restored support for +ghcid +in our repository. This is a tool for developing with Haskell that many of us find greatly +improves our productivity by providing us with constant feedback from the type checker. +See [pull-3112].
  • After much activity on the cost model, we have done some final clean up of the code. +See [pull-3075] and [pull-3101].
  • We moved a lot of the existing user facing documentation regarding native tokens into the +ledger repository, and cleaned it up +(most of the heavy lifting was done by our amazing technical writers). +See [pull-3091].
  • We removed dead code. See [pull-3089].
  • We moved a lot of code from the Shelley specific libraries to the ledger core library. +See [pull-3109] and [pull-3110].
  • We've removed more of the awkward legacy template Haskell names. +See [pull-3108].
+ + + + \ No newline at end of file diff --git a/2022-11-02-node-cli-api/index.html b/2022-11-02-node-cli-api/index.html new file mode 100644 index 00000000000..186e0ced73f --- /dev/null +++ b/2022-11-02-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2022-11-02 - 2022-11-15

High level summary

  • Documentation improvments
  • Merged community contributions
  • Exposing types from cardano-api requested by the community/other teamss
  • Test output has been improved so diagnosing failures is now easier
  • Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)
  • Refactoring of cardano-testnet making it more useable as a library (ongoing)
  • Release 1.35.4 was merged & released

Completed

cardano-cli

cardano-api

cardano-node

cardano-testnet

In Progress

cardano-cli

cardano-api

cardano-node

+ + + + \ No newline at end of file diff --git a/2022-11-02-release/index.html b/2022-11-02-release/index.html new file mode 100644 index 00000000000..0642c8f3531 --- /dev/null +++ b/2022-11-02-release/index.html @@ -0,0 +1,25 @@ + + + + + +Node Release Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node Release Team Update

· One min read
Samuel Leathers

Node Reelease Update

2022-10-19 - 2022-11-02

Executive Summary

The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset, +a temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8.

1.35.4 release candidates have been created and are being tested internally and externally.

Completed

In Progress

+ + + + \ No newline at end of file diff --git a/2022-11-02-system-test/index.html b/2022-11-02-system-test/index.html new file mode 100644 index 00000000000..f5df33aab58 --- /dev/null +++ b/2022-11-02-system-test/index.html @@ -0,0 +1,24 @@ + + + + + +System Test Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

System Test Team Update

· One min read
Dorin Solomon

High level summary

We have been focused on:

  • Fully opening our test results (on top of the existing tests & tools):
    See cardano-node-tests webpage.
  • Started to test and automate the new functionalities added in the 1.35.4-rc1 node tag
    See test results tracking page.
  • Made some improvements to the automated db-sync sync tests
    See db-sync tests.
  • Multiple cleanups and updates to the cardano-node-tests framework
  • Updated the nightly pipelines for the cardano-node-tests after the Babbage HF
+ + + + \ No newline at end of file diff --git a/2022-11-03-embedding-quality/index.html b/2022-11-03-embedding-quality/index.html new file mode 100644 index 00000000000..c268af2e93c --- /dev/null +++ b/2022-11-03-embedding-quality/index.html @@ -0,0 +1,25 @@ + + + + + +Embedding Quality Workstream | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Embedding Quality Workstream

· One min read
Dorin Solomon

High level summary

We made good progress on most of the Action Items we agreed on Lisbon, like:

  • Cardano System Tests was fully open to public (tools, tests, results) +See cardano-node-tests webpage.
  • We defined an user-facing-functionality template that is used with the cardano-cli team
    • this includes acceptance criteria & user stories, and definition of done
  • We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)
  • We started to apply a labelling convention on cardano-node issues that will be used to generate some visual dashboards with some metrics [TBD]
  • Ziyand Liu started an End-to-End Development and Testing Process for Plutus Features
+ + + + \ No newline at end of file diff --git a/2022-11-04-hydra/index.html b/2022-11-04-hydra/index.html new file mode 100644 index 00000000000..ece9dbc6722 --- /dev/null +++ b/2022-11-04-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High level summary

This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun preview network, see 0.8.0 release notes. They also completed implementation of ADR18 and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates #195 and alignment of the specification document with auditors.

What did the team achieve this week

  • Complete and merge ADR18 #579
  • Re-deploy hydra scripts to respun preview network, see 0.8.0 release notes #595
  • Have first gap of #452 in review.
  • Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot.
  • Engineering meeting to discuss hard forks and protocol parameter updates #195
  • Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions.
  • Drafted project scope for an external audit RFP.

What are the goals of next week

  • Implement event-sourced persistence #580
  • Answer the internal auditors questions
  • Have a draft RFP ready for a first review internally
  • Close some gaps #452
+ + + + \ No newline at end of file diff --git a/2022-11-04-mithril/index.html b/2022-11-04-mithril/index.html new file mode 100644 index 00000000000..b71d600ec03 --- /dev/null +++ b/2022-11-04-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Iñigo Querejeta Azurmendi

This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.

Low level overview

  • We have been moving forward on the implementation of the release process #500:
    • Setup of the new hosted environments for testing-preview, pre-release-preview and release-preprod with their terraform and GitHub environments #542
    • Adapted the CI workflows to work with the new release process #543
    • Publication of an ADR3
    • Publication of a dev blog post about Mithril networks evolution
    • Releasing our first Mithril distribution 2244.0
  • Worked on the API versioning mechanism #565
  • Worked on the implementation of the stores migration process for the signer and aggregator nodes #562
  • Prepared a Mithril devnet video demo #526
  • Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably #484
+ + + + \ No newline at end of file diff --git a/2022-11-11-crypto/index.html b/2022-11-11-crypto/index.html new file mode 100644 index 00000000000..f9174b82318 --- /dev/null +++ b/2022-11-11-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level overview

The SECP primitives AC has been met, and the test-vectors PR has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool PR has been merged, and we've adapted the KES secure PR to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (PR#). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork.

Low level overview

  • With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation.
  • We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool.
  • In parallel, we keep progressing on the KES agent
  • VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification.
  • Our libsodium fork now links directly to upstream libsodium.
+ + + + \ No newline at end of file diff --git a/2022-11-11-hydra/index.html b/2022-11-11-hydra/index.html new file mode 100644 index 00000000000..74dc7bba0ea --- /dev/null +++ b/2022-11-11-hydra/index.html @@ -0,0 +1,25 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team published together with Obsidian Systems a light paper +on our "Hydra for Payments" project (Link). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of hydra-node processes.

What did the team achieve this week

  • Published Hydra for Payments light paper (Link)
  • Have a draft RFP ready for a first review internally
  • Answered the internal auditors questions
  • Fixed a bug with following the chain when starting with persistence (#599)
  • Minor improvements to logging for better observability (#598, #600)
  • Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (#590)

What are the goals of next week

  • Implement event-sourced persistence #580
  • Close more gaps #452
  • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
+ + + + \ No newline at end of file diff --git a/2022-11-11-ledger/index.html b/2022-11-11-ledger/index.html new file mode 100644 index 00000000000..4049439a7c8 --- /dev/null +++ b/2022-11-11-ledger/index.html @@ -0,0 +1,56 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

High level summary

I am extremely excited to say that we now have a pull request up which introduces our new versioned +CBOR serialization. This was an enormous effort, but it will solve a host of problems that we have +had since the Shelley phase. It will take time to properly review it, and we will +need to put in a lot of effort to integrate it with the downstream components, but this is a huge +milestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction +serialization schemes.

We also have a draft pull request that reworks how deposits are tracked. Users of the system will +not notice any difference, but it is a necessary change needed to prepare the way for +decentralizing the governance of Cardano.

Finally, we continued to address technical debt. In particular, we continued to make progress on +bringing coherency and consistency to the code base with a common naming convention, and +improving some error messages.

Lower level summary

  • We have a pull request up for our new versioned CBOR serialization. +When we encounter a problem with our deserializers, it can be very difficult to implement a fix. +It is difficult because we can only fix such issues during a hard fork, and leading up to the +hard fork we must maintain two serializations for the same type in order to not cause unintended +network splitting (the problematic version must be used before the hard fork, +and the fixed version is used afterwards). +This can be especially tricky with the FromCBOR typeclass, since it is not always easy to +search for where all the problematic uses are located. +The new versioned CBOR serialization allows us to gracefully handle this transition. +See [pull-3138].
  • We proposed a CIP for backwards compatibility of the transaction serialization schemes. +See [pull-372].
  • We have draft for the new deposit tracking. +This draft is not as memory efficient as the final version will be, +but it is a sufficient proof of concept that we can write property tests against, ensuring +that we have not changed the semantics. +We will optimize after we are sure of the correctness. +See [pull-3127].
  • We now provide better support for debugging failed Plutus scripts in an important helper +function, named evaluateTransactionExecutionUnits. +In particular, it now returns all the information needed to rerun the script with exactly the +same arguments. This feature will end up appearing in the CLI and other tools from the Plutus +tools team. +See [pull-3135].
  • We did a lot more renaming to bring coherency and consistency to the code base. +See [pull-3126], [pull-3120], [pull-3118], and [pull-3116].
  • We have added a few things to the ledger repository to make it conform to the +Cardano Engineering Handbook +See [pull-3139].
+ + + + \ No newline at end of file diff --git a/2022-11-11-network/index.html b/2022-11-11-network/index.html new file mode 100644 index 00000000000..93b531d1c6e --- /dev/null +++ b/2022-11-11-network/index.html @@ -0,0 +1,37 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High-level summary

In last sprint we got a performance report of P2P performance testing cluster +(which consists of 50 nodes). There is a performance regression in the header +notification metric. The P2P cluster is constructed with the same +topology as the non-p2p reference one this indicates some regression which +needs to be further investigated. This poses a risk for releasing P2P.

We also continued to work on peer sharing: pull #4019.

We continued working on dynamic block production which is required for P2P +release for BP nodes: pull #3159.

We simplified the P2P topology format: issue #4559, pull #3888.

We added a new trace point for asynchronous demotions of local peers with +Warning severity. This trace is important for SPOs.

Detail description

Performance regression

Below we include a graph which shows the performance regression of the P2P code base vs non P2P.

On the x axis is time in seconds which measures the delay from the start of +the slot to when a header was received. The y axis is the percentile of nodes +that received a header. We are currently investigating possible causes of the +regression.

New P2P topology form

The new topology file format is described in this issue #4559.

Tracing improvements

  • We improved a handshake error reporting, pull #4136
  • We added TraceDemoteLocalAsynchronous rendered as DemoteLocalAsynchronous +in json format, pull #4127. Such demotions should be investigated by the +pool operator. They can indicate a problem in the deployed system, but also +they could indicate a remote problem in arranged connections with other SPOs.

Open Source Improvements

We improved documentation of io-sim and typed-protocols for open-source +contributors and/or maintenance tasks: pull #22, pull #45, pull #48.

+ + + + \ No newline at end of file diff --git a/2022-11-16-consensus/index.html b/2022-11-16-consensus/index.html new file mode 100644 index 00000000000..40e603c2f5e --- /dev/null +++ b/2022-11-16-consensus/index.html @@ -0,0 +1,84 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 6 min read
Damian Nadales

High-level summary

During the past two weeks, the consensus team started documenting the +implementation of the UTxO HD feature and continued developing tests for it. As +part of our work on UTxO HD, we improved the Haskell support for LMDB. We also +spent time working on the LSM tree prototype, and designed a parameter tuning +algorithm for it. Regarding our work on Genesis, our investigation of the +"plateaus" pointed at the TICKF slowdown on era boundaries as culprit. This +led us to developing a caching strategy that will not only remove the +aforementioned "plateaus", but can help alleviating the growing block production +delay on epoch switch. We also helped reviewing the block forge credential +hotswap feature, which is intended for use in the adoption of P2P.

We also worked on paying technical debt and fostering collaboration. In +particular, we improved the io-sim framework, which is crucial for testing and +simulating Cardano components. We also removed thunks that appeared on era +translations, and improved our diffusion pipelining feature. We are working on a +presentation for explaining Praos and Genesis.

High-level status report

  • Finish the UTxO HD prototype: in progress.
    • We added documentation for this feature.
    • We developed the second version of the mempool tests.
    • We fixed benchmarks that were inflating the speedup we observed in the +anti-diff implementation of sequences of differences. Speedups are now in the +range of [3.33, 4.75], which remain significant.
    • We continued improving Haskell LMDB support.
    • We finished implementing a "parameter tuning algorithm" for the LSM tree +prototype. This enables us to run experiments to check the correctness of +the algorithm.
  • Genesis: in progress.
    • Work investigating the "plateaus" in the ChainSync jumping prototype +pointed to the TICKF slowdown on era boundaries as culprit.
  • Tech debt:
    • We improved the capabilities of our io-sim library, which is crucial for +testing and simulating Cardano components.
    • We removed thunks from epoch translations in the ledger.
    • We added Linux CI support for lmdb-simple.
    • We got pending diffusion pipelining improvements merged.
  • Fostering collaboration:
    • We are working on a explanation of Praos and Genesis protocols.
  • Support:
    • Investigation of CSJ "plateaus" led us to developing a caching strategy for +TICKF that will not only remove these "plateaus", but can help alleviating +the growing block production delay on epoch switch.
    • We reviewed the block forge credential hotswapping feature which is intended +for use in the adoption of P2P.

Workstreams

Finish the UTxO HD prototype

We merged PR #4060, which adds a report documenting the UTxO HD +feature, and puts emphasis in explaining how the mempool works in combination +with UTxO HD.

We opened a draft PR with the second iteration of the property tests for the +mempool (#4076).

We fixed the Arbitrary instances for keys and values in DiffSeq benchmarks +(#4143). The problem was that we were testing with mostly small +values, which artificially boosted the performance gains we saw on benhcmarks. +Speedups are now in the range of [3.33, 4.75] across the different +configurations.

Backing store property tests

We focused on incorporating feedback on the monadic cursor API PR (#1). +This required us to make small tweaks to quickcheck-lockstep to test the new +API. We also updated the backing store property tests to use the new version of +the monadic cursor API.

LSM tree implementation

We worked on the LSM tree prototype. In particular: finished implementing a +"parameter tuning algorithm" that adapts the LSM tree design based on factors +like:

  • workload
  • machine specs,
  • and characteristics of the data being stored.

We are now running experiments to gather results and cross-reference them with +existing experimental results from the LSM tree paper to see if the algorithm is +working correctly.

Benchmarking the CSJ prototype

We focused on investigating the "plateaus" in the ChainSync tip, which turned +out to be due to the TICKF bug which we previously were only aware of in the +context of the long forging times near epoch boundaries. For the most drastic +patch by @nfrisby to speed up TICKF, full sync is speeding up by 7%.

The following plot shows that by caching the TICKF the ChainSync tip and the +VolatileDB tip progress at the same rate.

The plot below shows the speedup observed by caching the TICKF rule wrt the +baseline.

Technical debt

After addressing the PR comments, we merged PR #16, which implements +the MonadCatch instance for STM. This extends the capability of our io-sim +library, which is crucial for testing and simulating Cardano components PR #16 +closed #1461. This new feature was published as version 0.4.0.0 +of io-sim.

We continued with our work fixing the NoThunk errors required for enabling +nightly tests, with the help of TVarInvariant checks in strict-stm and +nothunks libraries. We proposed fixes in cardano-ledger that took care of +thunks that appeared in era translations (#3143). The fixes will be +integrated back into consensus when cardano-ledger approves and publish the +changes introduced in #3143.

We added CI support for lmdb-simple (#2). We currently test the build on +a Linux environment only.

We got pending diffusion pipelining PRs (#3857, #3860, +#3856) merged, after rebasing and addressing feedback.

Fostering collaboration

@nfrisby finished a visualisation tool and outlined scripts for the Praos and +Genesis explanation presentations. The idea is to produce a video that gives an +overview of these protocols.

Support

We started working on caching the computation of the TICKF rule +(#4054), since this was blocking our benchmarking work for +Genesis. In addition, this issue has the Cardano community quite +concerned, so we are hoping the work done in caching the +computation of the TICKF rule can help alleviating the growing block +production delay on epoch switch.

We reviewed the block forge credential hotswapping PR #3800 from the +networking team, which is intended for use in the adoption of P2P.

+ + + + \ No newline at end of file diff --git a/2022-11-16-node-cli-api/index.html b/2022-11-16-node-cli-api/index.html new file mode 100644 index 00000000000..08cf82b241a --- /dev/null +++ b/2022-11-16-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content
+ + + + \ No newline at end of file diff --git a/2022-11-16-performance-and-tracing/index.html b/2022-11-16-performance-and-tracing/index.html new file mode 100644 index 00000000000..d3443b6ed2a --- /dev/null +++ b/2022-11-16-performance-and-tracing/index.html @@ -0,0 +1,24 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Serge Kosyrev

High level summary

  1. P2P performance investigation is ongoing, in support of the networking team.
  2. SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support.
  3. Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing.
  4. On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started.
  5. We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.

Performance

We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes.

Tracing

We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis.

Infrastructure

The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends.

We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing.

A number of smaller workbench, data analysis & reporting improvements have been made.

+ + + + \ No newline at end of file diff --git a/2022-11-18-hydra/index.html b/2022-11-18-hydra/index.html new file mode 100644 index 00000000000..7260d172f96 --- /dev/null +++ b/2022-11-18-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team released version 0.8.1, which includes several fixes and a user-wished extension of the persistence introduced by 0.8.0 of replaying server outputs to make clients like the hydra-tui be aware of the latest hydra-node state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from hydra-poc to hydra!

What did the team achieve this week

  • Implemented replaying of server outputs to address #580
  • Released version 0.8.1 containing this and other fixes Release notes
  • Worked on the bounded tx validity as one of the on-chain script fixes, but couldnt finish it just yet #615
  • Collaborated with the education team on a Hydra tutorial.
  • Discovered and discussed issues with the seen ledger.
  • Renamed the Hydra repository hydra-poc -> hydra

What are the goals of next week

  • Create and discuss an ADR about handling tx validity correctly.
  • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
  • Have a team workshop / hackathon after the summit:
    • Retrospective
    • Roadmapping session
    • Hack on something complex or useful
+ + + + \ No newline at end of file diff --git a/2022-11-18-mithril/index.html b/2022-11-18-mithril/index.html new file mode 100644 index 00000000000..c4bde8f9609 --- /dev/null +++ b/2022-11-18-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level overview

The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks.

Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer.

Low level overview

  • Released a new Mithril distribution 2246.1
  • Completed the first stage of the store migrations process #562
  • Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes #565
  • Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage #576
  • Prepared a Daedalus synchronization benchmark video with/without Mithril #606
  • Upgraded the Cardano nodes of the testing Mithril networks to 1.35.4 #594
  • Worked on implementing SPO tests nodes on testing Mithril networks #563
  • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #588
  • Worked on the refactorizaton of the aggregator multi signer engine #398
+ + + + \ No newline at end of file diff --git a/2022-11-23-ledger/index.html b/2022-11-23-ledger/index.html new file mode 100644 index 00000000000..24f7338b47f --- /dev/null +++ b/2022-11-23-ledger/index.html @@ -0,0 +1,50 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

High level summary

We released CIP-1694, +our proposal for entering the Voltaire phase. +Please come join the discussion, this will be an incredibly exciting transition for +Cardano and we want everyone to participate!

We now have a sensible way to version all of the serialization schemes used in the ledger. +The draft pull request was polished, reviewed, and merged this week. +This solves many problems that have vexed us since the beginning of the Shelley ledger era.

Everyone working on the Cardano node is working together to improve our release process, +and the ledger team in particular dedicated one engineer to help with these efforts +for the next release.

Lower level summary

The Conway ledger era

The current proposal in CIP-1694 encompasses two new ledger eras. +The first era will be called Conway, after the English mathematician John Horton Conway. +The community facing aspects of the Conway ledger era will be very minimal, +but it will pave the way for introducing liquid democracy. +The details can be viewed here. +We do not yet have a formal specification for the Conway era. +Our plan is to debut the +formal ledger model. +Briefly, the Conway ledger era will:

  • introduce SPO voting for hard forks (in the spirit of the now abandoned CIP-47)
  • provide an on-chain mechanism for rotating the governance keys
  • re-plumb the ledger rules involving governance to be in line with CIP-1694

Versioned CBOR

We now have the ability to easily tie our serialization schemes to the Cardano +major protocol version. +We still aim to preserve backwards compatibility as much as possible, but we now have a principled +plan for resolving problems (see CIP-ledger-cbor). +In particular, we can now address several long standing issues, such as +issue-2444, issue-2965, and issue-3003.

The final (and massive!) pull request which brought us the versioning is pull-3138.

Deposit tracking

The draft pull request which was exploring how best to track individual deposits +is much closer now to being ready to take out of draft (pull-3127). +For background on the issue, see issue-3113. +This is quite an invasive change which effects many of our tests, which we are now addressing.

Technical debt

As always, we keep working on technical debt. +We have deduplicated a some things: pull-3129, pull-3162. +We have memoized a problematic computation (though more due diligence is needed before we can +merge): pull-3141.

Node release

We have been helping with the node release efforts. See pull-4608.

+ + + + \ No newline at end of file diff --git a/2022-11-25-crypto/index.html b/2022-11-25-crypto/index.html new file mode 100644 index 00000000000..5491b994813 --- /dev/null +++ b/2022-11-25-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The four open fronts that the crypto team is working on are:

  • MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team.
  • Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes
  • cardano-base: The VRF and BLS branchs are still open and in progress
  • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

Low level summary

MuSig2

  • We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library PR#31
  • We are introducing a more granular error handling mechanism PR#33
  • We rethought the API and made it more consistent with the underlying secp256k1 library PR#35

Mithril

  • The mithril crates in general will be published in crates.io, and we adapted the core library's README PR#616
  • We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information PR#620

cardano-base

  • We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) PR#341
  • SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions PR#344
  • Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus PR#266

KES agent

  • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
  • Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.
+ + + + \ No newline at end of file diff --git a/2022-11-25-hydra/index.html b/2022-11-25-hydra/index.html new file mode 100644 index 00000000000..5dc36d1a761 --- /dev/null +++ b/2022-11-25-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a presentation about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas.

What did the team achieve this week

What are the goals of next week

  • Monthly report & review meeting
  • Tie up several loose ends / branches.
  • Resolve Tx validity discussions & PRs.
  • Review cicero PR & try it out.
+ + + + \ No newline at end of file diff --git a/2022-11-28-network/index.html b/2022-11-28-network/index.html new file mode 100644 index 00000000000..fe0f06b0cae --- /dev/null +++ b/2022-11-28-network/index.html @@ -0,0 +1,64 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 4 min read
Marcin Szamotulski

Stake-Driven Data Diffusion Release for Relays

IOG networking team decided to release the Stake-Driven Data Diffusion with +Robust Optimised Peer Selection also more commonly known as P2P. In the +last update, we informed about a performance regression, but it turns out it +only affects block producers, and thus we highly advise against running it on +such nodes. Further investigation is required to find the cause of it.

On IOG's benchmarking cluster we have seen quite a good performance improvement +on block propagation itself. The cluster is running a static topology with +valency 6 (each node is connected to 6 other nodes). In which every of the 50 +nodes are block producers. The setup of this network is the same as mainnet. +We've seen 40-50% performance improvement on block propagation comparing to the +same cluster deployed with the same topology but using non-P2P nodes. We think +this performance improvement is caused by using full duplex connections. Quite +likely the transaction traffic floating in both directions on the same TCP +connection helps to keep the TCP window open. Note that in a cluster of 50 +nodes with valency 6 the probability of having at least one duplex connection +is more than 50%. We don't expect the same improvement on mainnet because the +network is much wider and the transaction traffic is not as large.

Just before the release we squashed two small bugs:

  • issue #4163 - top level integration bug in keep-alive;
  • issue #4177 - a bug in outbound-governor;
  • PR #4165 - a fix cardano-ping support of NodeToNodeV_10.

Peer Sharing

We were carrying a review of peer sharing PR.

DeltaQ

Neil Davies was invited to give a guest lecture entitled Avoiding System Catastrophes at UCLouvain.

What have we achieve last sprint

  • issue #4163: we found out that a control message is not passed to the +keep-alive mini-protocol, this results in every demotion executing demotion +timeout rather than a graceful termination. With the fix the node will no longer log:

    { "kind": "PeerStatusChangeFailure"
    , "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"
    , "reason": "TimeoutError"
    }
  • issue #4177: we fixed an assertion failure in the outbound-governor; now +we don't try demoted peers which are being demoted already.

  • PR #4155: we refactored ouroboros-network packages. There's a top level +ouroboros-consensus-diffusion package which integrates network +& consensus code. We also introduced:

    • ouroboros-network-api package which contains the API shared between +network & conensus;
    • ouroboros-network-mock package which contains mock API used for testing +(e.g. a mock chain & chain producer, etc.)
    • ouroboros-network-protocols package which contains implementation of all +(but handshake) mini-protocols, exposes a testlib and contains test +and cddl components.

    This made the dependency tree of network & consensus packages much +cleaner.

  • PR #4169: we described the usage of release branches in CONTRIBUTING.md +doc.

  • PR #4165: we fixed cardano-ping support of NodeToNodeV_10 protocol.

DeltaQ

The abstract of the talk:

An essential step to ensuring that distributed systems are fit for +purpose.

Distributed systems have become an integral part of our society and +daily lives. We are, both implicitly and explicitly, individually as well as +collectively, placing ever more trust in them.

Are they worthy of this trust? Our need for them to be ‘fit-for-purpose’ goes +well beyond notions of functional correctness (i.e. never getting the wrong +answer). We need them to deliver the desired outcomes in a timely, robust, +reliable, resilient fashion, at scale and in a sustainable way (both +economically and environmentally).

This all sounds like a worthy aspiration, but what would be a practical +approach to capturing and reasoning about these issues? How can we ensure that +systems can meet their fit-for-purpose objectives, not just in their design but +as they are deployed, encounter the imperfect world, are scaled to become +economic, and proceed into ongoing maintenance?

This talk will illustrate how the notions of Outcomes and Quality Attenuation +(as captured by ‘∆Q’) are being used to both frame the necessary notions and +provide a basis for assuring the refinement and reification of such systems, +from initial concept to operational infrastructure.

You can download the slides from here.

+ + + + \ No newline at end of file diff --git a/2022-11-30-consensus/index.html b/2022-11-30-consensus/index.html new file mode 100644 index 00000000000..db3a9619b66 --- /dev/null +++ b/2022-11-30-consensus/index.html @@ -0,0 +1,54 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 3 min read
Damian Nadales

High level summary

During the past two weeks, the consensus team merged improvements to the monadic +cursor API that was needed to implement LMDB range reads, which is in turn +required for the implementation of the UTxO HD feature. We added tables to +several tests in for the UTxO HD feature, which increases our confidence in the +correctness of the prototype. The mempool property tests are close to being +completed. Also, we finished the LSM tree tuning algorithm.

On the Genesis front we started simplifying the BlockFetch logic with +CSJ-specific workloads in mind.

We are also documenting the Block Diffusion Pipelining feature, and added a +high-level overview of consensus to the top level documentation of +ouroboros-network.

Workstreams

UTxO HD prototype

We merged the implementation of a monadic cursor API (#1)) which was +needed to solve a bug with LMDB range-reads. After this PR was merged, we focused on +bridging the gap between the lmdb-simple interface and consensus by facilitating +using lmdb-simple's cursor API without Serialise constraints (#3).

We refactored the backing store property tests to use quickcheck-lockstep +(#4081).

We added tables to the mock ledger in the UTxO-HD feature branch +(#4184). Every test that used to run with SimpleBlocks now uses +tables. This will enable us to exercise the UTxO HD mempool integration by +leveraging the existing mempool property-tests. The new state-machine +property-tests are still needed for testing the parallel behaviour of the +mempool.

Our work on the mempool state-machine tests revealed the need for improvements +in the quickcheck-state-machine library. Parallel testing assumed that the +state machine did not have access to mutable references. However, the mempool +tests require the use of such mutable references for mocking the ledger +interface. As a result, our parallel tests were failing with rather obscure +messages. @Jasagredo submitted a pull request (#12) that allows for +new mutable references to be created at each run of the state machine.

Backing store property tests

LSM tree implementation

We finished the LSM Tree tuning algorithm. We are currently tidying up the code +and gathering results (i.e., plots and their interpretation).

CSJ prototype

We started simplifying the BlockFetch logic with CSJ-specific workloads in mind.

New VRF and KES crypto integration

Started working on supporting new version of StandardCrypto which uses compact +KES and batched VRF (#4151).

Technical debt

We reviewed the existing state of the Block Diffusion Pipelining document. We +are now working on the "Implementation" section (#4020).

Fostering collaboration

We cleared up our understanding of the error dynamics of forecasting +(#4146 and #4174).

We submitted a pull request that adds an overview of consensus to the top level +documentation of +ouroboros-network (#4197). This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

https://github.com/input-output-hk/ouroboros-network/pull/4197

+ + + + \ No newline at end of file diff --git a/2022-11-30-node-cli-api/index.html b/2022-11-30-node-cli-api/index.html new file mode 100644 index 00000000000..57b1cefd9db --- /dev/null +++ b/2022-11-30-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2022-11-30 - 2022-12-13

High level summary

PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

Completed

docs

cardano-cli

cardano-api

cardano-node

cardano-testnet

In Progress

cardano-cli

cardano-api

cardano-node

+ + + + \ No newline at end of file diff --git a/2022-11-30-performance-and-tracing/index.html b/2022-11-30-performance-and-tracing/index.html new file mode 100644 index 00000000000..e458fe0b71f --- /dev/null +++ b/2022-11-30-performance-and-tracing/index.html @@ -0,0 +1,26 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Serge Kosyrev

High level summary

  1. Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release.
  2. SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench.
  3. The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks.
  4. Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started.
  5. Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.

Performance

We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release.

Tracing

For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them. +The idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time.

To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics.

Infrastructure

Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation.

In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model.

The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged. +We are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration.

We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability.

We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP.

As usual, a number of smaller workbench, data analysis & reporting improvements have been made.

+ + + + \ No newline at end of file diff --git a/2022-12-01-db-sync/index.html b/2022-12-01-db-sync/index.html new file mode 100644 index 00000000000..348089ada2d --- /dev/null +++ b/2022-12-01-db-sync/index.html @@ -0,0 +1,36 @@ + + + + + +DB sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB sync Team Update

· One min read
Kostas Dermentzis

High level summary

The DB Sync team prepared a release 13.1.0.0-rc2 which includes many improvements for db-sync, +it makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces +migrations. This release finalises the objectives that were set for db-sync for the previous +3 months period and part of the syncing speed objective set for the next period +Changelog

Lower level summary

  • Branch release/13.1.0.x +includes all the improvements related to the release. The release is passing through the testing +phase and a number of bugs and issues have been fixed, like +#1312 +#1311. +Also many new unit tests have been added.

  • Part of the release branch is cherry-picked back into master, in a way that it respects the new +release and development process, so that it takes into account migrations +release process

  • The DB Sync team has also tagged release 13.0.6 which better supports preview and preprod for +docker.

+ + + + \ No newline at end of file diff --git a/2022-12-01-mithril/index.html b/2022-12-01-mithril/index.html new file mode 100644 index 00000000000..e4f3a90eb52 --- /dev/null +++ b/2022-12-01-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes.

Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer.

Low level overview

  • Implemented custom Mithril SPOs on testing/pre-release networks #563
  • Deprecated Signer Declarative Pool Id registration mode #585
  • Completed the second stage of the store automatic migration process #600
  • Completed the deployment pipelines to crates.io registry #588
  • Completed automatic generation of nodes/libraries versions manifest in releases notes #599
  • Completed CI/CD handling of PR from forks #597
  • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #586
  • Worked on signing the artifacts released in the distributions by the CI/CD #587
  • Worked on multi-platforms end to end test #601
  • Worked on the refactorizaton of the aggregator multi-signer engine #398
+ + + + \ No newline at end of file diff --git a/2022-12-01-system-test/index.html b/2022-12-01-system-test/index.html new file mode 100644 index 00000000000..000dc7c602f --- /dev/null +++ b/2022-12-01-system-test/index.html @@ -0,0 +1,25 @@ + + + + + +System Test Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

System Test Team Update

· One min read
Dorin Solomon

High level summary

During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the P2P Single +Relay functionality, and also tested some DB-Sync tags.

Workstreams

Framework improvements:

  • moved the System Test CLI Pipelines from BuildKite to Github Actions
  • improved the reporting tools to support the rerun of the failled tests and update of the reports
  • added support for Github API in report-aggregator, so reports will be generated from the GitHub nightly jobs from now on
  • added support for mixed topology - P2P, legacy, mixed topologies
  • planned the P2P Single Relay system test activities
  • added support to start regression tests with PV8 + better selection of tests

DB-Sync:

  • confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)
  • tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2
+ + + + \ No newline at end of file diff --git a/2022-12-02-hydra/index.html b/2022-12-02-hydra/index.html new file mode 100644 index 00000000000..df004562d60 --- /dev/null +++ b/2022-12-02-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team has worked on cleaning up several things in progress +after last week's summit. They have extended their model-based testing (MBT) +approach with transaction creation & observation +#410, solved +AcquirePointTooOld problems of the hydra-node with by changing the wallet +initialization #439. +Also, the Hydra researchers updated the security proofs of the Coordinated Hydra +Head, which are bound to be included in the Hydra HeadV1 specification.

What did the team achieve this week

  • Monthly review & report - will also be published on our website #644
  • Extended the model-based testing (MBT) with transaction creation/observation #410
  • Solve AcquirePointTooOld problems with new wallet initialization #439
  • Fixed our hydraw deployments (EC2 instances)
  • Created & discussed ADR21 within tx validity work
  • Received & discussed security proofs of Coordinated Hydra Head (requires more work)

What are the goals of next week

  • Get ADR21 accepted & close tx validity gap in our implementation
  • Complete review & integrate the Hydra tutorial
  • Review latest hydra-pay work
  • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec
  • Get Cicero (new CI) working
+ + + + \ No newline at end of file diff --git a/2022-12-09-crypto/index.html b/2022-12-09-crypto/index.html new file mode 100644 index 00000000000..d4534ecfeff --- /dev/null +++ b/2022-12-09-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The four open fronts that the crypto team is working on are:

  • MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency.
  • Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe.
  • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack.
  • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

Low level summary

MuSig2

  • [Still in progress] We are introducing a more granular error handling mechanism PR#33
  • We merged the API redesig PR#35
  • We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future PR#36

Mithril

  • We merged the individual signature PR#620
  • We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (kes repo)

cardano-base

  • Nothing new to report. Still working in merging these PRs.
  • We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a bug in GHC

KES agent

  • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
  • Fixed a 'use-after-free' bug in the KES agent.
+ + + + \ No newline at end of file diff --git a/2022-12-09-hydra/index.html b/2022-12-09-hydra/index.html new file mode 100644 index 00000000000..b04a6dc52fa --- /dev/null +++ b/2022-12-09-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team has worked on completing to "Validate coordinated head protocol against formal model", this is a huge step to verify the implementation is secure. They also worked on implementing ADR21 related to bounded tx validity which is now under review. HydraPay project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of issues they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced.

What did the team achieve this week

  • Document model based testing #194 & #641
  • Got ADR21, reducing gaps between implementation and specification, under review.
  • Complete review on hydra-tutorial.
  • Complete first round of review on HydraPay work #634
  • Meeting with Director of CyberSecurity frio IOG to unblock "the RFP prepared for the external audit" #606
  • Remove vasil-dev and testnet from smoke-test because they were not working #630
  • Fix flaky plutus-merkle-tree test #642
  • Refactor NetworkSpec to improve legilibility.
  • Fix benchmark cost for abortTx #631
  • Adapt nix.conf to the recent hydra-ci nix cache migration.

What are the goals of next week

  • Get ADR21 accepted & close tx validity gap in our implementation.
  • Integrate the hydra-tutorial.
  • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
  • Get Cicero (new CI) working.
  • Use reference inputs to reduce the cost of the commitTx.
+ + + + \ No newline at end of file diff --git a/2022-12-09-ledger/index.html b/2022-12-09-ledger/index.html new file mode 100644 index 00000000000..02ba2908a6d --- /dev/null +++ b/2022-12-09-ledger/index.html @@ -0,0 +1,59 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

High level summary

The Plutus tools team at IOG has started helping the ledger team to build out a user friendly +cardano-ledger-api package! +A GitHub project +will be filled out in the days ahead, +people interested in the API can use it to follow along and join in on the conversations.

The ledger team has started using +architectural decision records +to leave a record of important decisions that the team makes. +We will retroactively go back through past decisions and make ADRs for them.

The logic to track individual deposits is now nearly in place. +We are prioritizing correctness with our first pull request, and will follow up with +performance optimizations and general cleanup next.

Pointer addresses are being deprecated with the Cardano major protocol version 8. +See CPS-0002 +for more context.

Lower level summary

Cardano ledger API

The Plutus tools team has taken our minimal cardano-ledger-api package and started filling it +out and adding much needed documentation. +They have also added doctests! +In the days to come, the Plutus tools team will map out a lot more work for the API and record +it in this +GitHub project.

See

Architectural Decision Records (ADRs)

We are now providing more context and leaving a record of important decisions that are made +in the ledger. The first ADR explains the very lightweight process.

See

Tracking individual deposits

See ADR-3 +for background. +We now have the logic in place to track individual deposits, and a host of property tests +to make sure that the logic is correct. +The current implementation uses more memory than it needs to, and we will address that next, +with our hope being to only use one word (8 bytes) per registered stake credential. +There is a fair amount of other cleanup needed for general maintainability.

See

Removing pointer addresses

Pointer addresses, which have never seen any real use +(there are something like eleven on mainnet), are being deprecated starting at Cardano major +version 9. +CPS-0002 gives the context. +We are disabling them by first preventing transaction outputs containing them +from being serialized by the node at the moment we switch to version 9. +At the hard fork after that, we will translate the existing few pointer addresses +to enterprise addresses.

See

Technical debt

  • pull-3162 - Sometimes we have to put safeguards in place for hard forks which may never +be exercised. After we have passed the given hardfork, we are able to clean up the code +and simplify our logic. We removed all of the ones that we are currently easily able to.
  • pull-3165 - We improved the type safety of our code while also discovering and fixing +a serialization bug.
  • pull-3172 - We removed dead code.
  • pull-3175 - The Allegra and the Mary code used to be coupled in a particular way the we grew to +dislike. We made these two ledger eras now uniform with the rest of our code base.
  • pull-3184 - We organized our property testing code.
  • pull-3200 - The Plutus tools teams fixed an outstanding bug in the translation from the +ledger state to the Plutus script context.
+ + + + \ No newline at end of file diff --git a/2022-12-12-network/index.html b/2022-12-12-network/index.html new file mode 100644 index 00000000000..481be03d519 --- /dev/null +++ b/2022-12-12-network/index.html @@ -0,0 +1,28 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· One min read
Marcin Szamotulski

High level summary

In last sprint the team focused on preparations for the conference talk at +OPODIS 2022. We also worked on preparations to publish io-sim and related +packages on Hackage (PR #57, PR #60).

We also started reviewing:

  • ouroboros-network
  • cardano-node
  • cardano-ledger +repositories for open-source readiness (PR #4128).

We prepared a PR which changes how node-to-node and node-to-client protocol +versiones are serialised in cardano-node log (PR #4691).

+ + + + \ No newline at end of file diff --git a/2022-12-14-consensus/index.html b/2022-12-14-consensus/index.html new file mode 100644 index 00000000000..4957656b9f1 --- /dev/null +++ b/2022-12-14-consensus/index.html @@ -0,0 +1,65 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 3 min read
Damian Nadales

High level summary

During the past two weeks, the Consensus team finalized the QSM tests for the +backing store and Mempool on the UTxO-HD branch with important discoveries +regarding parallel QSM testing. We also worked with the Ledger team to envisage +the modifications that are required in Ledger and Consensus to accommodate the +changes in the crypto VRF and KES. The db-analyser now supports bechmarking +the ledger operations, which will allow us to identify, debug, and profile +potential performance problems. We drafted a document that defines how to manage +the versions of Consensus-related packages. The top level documentation of +ouroboros-network now features a description of the consensus components and +provides a hyperlinked map to the modules documentation.

Workstreams

UTxO HD prototype

Whereas we had passing sequential state-machine tests for the mempool, the +parallel case proved to be more challenging than we thought. The operation of +adding a list of transactions to the mempool is not atomic and, as a result, +when adding a list of transactions, transactions from other processes can be +added in between. The mempool implementation handles this correctly, however +this required us to redesign the parallel model we had to take +the lack of atomicity into account.

Backing store property tests

We finished refactoring the backing store property tests. The second review +round is ongoing.

LSM tree implementation

We are working on benchmarking (in terms of time and number of IO operations) +fetching/looking up data from disk.

Genesis

We worked on the design of a mechanism to prevent a DoS attack on our Genesis +design related to rollbacks. This was arguably the biggest outstanding question.

During the discussions around Genesis, we noticed a design boundary that nicely +delineates a fundamental component. We almost have a full Haskell prototype of +it. It will be very nicely self-contained, perhaps even usable in the ultimate +implementation!

New VRF and KES crypto integration

We collaborated with the Ledger team on preparing the ledger state and crypto +types to avoid huge allocation on the epoch boundary when changing aspects of +the crypto that will only manifest in headers, not in the ledger states.

Technical debt

We merged the pull-request that adds a support to db-analyser for +benchmarking ledger operations. This will allow us to identify, debug, and +profile potential performance problems. The benchmark focus on the main 5 ledger +operations that are involved in chain syncing, block forging, and block +validation, namely:

  1. Forecast.
  2. Header tick.
  3. Header application.
  4. Block tick.
  5. Block application.

The following figure shows a plot of the benchmarking results for the first 65 +million blocks (approximately) of the Cardano chain. The thin yellow lines under +the x-axis show the epoch boundaries, whereas the thick yellow lines correspond +to the era transitions.

As we can see in this figure, era and epoch boundaries require more computation +time. The ledger team are aware of this problem, and we are working to improve +this situation.

Fostering collaboration

We drafted a document motivating and defining how Consensus (and +possibly other core teams) will/should manage our package versions. This +pull-request garnered many great discussions from our team members and other +teams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et +al. We want to thank you all for your input, and we found this discussion very +enlightening!

We merged the pull request that adds an overview of consensus to +the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

+ + + + \ No newline at end of file diff --git a/2022-12-14-db-sync/index.html b/2022-12-14-db-sync/index.html new file mode 100644 index 00000000000..eb3bda1d32d --- /dev/null +++ b/2022-12-14-db-sync/index.html @@ -0,0 +1,33 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

The DBSync team continued testing release 13.1.0.0. The QA team has reported that no issues have +been found. The DBSync team also worked on cherry-picks back to master and on fixing bugs.

Lower level summary

  • Release is cherry-picked back to master, which uses the new rollback mechanism which uses +reverse indexes, same as the release +#1320 +This also fixes a bug number of issues on master.
  • Depenencies upgrade and CHaP integration +#1324
  • AdaPots fix #1323. This +fixes an issue where the per epoch AdaPots didn't match the epoch boundary, but +they also included changes from the first block of the epoch.
  • Deposits Event fix #3212. This pr +adjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the +number of queries that db-sync does during syncing an make syncing faster.
+ + + + \ No newline at end of file diff --git a/2022-12-14-node-cli-api/index.html b/2022-12-14-node-cli-api/index.html new file mode 100644 index 00000000000..39312125417 --- /dev/null +++ b/2022-12-14-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2022-12-14 - 2022-12-27

High level summary

PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

Completed

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

In Progress

CI & project mainteance

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2022-12-14-performance-and-tracing/index.html b/2022-12-14-performance-and-tracing/index.html new file mode 100644 index 00000000000..56ce0082ad4 --- /dev/null +++ b/2022-12-14-performance-and-tracing/index.html @@ -0,0 +1,28 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 4 min read
Serge Kosyrev

High level summary

  1. SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment.
  2. A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery.
  3. The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals.
  4. Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started.
  5. Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.

Performance

The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload.

We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling.

Tracing

After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical.

To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:

  1. We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration.
  2. The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.

All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further.

In addition, we're still pursuing our performance-enhancing rework of the new tracing internals.

Infrastructure

After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends.

Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it. +This means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis. +This will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports.

A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches. +Previously we only had automation for two aspects separately, so we only could either:

  • compare individual runs (used for different node configurations / versions)
  • collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version) +Naturally, combining these two capabilities was a long-desired feature of our analysis pipeline.
+ + + + \ No newline at end of file diff --git a/2022-12-15-mithril/index.html b/2022-12-15-mithril/index.html new file mode 100644 index 00000000000..51c23d5f07a --- /dev/null +++ b/2022-12-15-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team has released the new distribution 2248.1 of their nodes. They have published the first version of the Mithril cryptographic library on crates.io, the Rust community’s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots.

Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities.

Low level overview

  • Implemented removing verification key and stake from single signatures #619
  • Completed the extraction of the signer registration from the multi-signer #642
  • Completed the extraction of the certificate creation from the multi-signer #638
  • Implemented a workflow to test client binaries (Linux / MacOS / Windows) #601
  • Completed the signature of the artifacts produced by the CI #587
  • Fixed the protocol parameters transition #627
  • Worked on optimizing the snapshot digest computation #510
  • Worked on enforcing the API protocol versions in the client and signer #633
  • Worked on deactivating the non certified signer registration mode #621
  • Worked on the re-genesis of the test networks #651
+ + + + \ No newline at end of file diff --git a/2022-12-16-hydra/index.html b/2022-12-16-hydra/index.html new file mode 100644 index 00000000000..5059c1304d9 --- /dev/null +++ b/2022-12-16-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on the website and reduced the cost for commit transactions by ~30% with the help of reference scripts.

The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023.

What did the team achieve this week

  • Kicked-off Hydra Voting project with Catalyst, CF, and IO Research.
  • Reduce commit transaction costs by ~30% with reference scripts.
  • Prepared an RFP for external audit of the Hydra Head solution.
  • Fixed transaction cost benchmarks for abort tx #631.
  • Recorded decision to use model-based testing (ADR22) and improved Model documentation.
    • Concluding the first increment on Validate coordinated Head protocol #194.
    • Formulated next step / follow-up on testing the Soundness property of our protocol #656.
  • Switched to using nix flakes for development setup and CI build #646.

What are the goals of next week

  • Push ADR21 & tx validity gap over the finish line (smoke tests missing).
  • Integrate the hydra-tutorial.
  • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
  • Close & recap on the year with another monthly report (+ blog post).
+ + + + \ No newline at end of file diff --git a/2022-12-28-node-cli-api/index.html b/2022-12-28-node-cli-api/index.html new file mode 100644 index 00000000000..cf0fda68bf7 --- /dev/null +++ b/2022-12-28-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2022-12-28 - 2023-01-10

High level summary

Completed

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

In Progress

CI & project mainteance

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-01-05-ledger/index.html b/2023-01-05-ledger/index.html new file mode 100644 index 00000000000..0137745cf86 --- /dev/null +++ b/2023-01-05-ledger/index.html @@ -0,0 +1,71 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 5 min read
Jared Corduan

High level summary

The ledger team finished up the remaining work for tracking individual depots, +built out the new Conway era transaction body (in line with CIP-1694), +greatly reduce some problematically large calculations on the epoch boundary, +and addressed technical debt.

Lower level summary

Finishing the deposit tracking

The initial work on the individual deposit tracking project focused only on correctness. +As this is a large data structure +(since its size is linear with respect to the number of registered stake credentials), +it is very important that we also reduce the memory overhead as much as possible. +Fortunately, we were able to add very little overhead for the deposits by using existing +efficient data structures. The extra tracking now only incurs one word (8 bytes) +per registered stake credential.

See:

New Conway era transaction

We implemented the Conway era transaction body, which is in line with CIP-1694. +Note that the Conway era implements, losing speaking, the parts of CIP-1694 that are not +related to the liquid democracy (the "DReps"). +The new transaction body adds the new governance actions and votes, +while also deprecating the old governance structures +(i.e. the old protocol parameter updates and MIR certificates).

We also now have the wire specification (CDDL file) and serialization code in place. +The wire specification is still subject to change while we work on the Conway era, +but it is now usable and has proper testing support +(so that, for example, the serialization round-trips, etc).

See:

Optimizing the TICKF transition

Every since the release of the Shelley era, we have been working to reduce the computational load +placed on the node by the ledger at the epoch boundary. +While still not perfect, we believe that we have removed one of the final problematically long +epoch boundary computations that exacerbate situations like +this. +In particular, the problem involved the way in which the consensus layer obtains a view of the +ledger for the purposes of checking the leadership schedule in a new epoch. +We implemented a stopgap measure which now only incurs a single multi-second cost once per epoch +instead of potentially several multi-second costs while the networks waits for the first block +of a new epoch to be minted.

See:

Technical debt

We closed the year out with a lot of reduction to the technical debt!

Improved ledger event

  • pull-3212 - The ledger events are not guaranteed to appear in any given order within a block. +For this reason, motivated by the use case in db-sync, the TotalDeposits event now +includes a transaction ID and emits the change in deposits instead of the value.

Improved type saftey

  • pull-3208 - We replaced NominalDiffTime with a newtype wrapper. The problem was that our CBOR +encoders and decoders were using the wrong level of precision, having to due with with +the Shelley genesis file. We removed the potential problem with a newtype wrapper.
  • pull-3167 - We now use a GADT to ensure consistency of the Plutus language in the types +for TransactionScriptFailure and PlutusDebug.

Code/Module organization

  • pull-3175 - The Allegra and Mary eras had an unusual relationship in our codebase, +due to the uncertainly of release dates while we were implementing them. +In particular, they were coupled in way that is different from the rest of the code base. +With hindsight on our side, we split the combined shelley-ma Haskell package into two +separate ledger era packages, which is now consistent with the rest of the repository +and module structure.
  • pull-3184 - We created a core test sub-library, cleaning up a lot of our property test +generator code.
  • pull-3210 - We moved the KeyPair type to the test library. Outside of testing, +the ledger does not need to deal with signing keys, and since this is a topic that +deserves the utmost care, it is best to make it clear that our use of signing keys +is only for testing.
  • pull-3229 - We split the Cardano.Ledger.Alonzo.Data module, which is more consistent with the rest +of the codebase.

Revert pointer address deprecation

Thanks to one of our excellent internal auditors, +@jmhrpr, +we now have a better plan for deprecating pointer addresses. +This meant that we had to revert the previous work to deprecate them.

See:

Miscellaneous

  • pull-3205 - We removed deprecated type synonyms.
  • pull-3218 - We cleaned up the address deserialization.
  • pull-3223 - We fixed faulty address deserialization tests.
  • pull-3222 - We switched to a general type family TxOut from concrete ones, +reducing many constraints.
  • pull-3224 - ShelleyGenesis is now parameterized by crypto instead of by era.
  • pull-3170 - We set the cabal-version to 3.0 in our projects.
  • pull-3172 - We removed the now useless EncodeMint/DecodeMint classes.
  • pull-3225 - We switch from ormolu to +fourmolu. +The reason was to be able to finally have more diff friendly code!
+ + + + \ No newline at end of file diff --git a/2023-01-06-crypto/index.html b/2023-01-06-crypto/index.html new file mode 100644 index 00000000000..cda3040c66e --- /dev/null +++ b/2023-01-06-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The four open fronts that the crypto team is working on are:

  • MuSig2: The API features (error handling) has been merged.
  • Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures.
  • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI.
  • KES agent: We keep progressing with KES secure forgetting implementation.

We also started working in the cryptography engineering handbook, which will be a cross team effort.

Low level summary

MuSig2

  • Merged the more granular error handling mechanism PR#33

Mithril

  • Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in Version 0.1.1, which was published in crates.io.
  • Updated new KES format to mithril library PR 674
  • We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync PR 531
  • We keep progressing on reducing the use of transmute in mithril-stm.

cardano-base

  • Nothing new to report. Still working in merging these PRs. We are only missing nix merge of PR#520 and the updates on VRF will be merged.

KES agent

  • We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests PR#255.

Cryptography handbook

We have made available the (temporary) cryptography handbook https://input-output-hk.github.io/cryptography_spec/, and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives.

+ + + + \ No newline at end of file diff --git a/2023-01-11-consensus/index.html b/2023-01-11-consensus/index.html new file mode 100644 index 00000000000..0a0d4eaea55 --- /dev/null +++ b/2023-01-11-consensus/index.html @@ -0,0 +1,53 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 3 min read
Damian Nadales

High level summary

The consensus team is resuming its activities after the Christmas break. During +these weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and +discussing with the Ledger team the changes that might be required for the next +iterations. The pull request that adds the Conway era is waiting for a second +review round and we hope to merge it soon. On the technical debt side we are +looking into a property-test failure found in the iterators. We are +investigating if this is an error in the model or in the implementation. We also +improved the documentation of our testing code.

Workstreams

UTxO HD Prototype

We worked with the Ledger team to start preparing the next versions of UTxO-HD. +The Ledger team is concerned that for the remaining maps we might need the full +ledger state on epoch boundaries. Since the main consumer of the ledger rules is +Consensus, the code that requires access to a full state could be moved from the +ledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take +place in such bridge, instead of querying the ledger for the values that are +required in the epoch-transition computations.

We relocated some UTxO-HD definitions, in preparation for merging +the prototype into master.

We also completed updated local benchmarks comparing the replay time and memory +consumption of:

  • the baseline node (f2fc76ef45647275c98634da1718290b976ff364)
  • the UTxO-HD node with the in-memory backend
  • the UTxO-HD node with the LMDB backend

The following plot shows the results: we can see that the LMDB node barely +reaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The +in-memory backend is about 30 minutes faster, but still slower than the baseline +version. We are aware of this phenomenon and it is inherent to the problem of +maintaining sequences of differences of the last k ledger states that allows +us to perform rollback and roll-forward. We are in the process of measuring +syncing from scratch times.

We also added StaticEither accessors that helped us to simplify +the UTxO-HD prototype.

New Conway era

We incorporated the feedback of the pull request, and rebased this +branch on top of master. The PR is pending a second review round and we hope +to merge this soon.

Technical debt

We are investigating a property-testing failure involving +iterators. Solving this requires understanding the expected behavior of +iterators in the counterexample found by QuickCheck to determine if the error +is in the model or in the implementation.

Fostering collaboration

We moved the contents of docs/Testing.md closer to the code, so that the +explanations about the tests are easier to find in the relevant modules, and the +documentation is easier to keep up to date.

+ + + + \ No newline at end of file diff --git a/2023-01-11-performance-and-tracing/index.html b/2023-01-11-performance-and-tracing/index.html new file mode 100644 index 00000000000..105d2b43005 --- /dev/null +++ b/2023-01-11-performance-and-tracing/index.html @@ -0,0 +1,26 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Serge Kosyrev

High level summary

Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:

  1. SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress.
  2. The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over.
  3. Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks.
  4. New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs.
  5. Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench.
  6. Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.

Performance

The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on.

Tracing

The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done.

Infrastructure

Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components.

On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters. +We now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes.

We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development. +Once this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads.

+ + + + \ No newline at end of file diff --git a/2023-01-12-mithril/index.html b/2023-01-12-mithril/index.html new file mode 100644 index 00000000000..7ce4031bbe1 --- /dev/null +++ b/2023-01-12-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ADR. They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible.

Finally, they have worked on upgrading the devnet and fixing some flakiness in the end to end tests of the CI.

Low level overview

  • Implemented the redaction of an ADR for handling graceful updates of the Mithril Network #671
  • Worked on a proof of concept to handle backward compatibilty of exchanged messages with protobuf #677
  • Worked on a proof of concept to handle backward compatibilty of exchanged messages with avro #678
  • Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction #672
  • Worked on upgrading the Cardano node of the Mithril devnet, as well as fixing flakiness of the CI #523
  • Prepared and tested the new 2302 distribution pre-release 2302.0-prerelease
  • Updated the documentation for SPO to build a signer node in order to better reflect the new release process #681
+ + + + \ No newline at end of file diff --git a/2023-01-13-hydra/index.html b/2023-01-13-hydra/index.html new file mode 100644 index 00000000000..88afdb18c9e --- /dev/null +++ b/2023-01-13-hydra/index.html @@ -0,0 +1,37 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

Since last weekly update before christmas, the Hydra team worked on the +technical specification, closed gaps in hydra-plutus scripts, made the unique +headId available to Hydra clients through the API, allow the hydra-node to +explicitly synchronize from genesis (if configured), and fixed smaller log and +build issues reported by new users.

Besides this, a retrospective blog +post +was published by Matthias Benkort (CF) on Hydra, summarizing our progress made +in 2022 also an outlook where Hydra is headed for in 2023. Also, the team had +some first sessions on the voting project with Catalyst and the CF.

A full digest monthly digest for December 2022 can be found on the hydra +website.

What did the team achieve this week

  • Had some first sessions on the voting project with Catalyst and CF
  • Published retrospective blog +post +by Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also +an outlook where Hydra is headed for in 2023.
  • Worked on the LaTeX spec for HydraHeadV1, not final or published yet - latest +version in this repository.
  • Add unique headId to API and hence make it available to clients.
  • Allow hydra-node to explicitly synchronize from genesis using --start-chain-from 0.
  • Closed gaps in hydra-plutus scripts
    • bounded transaction validity (ADR21)
    • enforcing contract continuity via state token in output
  • Fixed JSON for some logs and smaller build issues reported by new users.

What are the goals of next week

  • Reach out to have hydra-tutorial integrated.
  • Plan the next couple of months.
  • Complete checking reimbursing of commits in head validator.
  • Align plutus scripts to spec and simplify them (identified some simplifications)
  • Improve mutation framework to be sure we fail tests for the right reasons
  • Complete the spec except the open points (<5) and also discuss them with researchers.
+ + + + \ No newline at end of file diff --git a/2023-01-13-release/index.html b/2023-01-13-release/index.html new file mode 100644 index 00000000000..10aa220ddd5 --- /dev/null +++ b/2023-01-13-release/index.html @@ -0,0 +1,26 @@ + + + + + +Node Release Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node Release Team Update

· One min read
Samuel Leathers

Node Reelease Update

2022-11-02 - 2023-01-13

Executive Summary

A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on +release/1.35 branch and does not bump cardano-ledger.

The team successfully integrated an interim release bump of ledger and consensus into cardano-node master. +This work will not be released in a node version, but will be continued by the current dependency bump in progress.

We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again.

The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress.

Completed

In Progress

+ + + + \ No newline at end of file diff --git a/2023-01-13-system-test/index.html b/2023-01-13-system-test/index.html new file mode 100644 index 00000000000..d16d223fa4e --- /dev/null +++ b/2023-01-13-system-test/index.html @@ -0,0 +1,27 @@ + + + + + +System Test Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

System Test Team Update

· One min read
Dorin Solomon

High level summary

During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the P2P Single +Relay functionality.

We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level.

Workstreams

Framework improvements:

  • extended the cardano-node-tests with the ability for anybody to fork the repo and run all our System Tests on GitHub Actions
  • added 2 new nightly pipelines - nightly-mixed and nightly-p2p - details here
  • some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;

=== 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) === + to + === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===

Node:

  • ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled
  • started the preparations for testing the next tag - details here

DB-Sync:

  • some improvements on db-sync sync tests
+ + + + \ No newline at end of file diff --git a/2023-01-14-db-sync/index.html b/2023-01-14-db-sync/index.html new file mode 100644 index 00000000000..d39220dc29b --- /dev/null +++ b/2023-01-14-db-sync/index.html @@ -0,0 +1,29 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

After spending the last months on improving DBSync and releasing 13.1.0.0 the DBSync team focused +the last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the +new leger core and ghc-9.2.4

Lower level summary

  • Integrate CHaP +#1331
  • Integrate new ledger core 0.1.1.1 and ghc-9.2 +#1332
  • Technical debt: Add code formatter fourmolu +#1334
  • Preparing and tracking Conway and UTxO integration
+ + + + \ No newline at end of file diff --git a/2023-01-19-ledger/index.html b/2023-01-19-ledger/index.html new file mode 100644 index 00000000000..412642e5d1a --- /dev/null +++ b/2023-01-19-ledger/index.html @@ -0,0 +1,48 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

High level summary

The ledger team completed some preliminary ground work in preparation for CIP-1694 +(restructuring the ledger state), +fixed the PDF hosting problem (mostly the formal specs), +built out more of the new user-friendly ledger API, +finished a proof of concept for constraint-based generators for property tests +(with the hopes of being able to replace our trace generators one day), +and addressed technical debt.

Lower level summary

Restructuring the ledger state

The existing governance structures will be replace in the conway ledger era, +as described in CIP-1694. +In particular, the ledger rules will be restructured as follows:

   BBODY
|
|-------------------------------|
v v
TICK LEDGERS
| |
|---------| |
v v v
RUPD ~NEWEPOCH~ ~LEDGER~
| |
|----------| |--------|-------------------|-----------|
v v v v v
~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+
| | |
|---------|------------| v |
v v v DELPL v
SNAP POOLREAP -UPEC- | UTXO
|--------| |
v v v
POOL DELEG ~UTXOS~

-..- Removed
+..+ Added
~..~ Modified

Moreover, the ledger state will also be restructured in accordance with the new rules. +In the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT. +We have also adapted all the data structures in the ledger state.

See:

PDF hosting

We now build all of our PDFs using a GitHub action which is triggered by pushing a tag +with a specific form, cardano-ledger-spec-YYYY-MM-DD. +The action creates a GitHub release containing the PDFs. +The links in the main ledger README now point to the PDFs in the latest release.

See:

Powering the new ledger API

We have now removed all the HasField instances from the protocol parameter data types, +and replaced them with lenses. +This is probably the last major restructuring that the ledger team will do on the code base +for the API for a while +(the Plutus tools team will be working on it next, see here). +We also added a new helpful function ensureMinCoinTxOut.

See:

Constraint-based generators

Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

We would like to switch to tests which instead generate a random ledger state representative +of not just an initial state, generate a single random valid block, and then test our properties. +The hope is that these will be much more random and easier to maintain.

We have finished a proof of concept are encouraged that this approach could work!

See:

Technical debt

  • pull-3244 massive CI speedup
  • pull-3249 better types for fees in the protocol parameters
  • pull-3264 move our annotator code to the cardano-ledger-binary package where it belongs
  • pull-3239 move the Wdrls type to the Core module.
+ + + + \ No newline at end of file diff --git a/2023-01-20-crypto/index.html b/2023-01-20-crypto/index.html new file mode 100644 index 00000000000..cf5e72f2eeb --- /dev/null +++ b/2023-01-20-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Mithril: We explored whether some uses of transmute could be removed, but it resulted in considerable regression.
  • cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision.
  • KES agent: An inconsistency between contra-tracer available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the contra-tracer used by consensus.

Low level summary

Mithril

  • We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average PR#675. We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing.
  • We are writing a RFP for the audit of the core library.

cardano-base

  • A problem with Nix is blocking merge of PR#341
  • Plutus team ran benchmarks of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution.
  • Team is fully digesting the Plonk paper.
  • There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used.

KES agent

  • A little unforseen delay has been caused by a mismatch in the use of contra-tracer. The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are doing the change, but still the CI is not happy.
  • The same was needed for the KES agents prerequisites PR#317.
  • We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency
+ + + + \ No newline at end of file diff --git a/2023-01-20-hydra/index.html b/2023-01-20-hydra/index.html new file mode 100644 index 00000000000..c4f4c62836e --- /dev/null +++ b/2023-01-20-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1 +specification. Of which a first version has been aggregated and is currently +under review. They aligned the on-chain scripts of reimbursing funds on abort +like defined in the specification, improved the mutation test framework to have +more control when testing plutus scripts. The added HeadId in the API and the +TUI example client make hydra-node easier to use and a first experiment of a +Hydra Head explorer was showing the utility of this - see what Heads exist on +the preview network here.

What did the team achieve this week

  • HeadId to API and display in the TUI #678
  • Experiment of creating a hydra explorer, first result hosted here
  • Improved mutation framework allowing to fail for the right reason #679
  • Correctly reimburse funds in abort (matching the spec) #670
  • Finished a first write-up of the Hydra HeadV1 spec: Read it on overleaf (Communication channels for feedback)

What are the goals of next week

  • Monthly review meeting with a broader audience
  • Groom & plan actions required for a maintainable Head explorer
  • Break “align gaps” feature into smaller chunks (at least on- /off-chain) and groom it
  • Review the spec & discuss individual aborts with researchers (a bigger open question)
+ + + + \ No newline at end of file diff --git a/2023-01-20-network/index.html b/2023-01-20-network/index.html new file mode 100644 index 00000000000..ee7b0f58e2d --- /dev/null +++ b/2023-01-20-network/index.html @@ -0,0 +1,34 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High level summary

We have been working towards cardano-node-1.35.5 release. QA & benchmarking +teams gave a green light for the release, and we made decent progress with some +CI problem which we encountered on the way (PR #4612). We are also working on +peer sharing, making improvements in our testing infrastructure, reducing +technical debt and making progress towards io-sim-1.0.0.0. Galois is making +progress on Handshake improvements.

Low level summary

Our diffusion simulation network now includes a mixed network of initiator +only and initiator and responder nodes. issue #4222

We are now reviewing the peer sharing pull request.

We are also reviewing pull request which introduces handshake query flag. PR #4256

We fixed a bug in our network simulator. The bug was triggered when a node +died when performing a simultaneous TCP open (a corner case of a corner case!). PR #4265

We also refactored Snocket interface and removed the bearer construction from +its methods. PR #4260

We are working towards releasing io-sim-1.0.0.0 on Hackage, which includes +reviewing two PRs: PR #57 and PR #60 as well as writing an announcement +blog post.

+ + + + \ No newline at end of file diff --git a/2023-01-20-sre/index.html b/2023-01-20-sre/index.html new file mode 100644 index 00000000000..87d3818046e --- /dev/null +++ b/2023-01-20-sre/index.html @@ -0,0 +1,25 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 2 min read
Michael Fellinger

High level summary

The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing +support for cardano-world.

Lower level summary

Cicero

  • Fixed various race conditions around transformers.
  • Brought our CI up to date.
  • Migrated to the Nomad exec driver with Nix support for many actions.
  • Moved Nix builds to the Nomad clients for much better cache locality.
  • Ongoing work on vastly improving the action matching and evaluation speed.

Tullia

  • Made it easier to support cloning from a PR's fork
  • Update to latest std
  • Add workaround for cgroup issue: nomad#12877
  • github preset: add github.ci.remote and (read|get)Repository functions
  • Fix various issues around CUE handling

Bitte

  • Upgrade to NixOS 22.11
  • Prototype usage of Colmena for deploys instead of deploy-rs
  • Finalized work on Equinix Metal support
  • Prototype better secrets management with ragenix instead of sops-nix
  • Improve CI and bring it up to date

cardano-world

  • Fixd various OOM issues on preview and preprod
  • Rotated KES keys on preview and preprod
  • Optimize mainnet db-sync to cope with higher load
  • Fix an issue where PostgreSQL would fail after a reboot

bitte-world

  • Updated to NixOS 22.11

ci-world

  • Updated to NixOS 22.11
  • Added Equnix cluster
  • Improve caching of Nix builds
+ + + + \ No newline at end of file diff --git a/2023-01-25-consensus/index.html b/2023-01-25-consensus/index.html new file mode 100644 index 00000000000..032b58b423a --- /dev/null +++ b/2023-01-25-consensus/index.html @@ -0,0 +1,53 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 3 min read
Damian Nadales

High level summary

During the past two weeks, the consensus team finished the testing activities +around the UTxO-HD prototype. This is a very important milestone which will +enable us to run system-level tests and benchmarks, as well as start refactoring +and cleaning the prototype. Regarding our Genesis workstream, we elaborated a +roadmap that gives an indication of the remaining work. We also continued our +work on benchmarking chain-sync-jumping. We also continued working on improving +the way we handle blocks from the future, and advancing the integration of the +new VRF and KES crypto.

Workstreams

UTxO HD Prototype

As the prototype is nearing its completion, it was important to have enough +confidence that we will be able to move additional parts of the ledger state +onto disk. We worked together with the Ledger team to elaborate a +sketch on how the UTxO-HD design would accommodate the migration of +additional data from memory to disk. This gave us enough confidence that the +current architecture will be extensible in the future.

On the testing front, we added property-based tests for the UTxO-HD +type classes.

We also enabled disabled components, and addressed several +technical debt issues:

  • Implement splitSized anti-diff split (#4269), and integrate it +into consensus (#4273).
  • Renaming of peekVal to peekMDBVal (#7).

We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We +found a race condition in the LMDB backing store, which we fixed. +After the fix we were able to successfully run these benchmarks. The results +were published by this pull request.

We used our db-analyser tool to benchmark the cost of reading keys and +flushing values to disk. The following plot shows the duration of these disk +operation in relation to the main ledger operations, where we can see that the +cost of the former are comparatively low. The spike at the beginning of the +graph is when, at the start of the Shelley era, the entire UTxO set is flushed +to disk.

UTxO-HD read and flush benchmarks

After months of hard work adding tests for the prototype, we are ready to run +end-to-end tests on the node, and system level benchmarks. This signals a very +important milestone for the UTxO-HD workstream 🎉.

Genesis

We elaborated a high-level decomposition of the remaining +work for Genesis. We also continued benchmarking the chain-sync-jumping +happy-path.

Technical debt

We continued working on improving the way we handle blocks from the future.

Support

We completed the mapping of Crypto to HeaderCrypto and body Crypto. +HeaderCrypto is moved to cardano-protocol-tpraos. We created a draft pull +request to facilitate compiling consensus.

+ + + + \ No newline at end of file diff --git a/2023-01-25-node-cli-api/index.html b/2023-01-25-node-cli-api/index.html new file mode 100644 index 00000000000..08ae3446720 --- /dev/null +++ b/2023-01-25-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2023-01-25 - 2023-02-07

High level summary

General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the cardano-cli query stake-snapshot command.

Completed

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

In Progress

CI & project mainteance

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-01-26-mithril/index.html b/2023-01-26-mithril/index.html new file mode 100644 index 00000000000..fc2fd92300d --- /dev/null +++ b/2023-01-26-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2302.0 distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes.

Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node.

Low level overview

  • Released the new distribution 2302.0
  • Implemented a backward/forward compatibility mechanism for API messages #688:
    • Implement the mechanism for the signer registration #689
    • Implement the mechanism for the signature registration #693
    • Implement the mechanism for epoch settings #695
    • Implement the mechanism for certificate pending #696
    • Implement the mechanism for certificate #697
    • Implement the mechanism for snapshots list #698
    • Implement the mechanism for snapshot #699
    • Update enforcement of API version with Semver #705
  • Completed the PoC implementation of backward compatibility with protobuf #677
  • Completed the PoC implementation of backward compatibility with avro #678
  • Completed the PoC to Read/Write transaction on chain for Era activations #672
  • Completed the upgrade Cardano devnet to 1.35.4 #523
+ + + + \ No newline at end of file diff --git a/2023-01-27-hydra/index.html b/2023-01-27-hydra/index.html new file mode 100644 index 00000000000..711807edde1 --- /dev/null +++ b/2023-01-27-hydra/index.html @@ -0,0 +1,32 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team had a monthly review meeting with their stakeholders, +contributors and interested people from the community. The monthly repot for +January 2023 is a digest +of the things presented and also includes a summary of the meeting. The Hydra +specification was getting discussed and the team is incorporating suggested +changes of reviewers. Last but not least, they compute and publish script +information on every PR and also on the +website +now.

What did the team achieve this week

  • Had the monthly review meeting with a broader audience
  • Published the monthly report for January 2023
  • Reviewed the spec and discussed individual aborts with researchers
  • Compute and publish script information along benchmarks on every PR and website

What are the goals of next week

  • Add rollback section to Hydra spec, update pictures and publish it as part of repository
  • Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository.
  • Groom & plan actions required for a maintainable Head explorer + break down align gaps feature.
+ + + + \ No newline at end of file diff --git a/2023-02-02-ledger/index.html b/2023-02-02-ledger/index.html new file mode 100644 index 00000000000..f6c5a6b906b --- /dev/null +++ b/2023-02-02-ledger/index.html @@ -0,0 +1,35 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

High level summary

Much of the work the past two weeks involved integration efforts, +cleaning up and debugging some serialization issues, +adding tests, and work on large projects that are still ongoing. +We also released a CIP this week that aims to make the ledger +a registered CIP category.

Lower level summary

Ledger evolution CIP

We published a +CIP +that will make the Cardano ledger a registered category of the CIP process.

Serialization issues

We had previously thought that we had found a serialization problem with the redeemers, +but it turned out to just be particularly confusing code. +We have now clarified the issue for the future.

See pull-3263, pull-3269, and pull-3268.

Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps.

See pull-3277.

New tests

We added a new property test suite for some of our custom containers.

See pull-3270.

Progress on a better cost model serialization situation.

We are still working our way through issue-2902. +Towards this end, we are now properly gating the new flexible encoders +until version 9.

See pull-3274.

Nightly tests

We are still experimenting with moving more CI actions to GitHub actions.

See pull-3276.

Constraint based generators

We continue to add to our proof of concept for constraint based generators. +See the previous ledger update for more information about this project.

+ + + + \ No newline at end of file diff --git a/2023-02-03-crypto/index.html b/2023-02-03-crypto/index.html new file mode 100644 index 00000000000..7ce1afa4185 --- /dev/null +++ b/2023-02-03-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 3 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril.
  • cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting.
  • KES agent: using snockets and making things testable in IOSim
  • MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.

Low level summary

Mithril

  • Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing PR#722
  • We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper.
  • We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.

cardano-base

  • There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381.
  • The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner.
  • The update VRF PR#341 is finally merged, and we are ready to merge PR#344, which implements conversion functions from the compatible types between Praos and PraosBatchCompat.

KES agent

  • Use of snockets to send the data directly from the socket to secure memory.
  • We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives
  • Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.

MuSig2

The GitHub Action linelint is used to check the files.

  • A new job for linting is added to the file /.github/workflows/ci.yml. The rules are configured in the file /.github/workflows/.linelint.yml. Some files from the configuration of libsecp were failing, so in the rules in .linelint.yml the failing files are denoted to be ignored by the linter.
  • Folders are reorganized. We created a folder to handle the example. This folder includes the examplemusig2.c, a distinct config.h, and helper.c. The example is enhanced by implementing the functions in the helper for the configuration given in config.h. The number of messages is different than the tests. The example is made more generic to run with a loop.
+ + + + \ No newline at end of file diff --git a/2023-02-03-goedel/index.html b/2023-02-03-goedel/index.html new file mode 100644 index 00000000000..4a704acd7ed --- /dev/null +++ b/2023-02-03-goedel/index.html @@ -0,0 +1,30 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been preparing several papers for peer review +and knowledge sharing and consulting within IO and the community.

Details

  • R&D Seminar on experience participating in a member based organisation
  • Full day tutorial on performance engineering presented at HiPEAC +2023 conference
  • Finished preparing and submitted a paper on performance engineering +to an ACM workshop
  • Preparing a draft paper for future submission about verifying design +refinements for distributed system design
  • Consulting on performance design of other IO projects
+ + + + \ No newline at end of file diff --git a/2023-02-03-hydra/index.html b/2023-02-03-hydra/index.html new file mode 100644 index 00000000000..4629a576792 --- /dev/null +++ b/2023-02-03-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team completed the Hydra specification with a section about +rollbacks and updated graphs +(#448). In a next step, +the specification will be made more approachable and an open standard. They +improved their hydra-cluster tool to launch a local --devnet sandbox +environment and continued aligning the hydra-plutus scripts with the +specification by hardening the checks on close and contest transactions.

What did the team achieve this week

  • Completed the specification with a section about rollbacks and updated graphs +#448, with a follow-up on making it more approachable and an open standard.
  • Continued spec review with internal auditor and incorporated changes.
  • Talked to TxPipe about how Demeter and Hydra could work together
  • The hydra-cluster executable can be used to launch a local --devnet sandbox environment.
  • Reproduced the “head being stuck on network outage” bug
    • relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed.
  • Progressed with higher velocity by addressing more and more gaps #677

What are the goals of next week

  • Upstream our JSON instances to the ledger
  • Close all transaction security related on-chain gaps
  • Ideally release 0.9.0 with updated scripts
  • Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap
+ + + + \ No newline at end of file diff --git a/2023-02-08-consensus/index.html b/2023-02-08-consensus/index.html new file mode 100644 index 00000000000..235e2a00fb9 --- /dev/null +++ b/2023-02-08-consensus/index.html @@ -0,0 +1,42 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

We continue refactoring the UTxO HD prototype while we wait for the system level +benchmarks. We have created a new repository that contains the anti-diff +packages used in this prototype.

On the Genesis front, we are preparing another meeting with the researchers to +audit the implementation design, and we continued working on basic tests and +simplifications.

During the past two weeks we also introduced two new tools. One for dumping CBOR +encoded blocks to JSON, and another to serve a local immutable DB.

Workstreams

UTxO HD Prototype

We are in the process of refactoring the UTxO HD prototype, while we wait for +the system level benchmarks to confirm if the performance of the prototype is +satisfactory.

We also set up a repository for the anti-diff package, which +required us to refactor the code, write documentation, and prepare a release to +CHaP.

Genesis

We worked on basic tests for the Limit on Eagerness property of +Genesis. We also introduced further robustness and simplifications in the +Genesis Density governor. Finally, we developed a presentation to engage again +with the researchers on our Genesis implementation design.

Technical debt

Fostering collaboration

We are in the process of polishing the ouroboros-consensus +documentation site, which we will use a the entry point for Consensus related +documentation. The first version will not be complete, but we plan on +systematically improving it.

Support

We added a tool to ouroboros-consensus-cardano-tools which allows +to dump the Chain DB blocks or any given CBOR encoded blocks as JSON.

We also added another tool that serves an existing immutable DB via +BlockFetch and ChainSync. This tool can help in assisting our local benchmarking +efforts (for instance Genesis' ChainSync jumping prototype).

+ + + + \ No newline at end of file diff --git a/2023-02-08-node-cli-api/index.html b/2023-02-08-node-cli-api/index.html new file mode 100644 index 00000000000..46051f81712 --- /dev/null +++ b/2023-02-08-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2023-02-08 - 2023-02-21

High level summary

More maintenance and resolving raised issues.

Completed

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

In Progress

CI & project mainteance

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-02-08-performance-and-tracing/index.html b/2023-02-08-performance-and-tracing/index.html new file mode 100644 index 00000000000..e753ecb9dad --- /dev/null +++ b/2023-02-08-performance-and-tracing/index.html @@ -0,0 +1,24 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Serge Kosyrev

High level summary

  1. SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions.
  2. Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks.
  3. New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node.
  4. New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide.
  5. Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live.
  6. Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on.
  7. Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.

Performance

We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:

  • we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,
  • after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,
  • finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.

In addition, we started benchmarks of the 1.35.6 release.

Tracing

A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way.

Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting.

Infrastructure

On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders.

The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment.

The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops.

+ + + + \ No newline at end of file diff --git a/2023-02-09-mithril/index.html b/2023-02-09-mithril/index.html new file mode 100644 index 00000000000..5b764d82a1d --- /dev/null +++ b/2023-02-09-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2304.1 distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store.

Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version 1.35.5 on their devnet and infrastructure.

Low level overview

  • Released the new distribution 2304.1
  • Fixed a bug that prevented some signers to sign with 2304.0-prerelease #716
  • Completed the implementation of an EraChecker that checks if an era is active #708
  • Completed the implementation of an EraReader that gathers era activation data #709
  • Completed the implementation of an EraReader adapter with on chain transaction as source #710
  • Completed the relational design of the aggregator store #476
  • Completed adding a new SPO on the testing-preview network #729
  • Completed the upgrade of the Cardano node to 1.35.5 #725
  • Fixed flakiness in the CI #734
+ + + + \ No newline at end of file diff --git a/2023-02-10-hydra/index.html b/2023-02-10-hydra/index.html new file mode 100644 index 00000000000..04e3dd418e1 --- /dev/null +++ b/2023-02-10-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team closed several gaps to align the Hydra scripts +implementation further with the specification. This also resulted in a slight +improvement on Hydra script size and costs. They consequently analysed the +asymptotic complexity of collect and fanout and how they relate. Also plutus-tx +profiling toolchain was evaluated and set up for future improvements on Hydra +on-chain performance. In discussions with researchers and internal auditors, +they also uncovered next steps on further securing the Head protocl using a +"full" minting policy.

What did the team achieve this week

  • Closed several gaps to align script implementation with specification #452
    • Allow contest only once #680
    • Optimization through head output at index 0 #700
    • Value is preserved #702 + optimized exact value equality #709
  • Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to #721
  • Fixed our tooling around the Haskell language server
  • Discussed full minting policy with researchers
  • Started grooming “what we need for mainnet” on this idea ticket and milestone

What are the goals of next week

  • Implement full minting policy
  • All remaining protocol discrepancies are implemented or groomed as individual features
  • Ideally release 0.9.0 with updated scripts
  • Discuss what we need for mainnet (milestone planning)
  • Redraw transaction graphs for specification (upon feedback)
+ + + + \ No newline at end of file diff --git a/2023-02-17-crypto/index.html b/2023-02-17-crypto/index.html new file mode 100644 index 00000000000..4855cd8bbce --- /dev/null +++ b/2023-02-17-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration.
  • cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus.
  • KES agent: using snockets and making things testable in IOSim
  • MuSig2: started implementation in rust.

Low level summary

Mithril

  • Transmute helpers merged PR#722
  • We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope.
  • We are working in a modification of KES to require caller to allocate the secret key buffer.
  • Proposed a solution for signer registration of Mithril.

cardano-base

  • Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 proof.
    • Results are promising, with using only 23% of the execution budget to verify a realistic proof.
    • Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril.
  • KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this.
  • Conversion finally merged PR#344.

KES agent

  • Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation
  • Figuring out how to go from fake file descriptor to write the raw bytes

MuSig2

  • Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.
+ + + + \ No newline at end of file diff --git a/2023-02-17-goedel/index.html b/2023-02-17-goedel/index.html new file mode 100644 index 00000000000..affeb397b44 --- /dev/null +++ b/2023-02-17-goedel/index.html @@ -0,0 +1,31 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on drafts of two papers and one +technical report, distributivity properties of deltaQ, and consulting +on performance design with the Marlowe team.

Details

  • Processing reviews on performance engineering paper and planning +paper revisions accordingly

  • Investigating distributivity properties of DeltaQ

  • Preparing sections on the thorn calculus and idempotency laws for +draft paper about verifying design refinements for distributed +system design

  • Consulting on performance design with Marlowe team

+ + + + \ No newline at end of file diff --git a/2023-02-17-hydra/index.html b/2023-02-17-hydra/index.html new file mode 100644 index 00000000000..01469187e45 --- /dev/null +++ b/2023-02-17-hydra/index.html @@ -0,0 +1,28 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team completed work on dealing differently with contests +during the contestation period. These will now always push out the deadline and +hence contestation periods are easier to pick (depending on the network a Head +runs on). Furthermore, they added an important acceptance test and completed +internal refactoring of the protocol logic making future changes easier.

What did the team achieve this week

  • Push contestation deadline on each contest #716
  • Wrote an acceptance (property) test can always close/fanout when collect is successful
  • Internal refactoring of our HeadLogic
  • Groomed remaining things from #452 into dedicated features

What are the goals of next week

  • Complete full minting policy #720
  • Release 0.9.0 with updated scripts
  • Plan mainnet milestone and a 0.10.0 version
  • Redraw transaction graphs for specification (upon feedback)
  • Have smoke tests fixed and running regularly
+ + + + \ No newline at end of file diff --git a/2023-02-17-ledger/index.html b/2023-02-17-ledger/index.html new file mode 100644 index 00000000000..7d99ab6ae5f --- /dev/null +++ b/2023-02-17-ledger/index.html @@ -0,0 +1,47 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Jared Corduan

High level summary

This past two weeks saw many months worth of ledger changes integrated with the cardano-base +and ouroboros-network repositories. +The vast majority of the effort involved all the changes to the ledger serialization libraries +(and the interplay with cardano-base) which now support proper versioning. +Supporting the conway ledger era, and in particular allowing the ledger state to transition +to a whole new system of governance, also played a noticeable part in the integration.

Besides the integration work, the team continues to address technical debt, improve the +documentation, make our testing infrastructure better (such as experimenting with better +nightly tests), and formally specifying more parts of CIP-1694.

Lower level summary

Integration work

Below is all the integration work completed, which will enable a release to node from +the current ledger master. Many thanks to +Alexey for this colossal undertaking!

Technical debt

Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted +in the CBOR specification. See pull-3241.

We now have our .cabal files being checked for a consistent formatting given by +cabal format in our CI. See pull-3286.

We are still experimenting with better nightly tests for our long running +property based tests. See pull-3276 and pull-3296.

Small documentation improvements

The hand proofs of the preservation ADA property have been added back to the +Shelley ledger specification. See pull-3295.

We have clarified how the script integrity hash is computed in the CDDL description. +See pull-3290.

Specifying CIP-1694

Our new formal specifications backed by Agda have seen a lot of progress! +Upgrading to Agda 2.6.3 fixed our main build infrastructure problems, +and we no longer have to rely on our custom fork. See pull-50.

Our progress on formally specifying CIP-1694 can be followed here:

Constraint based testing

We are still actively working on our new constraint based property testing framework. +We have nearly all of the constraints for an entire ledger state +hooked into generators, and tests that the generators do indeed obey the constraints. +The variable count in the constraints is over 100! +There is still much work to do on shrinking, making the generators faster, +and writing actual property tests for the ledger, but the approach still seems viable and +we are hopeful that it could replace our trace generators. +The WIP can be followed here: pull-3219.

+ + + + \ No newline at end of file diff --git a/2023-02-17-network/index.html b/2023-02-17-network/index.html new file mode 100644 index 00000000000..d1536439489 --- /dev/null +++ b/2023-02-17-network/index.html @@ -0,0 +1,32 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· One min read
Marcin Szamotulski

High level summary

Recently QA found a bug in P2P code, which results in busy loops. We added one +fix to 1.35.6 release, another one will likely be part of next release. The +first one is already included in ouroboros-network-0.3.0.1 release. These +bugs could only affect nodes which are out of sync and thus should not impose +risk on well maintained nodes on mainnet. We also advertise to deploy at most +one of the relays as a P2P node, which shields from possible consequences.

We recently finished design phase of eclipse evasion and we started +implementing it (see issue #3886 for progress).

Galois finished implementing Handshake extension which will allow to query +network protocol versions (see pr #4256).

We also recently released a newer set of network packages to be integrated with +cardano-node master branch, this includes:

* monoidal-synchronisation-0.1.0.2
* cardano-client-0.1.0.2
* network-mux-0.3.0.0
* ouroboros-network-api-0.1.0.0
* ouroboros-network-protocols-0.2.0.0
* ouroboros-network-testing-0.2.0.1
* ouroboros-network-mock-0.1.0.0
* ouroboros-network-framework-0.3.0.0
* ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included
in `0.3.0.1`)
+ + + + \ No newline at end of file diff --git a/2023-02-21-db-sync/index.html b/2023-02-21-db-sync/index.html new file mode 100644 index 00000000000..56c85a72033 --- /dev/null +++ b/2023-02-21-db-sync/index.html @@ -0,0 +1,35 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

The db-sync team created a new tag 13.1.0.2 which is ready to release. +We also investigated and had the first working UTxO-HD integration which is one +of the potential future risks for db-sync.

Low level summary

  • Integrated the UTxO-HD feauture branch in kderme/utxo-hd-1. This doesn't +use the full on disk storage but keeps things in memory and the plan is to keep +it this way for the first iteration. The integration still has some performance +issues which we investigate
  • Created tag 13.1.0.2 which upgrades the dependencies of db-sync
  • Fixed an issue related to errors appearing in SMASH +#1353
  • Continued with ghc-9.2 integration +#1339
  • Worked on an new fixing procedure for +#1348. +We try to make these procedures work also on older schema version, without the +need to migrate to newer schema, which can be very useful for fixing existing +snapshots.
+ + + + \ No newline at end of file diff --git a/2023-02-22-consensus/index.html b/2023-02-22-consensus/index.html new file mode 100644 index 00000000000..a5f874ef700 --- /dev/null +++ b/2023-02-22-consensus/index.html @@ -0,0 +1,59 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 3 min read
Damian Nadales

High level summary

During the past two weeks we got the results from the system level benchmarks +for UTxO HD. They showed a substantial performance regression, so we spent some +time analyzing the results. We found out the frequency at which ledger snapshots +were taken was too high, so we requested the benchmarking team a new run with a +more realistic snapshotting policy. We continued refactoring and improving the +prototype, and we released UTxO-HD related packages to CHaP.

We met with IOG researchers and networking specialists to discuss the Genesis +design, which was well received. We continued working on testing and +benchmarking different Genesis prototypes.

We are also working on solving a test failure related to iterators. This work +derived in several improvements such as better documentation, a framework for +writing unit (and regression) tests, and the possibility of debugging +QuickCheck counter examples in the REPL.

Finally, we released ouroboros-consensus 0.2.0.0 and +ouroboros-consensus-cardano 0.3.0.0 to CHaP

Workstreams

UTxO HD Prototype

We got the results of the first system level benchmarks for UTxO HD. They seemed +to indicate a significant regression in performance. After looking into the +benchmark logs we found that the benchmark runs took ledger state snapshots too +often, due to the default snapshotting policy depending on k, and k being so +small in the benchmark runs. Therefore, the next step is to re-run the +benchmarks with a snapshotting policy that more closely resembles the one from +mainnet.

At the same time, we continued refactoring and cleaning up the prototype.

Also, we prepared the anti-diff packages (fingertree-rm, diff-containers, +simple-semigroupoids) and the lmdb related packages (cardano-lmdb and +cardano-lmdb-simple) to CHaP.

Genesis

The Genesis design was presented to the IOG researchers and Peter Thompson from +NSol. It was well received. They pointed out one blindspot, but we think it'll +be relatively simple to mitigate.

In parallel, we continued developing test and benchmarks for the Genesis +prototypes. I particular we tested and implemented a potential fix for +increased ChainDB dequeue timings, which partly +behaved as we expected, but still needs further investigation. Also we obtained +new benchmarking data for the prototype.

Technical debt

Related to #4183, we developed a DSL for specifying +ChainDB unit tests. This will allow us to better understand the +counter-examples returned by QuickCheck tests, and to write regression +tests for them. Also, we added a module to enable +QuickCheck counter-examples to be run on the REPL, allowing for faster debugging +feedback. Also, we improved the documentation related to followers +(#4372).

We are also working on a design for optimizing the way we handle blocks from the +future.

Support

We released ouroboros-consensus 0.2.0.0 and ouroboros-consensus-cardano +0.3.0.0 to CHaP. Remember that we decided to split the packages related to +Consensus into two bundles, one with the core functionality, Cardano-agnostic +code, and another bundle with instantiations specific to Cardano.

+ + + + \ No newline at end of file diff --git a/2023-02-22-node-cli-api/index.html b/2023-02-22-node-cli-api/index.html new file mode 100644 index 00000000000..6c134c8b71a --- /dev/null +++ b/2023-02-22-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2023-02-22 - 2023-03-07

High level summary

General bug fixes

Completed

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

In Progress

Documentation

CI & project mainteance

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-02-23-mithril/index.html b/2023-02-23-mithril/index.html new file mode 100644 index 00000000000..793dc9e4389 --- /dev/null +++ b/2023-02-23-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2306.0 distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes’ CLI that allows generating and signing an era marker’s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI.

Low level overview

  • Released the new distribution 2306.0
  • Completed the epic that implements signer versions deployment monitoring #718:
    • Completed the implementation an event producer/consumer via channel #738
    • Completed the creation of a database and its configuration to save the events on the consumer side #740
    • Completed the creation of events and sending them on the channel on the producer side #741
    • Completed the creation of the signer registration event #742
    • Completed the creation a query to extract the node versions stakes distribution #743
  • Worked on the epic that implements eras behavior switch #707:
    • Completed the loading of era reader adapters from config in the signer and the aggregator #732
    • Completed the implementation of an era cli command in the aggregator #755
    • Completed the implementation of a dynamic matrix of cases in CI end to end tests #760
  • Fixed some bugs:
    • Fixed the unsupported unixepoch() function #757
    • Fixed the problem that prevented some signers from signing on the testing-preview network #730
    • Update SQLite version to 3.40 in aggregator infrastructure #765
+ + + + \ No newline at end of file diff --git a/2023-02-23-performance-and-tracing/index.html b/2023-02-23-performance-and-tracing/index.html new file mode 100644 index 00000000000..86ab2e3501a --- /dev/null +++ b/2023-02-23-performance-and-tracing/index.html @@ -0,0 +1,24 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg
  • SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.
  • Release benchmarking: we performed a round of benchmarks for the 1.35.6 release.
  • UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup.
  • New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities.
  • Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure.
  • Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.

Performance

SECP

  1. For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead.
  2. The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run.
  3. The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking.

UTxO-HD

  1. After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop.
  2. We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.

1.35.6 release

Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health.

Tracing

Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible.

Infrastructure

Nomad backend

  1. Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients.
  2. Locality assumptions were removed and job monitoring was refactored.
  3. To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster.
  4. We're currently evaluating different options for genesis distribution in said cluster.

NixOps backend

The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery.

+ + + + \ No newline at end of file diff --git a/2023-02-24-hydra/index.html b/2023-02-24-hydra/index.html new file mode 100644 index 00000000000..837532cb68b --- /dev/null +++ b/2023-02-24-hydra/index.html @@ -0,0 +1,37 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa

High-level summary

This week, the Hydra team continue closing many gaps and aligning the +implementation with the specification. More over, they have groomed a plan to +make Hydra Mainnet compatible. Also, they continue moving forward with the +internal auditing and have published some auditing guidelines to receive +contributions from the community.

What did the team achieve this week

  • Completed #452 (what is +remaining in there)
  • Aligned the Head protocol logic implementation with the specification
  • Completed full minting policy implementation and spec +#720
  • Clarified message authentication with researchers
  • Groomed what is left to do for Mainnet compatibility +#713 and drafted a +0.10.0 version
  • Added a tutorial by @perturbing to the +website LINK
  • Published auditing guidelines +LINK
  • Made hydra-node work for macos +#746 and added support +for building on aarch64 +#673
  • Met with a potential customer of Hydra for Payments

What are the goals of next week

  • Have the monthly review meeting incl. the report
  • Have smoke tests fixed and running regularly
  • Release 0.9.0 with updated scripts
  • Redraw transaction graphs for specification
+ + + + \ No newline at end of file diff --git a/2023-03-02-network/index.html b/2023-03-02-network/index.html new file mode 100644 index 00000000000..898aabe5f25 --- /dev/null +++ b/2023-03-02-network/index.html @@ -0,0 +1,44 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High level summary

In the current sprint the networking team focused on fixing bugs and pushing +forward implementation of eclipse evasion. We also found a bug in our +simulation testing setup (in integration of test node). We also overviewed the +work on extending handshake protocol which is delivered by Galois Inc.

We published ouroboros-network-0.4.0.1 and +ouroboros-network-protocols-0.3.0.0 to CHaP.

We also fixed a bug in cardano-node which results in not being able to +configure inbound connection limits, see PR #4902.

Together with Karl Knutsson (CF) we realised an issue in cardano-cli: it's +validation of DNS names, IP address & ports when registering a stake pool +should be more strict to protect against common mistakes which we identified on +the chain. See issue #4929.

Detailed work log

In PR #4385 we fixed two bugs in peer state actions. First one results in +a busy loop if demotion from hot to warm times outs. This busy loop is +eventually exited when mux exits (we reported this in our previous report). +This fix made it to 1.35.6 release as well.

In addition the PR #4385 also fixes another bug which results in hot -> warm +-> hot demotion / promotion busy loop.

The PR #4385 also fixed a bug in a node only used in simulation which +resulted in not using chain-sync or block-fetch mini-protocols. In the +review process, we realised that the header-body split in the simulated node +requires further work (see PR #4419, which is under review).

The PR #4385 also extend our generators, which together with the above fix, +cover the hot -> warm -> hot demotion / promotion busy loop.

In PR #4419 we introduce a ChainDB for our simulation node, which plays +similar role to ChainDB in the ouroboros-consensus: a persistent (across +simulated restarts) store of blocks which does chain selection. This ensures +that the simulated node is using block-fetch to download blocks announced by +chain-sync mini-protocol.

We also made progress with reviewing PR #4019 - peer sharing.

We also fixed issue #4370 - a connection manager test failure, see PR #4384.

+ + + + \ No newline at end of file diff --git a/2023-03-03-crypto/index.html b/2023-03-03-crypto/index.html new file mode 100644 index 00000000000..147b67371f3 --- /dev/null +++ b/2023-03-03-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit.
  • cardano-base: BLS branch is now ready for review. We are workign forward its merge.
  • KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase.
  • Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs

Low level summary

Mithril

  • Bumped to version 0.2.0 the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using mlock.
  • Opened PR#783 to update dependency
  • Improved testing for batch opening of mtree, PR#773
  • Improved testing for batch verification of STM sigs PR#774
  • RFP for crypto audit almost ready.

cardano-base

  • BLS12-381 branch finally ready for review PR#266

KES agent

Team off for one week. Other progress:

  • Learning about raw direct-bearer abstraction. An interface for sockets in consensus.
  • use that for direct ser/deser
  • written those syntaxes for ouroboros (coming PR)
  • the kes agent will depend on that.

Sidechains

Progress with familiarisation of Halo2 library to write circuits.

+ + + + \ No newline at end of file diff --git a/2023-03-03-goedel/index.html b/2023-03-03-goedel/index.html new file mode 100644 index 00000000000..0e884a5edac --- /dev/null +++ b/2023-03-03-goedel/index.html @@ -0,0 +1,34 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on drafts of two papers and one +technical report, improving the deltaQ tutorial, consulting on +performance design, and the Djed paper has been accepted for +publication.

Details

  • Preparing draft of DeltaQSD algebra paper for FORTE 2023

  • Extending the technical report on which the above paper is based

  • Consulting with an external company on performance engineering of Plutus contracts

  • Planning improvements and collecting material for the deltaQ +tutorial based on experience with systems that manage risk at +multiple timescales

  • Preparing sections on the communication language and idempontency +laws for draft paper about verifying design refinements for +distributed system design

  • Studying Cardano chain sync protocol

  • "Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin +Protocol" has been accepted for publication at IEEE ICBC 2023

+ + + + \ No newline at end of file diff --git a/2023-03-03-hydra/index.html b/2023-03-03-hydra/index.html new file mode 100644 index 00000000000..0bd8d783e92 --- /dev/null +++ b/2023-03-03-hydra/index.html @@ -0,0 +1,33 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team released version +0.9.0 - a version +of the hydra-node with fully specified behavior of on-chain scripts and +off-chain head-logic, decreased costs for opening/closing a Head and scalable +contestation deadline semantics. Check out the full release notes for details.

Furthermore, they published the monthly +report of the Hydra project +and conducted a review meeting with an increasingly wider audience. The team +plans to extend invitations through the new Hydra +#announcements discord channel for the next +months, stay tuned!

What did the team achieve this week

  • Monthly review meeting with report published on website
  • Fixed smoke tests #726
  • Reduced the cost of opening/closing a Head (error codes #748 + head reference script #701)
  • Released version 0.9.0
  • Conducted a first experiment on mainnet compatibility #713
  • New discord category with #announcements channel
  • Received a demo about the Hydra for Voting project
  • Lightning talk on mutation-based testing (to be shared)
  • New themes view in on our roadmap and some rearranging as we align it with high-level objectives
  • Clarified things with researchers, but mostly identified action items for them

What are the goals of next week

  • Redraw transaction graphs and address TODOs specification
  • Run hydraw with 0.9.0 on preprod
  • Make smoke tests on mainnet possible
  • Groom the explorer item
  • Unblock the auctions projecth with commit from script a solution
+ + + + \ No newline at end of file diff --git a/2023-03-03-ledger/index.html b/2023-03-03-ledger/index.html new file mode 100644 index 00000000000..d2482f62b21 --- /dev/null +++ b/2023-03-03-ledger/index.html @@ -0,0 +1,35 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

High level summary

We have focused the last two weeks on CIP-1694, integration of the last several months of ledger +work into consensus and node, and testing infrastrutcture that we will use in the conway ledger era.

Low level summary

Conway rules

We made a major update to the conway era so that the implementation is now in sync with the spec +with respect to the ratification and enactment logic.

See the notes in pull-3291 for more details.

Constraint based generators

This week we hit a major milestone in our efforts to build out better property based testing +support for the main ledger properties. +The new constraint based generators can now generate full ledger states with what is probably +very close to the real constraints (if anything, it is under constrained). +Next we will work on generating a transaction in the context of a ledger state, which would allow +us to actually start using these generators for real tests.

See pull-3219.

Preparing a release, now with proper versioning

After quite some time, we are ready to release a version of ledger that will work with a new +version of consensus, using CHaPs.

See pull-3308.

Technical debt

  • We cleaned up the redeemer serialization code (to prevent future mistakes). See pull-3269.
  • We added a note to the Alonzo spec, specifying that the transaction inputs are +lexicographically ordered in the Plutus script context. See pull-3306.
  • We fixed a problem with the address deserialiazation +(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway). +See pull-3307.
  • We fixed a problem with our nix build. See pull-3311.
  • We fixed a problem with our NoThunks tests. See pull-3310.
  • We improved our nightly tests. See pull-3316.
+ + + + \ No newline at end of file diff --git a/2023-03-08-consensus/index.html b/2023-03-08-consensus/index.html new file mode 100644 index 00000000000..45401cd01a8 --- /dev/null +++ b/2023-03-08-consensus/index.html @@ -0,0 +1,53 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 3 min read
Damian Nadales

High level summary

The Consensus team continued working on refactoring and improving the UTxO-HD +prototype, and introducing improvements to the lmdb related packages. In +particular we identified an opportunity to gain performance by handling locks in +a more optimal way.

On the Genesis front, we sketched a mitigation for an issue that PNSol and +Researchers caught. We also came op with a road map for not only testing the +Genesis prototypes, but also for enriching the tests we already have.

Regarding technical debt, next to some minor improvements, we created +component-level micro-benchmarks for adding transactions to the mempool. The +results of these benchmarks will be published in the ouroboros-consensus web +page.

We also finished moving the Consensus documentation to the ouroboros-consensus +repository, released ouroboros-consensus 0.3.0.0, and reduced the time +GitHub actions take in ouroboros-network.

Workstreams

UTxO HD Prototype

We continued working on refactoring and improving the UTxO-HD prototype. As a +result of the first round of sytem-level benchmarks, we identified an +opportunity to optimise the way we handle locks to improve performance +(#4393).

Also, we introduced several improvements to the lmdb related packages:

Genesis

We sketched out a mitigation of the issue that PNSol and Researchers caught in +the Genesis design.

We came up with a road map for testing the Genesis prototypes, including early +milestones that are applicable to today's master branch, ie tests that are +useful before Genesis, and that will be nicely enriched when we do add Genesis.

We developed the aforementioned tests, specifically a QuickCheck generator for +the Honest leader schedule and one as-aggressive-as-possible Adversarial +leader schedule that together satisfy the Praos properties that the Consensus +design takes as invariants.

We investigated why the improved ChainDB queueing implementation behaves +differently in the baseline compared to the prototype, and we are close to +having a full picture of how the Consensus components interact during bulk sync.

Technical debt

We created component-level micro-benchmarks for adding transactions +to the mempool. We plan on extending this to more mempool actions and different +types of blocks. We store the benchmark data to make it available +to the GitHub action that publishes the benchmarks results.

Other minor improvements include:

  • Removal of Test.Util.Classify in favour of Test.StateMachine.Labelling.
  • Addition of -Wunused-packages to the default ghc-options for Consensus +packages.

Fostering collaboration

We finished moving the Consensus documentation from +ouroboros-network to ouroboros-consensus, in preparation for +migrating the code to the latter repository.

Support

We released ouroboros-consensus 0.3.0.0.

We reduced the load in the ouroboros-network GitHub actions, +thereby reducing the time CI jobs take.

+ + + + \ No newline at end of file diff --git a/2023-03-08-node-cli-api/index.html b/2023-03-08-node-cli-api/index.html new file mode 100644 index 00000000000..daaf44c3e47 --- /dev/null +++ b/2023-03-08-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· One min read
Jordan Millar

2023-03-08 - 2023-03-21

High level summary

General bug fixes and some refactoring

Completed

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-03-08-performance-and-tracing/index.html b/2023-03-08-performance-and-tracing/index.html new file mode 100644 index 00000000000..e9f5e8317fb --- /dev/null +++ b/2023-03-08-performance-and-tracing/index.html @@ -0,0 +1,29 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Michael Karg
  • Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.
  • New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users.
  • Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination.
  • Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation.
  • Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.

Performance

1.35.6 release

Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health.

Analysis pipeline

Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better +differentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance. +Additionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking +data more easily accessible.

Open Sourcing

As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable +third parties to make use of that data much more easily, by having reliable guidelines and a working example.

Tracing

The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make +the switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process.

Infrastructure

Nomad backend

The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented.

+ + + + \ No newline at end of file diff --git a/2023-03-09-mithril/index.html b/2023-03-09-mithril/index.html new file mode 100644 index 00000000000..dfe6273f8db --- /dev/null +++ b/2023-03-09-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano mainnet and computes the stake distribution with the optimized unreleased Cardano CLI command.

Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup.

Low level overview

  • Worked on the epic that implements eras behavior switch #707:
    • Completed the deployment of the era behavior switch to the test networks #752
    • Completed the enhancement of datum generation for era markers #786
    • Worked on handling the API version with an era switch #727
  • Worked on the epic that implements a relational store in the aggregator #779:
    • Worked on the migration/adaptation of the stake_pool table #787
  • Completed the refactoring of errors in the signer and aggregator state machines #665
  • Worked on testing Mithril with a mainnet Cardano network #777
  • Worked on fixing bugs with the Docker client image:
    • Fixed a bug that made the Docker client container crash at startup #769
    • Fixed a bug that prevented the restoration of a snapshot with a Docker client #791
    • Worked on testing the Docker client in the Mithril Client multi-platform test workflow #794
+ + + + \ No newline at end of file diff --git a/2023-03-10-hydra/index.html b/2023-03-10-hydra/index.html new file mode 100644 index 00000000000..d797a1ea1f1 --- /dev/null +++ b/2023-03-10-hydra/index.html @@ -0,0 +1,28 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team addressed issues with committing complex UTxOs into a +Hydra Head, prepared the hydra-node to be run on mainnet (soon) and improved +the test suite of the hydra-plutus scripts. The specification is constantly +getting improved upon reviewer feedback on overleaf - this week the graphical +notation was refined to be more transaction-focused.

What did the team achieve this week

  • Clarified bug of committing UTxOs with reference scripts to a Hydra head #737
  • Prepare usage of hydra-node on mainnet by updating command line options #715
  • Improved our mutation test suite to all expected errors #705
  • Re-opened our persistent hydraw demo head on preprod using version 0.9.0
  • Updated on-chain graphs to be more transaction-focused in the specification

What are the goals of next week

  • Complete mainnet compatibility feature
  • Prepare the Hydra workshop
  • Address all todo’s in the Hydra specification
  • Unblock the auctions project with commit from script a solution
+ + + + \ No newline at end of file diff --git a/2023-03-16-goedel/index.html b/2023-03-16-goedel/index.html new file mode 100644 index 00000000000..a0f5c5d36cc --- /dev/null +++ b/2023-03-16-goedel/index.html @@ -0,0 +1,31 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on drafts of two papers +improving the deltaQ tutorial, consulting on performance design, and +the final version of the Djed paper.

Details

  • Preparing draft of DeltaQSD algebra paper for ICE 2023

  • Successful outcome of Marlowe consultancy leading to substantial +improvement in performance

  • Preparing sections on the communication language and bisimulation +proofs for draft paper about verifying design refinements for +distributed system design

  • Camera ready version of Djed paper under preparation

+ + + + \ No newline at end of file diff --git a/2023-03-17-crypto/index.html b/2023-03-17-crypto/index.html new file mode 100644 index 00000000000..58168cf5adc --- /dev/null +++ b/2023-03-17-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Mithril: RFP finished. Code ready for audit.
  • cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams.
  • KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing.
  • Sidechains: Preparing proving system to use the curves needed for main-net PoC.

Low level summary

Mithril

  • Merged PR#783
  • RFP for crypto audit ready.

cardano-base

  • BLS12-381 branch approved PR#266. Blocker is Windown's CI. Working on it
  • Testing strategy for BLS bindings:
    • Preparing test-vectors for Groth16, and simple BLS signatures
    • Finding community projects to help write their use cases
    • Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)
  • Wrote blogpost on how using the same key for ed25519 and VRF completely breaks the security of both systems

KES agent

  • Started integration of sockets interface used in consensus
  • Use that for de/ser
  • Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim
  • Results in having to parametrise for IOSim in KES and DSIGN for testing

Sidechains

  • Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages.
  • Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS.
  • EdDSA over JubJub ready
+ + + + \ No newline at end of file diff --git a/2023-03-17-hydra/index.html b/2023-03-17-hydra/index.html new file mode 100644 index 00000000000..215a4e68cae --- /dev/null +++ b/2023-03-17-hydra/index.html @@ -0,0 +1,36 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team has continued work on the mainnet compatibility of the +hydra-node. They added a golden test suite for hydra-plutus scripts, added +some detection of hydra-node misconfiguration, established a limit of 100 ADA +per commit and other smaller tasks to prepare for a mainnet beta release.

Next week there will be a small team workshop to push for demonstrating a Hydra +Head on the Cardano mainnet, ideally just in time for the monthly review +meeting. See the hydra channels on the IOG Technical Community discord server +for details.

What did the team achieve this week

  • Implement a 100 ADA hard-coded commit limit in the hydra-node +#763
  • Pay back funds to faucet after smoke-test run +#773
  • Setup custom github runner for smoke-tests on mainnet +#775
  • Created golden tests to assure the script hash stays the same between +changes #772
  • Removed hardcoded error codes in plutus scripts +#768
  • Detect misconfiguration of a hydra-node given persistent state +#767
  • Met with potential users for hydra-pay
  • Prepared hydra workshop

What are the goals of next week

  • Hydra monthly meeting
  • Open a multi-party head on mainnet
  • Complete mainnet compatibility feature
+ + + + \ No newline at end of file diff --git a/2023-03-17-ledger/index.html b/2023-03-17-ledger/index.html new file mode 100644 index 00000000000..2f97e387fda --- /dev/null +++ b/2023-03-17-ledger/index.html @@ -0,0 +1,33 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

High level summary

We made further progress on the conway ledger era. +In particular, we expanded the ledger API significantly, including lots of governance features. +We also made progress on the specification and corresponding work in the Haskell implementation.

We also continued to integrate the latest ledger packages into cardano node and addressed +technical debt.

Low level summary

Expanded ledger API

The ledger API was significantly expanded to include:

  • a lot of protocol parameter support
  • versioning support (type level ledger eras and protocol versions)
  • auxiliary data support
  • many new lenses
  • support for witnesses
  • support for conway governance

See pull-3328.

Conway ledger rules

We have made progress on the formal ledger specification for the Conway era. +Moreover, the corresponding Haskell updates were also completed:

Incremental SPO/DRep stake distribution computation

We have a working (and correct) proof of concept for how to use the incremental lambda calculus +to maintain several of the stake distributions incrementally. +For the per-SPO distribution, this is a performance improvement. +For the (conway) per-DRep distribution, this is will allow those who have delegated their votes +to a DRep to have time to react to any votes that they disapprove of. +(Sorry, no code to share just yet, more to come.)

Technical debt

+ + + + \ No newline at end of file diff --git a/2023-03-21-network/index.html b/2023-03-21-network/index.html new file mode 100644 index 00000000000..25b17d03843 --- /dev/null +++ b/2023-03-21-network/index.html @@ -0,0 +1,41 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High level summary

In the last spring we released cardano-node-1.35.6 with dynamic P2P +functionality.

We received reports from some SPOs who encountered problems with their non +P2P block producing nodes not being able to connect to their P2P relay. Karl +Knutsson (from Cardano Foundation) reproduced this issue between two nodes (a +non P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed +it and found a bug in the legacy non p2p code. The bug is only possible to +trigger with a P2P node which is binding its outbound connection port to +a fixed IP address and port (default in p2p). A possible solution was found. +For more information see #4465.

We released cardano-ping-0.1.0.0 package to CHaP. cardano-ping is no +longer available as a standalone binary, but instead it will become part of +cardano-cli (see #4664)

We are testing cardano-node with peer sharing functionality (#4019).

We are working on eclipse evasion. We added new class of peers: big ledger +peers to the outbound governor, implemented tests and fixed found issues +(#4462). We also made the information if a given peer plays the role of +a big ledger peer to the mini-protocols. This will allow to modify +mini-protocol applications for such peers. As part of this functionality we +refactored some core types in the network code which simplifies exposed API.

Together with Moritz Angerman we started to update io-sim to ghc-9.6.1 (see +#73).

We merged a fix of configuration of accepted connections limit in +cardano-node (see #4902).

+ + + + \ No newline at end of file diff --git a/2023-03-22-consensus/index.html b/2023-03-22-consensus/index.html new file mode 100644 index 00000000000..63774baccdc --- /dev/null +++ b/2023-03-22-consensus/index.html @@ -0,0 +1,30 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

This week the consensus team continued working on the refactoring of the UTxO HD +prototype, and design and testing of Genesis. We also extracted the fs-sim +package, which provides a file-system abstraction layer that can be used for +testing and simulation. This makes the Consensus code base smaller, while +providing a package that the community can reuse and contribute to. We also +fixed a failing property test related to iterators. We are also working on +mempool and VRF improvements.

Low-level details

+ + + + \ No newline at end of file diff --git a/2023-03-22-node-cli-api/index.html b/2023-03-22-node-cli-api/index.html new file mode 100644 index 00000000000..b231b42aad3 --- /dev/null +++ b/2023-03-22-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content
+ + + + \ No newline at end of file diff --git a/2023-03-22-performance-and-tracing/index.html b/2023-03-22-performance-and-tracing/index.html new file mode 100644 index 00000000000..7304e79d62d --- /dev/null +++ b/2023-03-22-performance-and-tracing/index.html @@ -0,0 +1,30 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg
  • Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.
  • New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users.
  • Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery.
  • Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks.
  • Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing.
  • Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.

Performance

New tracing

The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe +a slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use.

GHC RTS parametrization

We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies +on different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use.

Open Sourcing

Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases.

Tracing

For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well +as a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points +for users of the new system, depending on their wants and needs.

Infrastructure & Analysis

General

Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will +increase confidence in specific metrics.

Nomad backend

We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis +is patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries.

+ + + + \ No newline at end of file diff --git a/2023-03-23-db-sync/index.html b/2023-03-23-db-sync/index.html new file mode 100644 index 00000000000..2b17c9f8cee --- /dev/null +++ b/2023-03-23-db-sync/index.html @@ -0,0 +1,33 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

The DBSync team worked in performance enhancements issues, on providing new db-sync options and on +technical debt and bug fixing. The DBSync team also on boarded a new member.

Low level summary

  • Worked on an issue which causes ada_pots tables to include the values related not only to an +epoch, but also the first epoch of the last epoch. +#1367
  • Fixed an issue where the epoch table didn't rollback and caused wrong values +#1370
  • Fixed an issue were users with disable-ledger option had to provide the state dir option, even +though it was never used. Also refactored the no ledger part of the codebase. +#1378
  • Improved the perforance by using the cache more. Also provided many new options which enables or +disables parts of db-sync. In addition a new --turbo mode is enables which allows db-sync to sync +mainnet in hours. +#1379
+ + + + \ No newline at end of file diff --git a/2023-03-23-mithril/index.html b/2023-03-23-mithril/index.html new file mode 100644 index 00000000000..095b6ce8698 --- /dev/null +++ b/2023-03-23-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2310.0 distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images.

Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano mainnet and they have fixed some bugs.

Low level overview

  • Completed the epic that implements eras behavior switch #707:
    • Completed handling the API version switch at era transition #727
  • Worked on the epic that implements a relational store in the aggregator #779:
    • Completed on the migration/adaptation of the stake_pool table #787
    • Worked on the migration/adaptation of the epoch_settings table #813
    • Worked on the migration/adaptation of the signed-entity-type table #815
    • Completed the creation of a stake distribution service #799
  • Completed the testing of Mithril with Cardano mainnet network #777
  • Completed qualifying the computation of the stake distribution #810
  • Completed the testing of the Docker client in the Mithril Client multi-platform test workflow #794
  • Worked on bugs and optimizations:
    • Fixed a bug that made computation of the stake distribution occur multiple times during an epoch #804
    • Fixed a bug that created deadlocks on the SQLite connection #807
    • Optimized the error message and the behavior of the signer node when KES keys have expired #820
    • Upgraded the infrastructure of the testing-preview and pre-release-preview networks #801
    • Re-genesis of the testing-preview network #803
    • Re-genesis of the pre-release-preview network #818
+ + + + \ No newline at end of file diff --git a/2023-03-24-hydra/index.html b/2023-03-24-hydra/index.html new file mode 100644 index 00000000000..af31d428102 --- /dev/null +++ b/2023-03-24-hydra/index.html @@ -0,0 +1,29 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra had a team workshop and conducted the monthly review +meeting for March. They demonstrated a Hydra Head on mainnet, which was running +the hydraw demo application. While this marks an important milestone, they also +emphasized that more features are still to be added as needed for applications +to run on Hydra. Besides this, the roadmap is getting cleaned up to encourage +discussions and provide more space for user requests.

What did the team achieve this week

  • Monthly review meeting slides/recording, full report of March next week
    • Opened a head on mainnet with hydraw demonstration
    • Hydra pay updates
  • Team workshop in Austria
    • Hydra presentation at the Cardano Foundation in Zurich
    • In-person grooming session, marked many items as candidates to be rather :idea: dicussions
    • Improved head protocol #786 and investigated a potential bug in rollback handling #784
    • Team building and retrospective

What are the goals of next week

  • Follow-up on backlog and roadmap clean-up
  • Complete mainnet compatibility feature (documentation updates)
  • Make API more configurable #380
  • Integrate Hydra specification into repository #693
+ + + + \ No newline at end of file diff --git a/2023-03-27-system-test/index.html b/2023-03-27-system-test/index.html new file mode 100644 index 00000000000..908af0eed67 --- /dev/null +++ b/2023-03-27-system-test/index.html @@ -0,0 +1,24 @@ + + + + + +System Test Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

System Test Team Update

· One min read
Martin Kourim

High level summary

Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.5 and 1.35.6 releases (and their predecessing release candidates) and ran tests on branch with the UTxO-HD functionality.

Workstreams

Framework improvements:

  • improvements in searching for unexpected error messages in log files during test run
  • added support for UTxO-HD testing
  • added support for the new P2P topology format
  • added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)
  • added preliminary support for the Conway era
  • added support for running tests on the Preview testnet

Full list of closed PRs

Node:

  • ran tests on node branch with the UTxO-HD functionality
  • tested the 1.35.5 release
  • tested the 1.35.6 release

DB-Sync:

  • improvements in db-sync sync tests
  • improvements in db-sync functional tests
+ + + + \ No newline at end of file diff --git a/2023-03-31-crypto/index.html b/2023-03-31-crypto/index.html new file mode 100644 index 00000000000..a22c0f82936 --- /dev/null +++ b/2023-03-31-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Mithril: Started looking into full-node verifier
  • cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties.
  • KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent.
  • Sidechains: Included BLS12-381 & JubJub to halo2curves
  • MuSig2: Final modifs to C version.

Low level summary

Mithril

  • Started designing how a full-node verifier would work. Issue comming in the next couple of weeks.

cardano-base

  • BLS12-381 branch merged PR#266.
  • Testing strategy for BLS bindings:
    • Test-vectors for Groth16, and simple BLS signatures ready.
    • Test-vectors with different library, and created by different engineer.

KES agent

  • Resolved issues of circular dependency
  • Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same.
  • Opened a PR for raw bearer branch in ouroboros network PR4395
  • Resolved a bug where the agent node did not properly closed connections
  • Updated version of IOSim allowed us to finish a first version of KES agent.

Sidechains

  • Included BLS12-381 curve to our branch of halo2curves
  • Included JubJub to our branch of halo2curves

MuSig2

  • Minor reorg PR#42
  • Started including fuzz testing for deserialisation PR#
+ + + + \ No newline at end of file diff --git a/2023-03-31-goedel/index.html b/2023-03-31-goedel/index.html new file mode 100644 index 00000000000..68f9d30e931 --- /dev/null +++ b/2023-03-31-goedel/index.html @@ -0,0 +1,29 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on final drafts of two papers +for internal review and planning next steps of analysis of consensus +design refiniments.

Details

  • Preparing final draft of DeltaQSD algebra paper for internal review

  • Preparing final draft of verifying design refinements for +distributed system design for internal review

  • Planning next phase of consensus design refinement analysis

+ + + + \ No newline at end of file diff --git a/2023-03-31-hydra/index.html b/2023-03-31-hydra/index.html new file mode 100644 index 00000000000..f646153b9dc --- /dev/null +++ b/2023-03-31-hydra/index.html @@ -0,0 +1,29 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra continued work on finishing mainnet compatibility. The +semi-automated smoke tests and some missing documentation is still preventing +from calling that fully done. They fixed smaller issues and made a step in the +Head protocol more robust. Besides development, they met with interested people +from the community who want to get started collaborating on communication and +marketing materials.

What did the team achieve this week

  • Groomed and followed-up on GetUTxO user request discussion #797
  • Fixed hydra-node crashes after forks #560
  • Made collectCom more robust and aligned with spec #786
  • Completed configurable API feature #380
  • Met potential contributors about Hydra communication and marketing materials
  • Versioned documentation: we have a unstable bleeding edge version available as well now, seperate from the last released version

What are the goals of next week

  • Follow-up backlog and roadmap clean-up
  • Complete mainnet compatibility feature #713 (documentation updates)
  • Integrate Hydra specification into repository #693
+ + + + \ No newline at end of file diff --git a/2023-03-31-ledger/index.html b/2023-03-31-ledger/index.html new file mode 100644 index 00000000000..74c901356e9 --- /dev/null +++ b/2023-03-31-ledger/index.html @@ -0,0 +1,37 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

High level summary

We are still heavily involved in work related to preparing the next release. +The other main thing we have worked on is experimentation about how we will +handle the DRep stake distribution for CIP-1694 in the conway ledger era. +Lastly, we merged a fix for +node-4826 +into our main branch (there will be a post-mortem shortly).

Low level summary

Support for the next release

  • pull-3363 - Fix problems relating to Arbitrary instances used by consensus.
  • pull-3361 - Remove the alonze genesis from the conway genesis.
  • pull-3360 - Translate bad pointer addresses to valid ones in conway.
  • pull-3357 - Fix a bug relating to zero valued ADA in the script context.
  • pull-3356 - Added needed instances (Arbitrary and Serialization) for conway integration.
  • pull-3345 - Added helper functions for the CLI.
  • pull-3342 - Fix a bug with a CLI helper function (having to do with deposit tracking).

Experiments for DRep stake distribution

Adding another stake distribution to the ledger state presents some new challenges. +We would like to be able to use the current stake distribution at the epoch boundary +for DRep voting so that people can always vote themselves in time for any proposal. +To this end, we have a prototype of an incremental computation based on the incremental +lambda calculus, together with tests and benchmarks (which are very promising). +See pull-3344.

Additionally, more of the ledger state is going to need to be rearranged to accomodate +the new incremental computations. +We have two draft PRs up for possibles solution. +See pull-3353 and pull-3364.

Technical debt and bug fixes

Documentation changes

  • pull-3354 - Rename "optional datums" with "supplemental datums" in the alonzo spec.
  • pull-3352 - Add a section to the Shelly errata about the individual deposit tracking.
  • pull-3351 - Further clarify the details regarding the script integrity hash.
  • pull-3350 - Some cleanup of the Babbage spec.
+ + + + \ No newline at end of file diff --git a/2023-04-05-consensus/index.html b/2023-04-05-consensus/index.html new file mode 100644 index 00000000000..8d89be7c8f7 --- /dev/null +++ b/2023-04-05-consensus/index.html @@ -0,0 +1,33 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

This week the consensus team finished the UTxO-HD prototype refactoring. We are +now working on improving the DB lock mechanism to improve performance. We also +introduced several improvements to the file system abstraction and simulation +layer (fs-sim), which culminated in the release of fs-sim-0.1.0.0 and +fs-api-0.1.0.0 to CHaP.

On the Genesis front we distributed the updated Genesis design document, +soliciting feedback from Networking Team and IOG Researchers. We also opened up +a PR for the adversarial leader schedule QuickCheck generator, which is being +reviewed.

On the support front, we got a new Consensus version that can use different +fundamental VRF crypto primitives for Babbage and Conway eras.

On the tech debt front we fixed an bug in the followers logic, which was +discovered by our QuickCheck property tests.

+ + + + \ No newline at end of file diff --git a/2023-04-05-node-cli-api/index.html b/2023-04-05-node-cli-api/index.html new file mode 100644 index 00000000000..5da8bac83c5 --- /dev/null +++ b/2023-04-05-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2023-04-05 - 2023-04-19

High level summary

  • Introduce new governance commands create, answer and verify. This allows us to have onchain polls.
  • Begin making changes in cardano-api to accomodate for CIP-1694
  • Rename TestEnableDevelopmentHardForkEras to ExperimentalHardForksEnabled and TestEnableDevelopmentNetworkProtocols to ExperimentalProtocolsEnabled
  • Various bug fixes and improvements

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-04-05-performance-and-tracing/index.html b/2023-04-05-performance-and-tracing/index.html new file mode 100644 index 00000000000..a4424312868 --- /dev/null +++ b/2023-04-05-performance-and-tracing/index.html @@ -0,0 +1,32 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg
  • Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.
  • New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput.
  • Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged.
  • Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added.
  • Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.

Benchmarking

We have adapted our benchmarking cluster to the requirements of the 8.0 release branch. Testing runs of a very early feature branch for 8.0 +helped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for 8.0 soon.

Tracing

Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very +detailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing +the highest possible throughput of data for forwarding to cardano-tracer.

Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions +for tunneling trace forwarding from a node to cardano-tracer via an easy to manage system service, which will match the production setup of most users.

Infrastructure & Analysis

General

Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance +analysis can be fed back and serve as an additional point of comparison.

Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations.

Plutus library

We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles. +This will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile. +It is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit.

Nomad backend

The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is +being improved to minimize any friction for the backend user.

+ + + + \ No newline at end of file diff --git a/2023-04-06-mithril/index.html b/2023-04-06-mithril/index.html new file mode 100644 index 00000000000..6e01dd7f4a2 --- /dev/null +++ b/2023-04-06-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2313.0 distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages.

Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to 1.35.6.

Low level overview

  • Released the new distribution 2313.0
  • Worked on the epic that implements a relational store in the aggregator #779:
    • Completed the migration/adaptation of the epoch_settings table #813
    • Completed the migration/adaptation of the signed-entity-type table #815
    • Completed the migration/adaptation of the certificate table #817
    • Completed the migration/adaptation of the open_message table #827
    • Completed the migration/adaptation of the signer_registration table #828
  • Completed the refactoring of the dependency injection of the aggregator #823
  • Completed the cleanup of the multi-signer of the aggregator #824
  • Completed the upgrade of the Cardano node to 1.35.6 #843
+ + + + \ No newline at end of file diff --git a/2023-04-07-hydra/index.html b/2023-04-07-hydra/index.html new file mode 100644 index 00000000000..bd5156fbb6a --- /dev/null +++ b/2023-04-07-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team published the monthly report for March, created +separate links for different versions of documentation, and clarified potential +solutions for the Rollbacks bug. The team also discussed Query API requests for +the Hydra Voting project and met with community members to answer questions +about Hydra. Moving forward, the team plans to integrate the specification into +the repository, implement a short-term fix for the Rollbacks issue, and draft a +Query API ADR.

What did the team achieve this week

  • Published monthly reports on website
  • Separate last released and latest versions of docs (e.g. normal released vs. /unstable)
  • Discussed Query API concerns from Hydra Voting project (link)
  • Clarified rollbacks bug and defined possible solutions (short and long term) #784
  • Met with community members to answer questions about Hydra

What are the goals of next week

  • Finally get the docs integrated into the repository #693
  • Dirt road fix for rollbacks #784
  • Disclaimer text and detail known issues about mainnet compatibility +#713
+ + + + \ No newline at end of file diff --git a/2023-04-14-goedel/index.html b/2023-04-14-goedel/index.html new file mode 100644 index 00000000000..726de1d9b87 --- /dev/null +++ b/2023-04-14-goedel/index.html @@ -0,0 +1,27 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has submitted two papers for publication, carried +out consultancy with other teams and has an opening for an intern.

Details

+ + + + \ No newline at end of file diff --git a/2023-04-14-hydra/index.html b/2023-04-14-hydra/index.html new file mode 100644 index 00000000000..69c826b9276 --- /dev/null +++ b/2023-04-14-hydra/index.html @@ -0,0 +1,30 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team focused on improving the smoke test, fixing developer +tooling, and improving the API for voting use cases. They reviewed progress on +auction, payments, and voting projects and made worked on reproducing a bug with +handling rollbacks. Moving forward, the team plans to update dependencies, +implement a dirt road fix for the rollbacks bug, and explore adding Hydra +support to kupo.

What did the team achieve this week

  • Reviewed progress on auction, payments and voting projects
  • Improved smoke tests so they can run on mainnet
  • Fixed a regression in the development environment and updated cardano-node +used in tests
  • Improved API with more configurability to unblock voting use case
    • Exclude utxo in SnapshotConfirmed outputs #808
    • Addressed a user request by only sending Greetings once #813
  • Reproduced the rollback bug by improving our model-based test suite #784

What are the goals of next week

  • Update dependencies to match cardano-node master
  • Dirt road fix for rollbacks #784
  • Update Hydraw to maintain state locally
  • Explore adding Hydra support to kupo
  • Put disclaimer texts and closing mainnet compatibility feature #713
+ + + + \ No newline at end of file diff --git a/2023-04-17-ledger/index.html b/2023-04-17-ledger/index.html new file mode 100644 index 00000000000..fc985d258ab --- /dev/null +++ b/2023-04-17-ledger/index.html @@ -0,0 +1,27 @@ + + + + + +Incident Report | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Incident Report

· 2 min read
Kevin Hammond

Incident reporting: Cardano block production temporary outage

On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a ‘critical’ incident, thus warranting immediate response and investigation by IOG engineers. +The investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue – a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite. +Following successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version. +With the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue.

Further Details

You can read more details on the incident and how it was managed from SundaeSwap’s Pi Lanningham here. Thanks again to all the community for its support in identifying and fixing this bug.

+ + + + \ No newline at end of file diff --git a/2023-04-19-consensus/index.html b/2023-04-19-consensus/index.html new file mode 100644 index 00000000000..2ee396e3d38 --- /dev/null +++ b/2023-04-19-consensus/index.html @@ -0,0 +1,35 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

This week the consensus team continued working on the improved DB lock mechanism +for UTxO-HD, and modifications to the mempool benchmarks that this prototype +requires.

On the Genesis front we validated that the fragment size calculation in +BlockFetch is a major performance sink for ChainSync Jumping. By removing it +we will get performance that is acceptably close to that of the baseline. We +also started investigating a performance fix that does not alter the existing +baseline behavior too much. In addition we reviewed our Genesis attack vector +calculations.

On the support front we released Consensus 0.4, and we are working on improving +our release process, to support the Cardano-wide efforts in this area. We also +performed an analysis on the number of file descriptors that consensus use. This +information can be used by the node operators to check if the number of file +descriptors they want to support are enough.

+ + + + \ No newline at end of file diff --git a/2023-04-19-performance-and-tracing/index.html b/2023-04-19-performance-and-tracing/index.html new file mode 100644 index 00000000000..3ff9776332f --- /dev/null +++ b/2023-04-19-performance-and-tracing/index.html @@ -0,0 +1,37 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg
  • Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.
  • New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois.
  • Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run.
  • Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench.
  • Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.

Benchmarking

We have performed various cluster runs targeting the 8.0 release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile epoch-transition for local reproduction of what we observed on the benchmarking cluster.

Furthermore, we bridged the gap between the run data from the 1.35.x releases to the the new 8.0.x release branch. This included walking the +master branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial +in locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of +benchmarks.

Tracing

In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still +ongoing.

In coordination with Galois, who are developing a system assurance service by observing a number of cardano-nodes, we're working with the implementation +of data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational +burden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether cardano-tracer could be extended with a richer +feature set to that end.

Infrastructure & Analysis

Detailed manifest

A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with. +These dependencies come from different package sources, have different versioning policies, and an identical package version might provide different +performance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated +by making all component bumps visible and accessible.

GHC profiling inside workbench

The workbench has been equipped with a new -profnix profile flavour. This enforces a -fprof-auto build for all node-related packages. The type of +profiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already +been merged to master.

Nomad backend

The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances. +This results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing.

+ + + + \ No newline at end of file diff --git a/2023-04-20-mithril/index.html b/2023-04-20-mithril/index.html new file mode 100644 index 00000000000..e5c6230f91f --- /dev/null +++ b/2023-04-20-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2315.0 distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures.

Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network.

Low level overview

  • Released the new distribution 2315.0
  • Completed the epic that implements a relational store in the aggregator #779:
    • Completed the migration/adaptation of the signed_entity table #816
    • Completed the creation of the signer table #814
    • Completed the migration/adaptation of the single_signature table #829
  • Worked on the epic that designs and implement generic signing/verification of entity services #780:
    • Completed the definition of the interface of the generic entity service for signing #847
    • Worked on the implementation of the Certifier service in the aggregator #850
    • Completed the extension of the SignedEntityType type #848
    • Completed the implementation of the Tick service in the aggregator #849
    • Worked on implementing the signable builder for the Mithril Stake Distribution #851
+ + + + \ No newline at end of file diff --git a/2023-04-20-node-cli-api/index.html b/2023-04-20-node-cli-api/index.html new file mode 100644 index 00000000000..df3fbac66be --- /dev/null +++ b/2023-04-20-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content
+ + + + \ No newline at end of file diff --git a/2023-04-21-hydra/index.html b/2023-04-21-hydra/index.html new file mode 100644 index 00000000000..663f8363cf3 --- /dev/null +++ b/2023-04-21-hydra/index.html @@ -0,0 +1,30 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team worked on several fronts, including fixing state +machine continuity on-chain, discussing voting project solutions, exploring +adding Hydra support to kupo, and improving API navigation with a sidebar. The +team also updated dependencies and fixed issues in their test suites. Moving +forward, the team plans to hold the next monthly review meeting, address a user +issue, prepare for the 0.10.0 release, and work on a dirt road fix for the +rollbacks issue with proper test coverage.

What did the team achieve this week

  • Fixed scripts to enforce state machine continuity on-chain #777.
  • Took part in a twitter space on Scaling Cardano.
  • Joined a CBIA meeting to discuss Cardano network protocols & how to specify them.
  • Discussed potential solutions of ensuring vote uniqueness in the voting project.
  • Updated dependencies to match cardano-node master to prepare for upcoming releases and hard-forks
  • Explored adding Hydra support to kupo, a lightweight Cardano chain indexer - some more work required.
  • Improved navigation of the API Reference with a sidebar, see unstable API version.
  • Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)

What are the goals of next week

  • Monthly review meeting (join via Discord or AddEvent) & report
  • Dirt road fix for rollbacks #784 properly covered by a test.
  • Groom and ideally address user issue #823.
  • Put the spec into the repo #693 and prepare release 0.10.0.
+ + + + \ No newline at end of file diff --git a/2023-04-21-ledger/index.html b/2023-04-21-ledger/index.html new file mode 100644 index 00000000000..82d6b14390d --- /dev/null +++ b/2023-04-21-ledger/index.html @@ -0,0 +1,27 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· One min read
Jared Corduan

High level summary

We continued to make progress on CIP-1694 and the conway ledger era. +In particular, the conway era now supports Plutus V3. +Finally, we made small improvements to the ledger API and now host +our Haskell code documentation (haddocks) on github pages.

Low level summary

Conway ledger era

Haddocks hosted on github pages

Small improvements to the API

Technical Debt

  • [pull-3367] Fix cost model json instances.
  • [pull-3371] UMap cleanup.
  • [pull-3373] Upgrade to ghc 9.2.7 and cabal 3.10.1.
  • [pull-3375] Sadly, we had to revert the TICKF optimizations. There was a regression we do not yet understand.
  • [pull-3377] Fix cabal warnings.
  • [pull-3383] Fix multi-asset test.
+ + + + \ No newline at end of file diff --git a/2023-04-27-hydra/index.html b/2023-04-27-hydra/index.html new file mode 100644 index 00000000000..6c6b5b5f418 --- /dev/null +++ b/2023-04-27-hydra/index.html @@ -0,0 +1,34 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team held their Monthly review meeting and drafted the +report which likely is published next week. They put the spec into the +repository and website, addressed a user issue and fixed the TUI peer list. +Furthermore, they updated dependencies, conducted a Twitter space on Auctions +use cases, covered the rollback bug with tests and implemented a solution. +Looking ahead, their goals for next week include releasing 0.10.0, implementing +timed transactions support, writing a Query API ADR, and grooming work items +like off-chain benchmarks.

What did the team achieve this week

  • Held the Monthly review meeting and drafted the report (to be published next week)
  • Added the spec into the repository +#693 and published on +the +website
  • Groom and addressed user issue #823
  • Covered the rollback bug with tests and implemented a solution (to be reviewed) #784
  • Fixed the TUI peer list
  • Updated dependencies to match cardano-node master
  • Conducted a twitter space on Auctions use cases

What are the goals of next week

  • Release 0.10.0
  • Support timed transactions solution drafted and validated API with users
  • Write Query API ADR and groom a concrete step
  • Groom and solve PostTxOnChainFailed UX problem #832
  • Groom off-chain benchmarks idea #186 and turn it into a feature
+ + + + \ No newline at end of file diff --git a/2023-04-28-crypto/index.html b/2023-04-28-crypto/index.html new file mode 100644 index 00000000000..f5d49ee230b --- /dev/null +++ b/2023-04-28-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library.
  • KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction.
  • Sidechains: Started implementing ECC chip of JubJub over BLS12-381.

Low level summary

cardano-base

  • #255 finally merged 🎉
  • Additional tests for BLS bindings #384
  • Open PR for including test vectors created with zkscrypto's library, PR#397

KES agent

  • Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period PR#389.
  • Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) #317.
  • Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim
  • Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes
  • Refactor MonadSodium into MonadMLock PR#388.

Sidechains

  • Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)
  • Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo
+ + + + \ No newline at end of file diff --git a/2023-04-28-goedel/index.html b/2023-04-28-goedel/index.html new file mode 100644 index 00000000000..71b2f54f41f --- /dev/null +++ b/2023-04-28-goedel/index.html @@ -0,0 +1,27 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is working on porting an existing formalisation of Ouroboros +Praos to a newer foundation.

Details

+ + + + \ No newline at end of file diff --git a/2023-04-28-network/index.html b/2023-04-28-network/index.html new file mode 100644 index 00000000000..62c2f673bce --- /dev/null +++ b/2023-04-28-network/index.html @@ -0,0 +1,31 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High level summary

The networking team has released the following packages to Hackage:

We published an announcement blog post. We made progress +also on another blog post which will describes the design of the P2P networking +layer.

After moving ouroboros-consensus to its own repository, we made +ouroboros-network compatible with GHC 9.4 and 9.6.

We made cardano-client library independent of +ouroboros-consensus-diffusion.

We prepared release of network packages for cardano-node-8.0.

Detailed log

Ouroboros-Network

IO-Sim

  • io-classes-1.0.0.0, and following up releases: 1.0.0.1 (ghc-9.6 +support), 1.1.0.0 (documentation fix).
  • Fixed timeouts and delays in io-sim in a series of PRs: io-sim#81, +io-sim#82, io-sim#86, io-sim#87.
  • Renamed a module: io-sim#88.
  • Fixed a failing registerDelayCancellable test: [io-sim#80].
  • Use GitHub merge queue in io-sim repository.
  • CI: download stylish-haskell: io-sim#83.

Typed Protocols

+ + + + \ No newline at end of file diff --git a/2023-05-01-db-sync/index.html b/2023-05-01-db-sync/index.html new file mode 100644 index 00000000000..9b4d1e8b9d0 --- /dev/null +++ b/2023-05-01-db-sync/index.html @@ -0,0 +1,29 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

Lower level summary

  • Prepared a schema change which is expected to speed up queries and help clients +#1389.
  • Ran a big number of benchmarks on the above to evaluate if this change is reasonable.
  • Performance optimization related to rewards +#1382
  • Using the cache in more places to reduce recourses usage +#1380
  • Evaluated risks related to UTXO-HD integration
  • Worked on a feauture request to split the tx_out to an address table +#1396
  • Worked on another feauture request to prune the consumed entries from the tx_out table +#1398
  • Prepared for CIP-1694 integration
+ + + + \ No newline at end of file diff --git a/2023-05-03-consensus/index.html b/2023-05-03-consensus/index.html new file mode 100644 index 00000000000..ed8cb78de2f --- /dev/null +++ b/2023-05-03-consensus/index.html @@ -0,0 +1,50 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

During the past two weeks we made some important progress in the Genesis design. +It seems the BlockFetch logic need not be modified for Genesis, although this +needs to be confirmed. We started a DoS mitigation handbook and updated our +conceptual component diagram to guide the Genesis design. We engaged with the +IOG researchers to work on the Limit on Patience attack vector, work in this +area is still ongoing. We sketched a design to decouple the CPU load of the node +from its responsiveness to the socket. Finally, we discussed with Networking our +approach to lower the performance impact of the BlockFetch decision logic, and +got green light from them.

We migrated the consensus code to a new +repository, splitting +it from the ouroboros-network repository, and released version 0.6 of +Consensus.

We also merged the mempool fairness improvement to main branch.

Another significant enhancement to our documentation was the addition of an +explanation of the hardfork combinator forecast horizon.

See the sections below for more details.

Genesis

We reviewed the BlockFetch design documentation, and added some source-code +comments that emphasize certain properties of the decisions the BlockFetch +logic makes that are helping us confirm that Genesis does not require any +changes to BlockFetch. We are waiting on input from our former system +architect to verify this.

We migrated and updated the conceptual component diagram in the ouroboros-consensus +repository which helps us situate the Genesis design and argument.

We engaged with the IOG researchers about the Genesis design. We sketched out a +way to address the concern that the Limit on Patiente (LoP) attack vector duty +cycle is indeed low, but it's still non-trivial to ultimately conclude it's +sufficiently low.

We also sketched a design to decouple the CPU load of the node from its +responsiveness to the socket, since the LoP is a relatively tight timeout, and +node performance bugs inducing seconds-worth of latency are unfortunately +familiar phenomena.

Fostering collaboration

We added an +explanation of +a question that we had to explain many times about the exact behavior of the +hardfork combinator forecast horizon.

+ + + + \ No newline at end of file diff --git a/2023-05-03-performance-and-tracing/index.html b/2023-05-03-performance-and-tracing/index.html new file mode 100644 index 00000000000..384a8771673 --- /dev/null +++ b/2023-05-03-performance-and-tracing/index.html @@ -0,0 +1,32 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Michael Karg
  • Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.
  • New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint.
  • Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on.
  • Infrastructure: The plutus-apps flake input for cardano-node has finally been removed.
  • Nomad backend: A PR implementing placement of benchmarking clusters has been merged.

Benchmarking

The performance investigations on the 8.0 release branch have lead to pinpointing and addressing incosistent behaviour. For that, +we created yet another local reproduction with the workbench's forge-stress benchmark.

Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into 8.0 and +subsequent releases.

Additionally, we've refined the trace-bench family of profiles that target benchmarking our own new tracing system.

Tracing

Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally +intended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant +conversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system.

Infrastructure & Analysis

Dataflow documentation

The LogObject CLI locli is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate +further development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting.

Remove redundant Plutus flake input

This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input, +we simplify the dependency graph for cardano-node, as well as enable immediate feedback when developing Plutus benchmarks.

Nomad backend

Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking. +This capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along +with various quality-of-life improvements, has been merged to master.

+ + + + \ No newline at end of file diff --git a/2023-05-04-mithril/index.html b/2023-05-04-mithril/index.html new file mode 100644 index 00000000000..c52c3f3ec5d --- /dev/null +++ b/2023-05-04-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version 1.35.7.

Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain.

Low level overview

  • Worked on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the implementation of the Certifier service in the aggregator #850
    • Completed the implementation of the signable builder for the Mithril Stake Distribution #851
    • Completed the implementation of the artifact builder for the Mithril Stake Distribution #870
    • Completed the implementation of the signable builder for the Full Immutables Snapshot #852
    • Completed the implementation of the artifact builder for the Full Immutables Snapshot #871
    • Completed the adaptation of the aggregator runtime to use the signable builder service #853
    • Worked on the adaptation of the signer runtime to use the signable builder service #854
    • Completed the definition of the entity service interface for verification/restoration #868
    • Completed the refactoring of the OpenMessage type #878
  • Completed the epic that simplifies the multi-signer in the aggregator #398:
    • Completed the extraction of the single signature registration from the multi-signer #643
  • Completed the upgrade of the Cardano node to version 1.35.7 #881
  • Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators #873
+ + + + \ No newline at end of file diff --git a/2023-05-05-ledger/index.html b/2023-05-05-ledger/index.html new file mode 100644 index 00000000000..58c309c8298 --- /dev/null +++ b/2023-05-05-ledger/index.html @@ -0,0 +1,36 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

High level summary

The ledger team focused mainly on the conway ledger era and node integration. +For conway, we completed a large structural change that now allows +for delegation certificates to be parameterized by era, and introducing +new certificates for the first time since Shelley. +We also continue to build out our contraint based generators that we will +use to property test the conway era. +In particular, we can now generate an entire ledger state and a +transaction which is balanced with respect to the ledger state.

Low level summary

Conway certificates

Certificiates are now abstracted as a type family in the ledger codebase. +Moreover, there are new certificates in the Conway era to support CIP-1694, +and MIR certificates have been removed.

Constraint based testing

Our plan for property testing in the conway era is to no longer use the trace generators, +but instead generate ledger states and transactions based on constraints. +We hit a milestone this week, namely the ability to generate a balanced transaction in the context +of a ledger state, all based on our ever growing constaint language.

Integration work

Technical debt

+ + + + \ No newline at end of file diff --git a/2023-05-05-node-cli-api/index.html b/2023-05-05-node-cli-api/index.html new file mode 100644 index 00000000000..dff443fd668 --- /dev/null +++ b/2023-05-05-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Jordan Millar

2023-05-05 - 2023-05-23

High level summary

  • Golden tests for cardano-cli command help output were added.
  • Documentation was updated with new libsodium installation instructions.
  • There were several updates for the cardano-cli:
    • Deletion of the deprecated shelley command group.
    • Addition of golden tests for CLI help.
    • An improvement to avoid bare IO in tests, allowing better error reporting in failed tests.
    • Generation of UTCTime test values without leap seconds (avoids erroneous test failures)
    • Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32.
  • The cardano-api underwent multiple refinements:
    • Implementing deposit handling when balancing transactions (necessary for Conway)
    • Cleaning up socket file path code.
  • Several changes were made to the cardano-testnet:
    • Adding golden tests for cardano-testnet help.
    • Removing all hardcoded yaml files in cardano-testnet
    • Improving cardano-testnet help output.
    • Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-05-12-crypto/index.html b/2023-05-12-crypto/index.html new file mode 100644 index 00000000000..9d68228c1a2 --- /dev/null +++ b/2023-05-12-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· 2 min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • cardano-base: Include final tests for BLS signature. Further adaptations for KES agent.
  • Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.

Low level summary

cardano-base

Sidechains

  • Opened PR in halo2curves to include BLS12-381 and JubJub, #38
  • Addition constraint over JubJub merged #10
+ + + + \ No newline at end of file diff --git a/2023-05-12-goedel/index.html b/2023-05-12-goedel/index.html new file mode 100644 index 00000000000..d3914e1ffab --- /dev/null +++ b/2023-05-12-goedel/index.html @@ -0,0 +1,28 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team had two paper accepted for ICE 2023 +(https://www.discotec.org/2023/ice). The event will be held in Lisbon +on 19th June 2023. The papers will be published in EPTCS.

Details

+ + + + \ No newline at end of file diff --git a/2023-05-12-hydra/index.html b/2023-05-12-hydra/index.html new file mode 100644 index 00000000000..0f8cf470dba --- /dev/null +++ b/2023-05-12-hydra/index.html @@ -0,0 +1,33 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team achieved a number of milestones, including the release +of the first mainnet compatible version. Besides this they also addressed +inconsistencies in rollback handling, added an architecture page to the website, +reducing the size of logs using event IDs. They also had productive discussions +with researchers on plans for incremental commits/decommits and had a whiteboard +session on DeFi and lending protocols. The goals for next week include +completing the validation of the timed transactions feature, exploring stateless +observation, refining the Hydra explorer ticket, writing ops instructions and +troubleshooting, and implementing the first end-to-end journey for external +commits.

What did the team achieve this week

  • Released first mainnnet compatible version 0.10.0
  • Addressed inconsist handling of rollbacks #784
  • Added architecture page and fixed haddock links on our website #838
  • Opened a new hydra head on mainnet
  • Talked with researchers on initial plan for incremental commits/decommits
  • Had a Whiteboard session on DeFi and lending protocols
  • Reduced size of logs using event ids #859
  • Published the monthly report for April

What are the goals of next week

  • Complete validation of timed transactions feature #196
  • Explored stateless observation and refined hydra explorer ticket #696
  • Write ops instructions and troubleshooting #569 and improve logs
  • Have a first end-to-end journey for external commits implemented #215
+ + + + \ No newline at end of file diff --git a/2023-05-12-network/index.html b/2023-05-12-network/index.html new file mode 100644 index 00000000000..7f69c7d871c --- /dev/null +++ b/2023-05-12-network/index.html @@ -0,0 +1,41 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High level summary

We started working on a new way to switch between root & ledger peers (see +below). We continued to work on eclipse-evasion. We merged changes to +Handshake contributed by Galois Inc. We made improvements to our tests (fixed +a flaky test, added cddl specs for NodeToNodeVersionData and +NodeToClientVersionData). We improved our CI and automated the process of +releasing new package version to CHaP.

Detailed summary

We continued to work on testing eclipse-evasion.

We came up with an idea to limit how full node wallets relay on root peers +(currently operated by IOG, in future also CF and Emurgo). We designed +a switch to use ledger peers if the node tip is close enough to the current +time. For more details see #4530.

We merged changes to the handshake mini-protocol which allow one to query +server's node-to-node / node-to-client parameters. We are grateful to +Galois Inc. for implementing it, #4256 and #4538. We published new version +of packages to CHaP chap-#253.

We added DiffusionError wrapper. Thanks to it, ouroboros-consensus will +not duplicate diffusion errors messages in the log, #4537.

We fixed an issue which caused one of our tests to be flaky, #4515.

We added cddl tests for NodeToNodeVersionData and NodeToClientVersionData: +#4540, #4544 (in review).

We wrote scripts which will help us release packages as well as verify that we +released all the package necessary to build the newest set of packages, +#4542.

We renamed the consensus startup tracer and make sure it doesn't log +ExitSuccess exceptions, consensus-#71.

We reviewed PR which adds RawBearer API, #4395.

We made series of improvements to our CI:

  • #4539: we don't need to install cryptographic libraries in CI;
  • #4545: Javier Sagredo (consensus) cleaned up CI after consensus moved +to a new repo;
  • #4546: we switched to use GitHub merge queues;
  • #4549: we made it possible to trigger building haddocks manually;
  • #4553: we fixed and enhanced caching of building dependencies.
+ + + + \ No newline at end of file diff --git a/2023-05-17-consensus/index.html b/2023-05-17-consensus/index.html new file mode 100644 index 00000000000..8ce37f74d5a --- /dev/null +++ b/2023-05-17-consensus/index.html @@ -0,0 +1,24 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the [Genesis][#genesis] section for more details.

Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our main branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain.

We improved our tooling by releasing an immutable DB server, which can be used for testing and benchmarking purposes, and a db-truncater program, which can be used in disaster recovery and benchmarking scenarios.

Genesis

The consensus team working on Genesis:

  • Improved the genesis selection rule as a result of our interaction with IO Research.
  • Studied how the hard-fork combinator handles forecasting at era transitions, and improved our documentation.
  • Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP.
  • Elaborated concrete proposal for the Genesis State Machine.
  • Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).

The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine.

+ + + + \ No newline at end of file diff --git a/2023-05-17-mithril/index.html b/2023-05-17-mithril/index.html new file mode 100644 index 00000000000..8b5c3ef67d9 --- /dev/null +++ b/2023-05-17-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2318.0 distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types.

Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node 8.0.0 (along with the backward compatibility for previous 1.35.x versions).

Low level overview

  • Worked on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the handling of multiple types of signed entity in the aggregator runtime #907
    • Completed the adaptation of the signer runtime to use the signable builder service #854
    • Completed the adaptation of the aggregator runtime to use the artifact builder service #869
    • Completed the appending of the next AVK to all protocol messages #888
    • Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced #893
    • Completed the adaptation of the explorer to handle new artifact routes of the aggregator #927
  • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
    • Completed the implementation of the new stake distribution computation in the chain observer #919
    • Worked on upgrading the Cardano node to 8.0.0 #920
+ + + + \ No newline at end of file diff --git a/2023-05-17-performance-and-tracing/index.html b/2023-05-17-performance-and-tracing/index.html new file mode 100644 index 00000000000..ab29eb67632 --- /dev/null +++ b/2023-05-17-performance-and-tracing/index.html @@ -0,0 +1,37 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 4 min read
Michael Karg

High level summary

  • Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes.
  • New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due.
  • Analysis pipeline: First steps on implementing incremental analysis have been untertaken.
  • Open Sourcing: Exhaustive dataflow charts for both our analysis tool locli and our workbanch have been merged to master
  • Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster.
  • P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland.
  • Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.

Low level overview

Benchmarking

As a compiler switch to GHC 9.2.7 for cardano-node's default build environment is around the corner, we're setting up our benchmarking cluster to +handle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This +also involves choosing a reliable baseline as reference point for inter-version comparisons.

Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet, +we strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to +be balanced against resource demand for all our cluster's nodes.

Tracing

For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some +quality-of-life details that have changed required us to revision the system documentation.

Analysis

As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been +normally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a +huge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken.

Open Sourcing

A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking +copmonents more accessible. As a result, detailed charts for both our LogObject CLI locli and our workbench have been merged to master.

Nomad backend

While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting +those profiles of our workbench that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality +of the nomad cloud backend.

Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster.

Performance & Tracing Meetup

We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive +days together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future. +Also, it was a great opportunity to finally meet in person.

Offboarding

Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation +of team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!

+ + + + \ No newline at end of file diff --git a/2023-05-19-hydra/index.html b/2023-05-19-hydra/index.html new file mode 100644 index 00000000000..4ead64770ed --- /dev/null +++ b/2023-05-19-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Franco Testagrossa

High-level summary

This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the "Coding Standards" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.

What did the team achieve this week

  • Complete validation of timed transactions feature #196.
  • Write ops instructions and troubleshooting #569 and improve logs.
  • Remove --ledger-genesis argument to hydra-node options #863.
  • Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows #877.
  • Use nix to build test binaries to increase CI speed #867.
  • Updated our Coding Standards.

What are the goals of next week

  • Monthly report & review meeting.
  • Have a first end-to-end journey for external commits implementing "Option A" #215.
  • Integrate spanish translation #866.
  • Improve and provide regular benchmarks for Hydra #186.
  • Allow commit transactions with multiple UTxO #774.
  • Explored stateless observation and refined hydra explorer ticket #696.
+ + + + \ No newline at end of file diff --git a/2023-05-24-node-cli-api/index.html b/2023-05-24-node-cli-api/index.html new file mode 100644 index 00000000000..2f7da008f3e --- /dev/null +++ b/2023-05-24-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· One min read
Jordan Millar

2023-05-24 - 2023-06-06

High level summary

  • The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released.
  • We provided assitance where needed in the release
  • An integration repository https://github.com/input-output-hk/fusion-flamingo was created to enable my team to more easily work on cardano-cli and cardano-api

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

+ + + + \ No newline at end of file diff --git a/2023-05-26-goedel/index.html b/2023-05-26-goedel/index.html new file mode 100644 index 00000000000..7a8d40bba78 --- /dev/null +++ b/2023-05-26-goedel/index.html @@ -0,0 +1,27 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

Details

+ + + + \ No newline at end of file diff --git a/2023-05-26-hydra/index.html b/2023-05-26-hydra/index.html new file mode 100644 index 00000000000..d2f31627a60 --- /dev/null +++ b/2023-05-26-hydra/index.html @@ -0,0 +1,32 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team accomplished several important tasks. They held their +monthly review meeting and drafted the report for May. They made progress on +implementing the first end-to-end journey for external commits using "Option A" +for normal UTxOs, while still considering "Option B". The team also integrated a +Spanish translation contributed by the community, created micro-benchmarks for +transaction validation and deserialization, and made improvements to +hydra-node's version reporting. Last but not least, they implemented the ability +to commit multiple UTxOs to a head at once.

What did the team achieve this week

  • Held the monthly review meeting (recording + slides) & drafted the report for May.
  • Have a first end-to-end journey for external commits implementing Option A +for normal UTxOs #887 (still considering Option B).
  • Integrated the spanish translation #866.
  • Created micro-benchmarks for transaction validation and deserialization #884.
  • Improve hydra-node version reporting on non-released builds #849
  • Some minor CI improvements following up last weeks changes.
  • Allow commit transactions with multiple UTxO #774.

What are the goals of next week

  • Investigate and re-open our team-internal head on mainnet.
  • Improve and provide regular benchmarks for Hydra #186.
  • Complete external commits with script UTxOs #215.
  • Authenticate network messages #727.
  • Add hydra as tool to developr platform #872.
+ + + + \ No newline at end of file diff --git a/2023-05-26-ledger/index.html b/2023-05-26-ledger/index.html new file mode 100644 index 00000000000..7ff85774285 --- /dev/null +++ b/2023-05-26-ledger/index.html @@ -0,0 +1,28 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Jared Corduan

High level summary

The ledger team made progress on the conway ledger era. In particular, the design and implementation +of the new certificates is near complete, we refactored some of our data structures +to be able to support DReps, we cleaned up the serialization format, and renamed things to make +clearer the differences with Shelley.

The team also completed integration work for the next node release, namely 8.1.0. +And, as always, we continue to address technical debt.

Low level summary

Conway progress

  • pull-3408 - Improve conway delegation certificates
  • pull-3428 - Get rid of Constitutional in favor of Genesis and Committee
  • pull-3426 - Add DRep to internal data struture (UMap)
  • pull-3425 - Improve witness logic needed for conway
  • pull-3423 - Rename ShelleyDelegCerts constructors to distinguish them from Conway
  • pull-3421 - Rename DCert -> TxCert
  • pull-3454 - conway CDDL minor fixes

Improve testing

  • pull-3403 - Add Plutus script context golden tests

Integration work

  • pull-3410 - Update chaps index
  • pull-3416 - Bump cardano-ledger-alonzo-test version
  • pull-3414 - Bump cardano-ledger-shelley-test minor version
  • pull-3420 - Bump cardano-ledger-shelley-ma-test version
  • pull-3441 - Release cardano-ledger-[alonzo|babbage]-1.2.1

Technical debt

  • pull-3409 - Unit test - no such thing as a reference datum
  • pull-3407 - Fixup release process documentation
  • pull-3404 - Create TotalDeposits events during all eras
  • pull-3402 - Fix broken references in the Shelley spec
  • pull-3424 - Remove no longer used cardano-ledger-shelley-ma package
  • pull-3432 - Add an example on how to bump up versions in the changelog
  • pull-3440 - Revert back to the group serialization for ProtVer for PParams
+ + + + \ No newline at end of file diff --git a/2023-05-26-network/index.html b/2023-05-26-network/index.html new file mode 100644 index 00000000000..db7423f2589 --- /dev/null +++ b/2023-05-26-network/index.html @@ -0,0 +1,28 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· One min read
Marcin Szamotulski

High level summary

We continued working on eclipse-evasion. We also analysed and fixed a bug +when using DNS names in local root peers. We continued working on engineering +blog post about P2P. We released a new version of packages for +cardano-node-8.1.0 release.

We improved our CI, removed obsolete scripts add extra validation which checks +if CHANGELOG.md files were updated.

We also improved release scripts.

Detailed summary

  • Eclipse evasion: #4462
  • Local root peers bug fix: #4559
  • Release to CHaP: #4573
  • CI improvements: #4572
  • Release script improvements: #4573
+ + + + \ No newline at end of file diff --git a/2023-05-31-consensus/index.html b/2023-05-31-consensus/index.html new file mode 100644 index 00000000000..8e40dbea5b3 --- /dev/null +++ b/2023-05-31-consensus/index.html @@ -0,0 +1,24 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see this issue). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain.

On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano.

UTxO-HD

  • We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking SOP classes like HPure and HAp . In short, we implement generalised versions of important classes like Applicative and Traversable.

Support

  • fs-sim-0.1.0.2 and fs-api-0.1.0.2 were released, which makes them now compatible with GHC up to 9.6.
  • ouroboros-consensus-0.7.0.0 was released for cardano-node 8.1, including query serialization fixes for backwards compatibility.
+ + + + \ No newline at end of file diff --git a/2023-05-31-performance-and-tracing/index.html b/2023-05-31-performance-and-tracing/index.html new file mode 100644 index 00000000000..b363370357a --- /dev/null +++ b/2023-05-31-performance-and-tracing/index.html @@ -0,0 +1,35 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg

High level summary

  • Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster.
  • New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism.
  • Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.

Low level overview

Benchmarking

The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build +configuration: As it stands, the ghc-bignum package is using the Haskell native-backend as a default. We strive +to benchmark a build with the gmp-backend next.

A variant of our forge-stress local benchmark has been set up to serve as an early indicator for the resource usage profile +we'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way +shorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great +support when evaluating different compiler versions or RTS flags incrementally.

Tracing

The hub of the new tracing system cardano-tracer is designed with a fixed output behaviour, which is limited to various +logging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to +directly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all.

Nomad backend

We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with +job definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing +benchmarking run required us to fine-tune communications with the nomad server.

Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible +and offers more detailed insight than the previous iteration in cardano-ops. The backend will enable you to formulate +very specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met.

+ + + + \ No newline at end of file diff --git a/2023-06-01-mithril/index.html b/2023-06-01-mithril/index.html new file mode 100644 index 00000000000..d28c8492e76 --- /dev/null +++ b/2023-06-01-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team released a new 2321.1 distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots.

Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks.

Low level overview

  • Released the new distribution 2321.1
  • Worked on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the issue Enhance MessageAdapter for Artifact in aggregator REST API #925
    • Completed the issue Create the sub-command for 'Cardano Immutable Files Full' in client #895
    • Completed the issue Enhance state machines Aggregator/Signer #933
    • Completed the issue Adapt the aggregator REST API to list certificates #892
    • Worked on the issue Adapt end to end tests to handle new types of data #899
    • Worked on the issue Update client documentation #897
    • Worked on the issue Update architecture documentations for new types of data #898
  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Worked on the issue Enhance terraform infrastructure #930
  • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
    • Completed the issue Upgrade Cardano node to '8.0.0' #920
  • Completed the issue Add export path in Client CLI #512
+ + + + \ No newline at end of file diff --git a/2023-06-02-hydra/index.html b/2023-06-02-hydra/index.html new file mode 100644 index 00000000000..9a2c3532992 --- /dev/null +++ b/2023-06-02-hydra/index.html @@ -0,0 +1,33 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Franco Testagrossa

High-level summary

This week, the Hydra team has put their effort on finding solutions on many +different problems, such as our broken head on mainnet +#897, our fragile monthly +report publications on the website and implementing Option A for +external commits #215. +Although most of these items are still open, huge progress has been made. To +accelerate the investigation, they improved their logging to give more precise +errors when a transition requirement fails, and to reduce duplication on effets +logged content. Last but not least, the team is exploring formal methods and +attended a workshop on formalizing cryptographic protocols in Agda.

What did the team achieve this week

  • Continued investigating broken head and opened an issue to keep track #897.

    As part of this issue, improvements were made to the node logs:

    • Give a precise error when a transition requirement fails #895.

    • Reduce duplication for effects logged content by using sequential eventId and effectId pair #896.

  • Fixed references in the hydra specification #893.

  • Attended a workshop on formal methods and crypto in Agda.

What are the goals of next week

  • Investigate and re-open our team-internal head on mainnet.
  • Improve and provide regular benchmarks for Hydra #186.
  • Complete journey for external commits implementing Option A and start implementing Option B #215.
  • Authenticate network messages #727.
  • Add hydra as tool to developr platform #872.
  • Fix monthly report publication on docs website.
+ + + + \ No newline at end of file diff --git a/2023-06-07-node-cli-api/index.html b/2023-06-07-node-cli-api/index.html new file mode 100644 index 00000000000..a699653ed06 --- /dev/null +++ b/2023-06-07-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-06-07 - 2023-06-20

High level summary

  • Completed cardano-cli migration to input-output-hk/cardano-cli
  • cardano-cli ping now uses cardano-ping-0.2.0.5
  • New queries on API:
    • queryCurrentEpochState
    • queryDebugLedgerState
    • queryGenesisParameters
    • queryPoolDistribution
    • queryPoolState
    • queryProtocolParameters
    • queryProtocolParametersUpdate
    • queryProtocolState
    • queryStakeAddresses
    • queryStakeDistribution
    • queryStakePoolParameters
    • queryStakeSnapshot
  • Deprecate:
    • queryPparams
  • Export query API as functions
    • genFeatureValueInEra
    • featureInShelleyBasedEra
    • isFeatureValue
    • valueOrDefault
    • asFeatureValue
    • asFeatureValueInShelleyBasedEra
    • queryEpoch
    • requireShelleyBasedEra
  • Restructure cardano-testnet (WIP)

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-06-08-db-sync/index.html b/2023-06-08-db-sync/index.html new file mode 100644 index 00000000000..340513ba53f --- /dev/null +++ b/2023-06-08-db-sync/index.html @@ -0,0 +1,31 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

We've made progress in all high level objectives

  • CIP-1694 integration design
  • UTxO-HD integration proof of concept
  • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2
  • A new hire will help us with devx issues.

Lower level summary

+ + + + \ No newline at end of file diff --git a/2023-06-08-goedel/index.html b/2023-06-08-goedel/index.html new file mode 100644 index 00000000000..ccf2eebabe3 --- /dev/null +++ b/2023-06-08-goedel/index.html @@ -0,0 +1,31 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on giving and preparing public +talks, also on preparing final versions of their ICE 2023 papers, and +on analysing chain selection.

This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

Details

+ + + + \ No newline at end of file diff --git a/2023-06-08-sre/index.html b/2023-06-08-sre/index.html new file mode 100644 index 00000000000..12a1b7bfede --- /dev/null +++ b/2023-06-08-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 2 min read
John Lotoski

High level summary

The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer.

Lower level summary

Bitte

  • Equinix bare metal capability was added to bitte: bitte-pull-194
  • Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: bitte-pull-201

Bitte-cells

Cardano-graphql

Cardano-node

Cardano-ops

Cardano-world

Ci-ops

  • Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ci-ops-pull-108

Ci-world

Cicero

  • Implement a cicero webhook backoff with exponential decay plus jitter: cicero-pull-79

Iohk-nix

Openziti

+ + + + \ No newline at end of file diff --git a/2023-06-08-system-test/index.html b/2023-06-08-system-test/index.html new file mode 100644 index 00000000000..6ea805eebaa --- /dev/null +++ b/2023-06-08-system-test/index.html @@ -0,0 +1,24 @@ + + + + + +System Test Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

System Test Team Update

· 2 min read
Martin Kourim

High level summary

Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.7 and 8.0.0 releases.

Workstreams

Full list of closed PRs

Framework improvements:

  • Make cardano-submit-api REST API service available and run corresponding regression tests by default
  • Update cabal build testing for 8.0.0
  • Add support for testing governance SPO poll
  • Use Poetry for Python dependency management
  • Check status of known GH issues during tests runtime and finish the test accordingly
  • Generate topology files with both IP addresses and DNS names
  • Log issues like failure to start a cluster instance and report errors during tests runtime

Testing improvements

  • Add rollback testing:
    1. global consensus is reached after rollback, in situation where less than securityParam blocks were produced since cluster split
    2. global consensus is not reached when more than securityParam blocks were produced, and the result is permanent fork
  • Add tests to governance SPO poll commands

Node:

DB-Sync:

  • improvements in db-sync sync tests
  • improvements in db-sync functional tests
+ + + + \ No newline at end of file diff --git a/2023-06-09-crypto/index.html b/2023-06-09-crypto/index.html new file mode 100644 index 00000000000..91655f1162b --- /dev/null +++ b/2023-06-09-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· One min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • cardano-base: E2E tests for BLS bindings and KES agent
  • Sidechains: Implement ECC chip and Rescue hash primitives for ATMS
  • mithril: Full node verifier

Low level summary

cardano-base

  • RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); blocked due to issue with windows' localSnocket. Trying to resolve.
  • Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors #317.
  • Above, blocked by the simplification of typeclasses #404.
  • Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings

Mithril

  • Implementation of Full Node Verifier #939

Sidechains

  • ECC chip implemented for JubJub over BLS12-381
  • Rescue chip implemented for hashing.
  • Currently working on Schnorr signature (which uses the above constraints)
+ + + + \ No newline at end of file diff --git a/2023-06-09-developer-experience/index.html b/2023-06-09-developer-experience/index.html new file mode 100644 index 00000000000..eaaac0a2e73 --- /dev/null +++ b/2023-06-09-developer-experience/index.html @@ -0,0 +1,24 @@ + + + + + +Developer Experience Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Developer Experience Update

· 3 min read
Moritz Angermann

High level summary

The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements.

Lower level summary

build support & maintainance

Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure LoadDLL errors to blst integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like cardano-base experiencing significant reductions in CI complexity.

compiler upgrades

After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility.

CHaP (cardano-haskell-packages)

We relocated the underlying tooling, (foliage), for CHaP into the IOG organization. Furthermore, we have introduced improved tooling to quickly add constraints to packages, better error reporting for add-revision and better hackage url compatibility to facilitate easer usage of CHaP.

GitHub Actions

Our repository, input-output-hk/actions, now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the base and haskell install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking cabal.

iohk-nix

The iohk-nix repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, sodium, blst, and secp256k1, are also fixed to certain revisions within the iohk-nix repository.

haskell.nix

Haskell.nix has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to gmp.

devx

The relatively new devx repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The devx repository's readme has been updated to reflect its purpose and usage guidelines.

upstream tooling

Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

+ + + + \ No newline at end of file diff --git a/2023-06-09-hydra/index.html b/2023-06-09-hydra/index.html new file mode 100644 index 00000000000..8b85fc1b395 --- /dev/null +++ b/2023-06-09-hydra/index.html @@ -0,0 +1,32 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Franco Testagrossa

High-level summary

This week, the Hydra team worked on multiple fronts. They finished the +investigation about the broken head on mainnet and re-opened their persistent +head instance. The team also fixed the monthly report publication on their +website and started sketching ideas and further improvements. Also, they are on +the last mile to deliver a new feature which will allow parties to commit funds +from extern wallets. Finally the team started to work on optimizing the +performance on their benchmarks.

What did the team achieve this week

  • Finished investigation on broken head on mainnet #897 and re-opened it.
  • Added support for externally committing regular utxo #887
  • Fix monthly report publication on docs website and published the monthly report. Odd problems when publishing monthly report:
    • Make us think about if we should change something about the website #908
    • Open issue to docusaurus #9036
  • Fixed a bug in the benchmark process #910
  • Explored performance of the hydra-node{.verbatim} and identified a +bottleneck.
  • Timed transaction feature is being used by the auction project 🎉

What are the goals of next week

  • Complete performance analysis and start/plan improvements and provide +regular benchmarks for Hydra #186
  • Add hydra as tool to developer platform #872.
  • Authenticate network messages #727.
  • Complete journey for external commits using multiple script UTxOs #903
  • Start implementing Option B for external commits #215.
+ + + + \ No newline at end of file diff --git a/2023-06-12-network/index.html b/2023-06-12-network/index.html new file mode 100644 index 00000000000..d9cd3bfa8dc --- /dev/null +++ b/2023-06-12-network/index.html @@ -0,0 +1,43 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 3 min read
Marcin Szamotulski

Network Update

Key contributions and advances

We merged light peer sharing feature, which allows to include inbound peers +into outbound governor known peers. This is the primary way for new +unregistered nodes to enter the network, which then can be shared using peer +sharing. Note that peer sharing is an experimental feature which is disabled +until genesis & eclipse evasion as fully implemented. See #3596.

We are making progress reviewing eclipse evasion, #3886.

We fixed another bug in local root peers. We found out that if the local roots +where ignored until the first domain name was resolved, see #4583. The bug +fix was backported and released in ouroboros-network-0.8.1.1.

We re-started working on dynamically enabling block forging to address issue +#3159, which will enable us to release P2P on block producing nodes. See #140.

New cardano-ping / cardano-cli ping release

We prepared a new release of cardano-ping library which supports the new +query feature (query supported versions). See #4589, #4593 and #5313. +The new version of cardano-cli ping will use ISO8601 formatted +timestamps; also the formatting of ping results is slightly improved, and it +will introduce the new --query-versions (-Q) switch. If the remote site +supports the query parameter, the command will print:

redacted-ip:port network rtt: 0.064
redacted-ip:port handshake rtt: 0.064010896s
redacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat
orAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]

otherwise it will print the negotiation results

redacted-ip:port network rtt: 0.045
redacted-ip:port handshake rtt: 0.101867615s
redacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder

Note that in that case cardano-cli ping offers InitiatorAndResponder, which +allows us to detect whether the remote side is an InitiatorOnly or +InitiatorAndResponder. Also cardano-cli ping will no longer announce +itself as InitiatorAndResponder, except for the case mentioned above.

Other smaller contributions

On a request from the Marlow Team, we published haddocks of typed-protocols, +which are now available here (#40, #41).

We made a new release of strict-stm-1.1.0.1 on Hackage, which fixed a bug in +package description file, #101 .

We also helped to debug a deadlock when using named pipes on Windows in the new +RawBearer API. The API is being used to store secret keys only in memory. +The PR #4395 is under review.

We also have two more PRs which are under review:

  • #4530: enabling ledger peers on a fixed number of slots before the tip of the chain;
  • #4580: a PR which fixes inconsistencies in one of our cddl specs.
+ + + + \ No newline at end of file diff --git a/2023-06-14-consensus/index.html b/2023-06-14-consensus/index.html new file mode 100644 index 00000000000..d9698d14a33 --- /dev/null +++ b/2023-06-14-consensus/index.html @@ -0,0 +1,27 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the Byron and TPraos eras do not need to be checkpointed for an MVP. +There is one remaining question (which applies also to the Praos era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated "Limit on Patience" timeout sufficiently bounds how long the adversary can inflate a victim's overall sync time.

On the UTxO-HD front, the prototype branch was rebased on top of the latest ouroboros-consensus main branch and integrated on top of cardano-node 8.1.1-pre. As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD. +We managed to run a node again with UTxO-HD enabled. +We also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for cardano-node, which uncovered a performance regression on the Network component when using GHC-9.2/9.4. This is being addressed.

Regarding our support activities, we Released fs-sim-0.2.0.0 and are in the process of preparing the 8.2 release of cardano-node. We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests.

+ + + + \ No newline at end of file diff --git a/2023-06-14-performance-and-tracing/index.html b/2023-06-14-performance-and-tracing/index.html new file mode 100644 index 00000000000..c937a6b0173 --- /dev/null +++ b/2023-06-14-performance-and-tracing/index.html @@ -0,0 +1,30 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Michael Karg

High level summary

  • Benchmarking: We've continued release benchmarking and established a new baseline for 8.0.0.
  • New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined.
  • Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.

Low level overview

Benchmarking

In our release benchmarking cycle, we established a new performance baseline for 8.0.0. Additionally, we've measured +performance under various workloads for 8.1.1-pre; the results look promising and validate the optimization efforts +done on several system components.

In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for +benchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper.

Tracing

The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be +meaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific +trace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles.

Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD.

Nomad backend

As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs.

This means the backend is entering validation phase, where we systematically compare all metrics taken from the new +infrastructure to the existing ones, including determining reproducibility and variance.

+ + + + \ No newline at end of file diff --git a/2023-06-15-mithril/index.html b/2023-06-15-mithril/index.html new file mode 100644 index 00000000000..bb07c5b5939 --- /dev/null +++ b/2023-06-15-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client’s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet.

Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI.

Low level overview

  • Completed on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the issue Create the sub-command for 'Mithril Stake Distribution' in client #896
    • Completed the issue Adapt end to end tests to handle new types of data #899
    • Completed the issue Update client documentation #897
    • Completed the issue Update architecture documentations for new types of data #898
    • Completed the issue Refactoring client #960
  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Completed the issue Enhance terraform infrastructure #930
  • Completed the epic that implements the computation of the stake distribution for mainnet #880:
    • Completed the issue Check performance impact of new stake distribution command on the 'mainnet' #962
  • Worked on the epic Prepare Mithril Signer deployment model for SPO #862:
    • Worked on the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
  • Worked on bugs and optimizations:
    • Completed the issue Aggregator does not always detect new immutable file #953
    • Completed the issue CI tests fail with Rust '1.70.0' #958
    • Worked on the issue End to end tests are flaky #954
    • Worked on the issue Certificate dates in metadata are not on the same timezone #946
    • Worked on the issue Refactor 'MithrilStakeDistribution' entity #967
    • Completed the issue Fix 'Mithril Client multi-platform test' with new client interface #956
    • Completed the issue Enhance 'ImmutableDigesterError::NotEnoughImmutable' error #969
    • Completed the issue Client 'snapshot download' command fails with option '--download-dir' #979
+ + + + \ No newline at end of file diff --git a/2023-06-16-hydra/index.html b/2023-06-16-hydra/index.html new file mode 100644 index 00000000000..d1bd7a4184d --- /dev/null +++ b/2023-06-16-hydra/index.html @@ -0,0 +1,27 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa

High-level summary

This week, the Hydra team focused their efforts on continuing to investigate and +experiment operating a head on mainnet. They collected several bugs and issues +and worked on fixing them. Now the team is soon to release a new version, +0.11.0, which comes with a lot of improvements and bug fixes.

What did the team achieve this week

  • Restored and fixed a bug which stalled our head on mainnet #927
  • Solved one user issue #914
  • Reduced significantly local state size and logs by removing the full scripts from it #928
  • (pending review) Reduced snapshot size in the API, by only including tx ids #922

What are the goals of next week

  • New release 0.11.0
  • Monthly report & review meeting.
  • Fix some minor bugs discovered when operating our head on mainnet
  • Complete journey for external commits using multiple script UTxOs #903
  • Publish benchmarks and provide regular benchmarks for Hydra #186
+ + + + \ No newline at end of file diff --git a/2023-06-23-goedel/index.html b/2023-06-23-goedel/index.html new file mode 100644 index 00000000000..0f610ca9246 --- /dev/null +++ b/2023-06-23-goedel/index.html @@ -0,0 +1,26 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the teams presented two papers at ICE 2023.

Details

+ + + + \ No newline at end of file diff --git a/2023-06-23-hydra/index.html b/2023-06-23-hydra/index.html new file mode 100644 index 00000000000..c2c60ca69ad --- /dev/null +++ b/2023-06-23-hydra/index.html @@ -0,0 +1,34 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa
Pascal Grange

High-level summary

This week, the Hydra team shared progress updates during the monthly review +meeting (monthly report and video recording available soon) and started +experimenting on preview network with the new commit from external wallet +feature.

What did the team achieve this week

  • Monthly report & review meeting, demonstrating commit from external +wallet
  • Published regular benchmarks for +Hydra
  • Moved forward the journey for external commits using multiple script UTxOs +#903
  • Changed the API to only put transaction id in snapshots, instead of the full +transactions #922 -> this +is now evolved into fully addressing #728
  • Fuel marking is now optional as one can now commit from an external wallet +#924
  • Add flag option to display node version on tui +#934

What are the goals of next week

  • Complete external commits using multiple script UTxOs #903
  • New release 0.11.0
  • Dirtroad solution of improved persistence performance #913
+ + + + \ No newline at end of file diff --git a/2023-06-23-network/index.html b/2023-06-23-network/index.html new file mode 100644 index 00000000000..0319e82164e --- /dev/null +++ b/2023-06-23-network/index.html @@ -0,0 +1,43 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

Network Update

Key contributions

We held a series of session to review the implementation of big ledger peers +(eclipse evasion). See #4462.

We get a request from a 3rd party to clarify an inconsistency between CDDL spec +and protocol implementation. We worked out a nice solution which takes +advantage of the any notion available in CDDL. On the Haskell side we +provide Any type which gen generate almost any CBOR term (some are excluded +only because they are not decoded back to the same form, and we relay on that +property). See #4580.

We fixed a bunch of problems of the cardano-cli ping command. It also now has +a limited support of node-to-client mini-protocol (the -c option is +ignored, as it cannot be supported by node-to-client protocol). Note that +the format of messages has changed, timestamps are printed in ISO8601 format. +See #4601, #5326, #5313, #30

In order to provide a new flag in the topology file which enables ledger peers +when the chain is close to the tip, we continued to work on #4530. This is +currently in review, the consensus team will need to provide us with the new +api. This feature is useful for two reasons: makes it easier to maintain +a topology file, it will also limit the traffic on public roots generated by +for example full node wallets and distribute it to ledger peers.

We also continued to work on a blog post which describes the journey of design +& implementation of the dynamic P2P network layer. Too be announced soon :).

Other smaller changes

We limit the concurrency of resolving dns names. Up to 8 root peers or ledger +peers DNS names are resolved concurrently, and at most 2 local root peer DNS +names. See #4596.

We fixed handshake query timeout in #4603.

We renamed one of the block-fetch decision constructors as requested by the +consensus team, see #4608.

+ + + + \ No newline at end of file diff --git a/2023-06-23-sre/index.html b/2023-06-23-sre/index.html new file mode 100644 index 00000000000..75caea6504b --- /dev/null +++ b/2023-06-23-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· One min read
John Lotoski

High level summary

The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:

  • A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality
  • Cardano Sanchonet environment was stood up to test Conway era functionality
  • Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case
  • Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments

Lower level summary

Cardano-node

  • Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: cardano-node-pull-5318

Cardano-ops

Cardano-world

Ci-ops

Ci-world

  • Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ci-world-compare

Devx-ci

  • A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: devx-ci-repo

Iohk-nix

+ + + + \ No newline at end of file diff --git a/2023-06-28-consensus/index.html b/2023-06-28-consensus/index.html new file mode 100644 index 00000000000..8f4d0f9c089 --- /dev/null +++ b/2023-06-28-consensus/index.html @@ -0,0 +1,24 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team.

The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components.

Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node.

Genesis

  • We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.

  • We decided on an approach of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team.

UTxO-HD

  • We merged the last of the PRs that were part of UTxO-HD improvements for version 0.1: expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size.
  • We added a new "legacy" cardano block in a new ouroboros-consensus-cardano-legacy-block package that should ease the transition for some downstream packages to UTxO-HD, like db-sync. This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block.
  • We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.
+ + + + \ No newline at end of file diff --git a/2023-06-28-performance-and-tracing/index.html b/2023-06-28-performance-and-tracing/index.html new file mode 100644 index 00000000000..c0337e06597 --- /dev/null +++ b/2023-06-28-performance-and-tracing/index.html @@ -0,0 +1,24 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Michael Karg

High level summary

  • Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9.
  • Infrastructure: The first batch of refactoring and documentation for our tx-generator has been merged to master.
  • Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown.
  • Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.

Low level overview

Benchmarking

The compiler switch to GHC9 as the default build platform for cardano-node and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard.

Using the forge-stress approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node.

Infrastructure

The tx-generator is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to master. Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base.

Tracing

The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue.

Nomad backend

With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress.

Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend.

+ + + + \ No newline at end of file diff --git a/2023-06-29-mithril/index.html b/2023-06-29-mithril/index.html new file mode 100644 index 00000000000..fef70ffff16 --- /dev/null +++ b/2023-06-29-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 3 min read
Jean-Philippe Raynaud

High level overview

The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano mainnet infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator.

Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1.

Low level overview

  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Worked on the issue Add infrastructure monitoring #987
  • Completed the epic Prepare Mithril Signer deployment model for SPO #862:
    • Completed the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
    • Completed the issue Adapt infrastructure to use Mithril Relay #1018
    • Completed the issue Announce the new signer deployment model in a dev blog post #1017
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Worked on the issue Design & implement basic stress test tool for aggregator #991
  • Worked on bugs:
    • Completed the issue Aggregator does not exit on critical error #993
    • Completed the issue Computation of master certificate of an epoch is incorrect #1006
    • Completed the issue End to end tests are flaky #954
    • Worked on the issue 'testing-preview' network does not create certificates #1015
  • Worked on optimizations:
    • Completed the issue Dates format is not standardized #946
    • Completed the issue Add 'recompute-certificates-hash' command to aggregator #1001
    • Completed the issue Add a retry mechanism for artifact creation in aggregator #984
    • Completed the issue Log node version at startup in Aggregator/Signer #944
    • Completed the issue Reactivate Publish Results job in CI #978
    • Completed the issue Clean 'pending_snapshot' directory of aggregator #983
    • Completed the issue Update OpenAPI spec examples #1000
  • Worked on refactoring:
    • Completed the issue Refactor 'MithrilStakeDistribution' entity #967
    • Completed the issue Refactoring client #982
    • Completed the issue Refactor download code in client #1010
    • Worked on the issue Factorize protocol crypto operations #669
  • Worked on dependencies:
    • Completed the issue Upgrade Cardano node to '8.1.1' #973
+ + + + \ No newline at end of file diff --git a/2023-06-30-hydra/index.html b/2023-06-30-hydra/index.html new file mode 100644 index 00000000000..6e1f12eec0a --- /dev/null +++ b/2023-06-30-hydra/index.html @@ -0,0 +1,30 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team wrote and published the monthly report for June, +implemented the end-to-end functionality for external commits, and tested it on +the preview environment. They also listed Hydra as a tool on the Cardano +developer portal, providing more visibility for the project. The team clarified +the path forward for L2 protocol improvements and explored an alternative CI +approach using cabal instead of nix. Additionally, they released version 0.11.0, +marking another milestone in the projects development.

What did the team achieve this week

  • Written and published the monthly report for June
  • Implemented external commits end-to-end incl. tested it on preview #215
  • Listed Hydra as a tool on cardano developer portal
  • Cleared up path forward on L2 protocol improvements #728
  • Established an alternative CI using more cabal tools #923
  • Release version 0.11.0

What are the goals of next week

  • Spike on performance improvements of event sourced persistence #913
  • Complete ReqSn only sends transaction ids #728
  • Groom and plan last items for 0.12.0 (remove internal commit)
  • Improve reliability of benchmarks
+ + + + \ No newline at end of file diff --git a/2023-07-04-db-sync/index.html b/2023-07-04-db-sync/index.html new file mode 100644 index 00000000000..882169be860 --- /dev/null +++ b/2023-07-04-db-sync/index.html @@ -0,0 +1,30 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

We've made progress in all high level objectives

  • CIP-1694 integration design
  • UTxO-HD integration proof of concept
  • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested
  • Many devx issues resolved

Lower level summary

  • We have improved and validated the design for the Conway integration in db-sync
  • Improved the initial integration of the UTxO-HD feauture branches which are under test
  • Prepared a new release 13.1.1.3 which supports node 8.1.1 +#1455.
  • This also fixes a bug +#1451
  • Added new tests to the new tx_out options +#1429
  • Fixed a chronic issue in db-sync related to exception handling and concurrency +This fixes many other issues and simplifies the logic in db-sync +#1447
  • A number of fixes and improvements in ci, docker, devx, docs +#1436#1442#1448#1452
+ + + + \ No newline at end of file diff --git a/2023-07-04-node-cli-api/index.html b/2023-07-04-node-cli-api/index.html new file mode 100644 index 00000000000..c43be5b9428 --- /dev/null +++ b/2023-07-04-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-06-21 - 2023-07-04

High level summary

  • Started integration of conway era into the cardano-api,
  • Pre-release of cardano-cli 8.2.1 which enables creating goveranance "Update constitution" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.
  • Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities.
  • Continue refactoring cardano-testnet
  • CI and docs house keeping on the new cardnao-cli and cardano-api repositories

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-07-06-developer-experience/index.html b/2023-07-06-developer-experience/index.html new file mode 100644 index 00000000000..2b5b330afad --- /dev/null +++ b/2023-07-06-developer-experience/index.html @@ -0,0 +1,24 @@ + + + + + +Developer Experience Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Developer Experience Update

· 2 min read
Moritz Angermann

High level summary

The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements.

Lower level summary

build support & maintainance

The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions.

compiler upgrades

Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests.

Hydra Tools

Our repository, input-output-hk/actions, has seen quite some improvements to facility the hydra <-> github integration.

haskell.nix

Haskell.nix has been maintained and updated with the addition of preliminary GHC 9.8 support.

devx

The devx repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our actions/devx GitHub Actions, we have a consistent set of tooling for

  • nix develop shells
  • GitHub CodeSpaces integration
  • VSCode DevContainer support
  • GitHub Actions integration

upstream tooling

Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

+ + + + \ No newline at end of file diff --git a/2023-07-07-crypto/index.html b/2023-07-07-crypto/index.html new file mode 100644 index 00000000000..07c9f781831 --- /dev/null +++ b/2023-07-07-crypto/index.html @@ -0,0 +1,25 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· One min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Sidechains: First version of snark-based ATMS
  • mithril: Full node verifier
  • kes_agent: Keep progress, and prepare CIP and CPS
  • CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP

Low level summary

kes_agent

Mithril

  • Final review of the implementation of Full Node Verifier #939. +Included benchmarks and further tests.

Sidechains

  • Schnorr signature implemented
  • ATMS signature implemented
  • First benchmarks show that for the committe size we expect, we need 2^21 constraints.

CIPs and community

  • Addressed some review comments in #PR506
  • Worked with the communityt on #PR524 to include Keccak as part of the next Plutus release.
+ + + + \ No newline at end of file diff --git a/2023-07-07-goedel/index.html b/2023-07-07-goedel/index.html new file mode 100644 index 00000000000..6fe70a551df --- /dev/null +++ b/2023-07-07-goedel/index.html @@ -0,0 +1,28 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the teams have been working on finalising their ICE papers +for publication in EPTCS, formalising concensus, and investigating chain +sync.

Details

  • Preparing final versions of ICE papers

  • Reviewing the chain sync design and documentation

  • Refactoring the thorn calculus

  • First draft of Praos specification

  • Developing bounding factors on timeouts

+ + + + \ No newline at end of file diff --git a/2023-07-07-hydra/index.html b/2023-07-07-hydra/index.html new file mode 100644 index 00000000000..d575725a9ce --- /dev/null +++ b/2023-07-07-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa
Sasha Bogicevic

High-level summary

This week the Hydra team accomplished some nice progress. They secured the +network layer further by implementing authentication of the messages between the +peers in the Head protocol. In the process they also managed to separate +HeartBeat messages from the protocol ones which somewhat improved the quality of +code in Hydra. The team also finished work related to sending only transaction +ids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark +publishing on the website.

What did the team achieve this week

What are the goals of next week

  • Spike on performance improvements of event sourced persistence #913
  • Add new endpoint for submitting client transactions
  • Remove commit from internal wallet
+ + + + \ No newline at end of file diff --git a/2023-07-07-sre/index.html b/2023-07-07-sre/index.html new file mode 100644 index 00000000000..bd55afc2b4d --- /dev/null +++ b/2023-07-07-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· One min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance.

Some notable recent improvements include:

  • Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment
  • Explorer component updates
  • Spongix caching server rewrite for R2 Cloudflare support and various performance improvements

Lower level summary

Cardano-node

Cardano-ogmios

Cardano-ops

  • Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: cardano-ops-compare

Cardano-rosetta

Cardano-world

Spongix

  • Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: spongix-simple-branch
+ + + + \ No newline at end of file diff --git a/2023-07-12-consensus/index.html b/2023-07-12-consensus/index.html new file mode 100644 index 00000000000..afa8ba19913 --- /dev/null +++ b/2023-07-12-consensus/index.html @@ -0,0 +1,24 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a proposed fix. The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine.

The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility.

On the support front, the team drafted an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load.

+ + + + \ No newline at end of file diff --git a/2023-07-12-performance-and-tracing/index.html b/2023-07-12-performance-and-tracing/index.html new file mode 100644 index 00000000000..3a62141a876 --- /dev/null +++ b/2023-07-12-performance-and-tracing/index.html @@ -0,0 +1,24 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg

High level summary

  • Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed.
  • Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends.
  • Tracing: Optimization of the new tracing system is ongoing and yielding good performance results.
  • Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.

Low level overview

Benchmarking

Our analysis of the GHC9 build of cardano-node has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation.

In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into cardano-node. This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle.

Infrastructure

We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in master.

Tracing

Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance.

Nomad backend

For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run.

Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to master.

+ + + + \ No newline at end of file diff --git a/2023-07-13-mithril/index.html b/2023-07-13-mithril/index.html new file mode 100644 index 00000000000..d486c1886c0 --- /dev/null +++ b/2023-07-13-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team created a new 2327.0 distribution. They focused on preparing the beta launch on the mainnet: they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the mainnet infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library.

Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs.

Low level overview

  • Released the new distribution 2327.0
  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Completed the issue Add infrastructure monitoring #987
    • Worked on the issue Deploy 'mainnet' infrastructure #988
    • Worked on the issue Handle Secrets management #989
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Worked on the issue Design & implement basic stress test tool for aggregator #991
  • Worked on optimizations:
    • Completed the issue Remove certificate hash from Artifact #932
    • Completed the issue Check vulnerabilities in CI #1037
    • Completed the issue Add 'created_at' in Mithril Stake Distribution messages #1030
    • Completed the issue Add a 'run-only' option in end to end test #1048
  • Worked on refactoring:
    • Completed the issue Factorize protocol crypto operations #669
    • Completed the issue Refactor aggregator dependency injection and services #1058
    • Completed the issue Build static binaries in CI #874
  • Worked on documentation:
    • Completed the issue Prepare SPO on-boarding guide #1049
    • Completed the issue Add instructions to set firewall using iptables #1040
    • Completed the issue Update ufw command to set firewall on Mithril Signer installation instructions #1041
  • Worked on bugs:
    • Completed the issue Aggregator does not detect certificate chain epoch gap #952
    • Completed the issue 'testing-preview' network does not create certificates #1015
    • Completed the issue SQLite compatibility in aggregator #837
    • Completed the issue Q&A followup fixes #1035
    • Completed the issue E2E tests are flaky in CI #1023
+ + + + \ No newline at end of file diff --git a/2023-07-14-hydra/index.html b/2023-07-14-hydra/index.html new file mode 100644 index 00000000000..57fbdc04c0a --- /dev/null +++ b/2023-07-14-hydra/index.html @@ -0,0 +1,29 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa
Sasha Bogicevic

High-level summary

This week the team focused on exploring the event sourced persistence in order +to improve hydra-node performance. Because of this work the team noticed we +need to refactor the emit snapshot emission logic and update the spec in the +light of new changes. They also took the time to revisit their goals and product +plans for the next quarter as well as doing some security fixes related to +multisignatures.

What did the team achieve this week

  • Finished spike about performance improvements of event sourced persistence #963.
  • Refactor snapshot emission in protocol logic.
  • Revisited our roadmap and goals.
  • Prepared and conducated a learning session on lean-waste.
  • Improve security of multi-signature checks, see this Github security advisory.
  • Implemented a cache friendly way to version our binaries #962.

What are the goals of next week

  • Implement Event sourced persistence #913.
  • Remove deprecated internal commit #954 and close #728.
+ + + + \ No newline at end of file diff --git a/2023-07-18-node-cli-api/index.html b/2023-07-18-node-cli-api/index.html new file mode 100644 index 00000000000..11efdf31965 --- /dev/null +++ b/2023-07-18-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-07-05 - 2023-07-18

High level summary

  • Integrate Conway certificates in cardano-api
  • Prepare cardano-cli and cardano-api for cardano-node 8.1.2
  • Tagged cardano-cli 8.3.0.0
    • Query for the hash of the constitution (Conway)
    • Ability to create votes and governance actions
  • Tagged cardano-cli 8.3.1.0
    • Make it build with ghc-9.6
  • Upgrade to optparse-applicative-fork-0.18.1.0 for parsing command line options

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-07-20-goedel/index.html b/2023-07-20-goedel/index.html new file mode 100644 index 00000000000..86a75d16888 --- /dev/null +++ b/2023-07-20-goedel/index.html @@ -0,0 +1,30 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is working on formalising mini protocols, the performance +modelling prototype and also finishing off their ICE papers.

Details

  • Formalization of the chain synchronization mini-protocol in the +thorn calculus

  • Final pre-publication steps for ICE 2023 papers

  • Developing approach for specification and verification of +mini-protocols

  • Started work on porting the DeltaQ framework to a new, more concrete +backend based on piecewise-polynomials

+ + + + \ No newline at end of file diff --git a/2023-07-21-hydra/index.html b/2023-07-21-hydra/index.html new file mode 100644 index 00000000000..6c925882f10 --- /dev/null +++ b/2023-07-21-hydra/index.html @@ -0,0 +1,34 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team updated the specification to align with recent +off-chain protocol changes, completed refactoring the snapshot emission +in preparation for event-sourced protocol logic, and updated to GHC +9.2.7, resulting in improved compile times and slightly smaller Plutus +scripts.

What did the team achieve this week

  • Updated the specification to match the recent off-chain protocol +changes to complete +#728
  • Refactored the snapshot emission logic in preparation for event +sourced protocol logic.
  • Updated to GHC 9.2.7, which led to improved compile times and +slightly smaller plutus scripts.

What are the goals of next week

  • Monthly review meeting next wednesday and July report
  • Reflect latest information onto our roadmap.
  • Actual implemention of event-sourced persistence +#913.
  • Update the use cases section on https://hydra.family
  • Remove deprecated internal commit +#954.
+ + + + \ No newline at end of file diff --git a/2023-07-21-ledger/index.html b/2023-07-21-ledger/index.html new file mode 100644 index 00000000000..d4c710c8ba2 --- /dev/null +++ b/2023-07-21-ledger/index.html @@ -0,0 +1,28 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Alexey Kuleshevich

High level summary

Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet. +All members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era. +We also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release). +Additionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available. +We also made progress on the constraint-based generators, which can now generate valid transactions and ledger states.

What we achieved

  • [pull-3521] [pull-3554] Improved Governance model (GovernanceProcedures, ProposalProcedure)
  • [pull-3520] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert )
  • [pull-3531] Refactored and simplified code interacting with Plutus
  • [pull-3558] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix.
  • [pull-3550] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed.
  • [pull-3551] [pull-3546] [pull-3472] Updated tools and added some small improvements
  • [issue-3146] [pull-3498] Introduced Conway protocol parameters
  • [issue-2948] [pull-3499] Implemented ConwayGenesis with the new protocol parameters

What is currently in progress

+ + + + \ No newline at end of file diff --git a/2023-07-21-sre/index.html b/2023-07-21-sre/index.html new file mode 100644 index 00000000000..b74f66fec6f --- /dev/null +++ b/2023-07-21-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· One min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent improvements include:

  • Re-spin sanchonet for testing a new node version followed by fork to Conway
  • Deploying a sanchonet compatible faucet to sanchonet
  • Migrate shelley qa legacy environment to cardano-world

Lower level summary

Cardano-node

Cardano-ops

  • Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: cardano-ops-compare

Cardano-world

Iohk-nix

+ + + + \ No newline at end of file diff --git a/2023-07-26-consensus/index.html b/2023-07-26-consensus/index.html new file mode 100644 index 00000000000..020cbe3413d --- /dev/null +++ b/2023-07-26-consensus/index.html @@ -0,0 +1,26 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

The db-sync team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now. +We also focused on completing tracing support for UTxO-HD in cardano-node. +Currently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further.

The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ChainSync client as part of the onboarding efforts for the team that will implement Genesis.

The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team.

Genesis liaising

Improvements to the ChainSync client:

+ + + + \ No newline at end of file diff --git a/2023-07-27-mithril/index.html b/2023-07-27-mithril/index.html new file mode 100644 index 00000000000..f7476d119db --- /dev/null +++ b/2023-07-27-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team launched Mithril protocol’s mainnet beta: the release-mainnet network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch.

They have released a new distribution 2329.0, which is running on the release-mainnet network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator.

Finally, they have worked on enhancing the documentation for onboarding SPOs and setting up a Mithril signer, and fixing installation bugs of the binary artifacts produced in the CI.

Low level overview

  • Created the dev blog post Mithril Protocol’s Mainnet Beta Launch
  • Released the new distribution 2329.0
  • Closed the epic that prepares the Mithril infrastructure for mainnet #767:
    • Completed the issue Deploy 'mainnet' infrastructure #988
    • Completed the issue Handle Secrets management #989
  • Worked on the epic Release 'mainnet' Mithril network #918
    • Completed the issue Prepare SPO on-boarding guide #1049
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Worked on the issue Design & implement basic stress test tool for aggregator #991
  • Worked on optimizations:
    • Completed the issue Enhance the configuration of Mithril relay #1080
    • Completed the issue Remove legacy store adapters from aggregator #1053
    • Completed the issue Add a 'sign' sub-command to 'genesis' command in aggregator #1081
  • Worked on refactoring:
    • Worked on the issue Refactor (de)serialization of crypto entities #668
  • Worked on documentation:
    • Completed the issue Enhance 'Run a Mithril Signer node (SPO)' guide #1055
  • Worked on bugs:
    • Completed the issue Shared library error in CI binaries #1073
    • Completed the issue Debian package does not install cleanly on older ubuntu versions #834
    • Completed the issue Aggregator panics with new (de)serialization of 'ProtocolVerificationKey' #1083
+ + + + \ No newline at end of file diff --git a/2023-07-28-hydra/index.html b/2023-07-28-hydra/index.html new file mode 100644 index 00000000000..b56f736c282 --- /dev/null +++ b/2023-07-28-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

During this week, the Hydra team achieved significant progress in various areas. +They conducted the monthly review meeting for July, which continously ensures +transparent communication and project evaluation. The team migrated the core +logic of the node to an event-sourced architecture and incremental writes of +events to persistence, enhancing the projects performance and maintainability. +Furthermore, the team added the ability to read protocol parameters via the API +and fixed the CI workflows to support pull requests from forks of external +contributors, streamlining the development process for community involvement.

What did the team achieve this week

  • Held the monthly review meeting for July (recording)
  • Migrate the core logic of the node to an event-sourced architecture #999
  • Updated persistence to faster incremental writes of events #1000
  • Added ability to read protocol parameters via API #735
  • Fix CI workflows to support pull requests from forks of external contributors #993
  • Updated to GHC 9.2.8 #1005
  • Prepared an updated use cases section on https://hydra.family (published with next release)

What are the goals of next week

  • Publish monthly report
  • Complete user transaction submission work #966
  • Remove commit from internal wallet (deprecated) #954
+ + + + \ No newline at end of file diff --git a/2023-07-31-network/index.html b/2023-07-31-network/index.html new file mode 100644 index 00000000000..29d8886bdeb --- /dev/null +++ b/2023-07-31-network/index.html @@ -0,0 +1,38 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 3 min read
Marcin Szamotulski

Network Update (Sprints 39 & 40)

The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away. +It was great to see and talk to so many of the community members.

Sprint 39 (Jun 26 - Jul 09)

Major changes

Now the following list of traces will be turned on by default:

node-to-client protocol
  • LocalConnectionManagerTracer
  • LocalInboundGovernor
  • LocalHandshake
  • LocalServer
node-to-node protocol
  • Server

See cardano-node#5353. This will be released in node-8.2.0.

We made sure that cardano-client-0.1.0.x library (which is db-sync) is not using the experimental node-to-client protocol. +The cardano-client-0.2.0.0 was not affected. +See ouroboros-network#4612.

We merged the dynamic block production feature to ouroboros-consensus (also available in the cardano-node-8.2.0 release). +Dynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes. +See ouroboros-network#3159, [ouroboros-consensu#140].

We continued to review the implementation of big ledger peers for eclipse evasion, see ouroboros-network#4462.

Minor changes

Sprint 40 (Jul 09 - Jul 23)

Major changes

We integrated ouroboros-network-0.8.2.0 with the master branch of cardano-node for the 8.2.0 release (the version match between ouroboros-network and cardano-node is purely accidental). +This includes:

  • integration with dynamic block production feature. +This feature is documented in the following PR.
  • Warm valency for local root peers (see below).

For the full list of features included in the 8.2.0 release from the network side, please take a look at the pre-release nodes.

We improved the memory footprint of peer metrics measured by the P2P stack. +Peer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation). +See ouroboros-network#4620. +The improvement will be available in cardano-node-8.2.0.

We added an optional explicit warm valency to local root peers of the P2P topology file. +Previously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to. +The hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones. +Warm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses. +See ouroboros-network#4575, cardano-node#5409.

+ + + + \ No newline at end of file diff --git a/2023-08-01-node-cli-api/index.html b/2023-08-01-node-cli-api/index.html new file mode 100644 index 00000000000..2df1bb694d7 --- /dev/null +++ b/2023-08-01-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-07-19 - 2023-08-01

High level summary

  • Release of Node 8.2.0
    • Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694.
    • This release is phase 1 of the SanchoNet roll out
    • Allows SPOs to vote on changes to the on-chain constitution.
    • Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag.
    • Updates to the networking packages prepare the road for peer sharing.
  • cardano-cli and cardano-api continue to integrate Conway era features
  • Continue refactoring of cardano-testnet

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-08-04-crypto/index.html b/2023-08-04-crypto/index.html new file mode 100644 index 00000000000..333368590db --- /dev/null +++ b/2023-08-04-crypto/index.html @@ -0,0 +1,25 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· One min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
  • mithril: Full node verifier
  • musig2: Finalised the missing fuzz tests
  • kes_agent: engineer on PTO. Work halted

Low level summary

Mithril

  • Work on a mithril flaky test #1105
  • Keep working on Full Node Verifier #939. +Should be merged in the coming week.

MuSig2

  • Finalised the fuzz tests #43

Sidechains

  • Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.
+ + + + \ No newline at end of file diff --git a/2023-08-04-goedel/index.html b/2023-08-04-goedel/index.html new file mode 100644 index 00000000000..7468bf52e84 --- /dev/null +++ b/2023-08-04-goedel/index.html @@ -0,0 +1,29 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is formalising mini protocols and also further developing the +performance modelling prototype.

Details

  • Developing new framework for specification and verification of +mini-protocols which is closer to the Haskell implementation.

  • Developed a new internal representation for the DeltaQ algebra that +allows for more modularity in backend implementations

  • Discussions regarding the Cardano networking specification

+ + + + \ No newline at end of file diff --git a/2023-08-04-hydra/index.html b/2023-08-04-hydra/index.html new file mode 100644 index 00000000000..2c5400777c8 --- /dev/null +++ b/2023-08-04-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team achieved notable progress in various aspects of the +project. The team updated the use case section for auctions on the /unstable +branch of the website, improving the understanding of Hydras applicability.

From the development side, the team successfully completed event-sourced +persistence, a key enhancement in the projects architecture which improves +off-chain transaction processing performance. They also added a +submit-transaction endpoint to the API.

In addition to project-related progress, the team actively engaged in community +reviews for several catalyst proposals related to Hydra and Mithril, +contributing to the wider Cardano ecosystem.

Finally, the full report for the month of July was also published here.

What did the team achieve this week

  • Published the monthly report for July
  • Updated the use case section for auctions (published on /unstable branch)
  • Completed event sourced persistence #913
  • Added a submit-transaction endpoint to the API #966
  • Community reviews for several catalyst proposals related to Hydra and Mithril
  • Created a network testing tool (hydra-net) #1006

What are the goals of next week

  • Update hydra-node to work with cardano-node version 8.x
  • Remove the internal commit functionality
  • Release version 0.12.0
  • Update & streamline tutorial to work with latest version of hydra-node
+ + + + \ No newline at end of file diff --git a/2023-08-04-ledger/index.html b/2023-08-04-ledger/index.html new file mode 100644 index 00000000000..6793d187497 --- /dev/null +++ b/2023-08-04-ledger/index.html @@ -0,0 +1,27 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Alexey Kuleshevich

High level summary

The ledger team was working almost exclusively on the Conway era implementation. In +particular, the main focus was directed towards solidifying transaction related types and +their binary representation. We also directed some effort into unblocking Plutus team with +respect to PlutusV3 integration.

Low level summary

Conway progress

  • pull-3552 - Allow Constitutional Committee Hot Key to be ScriptHash
  • pull-3581 - Make Constitutional Committee Cold Key to be ScriptHash
  • pull-3571 - Implement a portion of the TICKF rule.
  • pull-3556 - Add Script to Constitution
  • pull-3576 - Add optional Anchor to ConwayRegDRep certificate
  • pull-3495 - Implement refund logic for Proposal deposits
  • pull-3579 - Change voting procedure in the transaction to a nested Map
  • pull-3585 - Rename CommitteeCert into a GovCert
  • pull-3587 - Remove DelegStakeTxCert from the COMPLETE pragma for TxCert
  • pull-3586 - Add CurrentTreasuryValue to TxBody
  • pull-3588 - Rename key roles
  • pull-3557 - Update NewCommittee action to use RewardAcnt and add more info
  • pull-3595 - Add ConwayUpdateDRep constructor to ConwayTxCertGov type
  • pull-3600 - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway
  • pull-3597 - Update ProposalProcedure return address to be a RewardAcnt

Testing

  • pull-3374 - New features for generation subject to constraints
  • pull-3519 - Basic Conway features test

Bugfixes

Plutus integration

  • issue-3538 - A fairly complete specification was created for the PlutusV3 context
  • pull-3593 - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality

Improvements and releasing

  • pull-3574 - Improve clarity and performance of collateral Non-ADA validation:
  • pull-3573 - Update top-level CHANGELOG.md with cardano-node relevant changes
  • pull-3555 - Bump pygments from 2.12.0 to 2.15.0 in /doc
  • pull-3575 - Bump certifi from 2022.12.7 to 2023.7.22 in /doc
  • pull-3567 - Backport mint field translation bugfix
  • pull-3568 - Fixed typo in byron ledger spec
  • pull-3572 - Release/backport tickf bugfix
+ + + + \ No newline at end of file diff --git a/2023-08-04-network/index.html b/2023-08-04-network/index.html new file mode 100644 index 00000000000..f2e2d6a409a --- /dev/null +++ b/2023-08-04-network/index.html @@ -0,0 +1,44 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High-level overview of sprint 41

24th July - 6th August 2023

We started the implementation of bootstrap peers. Bootstrap peers are designed +to provide a safety guarantee for nodes joining the network while still taking +advantage of the distributed network for nodes that are synced. This will be +an intermediate step before Genesis which will allow for further distribute the +system. The bootstrap peers will be run by some trusted partners like CF, +Emurgo or IOG. They are primarily designed for leaf nodes (e.g. full node +wallets), which often end up syncing and require access to the honest chain. See +ouroboros-network#4615 for a more detailed implementation plan.

Other contributions

We started to use nothunks library to discover if we have any unevaluated +thunks which can lead to memory leaks ouroboros-network#4633. We found +a small one in the peer metric component of the P2P networking stack. Fixing +it put us on a small detour of fixing the API of the strict-checked-vars +package: cardano-base#431, cardano-base#432, as well as adding NFData +instance to io-classes. We also improved nothunks +library to make debugging easier and we provided a NoThunks instance for +ThreadId which we will need in the future (see nothunks#33).

We released a new version of io-classes (version 1.2.0.0) and related +packages to Hackage.

We addressed all review comments on the eclipse evasion PR which introduces big +ledger peers, ouroboros-network#3886.

We fixed how SIGHUP signal handlers are registered, so it's not possible to +shutdown a node which was starting while trying to update network topology, +see cardano-node#5421.

I didn't mention that in the previous update, so here it goes: in the previous +sprint we released ouroboros-network-0.8.2.0 and +ouroboros-network-framework-0.7.0.0.

+ + + + \ No newline at end of file diff --git a/2023-08-04-performance-and-tracing/index.html b/2023-08-04-performance-and-tracing/index.html new file mode 100644 index 00000000000..881e7ba08da --- /dev/null +++ b/2023-08-04-performance-and-tracing/index.html @@ -0,0 +1,31 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Michael Karg

High level summary

  • Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version 8.2.0.
  • Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing.
  • Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6.
  • Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.

Low level overview

Benchmarking

The 8.2.0 version of cardano-node required adjustment of some of the sanity checks that are part of our benchmarking +cluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version.

Tracing

The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint +when using it as default for a running node.

A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any +inconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node. +This feature adds another layer of robustness to the whole system.

Infrastructure

A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler +versions. We've future-proofed our benchmarking code.

Nomad backend

The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend +accordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant.

The validation phase is ongoing. We were able to perform successful runs and analyses for various 8.x node versions, including 8.2.0-pre. With parallel runs on the current cluster, we hope to measure the same effects we've observed with the +nomad backend - which will be a big step towards production use.

+ + + + \ No newline at end of file diff --git a/2023-08-04-sre/index.html b/2023-08-04-sre/index.html new file mode 100644 index 00000000000..3c198b81ef3 --- /dev/null +++ b/2023-08-04-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· One min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Preprod and preview envionments were updated to 8.1.2.
  • Sanchonet and shelley-qa environments were updated to 8.2.0-pre.
  • Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.

Lower level summary

Cardano-ops

Cardano-perf

Cardano-world

+ + + + \ No newline at end of file diff --git a/2023-08-09-consensus/index.html b/2023-08-09-consensus/index.html new file mode 100644 index 00000000000..1b9c34f1088 --- /dev/null +++ b/2023-08-09-consensus/index.html @@ -0,0 +1,24 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of fs-sim and fs-api, and released strict-checked-vars.

UTxO-HD

  • Rebased UTxO-HD on top of node 8.2 (issue)
  • Address new Maybe translations for UTxOs in Conway 1.6. (PR).
  • Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory.
  • Fixed an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully.
  • Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running QueryUTxOByAddress (PR).
  • Measured the speed of QueryUTxOByAddress under different queryBatchSize values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution.
  • Refactored and implemented ledgertable-related classes for the general HardforkBlock.

Genesis

  • Frisby and Esgen continue to engage with the Researchers on grinding against the Genesis design.

Fostering collaboration

  • Drafted a document explaining versioning of local state queries #273.

Support

  • Frisby is the release engineer this cycle.
  • Successfully created work-in-progress ouroboros-consensus and cardano-api commits that integrate the 2023 Aug 7 tip of cardano-ledger. This will require a release of ouroboros-consensus, which hasn't happened yet.
+ + + + \ No newline at end of file diff --git a/2023-08-10-mithril/index.html b/2023-08-10-mithril/index.html new file mode 100644 index 00000000000..f9296aef6be --- /dev/null +++ b/2023-08-10-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team completed the Mithril protocol’s mainnet beta launch: the release-mainnet network is now consistently producing new certificates and snapshots! The team has released a new distribution 2331.1 which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the mainnet infrastructure.

Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network.

Low level overview

  • Released the new distribution 2331.1
  • Completed the epic Release 'mainnet' Mithril network #918
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Completed the issue Design & implement basic stress test tool for aggregator - phase 1 #991
  • Worked on the epic Post deployment 'mainnet' infrastructure #1091:
    • Completed the issue Create Production Infrastructure Runbook #1085
    • Completed the issue Ingest 'mainnet' metrics/logs in Grafana #1122
  • Worked on optimizations:
    • Completed the issue Add a 'clean' file to extracted database in client #1131
    • Worked on the issue Create explorer page with registered signers #1097
  • Worked on refactoring:
    • Worked on the issue Refactor (de)serialization of crypto entities #668
  • Worked on bugs:
    • Completed the issue Client fails to unpack some snapshot archive #1137
    • Completed the issue The 'release-preprod' network stopped producing certificates #1114
    • Completed the issue The 'release-mainnet' network does not show up in the explorer #1111
  • Worked on dependencies:
    • Completed the issue Upgrade Cardano node to '8.1.2' #1090
  • Worked on troubleshooting:
    • Completed the issue Signer can't sign with 'Invalid signature for party' error #1125
+ + + + \ No newline at end of file diff --git a/2023-08-11-hydra/index.html b/2023-08-11-hydra/index.html new file mode 100644 index 00000000000..c71dc826447 --- /dev/null +++ b/2023-08-11-hydra/index.html @@ -0,0 +1,32 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa
Sebastian Nagel

High-level summary

This week, the Hydra team updated hydra-node to support cardano-node version +8.1.2, ensuring compatibility with the latest mainnet release. The team also +participated in discussions about a "cardanonical" JSON schema and added it as a +submodule to the project, contributing to improved data modeling and +interoperability.

In terms of community engagement, the team successfully onboarded a new +contributor, also participated in a RareEvo Twitter space, and continued +preparations for the Hydra master-class.

What did the team achieve this week

  • Updated dependencies to support cardano-node 8.1.2 #1007
  • Engaged in discussions about a cardanonical json schema and +add it as submodule to the project +#1013
  • Onboarded a new contributor to the hydra project (@locallycompact)
  • Joined RareEvo twitter space and continued preparation of hydra master-class

What are the goals of next week

  • Update & streamline tutorial to work with latest version of hydra-node
  • Remove the internal commit functionality #954
  • Release 0.12.0
+ + + + \ No newline at end of file diff --git a/2023-08-11-performance-and-tracing/index.html b/2023-08-11-performance-and-tracing/index.html new file mode 100644 index 00000000000..d6416d9705c --- /dev/null +++ b/2023-08-11-performance-and-tracing/index.html @@ -0,0 +1,28 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Michael Karg

High level summary

  • Benchmarking: We've concluded benchmarking node version 8.2.0.
  • Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration.
  • Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.

Low level overview

Benchmarking

As part of our release benchmarking cycle, we've completed and analysed the runs for the 8.2.0 version of cardano-node. In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version.

Tracing

A significant amount of optimizations for the new tracing system has finally been merged to master. At the moment, +we're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding +insight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward.

Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing.

Nomad backend

The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent +and reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were +able to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks.

A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to master.

+ + + + \ No newline at end of file diff --git a/2023-08-15-node-cli-api/index.html b/2023-08-15-node-cli-api/index.html new file mode 100644 index 00000000000..623f527ce4b --- /dev/null +++ b/2023-08-15-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-08-02 - 2023-08-15

High level summary

  • cardano-node 8.2.1 (pre-release) to SanchoNet
  • Continue moving CLI into era-based top level command structure
  • Wire-up DREP key generation,
  • Fix DREP deregistration certificates
  • Implement Constitutional Committee Key generation on the CLI
  • Introducing era-based protocol parameters on the API
  • Removing depracated functions and types on the API

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

Fix broken links in docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-08-17-crypto/index.html b/2023-08-17-crypto/index.html new file mode 100644 index 00000000000..47d16d3f0e5 --- /dev/null +++ b/2023-08-17-crypto/index.html @@ -0,0 +1,24 @@ + + + + + +Crypto Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Crypto Team Update

· One min read
Iñigo Querejeta Azurmendi

High level summary

The open fronts that the crypto team is working on are:

  • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
  • mithril: Full node verifier
  • musig2: Include MuSig2 description in cryptography handbook
  • kes_agent: Finilising test and CI. Working on KES binary

Low level summary

Mithril

  • Full Node Verifier merged #939.

MuSig2

  • Started describing MuSig2 to include it as part of the cryptography handbook

Sidechains

  • Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in this fork.

KES agent

  • KES agent is ready:
    • CI ready #19
    • Receipt confirmation message #20
    • KES agent binary ready #21
    • Control client implemented #11
+ + + + \ No newline at end of file diff --git a/2023-08-17-db-sync/index.html b/2023-08-17-db-sync/index.html new file mode 100644 index 00000000000..de985714f40 --- /dev/null +++ b/2023-08-17-db-sync/index.html @@ -0,0 +1,32 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

We have integrated many new Conway feutures and allow db-sync to sync sanchonet. +We also continued testing and improving the new db-sync options.

Lower level summary

  • Conway integration +#1484
  • Support for Sanchonet +#1476
  • Stake distribution is computed earlier +#1484
  • Deposit ledger events are now used. This reduces the db queries and makes syncing faster +#1484
  • Testing new db-sync options +#1466
  • Added support for ghc-9.6 +#1479
  • Tech debt: improve exceptions +#1471
+ + + + \ No newline at end of file diff --git a/2023-08-17-secp-issue/index.html b/2023-08-17-secp-issue/index.html new file mode 100644 index 00000000000..f8250fed6a7 --- /dev/null +++ b/2023-08-17-secp-issue/index.html @@ -0,0 +1,31 @@ + + + + + +SECP bindings Security Issue Report | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SECP bindings Security Issue Report

· 4 min read
Iñigo Querejeta Azurmendi

Security Issue Report: SECP256k1 bug

Date Occurred: July 15, 2022 +Severity: Potentially Very High if exploited on Mainnet +Authors: Iñigo Querejeta Azurmendi

Date of Report: August 17, 2023

Summary of Issue

Criticality Level

Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet +Context

New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains. +How was the Issue Detected

The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there.

What Action was Taken

The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod). +Fixes were applied to prevent the use of the primitives. +A full security audit was carried out on the bindings. +The rollout of the primitives was postponed to a new hard fork (Valentine)

Potential Effect

The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction.

Actual Effect

  • Delay to the Vasil hard-fork
  • Temporary removal of SECP256k1 primitives
  • Additional hard-fork to introduce SECP256k1 primitives

Ongoing Mitigations Needed, if any

None

Responsibility for Mitigations

Core team

Detailed description of Incident

New Plutus secp256k1 cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet.

The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing.

  • This is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an expected structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely.
  • The same happened with the Schnorr verification function. It takes as input a SECP256k1_xonly_pubkey, which is again an opaque structure that holds a parsed and valid public key.

The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated.

The fix was addressed in this PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts.

Recommendations

  • Check all new Plutus bindings for correct use.
  • Audit all new Plutus built-in bindings.
  • Continue to develop specific End-to-End tests for all new Plutus features.
  • Do not assume that any existing library functions are "safe". Treat all external calls circumspectly.
+ + + + \ No newline at end of file diff --git a/2023-08-18-goedel/index.html b/2023-08-18-goedel/index.html new file mode 100644 index 00000000000..0daf09a94f9 --- /dev/null +++ b/2023-08-18-goedel/index.html @@ -0,0 +1,33 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

Details

  • Development of an automated prover for showing conformance of +programs to state machines (as part of the mini-protocol framework)

  • Completion of the documentation of the (current state of the) +mini-protocol framework

  • Discussion about two DeltaQ lectures with two practical sessions as part +of 4th year masters course on distributed systemsby colleagues at UC +Louvain in the Autumn

  • Discussion about four DeltaQ lectures by colleagues at U. Bergen as part +of a 5th year Masters course in the Autumn

  • Adapted original DeltaQ implementation to the new typeclasses and +wrote property tests for its algebraic laws

+ + + + \ No newline at end of file diff --git a/2023-08-18-hydra/index.html b/2023-08-18-hydra/index.html new file mode 100644 index 00000000000..f673d2c93f2 --- /dev/null +++ b/2023-08-18-hydra/index.html @@ -0,0 +1,34 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team released version 0.12.0, a significant update that +brings support for cardano-node 8.1.2, along with performance enhancements and +various API improvements. Additionally, the team successfully onboarded a new +contributor who is now actively participating in operating a Hydra Head. They +took part in a meeting of the Intersect open source committee and prepared the +Hydra master-class for RareEvo, an educational initiative for the community.

If you happen to be at RareEvo, register for the Hydra master-class using this +form. +We hope to make it possible to follow along on-line as well and will announce +details on the Hydra announcements channel on the IOG discord +server.

What did the team achieve this week

  • Released version 0.12.0 which adds support for cardano-node 8.1.2, performance +and several API improvements. Release notes
  • Replaced commit via websocket with external draft + submit. #954
  • Onboarded new contributor to the point where he actively participates in operating a Head now.
  • Joined a first meeting of the Intersect open source committee
  • Prepared the Hydra master-class for RareEvo.

What are the goals of next week

  • Monthly review meeting
  • Run the Hydra master-class at RareEvo!
  • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
  • Clear out red bin items (technical debt)
  • Groom network resilience and explorer features
+ + + + \ No newline at end of file diff --git a/2023-08-18-ledger/index.html b/2023-08-18-ledger/index.html new file mode 100644 index 00000000000..34ab9e2bc3b --- /dev/null +++ b/2023-08-18-ledger/index.html @@ -0,0 +1,29 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Alexey Kuleshevich

High level summary

The ledger team made great progress in advancing Conway era forward. In particular, voting +for DRep and Stake Pool Operators is now at the state that can be used by downstream +components. Addition of new ledger state queries makes it possible to verify changes to +the governance state, such as placement of votes, submission of governance proposals, +inspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the +ability to enact all of the governance actions, except for the hard fork initiation.

Low level summary

Conway progress

  • pull-3577 - Move PParams to GovState
  • pull-3609 - Adjust thresholds for sanchonet
  • pull-3604 - README: update CIP-1694 link
  • pull-3616 - Switch TreasuryWithdrawals to use RewardAcnt
  • pull-3599 - Add governance action well-formedness check
  • pull-3607 - Rename governance to gov
  • pull-3601 - Added DRep anchors
  • pull-3615 - Add optional previous GovActionId in some ProposalProcedures
  • pull-3596 - Upgradeable families
  • pull-3625 - Change constitution to use Anchor
  • pull-3592 - Added pulsing incremental computation of the DRep distribution
  • pull-3523 - Treasury donations
  • pull-3633 - Prevent state changes on phase2 failure
  • pull-3634 - Disable serialization of protocolVersion param update
  • pull-3630 - Implemented DRep refreshing
  • pull-3640 - Remove crypto parameterization from AnchorData
  • pull-3636 - Implement DRep ratification with an "always passing"; threshold
  • pull-3648 - Governance queries
  • pull-3650 - Change environment for ShelleyPOOLREAP rule
  • pull-3658 - Set DRep ratify threshold to 51%
  • pull-3628 - DELEG, POOL, GOVCERT conformance with Spec v0.8

Testing

Improvements and releasing

  • pull-3660 - Fix bounds and versions
  • pull-3661 - Adjust versions, bounds and CHANGELOGs to account for the latest release
+ + + + \ No newline at end of file diff --git a/2023-08-18-network/index.html b/2023-08-18-network/index.html new file mode 100644 index 00000000000..53e371a160f --- /dev/null +++ b/2023-08-18-network/index.html @@ -0,0 +1,46 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 3 min read
Marcin Szamotulski

High-level overview of sprint 42

Eclipse Evasion

We merged and released a new version of the ouroboros-network package (version +0.9.0.0) which includes big ledger peers feature. +This is the primary peer selection mechanism to defend against eclipses. We +also prepared a PR to updated ouroboros-cosnensus +and ekg-forward packages.

CDDL specs for protocol codecs

We made the cddl spec for network codec more inline with the implementation +which is highly polymorphic. cddl doesn't have the notion of polymorphism, +but has any which can generate any valid cbor term. We matched it with an +Any type on the Haskell side and made all remaining tests & specs use it. +This simplified the specifications and made it easier to understand which parts +are defined in the spec, and which parts are left unspecified. See +ouroboros-network#4595.

Ouroboros-Network-Framework API changes

We also released ouroboros-network-framework and other network components. +The ouroboros-network-framework package contains a redesign of API exposed to +ouroboros-consensus. We consolidated, cleaned it and made it easier to +extend in the future if there will be new arguments that need to be passed to +mini-protocol initiator and responders which comes from the low-level network +layer.

Nix setup (CI)

We also made a major review of our nix setup. With help from our DevX team +we ended up with a clean flake.nix file which can:

  • compile & test the code on x86_64-linux, x86_64-darwin and aarch64-darwin
  • cross-compile to Windows on x86_64-linux

And provides a shell which contains all the build tools, including ghc-9.6, +hls, cddl, and more. See ouroboros-network#4640, +ouroboros-network#4643.

Other contributions

Cardano Network Service Assurance

  • The work and writeup in finishing up the CNSA, first stage (first +contract).
  • Getting Sam Cowger (Galois Inc) up to speed.
  • The IOG Networking team carried a reivew of CNSA project progress: a limitted +code & design review.

Galois Review

Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues

scoping, requirements, and getting started.

CI

We added a nightly run for GitHub actions and made the GitHub actions test be +executed with extra concurrency ouroboros-network#4637, ouroboros-network#4649.

We also added GitHub's dependabot ouroboros-network#4650.

Bootstrap Peers

We settled on implementation design of bootstrap peers which is being +implemented, ouroboros-network#4615.

+ + + + \ No newline at end of file diff --git a/2023-08-18-sre/index.html b/2023-08-18-sre/index.html new file mode 100644 index 00000000000..bdff044a610 --- /dev/null +++ b/2023-08-18-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· One min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Sanchonet and shelley-qa environments were updated to 8.2.1-pre.
  • Work on two new repos utilizing flake parts for cardano cluster generation, automation and operation.

Lower level summary

Cardano-ops

Cardano-parts

Cardano-perf

Cardano-playground

Cardano-world

Inputs-check

  • A flake parts module to check input closure sizes recursively for optimization considerations: inputs-check
+ + + + \ No newline at end of file diff --git a/2023-08-23-consensus/index.html b/2023-08-23-consensus/index.html new file mode 100644 index 00000000000..b6db8134ee9 --- /dev/null +++ b/2023-08-23-consensus/index.html @@ -0,0 +1,25 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests. +On the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base.

UTxO-HD

  • We addressed the issues that came from the benchmarking and testing phase (see #314).
    • We fixed the operational-certificate update exception (#305).

Tech debt

  • We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see this branch).
  • We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see this branch).
  • We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see #275).
  • We decreased the flakiness for our test suite (#284).
  • We incorporated and merged the pull-request on query versioning (#273).
  • We started working on new performance-based regression tests for mempool operations.

Support

  • Nick Frisby continues with his engineer responsibilities. Notably getting the Consensus release out for node pre-release 8.3. Nick also began integrating it into downstream branches (cardano{-api,-cli,-node}). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:
+ + + + \ No newline at end of file diff --git a/2023-08-24-performance-and-tracing/index.html b/2023-08-24-performance-and-tracing/index.html new file mode 100644 index 00000000000..3928bfefab7 --- /dev/null +++ b/2023-08-24-performance-and-tracing/index.html @@ -0,0 +1,26 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 2 min read
Michael Karg

High level summary

  • Benchmarking: Benchmarking node version 8.2.1 has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD.
  • Infrastructure: Our analysis pipeline has received improvements reducing memory footprint.
  • Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing.
  • Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.

Low level overview

Benchmarking

We've performed and analysed the benchmarks for the 8.2.1 version of cardano-node as part of our release benchmarking cycle.

Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths.

Infrastructure

As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held +in memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline.

Tracing

The next portion of optimizations has been completed and merged to master, getting rid of Haskell's native String representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by cardano-node.

The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup.

Nomad backend

The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster +and porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend.

+ + + + \ No newline at end of file diff --git a/2023-08-25-hydra/index.html b/2023-08-25-hydra/index.html new file mode 100644 index 00000000000..617830ae490 --- /dev/null +++ b/2023-08-25-hydra/index.html @@ -0,0 +1,30 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa

High-level summary

This week, the Hydra team conducted the monthly review meeting for Agust,which +continously ensures transparent communication and project evaluation.

In terms of community engagement, the Hydra team gave a Hydra master-class at +RareEvo workshop as an educational initiative for the community. +Additionally, the team updated the Hydra demo and tutorial to include Mithril +and latest release changes.

They also focused on exploring the Hydra network resiliance in order to improve +hydra-node availability, as it becomes stuck very easily and that leads to a +bad user experience.

What did the team achieve this week

  • Hydra master-class at RareEvo workshop!
  • Monthly report & review meeting
  • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
  • Groomed network resilience and explorer features #188
  • New ADR for “Resourced based API” #1028

What are the goals of next week

  • Have a poc on network resilience working #188
  • Fix issue #931: “Chain state in head state not updated on replayed observation”
  • Fix issue #1039: "Close transaction dropped from cardano-node"
+ + + + \ No newline at end of file diff --git a/2023-08-28-mithril/index.html b/2023-08-28-mithril/index.html new file mode 100644 index 00000000000..a28e3a71c15 --- /dev/null +++ b/2023-08-28-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of zstandard compression of the snapshot archive, and streaming its download and decompression in the client.

Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer.

Low level overview

  • Completed the issue Create explorer page with registered signers #1097
  • Completed the issue Simplify logs on the Signer/Aggregator #1106
  • Completed the issue Refactor (de)serialization of crypto entities #668
  • Completed the issue Mithril client last snapshot download #1078
  • Completed the issue Use the '/signers/registered' route to verify if a signer is registered #1152
  • Worked on the issue Provide progress information with '--json' option in Client #1095
  • Worked on the issue Use 'zstandard' compression for snapshot archives #876
  • Worked on the issue Make client download and extract the archive simultaneously #1115
+ + + + \ No newline at end of file diff --git a/2023-08-29-node-cli-api/index.html b/2023-08-29-node-cli-api/index.html new file mode 100644 index 00000000000..9a493dfbeb3 --- /dev/null +++ b/2023-08-29-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-08-16 - 2023-08-29

High level summary

CLI is making progress towards phases 3 and 4 of SanchoNet.

  • Ability to create info, no-confidence and new committee governance actions.

  • Voting as DREP is possible now on the CLI

  • API is now using Ledger's PParams and VotingProcedures

  • Expose following queries from consensus:

    - GetGovState
    - GetDRepState
    - GetDRepStakeDistr
    - GetCommitteeState
    - GetConstitution

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-09-01-goedel/index.html b/2023-09-01-goedel/index.html new file mode 100644 index 00000000000..cc98e3c8585 --- /dev/null +++ b/2023-09-01-goedel/index.html @@ -0,0 +1,28 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

Details

  • finalising a presenting performance analysis internship work to the +formal methods team

  • developed a new Isabelle mini-protocol framework and examples

  • planning an extended version of the ICE DeltaQ paper

  • working on algebraic rules for properisation of any-to-finish

+ + + + \ No newline at end of file diff --git a/2023-09-01-hydra/index.html b/2023-09-01-hydra/index.html new file mode 100644 index 00000000000..c3c518046a3 --- /dev/null +++ b/2023-09-01-hydra/index.html @@ -0,0 +1,28 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sasha Bogicevic

High-level summary

This week, the Hydra team focused primarily on changes needed in the network +layer and have the first draft document related to needed design. They also +improved the user experience by allowing a commit using inline datums. +Discussed the off-chain governance with researchers and improved internal model +tests.

What did the team achieve this week

  • Monthly report published
  • Small changes to hydraw and tutorial in light of the Masterclass
  • Investigated a bug and saw it was solved by recent developments
  • Improved the model tests by fully validating L1 transactions
  • Enhanced the /commit API to also allow commit from scripts with inline datums (user request)
  • Discussed off-chain governance with IOG and CF researchers
  • Drafted a first network specification document in the context of Network resilience

What are the goals of next week

  • Have a clear understanding of the changes we need for the "Improve network resiliency" feature
  • Groomed and agreed plan on incremental commits/decommits
  • Updated tutorials including CI workflows to check consistency
  • Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)
+ + + + \ No newline at end of file diff --git a/2023-09-01-ledger/index.html b/2023-09-01-ledger/index.html new file mode 100644 index 00000000000..d06da64f7f2 --- /dev/null +++ b/2023-09-01-ledger/index.html @@ -0,0 +1,24 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Alexey Kuleshevich

High level summary

Broadly speaking the Ledger team focused on a few main areas of Conway era:

  • Creation of voting state snapshots in order to correctly delay ratification for one epoch
  • Validation of the Governance Actions sequencing and ordering
  • Proper expiry of DReps and Proposal Procedures
  • Expanding Conway Genesis functionality
  • Utilization of some of the new Protocol Parameters in ledger validation rules

Low level summary

Conway era

  • pull-3659 - Validate Network for ProposalProcedure and TreasuryWithdrawal
  • pull-3637 - Avoid using sequence of tuples, by adding GovActionId to GovActionState
  • pull-3651 - Inactive DReps
  • pull-3664 - Track proposal expiry
  • pull-3668 - Add min committee size predicate to NewCommittee
  • pull-3669 - Add Proposal deposit check against PParam
  • pull-3676 - Fix inactive PoolStake not counting as Drep Stake
  • pull-3635 - Make snapshots of GovActionsState
  • pull-3670 - Validate previously enacted govAction
  • pull-3694 - Improve error reporting on the positive coin decoder
  • pull-3674 - Added RATIFY thresholds
  • pull-3684 - Add proposal delaying, remove predicate failure from ENACT
  • pull-3688 - DRep Refunds and update evalTransactionBalance

Improvements and releasing

  • pull-3677 - Minor patch that fixes the DRep distribution computation
  • pull-3686 - Post patch release fixup
  • pull-3695 - Changelog for cardano-node-8.3 release
  • pull-3683 - Add two new bench mark programs

Testing

+ + + + \ No newline at end of file diff --git a/2023-09-01-network/index.html b/2023-09-01-network/index.html new file mode 100644 index 00000000000..606932139cb --- /dev/null +++ b/2023-09-01-network/index.html @@ -0,0 +1,53 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 3 min read
Marcin Szamotulski

High-level overview of sprint 43

In this sprint, we received contributions from CF & Galois. Karl Knutsson +(CF) has addressed various issues regarding peer churning in P2P, timeouts +and our WireShark dissector. While the Galois developers focused on +addressing issues from their review last year. See below for more details.

We continued working on bootstrap peers ouroboros-network-#4661.

We refactored our test suites: they are split into io-tests which require to +be run natively on all platforms (these tests mostly contain tests that +require IO system calls) and sim-tests which are platform independent. We +run io-tests on all supported platforms (e.g. x86_64-linux, +x86-64-darwin, aarch64-darwin and x86_64-w64-mingw32 (Windows)) natively. +The sim-tests are not executed on Windows due to memory limitations on +GitHub Actions runners. ouroboros-network-#4653

We also started rebasing typed-protocols refactoring branches.

Marcin was appointed as the cardano-node release engineer for the 8.4.0-pre +version. So far he integrated cardano-ledger-conway-1.8 and +ouroboros-network-0.9.1.0 to ouroboros-consensus, cardano-cli and +cardano-api. Once we will have an integration branch for cardano-node, +cardano-ledger-conway-1.8 and ouroboros-consensus packages can be released +to CHaP and PRs can be merged once they go through review & CI.

We also fixed some smaller issues regarding peer sharing (both were discovered +by Karl from CF). More details are included below.

Progress on P2P addoption

SPO relays

There are currently ~2000 relays running P2P +enabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On +16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil +Ada.

P2P relays

The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

Data has been kindly provided by CF and their mainnet monitoring +infrastructure.

IOG relays

As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all +IOG relays will be running P2P.

Detailed description

In this sprint, we got a few contributions from CF:

  • Karl made peer churning mechanism less aggressive ouroboros-network-#4656; and
  • he added timeouts for idle states in ChainSync & KeepAlive +miniprotocols. These timeouts help a node remove idle connections from the +responder (server) side ouroboros-network-#4648.
  • he improved the WireShark dissector by adding support for the peer-sharing mini-protocol ouroboros-network-#4656.

Galois has been making progress in addressing some of the issues they raised in their review (last year):

Peer Sharing

  • Light peer sharing is only enabled when peer sharing is turned on ouroboros-network-#4652;
  • Handshake incorrectly reports peer sharing value. It's supposed to relay the +remote value, but instead, it returns the local value. ouroboros-network-#4642 (in review).

Async Demotion Test Fix

  • We fixed an async demotion test failure which turned out to be a weakness of +the test itself rather than a bug in the connection manager. ouroboros-network-#4655
+ + + + \ No newline at end of file diff --git a/2023-09-01-sre/index.html b/2023-09-01-sre/index.html new file mode 100644 index 00000000000..b92869f5729 --- /dev/null +++ b/2023-09-01-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 2 min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes
  • Work on a new capkgs repository started -- "Content Addressed Packages"
    • This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output
    • These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do
    • Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers

Lower level summary

Capkgs

  • Content addressed packages -- new repo: capkgs

Cardano-ops

  • Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: cardano-ops-compare

Cardano-parts

Cardano-perf

Cardano-world

Sanchonet-demo

+ + + + \ No newline at end of file diff --git a/2023-09-06-consensus/index.html b/2023-09-06-consensus/index.html new file mode 100644 index 00000000000..915757e3707 --- /dev/null +++ b/2023-09-06-consensus/index.html @@ -0,0 +1,26 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 3 min read
Damian Nadales

High level summary

We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation. +On the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers. +The Consensus release engineer finished his rotation: version 8.3.0-pre of cardano-node is releasing 2023 September 5.

UTxO-HD

  • We ran the first successful system-level benchmarks for UTxO-HD (see #203) using the in-memory backend.
    • We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot.
    • After the mempool regression is fixed the benchmarks need to be ran again.
    • System-level UTxO-HD benchmarks with the LMDB are still pending.
  • UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see #344).
  • We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in GetUTxOByAddress (see this comment). Preliminary results are promising.
  • Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (#344), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.

Tech debt

  • We added tests that Consensus emits valid CBOR (#3099). This helped us detect a couple of serialization bugs. The tests still need to be merged into the main branch (#323).

Support

  • Nick Frisby finished his release engineer rotation; cardano-node 8.3.0-pre is releasing 2023 September 5.
  • We helped to investigate a protocol version bug in Sanchonet (see #3491).
  • We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see #91.
+ + + + \ No newline at end of file diff --git a/2023-09-07-mithril/index.html b/2023-09-07-mithril/index.html new file mode 100644 index 00000000000..3cc722098a5 --- /dev/null +++ b/2023-09-07-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

The Mithril team has released a new distribution 2335.0 which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information.

They have also worked on snapshots enhancements: implementation of the zstandard compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes.

Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client.

Low level overview

  • Completed the issue Use 'zstandard' compression for snapshot archives #876
  • Completed the issue Design & implement stress test tool for aggregator - phase 2 #1155
  • Completed the issue Provide progress information with '--json' option in Client #1095
  • Completed the issue Make client download and extract the archive simultaneously #1115
  • Completed the issue Add aggregator Cardano node version in snapshot artifact #948
  • Completed the issue Make Cardano node version part of the Mithril network configuration #947
  • Completed the issue Post deployment 'mainnet' infrastructure #1091
  • Worked on the issue Errors refactoring #798
  • Worked on the issue Add Cloudflare protection of infrastructure #986
  • Completed the issue Failed to restore recent snapshot with strange error #1160
  • Completed the issue Update 'ed25519-dalek' to '2.0.0' #1188
  • Completed the issue Add target networks blocks in release notes #1151
  • Completed the issue Fix end to end 'wait_for_the_expected_time' test #1191
  • Completed the issue Fix docs 'git checkout' command #1174
+ + + + \ No newline at end of file diff --git a/2023-09-07-performance-and-tracing/index.html b/2023-09-07-performance-and-tracing/index.html new file mode 100644 index 00000000000..04edeba7b97 --- /dev/null +++ b/2023-09-07-performance-and-tracing/index.html @@ -0,0 +1,29 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg

High level summary

  • Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack.
  • Infrastructure: Various improvements of our analysis pipeline have been merged to master, supporting safe log truncation.
  • Tracing: Namespace consistency checks have been merged to master along with a curated configuration for benchmarking.
  • Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.

Low level overview

Benchmarking

We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer.

With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance.

The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack.

Infrastructure

As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation +operation that keeps the interdependencies of block events intact.

Truncation might happen at a slightly different point +in time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time.

Tracing

Consistency checking of namespace implementation and configuration when using the new system has been completed. +This feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a cardano-node shows inconsistencies with the namespaces the system provides - and hence needs attention.

Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many +detailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable.

Nomad backend

The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the +first real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend.

+ + + + \ No newline at end of file diff --git a/2023-09-08-hydra/index.html b/2023-09-08-hydra/index.html new file mode 100644 index 00000000000..3da5e90bf21 --- /dev/null +++ b/2023-09-08-hydra/index.html @@ -0,0 +1,41 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team improved the commit process with support for inline +datums. They simplified the chain layer by refactoring how the chain state is +persisted. Updates to the Hydra tutorial were completed, including CI workflows +to keep it up-to-date. The team engaged in discussions with researchers about +incremental commits & decommits, and drafted an architectural decision record +for a resource-based API. They also explored simpler solutions for the upcoming +network resilience feature.

What did the team achieve this week

  • Support InlineScriptDatum in commit +#1043
  • Refactored chain state persistency +#1049
  • Completed tutorial updates (by adding CI and some cleanup) +#997
  • Intersect Open Source committee meeting
  • Experimented with various models to better express the \"Network +resilience problem\" to find a KISS solution for +#188
  • Drafted and discussed incremental de-/commit features within team +and with researchers +#199 and +#1057
  • Created ADR for a resource based overhaul of the API +#1028

What are the goals of next week

  • Meetup of Hydra & Mithril contributors in Nantes, France
  • Integrated cardano-api 8.15 to have GHC 9.6 support
  • A clear design for incremental commits (decommits are already +understood)
  • An ADR for improving tx construction & observation to not need chain +state
+ + + + \ No newline at end of file diff --git a/2023-09-12-node-cli-api/index.html b/2023-09-12-node-cli-api/index.html new file mode 100644 index 00000000000..b757a182eff --- /dev/null +++ b/2023-09-12-node-cli-api/index.html @@ -0,0 +1,28 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 3 min read
Carlos LopezDeLara

2023-08-30 - 2023-09-12

High level summary

Release of Cardano-node 8.3.0-pre for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs. +This release completes phase 2 of SanchoNet feature roll out plan

CLI continues on its migration to a era-based top-level commands. This sprint we moved text-view, key, query, genesis, node, stake-address, transaction and address into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints.

We are moving the drep delegation-certificate to the stake-address command so delegating to a drep is done via stake-addres vote-delegation-certificate. Along the same lines, we are renaming +stake-address delegation-certificate (delagating to a stake pool) to stake-address stake-delegation-certificate to distinguish between stake delegation to a pool and votes delegation to a drep. On top +of that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly stake-address stake-and-vote-delegation-certificate. Note that change is not included on 8.3 but will come on 8.4. +Removing --conway-era flag from all the transaction sub-commands.

Update description fields in delegation certificates from Stake Address Delegation Certificate to respectively (Conway onwards):

  • Stake Delegation Certificate
  • Vote Delegation Certificate
  • Stake and Vote Delegation Certificate

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-09-14-db-sync/index.html b/2023-09-14-db-sync/index.html new file mode 100644 index 00000000000..bb15da0061e --- /dev/null +++ b/2023-09-14-db-sync/index.html @@ -0,0 +1,32 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

We have created a DBSync tag sancho-1-1-0 which can follow sanchonet. Also +the team has ran a number of benchmarks and tests for the new options/flavours of DBSync +and prepared a blogpost which summorises them, for downstream components.

Lower level summary

  • Integration of node-8.3.x and support for Sanchonet on Conway +#1498
  • Simplifications of new feautures +#1496
  • Makes it impossible to restart DBSync with different schema options and adds +tests for them +#1466
  • CI fixes +#1494#1491
  • Prepared a blogpost about different DBSync options +blog
+ + + + \ No newline at end of file diff --git a/2023-09-15-goedel/index.html b/2023-09-15-goedel/index.html new file mode 100644 index 00000000000..0fe99802794 --- /dev/null +++ b/2023-09-15-goedel/index.html @@ -0,0 +1,27 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

Details

  • working on collating and open sourcing performance analysis prototype

  • improvements to Ouroboros Praos specification in Isabelle

  • working on formalising chain sync mini-protocol

  • reviewing an alternatice semantics for DeltaQ

  • Seminar talk at U. Bergen on algebraic properties of timeliness

+ + + + \ No newline at end of file diff --git a/2023-09-15-hydra/index.html b/2023-09-15-hydra/index.html new file mode 100644 index 00000000000..16d845c39a1 --- /dev/null +++ b/2023-09-15-hydra/index.html @@ -0,0 +1,30 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sasha Bogicevic
Sebastian Nagel

High-level summary

This week, most of the Hydra team was attending a cardano scaling workshop in +Nantes, France. They used this oportunity to meet fellow mithril team and spend +some time together to hack on some code and, as always, reflect on the past work +and find optimal path forward for both projects. They also fixed a bug that +caused hydra-node to crash when querying L1, worked on a new network resillience +proof-of-concept and accepted a new ADR related to stateless transaction +observation.

What did the team achieve this week

  • Cardano scaling workshop with members of hydra and mithril teams
  • Accepted user contribution for possible new use-case #1048
  • Fix for the hydra-node crash related to internal wallet query #1053
  • Collected experimental CI findings #1070
  • Propose first POC for the network resilience #1074

What are the goals of next week

  • Monthly review meeting & report including updates from Mithril
  • Review POC and discuss our options for the network resilience
  • Update cardano-api to version 8.20
  • Address TODOs on aiken commit validator #1072
  • Complete hydra-support in kupo kupo#117
+ + + + \ No newline at end of file diff --git a/2023-09-15-ledger/index.html b/2023-09-15-ledger/index.html new file mode 100644 index 00000000000..128673ff25e --- /dev/null +++ b/2023-09-15-ledger/index.html @@ -0,0 +1,30 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Alexey Kuleshevich

High level summary

The Ledger team's focus is still mainly on the Conway era implementation.

We were able to add ability to specify initial Constitutional Comittee and the initial +version of Constitution. Priority in which Governance Action are now enacted matches the +specification. DRep's deposits are now properly accounted for. Governance actions that are +not allowed to be voted on by Stake Pool operators and Constitutional Committee members +are prevented by transaction submission failure, rather than simply being ignored. There +was a few important CDDL fixes as well as a lot of new round trip serialization +tests. Constraint based testing framework has also received a lot of improvements.

Low level summary

Conway era

  • pull-3681 - Conway Genesis additions
  • pull-3690 - Preserve the order of ProposalProcedures
  • pull-3705 - Removed ProtVer from EnactState
  • pull-3700 - Add conway-specific certs to deposit/refunds
  • pull-3704 - Add comments on deprecating certs to Conway CDDL
  • pull-3698 - Reordering of governance actions
  • pull-3712 - Disallow empty fields in ConwayTxBodyRaw
  • pull-3716 - Abstract threshold calculation
  • pull-3725 - Fix mistaken use of dollar sign in cddl files
  • pull-3718 - Predicate failure for mismatched Voter GovAction
  • pull-3721 - Committee expiration, validation and modification

Improvements and releasing

Testing

  • pull-3730 - Implement Show instance for Rep using IsTypeable
  • pull-3697 - Rewrite testEql using Typeable to make it impossible to forget cases
  • pull-3709 - Add many new features to the Constrained modues in cardano-ledger-test
  • pull-3726 - Conway and other eras serialization roundtrip tests
  • pull-3713 - Improve CI resiliency against GitHub issues
+ + + + \ No newline at end of file diff --git a/2023-09-15-network/index.html b/2023-09-15-network/index.html new file mode 100644 index 00000000000..b1fa41aebbe --- /dev/null +++ b/2023-09-15-network/index.html @@ -0,0 +1,42 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High-level overview of sprint 44

Bootstrap Peers

In this sprint, we focused on developing bootstrap peers.

Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we +identified a possible improvement to bootstrap peers. A more detailed +description is available here.

Cardano-Node-8.4.0 Release

We also were responsible for the cardano-node-8.4.0-pre release. A final +integration PR is currently being merged. We published +new versions of ouroboros-consensus, cardano-api and cardano-cli.

Towards Typed Protocols 0.2.0.0

We also updated the future typed-protocols-0.2.0.0 and its integration with +cardano-node. This is towards our goal which we planned for the next +quarter. The identified tasks are to fix breaking tests, and then measure and +address possible performance regressions.

Tech Debt

Mark Tullsen (Galois) submitted two more PRs: ouroboros-network-#4663, +ouroboros-network-#4664. We provided feedback on their other pull requests: ouroboros-network-#4661 and +ouroboros-network-#4660.

P2P adoption

In the last two weeks, there was a regression in P2P adoption concerning +the number of SPOs or stakes, although the number of overall P2P relays has +increased. Karl Knutsson (Cardano Foundation) is investigating +this issue. +P2P relays

The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

Data has been kindly provided by Cardano Foundation and their mainnet +monitoring infrastructure.

Open Source

We are in the process of upstreaming our ffi to Windows Named Pipes API to the Win32 package, see [win32-220].

+ + + + \ No newline at end of file diff --git a/2023-09-15-sre/index.html b/2023-09-15-sre/index.html new file mode 100644 index 00000000000..e4a5f959d65 --- /dev/null +++ b/2023-09-15-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 2 min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Sanchonet environment was updated to 8.3.0-pre.
  • Cardano-parts now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is here.

Lower level summary

Capkgs

  • Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: capkgs-compare

Cardano-ops

Cardano-parts

  • Utilize content addressed binaries to significantly improve eval, build and devShell performance: cardano-parts-pull-8
  • Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: cardano-parts-pull-10
  • Fix warns thrown during some builds and devShell usage: cardano-parts-pull-11
  • Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: cardano-parts-pull-12
  • Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: cardano-parts-pull-13

Cardano-perf

  • Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: cardano-perf-compare

Cardano-playground

Cardano-world

+ + + + \ No newline at end of file diff --git a/2023-09-20-consensus/index.html b/2023-09-20-consensus/index.html new file mode 100644 index 00000000000..c3b2cc894b4 --- /dev/null +++ b/2023-09-20-consensus/index.html @@ -0,0 +1,30 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks. +We are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough. +On the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain. +We also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway.

UTxO-HD

  • We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (349). System level benchmark results are pending.
  • Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (344), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run.
  • We also brought the UTxO-HD branch up to date with node version 8.4.0.

Genesis

  • We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain. +We are now drafting the final self-contained argument. (4157)

Support

  • We debugged a bad parameter update on the Babbage to Conway transition in the SanchoNet testnet (339). +A superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (340, 354, and 355) +However we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ConsensusProtocol type class and the HardForkBlock combinator (345 and 346). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.
+ + + + \ No newline at end of file diff --git a/2023-09-20-mithril/index.html b/2023-09-20-mithril/index.html new file mode 100644 index 00000000000..9059071218e --- /dev/null +++ b/2023-09-20-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports.

Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution.

Low level overview

  • Completed the issue Add snapshot compression parameters in infrastructure deployments #1200
  • Completed the issue Add Cloudflare protection of infrastructure #986
  • Worked on the issue Record statistics about the downloaded snapshot in the aggregator #1127
  • Worked on the issue Error refactoring #798
  • Worked on the issue Activate Cloudflare protection of infrastructure #1230
  • Worked on the issue Release new 2337 distribution #1219
  • Completed the issue Upgrade dependencies #1238
+ + + + \ No newline at end of file diff --git a/2023-09-22-hydra/index.html b/2023-09-22-hydra/index.html new file mode 100644 index 00000000000..95c9dddc1e7 --- /dev/null +++ b/2023-09-22-hydra/index.html @@ -0,0 +1,46 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team conducted the monthly review meeting in +collaboration with Mithril, enhancing project coordination.

The team improved the gen-hydra-key node command for smoother usability +and identified concrete steps to enhance network resiliency in feature +items #188, +#1080, and +#1079. +Additionally, they contributed the aiken-mode editor integration to the +aiken-lang organization, updated dependencies to utilize cardano-api +8.20, and published the Hydra security advisory CVE-2023-42806 with a +workaround available for users.

These efforts demonstrate the team\'s commitment to project improvement, +security, and open-source community collaboration.

What did the team achieve this week

  • Conducted the monthly review meeting together with Mithril
  • Improved gen-hydra-key node command +#1077
  • Established a clear plan to improve resiliency of network and manifested +feature items #188, +#1080 and +#1079
  • Moved aiken-mode (created by SN) +to aiken-lang organization
  • Updated dependencies to using cardano-api 8.20 +#1075
  • Published security advisory +CVE-2023-42806 +(workaround available)

What are the goals of next week

  • Write-up the monthly report for September
  • Finish "network resilience to disconnects" +#188
  • Finish kupo integration with hydra +#1078
  • Discuss and decide on using aiken or not
  • Address the published security advisory +CVE-2023-42806 +(to not require workaround)
  • Ideally, release 0.13.0
+ + + + \ No newline at end of file diff --git a/2023-09-22-performance-and-tracing/index.html b/2023-09-22-performance-and-tracing/index.html new file mode 100644 index 00000000000..f2cf289fd7e --- /dev/null +++ b/2023-09-22-performance-and-tracing/index.html @@ -0,0 +1,35 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg

High level summary

  • Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters.
  • Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time.
  • Tracing: Work on machine-readable tracing of tracer configuration is ongoing.
  • Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster.
  • Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Blöndal!

Low level overview

Benchmarking

As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking +backend with means to measure and document network latency for each run. Furthermore we've implemented means to +capture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences +in the behaviour of the underlying networking stack at OS level.

Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided +to compare standard deviations instead to validate the measurements from nomad.

Infrastructure

Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline +have been merged to master. They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis.

Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for trace-dispatcher and tx-generator we were able to address those issues.

Tracing

After various steps in constructing a configuration upon node startup, it is vital to document +which runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML +trace message for that purpose.

This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node.

Nomad backend

As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it +produces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an +impact on our measurements, as we'd be basically using two different instruments to take them.

Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service +or the slightly different system architecture of the new cluster.

New team member

Baldur Blöndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team. +So I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on cardano-tracer, the component receiving, processing and making available node traces and metrics.

+ + + + \ No newline at end of file diff --git a/2023-09-26-node-cli-api/index.html b/2023-09-26-node-cli-api/index.html new file mode 100644 index 00000000000..4d3c055cd24 --- /dev/null +++ b/2023-09-26-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-09-13 - 2023-09-26

High level summary

  • cardano-node 8.4.0-pre release suitable for SanchoNet.
  • CLI continues making progress integrating governance features. During this sprint we integrated the info and new-committee governance actions.
  • The team continued moving to the ERA top-level commands structure. Removed --conway-era flag from the legacy commands making conway era commands only accessible via cardano-cli conway.
  • stake-pool command is now under the ERA top level structure.
  • API continues integration with governance features, it is worth to higlight that now ProposeNewCommitee uses the right key type (cc-cold)

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-09-27-mithril/index.html b/2023-09-27-mithril/index.html new file mode 100644 index 00000000000..bd6a65437c6 --- /dev/null +++ b/2023-09-27-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

The Mithril team has released a new distribution 2337.0, which includes the following enhancements: support for zstandard compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator.

They also completed the refactoring and standardization of the errors in the Mithril nodes and published an Architectural decision record on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure.

Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs.

Low level overview

  • Completed the issue Release new 2337 distribution #1219
  • Completed the issue Errors refactoring #798
  • Completed the issue Client traffic creates performance bottleneck in aggregator #1207
  • Completed the issue Record statistics about the downloaded snapshot in the aggregator #1127
  • Completed the issue Create a SPO checklist for KES keys update #1267
  • Worked on the issue Spike: Run client in browser WASM PoC #1254
  • Worked on the issue Benchmark aggregator performances #1220
  • Worked on the issue Activate Cloudflare protection of infrastructure #1230
+ + + + \ No newline at end of file diff --git a/2023-09-29-goedel/index.html b/2023-09-29-goedel/index.html new file mode 100644 index 00000000000..0eb83a67ade --- /dev/null +++ b/2023-09-29-goedel/index.html @@ -0,0 +1,28 @@ + + + + + +Goedel Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Goedel Team Update

· One min read
James Chapman

The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and testing the +performance analysis tool

Details

  • drafting processs calculus semantics of mini protocol programs

  • testing the new performance modelling tool

  • further work on specification of mini protocols

  • extension of mini protocol framework to support communication of +programs with local environments via synchronous channels

+ + + + \ No newline at end of file diff --git a/2023-09-29-hydra/index.html b/2023-09-29-hydra/index.html new file mode 100644 index 00000000000..024c6ba5900 --- /dev/null +++ b/2023-09-29-hydra/index.html @@ -0,0 +1,27 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa

High-level summary

This week, the Hydra team mainly focused on having a working new reliability +network layer; and specified its expected behavior in a new ADR.

They also revisited the security policy and vulnerability disclosure policy on +how to handle security vulnerability within Hydra, and in particular how to +handle so-called "Silent fixes".

What did the team achieve this week

  • Updated security policy and vulnerability disclosure policy #1088
  • Adr/network reliability #1082

What are the goals of next week

+ + + + \ No newline at end of file diff --git a/2023-09-29-ledger/index.html b/2023-09-29-ledger/index.html new file mode 100644 index 00000000000..8b34e47fd0c --- /dev/null +++ b/2023-09-29-ledger/index.html @@ -0,0 +1,32 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Alexey Kuleshevich

High level summary

Few important Conway related features were completed in this two week period:

  • Constitutional Committee was the last missing Conway related entity that has now been +fully implemented.
  • Treasury withdrawals governance actions have been fixed and now behave as expected.
  • Current treasury amount supplied in the transaction is now enforced by the rules.
  • DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no +proposals to vote on.
  • Semantics of how CostModels are updated with Protocol Parameters have been changed to +allow for individual Plutus language version updates, rather than requiring a complete +replacement of all CostModels

Besides the new features there were also important performance and testing improvements:

  • In particular stake distribution computation and native script handling received some +optimizations.
  • New testing DSL has been implemented that drastically simplifies writing unit tests for +ledger rules.
  • Integration tests and benchmarks are now possible for Conway era because of the overhaul +of functionality for initial funds and staking injection whenever node starts up in +Conway, while bypassing all previous eras.

Low level summary

Conway era

  • pull-3729 - DRep expiry update after a contiguous set of epochs with no proposals to vote on
  • pull-3739 - Rename some PParams to be consistent with Agda specification
  • pull-3743 - Move DRepDistr from VState to ConwayGovState
  • pull-3746 - Implement tcTranslationContextL for Shelley
  • pull-3737 - Implement EraTransition
  • pull-3749 - Add predicate failure: current treasury value mismatch in LEDGER
  • pull-3748 - Apply enacted treasury withdrawals
  • pull-3745 - Constitutional Committee Ratification
  • pull-3763 - Plutus interface improvements
  • pull-3771 - Changed how costmodel updates are applied
  • pull-3766 - Prevent updating protocol version with PParamUpdate

Performance

  • pull-3765 - Improve native script handling
  • pull-3747 - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin
  • pull-3758 - Cardano-Perf regression: UMap.size regression fix
  • pull-3754 - Use Alonzo-style TxOut encoder when possible

Releasing

  • pull-3742 - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes
  • pull-3744 - Changelog 8.4
  • pull-3752 - Patch release of cardano ledger conway 1.8.1.0
  • pull-3753 - Minor cleanup and changelog entries
  • pull-3760 - Fixup issues for release
  • pull-3764 - Bump plutus deps to 1.13

Testing

  • pull-3734 - Removed Shaped instance for Rep
  • pull-3735 - Simplify the implementations of hasOrd and hasEq
  • pull-3728 - STS tests based on constraints
  • pull-3714 - Implement the remaining upgradable families
  • pull-3733 - Add some unit tests for Conway features
  • pull-3762 - Update CDDL for praos headers.
+ + + + \ No newline at end of file diff --git a/2023-09-29-sre/index.html b/2023-09-29-sre/index.html new file mode 100644 index 00000000000..11ad8d8a430 --- /dev/null +++ b/2023-09-29-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· One min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node 8.4.0-pre.
  • The use of cardano-node docker hub will be deprecated in preference of GHCR

Lower level summary

Capkgs

  • Refactor parsing scripts, add github action automation, various bugfixes and cleanup: capkgs-compare

Cardano-parts

  • Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: cardano-parts-pull-8

Cardano-playground

  • Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: cardano-playground

Cardano-world

+ + + + \ No newline at end of file diff --git a/2023-10-02-network/index.html b/2023-10-02-network/index.html new file mode 100644 index 00000000000..18f033ff7f9 --- /dev/null +++ b/2023-10-02-network/index.html @@ -0,0 +1,42 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 3 min read
Marcin Szamotulski

High-level overview of sprint 45

Bootstrap Peers

We started reviewing the bootstrap peers PR, ouroboros-network#4615.

Towards Typed Protocols 0.2.0.0

We discovered a performance regression when using typed-protocols-0.2.0.0, and we +started investigating where it comes from. Currently, we see that +typed-protocols-0.2.0.0 can outperform typed-protocols-0.1.0.0 when running +in isolation with a simple ping-pong protocol, so the regression might be in +the new block fetch implementation which comes with typed-protocols-0.2.0.0 +See typed-protocols#3.

Tech Debt

We merged two PRs written by Galois engineers:

  • a pull request which refactors the main entry function for P2P, see ouroboros-network#3834;
  • a pull request which reviews usage of unsafe function in the network code based.

Galois also made progress with the following two issues:

IO-Sim

IOSimPOR

We found and fixed a bug in IOSimPOR. We'd like to thank Prof. John Hughes +(Quviq AB) for helping us with debugging the issue.

We also provided a more uniform API for IOSimPOR, and added ways to make the +debugging similar problems in the future easier.

Technical Details on IOSim refactoring
We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future.

IOSim

To prepare for the next release, we consolidate packages taking advantage of +the public sublibraries supported now both by cabal and Hackage. This is +a work in progress, io-sim#114.

Cardano Newtork Service Assurance

Galois made the following progress:

  • A test run of spinning up a CNSA instance was done, as a result documentation +was updated.
  • Based on the IOG code review of the CNSA code, updates to the CNSA code were +made.
  • Galois has started the design for adding a CNSA analysis for "fetched bytes +over time while node is syncing".

P2P adoption

In the last two weeks, we've seen increase in P2P adoption. +P2P relays

The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays. +node versions

Open Source

We upstreamed our FFI bindings to Windows named pipes to Win32 package, the +PR was accepted and merged.

We also received an external contribution which enhanced our documentation, see +ouroboros-network#4676.

+ + + + \ No newline at end of file diff --git a/2023-10-04-consensus/index.html b/2023-10-04-consensus/index.html new file mode 100644 index 00000000000..29f53878263 --- /dev/null +++ b/2023-10-04-consensus/index.html @@ -0,0 +1,25 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the in-memory backend.

On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain. +We also merged a fix for the Babbage to Conway transition, and released a new version of Consensus.

Genesis

  • We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (392).

Support

  • We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (366).
  • We enabled richer tracers in cardano-node that can be useful in future debugging (384).
  • Esgen continues with his release engineer activities, and created a new Consensus release.

Fostering collaboration

  • We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (369).
+ + + + \ No newline at end of file diff --git a/2023-10-04-mithril/index.html b/2023-10-04-mithril/index.html new file mode 100644 index 00000000000..873575d3d00 --- /dev/null +++ b/2023-10-04-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion on implementing Mithril in a light wallet to receive feedback and contributions from the community.

They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks.

Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs.

Low level overview

  • Created the discussion Implement Mithril in a light wallet #1273
  • Completed the issue Run client in browser WASM PoC #1254
  • Completed the issue Benchmark aggregator performances #1220
  • Worked on the issue Add SPO tickers in explorer #1185
  • Completed the issue Add a non 404 status code on the aggregator endpoint #1103
  • Completed the issue Use source attribute in errors #1265
  • Completed the issue Create a SPO checklist for KES keys update #1267
  • Completed the issue Configure status page and alerting #1277
  • Completed the issue Upgrade dependencies #1274
+ + + + \ No newline at end of file diff --git a/2023-10-06-hydra/index.html b/2023-10-06-hydra/index.html new file mode 100644 index 00000000000..469525a8de9 --- /dev/null +++ b/2023-10-06-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa

High-level summary

This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums.

The team also delivered the first version of the network resilience layer, significantly increasing head availability.

Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra.

Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra.

What did the team achieve this week

  • Release 0.13.0
  • Published vulnerability reports #1088
  • Merged network resilience work part I #1074
  • Planning for Cardano Summit participation
  • Discussions with funded Catalyst projects wanting to build on Hydra for support
  • Merged typos fix PR from @omahs #1095

What are the goals of next week

  • Complete Aiken commit validator script #1072
  • Complete Kupo integration #1078
  • Brick upgrade on TUI #1103
  • Clean backlog
  • Prepare and rehearse demo and talk for Cardano Summit
+ + + + \ No newline at end of file diff --git a/2023-10-06-performance-and-tracing/index.html b/2023-10-06-performance-and-tracing/index.html new file mode 100644 index 00000000000..f0fb81974f1 --- /dev/null +++ b/2023-10-06-performance-and-tracing/index.html @@ -0,0 +1,32 @@ + + + + + +Performance & tracing update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & tracing update

· 3 min read
Michael Karg

High level summary

  • Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system.
  • Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7.
  • Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store.
  • Tracing: The machine-readable tracer configuration has been merged. Optimization of cardano-tracer started.
  • Nomad backend: Ongoing variance analysis and refined cluster topology.

Low level overview

Benchmarking

Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the +performance of the in-memory backing store and evaluate possible optimizations (or regressions) for it.

Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results +show all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the cardano-tracer service.

Consensus QTAs

The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The +feedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype.

Development

Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort.

PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time, +we'd like to validate the many improvements that have gone into the Plutus evaluator.

Tracing

The focus for further optimization of the new tracing system has shifted to cardano-tracer - the service +receiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in cardano-node is +more performance critical, the receiving service must still minimize its resource footprint. Moreover, it can +generate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations.

Nomad backend

Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated +the same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery.

+ + + + \ No newline at end of file diff --git a/2023-10-10-node-cli-api/index.html b/2023-10-10-node-cli-api/index.html new file mode 100644 index 00000000000..24bf4cb42fe --- /dev/null +++ b/2023-10-10-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-09-27 - 2023-10-10

High level summary

CARDANO-NODE

CARDANO-CLI

  • Depracated governance query commands and moved all governance related queries to cardano-cli <era> query
  • Drep registration certificates now allow to include an anchor
  • Integrated Drep retirement ceriticates
  • clean up of Drep registration certificates.

CARDANO-API

  • Add support for committee hot key witnesses
  • Require conway onwards for voting
  • Conway drep registration: expose ledger anchor parameter
  • Add certs to txbody of Conway transactions

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-10-11-mithril/index.html b/2023-10-11-mithril/index.html new file mode 100644 index 00000000000..e6c75d161cd --- /dev/null +++ b/2023-10-11-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on crates.io, the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures.

Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI.

Low level overview

  • Worked on the issue Make mithril-client crate a library #1141
  • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
  • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
  • Completed the issue Update Rust compiler in nix CI #1282
  • Worked on the issue Mithril networks infrastructure maintenance #1218
  • Worked on the issue Activate Cloudflare protection of infrastructure #1230
+ + + + \ No newline at end of file diff --git a/2023-10-13-hydra/index.html b/2023-10-13-hydra/index.html new file mode 100644 index 00000000000..346a742b8c4 --- /dev/null +++ b/2023-10-13-hydra/index.html @@ -0,0 +1,24 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa

High-level summary

This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity.

They also completed the exploration of potentially moving the Plutus validator scripts to Aiken.

Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project.

What did the team achieve this week

  • Network Resilience Persistence (#1101)[https://github.com/input-output-hk/hydra/pull/1101].
  • Upgrade brick on TUI (#1103)[https://github.com/input-output-hk/hydra/pull/1103].
  • Aiken commit validator translation (#1072)[https://github.com/input-output-hk/hydra/pull/1072].
  • Fixed some bugs in our TUI client.

What are the goals of next week

  • Prepare presentation and workshop for Cardano Summit.
  • Work on hydra-poll dApp for Cardano summit.
  • Start the work on packaging hydra-node and related services.
+ + + + \ No newline at end of file diff --git a/2023-10-13-ledger/index.html b/2023-10-13-ledger/index.html new file mode 100644 index 00000000000..1b4ec9a2113 --- /dev/null +++ b/2023-10-13-ledger/index.html @@ -0,0 +1,30 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· One min read
Alexey Kuleshevich

High level summary

The Ledger team has been shifting focus from implementing Conway related features to +testing. For this reason there is a very little amount features that are reported this +time aorund. Notable Conway related changes are a specialized ledger query for getting +Constitutional Committee state and prevention of submitting proposal procedures that have +no valid path to enactment.

Testing related work was mainly on a constraint base system as well as on roundtrip +serialization. As a result of this extra testing a bug in Conway Genesis serialization +was eliminated.

Low level summary

Conway era

Integration and releasing

Testing

  • pull-3769 - Add roundtrip testing by validating FlatTerm
  • pull-3783 - Update TranslationInstance.hs
  • pull-3775 - Refactor and improve constraint based STS tests
  • pull-3793 - Fix sums with negative RHS.
+ + + + \ No newline at end of file diff --git a/2023-10-13-sre/index.html b/2023-10-13-sre/index.html new file mode 100644 index 00000000000..9f8102dcec2 --- /dev/null +++ b/2023-10-13-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 3 min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Sanchonet environment was updated to 8.5.0-pre.
  • Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring

Lower level summary

Capkgs

  • Various improvements and fixes including:
    • Add GHA cron schedule
    • Add nix auto-gc to avoid running out of storage during large package set builds
    • Add new packages to capkgs
    • Reduce runner storage requirement leaving more room for builds
    • Restructure capkgs attribute names to avoid package name collisions
    • Return to non-musl builds for cardano packages to retain journald compatability
    • Update cache usage to from file level to folder level to reduce network and latency overhead
    • Commit diff: capkgs-compare

Cardano-parts

  • Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: cardano-parts-pull-16
  • Dbsync, smash, faucet and more: cardano-parts-pull-15
    • Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes
    • Adds nginx vhost metrics exporter profile
    • Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down
    • Adds bash *-ng autocompletion compatible wrappers
    • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
    • Adds downstream grafana cloud dashboard as templates
    • Adds downstream grafana cloud alerts as templates
    • Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish
    • Updates the basic profile with IOG cache and commonly used bins
    • Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
    • Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks
    • Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets
    • Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration
    • Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion
    • Updates the colmena template with dbsync, smash, faucet machines profiles and roles
    • Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns
    • Bumps capkgs node-ng to 8.5.0-pre

Cardano-playground

  • Dbsync, smash, faucet and more: cardano-playground-pull-3
    • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
    • Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts
    • Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change
    • Optimizes machine sizes
    • Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets
    • Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion
    • Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
    • Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration

Cardano-world

Sanchonet-demo

  • Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: sanchonet-demo-commit
+ + + + \ No newline at end of file diff --git a/2023-10-15-network/index.html b/2023-10-15-network/index.html new file mode 100644 index 00000000000..4089ff7f37b --- /dev/null +++ b/2023-10-15-network/index.html @@ -0,0 +1,30 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· One min read
Marcin Szamotulski

High-level overview of sprint 46

Bootstrap Peers

We continued reviewing of bootstrap peers, see ouroboros-network#4555.

Towards Typed Protocols 0.2.0.0

We diagnosed the performance regression of the new design. The work on +typed-protocols will be postponed. For more details see the +typed-protocols#3. As an outcome of the performance debugging we prepared +PR which updates the demo-ping-pong and +demo-chain-sync applications.

Peer Sharing

We made progress in review of ouroboros-network#4644, which simplifies the +peer sharing and fixes the ouroboros-network#4642 issue.

Tech Debt

We reviewed the ouroboros-network#3836 PR which inspects all the uses of +error in ouroboros-network. The PR was prepared by Galois.

+ + + + \ No newline at end of file diff --git a/2023-10-18-consensus/index.html b/2023-10-18-consensus/index.html new file mode 100644 index 00000000000..4247a360ef2 --- /dev/null +++ b/2023-10-18-consensus/index.html @@ -0,0 +1,24 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node.

UTxO-HD

  • The Plutus workload benchmark for the in-memory backend showed no regressions for the metrics of interest, but it does show an increase in resource usage.
  • We got additional ad-hoc measurements on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB.
  • We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.

Genesis

  • We produced the first draft for a Survivable Eclipse Duration Model (422).

Support

  • Esgen finished his cycle as release engineer. Node 8.5.0 has been released.
  • We resumed work on the subpar handling of block from the future (4251).
  • We prepared the integration of new tracing events for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned issue).
+ + + + \ No newline at end of file diff --git a/2023-10-18-mithril/index.html b/2023-10-18-mithril/index.html new file mode 100644 index 00000000000..5cff106c833 --- /dev/null +++ b/2023-10-18-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay.

Finally, they enhanced the CI/CD to publish multiple packages to crates.io and started improving the developer experience with the Mithril devnet.

Low level overview

  • Published the security advisory Mithril relay could expose Cardano block producer internal IP when updated #GHSA-9m3h-72xj-x2gq
  • Worked on the issue P2P Networking - Proof of Concept #1300
  • Worked on the issue Make mithril-client crate a library #1141
  • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
  • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
  • Completed the issue Publish multiple packages to crates.io #1298
  • Completed the issue Rename public key published in releases #1292
  • Completed the issue Mithril networks infrastructure maintenance #1218
  • Worked on the issue Fix devnet Mithril Docker images #1272
+ + + + \ No newline at end of file diff --git a/2023-10-20-hydra/index.html b/2023-10-20-hydra/index.html new file mode 100644 index 00000000000..271d0eddd0c --- /dev/null +++ b/2023-10-20-hydra/index.html @@ -0,0 +1,26 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Franco Testagrossa

High-level summary

This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023.

In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON. +This improvement offers users greater flexibility and ease of interaction with the API.

Finally, the team has followed up on the TUI brick upgrade to version 1.10. +This effort has resulted in addressing minor details and enhancing the overall user experience with the TUI.

What did the team achieve this week

  • Prepare presentation and workshop for Cardano Summit.
  • More TUI fixes and improvements.
  • Upgrade GHC from 9.2.8 -> 9.6.2 #1105
  • Solved user issue related to submitting transactions in cbor format #1111.
  • Fix hydraw connection issue making it more stable #1121.

What are the goals of next week

  • Work on hydra-poll dApp for Cardano summit.
  • Start the work on packaging hydra-node and related services.
+ + + + \ No newline at end of file diff --git a/2023-10-24-node-cli-api/index.html b/2023-10-24-node-cli-api/index.html new file mode 100644 index 00000000000..7a8563603a4 --- /dev/null +++ b/2023-10-24-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-10-11 - 2023-10-24

High level summary

CARDANO-CLI

  • Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified.
  • stake-address-info now shows deposits balance.
  • Added conway governance action view to allow to inspect governance action files before submitting them on a transaction.
  • build-raw support for --vote-file and --proposal-file

CARDANO-API

  • Support DRep extended keys
  • Support Plutus V1 in Conway

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-10-25-mithril/index.html b/2023-10-25-mithril/index.html new file mode 100644 index 00000000000..60adcfca82a --- /dev/null +++ b/2023-10-25-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team released a new distribution 2342.0. This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes.

They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files.

Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the release-mainnet aggregator, and enhanced the Mithril explorer UI.

Low level overview

  • Worked on the issue P2P Networking - Proof of Concept #1300
  • Completed the issue Make mithril-client crate a library #1141
  • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
  • Completed the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
  • Worked on the issue Fix devnet Mithril Docker images #1272
  • Worked on the issue release-mainnet aggregator is unreachable #1310
  • Worked on the issue Build mithril-common and mithril-client in WASM PoC #1284
  • Completed the issue Display a summary of signers before the full list in explorer #1133
  • Completed the issue Add certificates list in explorer #1184
  • Completed the issue CoreVerifier setup does not compute total_stake correctly #1306
+ + + + \ No newline at end of file diff --git a/2023-10-27-hydra/index.html b/2023-10-27-hydra/index.html new file mode 100644 index 00000000000..4919802a2cd --- /dev/null +++ b/2023-10-27-hydra/index.html @@ -0,0 +1,34 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team fixed the gen-hydra-keys command to avoid +overwriting existing keys, and resolved issues related to the rewritten +hydra-tui. They also worked on a \"dirt road\" implementation for the +\"Ignored init tx\" notification, improving the robustness of the system.

The team finalized preparations for the Cardano Summit presentation, including +implementation of the hydra-poll example DApp.

If you happen to read this and attend the Summit in Dubai, make sure to check +out our Masterclass about \"Developing Hydra + Mithril for Scaling Cardano\" on +Friday, November 3 at 14:00-15:30 local time in the \"Al Dar\" room!

What did the team achieve this week

  • Fix gen-hydra-keys command to not overwrite existing keys +#1136
  • Fixed the rewritten hydra-tui#1113#1137
  • Finalized cardano summit preparation +#1109
  • Implemented the hydra-poll example DApp link to +repository
  • Dirt road implementation for \"Ignored init tx\" notification +#529

What are the goals of next week

  • Attend cardano summit and deliver presentation
  • Clarify / close user created issues
  • Build aarch64-darwin binaries in CI
+ + + + \ No newline at end of file diff --git a/2023-10-27-network/index.html b/2023-10-27-network/index.html new file mode 100644 index 00000000000..692c088b26d --- /dev/null +++ b/2023-10-27-network/index.html @@ -0,0 +1,35 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· 2 min read
Marcin Szamotulski

High-level overview of sprint 47

Bootstrap Peers

We continued to review the process of bootstrap peers, see ouroboros-network#4555

CI / Tests

We investigated our CI issues. We found a memory leak in typed-protocols +function used for testing codecs which triggered out of memory manager (OOM) on +some platforms (typed-protocols#43); we also found a bug in the connection manager which resulted in CI +timeouts (see connection-manager-fix).

KeepAlive client

We found two small issues with the keep-alive client, which were addressed +by Karl Knutsson (Cardano Foundation), ouroboros-network#4689.

Galois

We merged two large PRs prepared by Galois:

Cardano Network Service Assurance (CNSA)

Galois made the following progress on CNSA:

  • a simple [InfuxDB] database backend has been added;
  • the documentation has been updated;
  • internal improvements to the code;
  • progress on a new "CSNA analysis" that provides, for each sampler node, the +block download throughput in bytes over time.

New CHaP Release

We cut a new release of ouroboros-netowrk packages to CHaP: chap#547

More details

CI / Tests

We improved the memory footprint of some of our tests by analysing a stream of +IOSim traces without retaining them, see ouroboros-network#4696

As a safety measure, we introduced an upper bound for heap memory used by test +artefacts in our nix tests. We use 200MB limit for all tests except for +network-mux tests which use 350MB limit, see ouroboros-network#4702.

We refactored one of our tests to use ephemeral ports thus allowing it to +run concurrently, see ouroboros-network#4702.

We merged ouroboros-network#4623 which fixes a bunch of test failures.

All of them were due to a bug in test logic rather than a bug in production +code.

Release Process

We updated our release process & associated scripts, see +ouroboros-network#4705.

+ + + + \ No newline at end of file diff --git a/2023-10-27-sre/index.html b/2023-10-27-sre/index.html new file mode 100644 index 00000000000..7341d58737d --- /dev/null +++ b/2023-10-27-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 2 min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the cardano-playground stack

Lower level summary

Capkgs

  • Adds offchain-metadata-tools, dbsync sanchonet updates: capkgs-compare

Cardano-parts

  • General package updates, modules improvements and template recipes to support network migration from world to playground cardano-parts-pull-17
    • Bumps cardano-db-sync-ng to sancho-2-0-0 tag
    • Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play
    • Adds more machine system bins and devShell bins for scripting and debug purposes
    • Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module
    • Adds profile-cardano-node-topology module for a simplified interface to most common topology needs
    • Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs
    • Adds a topology function to filter self from group machines with an allowList for matching infixes
    • Adds metadata-server and related offchain-metadata-tools bins from capkgs
    • Updates justfile template with:
      • a new query-all recipe for getting status of multiple concurrent running environments
      • a new set-default-cardano-env recipe for fast switching between environments
      • a new start-demo recipe for forking a custom env into conway
      • a new start-node recipe for generic environment start
      • a new stop-node recipe for generic environment stop
      • updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions
      • updated query-tip recipe to a generic query tip compatible with each environment

Cardano-playground

+ + + + \ No newline at end of file diff --git a/2023-11-01-consensus/index.html b/2023-11-01-consensus/index.html new file mode 100644 index 00000000000..bfc8b66ab64 --- /dev/null +++ b/2023-11-01-consensus/index.html @@ -0,0 +1,26 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

This week the Consensus team made progress on two fronts: the question of survivable eclipse duration, which is part of our work supporting Genesis delivery, and how to improve the handling of blocks from the future. +Regarding the UTxO-HD branch, we managed to run a node with legacy blocks, which is syncing with mainnet, up to including Alonzo. +We also investigated a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release.

+ + + + \ No newline at end of file diff --git a/2023-11-01-mithril/index.html b/2023-11-01-mithril/index.html new file mode 100644 index 00000000000..f6c14db0e75 --- /dev/null +++ b/2023-11-01-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the release-mainnet aggregator.

Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI.

Low level overview

  • Worked on the issue P2P Networking - Proof of Concept #1300
  • Completed the issue Build mithril-common and mithril-client in WASM PoC #1284
  • Completed the issue Fix devnet Mithril Docker images [#1272](https://github.com/input-output-hk/mithril/issues/1272
  • Worked on the issue Light Wallet: Release mithril-client library #1311
  • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
  • Worked on the issue release-mainnet aggregator is unreachable #1310
  • Completed the issue Client regressions in snapshot list and download #1321
+ + + + \ No newline at end of file diff --git a/2023-11-08-ledger/index.html b/2023-11-08-ledger/index.html new file mode 100644 index 00000000000..0533b3c669f --- /dev/null +++ b/2023-11-08-ledger/index.html @@ -0,0 +1,34 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 3 min read
Alexey Kuleshevich

High level summary

This update contains mostly improvements to quality of Conway era implementation and +tooling that we use for testing Ledger. Major Conway bugs that were discovered and +squashed are:

  • PParamsUpdate proposals will now correctly use DRep thresholds for ratification
  • Treasury withdrawals are now properly enacted.
  • Corrected snapshotting and DRep Stake Distribution Pulser initialization
  • Delegation to non-existent Stake pool is no longer possible

Other important quality of life improvements are addition of reusable interfaces for an +ordered set OSet and ordered map OMap. Which allowed us to disable duplicate +certificates and proposals in a transaction. As a precursor to PlutusV3 integration, a +serious reorganization of Plutus related functionality was performed.

Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on +expired proposals, addition of Anchor to Constitutional Committee resignation proposals.

Significant improvements have been made to a specialized "Imp" test library that allows us +writing concise stateful unit tests for verifying the Ledger logic. Serious progress has +been made on the conformance testing, where we can now interface with Haskell generated +code from the Agda specification. Serialization testing has been extended to increase +binary conformance coverage.

Low level summary

Conway

  • pull-3808 - Enhance CommitteeMembersState query to return quorum and NoConfidence
  • pull-3801 - Fix epoch rule and tests
  • pull-3803 - Fix delegation validation
  • pull-3759 - Reshuffle things to the DRepPulser incorporates some snap shot things
  • pull-3779 - Prevent duplicate certs and proposals
  • pull-3794 - Added anchor to resign certs
  • pull-3797 - Cleanup JSON instances for Conway governance
  • pull-3848 - Plutus modules restructure
  • pull-3840 - Fix anomalies in Deposits in the Conway Era
  • pull-3856 - Add governance related ledger events
  • pull-3825 - Prevent voting on expired GovActions
  • pull-3831 - Treasury withdrawal fix
  • pull-3791 - Use a Data.OMap.Strict to replace ProposalsSnapshot
  • pull-3836 - PParamsUpdate enactment fix
  • pull-3846 - Revert argument order swap.

Testing

  • pull-3782 - Move ImpTest to Shelley testlib
  • pull-3842 - Imp improvements
  • pull-3844 - Add mappings to Agda types
  • pull-3853 - Fix strange assertion failure, which hides real Block too big problem.
  • pull-3809 - CDDL roundtrip testing
  • pull-3832 - Treasury withdrawals tests
  • pull-3839 - Added cardano-ledger-conformance
  • pull-3841 - Add sha256 to cardano-ledger-executable-spec

Improvements and releasing

  • pull-3843 - Add ...WithLogs versions of evalScripts and friends
  • pull-3795 - Bump plutus to 1.15
  • pull-3798 - Bump urllib3 from 1.26.17 to 1.26.18 in /doc
  • pull-3799 - Changes needed for 8.6 release
  • pull-3807 - Add invalidBeforeL and invalidHereAfterL functions
  • pull-3819 - Fixups needed for a release
  • pull-3829 - Post release CHANGELOG version bumps
  • pull-3830 - Bump aeson to 2.2
  • pull-3833 - Backport release cardano-ledger-conway-1.10.1.0
  • pull-3828 - Add changelog for node release 8.6
+ + + + \ No newline at end of file diff --git a/2023-11-08-mithril/index.html b/2023-11-08-mithril/index.html new file mode 100644 index 00000000000..5137c84584e --- /dev/null +++ b/2023-11-08-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files.

Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator.

Low level overview

  • Worked on the issue Prototype a P2P relay with libp2p #1300
  • Worked on the issue Light Wallet: Release mithril-client library #1311
  • Worked on the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
  • Worked on the issue release-mainnet aggregator is unreachable #1310
  • Completed the issue Client Docker package is incorrect #1322
+ + + + \ No newline at end of file diff --git a/2023-11-09-db-sync/index.html b/2023-11-09-db-sync/index.html new file mode 100644 index 00000000000..ed7c4e067ba --- /dev/null +++ b/2023-11-09-db-sync/index.html @@ -0,0 +1,32 @@ + + + + + +DB-sync Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

DB-sync Team Update

· One min read
Kostas Dermentzis

High level summary

We have created new tag sancho-2-2-0, which integrates missing Conway feautures and some minor fix +tags sancho-2-1-0, sancho-2-0-1. +We have completed the initial implementation for the bootstrap instance objective.

Lower level summary

  • Add a new --disable-gov flag which disabled Conway ferautures +#1558
  • Fix of the committee key size +#1544
  • Workaround a ledger issue with unregistered pools +#1542
  • Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs +#1539
  • Rename offline to offchain +#1533
  • Transfer existing tests to Conway era +#1529#1547
+ + + + \ No newline at end of file diff --git a/2023-11-10-hydra/index.html b/2023-11-10-hydra/index.html new file mode 100644 index 00000000000..9179073a0a3 --- /dev/null +++ b/2023-11-10-hydra/index.html @@ -0,0 +1,51 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

The last two weeks, the Hydra team achieved several milestones. They published +the monthly report for October, providing updates on project developments. The +team delivered a presentation and workshop at the Cardano Summit, contributing +to community engagement. They implemented a \"dirt road\" solution for the +\"Ignored init tx\" notification and moved the hydra-poll example project to a +dedicated repository. Additionally, the team built a hydra-chain-observer tool +for Hydra Heads, updated the toolchain to GHC 9.6.3, and made various +improvements to tooling and code formatting. They addressed specific issues, +such as fixing the gen-hydra-keys command and resolving concerns with the +rewritten hydra-tui. The team also enhanced the hydra-cluster smoke test +suite by fetching network configurations dynamically. Lastly, they actively +reviewed pull requests and architectural decision records from the community, +including contributions from SundaeSwap. An experiment, the Hydra tally, was +completed and successfully deployed to the mainnet by the Cardano Foundation.

What did the team achieve this week

  • Published the monthly report for +october
  • Given a presentation / workshop at the Cardano summit +#1109
  • Dirt road implementation for \"Ignored init tx\" notification +#529 (without +stateless observation)
  • Completed and moved hydra-poll example project into a +dedicated +repository
  • Built a first version of a chain observation tool for Hydra Heads +#1096
  • Switched toolchain to GHC 9.6.3 and various improvements on tooling +and code formatting +#1135#1152#1151#1154
  • Fix gen-hydra-keys command to not overwrite existing +keys #1136
  • Fixed the rewritten hydra-tui#1113#1137
  • Fetch network configurations instead of packaging them into +hydra-cluster (smoke) test suite +#1156
  • Reviewing PRs and ADRs from the community (SundaeSwap) +#1118#1157
  • Hydra tally experiment (Cardano Foundation) deployed to mainnet

What are the goals of next week

  • Tackle reported bugs
  • Shepherd contributed off-line mode PR to the main codeline
  • Improve chain observation tool to include more data and refactor +existing code towards more stateless observation
  • Start work on incremental decommits
+ + + + \ No newline at end of file diff --git a/2023-11-10-sre/index.html b/2023-11-10-sre/index.html new file mode 100644 index 00000000000..149e1b1e31c --- /dev/null +++ b/2023-11-10-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 3 min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the cardano-playground stack

Lower level summary

Capkgs

Cardano-parts

  • General migration support PR for cardano-world to cardano-playground cardano-parts-pull-18
    • Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground
    • Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes
    • Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains
    • The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state
    • The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable
    • Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0
    • For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true
    • Template updates include:
      • Adds optional TF AZ declaration on ec2 resources
      • Adds a cardano node p2p dashboard to the grafana cloud stack
      • Adds a dbsync pool performance analysis query
      • Updates python distribute and delegation scripts from world for playground compatibility
      • Starts a python script lib to reduce shared code among the python scripts
      • Several justfile improvements and new recipes
    • More detail is available in the PR description
  • Update submit action script for 8.6 cardano-parts-pull-19
  • Update scripts for 8.6.0-pre cardano-parts-pull-21
    • Fixes subcommand names based on ERA_CMD
    • Adds deposits to some commands
    • Separates CC cold/hot key generation as host authorization has to occur after action is approved
    • CC voting enabled in vote job

Cardano-playground

  • Migration PR to largely complete the network migration from cardano-world to cardano-playground: cardano-playground-pull-5
    • Adds re-spun private chain network
    • Migrates shelley-qa chain network from world
    • Justfile improvements and new recipes
    • Improve concurrent environment chain support
    • More detail is available in the PR description

Iohk-nix

  • Migration to play: iohk-nix-pull-561
    • Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org
    • Remove deprecated cardano-lib p2p network environment
    • Update sanchonet chain with respin changes
    • Update private chain with respin changes
    • Bump private and shelley-qa chains to sanchonet equivalent conway genesis
    • Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing

Sanchonet-demo

+ + + + \ No newline at end of file diff --git a/2023-11-14-node-cli-api/index.html b/2023-11-14-node-cli-api/index.html new file mode 100644 index 00000000000..f9d394c0951 --- /dev/null +++ b/2023-11-14-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Node API & CLI Team Update

· 2 min read
Carlos LopezDeLara

2023-11-01 - 2023-11-14

High level summary

CARDANO-NODE

CARDANO-CLI

  • Improve golden tests
  • Clean-up of conway era commands

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

+ + + + \ No newline at end of file diff --git a/2023-11-15-consensus/index.html b/2023-11-15-consensus/index.html new file mode 100644 index 00000000000..3886e9e5c30 --- /dev/null +++ b/2023-11-15-consensus/index.html @@ -0,0 +1,28 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· 2 min read
Damian Nadales

High level summary

Over the last two weeks, we managed to run a UTxO-HD capable node in legacy mode, which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does). +This legacy mode could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not. +However, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter. +On the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node. +Therefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend.

On the Genesis front, we reviewed the peer simulator for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team.

We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos.

Javier Sagredo continues his cycle as release engineer, and he is working on version 8.7 of Cardano node.

+ + + + \ No newline at end of file diff --git a/2023-11-15-mithril/index.html b/2023-11-15-mithril/index.html new file mode 100644 index 00000000000..40e887fc7b8 --- /dev/null +++ b/2023-11-15-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files.

Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation.

Low level overview

  • Worked on the issue Prototype a P2P relay with libp2p #1300
  • Completed the issue Light Wallet: Release mithril-client library #1311
  • Completed the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
  • Completed the issue release-mainnet aggregator is unreachable #1310
  • Completed the issue Fix certificate hashes re-computation in aggregator #1343
  • Completed the issue Remove unstable tag in unstable release #1235
  • Worked on the issue Enhance aggregator REST API performances #1327
  • Worked on the issue Signer runtime is stuck for some SPO #1312
+ + + + \ No newline at end of file diff --git a/2023-11-16-network/index.html b/2023-11-16-network/index.html new file mode 100644 index 00000000000..734064eeb7d --- /dev/null +++ b/2023-11-16-network/index.html @@ -0,0 +1,28 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Network Team Update

· One min read
Marcin Szamotulski

High-level overview of sprint 48

Bootstrap Peers

We continued reviewing bootstrap peers, ouroboros-network#4555.

IOClasses / IOSim

We prepared slides for a Haskell meetup were we presented a talk on IOSimPOR. +The recording will be availble on YouTube.

We also used the opportunity to do some refactoring of the IOSim code base: io-sim#117. +We released io-sim-1.3.0.0 on Hackage: io-sim#119.

We also added forkFinally to MonadFork (not included in 1.3.0.0 release): io-sim#123.

Tech debt

We refactored Resource used by the DNS subsystem: ouroboros-network#4707. +We continued reviewing the ouroboros-network#4625 PR, which refactors +RootPeersDNS module.

+ + + + \ No newline at end of file diff --git a/2023-11-17-hydra/index.html b/2023-11-17-hydra/index.html new file mode 100644 index 00000000000..8fa81526747 --- /dev/null +++ b/2023-11-17-hydra/index.html @@ -0,0 +1,31 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team made several impactful updates. They addressed +misleading errors regarding collect com transactions, resolved a security +advisory (CVE-2023-42806), and simplified the Hydra Head protocol by using +inline datums. The team also tackled minor inconsistencies in specifications and +implementation, documented reasons for potentially dropped close transactions by +the cardano-node, and collaborated with SundaeLabs on an offline mode for +hydra-node. Additionally, they engaged in discussions with researchers about +incremental de-/commits.

What did the team achieve this week

  • Removed misleading errors about collect com transactions #839
  • Addressed security advisory CVE-2023-42806 in PR #1161
  • Changed the head protocol to use inline datums, simplifying things in the hydra-node #1162
  • Addressed minor inconsistencies in spec and implementation #1104
  • Documented why close transacations might be dropped by the cardano-node (cant fix) #1039
  • Tidy up a few things here and there
  • Worked with SundaeLabs on the offline mode for hydra-node
  • Discussed incremental de-/commits with researchers

What are the goals of next week

  • Start work on incremental decommits protocol specification #1057
  • Provide support to Hypix
  • Address all open bugs
  • Release version 0.14.0 with this scope
  • Update dependencies to prepare for Conway #1114
  • Shepherd off-line mode PR over the finish line
  • Complete tidying up chain layer via stateless observation changes in hydra-node #1096
+ + + + \ No newline at end of file diff --git a/2023-11-17-performance-and-tracing/index.html b/2023-11-17-performance-and-tracing/index.html new file mode 100644 index 00000000000..2e2e5d709be --- /dev/null +++ b/2023-11-17-performance-and-tracing/index.html @@ -0,0 +1,34 @@ + + + + + +Performance & Tracing Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & Tracing Update

· 3 min read
Michael Karg

High level summary

  • Benchmarking: Release benchmarking for node 8.6.0 as well as benchmarks scrutinizing GHC versions and the new tracing system.
  • Development: PlutusV3 capability of our workload generator has been implemented.
  • Tracing: First round of optimization of the cardano-tracer service has completed, awaiting validation.
  • Nomad backend: A significant PR has landed addressing automation features and debugging capabilites.
  • Workbench: Configurable remote environments and improvements to run documentation have been merged to master.

Low level overview

Benchmarking

We've performed and analyzed a full set of benchmarks for node 8.6.0, both in comparison to recent release tags +and mainnet version 8.1.2. A lot of development work has entered the system since then, so it is crucial +we can rule out any potential performance risks for the next mainnet release.

Additionally, we've been benchmarking GHC9.6.3 builds of cardano-node. Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform.

A last set of benchmarks was dedicated to the new tracing system with node 8.6.0. We were able to show that +there is no performance risk to enabling the new system, even when forwarding all trace messages to a cardano-tracer +service on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression.

Development

For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes +to the execution budgets by developing specialized workloads.

Tracing

The cardano-tracer service has received its first batch of optimizations. Profiling output is promising; to measure +performance for a long service run time, we're currently equipping the service binary with the same capability to +emit regular resource traces as cardano-node. Analysis of those will be the basis for validating this and possible future optimization efforts.

Nomad backend

Many improvements for the nomad backend have been implemented and merged to master. This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service, +more detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables +our team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred.

Workbench

Our performance workbench has seen upgrades in documenting and reporting cardano-node builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler. +When alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential.

Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance.

+ + + + \ No newline at end of file diff --git a/2023-11-20-cip1694/index.html b/2023-11-20-cip1694/index.html new file mode 100644 index 00000000000..6393f0290dc --- /dev/null +++ b/2023-11-20-cip1694/index.html @@ -0,0 +1,25 @@ + + + + + +Initial CIP 1694 Security Analysis and Responses | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Initial CIP 1694 Security Analysis and Responses

· 6 min read
Kevin Hammond

High level summary

We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

Initial CIP-1694 Security Analysis and Responses

Section: The constitutional committee


  • “For example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


Section: Size of the constitutional committee


  • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


Section: Terms


  • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

Thanks. Yes, that suggestion is a bit easier to read.


Section: Registered DReps


  • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


Section: Ratification


  • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

These correspond exactly to the groups that are administered by the Parameter Committee.


  • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

Yes, it’s not about harming the system, since Info +actions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


Section: Content


  • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


Section: Protocol Parameter groups


  • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


  • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


Section: Votes


  • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


  • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


Section: Changes post Edinburgh workshop (July 2023)


  • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


Section: Reduced deposits for some government actions


  • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

Indeed. We have no plans for this at the moment.

+ + + + \ No newline at end of file diff --git a/2023-11-22-ledger/index.html b/2023-11-22-ledger/index.html new file mode 100644 index 00000000000..efc63dd3741 --- /dev/null +++ b/2023-11-22-ledger/index.html @@ -0,0 +1,28 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Alexey Kuleshevich

High level summary

Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of +CDDL specification. Important bugfixes include:

  • Fix deserialization of ValueNotConservedUTxO predicate failure that could not +previously report zero ADA.
  • Fix deserialization of CostModels in the PParamsUpdate. Invalid CostModels are no +longer allowed, only CostModels for unrecognized Plutus versions are allowed starting +with Conway
  • Fix returning of Deposits for ProposalProcedures

Testing tooling has been improved and new tests have been implemented for Conway era.

Low level summary

Conway

  • pull-3858 - Restructure computing Refunds and Deposits in a TxBody across all eras
  • pull-3860 - Removed mock/crypto.cddl, added optional tag to sets
  • pull-3864 - Fix Proposal deposits and add deposit tests to imp tests
  • pull-3859 - Rename ProposalsSnapshot to Proposals
  • pull-3867 - MaryValue fixes
  • pull-3869 - Indicate that tag 258 is optional for OSet. Fix rational CDDL
  • pull-3863 - Improve deposits refunds re-usability
  • pull-3861 - Fail PParamsUpdate deserialization for invalid costmodels in Conway
  • pull-3875 - Fix cddl spec for CostModels in Conway
  • pull-3876 - Change 4 PParam fields from EpochNo to EpochInterval
  • pull-3884 - Relax requirement on the Set tag 258 to be enforced in the next era

Testing

  • pull-3868 - Improvements to support property tests on Traces with simple Tx with DRep related Certs
  • pull-3792 - RATIFY and GOV constraint tests
  • pull-3885 - Added a test for genTxAndNewEpoch
  • pull-3886 - QuickCheck Imp integration

Improvements and releasing

+ + + + \ No newline at end of file diff --git a/2023-11-22-mithril/index.html b/2023-11-22-mithril/index.html new file mode 100644 index 00000000000..a045d8efdaa --- /dev/null +++ b/2023-11-22-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· One min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer.

Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release.

Low level overview

  • Completed the issue Prototype a P2P relay with libp2p #1326
  • Worked on the issue Enhance aggregator REST API performances #1327
  • Worked on the issue Signer runtime is stuck for some SPO #1312
  • Completed the issue Manually deploy a test Mithril network #1356
  • Completed the issue Make Cardano node version custom in CI/CD #1355
  • Worked on the issue Support P2P relay in infrastructure #1361
  • Completed the issue mithril-client fails to extract archive #1352
+ + + + \ No newline at end of file diff --git a/2023-11-24-hydra/index.html b/2023-11-24-hydra/index.html new file mode 100644 index 00000000000..30275799e46 --- /dev/null +++ b/2023-11-24-hydra/index.html @@ -0,0 +1,47 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· 2 min read
Sebastian Nagel

High-level summary

This week, the Hydra team spent significant time opening a head among +themselves on mainnet using the release candidate, revealing and +addressing lurking bugs such as +#1174. Also +required was this change to dynamically calculate the min utxo value +#1176, a +necessary adjustment following the switch to inline datums. The team +engaged with cardano-cli / cardano-api maintainers to discuss recent +changes and collaborated on drafting feature ideas, including providing +Conway support +for the Hydra roadmap. As part of ongoing improvements, they +experimented with writing the specification in markdown instead of +LaTex.

What did the team achieve this week

  • Opened head among us on mainnet and uncovered a few lurking bugs like +#1174 in the +release candidate
  • Calculate the min utxo value instead of hard-coding it +#1176, which is +needed since we switched to inline datums.
  • Met with the cardano-cli / cardano-api maintainers to discuss +recent changes and way forward
  • Drafted features ideas to provide Conway +support on the +Hydra roadmap
  • Experimented in writing the specification in markdown instead of LaTex

What are the goals of next week

  • Have the Monthly review meeting with several demos
  • Release version 0.14.0 with this +scope
  • Complete tidying up chain layer via stateless observation changes in +hydra-node +#1096
  • Update dependencies to prepare for Conway +#1114
+ + + + \ No newline at end of file diff --git a/2023-11-24-sre/index.html b/2023-11-24-sre/index.html new file mode 100644 index 00000000000..6c40a452b60 --- /dev/null +++ b/2023-11-24-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

SRE Team Update

· 4 min read
John Lotoski

High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • The cardano-node nixos service now supports SIGHUP p2p topology reloading when the useSystemdReload option is enabled

Lower level summary

Capkgs

  • Update cardano-db-sync and offchain-metadata-tools package paths and/or references: capkgs-compare

Cardano-node

  • Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: cardano-node-pull-5537
    • Creates a useSystemdReload bool option for the cardano-node nixos service
    • This will move the topology file(s) to /etc/cardano-node/topology-$i.yaml and inject systemd reload hooks for p2p configured cardano-node instances
    • Moving topology files to /etc also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired

Cardano-parts

  • Adds a metadata server profile and a number of other features and improvements: cardano-parts-pull-20
    • Adds a new metadata-service profile
    • Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile
    • Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish
    • Adds extra node list producers and public producers for cardano-node-topology profile
    • Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch
    • Adds select systemd metrics reporting to grafana-agent profile
    • Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS
    • Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it
    • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
    • Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation
    • Adds support for grafana recording rules in the template files
    • Improves cardano-group profile handling of producers with respect to multiple instance nodes
    • Improves grafana-agent profile metrics handling for multi-instance cardano-node servers
    • Improves smash service preStart handling while waiting for a node socket
    • Updates Justfile for ERA_CMD demo support
    • Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates
    • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
    • Defaults cardano-postgres profile psqlrc use to false

Cardano-playground

  • Adds a new testnet metadata server, cluster webserver, and other improvements: cardano-playground-pull-6
    • Adds a new metadata server
    • Adds a new webserver for the cluster's static virtualhost needs
    • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
    • Adds systemd metrics monitoring to the cluster
    • Resizes sanchonet machines to support the growing chain
    • Completes migration of preprod from world
    • Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes
    • Updates Justfile for ERA_CMD demo support
    • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
    • Migrates book static code to playground from world, with refactor, cleanup and updates
    • Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules

Offchain-metadata-tools

  • Adds db password option with obfuscation plus misc improvements: offchain-metadata-tools-pull-61
    • Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services
    • Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile
    • Moves from std use in the nix flake to standard flake schema
    • Fixes hydra CI failures
    • Builds update-docs in hydra to avoid long local build times
    • Removes deprecated tullia
    • Removes deprecated check-hydra from pkgs
    • Removes deprecated bors files and references
+ + + + \ No newline at end of file diff --git a/2023-11-29-consensus/index.html b/2023-11-29-consensus/index.html new file mode 100644 index 00000000000..a2130099afa --- /dev/null +++ b/2023-11-29-consensus/index.html @@ -0,0 +1,29 @@ + + + + + +Consensus Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Consensus Team Update

· One min read
Damian Nadales

High level summary

The Consensus team implemented and tested a patch that does not propagate future headers. +It is under review, and we expect it can be released in the next Cardano node version. +On the UTxO-HD front, we finished prototyping the LedgerDB and BackingStore redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend. +With this prototype finished we can start integrating the rest of the code. +We investigated the unexpected performance degradation observed when acquiring the block context. +We also released Cardano node 8.7.0 and moved tree-diff outside cardano-ledger libraries.

+ + + + \ No newline at end of file diff --git a/2023-11-29-mithril/index.html b/2023-11-29-mithril/index.html new file mode 100644 index 00000000000..89a69754de9 --- /dev/null +++ b/2023-11-29-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team released the initial version of the Mithril client library, enabling developers to integrate core Mithril features into their applications. They also released a new distribution, 2347.0, which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements.

The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance.

Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users.

Low level overview

  • Release of the mithril-client library crate
  • Publication of a dev blog post about the released Mithril library
  • Released the new distribution 2347.0
  • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
  • Worked on the issue Enhance Mithril/Cardano node communication #1315
  • Worked on the issue P2P threat modeling and risk analysis #1350
  • Worked on the issue Enhance aggregator REST API performances #1327
  • Worked on the issue Signer runtime is stuck for some SPO #1312
  • Completed the issue Support P2P relay in infrastructure #1361
  • Completed the issue Make Cardano node version custom in CI/CD #1355
  • Completed the issue Manually deploy a test Mithril network #1356
  • Completed the issue mithril-client verbosity not following usage menu #1325
  • Completed the issue Error message for mithril-client snapshot download #1375
+ + + + \ No newline at end of file diff --git a/2023-12-01-hydra/index.html b/2023-12-01-hydra/index.html new file mode 100644 index 00000000000..26fb11765b7 --- /dev/null +++ b/2023-12-01-hydra/index.html @@ -0,0 +1,38 @@ + + + + + +Hydra Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Hydra Team Update

· One min read
Sebastian Nagel

High-level summary

This week, the Hydra team conducted a packed Monthly Review meeting, +featuring demonstrations and the preparation of the monthly report. They +addressed flakiness in tests and enhanced the logs json schema, +improving overall test reliability. Additionally, the team successfully +built MacOS ARM64 (aarch64-darwin) binaries in CI, expanding platform +support. They further improved the network configuration by detecting +incompatible persisted states, contributing to overall system +robustness. Finally, the team released version 0.14.0, highlighting +their commitment to delivering regular updates and improvements.

What did the team achieve this week

  • Monthly Review +meeting +packed with demonstrations and prepared monthly report +#1189
  • Fixed several flaky tests and improved the logs json schema +#1188#1190#1192
  • Built MacOS ARM64 (aarch64-darwin) binaries in CI +#1182
  • Improved network configuration by detecting incompatible persisted +states #1174
  • Released version 0.14.0

What are the goals of next week

  • Start work on incremental decommit
  • Continue shepherding contributed PRs to completion
  • Finish stateless-observation work
  • Open a head on a Conway network
+ + + + \ No newline at end of file diff --git a/2023-12-04-performance-and-tracing/index.html b/2023-12-04-performance-and-tracing/index.html new file mode 100644 index 00000000000..567be1cdd62 --- /dev/null +++ b/2023-12-04-performance-and-tracing/index.html @@ -0,0 +1,28 @@ + + + + + +Performance & Tracing Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Performance & Tracing Update

· 3 min read
Michael Karg

High level summary

  • Benchmarking: Release benchmarking for node 8.7.0. Also, we performed the first-ever Conway benchmarks.
  • Development: Conway capability of our workload generator has been implemented and merged to master.
  • Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data.
  • Tracing: Quality-of-life improvements to tracing output and addition of a test suite.
  • Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.

Low level overview

Benchmarking

A full set of benchmarks for node 8.7.0 has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of 8.7.0 over 8.6.0, and can confirm no regressions have been introduced.

Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version. +Only Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty.

Development

Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era. +Currently, we're looking into adding Conway-exclusive features, such as DRep registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining DRep sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying.

Infrastructure

As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've +improved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data.

Tracing

The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages. +Additionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system.

Nomad backend

We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases.

+ + + + \ No newline at end of file diff --git a/2023-12-06-ledger/index.html b/2023-12-06-ledger/index.html new file mode 100644 index 00000000000..dfe5feca52c --- /dev/null +++ b/2023-12-06-ledger/index.html @@ -0,0 +1,30 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Ledger Team Update

· 2 min read
Alexey Kuleshevich

High level summary

This period we reached a major milestone, namely we now have an initial version of Conway +conformance testing working. We are now able to generate random valid data with the help +of constraint based testing framework, apply that data to Conway Ledger rules and verify +that the output matches to the one produced by the executable version of the Formal Ledger +Specification, when it is applied to the same random data.

We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get +Constitutional Committee query is complete and tested. Various improvements to the +testing tools. Addition of more test cases.

Low level summary

Conway

  • pull-3888 - Add checks for valid ProtVer when a proposal is a HardFork
  • pull-3902 - Fix pvCanFollow usage in Conway and improve clarity in Shelley
  • pull-3855 - Remove unreachable proposals
  • pull-3903 - Add lenient decoder for Addr
  • pull-3878 - Committee query - implement next epoch change

Testing

  • pull-3893 - Move tree-diff dependency to tests together with all instances
  • pull-3896 - Fix Brute force failure
  • pull-3904 - New ListWhere Pred added to the Constrained Solver.
  • pull-3907 - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file
  • pull-3883 - Committee QuerySpec Imp Test
  • pull-3909 - Make impAnn a bit more useful, by making the logs scoped by impAnn
  • pull-3908 - Use upstream testing instances for very basic types
  • pull-3912 - Removed call to tail, and the 'watchPulser' test
  • pull-3852 - Added constrained generators to conformance tests - Part 1

Improvements and releasing

+ + + + \ No newline at end of file diff --git a/2023-12-06-mithril/index.html b/2023-12-06-mithril/index.html new file mode 100644 index 00000000000..bab45e93b1f --- /dev/null +++ b/2023-12-06-mithril/index.html @@ -0,0 +1,24 @@ + + + + + +Mithril Team Update | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Mithril Team Update

· 2 min read
Jean-Philippe Raynaud

High level overview

This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking.

Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io.

Low level overview

  • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
  • Worked on the issue P2P threat modeling and risk analysis #1350
  • Worked on the issue Create a test network on Sanchonet #1173
  • Worked on the issue Upgrade breaking changes crates #1357
  • Worked on the issue Enhance Mithril/Cardano node communication #1315
  • Completed the issue Enhance aggregator REST API performances #1327
  • Completed the issue Signer runtime is stuck for some SPO #1312
  • Completed the issue Make mithril-client examples full crates #1385
  • Completed the issue Manual publication to crates.io with GitHub action #1380
  • Completed the issue Remove sqlite dependency from mithril-client crate #1390
+ + + + \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 00000000000..7ff412a8ca2 --- /dev/null +++ b/404.html @@ -0,0 +1,24 @@ + + + + + +Page Not Found | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + + + \ No newline at end of file diff --git a/archive/index.html b/archive/index.html new file mode 100644 index 00000000000..26037306f0c --- /dev/null +++ b/archive/index.html @@ -0,0 +1,24 @@ + + + + + +Archive | Cardano Development Updates + + + + + + + + + + + + +
+
Skip to main content

Archive

Archive

2022

2023

+ + + + \ No newline at end of file diff --git a/assets/css/styles.1b2b551c.css b/assets/css/styles.1b2b551c.css new file mode 100644 index 00000000000..f7a74aae298 --- /dev/null +++ b/assets/css/styles.1b2b551c.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area.breadcrumbs__link[href]:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q>:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.docsWrapper_BCFX,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-duration:.25s;transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-duration:.1s;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#docusaurus-base-url-issue-banner-container,.collapseSidebarButton_PEFL,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.mainWrapper_z2l0{flex:1 0 auto}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity .2s ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:.15s;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.breadcrumbHomeIcon_OVgt{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg);position:sticky}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;max-height:100vh;padding-top:var(--ifm-navbar-height);position:sticky;top:0;transition:opacity 50ms;width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{height:0;opacity:0;overflow:hidden;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;max-height:100vh;top:0;transition:background-color var(--ifm-transition-fast) ease}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/files/2022-11-24-UCL-60c46564c5dee25b0060304c060ab1cf.pdf b/assets/files/2022-11-24-UCL-60c46564c5dee25b0060304c060ab1cf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..724ed4392ddcd2107cd0443fda5923344ad239d5 GIT binary patch literal 389191 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

n(ffp8B@%3wHI(?WiSJPL_7(11 z$LIl!T;!GR{wrQ&9d9tj2SEL$S0;ptpIZx3!b8LaedZqw#^CW9i}~=8M-ifyVi5!{ z&8F#D!3W{z))+Z1F3XpNB@CBaR{+woNB! zc;*7BQLgY((Rh{5=Y>M2&?Ydivrp`!z|O#wmx0Y2eiK&0%>42so?(#;fRYnPSC185 z4MVb;c4zldJ;ieS$|!UsQ3|GjTCP$C^J|O4j*Uo4H_v=X`3E>|w7n_cT#F!IM6%~C zbBRdrHEIe5NY6g&Q}gIT8t@8)VY+ytUvTE3Qn>H}klsinxWslGXF{Y$a`|P4#+k1h z#X-g;)1`8(3i@8pPZmI@G5i;kf6|eOko_TP}P^&3@XefBH(0t6$Q;Wo0-1*(U zkK{<}o#Jz7!+AJ{bNP77pTm5MJOzxh6-AS9Q8SlT)!Q%hGzGxuU-2Kjoqs201pA(q z*<&J8r%1^5BeQlC`(}jKk@(mE@?p1$wuxv?__uWY4AyA#PdIoS(r6-|Q0urOCIe=H z=izB!y8+eE3dn=c6H1WWF~~N#r9CN(a&hJAT+oGU zz}CTIAWO}gLI%m#$v8z}9EZIXNcn1lC*FFl=#HR7QRrqCRW{1F$-H?--yi#$j{eLz z@tQDe#n}K^UV=Odim}Ta1MLmA&PxBrK><4Zw-Bw2tR5I)odnqB%-7Z?M(O8ihrDPbVMyjO6>lID4;SlY7z29AbC{0p(=FKlQJ-RJju?I3bl-50&SSqlYN zJA63O_AHs4Ug(?h66L54=QC@JPGGf@%7Py?x(w`#f=VG4z|h!oM{cr=oyDv68M-ls zko=G|=adhkiAiG;#;u0c0~>C&D7s6?txz=iV*T(^m&xYa)|=T{1O(5d^6A)E+JUl5 z9ov?fh+s=N<61cD75_2px*MCrbkoqzKA|D_uA~pGByKEewTiDsmK(=FED4`GB>=3Rq2Cd zVz!W$MB6w`aVt&d{!$fnsCu6<&*UIQb7WQ;L&KEnQ-0=_x@`D2R&(2IU8{F`Epc6@ z_LV(oY1TaALiXO4%Zndwm`=j2Ho}jhv%*Oz5+WhMvHHk@ZXCLo)=9E(8oEQA$wPNA zZa?>ERy?S*)SN3`qAzg^ZUfI)KtSj?h?QJk;KG@(J38BBY}}g^QN>Tb8Q3GSaCUWK zG;cFR-NalasCVf}Jp5LPo2KL2yNmR-XzE>(U@<}JTLP00+C%Y8=NcQXGp@k1x#*M6I#YT zpMLYC()RI^GeHcmPNjI?^wDON<>sY9Tpz=qy)a2AvO-%Q=(VmGm^CffXJm(Xazzq}p<;B*7ZJ zzMM$Crmf!+X=v9lS2DQh1>hE#7)4yvI(F26#*lN(jN@)KyqaHF0-q_dWn@7~pDLHk zGd14GlW#nuz_aznZ}2vd9j#8{wsT+cKESuX4tV_r*`+57(Z0-?+T{?%T(4A9fU(6x z#J4eQsAGnc==f0Fk3c#OG+EIYCQCR+x!T&%A|p{Lfg?Xmi{&)WZ#NNoa?N@E z*Rf5C~RPyDCnCj3(7pfwbRj9#jQm2-U9rXnJUQ(jUvSB#JhQ^fN7VGO=5`C$fy zx1sSRsR(mr1hwwiSE8Ipj^z(`B|0fz{fG#Uj0xFJhnfId{PP0!n6N9zdjJdUVbrfxTn`F&KNsDDpXinnRTGr z#!48@LTd)CA}mS%sD@PiTtyp&zIQh;TjqLYb|kksH4~5(U;TUr=4@`p6k(mx942>z zl}k5eaC}%!Fh*}8ej0cb4(hH1WfBN%STK3acC+F{03Cy$L@8H^zIlxd!o`=1_8L&> z7#~%GBRPoj%gxVGt7LUz{k=VubLfq`UPb^oMhl}*n9!xh5B$4<==j>flv0q3Qa0+M zy3Q5osbH~PBh1G;C~@ItVGbttE60

E-R{D2!=*0AcZ^5ZO$?%KJy04hC8{C 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 O2F{-L>@hGi6#idbhK>dR literal 0 HcmV?d00001 diff --git a/assets/images/2022-11-02-csj-vs-baseline-9fd0e0e080975cc6cfbe035731b4f38d.svg b/assets/images/2022-11-02-csj-vs-baseline-9fd0e0e080975cc6cfbe035731b4f38d.svg new file mode 100644 index 00000000000..8c8eeb6606f --- /dev/null +++ b/assets/images/2022-11-02-csj-vs-baseline-9fd0e0e080975cc6cfbe035731b4f38d.svg @@ -0,0 +1,2277 @@ + + + + + + + + 1980-01-01T00:00:00+00:00 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/2022-11-02-csj-vs-baseline-sliced-77ff018af70191b4122b1e7cf56c79b8.svg b/assets/images/2022-11-02-csj-vs-baseline-sliced-77ff018af70191b4122b1e7cf56c79b8.svg new file mode 100644 index 00000000000..e75d1eaf09c --- /dev/null +++ b/assets/images/2022-11-02-csj-vs-baseline-sliced-77ff018af70191b4122b1e7cf56c79b8.svg @@ -0,0 +1,2041 @@ + + + + + + + + 1980-01-01T00:00:00+00:00 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/2022-11-11-noticed-headers-55bb0b4d41e8f0cff0066e1bec91bdd2.png b/assets/images/2022-11-11-noticed-headers-55bb0b4d41e8f0cff0066e1bec91bdd2.png new file mode 100644 index 0000000000000000000000000000000000000000..98f661897e5bdabfd5dbbe08a78c27f186852139 GIT binary patch literal 27290 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 literal 0 HcmV?d00001 diff --git a/assets/images/2022-11-16-comparing-TICKF-batch-c6570a71c4a5d53b10cb7309d2cc742c.png b/assets/images/2022-11-16-comparing-TICKF-batch-c6570a71c4a5d53b10cb7309d2cc742c.png new file mode 100644 index 0000000000000000000000000000000000000000..15e1c6e0b0b28d28530cb9d683cf98d8be10e659 GIT binary patch literal 33248 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 literal 0 HcmV?d00001 diff --git a/assets/images/2022-11-16-removed-stuttering-e49aa27a0e549f0195373203da971ba7.png b/assets/images/2022-11-16-removed-stuttering-e49aa27a0e549f0195373203da971ba7.png new file mode 100644 index 0000000000000000000000000000000000000000..606656fac379b3ba9875c41ff83e1098207b44f6 GIT binary patch literal 52161 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 literal 0 HcmV?d00001 diff --git a/assets/images/2022-12-14-ledger-ops-benchmark-c46be3db45ff5480ed104e0d520711a6.png b/assets/images/2022-12-14-ledger-ops-benchmark-c46be3db45ff5480ed104e0d520711a6.png new file mode 100644 index 0000000000000000000000000000000000000000..69a3758ff57f0fbb2a14196e4f12324e415b3ff7 GIT binary patch literal 83821 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

Pz0QB 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 UA20a`{`_mV#dmq%{_xZP0bkRM9{>OV literal 0 HcmV?d00001 diff --git a/assets/images/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks-6b129a1acaa4bb48443ee81add51fd39.png b/assets/images/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks-6b129a1acaa4bb48443ee81add51fd39.png new file mode 100644 index 0000000000000000000000000000000000000000..2e9cbe7de3b9b06092638eef83b4e3225843a9e5 GIT binary patch literal 104414 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 literal 0 HcmV?d00001 diff --git a/assets/images/2023-07-06-p2p-progress-194a909569eebb016b1f24fb8941e2cc.png b/assets/images/2023-07-06-p2p-progress-194a909569eebb016b1f24fb8941e2cc.png new file mode 100644 index 0000000000000000000000000000000000000000..59cde79f6ac2a5c0eae2975bd3970cf80281dd5d GIT binary patch literal 85638 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


F4(nrNGyyt}(O4?^| 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 z

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 literal 0 HcmV?d00001 diff --git a/assets/images/2023-08-31-relay-versions-0a8d445e1b0f3a793ccdd94f4aacd421.png b/assets/images/2023-08-31-relay-versions-0a8d445e1b0f3a793ccdd94f4aacd421.png new file mode 100644 index 0000000000000000000000000000000000000000..a9721ebe815108a053785483916143108abfd2a7 GIT binary patch literal 356758 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≶JABg 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ⅈsQ8!3(E)2Y)lp?6s;6mRZsgSus^#sTq+j5g_0?EXaBYV}tWc~tMOs!Hs zJ-2PW;-`nq6Gk5iQ(0#lb_%sRYOK{lAkCj1Ts%Uc6U&6>yF_J3+D8xQ69uqhoq_-( z3va;a!))$}a%WG#V(4AoFxW8L6BqxC`U6A^5M4_O zV{AtoM#QUl3_s-4&g83NFWt!+1y5MHM4)5>UZf*l-u2giUPLn{I0?MSoirtND60e( zeID3Y5-G|M70AwL{!7SC{Qg{ZFOH4%B^4#5*~S=&`RF>6xokImO1^c%AbwjK!-o&S zYrBUzkD-mP-j_bthC{?wX%zeXV5kun0w)$2iq5;=a2gCPwrn4ws%*6jBX{)n-rp(I z?3B~Ls?wQj-r~NzYEF8({QK#jft|n$aSUBtWZ-7|p)C_!#poy32x2dQ%Y*w=OlOuP zasK0y^+66Mv{9h`hbDO1JP8eQuo3e9;UV#mO+v2VAGNt@w^KN^(e>ZIoV-Ev^;_aX zrhao0_jw&c4>!EuSDwH1SAn5Wl>3$rcffy*EZwY(1EhVvz*iLDdiG-JW4so|wp}Gv z7Qf-teo|xYsif_G;>GidgW~1=e`)gt*QtEgUlfyg802QlD@W1C<)tV6!9%Ez*=y>W z%m=g~Y$}!{dNkUsl=o&np--kvYL>wGG`AV{wM78Lxz zV~H@kpC{pSew<{LeW7(9aQejf0mmyz)Z1-3{)|01fIB-oTTNYk@#%(Tq(0a;pl@iI z0{c2ae5R}e%!;&JU8~~a;R*=FalmsN@ZD2R3fk9i3n=C;NVDorOZ|Abty zYV^AbQ&~Z%&l?_|gnsbtPU-?5@I*o89-8>RegbWbN?ELU2cDNB8M(0{He0Utw$xXX za>W19K6clrq{OMl2YdqVe* zrixx-r!t?rQ_+L=lL3Abn`s$l3)Xa+(L9~)FG?bPHlbqgW=&aolQf>gP+3cF-lCTj zZjb&W5p18IK3<3T0fl-eU`lT__y<6G>%f>NmMpqXT?-s8^EH@3G|5DFU1@#2#)k}l z^)H

exld}{9$e+I^Y+=S0}Ff2SQVbI3lzups- z36LvbgA$`}Kl>wLA7s?!MAOJU)laLuwk4;l+>!&bojY2hRem@Uo@35Z-gz^yg6ky`m`P`-1Kb^~SkAyyLbC;$-RCD}UdNym&Nb3eaQ2~N zPgN|T{ZAuR_qDONPZZfSociP@)@0nonkE`oh!HTVC%DT#FvrHu9=Gr_7-uB5^=UFh z%tP$Q&o^SmOr>vZZ9m*0Z{iF~xKJvv?isa09amUMM}*&V%qOI*OaoA1)>8#h4ijTS zXk%yOZmlQGBZ?aN>c9|&0wl)#Jo-YH{?2e4W5$+F5Y4$OniHRIqu)W^k# zx-=IY_*`X=DBb@Y_{0CImymSzG`&<}Qs;D~=K|TOZ9cKTMlpdQ!mH;fx1oG>@%vBDWQQ`1uSeL9)3a`#IAkZ25fACRL`b0o%Hvly zX}snor(B>MU{c=eA}oZuM=9=U{wTfU%h7M|Wi;)gTEp$MfXK{BIpZwq1_2dS=Jl-H z?-qh7M}5NC(T8r6rg}T=X24s8~(SN`0dKi8ogIqE|)4@F?W^O zHv7-OFJ7ZyD&_$_6o@fdLszBKpt!i!61Fxm@J*S?&}yO3PFVlwC-$a*aC2mMQbx4o zrd*1mUT{1BUrHFk)aUGjV2X5@B)loAkrgZ~0?AN>yt`-6Qb zovuS!w{dBw!f}{NNH&;wQf_;z?kA=3BU0{IpS(%0oz5gu*4nzN^QUGVf@gX`eU@9wqCjf!rc_n`+ zFYk!_t3jOoOCFz0XJAXI8h!JfuLq|AM=>szb^Kc6=T0rpmI_u4P0KDJNLAYBe;7Hy}IuKME*Tw zuJe!MAa5i|Epv6$*NU4KMvUia2@B?~`UZ$ zuU0Uso&7jUC+N~HPZBDu$2&S?u!*0^%S4^URNALaqLOImZie$X_8t}(&_?$u?@1nL zW5T-ka5d=LT)|uTAQQCEJK;_8w4275W-n0~P0Z98<-5{jpX=Gg9eF>Q$mzEpL#YAm zn7gT6JIOL2t}NoK5G|nKx%=K@wKrRL_jlf7;1#2y#`X557FP|Z1m9ofrPvNWD7A8Z zNAwxNZU8)88w;=-v{}OL_C+h{&&8je>CNgS{E;+IYr58Ua`Jj9%!k+rHbaL6+Qx+x zBFx>ncRS`_!x|RsC{3??jT!^x|L)VYYVDd+T2~m+Ja<*4}~%$|DLAkttg; z5$k?*P1ye$8TJu8>;l-VNEG}Z$L=r4e`3O?=PbMm=pexU;=eJ04a9^Bm$|#)Lh#bk z(gdIhxP>VKd23aoTo+g$sKrRQ!jq`@Fjv-CbSU=2N;~oEIh01AFscj<^)alMd0TRoyL|>B z|GxS$#-ft-=d^vx6Tnw36T1qey^tUlJsi+Fz+Q% zKcLH$F(`R4bn>cjp-K1h9oU~f1PRjX7%-GvT|@Z~P~w0)6(hUGJsI0xv|SHy_=<4b zi*UwIv=-B&gS#vLqZ_f|L(*V2Y*m&U7W=hWEcaHJjZ^ZGSETsZBixq|+duVf-)zs+ z@c`F!U!SoeT^{qExc^^k01REAjoM7?;GZ7vX%5=5;c@Z%kf^aTii;jiXY*dc?)W`+fbj7 z2gxtAi?C9hGWZTQ*#rnBytHZg#A$#P^<2K_|G4PrCM=j)%XZ&Cy zzY-AZCabIy4gqZ5$=O-mDyOJOk!$XYVq2YvF#>KD%DY1JYP@=; z-!jhk{@!J|=4;>p^1Cy&`R_%$r-bR)2d@~Q-_!O)M~BYw@k58T!K*M@H@ zNUt=tvyQN;Y^YB76QJ7kClb;SvD?m zc$_PQZx<@;Te^_*aFBeryqKKam$_G4EQ3a2jG5VpiCWmKXV-)xA1Ch7XoPaqL{Vgm z06IZB=KIcql`EZHOauthNcoNF&^|s|Y;Z?3rc`q8Ef8;2_$g+!RDQGrzIV&W-IS3H zx}+K5E3JE&yJAi>O68j96unGnWBz~^w`gOCXJ*|GbTd!n$vD1oz>RpFcmm>j4O0FQh`@!2M&_K?{-4|83c?$N~W*uBg^Tmd@inp83w__J0g_Y4Du|oC| ze{6k7lo3!baXg^>a6tNR5p+cP{cF{XrHBq-ziGg=2Nim;b9UzSeCZ$HPCOSwAu)98 zoU&87p1%EkPjIVp`0(U06H~5|((t9>jN7#BK45$5R|opFV!uw13BUJn{`8M~rGclX zr_z41P#N_&x%TV9C7lCtzk}rYE}(Y7lwjbd8(W;?e|{FeyAVNMwb}_AY}9l(nHGwbvD@R#rV#+?VGx zrEi^;V;UPSZCcYD`QMPYR(Y zm|-93^>vj#%+#BuYK&+qxCOJe%-IE18P_MhYFbDpo_&!DXF({ z6-P48R7f7>eN4Xw8b)TNO~*sG-4 z5d(4uuxvT)8}~lWIQ2ep0_r%O@wn+UWv6Hla6shN!uVT@^;)PFz~ihS*MKg=(0F^6 zczDj|K&hCPUJ+pSU*i)HENT%Td;v7DI|z>qGuD7>1%|weO}mg%QG`YVQf^BsJ6aq^ z7vMxhP{=^asT%SWy4js}O>F~)8z2%rTn^T!4!mIvQ=+{N z%Ua_baSO~)rrr4&w8@}8PF^1v1VF$%F%yE&6pxR6DU3dh>R##Fk(XY6YpXiW@zZ>D zfFLXVT+B+#Y5FPM@YV-(+qK4ee{&ymxAoYlU<`EM1+N`?!8i5-bJy46QzmtwBBVaT z&W;=pYmT$vZz}AYZP{S1GaD$k{i+O^&yo5~s(Lf=f0o<_ghTq?V`mA0dIjd;{w-k} zAEjeS7>0I?Z?d|-keZyE4)q8s>%6CVPzk2;1TSXL}WZ7q5 z011u-(o%XV?56;LGjBx(AG1jH%t7-nd926STUi}NoUc)x;$wviw?4oMTl#+8UnQt* z1VUP#U|_No@+i`>%I<;OiMI(-FhgSoAnKK-tSl{~L0L6f>zFBWg<9MPaYQ0Ckkysc6BEGwyMVY%YUwuC|1j#c)ioK7fQQ@$jwX*Hvi9X@e=oc4Hr|Iuhw85 zI`HIgO38)^RU20iv&~-~&g&+fQnsD2iu~S-K1AQr<@$?Z)`1R>&YRP98V?B+;PMzi z%mlL$oYAo330u%qsPtWxn!6iBT$oJ$sPH`DUrVPaR-*O#O4z?Kn*&DswhF%pp_(90 zrbqsmw235{V7HVg_)$*_vU;cI8jJxW;ub%pcN)fD6HOMal)v>f$y2c1dkL_apW@-S ze)1Qg+Rr`k5aqSCIu@;ouvE@zJ!q6>b%-8>_&xuCmOh(*1d+~@29uxItp!V&QDRd* zGwWst7+dE*EjA>(G<=NT zzd#n$;ScnMmP#77hkOOL81-=WYpP&0Y^%`yz(mmWuJV~by(w36IsQ|wl+>-YDt)ap zIUdVER@vbI10s$m2J}FT^5Jw1r>X#4bNyp!;NgyY#hHNoEGDu2L2Kto>}DbQ6n3*x zlw4r$F6>)mG`0RT0HFNCpIkJkS;YyGE%fb`61@fzs3*?Yh*j8v%=afb(HKm?6z7wD`73+y@v!V-D<= z{Ujy}C+Agxe_{Rsgf&{P*5m?lNXCpQzAw^N;65ku2yFy8IMUEOY>yYNFcB5sVp;kG znZ|61Y1SUP3<9Cb37#o16h0o2INbe7k}#MlD-ckGjmRxDuh@D~0|29f5+{JZXLLeV z_=UTg;QZF#2Y%LmekSctk9V4ZkipTq4O_7z2V?}p?PtsGC;9HP9RSFtKwN=ft_v*J zm_QUSslHX%lB=9ja1^|~it(b{RPpv873p86DlvDZ(?#_5r#|U_5*HSU7_-E-ntYXYrz30e3QzI}&J|sj0k? zpxF$F)I3L{X}u8woHzz(9#Nro>Da>Rp4epE>IwaQkI2zAknRW08y|%?%6E@EhuCW@ z7NTdhOz@L+v&Ue%>}fx}jNx{62F|!i-}Y=f0AIweLl+G4i>3;QHeZ#ceeLrpIAl)D zqY2^}7O2-HLI(!{GR8Olw-K_x7v^0OAYxvA0^>f1-@p%7QCsC;mb1B6)?8|zm*B14 zL?7l}GG@@|04jCl_M_YDVBGbBhg%(jp4FufKj2DQ#2^l#gtLN?9*hLJA#GL7hf)AA zczWsvzLd@J2hohy4(z-gG{ZW;7JHoOo5OoFQC_L7yapS|o#Wa`?YczEI~v8#H=jPg=MaS5St##j`KkW1Erq$- z;O#PxmETETI}RfACgS$tTaSbwNI^Pbq{ZeE9>g)|OQ+`vs1KxkqG71;N0 zjve=T{I4z;$>={H(H>qekoe~X@E&t?)_v^8er5z|a{M#r@RR85H8c)KL$;+X6s=e# z#Cu-%FSVhQ>&PGB3E2hX;I&V8RwOFEqM5WDbxWT+4k#X;mb*e-^cy|O#|TXZp@XJO zEOdt#z>{j|jkvQZ4*e5j2H|zY|OlJyP@6KI(XMn{uh!egdw6| zy3VCqC_c40TZYSHBnAcG@s%&ElNDpQf%}oaqAQN*3K-_0tx}uVfr~W#6*8a?8o?c# z2B-*oL22n1A}S+wfj_14@@sEw&2p8S%#iTmY?U3;5yF8l=bqWaWay@M_!Tz_b@xq^uZWQ^bJy z)n1ek?F(y=&Xz;@Bty)FuE8A-^!ae(HAfy4q44AP2+DvBOvKO zqcyd9r=pi*m@Nuyshw2cW8EeS0SG5O79p^36(A!(st?|d&l<90)ysH-u$2-)Soul( z0UQx)op4*+?WPk$>YfWwWG1IyGqy4@rMP@_~+I~8n(r2fI3{Oz6;9PNBH-M=DaqZP%l8)mc+riV=UZ_!I`F~s}!db znOmF+4LYED1#uvJIGb!w5+Kj~jKt9owrdKLs$c=+k9FSN2MdSXCQSSb7w{*Em;rcX zDCIZS1U@Q^iirb>qa!ArG`nb4Nh;x>PF*{d&C3Cij9_X0aq%~}UgHckxvgk`%*$4i z$G169jO_WM>lI%-z-?5gI#XjO3JhTE_sZZ&-{ore+J8$3-=^^hb@wTGOLnauTHRcl z?o(VZ-}|N6moY#3kf~s@p*#4oRUZd>8|tewQ>Kw2WPkSed9Q)l3%ZPxq_$~GCvIEf z7A%E>@g4)r$ZDs!_}A4;}=wP7rch>?+%P!_6P?FNglUfjF) z%h+`wHh}$}%TG9!IxmQ9Q91L;Ctnva`p7?Z%>U>5h#4P3*`8Cc5Yq=lTIXb0GL3{; z8f{1j1>Q~)Azz_$Na=}jr>MBrQ&T>X&*X5NB2l1T>dNd8)ZM{4Gl5AOy2k+^)a4>R zCBZ#id08ROjKH;! z`$OHkAm5|DM4fIg2;Bx5W46b}X(*Y&Bh@}HezcTA=bdgs;hlpJ{YxdH z$!JQxKm+I>D-L$B8*}IJ#gD{y#HUvMd@&}Y>L>I4B3Juz&jpPJSxQ41p4iAs`rwF~ zJ%@0e+L2L++?y`~=ZOJqDWXXOb4tzS@(%sKSSX|O?d$8$ZQXqd$EVadvSjq%X8 zRu=z;i$>LIrPd7liOH3|`|bh!r9>xL#oZ%zk{y~1jwb%>`+Mo^f!dNo$n1djfh9_+ zWqjJl%AP|`NOx|UQ4+ct_h88RNM{Z;jhcERa%ZdJdI#DkKZyZFF&ja%(y@f&N^mM& z$TIxMK4E(;g!tUIT#a~^e8+YF&>>o;o79&cqN7;Vu6b*b?+jx4ntyjVY+j)4jgbCv zN46RtdxheXfNcbZa*IeO-PU@+`_8=3Dx*a5EJZ0r=$BRBw^@X07ZWZ&c#-x#z~}HRL$!iI-p+O3P-Nf&ha~weA4&((`!iqEXj`^;V@a_$whI| zlYp_E@hjGO{61N@7^?J{IFp{S~_L_T`D(I0S(xK$DgMo? zW&90@nQ#MrodA2@RrZy@WsTs-OXeR>JOtULpWYMuCeiN_o`=RBh?QIlcw5+s;P~9$ z{7FCf!LdFg`=|Cg-9f->{Df0NppAWasA!6=7hraQ+tc=fO?9&xC*hPidtK%03!Q{^ zzWi!8al6XCkK1aPrJ+sy58do=Pb*JK$^tS*tMD_=Ua$=T`<_|L)dp918TSE`d6)1H z(E*}{qeV;EP`xKjx_2^)Cr+XpCZt}xl*U^nCi!4n4Wk!_`mBK00H_FXj20=+KntDx z!?V!ee8DJW{F|tCqV+`2_!H&V2KAQt$vwS#W^^#wWJ%e0ORNeYdCk5*ZqNXoP!d^WUg{N@Qq^ZInJ)XfaY9tbPK(EQ_zS>o;;9}!Zvb38osX)z&M)#% z=uY2RyXSQ{xhvhwoBPTz0@Zre-mFEmsc5T>4X}+R~g8RN$WmS z5LC7U?PbReePib2Zauksg<^!Zt@(C=nX;f~bot=Jyn~cbQp~ZPoPIax+{vBcTd2@# zvb-BaGqu_Q!kU|Db7Ctee%O;ke#Y1&f?|%QKs`<7s3Z=y$DefSG*ft|$lWXTN?gv= zhoaP)(f95APQR|}bp2z;{b0Oc&6QGoo~gAlJWAyRx4`$UCTpK_s+(wYWN;^obW7ef z$sW#Wc#ROGun+|~RPF5X){MT=+nlb$6cK-C3tVl*BfTOa7f2f24y0HwGgV4xu2DAT z*s}i@lAb6fL4g+1phs5Bw9w`c^OEya>@W7$wYKpnNd6vvtK0X{qt#s1h)0K7<()87 z+l>MI+*zF6?l*#Y;gnboHa$*30K-dwO_0Rrj1og5HHL>&?k&H{KwEnsf1Z-lmY`To z#6efL7Tde0MLsy)TW{ErK{1P7PB#kxgBwGs=UH0`Prl%CP5g_T)Ra&~P3V>MhHufb z3YiTfE?*}frt{IJF$bFF+NMJ^bH zmk0U>xsw}O$7h2tBkH^cO+K|IWJjR*Gb{ZKZU0pRvLZ-SrfhI0{f{=%Z3ai*pV?9d zPH00gAExvO$-@t(S^jj72%xm5h1Bk0Op8t~R|)*aJH*GmZ0@+Leusz9HVAVaKhM^w zuYadykeUK}o}y_W-qf#_JTzhfzf$4KqrrQfvW1bY{ZvJ4frBgpcLUQLSD_RCh0ZeN zYeFol=_W~&lM&QjH8hsqSK+^zS1L^aA*klBSI{^a8ZsWQQ!sP=;Rp7yXPv1*&}?nJ z{^uz7HG{-La$~<2f)equAyJxkaoLC%{~iznfrb)Ee9Iay5BT_8MX?m9ZH@!fHb@7* zP`B2y?@PJojP=+DQbHeP@@1KGg=07JO_6ZH!DcioNR18Z%;s_np2p?+e0o>mpS(8p zJjQ`|a!N9gy0y)HQ6Nk@wXEmNXO!pSQuyk?pa;{X(_K%?;Q1mIMWw~W@CG85h`<4; zlGF!+8b6v-r}3B0h;9dqqL^FJ8;JO5V;gO0%|itSOrn0Q9mZxuYPX)ZJJ?$Wt5%rv z(b{}*V@ygu0vT{;aAOtP++4vr^~^lTF`{fiuT5H3n$vxZCHUNm1kgH?${l-5n22 zOig(u-F?^!2HN9`Mr8V!K6i3QwzS|{40e#91`sjxL% zH)jQ5xGDjsFR{bkcNXq_7B`XRFQ6s;?BYp_n%|?JOZsYHPmh${)uR=c<&4Wav=Lyd zUG(Kh8Y(Pdk6krG2fVY&Mt0@NUn`(w(!6>SYlQ2$OTo%mO2=b_z8?kQ*HVA!d1H%Z zXG-3?h~&tnH~ex5ODxd;4l}DRE!B)y4t8D)^KBvKn7uUi%LR2)?pokCf`$nERZbUp zEnK63;OzUJ$H?r@x(9|WqL z@aok~++M1J*0kFbN3t}3z@)@vOZ}x=%HAo9DVs+R1xdT7uR(?MTkEToF)G5H>Shbp zR?QvjK{BH(FaM=XU&;ly7Y6DFQ-6K=rQFxVqf`RsC?X#|^(pKrF^16C@PgIeCtPv8d&j|K42g9+<}_Q8o*r zjo`D>qsspo`16GvtCKY!fg}3wEu!==JScg6y{i1qv<=C7*`n=|d_5ty3T^$IGGLDE zXp3bE5W96Fp&;-Fi5-w|y6Z&jAuXM5qi%Z)5RpzQY*5b!VvjZe8%(vJzwGYr?fghx zGPNq;*h=Bd-H~QBlXmR9jhI5}H!&h%m<7C5?Hu{EhMp1LHYfcHEr{4Q9J+#w)390NbK@m`*XKSAWZ^Tb^*P@hjRM+W%dlm=ygv`$;J*t3nTM>D?#d zlZ=y`FBw?Rp_sAO7cs4#)V2wt4rv4>gQUzn#d?MM8B^1s4^+5w*?+N2+?wX#^;M(f z=IeM^a~)xJBD3sWDrLruow=*}4uLx#@z8~WNNW}U?5B<&0as8yQoMI8xtDTYu?;I! zqSUOg)^35(tt4&-ahVQ8q~V&&gN7)cQ6r<9VX-rxglq>dNz3CF)DoUJgPAwV(mntl zb7lZCza0sp=@n~6{U|e}=gFPvN-x>p0M9aiI3G1Zg3WzZ%Y^cq{ut(!?p27>S{v>{ zY$Q<`M|tZH!tS?N^%bAQ;NI&<65f-1v~j8_klDD-^+DnHrJ9L2pfT(2uK>r!_F#1W z#<>a77*#y%d6t7P&CT7WaF`e<*Pjt{WF?;q+@Kf;d-dwv7_FL=+!X>J<(GuIUDJ|J zC^swack~Rw6^gal?dTf!?yqYsN zs6IfuRT$>5ggCnpex3}-EogkKuIXPBVT7P^cHe+DIxE^|*4TDP9-!j}3Wpg`bwmS) z#oaAA6*w#o6`Cla#r(V%M)5Ly_0~L~F!A(Y<@Jh6L}4d-@tF`i1A^Xq-XxzFiy+FJ z`_;oK#0pAGZT`}F{iuhW5xzk)WPtVHCvxBCEI(=+V4eT#*`oXj5 z&()!Vc~;MS-=nR{PBNTrN6QIRM=aq1$NrUK&G{JFgCWC~5Zk~sQNMR8GoHg73(eIi zsY&t4i@HV*;|&HYIuu5Z>UTegfe&hX=YLHX`Yap;U?9xy-+i7ebu-Oq*klaeIbVD; zf#@;iCLoH2O(!wC<32Ed9XPU<`Tf>57DIfB$drYjZLjg#DQqV1Ch^S+j()F7P?Nt7 zupY!CG)P0-OOU9E_Kep19r~kp4n);8*eeO}wn60^zcb*k+TSxbIPju--*x$^0PJr4 z>d9&d>1R(@4CezXqR5#bM^MI$@S~0$y&>QYL4PQp;f2AiTXi!zcz0&KcOI+#A8_cuQSenHa6pOdH;H7)w2@ z3y)DHVCGrslcW2_jE_*4BDU$|Q7m?UlE(qr!bw%6cig(5JjM2kWU`EQi`LX9<190) zUPEBt1d&G=-X|u~M!0PBw3MfKywMY7!!$5)rf;UwB|f`Y)}0KkY_a^R-eTOz^6ncmT*9P{CQ z44Z1)> z|D;$0!$M6M>|J z7t9;$MC;tvv~FoP8XFzRzUz#ndN@(+PI66@QTQ8zF;uqL_Wg;s+T;<%L*VR#rAhQ1 z2>uI*Of4%qb4mv_5yHsje}Xb}23LyzGGR)QPKY4NmGiL+*Vn*(@=E;4@ans7O7@Mrg=k!aicJnLu930H2Kn&x8Mu2Nf#jk4DtRgd_4SLWZGxfztznfdGR zy6(oWpJTfWO)au1JJ0;OMoW46MB0A`x!@4*#N3(HGx7o%j_gPcz&Gso3Q%1NMakf( zSI?efDdoLF{8qV7*rMEGL$cg+Zldosc=$ z-fEPyhq>jNSzu&9g0UTQ0zJk04NipT>KcxciQ!X!qXnHBVp{TRANf@WKDYP%iSgQ+ zz@*4HF9mW8~(ggtcwI+K}mJHHx#?aH|*y;`gJTXBa#Auhjm zYAFi=@&zgaQwp;u06opKJf$;uMN}{ z&jNcQ$`nSDb9&Z_WNvPKx2j$8e5zI{Zkd>5*|dN96d!=A{^E{ebMF0EKL&+%2n3!C zffSB308Vo^q0jLqo=ivH34^@4atnF;n$gSZ3$elj*Dxico1p#TlmK#LQRmi?!Qf!s zQG6`_m+z?st~GqK{wa*NE(sR#A#+vd5xbf>3Hzqs_r;-U+>_r$@#L87_E@x`0#M?T zOaC9pia>83G@r)cl6M~^h}aoUzbtfMJat#`9}Lknt~;aCNvXib#~;HOa$PjiqzssS zR^Q^ON~DvWoh#7!)Tb1Bbk3;SuaLoZLPo33gMr68;!o|p`)>QcDz?3v&%$iL_xsFg zAki)|&Dd_7#3EWO&hWXE#*|AX&cj1S!xW?#)auXA37o_p?V#~+VA4hpS4aGsdxx?Dj)MTQfqH^0- zTzX zH+1XM(VO#HZvNvZKK)#%r}*0f32HQQl>sw>lVim_`SVcjGR=-}5a%)05$oRZ; z`8Spyen=Y<$r_p7TJIv-o{j2dY=0LFs9o$WShK3Z?%BT(Ua>4N2*nl&V>_r)3wSz< z_8t?X5)Oka;XS@a!G7*^>U1=A1yr!==1KY9$RT4zj-)%OMVuHKM?Wz_BY_AO$(JZy z=|q~<-6kQn5)|qnnCiUi+i&WUH;z{R9P$5Fxqb1bL9LF=?@c|(4%8@LF~eg5nLoP~ z?RBT-m5evu)!=k0J;WV5b#Bsiwp)G&{gpD|RR+q3e4^gBi_i`9Ph@J3_7>QPYcBn?KnjgEb4B zzt@Poi}_uCwMQWkh=EYMAcSG2ygzmI=Pxfzu)YtoqoR|4_0-Qpj4aKw9G&|D~?5D;|qzS@%VKW2$XTIH$ry7k?wPv7a5dNp%lrGa%%<*~TtOyPM&LeLwFYwbkg>EY8U z4dW(pq9XmJ-}HF(Bjsf#0htpQAF5O@j_2q#Yp{6LJ#Sz6rdt*mejcxJ2$y-p%8>$Y zx_J(Y6NL)$ehZIMylG;)f%@_6`7H$cbc8{j1y~%Ut>hCXYGnICY z<=&t8mDOpa76zk;CYLm$+;)+RChPUVH(5+(vgwzf)mH>cJI>SvXrN3XqYNa54HkhV zkA>7}vmnSO)m+2S`!Kb=cJdhoGWAV{H%7ni8`t-@0XP43eAz zUZO3zDE$M6OVILU&H5Jd@@u!?AG!rs#x>wS6@fR0zX)oAo2 ztx%7lr64A@Pl z_WLURMc(S}F&A(0e6JB+rb;i8JHQ;}s&u6hs;aB=)1=AB`mX6eEG1lqQz zPolbpm`r52*IQm2H>O;*uzzU*$bwiwxGXW;lEflS!~-t^m2})*$vB@M$foa}k~sq` z_Cb|~_|H?nLF8-h#kws_VUuQ12oBZT$*C;GXZ>^CtITi-6+bAea!vET2%kBFi!#-! z;J}ks=yA~hqcL=|?n*v)%{4pY*lKRc`cPn7hn(7$(hS%g=a%xN-4fS(U%x1*oOB-J zaYc7RZ=Ma44qb@@cuTOK{%|eAKL*~(Y1#35@>ULLVy2)ooLyLW@x<6&mRp)w=%zfe z_R-2}s8%_ec=52jp!&Aph~=j)WwqGxA!EC$l_#_&krPMTHFcfHQM-HdWq0@#qn!S0%$qv{1)z$pYK8@av!qW^{KdynCD zfiJ+tDET7a1uu$l%tZ1F!i4IFIA+egJ|$4YG$lIXaLF+L63J5zYlh z1ed=!fnu=9J;LTA-5GQI$uO$yY*o;B8xRiW=QrKw4enZI_w{1okS1ZjW-`u-|D9Bg zs)^uO9YMUE-K7zr>}~;l7xIu<>lw7qi|I#uzCjn z`%dh^!JQYWWA9E)*~r0lqzKNm6^TZT-@!W>Gj7W|hq&4fy!|Tj?p7^A9=fw;Wqk-tv>P?0u>hJMluFX~|2yTmD}0Ie zZ_1$=U~L7OglKZ)7N<`u(por=p-A_S2KF|_Tkz-M ziyD)$c#u_0^0`^9knC#TZ2lvdIrH#t+RD-;kdPSPDR%Cag97s>nc7dFYdkNo75=-` zgTs_OnMizrt)@H)Ta7z^4bi>e!vm^h5cV0DYXHR{SMceUa|EF9IT?oMEq9~ekNc?^2D(Sbtkz>A;Y3#LMURL${ZH=Y@pc=a9I{Zs6IC{`IBP6<-J7Nb zI%}rBq~9y*@=7-exhb3DT^B@5z^Ub&G4%y4-G(m4?=QshR{4mRGVcQ{g&kCMJ_#@< z+yzQZ0Nn%8-kG)?*7RNoNq6*N4Kbnp zD^V@o; z=}?PnyiBtw6JI`emg@sp;Ht%p-j?iz5D3VAx-d#O~_iGIh>cYJ4U$!xSSUnf;ym6 zq6TrYn@YxN7%YSEKAS~L{Rr)s(JhC0L2ox^ZoLy}7d(sasN6;)^&j=X#pmMi?8a>0 zkNx*+0Y8LE6^Z}0%AOvTQT%JU{}m3wEwW_{sgc4j{U=*uA{MO~x{hnUh_gB&65PGH zpsl~hpZ#W+bg24}8vpy3t*OGo;-0DkL$V3C!p&Ky$REG9_p8rLJVdsdquhHO4sM3e zaSR1f?H%4~@t2hX0&pL`7G?||d;14IGl8&z8;udL-&fi)qAhIw{)nioIl3G-`5cPX zDvzK&7}spHz}re_sKq{-Zgi|P;JB00_^*o?nFQU7yt!Wwxqx?SOlg3Nv^czE%#^>a zba>mDJwHVGX{hQ`ncggenzT9Y`%=2<*J_F;W2*Ear8-x-%$A;r*fePh9o975nU2Hh z{s~a?zWXY%Ik3p)Tv_bge$7xaV~4f#;OJ&PR69n zx9eT!Ufd5`rWL*PkqhPE)%%j*6AzE*^#^mes_6X!PTBdEz)j$$oDlbaGk(5FZ;A?U z?doM(Q^?m&jVRxENIc2I&5gIybPag1jV#d{$CODBoicHdtwHXCr8f|hC-U`vhL+Rp zO}p$du_)hL?{_>lkY^zB zIX1^-Q$yABqT?b0lmJ$9;mD3QRg-mlh}IJa*AXCJ2kJj@vH-K-$tjnaoaHQ(w#>XG$iTQ zVS1GY)2puL&zqkh-%4CJ`89T1=bZm-5!3wn0=8!J;)A=rL-TzP&l~~I<1>hcxDAxl z&2x*xb1RK8Z{wbw)Csr5m4f+E^)?%%Mwy{E&V*hGmU|ksqh>pDr+0D-{ zvSu5yuA)CWKh*H^2L5-Rt*Q3sKKK)aD)Mhl1Rb%bKDRGggD*J?*P7{M|4g43@g%%T z=vTY;k)cWfDTc2{v;V$b4TnAbBc07W`|Vlg{kEY) za;Fc0wJtMl@Ep3E5e$o70Db9APjPhEF|R(W?WhFgGXKapzf%BSeMb48;nHJX{ZU2S z>El`%Ie!yKOICa%U*IF;KCV8UK?a+FL z?eGDAUS3f*jpe-`*Sj7a-aFV`=yfMfoD=;>ZwOUslg1N%W8M6!hxkl!o z@>tN_XC}k>!{qgzCSyrGH4co2(tVNd0dNnPgO}g2Lk~(Z_l?<$G6cH3!tma21>M{ z$S<&Y^%vi0Bv0>RG?=DK4URXDJhXE@4}~~6)^7L#!d_qGluc6W;18}9yLu3MF!e`% zhi%c*y*+D#vUR7e6@gTU(F%!TQ#+ullHMP(x^Wr2qlRJwiWUlj(v4e}Q&BQXQwktZ zjvZSWyIt;*Ia)D~p9dU~aRccez+_jsx=&sV{pppYUfWL=aB9Yq>KicE5&vBVsbW!(ICBLH_>pzBwN^ z)DW*gc_L&QSH?a3an3P^Ns?2n;BUSYfCWSzize;=6v>kGJtPM1a%mAgXjlzJ$TVH$ zE^xnA@4jTwjnTTdIm=R`^Sm`0dQdXg-zvO-jk*x7_KE>-^?ESPdLeR*%g#<)>c6+X z*WMb@Jq0s94-7~PkT_lpqUvhSb$@;u%z zh5v93s*M#N4^#MM9L#)M$d-SSVmDEoxhQ;Oh=|R=_*1zB*{_Q_uc2%U0u?zosIJc@ zo{K_q+b$-5`){r5)?agn-)DL)@=Ppw1TXvocg-ix;CdbWM10`(Lm@_%RYWPP>$uf( zw#Vw6vR)P6O7`5CeQ+zG?}Hl%0~yDs zkkuh=QdNch2D)&H-BEe+L`yfM!4NrE827h!RLB7LEjM-z)qIs)YE^Ej5d@+%mg^RZ zFgL#s))1l)V4;0xp*Ktjbx*an zo}Q|KK_W~0D>7zIB%%k<5exs8U%U0tb*$NS{O0e+_x8G@sktpZa^U~FU0nN%-gpVo z!vX+VO+E3zf>303ak0Al;^36mzHK)P9OM2w3KOHZYv>Z`$s7B}neSVM&_V8hjOb03WIe1dKz;F%I2>-@Nfu*K3Oi}jI@{5XMV|n!EL!6zR z?_n{MMV~}2u@j-1a;k639L#ca@lRw4uMF&*p_5%UtP=GJ+DxTeqlW|!{4wz)h!6Aa z2KDA@uzc?7ipZh9y<7!lwE>vShaCeKuzMMyo5|l;$(%=eEbl4)JpCZ|Xn!hF>z+xFsFjwTVI5aN#+bOB}SsDKK zgkNJ26qR?T_izyiedO}8@>~Oz7(^)1RUQW6!@kvY4rXeUC@BeJ-RfI1M?Vaq>CsL9 zoXNZD#H`1QN2^PA-!6mz5=!~&!a4A_R@}?JC2(MI@QU!zQ&hp$88> zeA{!Bzc2cGYu2UL!LPo*d}HGR4N|GfT%S^igX?~e{6?81Bg?g$Z!ok#j|F*i^a_2) zUo{wL3Iv0thku&)$;Mmlv}r$Gh=iklw#D>ywB#bQdZ9nTM?8FNrXGVx19#}@iSsbP z>&Z}5KK8{$Bl>QExa-dzHd^q(J0?k2rjU0`JZm4Yz-rUsNtHf!Ykvc>H~Tkm3;p~Z zJCe&^-g_ppRM@24Rwmv0yQ5uh#2nH>pO<3^)oXw|S3MI#A|^vgBFaAYw+@MPwYYek z6d~aP2R4j@r6czk`SFB`&mDt~S^EWJI#SJllDA;Yal94$H`-97 zcc^g99}!GaJ@R{N*&O+u$<(G~lUwS_65$^qnp=|mfhNvPu*OcC#a3kYH%nt_hp24< zo~5wguVf6Ip@WEQ^PJYh>{)ZW{weA0xQ#ugU!v5w4iQM@8Q@`I$b=~SG zqPFtie#$Kx0ik~`U_kJ(&Z6>v?59|vn2QIiY>FPOimEF8WM4|8de_XMNT3nBy(FYK z%Vk*)TUOZQSConxFG+LiE~~XS zb87eVd(FYS$We2SCOUHvO=`vQY2%B_P;z^)kJ25NoRN-f?f(dYX|pOEANA0GJnD0p zAW0F2hkB=Z>x@A0?v&>W=l-JG<5Q=Zxj_|{BBLf{0l@4o!+W*&VH)7wN;d+vJP3nH zW;$s?D(tuuy~IMpAFbTqSbT#Xl-Y~v+(XjaNyB)LxeFfwg&K&GVH;A=12Afa%L4_b zzv@rKI#{*85f8LLk*9*>m_UI@v-Jtq7H5}IOyCJ0H01HWD(Jt*CcMP)d~)79BbhNbp*Ohs6ypMDLaUTUSB?Sd9_?!108eM2Sci!P-MTPg%Zu3spXQ**H<3kf3U#P2ERjePfzx+>SKa5_VZ6oFTiMuBx7K41uBDJi|P{`f&g<=f+( ztP`Dr@Qx%PLQswOF56YP{N2eu1*!kqNhC)h?EMYxUWmQrfaYFm1k6`eki#80X*wxT z*Lyr8Bzf@{L@n;SrOsf4b+1xV80Vnry%$?|8>&%x!c`z5Y~z?^py3V2fXRYX2dq#1cy8FA+dz!ks><~!@1kvh0W@h%~%PVb@}m#p>f-gdBm*v zu6V0|YM0duI4o;0c;YZ;-Ofq2@1a?0+!=QUg{glkPig|xL^q^X1JWF-@f~q> zbz?75`*c1=)a!a}Cd`)SzqJ8$%CUGQKl%U&SX>)3T?1p-D(V5v|EBAjcp-AxoDotG znkz87^yP13$ZR`U_g`HGM_tGsEw|hXxBsim_GbND`QY2VkI(7CA9REyLpna89r60$ z1LR`TjsFNz9cN=8NVT}h<5mm$F)gUcv&P28RTmAs(s9=QX!{Fai|5O{x3V^n-&ciu zTUSKC0}#z$Ox+C@{+mv>aUyWV)RHcLF19aA6GIv+0D^C&;>HPry1H@MU1`a_)_3Sz zd1KubiRuMTSqAr~C)$^$stm%Gy8cn{{+HBl_L{!t#BqSqrWiICMK?%G5Hy|+r@$L~ zoHyife8{&7qO$)UG2nM#mI(Nr`2Ua-tM_W^RNXkuSEmJ&Ic>d(ny#CIUYj~E5~&U} z%hYF|Nc`W=U%&^Cy2>ehAs{^DhMH7xvxh7PGJO4zpt%&JxQKJww*#bT4TP2uDdc z1eGA5hq(CE>lOd3j|RCPQA0;pk(uU_Y{AKbD5Q_u5*G@M7;kup!j~+y@Xohiq97|# zpPf^EOHgRTqWv{bwnn;nimhO&8-(3{w+D2fVIAiaa1p-TwHooem7qRzo{UX@ZrwQf z=W=Y9sj(JOwVG_Z%Se_(P>h4Ki>+-Jc#O<*Y%T_bu-pb8YFMs6BbC{8XFav0k(%?TJ*31Q zTla02xmN!SNmB2=$uIvSo4DxRbGZYa5l>o<=_{}1W{vr9j)t;owjg+Rf|m1DlY+q& zyirP%0?xZU_}QnfXzEV9Vhs(}G$7#}OJ={(BeLJr)&3{NNZl$q`Tp|gQi_ZJH;o5^ zE}brE8@^8^chXiyz0XcIn)7a4(`SjSm013HzgiZBUSW2)LV%`3p(!=fQFslngaa`_ zn4N_pQuGS#L;uzf=xX01%GGVUI;J~jFH=SAYJ;{HAAUV!?ekW^wKwX^Al+K6Jw=hW z50Phf+fV&+%GK};ZFWk$2ElA+>6;b!9s`6-7MPp>^1ZeG*4Lt=%5=}@T;Dwp<>Y5` ziRnL*hNPOs`}ratn#j}Rcm7GH1>Ah?wjrsGZ9>+`REy_UtSB7#cu`?6dX;IEtCXvL zjc#Wr56`Wvyb;4zcd_7%%P8`nbM+YL+1s(t4G-s5xkhwz=zWD%XCaT1>@M!4B9;Yp zUQSj4OZa+_MU4hW##5LDH1A25GppS8e_L)hDRnJ-kDd7yP z$Wl+SqR=IBQBv2a7I2y6;v9)84q=tVq)%exPROU7hCq~P% zpS!FXgPhhA7csj+3b7N~QI7ZbaVb|rPEkB~gd)PAh;|iFIODX7+k{WxJZt{&h4ACx z`S^@#uROuE-KPn})O2+h5Ji2W?CUGa4ohCXuXvSOrQtaRktbcj zqm&fbyA?d8EpszpxkLJoLb%A@?Rs8&MS-jhBd19uhvhMxdr7*RlteEv6-fPjp4Xr} z5bAk8C7wK!VanC{zV>I&oiKLkceS*r;r)dHB3B?HeGQ@EStQ&NdlV_Kw6wIixGEo^ zyyN~RBg164ddWk(asPq&WXd9!>u8y5R%NBrIQzLNE6UZAr$0Q7IXJZnudcBe`yXz7 zyvX9SDlY-xG^qrEr<5Z;>UYh|Fk?xXxSBXBSonrEr@mUn_*EZXAMVp~IN|#{#$_&H z)Vbta@WTdW=7)iZG*RXuNIw|u_2$aZxR@F+kbFK#9+X#ArPF^oD*g)|>!dM3;Wf`f z3eH=cLEkQquu!IxkyAWz{AWl)jvCMR$GZs)i?L=YP)3XkEYl>{YBbza5e1 zmi4bIAHlvgoUE*ZtL?|E@!CFr&H&KhzPxle>pe9}JSpXoiHWN#h0TeEBh{sKd5W_Jtdlw= zS&av0CzsZ~WsCL`y5?n7Jxo}l2<{@ViRz|Dt_6G^$)j*gzDf`p!x@Y4_B_Q5ym}tT z5rAv^deg9GF*> zwx!73q*m5cJ>EfBijAT*SE4WeeD&*PSMHO+H?#_F!m)0Ih;sxFd zz<30eaNj&TsgoB||M0Fa*0`zss_3zql>d6(@OK;Kuo^hv@Oo+lMDQBOJZG&#;mY&+ zw7GvoSC?nITy{EZ{^-J_IF_@1bZL9Z|0R8craF)0u?4rd zEH?r%9&x!OU*C(Q&yb)?6h4f8`3iR4`1R`5qlIyg**V`5I{p+Xdp={qxy+bL<#cII ziI~WXl&gG?Q+=L1Cr-l5Tt2^8ST8zZc(sF<;l!KY4~1rTA9~QoXL|%y zH^4^xEDB3bl*iUz*XtaF?W}l=iLbb7VqpQ>**AE{oh^xB+&@?%NFwZPN&1>WQi4op z!IVHJ`gkv8Q7S0^Kn#W1*Bd#{x6ss_XwSCeGsiRAOE`DzaZp71>?pJYT_PhB>*UYZ zij)-?48`5PXO0-A_Bs{`8`w(DN%7Et0D#1pnr0pa9G*05`?2w$A3(|>*Y_vRPFC@k z&EcJ$yisO#m^JuoA_e4WRvEQyMhLvj$J`dnHx&u0%p;ltLPAcLrayKOxJ~4lxf!re zf#)-+(pkJpCD;T+KXNon!yb#6c?JFsuBpeu45!ju=aR-v9gkFj_ZHDzIn(Prqx9rX zt*opUNbwHNyu9pBhhwsV(<%mM{hmmr;ywhG?-lYDd3PoL@m!NcaJb5syjbvX#=U=? zagqhMZq`Ko-?s7Mq05nZ~SryA-i+0+`l_!btiEFr2R$UgEe-QgfW`|C>? zHgQ(}_Hm|MHH;Jcbv=>yP3!2;)px_=_xHZ`%hFRhN0-kLy2NSTQuuWBiffgk+_lq0 zo|32fR!Gq$eq^Z$=zhYKm#04t0pA*+%BFgu_f_SH0WzCc@`&4F3sj{||DN>z|)J&i68Ao$M<} zq^48EO3L3XI)fM_-0uQ+bxRvC$jviBA45yK1_*6TGX{)A==piMWfD8NBz|?@-yKuL zQ7D(gdJ`G9WUx-MT@0b%y5ox_oIQEsLA5Na48w(M6kJFMgb&6Q&ODpvx-GFhw)G=% zQ3?kvSW1iL+;^1G6YkpdOgMAe)s#)F9AVLZS501pO%1xq_Pauo^g=V2fI!Eg!mbn! zUPBlD>H|+A&vfj*SRokZDb`8fi-CBG$-Hms6Ln+oOP1{J#;5x~A~=s5L$8vNZ0Vck z94$1;c)INW&#_;a#Ytn?6crYxoBY<(!zn5{uzwEE^$HllX=X@!7MP!1d0kfamFPXi zZD8gs{SDQWtNU+jY8)~|Cz=wU<%vu`6R#+KSzhik=o=j^Rs6i>ojlh2i&5NH@c2H> zH3bD<=zx1=JL0D7}FnzOasT>VK5azczcpJK>!*XPuPAGd0@R8*bRDfnKWWbwDpI3dp{E^eEHdaUcc5 zgKcWOhWq$oP7;13yHz#=hzgnYJ+BWmdfjEM%nauJR`-K2aE50nSKY7WPYl2}E;4YV z*!ree#s5umX(a3{d$z_)2kn&1(V-Ro#?6z5FxkKK%W=pe{wq+L7EcRyeJA;hgI=L? z<|2HAi7&sH#_?ne-4&%O@N(z~vuhi9PW}QK$*AG;0+Qvt`WPOQvEb)#BXYMXa$Da0yw;emBG42h8D7~Td4w{2VnkCN;R__ z=jrw;y&U1la%~G z(sd2qix$V}`W)G`nK_Xs;T`T%Bw)9p$LV?@6#-$r)nR?jEv*f&^B=wwZw$rr#@$j0 zNvlx~z{GE*&f1$$t}d^~3P|8JJl9#{;D7=rSBSWRzp}_?th3Y4KdR+`)b9G+W@1l7 zPs4#qZqWJ#X1oTD1c6`*xa+S8`nuMTeMkn3JB=@s+?{k!;#^$ZS#19 z(Q68f11ADuu9~U+^k{0@Vos+-UGv_Q zk|bx0v~T<5m#>>$9;aN*jQYC&kjS%f!A3-q$Ww^>txqQy_4Si(jl7$39i-X=1D|As z6kUDB)%JXba8!ud#KoWIma$Gse+YXkbpib0S=(npEqj>vADje)j|(u`fb*CCy3cjk zQX1Z~c#xl%Iv5kd^LYD`eB`A|8&L3cX>Joi4)4BvAieb3E9TsyOf}t{5>l~p@;k&W z<{7n7;EbQ-v!hqU+Gw>UaNwX>gt(U&zyu|Q=c?b@d%fAF@hZt|BNFHF7W6G!)NWJ# z>}pM9`W+I-M@)}FC=X{G_Y=v9fGsqB$Pa~(m0AvymC76w@*a`m*4U>73^U$b-c(VFhj4Rk^WL)Pv9pJnuVHuiC!LS zqt_$Afd}Q@E9~V_fy` zV`SIP-F~8A?kksZS3DvA_&^_Hs7Q`4f}AAelp%4aaF}t%OKSLF>%bq|Ni-(>(@iA_BOvj>1rIy#VDddwEOP+*KH*tPdin~`S+}o%1YF4 zXu;B!6oN|&J|1K`;Y!!8Ok93nOdp+`qC~54z{wOX`N7_bYfllYdXwP76b_gbB?ggkrAFTyF=teA=!BXSqB(f` zzxzRFfV+`8^$QKoxOiOt6}Sr7x0YufR8QJ_^wx~z&ra3py$&@NXMf_W&c`hirOqH5 zuRu)fuBiHz1;->rkd>GgPOKiK^A_%>W~mi@X$n7OUtxQ($fdUl&d-V{|{?#9hc>{tqscqN{N&L z(kUe%EgjMwDvA;!9V#K+2q>v^2nYyBiAac&f`Ec_2}md+-O}}q`+>FhdG}d+pZ9#f z_rK+D@8z1$yyqNaT-Ug+F-v_&P=>oCkqPuzdpOK~UiEMh&V=PHp3*niC0V#*q@!x= zqe0~(z{QcMn5*__Zq?U!AS)`NIUSBUAq&aZv0_Q0uOE^Z2&L<=*Q$MQ9#xK?6yW{} zX>^xC;)16ha#XqBe|m+?!LS;9Yu4STH1LRi{9)nzkEuY+`G&P8lYMbTGzxWTt5gsolh9!!Vgf8hH>s#!X*Y zMJevVWwpY>!s{P03Kd`r1Ua(9bB(>~PKgIrCZQ2$U``;+PDP*UIzc$quhSn2Kj=K^ zdH+67H5i&s{Q@g~l7vTjWgW3s!U?RsOCi$xz7SF;7nhcD1`IvgaIR`;)yd62+X!%{ zmibJ9v-R!cW^u``P|cyEwe3!1S8j!+BwWl}G0&f$_aOSBFI%U2ohY(E$(eh4zf6Lc5lE#5?l6G)M z0B}i`d{X-h7mC2IZ7=>KpwoG>D(4OFHyPxJ)DtHdK^>l;L+6|!+az5_N7nP0TuijQ zYsbY$X+*+vMp<*2juQvz=!#~m>| zDMyb=s~D1?lgFi1E+i0DgVe6*0AIQk0z>m=I=Vm9ysB#Fy9~u+>j(j^8z_2CBBPTRm_3QA_N75Tesmw z#3R5hnf2(-@iCINhK<#UxA^l5LYqZ^-gg#=rQAk0Gbc{m>ThvPj(^HawA}w*kr5N@ zdlRJ(clQ;h!oqY!cV5l03tJ?u8%u8b!t-+{Bncpmle*FcpBwf}g%Uk7@TsvS)C!zd z3)4f2g!A61N!UZ-_om2Flq@tZhv>*EU$1{r*nviio9~Gv3E^LN#9%&8JBJB-J0Wlc zxtnv1FCRm0Ed+9tm{BG&W9=zjaBZT3b&o!XvpY*|+c*gr>8XcP(CoQxtY8(2Pzp!zfHFrfE@708QsrIc zt*#FP(`ju>U0MQP+g&>{I62zWznq`AI};*ALV}!C!}_1D34nUw2h-xsVUmzHH})PK zfzSrVqvGcT4x1`MvUSS<$99x$lp!F%pdq@Cq0gn^<;v9}0P#f2W z4sA!(A_rs42ZHic3>>biAO=#&D7(bnqIM|S)BZsL^wY5>M}74<$Q z^=NCYlpg&R2eOc@)tCJDJDd3P48gjV&78te#SAyR3}+@o%ErPH+;SncZIR$m9*^aM z2>;UtZTfMVQ+Z04;qSqlG){tZdj(iHoa-O8;2;DiH$^OZIo7`lZPcqPY>nmyK zip9e6=*$2?k+KH*+qIVCh8Ylvr4J}y z5?~a`5Kkna&b*oM&Avm9oY@r4doc!afNJTg!G!ybWoC>Q#Tul;&U0V1P2#7%v+|DY z)G0?c_=;EP&*5WY6y5kpt)yqW=Eer7!A$Fn%%SB!;@j3d(&LK%x5t-CpCj^e_F9gy!LQ^34yP%X(b3j+7jR0582o5M^83? zKXxg5R@RdvK3vtWlj0b9q5xwVcF6)CuBWHhQ{}dX?sk~EYG3bi;D`lsS7*}U;!S`D zii6+2DWPGuJ#npdAIA~he;V@TIQBO)kFnupCOBB@O@qsxrB&apoc?GFm#B6}TGX;s zB-c@NF^o5#csbJwDIMg0-C)!^{T7)#FKe2+EJO^Mh!d*{@0=r#BG7?X6g|q^_$99H z5>Ctz1y0ZAre#+y4G-7YHgjO+ z9lYXOuRK4PVx$1;@=QKBS?%xE2>ZqQMXK8quOut`5&c2V%cN%Z*} zCj$HtEbUHn3c){fo6ji-QHD=(`fH)tVsszJb@y}tMS9soOuKKc*z13Uic5YpobnG@ z#kZX8?aMQ)bR+uOGGMp8$EM1oTCy}1~TQD`agVUk==`5 zdWYHU?<@6G;ej{M{rma|I-}^t!Q3w_weNATzULMn6y$#TH1OzF8wFW0v4VqZB|jL( z1GY7Q2sa#of6`m)GPf-sZy$CB0!gB>U+0<&O{ItmO8v{ltgLfWIw~gJmg%T9aV$?` z6`G1C&>?;OE1R@w$CsUKAq`qq06%Kx6X=hyHUTV7XncF{92z%n()|l=r1*vNOerBR zpDt&1L{rB{N{TAgC`vNgysat<4_~UjU88;FG$B@%#j7kz9F$?6gKHEVYSx5Uichv5 zt9kg8BK!7}5BlDIOt^B#TGHU!iZX{%+jSF-d#tz^OG0-(Z6ciyBj{?8&tW?BHRRi( zKWlYHr2SEuaTPFckxAc;_J0E$<>;;NWZa!A_sA{D-wE(&VAXQl-WG7{c8hstSkJ9Y z=RgCz+}z_VYPhE@Z!40{VpZk4#^QNT`|lD}vb40SCr=me=!LnNvYK^fMR&YR9L!Q_ zYi)y?X5?k)H*W}Oo6$Amci~#3>boX>N#Divw8e4d;q)y&ULO;zPrp&}Gx^`c?#DR0 zxPLa^b(Y)JW;XqP_ib>wuqk>k>Q7IOfy(>${6O}OT)PSY=Vz?YWvr^wEPF0qXcKgD zkZ;wU+)RIvAmr5B=_TlsDdSA$sc*uOqUTAHBI+ICu;##j2gg--hOs;iF6RDAo{n!o zKjn}anmddiNHdf020_X97Da)7L=7MyD(~8SfG5K^^w{0!Wb1b2N5|}uF02$*l~>T? zWd=V>r^nXLQtD-8hl&OxeN8Mgy1H+3->#|(q%X^x|E$xlnd*h?}4kAk3%;IW7@w%m_GFbhxi=9hrGd49M8^ymfvyT%?u#YZd@s!yRWTRE<%n;w32ZuuB$$+bQQTgGq3kmWY-= zzT!8>J&L~65Phd^xKpxEqiS+;g5hBni%UEgFTNCUe9$3NH0n#VZ1^nBh8i+q5q3N| zJpPqL{CG_qa`!(P3A6!`cPf-jAJ5LEWq#PH)xEWw{X?}oKHf;KQJyX7J>a{AF90o>yglR@4aupPjvnP5R@`G(+>BNRP1Juc$vn%No~I3om=)xt1x-L>EG-a$crxPFF9V z|H-8v2j+_B3Ul3_>@;}ABqnHts%qZZ^iI12$edFHV%Q2wG)59#c@hS!V>IGZSnLoj z+xuS;Mi-2Jb?6!l{tF>w8UdvY6FHV{3uqYNkr=@)LFyQ@XA>TzfkrS#)kX{X_h# ztlE?)lBnr0+~#i9(1=W;U4L@gkBlcU=nC8;g>K<&b$!N~b1NXk${#f;CtCK$IylA& ze&2wJYi?5haGhwmJC^wpG{>;Bd$HBeVt>Q_fius8&;_lBWRK-eS&h~ByjAT!3{OfL zGsjhA7i0-mQSHch`@}-W{P(X4RtyX}VbLrx**Z>xnu;j$Vb9U?K$Jgfamib<%jzrR z>3W?i(R5pbQaG6VqQnzE65ZG|std*`5NsZri*7*rE6(emdbEx)_tj|{1Ec85IbQ6e zf}00^y@&Gf$6|mYkDh47!GdqqXQ|(%Hn!1KxkZYGiDU|zVt@{KnfFp9I(o*j<6ov} zx#GpfrYKL~|89J!><$=Fm95Pfeq>C2i5xWM32~rr<7{=qI|Vc zlDZCf=e|{igb0wzF~-4v`<6ns88(h9SF5#~&JDUZVQQggpotno9DT%9EE z8V@z9ob=c%5dL^hf2S0*T#{v_{G{N0w=keHZjVH2KzE8nDcEwP0GJWznm|j>pT4f_250(oo~0 zMr9Ik%$~p>S#A#rK)EB7RVqk~EYt4JpDg}bW-r~f&O#BKft%C$ zOF5KX%tPg?8}v`ZRPuvh6Jq(ZzdW{+ynh-vbUrRh`Alv18Y@hRN*9`S#T|Bj-hi6R zlTM;`Eycav-B8oY$4(?;A-X81xsw=0x8x_13Hz~sPGr0D;JEg2KHfX3YpXyyuq0?7 z+!WyJg2P;YtRx_#dEi?pf8I`07N|qlVKy)P&cU1V9vd}Ef|Y46($gjJ0!i4Vme?-* z=t##UC3~aV9o+Pl0OhSFr!NGD>uo`BN(}6%0?~4?d{$rR+;IM2)|659#z$@hXE)Bj zU9*Uzy|Vq@4Sv?Op&e8D@k0KdVr;Cch-+n%tObNOEV8d4+ne`TLYQZiW+d4I8r^fuQVNSSIlH^VC zNQa&hHda=Ui{)G2N`vU}|K#?ti>|45!v)HoO=7iz7E{>s3RfNq7lCUU`>0B0uf|ty zvUQOm3UlO8-g6ht{DKQqi-U1LL@A$D4BKNy^1|3V@8!koTN`7#lK|f9?d1>6R51woT{HI;$dVa>Xc$#5qJq zvx9c1a?@<+y$t~@Tq^L}WKapzAc@OUy7ntG^HG0rnO1{*>HL_9G`HBtcXxJPy?Zw> z{yg!$(Wz6Y4;|5G0lA%mHh<#-x2<%`N3`Gf`KkxY0~zP1GI~)vvoZX+0$gJhg8#+^Btm;!WkA(}-$y|{Oy3Pfq!+s3FBX!k}&Cf}=mBl+T%{N3b8GorLp!u~BO79~v#$jeR5g?9fN$axqdKSs(9TcTasqWg zPwltesEKj-D_XO=$Y&CI%d)1rniyB?if99ECIa2Io4A|J-p*sgf8GTNTlpH$ zut@NRbMr`rnw!RJp>`YSfc06l$lAc^kl3V#7orTBnB%x^DIoK#`%;No4H41Eq^gw- zB0@331KPtymg$hU^Yinq;L&G=^|*^SWn1HU^h%>< zvw#6IY_I+Tnn170s1{Hysdacb$~1JG1HbQ#du1?|eH zclh%4TjwNh?=n6N-c7hi*hS8oqOi7_qirHjgJt zLdkiA>~gxJ5&22}RVX$BeO*#>Lx_tdUzqgGPeDTqviE88)O}S*47Zxdr9X=q8D4D*X1T&k{6m zJYGe{Ex884c=a&*$j^x?@fwoh(3&!nqlMKnQT})m0IQ&Tgjs6|;nXnGWGDfzAKSK0 zw;~_iSFJxOKYLW}zlL((g{D{x>Yyuim22&kVjNg|-@=@1LHD?OEf8ALM8s80MBxgr zYKsC>aDC`1nfLLV>Tq$NoW)})sa0<90qGvQSc(7Jx7k|e<|4adiQU~zCHzyHW5VAm z!+4{Hk?p>4(Fmm0+txp?DiD{4*SZXhS>0{c2ze_Nm^(3@)Uw7VEYjeF1FeRhAXf); z(+h9!#d#>Z+wdr-oZd(hv0iShL^BVZhF4z_9+l-B@W1P=d?2Sr&}p^Hzz-%+O{Ye_ zF8T?|4>Lr7AcwVt`>0{RG#GcwZdgy}PN6E~~dB|Alv zv2msFo z&wTyb`oeD)9gBf88$5@V(WioUq?Cl*zr7?SjsA9iHF~fbx*g>VzX#8+4Nk^9k6D+g zZD3Dt2xU*L4h!Lltj_%M4a$L$r9UYd-@HLyCxswthhb7r%=ra)VihQ{B{0RCs zL!)n*Gbn7lEqI~1=jD!j@~eCg^61rTz3YC@mlmz)y@e!J#Lm$DS^7+5W%YhHP&|6| z=FM~SVcYBwTIv@iI=Ef#Kfl(|k#x8`zw?ZEIjjdxLdpdWAK<6AZA=9lHa^mRu<8jo z8xh3L9;5cI?ZczD(akjykAWiWD-P(VMM+woBWwo_BS3eqq3tZ-(9Fyw8?-=Ur=N=d zNCW%^(FjUjF=9k+>+WjP-GKi_cF<${-N354nf+|}1VEq?{@*UewQ65omP{RLl1>5l z#z1E#`#98XWhtGv!n5OR!e>+Q+9L7VnEeBf)*NOFe%>_rHEHga+suxB7OB7yGJ zGufL;Yb!g#)7wqL;k5X85g8rvZIQX}pl7T`gZUi?C0W-v;5kdQoJ4-PY37a>y@FPf zAjn0bVl4QaaOQ}O%Y-eVX`C^51GyT!atIwwFb;3_VT^e1E{uL8+)@JA?TI-K$7v)v zIoax?|4D@x{2k)a-YcO--;UDN(D1O;g9n`xUA)gPV*Na~oH;4gIi`>@BG}t-KTLMNm9Q z-uti))XTkd;dYYf!i}LE$MT5dJ%K`CW|3tzHJziB-#_gM#)Kn&Y zsI-3N^CmRo_Gf+(x+iaIpJ8mce8$nfw5XKCzsu2LZ1IKl()&ljC0HP4+{0reARuUZ zwDsS}hhZl1v1M9`nyIv=ONzfWG7p6(za|6=z!toBl%^^#E$sx&e%N4qT$~OJ#9d`Z z6ytg|G3AJc89z-Z1#-GNJD2(=bhG^i-lL|Y97In<1OX_7OmrIZ=v%92@KedmO2u)h zjnR-1K~!ZI?|+S6h1xmpYn?Q!m{?8f{z%&=@!etFD+>!^uih0sd-z1h+#HvNcbD>l zrA4u7cTO1Dsg7ouI!z2Z#ShazPavN(9nRm0*}IRuH?p$m?7W^+?%ra1<|Q+e7qVvQ z?yUUvJX+0ro}i2YQ5IJTv4q<&0t0cU=QSxbNjR<4Ncqs6V&0R|OvmL24h38idHgf* z<$ee#QK1Y27@K%cQX4m8s5fvUpx@@kZG2tebds|MyWge?-G3i1TA3HF+Rw^r(K&xp z4_XMMY$7791^B66spYF=_fkiMajP^PRfyiqJ)}mdo|e)W^M???B})(caR76j>QU z{*mws6tb5d2zZ0(2OTvLP2{^1>J8a%aa|)4(g0!D&@il-nmS%NNR# zIMj<`GPFowAmh2cCJH5a&q@E`rybwxlVNUrN7vvty(P|HB`x|I6f;0a=J_e$H*K^& zUC#E!oWK0S>YF@*SqVaI?x^tLxuzb}NmId0>8K6CDjCcGnx?P|u_>yP(Nc}v>PGiw zY&G#Oqk7JwBrj#rroMuuveJ(S7qe|P^uKoBX^dbUR2R*-8Y3FrvFjwg$i= zIwu7B{m~Wz{TTj5WrQ5k$d9-|*O~X6SF;IyZa-0D5&YFSl7@(OjtkCfMqm#;IA91u zD4NfLngv^cpc3aiv`_EYbEzp`$LPqZ>+l{cn~S`vcPPI8XHn2xux9*nlKzSa*p~d2 zx8(5o<$ExJe4tZeqL2!;lT72ns!9@!lwZP%TWY@j~Ilx*3P66A-oo8mB-UQ<`GS?I30$jxXg>q(aRnq^iU z6O*LC!His}19+6Mri|c5Ar_aC#j@%)r{?lzD>hL%w=aWEBY*JO#Y9F{O`*Kt!j{3F z#KrmFcH;i?hB{;LWOw)O2>~wC?EStf6unBUqS}@j!cMNM{Dl>|?|K3awY)$VMiR#; zv;oG}#6=ml)k{|FnzjLW))}%Z7A(A@ymRV`&Ke3G_GT`yamfIr!$ieb>~*TqI<7H}<0qQoVgs_ESOkm!cWn z(w+|b8~hRlU7W4)YHV0w2Q|vDdPjJ}rBicoa7p5aVT+Pl&XPv0FP^UBPv}_sd))Tx zRJKCP7B~$QhQ9#sukcF#L;<0twnA(4C3IMd3rNRAXWA1uSiT5Kl83MJZ-fAX7heam z=Q59Pm+tH& z#^}O54oCtZ_${*ZgJg$|jXh}M9aH)v8b7E|3Z54Zg94h}9)Y2W#w92BGX{(|AJ#T?)J zc6M1HA-tO;FE1Yx8#~z;gDDmC?YARvA=cG2qQUMntn>4m*Eg~|t+2Z5lv$L|+4cF#Jrzg+@N9NkGGdAApCse+@|AE zhFFY@AU-}Y(h`u|z!&)WGPDoU)BRpoE{X;;!b=LWMj%5xSNPH$f?U2HKPw+lh+ZL{ z3>!%{uX#~49`nUcFp~biz;vF$2OM~=5tk@wOyV;R$*&EF%M{w}ER-4&k54F&+hP;CAv@U(gu-X6+iuW^^1!GV5D&9W9qjZwH;Q@&r8c>+tqz0^6Yi0 zJ2y*kl*z)qAw-Q{%8*J8g_TqoO3D({w1y@AO(HZv3gT+4+=CAS1r_oahrQ<-!52>QAC7y1#!an*QRTN?;gX+P)dh3S4D?>W2umg8W% z-2QZV+ikb#Is>-7$Xn^9Vrh7Ab@*c& z*>^kaK5>XbzfYc7{sSQG_8w+-#JV4*G1jyqB8lHRQH^ow+EE$R3Ne+7DLNAqEx}ll z`xjL_5%Dkj7olLr3l4IBRlG7*YPXBo+fx}S5iJdU=2sbeC=Tv}3hFwRFDR5@l&ot4 z5RbucXeg~!EhP3o%$}zVIiqcFjp1dnW1^y|R!lPj+vlv+2AqeD;rIznLIk}?8PDFJ zyL>{y*BdP&Anc?%p?lQZd7}oq$HylkiUwWlpj6llt*V^>)GO)pkFCRX)exv(jQ`&M z;aT~DtFQjB(D|qQ{1atIIisLANYihuzb>BYkNM8~s^7dh!_e9~I8U2ss)a z?No?RP5bV;e**?FMzF+lD1pAo&rdRlI3OM>*_6k0vR0w3Ga+Em$ z3*K@bAx6>lwmJ7?@Z0&MAACMx#$whL&d;4O|I1170tCZFCFAe_*tOf=eKoV-z(k=c=YRlt$;r1wVV!{A~%Q8Gih!uAki#G|9dIp6`AX zB*4Nbvbw{|wUPCS`RA@bbfnLo36^1gfd$0T*ZO}eJ@-ee;?+T`@qdgAVDzWPaw1!P zzC3Qsx-h)SVK?ePND#Qo{)t;AE#;bqqq&jYcRIre4%f7kSXG-}_i2eyqf2<7B)xZy zg-1S263?0q7yQ!V8xdG5x%xDU#>1CaAN(1ST`bEyAiFu>dck!9F(TMlnLu~xk!o@i z`l}AbkdtDdrNYd@>EzcVi!{9uWU^xW zsMqI?lu}?6`9I7n$TcOx!st*|%)A5qc@_bcx9kFq7{S(;FN0ULy@{_~y=|-HCc^Pk z9To<^D6LM0 zlGK`{efSncQs=_^c|foRN72AR?aUFkb^)?d@`?RfTJWbY3HE>gZac22s+tLtd1_UN zE9^mOrRQ+B9*KCHO3bp5&lO(u_Fi>npSyhopw&D)#46P`Uo>aly?he~OTNx=RC~kX zO>Ow-n5Xc9S$x)176_E-Yk$1@Nx* z-i=tglDq?=s6e{VwOyYHVl~+Cj|IEwB~3eZ>2m%nmFQ{|=M=_QlH)q607AgKCe@^V z$hF-tI`s(%8Qx6Wwp^||V?IKdQigQTf}?Qzmt;tmGu}S?d}86-3K4jVzPWNRFg#lY zadnrXPuiDp@h-JFpZ&AT`T?=74$v3ZeFRQsEdT>GwUd#(y<;ZKu6@00R@a?#C%zzd zBS{>TiY8hZyn=d+9II{t;4+A_n*WRF0n1u3Ks* z&DxRRdAnPG7{>VQ&B|5xoy$A$@<>KOfdf8PpDnn+%}3@-R zSufy~w%2EXOUI~piXURA89i2P5*i=r#D7`;1(OXF3qG9ymrRCQ1nZHfm74A}#xanS z#)ORy0ixcptKRA<;JH)sVR!K^*F|6^1sNdNc;HP1S@zl67`1ddx8^Rmd+cw%^6@ny zkx)@q{sQ(aVSw=ygI+(bkSXQ$!Ay)ocadj^_TdI_$3zc>6k-A^9d~uF_8Hh<9TX{B zbU&HM77_c5-34{C!Fe2+tP5zqq1VhoLIg2VbMl^mon(uiP(IqpX6!4{f9>Q^VgEnv zq(PnI)#_@3KkYloxtS$F8QR`Lo~X8@m1{}j+v0eEf2w$Ze-1oU7O>&~vO$z+dG%ab zcFr^Jw+osICL+p%PIL1tF=rj7RHdOfS|yfIxQ7Nvqjud6&B2I1$j~f!9ivF8RWJg5 zB%gBXnqnRUcn2u{phAcPull>N(=^n8=a-0-8tcbT+$#2eAM+YHlH3^AnJ;4P9mo=# zdDx@iEV9#-{f>=#Q8@Lvz=~~>a$GhcBP-^aa#WMC7(@TL?^HN=<8r81wwSi&`*!3K{YdSnUOTshw2 zi-UK((hy*o^-4j%^Y0WTL5*dXSa7xo@5nP=DfMdJFRgUuA~@qr$#XVLEGiqD6U|jy&{HfXE~cZLeIR+RfdxS;I{7;-Yx79l#AoXDo-&Q%2$KRywhyr>1>9Sr-a2_C2Ri2|i_5(XDtm8@_BM?XnPJJM` z|Bdm$u;HgZVhRu`h>KeV?oNDq$BRM!c%3^xR$^jetVWg7Er9Xih`W*- zVkb$64JYO*cD>W-_3pxCIv`znvVwG`Kg^`1<64QFk)xG(H0ZxOUAPkR`iNI5t1oWD zM|auY0lm6-PADx6z0yldeip}9ocekAWTV_WJRniG? zA3V#x=KVxPRZ7Mx_hhEa)$wyUuHc`15CVa+0c8BA2NWs}hd0kilx+$!)!Vz3Out?2 zv6Txg%m?6ZE77IGir&zpZzP zK2G1)-%r`s`t|Eecz=^kUwIu26M9AF8m3`T3Y^_GF;iC$N8{p<(9r*)HH){s430-~ z(-*ZV<@ajiDJlEA>aaHh)2?nPbMQ!|@$p|M-mPb)mh^pD1pVCMp`ll0WqtGw|INI9 z_k4P=SMgNyExMfFe%Do0lrr);rQ~(_LrrF^^TXk~75ZXKfA8v&X=`h1QhWdWb9?)B z?|!6_%V`9HBDns6n#t|(OS5C*E|{Pjxff5$-u;U?MP@R{K@UeCYb4ty8iFbz>JxR}apA0dsOTgoN3jY5{(;&=PR~c%BaZa>S2JWDv zjaSi64o086H)Oblf1NxE^e1%$kKeyS112fpU~LUq>u#D;)pG~ zGUQADtCSw0_RpXs%l+jtwJ(ehyyY|!m#0Y)3)2u8oVR8Fml#(Bi z$2s+0zcg!&JAYcQ$WR^R5MhNlmS&-dOCN-QPUjum=rB<+qOo^={1n%TG)2_qK45p+a-|R{j;owOgenv)a~H z2AW`t7{Ql}93efhZD~(Zo0(~hi8GYTW#68^*#ESwj`kfWekm%jVB~_T)+0=vZ=J=- z-n#3j!J+tMhIHBonz3KfUt;Q4Y-Yl-^vIkchKV4Nq9$Za5S}7UNj_Ns6!?@!x{I>M zoBZ`lOH~zLo{<<6W(i#y!%q-IhgxY{_)K>vm<>3O{LeA};(umf{0swvM%`&Xd~oK) zJ;YhCagE)YoY`h#XOC6hva%(%p)@m7&j<^90`hEGE2}^q!wldO-AAr1fyrO1J!rODLp58?K=NDXI33cg@A0Yu;q|}K3$)2ZLLg{@FNiL|` zipro3`np$L|Ej5xc6dk)VD!J2lhb2E;Ifz{IM(R-ZzYMJ@CLO_QX zFQy}QqCfC&*a@)R4lsbCV06?A_S76z6Y*qgq<65a=d!LOH7zymB|*W+6kMq%-P`9^ z6SL-{)?;C?j7)Cs$p*XcI~b@@uD7dAfl$*4MfO!|@Ca0!F|QT-XU>$E<+!FMz=fMq zW)q^vsxmow zu8Zx1Y9Q&=-U>9OinMo)3HMEh@AgW5lV?vqyOU-`u4Uz3GxY@7-qc4Xm{3w(zx0xd zAK6}Qs}Z6(O#OJ5-Y;mGNn{8<&+)t)KrVSp@Wqjt2$g>y6Iw;(tc+i@T^6f}A7QO2 z$&V8iE7$gzGM`<#Pp84m%NyIB=&Gs739$h;CYnFm!7-a^^Qoqi67@ZcDNw|U{pp>D z!G%5}2mM>L`&kER3XILaHFAn#eEem(JwKWkBq9VtAM11x5D5D;FP8Qg#@At5dLoES z@VLB&03=9*#@gsB))5ePLtVxkb<0kbJAGuXhew|&3Oe9%OZ{@&MAq-TIOi?;&YeB0 zWnsa3Yi|iV%9p4Pq)D>xpnrRk{I)Sxl9Z1m(vm+im?vy(I6Gfh432NyxJ+<*3bxDj z5bx6GcK?Mro0l~Qr<|9zM6K_S)gRo;NF5FO@lrOO85|WaOM7K6Og8fqcbIxEUUbgg z$pyU-;k%NZ0I=Y9Dbi&jnFlQ(Fu>ZLk$bUNg+Bk3?RCNRf;;YdixmzhSn<`1q6M2uV!=9Lt%X@ z;;=VY7tPI2oc`xryJz@w@Rl5vAGGDIcK*!#Wx#ih{HQ8K4JL|{xWOKYkMG|x3bHYY z&l^*Q^_nAWPZ^lQ&35w&%ZY&BUa+Fq5wG!#I?-ZaFAU;H~(q zp&@;yv6dElJ9ZGR^2zCW(W61HP3AAt@5sb$~22ZVMQzVe$x+cf7+_xi8#vR z=a=x_dhm{t$#P*kHWHo-47bv|dX?x9Rr3FA_8rJ$<0ix1bdV_us|9zM`98~eaz?)_ zoOf6cZ@RfsXt$)}(R}9TX3P}f!FI~?=XY_oV`9Xe%{^HrAzG&i2S@2TG=1&U#E>#~ zupGxjKJ-V1aRV7~>&^!PD!|F}FD#B&lx`2f$inIGtJ=er`~DDDhVL@gcpkyIA|XR_ zEQE1(YlaHHs?46B{|L_gu6Rsv4CnID1_6iv3C_9VzwxxB3=bOQViZldWGCGI^uC2f z)4S5DD|R$Xx|hWTo@+bkTp(R~uhwFrtFdvGgTf_@;a5+06X83NWo(=+Oe?Gj3-|>k z5NgYRQ;Av6j2d+4B08?x*)h#ixL|`Ui0->0F7x^)n;{-PIB1@32{m0ff(K4Cw_V<{yeMy1dhDV;P1bhr* z{WXb6iDCEcyn;bv6;z_CrY0!osiQ+?W)b^Vl_gD@r7@?twKwO?J3n7K1>yucq$dh; zv*EXg4$VeZjsx6xJ3C@i6zI4TChbtcVdmxI-b$oq7$<>dwdSb9n$Nc9~I4*1UqYZP@cG3l+UK4IW4*pqI5cF~4Lv-Lgi z&?No-;?@C|GZvJ1EX3q1Hxsi23RiU~g%_131aY?R$oXx{z-4#@<6t>G)HO**-tTt^ zoTbUI-8lT&RwAi7^Mrkr#h5P&4vsRvc$NqTGWb!D=MO~>jBvozk~VDGk(S2u`YeFP z*bNNoE1btU$@c`rh@$CXWc~kv|G~nzj}iAto#`3Ig^AtM>|>ytS682VmAg$aJ7aa} ztp?0+RdL`xN8Xmx(!v8~4p(?L+svZl-COTFPb`9ZpEJ?}Z3Tmsbgwo?tVy@2{!y6Q zRcLSw)p)5%Mknmd8h;B2&q{ITdQ~MfvxXZwaYqFx-1<0IHked!o0?qrXaXPinb6K- z>C8VSF#SjUi9d)tRG($<)vWwjJ|WMz-`fSF0Pa=C@87aBrNhh8a@Ut^dk*A~ga>a~ zSsBzFI(n5>0K_9PG498k+wKpas+`$Prp=IX-tge7oZ97rxsdl96l_xrY>`oiKOf+5 zv7@(}h3l!J70gA$(qFyvMv~sm@3u+@`lM6{FxMZS6yI(H4{?DR^M5=iCzB~R!wEOL z7e_ieBT{^f-+FZ>oUEnuwC}PPxVv+h+1tx_(jq9PkOaDXqc9qYqk3!T(5ypr=T?JH zSbNS{YGu_HGA&upbm|3Uozo|9va!(XjAe_rfmw)^LDzHZfE3KT9l>IQ2B_3jSbl#s zZkf=eAnE_bp{Q4X|9EL(P%*iDFN!jGl+V0=6N6;1`V}W<9C$VZKP{0*2G?LA^biqh zbYFC{gs1ZM;Xyzz`3(Q5O1Ix6Nl)YE4(fQrjG^CrMOdIK3>`9(&h`I<(9ebHDHZ9* z7T}tv=sD^x-*swiJ^ubgN+^BYtTzW-9jaV2GQZ6SrRgc7ogaomBk?(b% z#zQ6ri>sP0jl!&~-$q)8(&SY9)?vvh*Hje0Zqv22CO3M=|DZPLcz|V24-t_x$k(NI z{?PKfl24w`Acf_<_NzMzjW-twDJO7%`Qmk!=MTq0YeBTNClc@wwUfX+NCaTMVMEN3 zMBwyD*HIO70t=-mO@$$K`LdGBs2l74oY7%Mq~|Xtr?ocWWU>m#kRsDzl?p@ja9@#I|}sVW>AT3 zCZaQxKlA;beeOp>!)qRBy^j9m^EMb`b~ANWZZ0R~n$L>`u~gH|kg52rF`l2SnxgR> zIS1s!*^^qbvY%sTP7@FiAGXqYrrj^)`TBv+)i(g{j3UsTi&PBMPdeLf(WdwN32i)# z!}^fzzzda2rP!;$Y1j#}57=+n<9j{B{iK`*@8NwYCPZDE9@ad3XBeS1_n_-5BS}xW*xWq!aW5+iBMCM%KiQq3Fg=1p-W5*KhEm` zF0b^zw(|mMl4O8z@x!=3ewg%L2LS2cz3%>KRbtKV$Px$^B@1uAUwu)M zUHRd|^xIbMyZBG;=ogy=b_La9SIypC-zWR$z`-}jz`-qYw&i7HzM}ARGb)%GyTRH0 zAH@v7T_D3|h*7CNiIxvuMCREXnC#I|*jiY8T9Oj0ez2!#xl^h-NPfFD;jyOUMgE#G z?i$gK$=7Gx5BqVNOaq~J?P_dM*o&RDw8Q6yu0KvreBFYV ztvXys@+Fy~&QIV1T-xFtWqe(I8lE50&&5QBF}fXlkl~QEYGW6bT-K^{+^(mSkXSE$ zIE-g)HS!6|PR!$i3XGq;s=eaI!L^N*l^v0(#rDP0W=aZXOHMbAk)tHNov*v!TN+Y5 zteogjh_`2V`?H@&u4}^9rGhgs3_z(;^3_jFpdbyUUrK>RU`x9TYxX4EsJ!nD(SnE~ znXV~-?l{C7V_{^S+-v2jRV%7m#Y=&ws-3>uH+R9y+4ArnM(Zn!x;1_ap?lwzz$-*b zPIfB#SN*j|u|sw&}vMzWAyhD}j*Tu4Yr*lwK%d#cdVMu2%QGl9V=q+>l6Z)?1?QcT|-C5 zoTLQb*=CK7USLwV{u>L#;G9==98l3)q=WI>1qOz@ijK!eS5m z7~mXVyAxQ_^b}YqmT{hnan!^`y8{BJ64hU}V>Kx?>xK8VWn?f4^~*vGbof;a|D0ba z+{ohbdXkryr)G5UTez0J@!j-XR^RM(zb!H(VY~Sz8aVKwSCrK{!2)s7t&dT~7$vYIxqxCs|E^A4u;oElCykgk;q0cVU z46z^nmMTwmZ^G$X>S`E!Z%erK@{M}ugcs$~#Wxa<y8MC4D5<5TMWNTZA&9_fe|>mNyo(otgNh>Ca0>a z7JPU48*qY|>TI~rlqysTHvQO{5M=bm-C13Az--)}O4Ib@yYXV)cvvDu2FCV&gVAE}KGg!P$2>3MqG*~AIJJQ|3?pHj|EW`_=CS1;-9h=> zv8XxB+A*8h+@6TcXtlUV?X6x;_jCKus9eM~r2{M-N=Caw17UZ34tK|>^rTirv2&VL zHOG9Yh`qmeL>{i-T)^=5AgST8H1nZPc=;z)upj%+>m^GFEXbP&nd=|d{;ID{QGO)L zW83X6mhkp&<|yXD`hZc+@cr5p^Nv(?xDJ|On}K>>1vR+a5)}J}e|~RbOp1-{eO$tr zo80%^mKdLEOSTBBHvK}P4+Yr@|G|VLMh!)45y{7;?Vv#NO}AFQ`U?Arpe2m4?rug^ zeU-_NC#$x8c4o+jhH)0M31Y-uGd?ie^VNrDO){R#a2naSJUL9?X|yV>thdtEuATQzP2T{*Zgr8Iu|Au$H%8I zN;xY{ws-wXYaADUs(!V*AlGfSqF3UV?)UkSK{Jeydu)5ZcI82k^pqAIaHtc#qMaJ- z^QvqEY6fc2{LNyd-vin9T7~z#Ydz^YTX_sBFP-aZWh(K8BmQuiA5Z-*pUDw!Ht3w6~7RD*C!crKF@06a)mM z1(Z};QfZ`=R1g6vm2Q+q5K)lsMgc)eT0vBhlJ1fQX?WtZh z8AH$6XYaMwnrqIvs2k8FVvaEFgMYf#KNNV8KC`zEdvuKjsa91bc7KyOB)iU>uLO8* zo+25AZRokx)3j)`bw1+fIW+|O4qu~svJ675z79n?MDN-Hw`cMRpltL~#3fO#8q?_a z0CYth9j$VU<|VsFiw0h~q^grgQ6?(N$$@9G`%4q!rSFujBzx3|$~Wl{+#2Z@qT_`+ z5$+Dw&mRRT#|76~Dt^6kXC8b39!0jiX-72x#TGtMHwX9I?q&utyZ0m)eloMyp+RKa z%)J;kbXFxLhD5vL^=Qd1&z*d}KeW4BARWGFbZ|RP@@Or5zO>IM9inVVo7jf(lw;xE zg-GQyb=ZdWD+3<`d8(H9e7nz^Cw%5n+RHzelNw9`^>ZTPA&)qYoR?Jk{aT6VD&`vR zvk`|bmA{~50>;W!mmdM(jrsl}eWs~y{f5Bqk(2(=X&?YH1VFKBbEUZbCZe1_#y(4x z^u4V(u}${DT*_VXwML4j=m)!R#`Z^d<}%)>ip)74OcEoIUFVb2)%KzLUwj>AU$W)Y zmPbhA2XBUP%>GJ9h$vUEx0T(GfKJP@LXYT|!BVTh!e84XD_+s6;#*qNY?m()w*9~5 z(!zmr-|p^$MN#m;SbM8)dwot~6|ps;+C+VBM6A#_IXJG4Li4p~&x^3qXEu7wdojQK zjP=3OIhaCS974K01${IIL^L`9i6_RV>O1AOiDc}OlHRDNo7>Fp)QE4Y%SuekHJ~Ph zYCn-=1Ea?8Pc3o+K}#Y{L{tc(R_}fmYuq#QMpyova}qlE0Zu`bPTm8Uoe7Vutb)h9 zf+QcdCEU6*M=L+IKms)kE)2&Y-V$A|vY0M72F5NwOS)g}T~~URK=MS|djFeH_3@lZ z*S>k=zm_QKOk*D>WJ5Dlc9ug@vS``=|HH~0ypIR*b|-YoZyhW(gnJ)MHL~E!FhNSJ=!anyLz#_aQ&MzS=w7;w!;)i7&l{alvfM}DdzTNQ$ zCNQVgkKGH2l&eft1qC#$lg3%#X{rM4mauH_+Kcr`R+FPp&3gWPioNkqcvzq$f@6de zW2`6>1u)&;J6=k}_t5$J={R|5U;d^vIp+OfYfL6QFsfs+_#CpRZF{V1lV4W0P+FSb z|ERFft!FT=yGGs8s`F9LZ5W1Pd?W8W@v~PS9)h(|^zqMeKfi=aEBi?{GYMmhY%{Iy zZLzL1`xn~y#++xwv^EKr#j4dPUA_i=w0t;t$BLl5h%%knnf9GbX9)Q##DcOD`#L2R zSjeQDEj)dQ6~gvCYc;e0_xGpIS)3Y|{}wnFD)qXUN#=PaC6OqBw=h%Z*{hXmiciJG zuTen@nrh-vNL{?<+WuaoRHa=6*PR4I@*Lyka>UHb@Iem`wQ&EV*>AaX89)nj4ylOS z0^NEnbya$?O#McTsHlE!-hvYAq@)?sk@zDUD^itPsx%E*8Ir-pfvu^HjS)`5B-6B{ zufBQI;$e=SQpaOh&XK%Hvf>piQYpgD^$>5w;6uSL!Q>D35Qi>op zI9ohnbOwyvi*$1zZj$6g63v=it)zc7dwMoaO6Bi$l|q7{hL3^^TJPgSBD04Ne?cj@ z*NW*)yt22o=8wwP7g` z8Wzyrd_W^7|FxxOZ3qK%J*NHLb01-ng!cDk?|*ae6_=?~I^Ec|j*GuO;PII_@?Q7E zAF0wD>8qHx5zfflbAb)8q~|KqdQ!cmIve{hyzSib5fkn=5DfWebjpqIqF9d`k1-n2 zs8IW@u`!6@`tpI)^tIAfsjI7Iq^rJUU!GRMTMWtREI)nXoA2b65Tc5_MRw4;yHNSY zxfY3XR^f<+*S&kEsVvtncW{JNsA;PC$wJ4#fGU$DR`JvI4R%4t+dJuLOST`!TB5&s zv_S{-VDv*>QOKXM(vUb&efH~|5w;u^LAM2VZwG4xR=F~<-w;N>!{XcPR#PCFf16#9 z3GdMNGxo*MoSReS12nctv(v{~_)I4YsM>AMn@2?Fzze4}Yk70=~XUd`bZ?LO;=;V<`m6kA4FdECEzVPa?bjRbB-1I`dEtKC>sfQ zfXIWE+H;`XHhri0V~(MNL%;XyBM0$|?L@sj&tLyd)?roiC%!s`&L2#y3YAHA|IsR~#gV!jR3alBp6@VQqmEG$#Yu;$tJl4tOvMW>MP^t9LP zEM^yo%+n`67OPU2jLO7BJqi(<*+{uK-kO<}SNiM^x5qP@L0S$GvADOC2GX%bKV}FV zA6vok#(k%t9YTse-VuHkl)(E`8bAAv3XV5RW9s9Rt{+ol7L#pZDO)$Tjr26(+ImgAnF)dN_B?6~j9tF)=Z}yF*>s%#4Ab?3m<{ zm7NLU7j{O8z<>;uw1Wt0P3cKI=MVxep@%M$$MR+9lEy*T)nbpnMgN8NL_?rj6K_N%9xo`b6XD>st+MOgMwo zmRG~|tKQlZSy=&!HRk@v&Dq;VqnMvKz4T?J=r>%Skglf6*eqCN8rvMx_LTH!xZF8+ z_+aU)0F#%+98TqjOxU@E_fr(3@oxhDxbl?Apa6ExG&cKf@jYD1TYe4q&l!?@xA$#G zO%eH5cOdq%RF(_0m#{sISy7GW0XS}ZtdmbQeDB>`GUv$%Wb@J;<#hv1SCKU#ticAO zU4N*j2MA(llG53;$Nq6~dDwn2F^mF774JAi_ZQow*IaBMQp5wz)2&$Y{jj|E$T5#& z(J||#>8>4x*6g4Us~v<6_myBLP=Aq%;-Nrx!sxVYg@HJBbql_FhTA3y`)jK49PM~DJ~^|nEWJVwCSsivl;ZGS&CYcTS#Bh;BD{7O`|OSvUx z3vo={z#w5)nvUlN5;FonbLr3ltpWcD`vqYfF+ei{>rjHmckYN*5sOK&xa)M*9@+)9 zfAW*Ozrf4R?U;t5J?2+K*8Uc({o2ypLdNmX5oT1GRtToom4$eLtJj4~z8DNQ!#4T) zxFn}?_6Zj&YXIu1)=o5X8Y|6z861$V&Y)b)tTstpSl)atZ9s3B=Un(!|0XU;LUgl= zGlw@i+~4Vfe*MK_z{h7hZOTWoELpb*L4sVDaF^_=?T1#)_j!3~_HEY{C z@c&d11sm+egoVZyl)19-jM+h3pnXgG*e;>}q5_xTHr#2bXY8)t=Rrncf8i!!rz9yJ z%Syf}IslDYaqD6K?d#6K8HqQaQ^fb8M#kj|m^PjH?6o%ewFK&K-SzQrionx}abz04 z7vJtKCx@ew;PT+X3<7I^4LLhQ=vaY`oFlr^g?AjGHH^fJVaio-$jJs?M9|v;kd4i> z#`ldpIuxW6)~g50ZP7V%s}e

Zvq!Z)R7h*ZlXdp}Pa&!zl(l|C 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�dOG~{xMILhzK8tFlA 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%0DOWRBDul#=gC*m8a>#LqxwSgY{F1tXqS=<4wyq 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 UYx=w`L-0R!Rh^Z|E6n%(5A0f9fB*mh literal 0 HcmV?d00001 diff --git a/assets/images/2023-10-04-relay-versions-5168d3ed0ad365a18e86263fcccffd23.png b/assets/images/2023-10-04-relay-versions-5168d3ed0ad365a18e86263fcccffd23.png new file mode 100644 index 0000000000000000000000000000000000000000..afcec848767b7b1d4e6a08edc57ad693e2f5a33e GIT binary patch literal 377636 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%0DU>*FZ&R)R(O%KCWBi^U>u*0M;j? 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�fodQCaRD#XK|-wd()U-2E9 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 z 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

(j+yZaAekd%0rP;h+A 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¼=NXsWJGbtVa8!?LYS(p*Y*4j$ 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 literal 0 HcmV?d00001 diff --git a/assets/images/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks-74f9d76c2602f09652f584cc4d6a0962.png b/assets/images/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks-74f9d76c2602f09652f584cc4d6a0962.png new file mode 100644 index 0000000000000000000000000000000000000000..75c58abe23aac7e25b8f90b1b90fe98cf29f0857 GIT binary patch literal 58311 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 z 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 Q(2tKFH9t~t`1kAo1G&!N{{R30 literal 0 HcmV?d00001 diff --git a/assets/images/doc-adoption-cd944582f02809777c58be53e13453c5.png b/assets/images/doc-adoption-cd944582f02809777c58be53e13453c5.png new file mode 100644 index 0000000000000000000000000000000000000000..fe32333d9fbda7fe6272267e6df29a4f4b170f61 GIT binary patch literal 158649 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/images/docsVersionDropdown-35e13cbe46c9923327f30a76a90bff3b.png b/assets/images/docsVersionDropdown-35e13cbe46c9923327f30a76a90bff3b.png new file mode 100644 index 0000000000000000000000000000000000000000..97e4164618b5f8beda34cfa699720aba0ad2e342 GIT binary patch literal 25427 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 literal 0 HcmV?d00001 diff --git a/assets/images/happy-path-csj-prototype-bench-1-2c33ba45f44a086415e703fe8f0f7ad1.svg b/assets/images/happy-path-csj-prototype-bench-1-2c33ba45f44a086415e703fe8f0f7ad1.svg new file mode 100644 index 00000000000..71262d6b9fa --- /dev/null +++ b/assets/images/happy-path-csj-prototype-bench-1-2c33ba45f44a086415e703fe8f0f7ad1.svg @@ -0,0 +1,1812 @@ + + + + + + + + 2022-10-05T14:01:43.231609 + image/svg+xml + + + Matplotlib v3.5.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/happy-path-csj-prototype-bench-2-e23d2986ddef0a187df9ce336b2db116.svg b/assets/images/happy-path-csj-prototype-bench-2-e23d2986ddef0a187df9ce336b2db116.svg new file mode 100644 index 00000000000..bdfae76e616 --- /dev/null +++ b/assets/images/happy-path-csj-prototype-bench-2-e23d2986ddef0a187df9ce336b2db116.svg @@ -0,0 +1,1888 @@ + + + + + + + + 2022-10-19T12:30:35.894508 + image/svg+xml + + + Matplotlib v3.5.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/happy-path-csj-prototype-prelim-5bbe2e2a20a2740e6238a7c73e618168.svg b/assets/images/happy-path-csj-prototype-prelim-5bbe2e2a20a2740e6238a7c73e618168.svg new file mode 100644 index 00000000000..a35a5935f8e --- /dev/null +++ b/assets/images/happy-path-csj-prototype-prelim-5bbe2e2a20a2740e6238a7c73e618168.svg @@ -0,0 +1,1424 @@ + + + + + + + + 2022-09-21T14:18:47.635974 + image/svg+xml + + + Matplotlib v3.5.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/localeDropdown-f0d995e751e7656a1b0dbbc1134e49c2.png b/assets/images/localeDropdown-f0d995e751e7656a1b0dbbc1134e49c2.png new file mode 100644 index 0000000000000000000000000000000000000000..e257edc1f932985396bf59584c7ccfaddf955779 GIT binary patch literal 27841 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 JrC|B>e*nH7H{}2T literal 0 HcmV?d00001 diff --git a/assets/js/0048047b.7e1f75e8.js b/assets/js/0048047b.7e1f75e8.js new file mode 100644 index 00000000000..a2bd5a52050 --- /dev/null +++ b/assets/js/0048047b.7e1f75e8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[38518],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",h={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=u(a),m=r,s=d["".concat(p,".").concat(m)]||d[m]||h[m]||o;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[d]="string"==typeof t?t:r,l[1]=i;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-12-28-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-12-28-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-28-node-cli-api.md",source:"@site/blog/2022-12-28-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-12-28T00:00:00.000Z",formattedDate:"December 28, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.325,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-12-28-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-05-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-16-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function h(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-12-28---2023-01-10"},"2022-12-28 - 2023-01-10"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4762"},"Fix hedgehog-extras sha hash")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4759"},"Update hegehog-extras bounds")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4751"},"GitHub token fix")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4743"},"Use setup-haskell action")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4738"},"Use Github Action to install libsecp256k1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4714"},"Update index state and hedgehog-extras.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4710"},"Cleaned cabal files")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4737"},"Add cache versioning")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4742"},"Delete obsolete scripts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4746"},"Use SECURITY.md published in Cardano Engineering Handbook"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4749"},"Filter out duplicate collateral inputs in tx build cmds")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4754"},"Optimise query stake-snapshot command"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Copyright updates"))),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/007e4c05.e45fd96d.js b/assets/js/007e4c05.e45fd96d.js new file mode 100644 index 00000000000..70cae938c46 --- /dev/null +++ b/assets/js/007e4c05.e45fd96d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73800],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=u(a),h=r,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||i;return a?n.createElement(s,l(l({ref:t},c),{},{components:a})):n.createElement(s,l({ref:t},c))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,l[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-07-18-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-07-18-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-18-node-cli-api.md",source:"@site/blog/2023-07-18-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-07-18T00:00:00.000Z",formattedDate:"July 18, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.065,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-07-18-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-20-goedel"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-14-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-07-05---2023-07-18"},"2023-07-05 - 2023-07-18"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Integrate Conway certificates in cardano-api"),(0,r.kt)("li",{parentName:"ul"},"Prepare cardano-cli and cardano-api for cardano-node 8.1.2"),(0,r.kt)("li",{parentName:"ul"},"Tagged cardano-cli 8.3.0.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Query for the hash of the constitution (Conway)"),(0,r.kt)("li",{parentName:"ul"},"Ability to create votes and governance actions"))),(0,r.kt)("li",{parentName:"ul"},"Tagged cardano-cli 8.3.1.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Make it build with ghc-9.6"))),(0,r.kt)("li",{parentName:"ul"},"Upgrade to optparse-applicative-fork-0.18.1.0 for parsing command line options")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/74"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"optparse-applicative-fork-0.18.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/72"},"Integrate cardano-api changes for fixed Show and Eq instances for Proposal type")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/68"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.3.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/67"},"Add alonzo era to ",(0,r.kt)("inlineCode",{parentName:"a"},"Parser AnyShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/66"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"sbe")," variable name for the type is ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/65"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.3.0.0")))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/123"},"Fix ghc version CPP")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/122"},"Add a HasTypeProxy constraint to getVerificationKey")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/119"},"Incorporate remaining ledger certificates")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/117"},"Release cardano-api 8.8.1.0, cardano-api-gen 8.1.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/115"},"Fix Eq, Show for Proposal type")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/112"},"Wire up remaining governance actions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/108"},"Export ",(0,r.kt)("inlineCode",{parentName:"a"},"withShelleyBasedEraConstraintsForLedger"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/106"},"Remove unnecessary constraint")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/104"},"Make it build with ghc-9.6")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/103"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraints")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/102"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.8.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/101"},"Add CastVerificationKeyRole StakePoolKey StakeKey instance")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/99"},"Update ledger and consensus")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/98"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"era")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"sbe")," when type is ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5391"},"Fix Shutdown test for new exit codes"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5387"},"Fix markdown links"))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/69"},"Apply ",(0,r.kt)("inlineCode",{parentName:"a"},"stylish-haskell")," to project"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/00bb8269.def94b86.js b/assets/js/00bb8269.def94b86.js new file mode 100644 index 00000000000..78c3e7b479e --- /dev/null +++ b/assets/js/00bb8269.def94b86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51257],{69088:a=>{a.exports=JSON.parse('{"label":"mithril","permalink":"/cardano-updates/tags/mithril","allTagsPath":"/cardano-updates/tags","count":34}')}}]); \ No newline at end of file diff --git a/assets/js/015be621.e0570f17.js b/assets/js/015be621.e0570f17.js new file mode 100644 index 00000000000..647632309f5 --- /dev/null +++ b/assets/js/015be621.e0570f17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80613],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(n),h=r,d=c["".concat(l,".").concat(h)]||c[h]||m[h]||o;return n?a.createElement(d,i(i({ref:t},u),{},{components:n})):a.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i="Executive summary",s={permalink:"/cardano-updates/2022-09-20-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-20-consensus.md",source:"@site/blog/2022-09-20-consensus.md",title:"Consensus Team Update",description:"- We proposed a fix for the performance degradation observed when running",date:"2022-09-20T00:00:00.000Z",formattedDate:"September 20, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:3.895,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-09-27-network"},nextItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-09-19-db-sync"}},l={authorsImageUrls:[void 0]},p=[{value:"UTxO HD",id:"utxo-hd",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Technical debt",id:"technical-debt",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...o}=e;return(0,r.kt)(c,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We proposed a fix for the performance degradation observed when running\ndistributed multi-node benchmarks in the UTxO HD feature branch. While this\nfixed the problems observed when running local benchmarks, it broke the\n",(0,r.kt)("inlineCode",{parentName:"li"},"ThreadNet")," tests due to concurrency issues. Therefore, we think it is wise to\nstart redesigning the UTxO HD mempool integration."),(0,r.kt)("li",{parentName:"ul"},"We did several rounds of code review on the alternative implementation of\ndiff-sequences required by the UTxO HD feature based on the idea of\nanti-diffs. This alternative implementation is close to being merged, and the\nnext step is to integrate this to the UTxO HD branch, so that we can run\nad-hoc replaying and syncing from scratch benchmarks and compare these with\nthe baseline. The micro-benchmarks we elaborated for the alternative\nimplementation show speedups of up to 4x, so we are optimistic about the\nperformance of replaying and syncing from scratch benchmarks, however it is\nimportant to notice that ",(0,r.kt)("em",{parentName:"li"},"due to the nature of UTxO HD")," we will still be\nslower than the baseline."),(0,r.kt)("li",{parentName:"ul"},"The final draft of the Genesis implementation specification is ready for\nreview."),(0,r.kt)("li",{parentName:"ul"},"We implemented a prototype for the happy path of Genesis' ChainSync Jumping\n(CSJ). The prototype is slower than the baseline, however it is not the latest\nversion of the prototype and the jump interval is very small."),(0,r.kt)("li",{parentName:"ul"},"Work on integrating Conway has ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3971#issuecomment-1252524031"},"stopped")," since\npriorities have changed."),(0,r.kt)("li",{parentName:"ul"},"We started work on benchmarking epoch-boundaries and epoch overhead\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4014"},"pr-4014"),". To this end, we made use of a modified version of our\n",(0,r.kt)("inlineCode",{parentName:"li"},"db-analyser")," tool. We ran the new benchmarking setup using the Cardano\nmainnet chain, and we can see that block tick and application take\nsubstantially longer at epoch boundaries, although there are a couple of slots\nduring an epoch in which these computations take more than normal. We notified\nthe ledger team about these findings. We will use this modified version of\n",(0,r.kt)("inlineCode",{parentName:"li"},"db-analyser")," to investigate the epoch overhead.")),(0,r.kt)("h1",{id:"workstreams"},"Workstreams"),(0,r.kt)("h2",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Spent quite some time investigating the root cause of the degradation in\nperformance observed in the benchmarks. We run the ",(0,r.kt)("inlineCode",{parentName:"p"},"make forge-stress"),"\nbenchmarks locally in order to debug this behavior."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Transaction batching doesn't make a notable difference in the outcome\n(considering we are using the in-memory backend).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The mempool batching implementation required asynchronous transaction\nvalidation which is a violation of the ",(0,r.kt)("inlineCode",{parentName:"p"},"LocalTxSubmission")," protocol\ncontract and therefore if we continued on that route, the impact would\nhave been quite big.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The STM logic we implemented by using a ",(0,r.kt)("inlineCode",{parentName:"p"},"TMVar")," for the mempool internal\nstate was buggy and under certain circumstances it seemed to lock.\nReverting the mempool internal state to be stored in a ",(0,r.kt)("inlineCode",{parentName:"p"},"TVar")," seems to\nsolve this problem.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The results we get after this change look almost identical to the ones\nfrom the baseline.")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3997"},"The anti-diff prototype (PR\n#3997)")," has\nbeen reviewed and is close to being merged."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"A follow-up issue (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4010"},"issue\n#4010"),")\nto integrate the anti-diff prototype in the various ",(0,r.kt)("inlineCode",{parentName:"li"},"consensus"),' packages\nwas created. A first version of the integration exists, and all tests\npass. A next step is to get some indication of the "real" performance gain\nby profiling ',(0,r.kt)("inlineCode",{parentName:"li"},"db-analyser")," (or ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node"),").")))),(0,r.kt)("h2",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Final draft of the Genesis implementation specification, now up for review.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Local benchmark setup for parameter tuning via the happy path ChainSync\nJumping (CSJ) prototype (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3987"},"Issue 3987"),")."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Context: Our Genesis design requires us to check in with a large (~20)\nnumber of servers periodically while syncing. These servers are offered\njump requests via the ChainSync protocol (hence the name), which they can\naccept or decline. If a peer declines, the Genesis rule allows us to\ndetermine whether a node actually has a better chain.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'The "happy path" is when no peer declines a jump. We want this to have\nclose to no overhead compared to status quo, i.e. syncing without Genesis.')),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented a prototype for this happy path, and are now starting to\ntest in various configurations (number of peers, latency, bandwidth) to\ntune the performance of ChainSync jumping, i.e. how complicated our logic\nof choosing when to jump needs to be."),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Example:"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Simulated connection: 50 MBit/s, 50ms latency")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Jump interval: 3000 slots (on the low end, could be increased to up to\n",(0,r.kt)("inlineCode",{parentName:"p"},"3k/f"),")")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Red: baseline (1.35.3), one peer in topology file")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Blue: Preliminary version of our prototype, with 10 peers."),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("img",{src:n(88213).Z,width:"654",height:"459"})),(0,r.kt)("p",{parentName:"li"},"It is slower by about ~30%, but it is not the latest version of the\nprototype, and the jump interval is very small, making CSJ more of a\nbottleneck."))))),(0,r.kt)("h2",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fix flakiness in ChainDB QSM tests (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3990"},"PR 3990"),").")))}m.isMDXComponent=!0},88213:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/happy-path-csj-prototype-prelim-5bbe2e2a20a2740e6238a7c73e618168.svg"}}]); \ No newline at end of file diff --git a/assets/js/017cd6b7.6c855c6e.js b/assets/js/017cd6b7.6c855c6e.js new file mode 100644 index 00000000000..88dcd7dae0c --- /dev/null +++ b/assets/js/017cd6b7.6c855c6e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3649],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-11-18-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-11-18-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-18-hydra.md",source:"@site/blog/2022-11-18-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-11-18T00:00:00.000Z",formattedDate:"November 18, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.085,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-18-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-23-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-18-mithril"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},u="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version ",(0,n.kt)("inlineCode",{parentName:"p"},"0.8.1"),", which includes several fixes and a user-wished extension of the persistence introduced by ",(0,n.kt)("inlineCode",{parentName:"p"},"0.8.0")," of replaying server outputs to make clients like the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-tui")," be aware of the latest ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-poc")," to ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra"},(0,n.kt)("inlineCode",{parentName:"a"},"hydra")),"!"),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implemented replaying of server outputs to address ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Released version 0.8.1 containing this and other fixes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.8.1"},"Release notes")),(0,n.kt)("li",{parentName:"ul"},"Worked on the bounded tx validity as one of the on-chain script fixes, but couldn","\u2019","t finish it just yet ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/615"},"#615")),(0,n.kt)("li",{parentName:"ul"},"Collaborated with the education team on a Hydra tutorial."),(0,n.kt)("li",{parentName:"ul"},"Discovered and discussed issues with the ","\u201c","seen ledger","\u201d","."),(0,n.kt)("li",{parentName:"ul"},"Renamed the Hydra repository ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-poc")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Create and discuss an ADR about handling tx validity correctly."),(0,n.kt)("li",{parentName:"ul"},"Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: ",(0,n.kt)("strong",{parentName:"li"},'"Developing Hydra" on Day 2, Nov 21st, 13:50 CET')),(0,n.kt)("li",{parentName:"ul"},"Have a team workshop / hackathon after the summit:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Retrospective"),(0,n.kt)("li",{parentName:"ul"},"Roadmapping session"),(0,n.kt)("li",{parentName:"ul"},"Hack on something complex or useful")))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/019bb279.7e5077df.js b/assets/js/019bb279.7e5077df.js new file mode 100644 index 00000000000..9429ed11d81 --- /dev/null +++ b/assets/js/019bb279.7e5077df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83167],{3905:(t,e,a)=>{a.d(e,{Zo:()=>u,kt:()=>N});var n=a(67294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var m=n.createContext({}),o=function(t){var e=n.useContext(m),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},u=function(t){var e=o(t.components);return n.createElement(m.Provider,{value:e},t.children)},s="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,r=t.originalType,m=t.parentName,u=p(t,["components","mdxType","originalType","parentName"]),s=o(a),k=l,N=s["".concat(m,".").concat(k)]||s[k]||d[k]||r;return a?n.createElement(N,i(i({ref:e},u),{},{components:a})):n.createElement(N,i({ref:e},u))}));function N(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var r=a.length,i=new Array(r);i[0]=k;var p={};for(var m in e)hasOwnProperty.call(e,m)&&(p[m]=e[m]);p.originalType=t,p[s]="string"==typeof t?t:l,i[1]=p;for(var o=2;o{a.r(e),a.d(e,{assets:()=>m,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>o});var n=a(87462),l=(a(67294),a(3905));const r={title:"Consensus Team Update",slug:"2022-08-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2022-08-31-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-08-31-consensus.md",source:"@site/blog/2022-08-31-consensus.md",title:"Consensus Team Update",description:"Executive summary",date:"2022-08-31T00:00:00.000Z",formattedDate:"August 31, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:8.925,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-08-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-01-ledger"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-08-12-network"}},m={authorsImageUrls:[void 0]},o=[{value:"Executive summary",id:"executive-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Conway",id:"conway",level:3},{value:"UTxO HD",id:"utxo-hd",level:3},{value:"Only small rollbacks",id:"only-small-rollbacks",level:4},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3}],u={toc:o},s="wrapper";function d(t){let{components:e,...a}=t;return(0,l.kt)(s,(0,n.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"executive-summary"},"Executive summary"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"We did most of the heavy lifting required to integrate the Conway era."),(0,l.kt)("li",{parentName:"ul"},"We have property tests for the UTxO HD backing store API implementations. A\npossible bug was identified. Work is ongoing to make sure the property-tests\ncover all the relevant cases."),(0,l.kt)("li",{parentName:"ul"},'We implemented and benchmarked the "anti-diff" prototype to speed up the UTxO\nHD functionality. Results show a rough speedup of ',(0,l.kt)("inlineCode",{parentName:"li"},"4x")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"5.5x")," across\nseveral scenarios. Note that: ",(0,l.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/tasty-bench-0.3.2/docs/Test-Tasty-Bench.html"},'"Data reported by ',(0,l.kt)("inlineCode",{parentName:"a"},"tasty-bench"),' is only of\nindicative and comparative significance."'),'.\nWe are investigating additional performance improvements. The "anti-diff"\nprototype and benchmarks are still pending code review.'),(0,l.kt)("li",{parentName:"ul"},"We elaborated a draft specification for the Genesis implementation and\n",(0,l.kt)("inlineCode",{parentName:"li"},"ChainSync")," jumping optimization.")),(0,l.kt)("h2",{id:"workstreams"},"Workstreams"),(0,l.kt)("h3",{id:"conway"},"Conway"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Integration PR of the minimal Conway era (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3962"},"Issue #3963"),", ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3971"},"PR\n#3971"),")."),(0,l.kt)("li",{parentName:"ul"},"Discussions with Ledger revealed possible sources of confusion about which\ndata should be changed in the Conway era. As a result, a new technical debt\nissue was raised, which does not block the integration of the Conway era\n(",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3976"},"Issue #3976"),").")),(0,l.kt)("h3",{id:"utxo-hd"},"UTxO HD"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3954"},"Issue #3954"),", ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/tree/jdral/3954-backingstore-property-tests"},"branch"),": The functionality of a\nbacking store, which is the interface to the on-disk part of ledger state in\nUTxO-HD, is tested at a high level through the ",(0,l.kt)("inlineCode",{parentName:"p"},"OnDisk")," tests. However, some\nfunctionalities remain untested, e.g., reads of ranges of keys. As such, we\nhave implemented ",(0,l.kt)("inlineCode",{parentName:"p"},"quickcheck-state-machine")," tests that exercise backing stores\ndirectly. The tests are reusable for different backing store implementations\nbecause the tests are implementation-agnostic: Any backing store that conforms\nto the backing store interface can be plugged into the tests. Work is still\nongoing to label/monitor the tests, such that we can verify that interesting\ncases are being tested. Furthermore, a possible bug has been identified in the\nLMDB backing store with respect to range reads, though the bug has not been\nresolved yet.")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3946"},"Issue #3946"),", ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/tree/jdral/CAD-4199-prototype-anti-diffs"},"branch"),", ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3882"},"PR #3882"),': The\n"anti-diff" prototype proposes an alternative approach to keeping track of\nsequences (more specifically, ',(0,l.kt)("inlineCode",{parentName:"p"},"FingerTree"),'s) of diffs. These diff sequences\nare a component of the in-memory parts of the ledger state in UTxO-HD. Since\nthe consensus code often requires the cumulative diff of a sequence of diffs,\nthe current implementation "caches" cumulative diffs of each subtree in the\ndiff sequence. This caching allows relatively fast reconstruction of the total\ncumulative diff, but this caching proved to incur a non-negligible cost: when\nwe manipulate diff sequences through splits and appends, we force re-computing\na logarithmic number of caches. This is problematic, since we often split and\nappend in consensus: we split when we flush diffs to a backing store or when\nwe roll back blocks, and we append when pushing blocks. The new approach\nshould reduce the overhead of this caching.'),(0,l.kt)("p",{parentName:"li"},'We implemented micro-benchmarks for the "anti-diff" prototype: we\nfirst generate a sequence of commands (',(0,l.kt)("inlineCode",{parentName:"p"},"Forward"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"Push"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"Flush"),", or\n",(0,l.kt)("inlineCode",{parentName:"p"},"Rollback"),") through a simulation, after which we measure the performance of\napplying the commands to a diff sequence. In this context, ",(0,l.kt)("inlineCode",{parentName:"p"},"Forward")," means\nforwarding of values through a diff, whereas ",(0,l.kt)("inlineCode",{parentName:"p"},"Rollback"),' means switching to\na different fork by rolling back diffs/blocks and pushing new ones.\nMoreover, we compare the performance for the two implementations: the\n"legacy" approach, and the anti-diff approach.'),(0,l.kt)("p",{parentName:"li"},"Some preliminary results were positive, but we needed to revisit the\nbenchmark's configuration to obtain more definitive results. After a\ndiscussion with @dcoutts and the consensus team about this configuration\n(e.g., number of commands generated, choice of the security parameter ",(0,l.kt)("inlineCode",{parentName:"p"},"k"),"),\nthe benchmarks should now be closer to the realistic setting. The following\nconfiguration specifies the default configuration that is used in the\nbenchmarking code:"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Number of commands generated: ",(0,l.kt)("inlineCode",{parentName:"li"},"10_000")),(0,l.kt)("li",{parentName:"ul"},"Security parameter ",(0,l.kt)("inlineCode",{parentName:"li"},"k"),": ",(0,l.kt)("inlineCode",{parentName:"li"},"2160")),(0,l.kt)("li",{parentName:"ul"},"Number of initial backing values: ",(0,l.kt)("inlineCode",{parentName:"li"},"100")),(0,l.kt)("li",{parentName:"ul"},"Number of key-value pairs deleted by a push: ",(0,l.kt)("inlineCode",{parentName:"li"},"50")),(0,l.kt)("li",{parentName:"ul"},"Number of key-value pairs inserted by a push: ",(0,l.kt)("inlineCode",{parentName:"li"},"50")),(0,l.kt)("li",{parentName:"ul"},"Number of key-value pairs forwarded by a forward: ",(0,l.kt)("inlineCode",{parentName:"li"},"50")),(0,l.kt)("li",{parentName:"ul"},"Probability of a large (in the range ",(0,l.kt)("inlineCode",{parentName:"li"},"[1000, 2000]"),") rollback: ",(0,l.kt)("inlineCode",{parentName:"li"},"0.05")),(0,l.kt)("li",{parentName:"ul"},"Probability of a small (in the range ",(0,l.kt)("inlineCode",{parentName:"li"},"[1, 10]"),") rollback: ",(0,l.kt)("inlineCode",{parentName:"li"},"0.95")),(0,l.kt)("li",{parentName:"ul"},"Order of commands:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"An equal number of forward and pushes."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"1")," flush every ",(0,l.kt)("inlineCode",{parentName:"li"},"10")," pushes."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"1")," rollback every ",(0,l.kt)("inlineCode",{parentName:"li"},"100")," pushes")))),(0,l.kt)("p",{parentName:"li"},"Moreover, we run four benchmark scenarios:"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Default configuration"),(0,l.kt)("li",{parentName:"ul"},"Without rollbacks"),(0,l.kt)("li",{parentName:"ul"},"With only small rollbacks"),(0,l.kt)("li",{parentName:"ul"},"Without rollbacks, larger flushes (",(0,l.kt)("inlineCode",{parentName:"li"},"1")," flush every ",(0,l.kt)("inlineCode",{parentName:"li"},"100")," pushes)")),(0,l.kt)("h3",{parentName:"li",id:"how-to-read-results"},"How to read results"),(0,l.kt)("p",{parentName:"li"},"Note: this section uses documentation from the\n",(0,l.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/tasty-bench"},"tasty-bench")," package to\nexplain how to read the results of running our benchmarks."),(0,l.kt)("p",{parentName:"li"},"Running a benchmark scenario gives us the following (curated) output:"),(0,l.kt)("pre",{parentName:"li"},(0,l.kt)("code",{parentName:"pre",className:"language-text"},"...\nAntiDiff: OK (18.27s)\n 2.527 s \xb1 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x\nLegacyDiff: OK (32.73s)\n 10.829 s \xb1 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory\n...\n")),(0,l.kt)("p",{parentName:"li"},"The output says that the first benchmark, which exercises the anti-diff\nprototype, was repeatedly executed for ",(0,l.kt)("inlineCode",{parentName:"p"},"18.27")," seconds (wall-clock time),\nits predicted mean CPU time was ",(0,l.kt)("inlineCode",{parentName:"p"},"2.527")," seconds and means of individual\nsamples do not often diverge from it further than ",(0,l.kt)("inlineCode",{parentName:"p"},"\xb1 47")," milliseconds\n(double standard deviation). We also configure the RTS to collect GC\nstatistics, which enables ",(0,l.kt)("inlineCode",{parentName:"p"},"tasty-bench")," to estimate and report memory usage.\nThis data is reported as per ",(0,l.kt)("inlineCode",{parentName:"p"},"RTSStats")," fields: ",(0,l.kt)("inlineCode",{parentName:"p"},"allocated_bytes"),",\n",(0,l.kt)("inlineCode",{parentName:"p"},"copied_bytes")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"max_mem_in_use_bytes"),". So, the output of the first\nbenchmark says that a total of ",(0,l.kt)("inlineCode",{parentName:"p"},"2.1 GB")," of memory was allocated, that a\ntotal of ",(0,l.kt)("inlineCode",{parentName:"p"},"544 MB")," of memory were copied, and that the peak memory in usage\nwas ",(0,l.kt)("inlineCode",{parentName:"p"},"2.2 GB"),". We read the output for the second benchmark in the same way."),(0,l.kt)("p",{parentName:"li"},"Furthermore, the benchmark compares the mean CPU times for\nboth the anti-diff and legacy approaches: In this case, the mean CPU time\nfor the anti-diff approach is ",(0,l.kt)("inlineCode",{parentName:"p"},"~0.23x")," the mean CPU time for the legacy\napproach. Conversely, the mean CPU time for the legacy approach is\n",(0,l.kt)("inlineCode",{parentName:"p"},"1 / 0.23 ~= 4.35x")," the mean CPU time for the anti-diff approach. We will\ncall ",(0,l.kt)("inlineCode",{parentName:"p"},"0.23x")," the ",(0,l.kt)("em",{parentName:"p"},"improvement factor"),". We will call ",(0,l.kt)("inlineCode",{parentName:"p"},"4.35x")," the ",(0,l.kt)("em",{parentName:"p"},"speedup"),"."),(0,l.kt)("p",{parentName:"li"},"Note that these improvement factors (and reported results) are subject to\nnoise, randomness, the specific configuration parameters, and the whims\nof statistics. Data reported by ",(0,l.kt)("inlineCode",{parentName:"p"},"tasty-bench")," is only of indicative and\ncomparative significance."),(0,l.kt)("h3",{parentName:"li",id:"results"},"Results"),(0,l.kt)("p",{parentName:"li"},"For each of the 4 scenarios, we list the results of running the anti-diff and\nlegacy approaches 5 times. We run the benchmarks 5 times to get an indication\nof whether the results are similar across multiple runs. Furthermore, we\ncalculate the accompanying ",(0,l.kt)("em",{parentName:"p"},"ranges")," (if applicable) of improvement factors and\nspeedups."),(0,l.kt)("p",{parentName:"li"},"Note also the decrease in total bytes allocated and total bytes copied for\nthe anti-diff approach compared to the legacy approach."),(0,l.kt)("h4",{parentName:"li",id:"default-configuration"},"Default configuration"),(0,l.kt)("table",{parentName:"li"},(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.533 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"4.7 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"557 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.792 s"),(0,l.kt)("td",{parentName:"tr",align:null},"162 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.508 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"245 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"515 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.850 s"),(0,l.kt)("td",{parentName:"tr",align:null},"30 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.9 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.562 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"5.0 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"552 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.993 s"),(0,l.kt)("td",{parentName:"tr",align:null},"149 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.9 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.168 s (0.22x)"),(0,l.kt)("td",{parentName:"tr",align:null},"5.3 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"434 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"9.976 s"),(0,l.kt)("td",{parentName:"tr",align:null},"39 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.527 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"47 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"544 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.829 s"),(0,l.kt)("td",{parentName:"tr",align:null},"148 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")))),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"li"},"[0.22, 0.23]")),(0,l.kt)("li",{parentName:"ul"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"li"},"[1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]"))),(0,l.kt)("h4",{parentName:"li",id:"no-rollbacks"},"No rollbacks"),(0,l.kt)("table",{parentName:"li"},(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.638 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"36 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.656 s"),(0,l.kt)("td",{parentName:"tr",align:null},"207 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.638 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"75 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.654 s"),(0,l.kt)("td",{parentName:"tr",align:null},"322 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.663 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"74 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.799 s"),(0,l.kt)("td",{parentName:"tr",align:null},"216 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.645 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"51 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.732 s"),(0,l.kt)("td",{parentName:"tr",align:null},"261 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.639 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"19 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.653 s"),(0,l.kt)("td",{parentName:"tr",align:null},"234 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")))),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"li"},"0.19")),(0,l.kt)("li",{parentName:"ul"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"li"},"1 / 0.19 ~= 5.25"))))),(0,l.kt)("h4",{id:"only-small-rollbacks"},"Only small rollbacks"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.833 s (0.18x)"),(0,l.kt)("td",{parentName:"tr",align:null},"36 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"185 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.362 s"),(0,l.kt)("td",{parentName:"tr",align:null},"867 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.6 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.696 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"30 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"185 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.822 s"),(0,l.kt)("td",{parentName:"tr",align:null},"106 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.702 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"44 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"186 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.906 s"),(0,l.kt)("td",{parentName:"tr",align:null},"147 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.701 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"47 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"185 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.949 s"),(0,l.kt)("td",{parentName:"tr",align:null},"197 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.677 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"55 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"186 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.856 s"),(0,l.kt)("td",{parentName:"tr",align:null},"177 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")))),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"p"},"[0.18, 0.19]"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"p"},"[1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]")),(0,l.kt)("h4",{parentName:"li",id:"no-rollbacks-larger-flushes-every-100-pushes"},"No rollbacks, larger flushes (every 100 pushes)"),(0,l.kt)("table",{parentName:"li"},(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.643 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"21 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.591 s"),(0,l.kt)("td",{parentName:"tr",align:null},"351 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.616 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"47 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.520 s"),(0,l.kt)("td",{parentName:"tr",align:null},"232 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.640 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"34 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.540 s"),(0,l.kt)("td",{parentName:"tr",align:null},"150 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.635 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"76 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.589 s"),(0,l.kt)("td",{parentName:"tr",align:null},"131 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.628 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"19 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.490 s"),(0,l.kt)("td",{parentName:"tr",align:null},"5.9 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB"))))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"p"},"0.25"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"p"},"1 / 0.25 ~= 4")))),(0,l.kt)("h3",{id:"genesis"},"Genesis"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"We elaborated a draft of the specification of the Genesis implementation and\nthe ChainSync Jumping optimization. In particular, this includes a proof\nsketch that the latter preserves liveness and safety in all cases (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3964"},"Issue\n3964"),").",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"@nfrisby's main realization during this sprint was that he had been\nfocusing so far on the case where the selected chain is an extension of\nthe intersection of our peers' ChainSync candidates."),(0,l.kt)("li",{parentName:"ul"},'This is the main case, ie an "absorbing" state, but it\'s not the only\ncase.'),(0,l.kt)("li",{parentName:"ul"},"The new proof sketch begins by case splitting on that predicate, and\nthat made the sketch quite a bit easier to follow."))),(0,l.kt)("li",{parentName:"ul"},'We continued working on the "happy path" ',(0,l.kt)("inlineCode",{parentName:"li"},"ChainSync")," Jumping prototype (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3960"},"Issue\n3960"),").")),(0,l.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"We started working on the issues required to re-enable nightly CI runs..\nNightly CI runs have far more lax time constraints, which gives the option to\nrun significantly more property tests than in our regular CI. To this end, we\nmerged a PR to easily adapt the number of tests globally (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3947"},"PR\n#3947"),").")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.545379d8.js b/assets/js/01a85c17.545379d8.js new file mode 100644 index 00000000000..3548879dfe3 --- /dev/null +++ b/assets/js/01a85c17.545379d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64013],{39058:(e,t,a)=>{a.d(t,{Z:()=>p});var l=a(67294),r=a(86010),n=a(93285),s=a(87524),i=a(39960),c=a(95999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function o(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(13102);function d(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function g(e){return l.createElement(u.Zo,{component:d,props:e})}function b(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(g,{sidebar:t}):l.createElement(o,{sidebar:t}):null}function p(e){const{sidebar:t,toc:a,children:s,...i}=e,c=t&&t.items.length>0;return l.createElement(n.Z,i,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(b,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":c,"col--9 col--offset-1":!c}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},91223:(e,t,a)=>{a.r(t),a.d(t,{default:()=>p});var l=a(67294),r=a(86010),n=a(95999);const s=()=>(0,n.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var i=a(1944),c=a(35281),m=a(39058),o=a(13008);const u={tag:"tag_Nnez"};function d(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:u.tag},l.createElement(o.Z,e))))),l.createElement("hr",null))}function g(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(d,{key:e.letter,letterEntry:e}))))}var b=a(90197);function p(e){let{tags:t,sidebar:a}=e;const n=s();return l.createElement(i.FG,{className:(0,r.Z)(c.k.wrapper.blogPages,c.k.page.blogTagsListPage)},l.createElement(i.d,{title:n}),l.createElement(b.Z,{tag:"blog_tags_list"}),l.createElement(m.Z,{sidebar:a},l.createElement("h1",null,n),l.createElement(g,{tags:t})))}},13008:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(67294),r=a(86010),n=a(39960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function i(e){let{permalink:t,label:a,count:i}=e;return l.createElement(n.Z,{href:t,className:(0,r.Z)(s.tag,i?s.tagWithCount:s.tagRegular)},a,i&&l.createElement("span",null,i))}}}]); \ No newline at end of file diff --git a/assets/js/0281a492.3b7b7eac.js b/assets/js/0281a492.3b7b7eac.js new file mode 100644 index 00000000000..2cb9f75fcba --- /dev/null +++ b/assets/js/0281a492.3b7b7eac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79503],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function n(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):n(n({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(a),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||o;return a?r.createElement(h,n(n({ref:t},d),{},{components:a})):r.createElement(h,n({ref:t},d))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=a.length,n=new Array(o);n[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:l,n[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>n,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-06-08-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},n=void 0,i={permalink:"/cardano-updates/2023-06-08-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-sre.md",source:"@site/blog/2023-06-08-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.795,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-06-08-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-08-goedel"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-06-08-system-test"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Bitte",id:"bitte",level:3},{value:"Bitte-cells",id:"bitte-cells",level:3},{value:"Cardano-graphql",id:"cardano-graphql",level:3},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Ci-ops",id:"ci-ops",level:3},{value:"Ci-world",id:"ci-world",level:3},{value:"Cicero",id:"cicero",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3},{value:"Openziti",id:"openziti",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer."),(0,l.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,l.kt)("h3",{id:"bitte"},"Bitte"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Equinix bare metal capability was added to bitte: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte/pull/194"},"bitte-pull-194")),(0,l.kt)("li",{parentName:"ul"},"Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte/pull/201"},"bitte-pull-201"))),(0,l.kt)("h3",{id:"bitte-cells"},"Bitte-cells"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Improvements made for patroni cluster recovery of large databases: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte-cells/compare/main...patroni-flex"},"bitte-cells-branch"))),(0,l.kt)("h3",{id:"cardano-graphql"},"Cardano-graphql"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update cardano-graphql and nixos service: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-graphql/pull/815"},"cardano-graphql-pull-815"))),(0,l.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update cardano-node to use the updated iohk-nix environments: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5241"},"cardano-node-pull-5241"))),(0,l.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update cardano-graphql, adds monitoring improvements and misc bug fixes: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/pull/411"},"cardano-ops-pull-411")),(0,l.kt)("li",{parentName:"ul"},"Work in progress on mixed legacy and p2p topology clusters in cardano-ops: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/master...ops-local"},"cardano-ops-branch"))),(0,l.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Add a declarative cardano-faucet dashboard: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/e7d40d34aff52bbeb309f87939bd0d40f585e60a"},"cardano-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Remove a requirement for root user in Nomad docker images: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/68"},"cardano-world-pull-68")),(0,l.kt)("li",{parentName:"ul"},"Enable explorer in cardano-world for high IOPS metal access: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/69"},"cardano-world-pull-69")),(0,l.kt)("li",{parentName:"ul"},"Migrate explorer cluster to cardano-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/75"},"cardano-world-pull-75")),(0,l.kt)("li",{parentName:"ul"},"Migrate testnet metadata server to cardano-world, cleanup envs: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/77"},"cardano-world-pull-77")),(0,l.kt)("li",{parentName:"ul"},"Add a faucet restore delegation script to cardano-world for non-functioning delegated pools: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/79"},"cardano-world-pull-79")),(0,l.kt)("li",{parentName:"ul"},"Integrate node 8.x into cardano-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/84"},"cardano-world-pull-84")),(0,l.kt)("li",{parentName:"ul"},"Update cardano-world to use iohk-nix for node environments: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/87"},"cardano-world-pull-87")),(0,l.kt)("li",{parentName:"ul"},"Create a stakepool analysis query for cluster pool performance overview: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/64fe3b9d4067c24eef028ac1c561d6f9a7d5a9a8"},"cardano-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Added an iptables fixup script for broken bridged networking nomad jobs: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/02550206e4e34d121135794b6e54084635e55a50"},"cardano-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Improve cardano-world job automation with additional parameterization: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/92"},"cardano-world-pr-92")),(0,l.kt)("li",{parentName:"ul"},"Update preview network experimental config defaults: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/93"},"cardano-world-pr-93"))),(0,l.kt)("h3",{id:"ci-ops"},"Ci-ops"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-ops/pull/108"},"ci-ops-pull-108"))),(0,l.kt)("h3",{id:"ci-world"},"Ci-world"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Resolve ci-world linux buildkite agent cleanup bug: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/commit/3d053b202a6e40fab23db49801de7d6e580fab1f"},"ci-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Integrate new darwin builders into ci-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/pull/22"},"ci-world-pull-22")),(0,l.kt)("li",{parentName:"ul"},"Migrate patroni HA db to it's own namespace in ci-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/pull/24"},"ci-world-pull-24"))),(0,l.kt)("h3",{id:"cicero"},"Cicero"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Implement a cicero webhook backoff with exponential decay plus jitter: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cicero/pull/79"},"cicero-pull-79"))),(0,l.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update iohk-nix to be source of truth for node environments: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/534"},"iohk-nix-pull-534")),(0,l.kt)("li",{parentName:"ul"},"Update preview network experimental config defaults: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/544"},"iohk-nix-pull-544"))),(0,l.kt)("h3",{id:"openziti"},"Openziti"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Add darwin intel and arm support to ziti-edge-tunnel nix modules: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/johnalotoski/openziti-bins/pull/1"},"openziti-bins-pull-1"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/034a14a6.3aafc153.js b/assets/js/034a14a6.3aafc153.js new file mode 100644 index 00000000000..16ad0e0d015 --- /dev/null +++ b/assets/js/034a14a6.3aafc153.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95018],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=s(n),p=a,f=u["".concat(l,".").concat(p)]||u[p]||m[p]||o;return n?r.createElement(f,i(i({ref:t},d),{},{components:n})):r.createElement(f,i({ref:t},d))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:a,i[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-06-28-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-06-28-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-28-performance-and-tracing.md",source:"@site/blog/2023-06-28-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-06-28T00:00:00.000Z",formattedDate:"June 28, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.885,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-06-28-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-28-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-23-goedel"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: The first batch of refactoring and documentation for our ",(0,a.kt)("inlineCode",{parentName:"li"},"tx-generator")," has been merged to ",(0,a.kt)("inlineCode",{parentName:"li"},"master"),"."),(0,a.kt)("li",{parentName:"ul"},"Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"The compiler switch to GHC9 as the default build platform for ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard. "),(0,a.kt)("p",null,"Using the ",(0,a.kt)("inlineCode",{parentName:"p"},"forge-stress")," approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"tx-generator")," is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress."),(0,a.kt)("p",null,"Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/03d856aa.52e2f164.js b/assets/js/03d856aa.52e2f164.js new file mode 100644 index 00000000000..3fc5bae897b --- /dev/null +++ b/assets/js/03d856aa.52e2f164.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6413],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=o.createContext({}),l=function(e){var t=o.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=l(r),d=n,h=c["".concat(s,".").concat(d)]||c[d]||m[d]||a;return r?o.createElement(h,i(i({ref:t},u),{},{components:r})):o.createElement(h,i({ref:t},u))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[c]="string"==typeof e?e:n,i[1]=p;for(var l=2;l{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>p,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var o=r(87462),n=(r(67294),r(3905)),a=r(80175);const i={title:"Network Team Update",slug:"2022-11-11-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},p=void 0,s={permalink:"/cardano-updates/2022-11-11-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-network.md",source:"@site/blog/2022-11-11-network.md",title:"Network Team Update",description:"High-level summary",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.595,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-11-11-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-11-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-04-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"Detail description",id:"detail-description",level:2},{value:"Performance regression",id:"performance-regression",level:3},{value:"New P2P topology form",id:"new-p2p-topology-form",level:3},{value:"Tracing improvements",id:"tracing-improvements",level:3},{value:"Open Source Improvements",id:"open-source-improvements",level:3}],c={toc:u},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"In last sprint we got a performance report of P2P performance testing cluster\n(which consists of 50 nodes). There is a performance regression in the header\nnotification metric. The P2P cluster is constructed with the same\ntopology as the non-p2p reference one this indicates some regression which\nneeds to be further investigated. This poses a risk for releasing P2P."),(0,n.kt)("p",null,"We also continued to work on peer sharing: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"pull #4019"),"."),(0,n.kt)("p",null,"We continued working on dynamic block production which is required for P2P\nrelease for BP nodes: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"pull #3159"),"."),(0,n.kt)("p",null,"We simplified the P2P topology format: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4559"},"issue #4559"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3888"},"pull #3888"),"."),(0,n.kt)("p",null,"We added a new trace point for asynchronous demotions of local peers with\n",(0,n.kt)("inlineCode",{parentName:"p"},"Warning")," severity. This trace is ",(0,n.kt)("strong",{parentName:"p"},"important")," for SPOs."),(0,n.kt)("h2",{id:"detail-description"},"Detail description"),(0,n.kt)("h3",{id:"performance-regression"},"Performance regression"),(0,n.kt)("p",null,"Below we include a graph which shows the performance regression of the P2P code base vs non P2P."),(0,n.kt)("img",{src:a.Z}),(0,n.kt)("p",null,"On the ",(0,n.kt)("inlineCode",{parentName:"p"},"x")," axis is time in seconds which measures the delay from the start of\nthe slot to when a header was received. The ",(0,n.kt)("inlineCode",{parentName:"p"},"y")," axis is the percentile of nodes\nthat received a header. We are currently investigating possible causes of the\nregression. "),(0,n.kt)("h3",{id:"new-p2p-topology-form"},"New P2P topology form"),(0,n.kt)("p",null,"The new topology file format is described in this ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4559"},"issue #4559"),"."),(0,n.kt)("h3",{id:"tracing-improvements"},"Tracing improvements"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We improved a handshake error reporting, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4136"},"pull #4136")),(0,n.kt)("li",{parentName:"ul"},"We added ",(0,n.kt)("inlineCode",{parentName:"li"},"TraceDemoteLocalAsynchronous")," rendered as ",(0,n.kt)("inlineCode",{parentName:"li"},"DemoteLocalAsynchronous"),"\nin ",(0,n.kt)("inlineCode",{parentName:"li"},"json")," format, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4127"},"pull #4127"),". Such demotions should be investigated by the\npool operator. They can indicate a problem in the deployed system, but also\nthey could indicate a remote problem in arranged connections with other SPOs.")),(0,n.kt)("h3",{id:"open-source-improvements"},"Open Source Improvements"),(0,n.kt)("p",null,"We improved documentation of ",(0,n.kt)("inlineCode",{parentName:"p"},"io-sim")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols")," for open-source\ncontributors and/or maintenance tasks: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/22"},"pull #22"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/45"},"pull #45"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/48"},"pull #48"),". "))}d.isMDXComponent=!0},80175:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/2022-11-11-noticed-headers-55bb0b4d41e8f0cff0066e1bec91bdd2.png"}}]); \ No newline at end of file diff --git a/assets/js/042169f6.41e4831f.js b/assets/js/042169f6.41e4831f.js new file mode 100644 index 00000000000..a96d7721dc9 --- /dev/null +++ b/assets/js/042169f6.41e4831f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27449],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),c=n,d=h["".concat(s,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-12-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-01-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-mithril.md",source:"@site/blog/2022-12-01-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2022-12-01T00:00:00.000Z",formattedDate:"December 1, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.04,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2022-12-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"DB sync Team Update",permalink:"/cardano-updates/2022-12-01-db-sync"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-12-01-system-test"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes. "),(0,n.kt)("p",null,"Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implemented custom Mithril SPOs on testing/pre-release networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/563"},"#563")),(0,n.kt)("li",{parentName:"ul"},"Deprecated Signer Declarative Pool Id registration mode ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/585"},"#585")),(0,n.kt)("li",{parentName:"ul"},"Completed the second stage of the store automatic migration process ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/600"},"#600")),(0,n.kt)("li",{parentName:"ul"},"Completed the deployment pipelines to crates.io registry ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/588"},"#588")),(0,n.kt)("li",{parentName:"ul"},"Completed automatic generation of nodes/libraries versions manifest in releases notes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/599"},"#599")),(0,n.kt)("li",{parentName:"ul"},"Completed CI/CD handling of PR from forks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/597"},"#597")),(0,n.kt)("li",{parentName:"ul"},"Worked on the CIP design for Mithril piggybacked on the Cardano network layer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/586"},"#586")),(0,n.kt)("li",{parentName:"ul"},"Worked on signing the artifacts released in the distributions by the CI/CD ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/587"},"#587")),(0,n.kt)("li",{parentName:"ul"},"Worked on multi-platforms end to end test ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/601"},"#601")),(0,n.kt)("li",{parentName:"ul"},"Worked on the refactorizaton of the aggregator multi-signer engine ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/398"},"#398"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0431617f.5c919503.js b/assets/js/0431617f.5c919503.js new file mode 100644 index 00000000000..299dc7a0cea --- /dev/null +++ b/assets/js/0431617f.5c919503.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68153],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>f});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},m=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=n,f=s["".concat(p,".").concat(d)]||s[d]||u[d]||o;return r?a.createElement(f,l(l({ref:t},m),{},{components:r})):a.createElement(f,l({ref:t},m))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-04-28-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-04-28-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-goedel.md",source:"@site/blog/2023-04-28-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-04-28T00:00:00.000Z",formattedDate:"April 28, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.375,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-04-28-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-04-28-crypto"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-04-28-network"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],m={toc:c},s="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The team is working on porting an existing formalisation of Ouroboros\nPraos to a newer foundation."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team worked on documentation.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team worked on an application layer for the Praos formalisation.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/04326247.8876239e.js b/assets/js/04326247.8876239e.js new file mode 100644 index 00000000000..6a0af04420a --- /dev/null +++ b/assets/js/04326247.8876239e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25759],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",h={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=u(a),m=r,s=d["".concat(p,".").concat(m)]||d[m]||h[m]||o;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[d]="string"==typeof t?t:r,l[1]=i;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-01-25-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-01-25-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-25-node-cli-api.md",source:"@site/blog/2023-01-25-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-01-25T00:00:00.000Z",formattedDate:"January 25, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.585,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-01-25-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-25-consensus"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-20-crypto"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function h(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-01-25---2023-02-07"},"2023-01-25 - 2023-02-07"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli query stake-snapshot")," command. "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4853"},"Fix how changed files are selected in stylish-haskell CI check")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Copyright updates")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4848"},"Remove hlint from nix required CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4838"},"Remove reconfigure-hlint.sh script")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4837"},"Fix hlint warnings")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4833"},"Implement ADR-2: Restructure modules for generators")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4803"},"Stylish Haskell in CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4802"},"Revert skip doc in ci")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4800"},"Skip CI on doc only changes")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4792"},"Skip CI if only changes are documentation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4776"},"Build all of cardano-node in CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4766"},"Check cabal files in CI"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4785"},"Straight line error handling")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4787"},"New NodeToClientVersionOf typeclass")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4832"},"Remove NoImplicitPrelude from cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4809"},"Add ReaderT of NodeToClientVersion to LocalStateQueryExpr")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4808"},"Use hoistMaybe")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4788"},"Better error message for query utxo without oops"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4805"},"New query stake-snapshot integration test")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4671"},"Make leadership-schedule test less flaky"))),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/046dd16d.729d4d40.js b/assets/js/046dd16d.729d4d40.js new file mode 100644 index 00000000000..91629069803 --- /dev/null +++ b/assets/js/046dd16d.729d4d40.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49237],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=o.createContext({}),l=function(e){var t=o.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=l(r),h=n,m=u["".concat(p,".").concat(h)]||u[h]||c[h]||a;return r?o.createElement(m,i(i({ref:t},d),{},{components:r})):o.createElement(m,i({ref:t},d))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:n,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=r(87462),n=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-09-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-09-15-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-network.md",source:"@site/blog/2023-09-15-network.md",title:"Network Team Update",description:"High-level overview of sprint 44",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.41,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-09-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-15-ledger"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-15-sre"}},p={authorsImageUrls:[void 0]},l=[{value:"High-level overview of sprint 44",id:"high-level-overview-of-sprint-44",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"Cardano-Node-8.4.0 Release",id:"cardano-node-840-release",level:3},{value:"Towards Typed Protocols 0.2.0.0",id:"towards-typed-protocols-0200",level:3},{value:"Tech Debt",id:"tech-debt",level:3},{value:"P2P adoption",id:"p2p-adoption",level:3},{value:"Open Source",id:"open-source",level:3}],d={toc:l},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,o.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-44"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+44%22"},"sprint 44")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"In this sprint, we focused on developing bootstrap peers."),(0,n.kt)("p",null,"Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we\nidentified a possible improvement to bootstrap peers. A more detailed\ndescription is available ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4675"},"here"),"."),(0,n.kt)("h3",{id:"cardano-node-840-release"},"Cardano-Node-8.4.0 Release"),(0,n.kt)("p",null,"We also were responsible for the ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node-8.4.0-pre")," release. A final\nintegration ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5467"},"PR")," is currently being merged. We published\nnew versions of ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-api")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-cli"),"."),(0,n.kt)("h3",{id:"towards-typed-protocols-0200"},"Towards Typed Protocols 0.2.0.0"),(0,n.kt)("p",null,"We also updated the future ",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0")," and its integration with\n",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node"),". This is towards our goal which we planned for the next\nquarter. The identified tasks are to fix breaking tests, and then measure and\naddress possible performance regressions."),(0,n.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,n.kt)("p",null,"Mark Tullsen (Galois) submitted two more PRs: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4663"},"ouroboros-network-#4663"),",\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4664"},"ouroboros-network-#4664"),". We provided feedback on their other pull requests: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661")," and\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4660"},"ouroboros-network-#4660"),"."),(0,n.kt)("h3",{id:"p2p-adoption"},"P2P adoption"),(0,n.kt)("p",null,"In the last two weeks, there was a regression in P2P adoption concerning\nthe number of SPOs or stakes, although the number of overall P2P relays has\nincreased. Karl Knutsson (",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"Cardano Foundation"),") is investigating\nthis issue.\n",(0,n.kt)("img",{alt:"P2P relays",src:r(70480).Z,width:"2014",height:"1586"})),(0,n.kt)("p",null,"The following graphs show several different versions of relays running on the mainnet. The\ngreen line ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionV10.True")," denotes P2P relays, which slowly\nincrease over time. The ",(0,n.kt)("inlineCode",{parentName:"p"},"V9")," and earlier versions of the ",(0,n.kt)("inlineCode",{parentName:"p"},"node-to-node"),"\nthe protocol indicates nodes version ",(0,n.kt)("inlineCode",{parentName:"p"},"1.35.x")," or earlier.\n",(0,n.kt)("img",{alt:"node versions",src:r(20669).Z,width:"2016",height:"1576"})),(0,n.kt)("p",null,"Data has been kindly provided by ",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"Cardano Foundation")," and their mainnet\nmonitoring infrastructure."),(0,n.kt)("h3",{id:"open-source"},"Open Source"),(0,n.kt)("p",null,"We are in the process of upstreaming our ffi to Windows Named Pipes API to the ",(0,n.kt)("inlineCode",{parentName:"p"},"Win32")," package, see ","[win32-220]","."))}c.isMDXComponent=!0},70480:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/2023-09-14-p2p-relays-1b3da3da7ec3915f63ca8668bd38aff9.png"},20669:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/2023-09-14-relay-versions-a689a96e93e12ee1c78dfe14229f0ea9.png"}}]); \ No newline at end of file diff --git a/assets/js/04c3317f.e2f79174.js b/assets/js/04c3317f.e2f79174.js new file mode 100644 index 00000000000..520c8158443 --- /dev/null +++ b/assets/js/04c3317f.e2f79174.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83050],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=a.createContext({}),m=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=m(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,s=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=m(r),c=n,h=u["".concat(i,".").concat(c)]||u[c]||d[c]||s;return r?a.createElement(h,o(o({ref:t},p),{},{components:r})):a.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=r.length,o=new Array(s);o[0]=c;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var m=2;m{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>m});var a=r(87462),n=(r(67294),r(3905));const s={title:"System Test Team Update",slug:"2023-03-27-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-27-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-27-system-test.md",source:"@site/blog/2023-03-27-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2023-03-27T00:00:00.000Z",formattedDate:"March 27, 2023",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.785,hasTruncateMarker:!1,authors:[{name:"Martin Kourim",title:"System Test Engineer",url:"https://github.com/mkoura",imageURL:"https://github.com/mkoura.png",key:"mkoura"}],frontMatter:{title:"System Test Team Update",slug:"2023-03-27-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-31-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-24-hydra"}},i={authorsImageUrls:[void 0]},m=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"Node:",id:"node",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],p={toc:m},u="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the ",(0,n.kt)("em",{parentName:"p"},"1.35.5")," and ",(0,n.kt)("em",{parentName:"p"},"1.35.6")," releases (and their predecessing release candidates) and ran tests on branch with the ",(0,n.kt)("em",{parentName:"p"},"UTxO-HD")," functionality."),(0,n.kt)("h2",{id:"workstreams"},"Workstreams"),(0,n.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"improvements in searching for unexpected error messages in log files during test run"),(0,n.kt)("li",{parentName:"ul"},"added support for UTxO-HD testing"),(0,n.kt)("li",{parentName:"ul"},"added support for the new P2P topology format"),(0,n.kt)("li",{parentName:"ul"},"added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)"),(0,n.kt)("li",{parentName:"ul"},"added preliminary support for the Conway era"),(0,n.kt)("li",{parentName:"ul"},"added support for running tests on the ",(0,n.kt)("em",{parentName:"li"},"Preview")," testnet")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node-tests/pulls?q=is%3Apr+is%3Aclosed+updated%3A2023-01-13..2023-03-26"},"Full list of closed PRs")),(0,n.kt)("h3",{id:"node"},"Node:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"ran tests on node branch with the UTxO-HD functionality"),(0,n.kt)("li",{parentName:"ul"},"tested the ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_5.html"},"1.35.5")," release"),(0,n.kt)("li",{parentName:"ul"},"tested the ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_6.html"},"1.35.6")," release")),(0,n.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"improvements in db-sync sync tests"),(0,n.kt)("li",{parentName:"ul"},"improvements in db-sync functional tests")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/04cbd10c.9008202b.js b/assets/js/04cbd10c.9008202b.js new file mode 100644 index 00000000000..721fa017cf5 --- /dev/null +++ b/assets/js/04cbd10c.9008202b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97245],{4032:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/05f2862f.32b47b8d.js b/assets/js/05f2862f.32b47b8d.js new file mode 100644 index 00000000000..e0d46ccda9b --- /dev/null +++ b/assets/js/05f2862f.32b47b8d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18479],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),u=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=u(a),d=n,m=h["".concat(s,".").concat(d)]||h[d]||c[d]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-04-07-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-07-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-07-hydra.md",source:"@site/blog/2023-04-07-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-07T00:00:00.000Z",formattedDate:"April 7, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.875,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-07-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-14-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-06-mithril"}},s={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:u},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team published the monthly report for March, created\nseparate links for different versions of documentation, and clarified potential\nsolutions for the Rollbacks bug. The team also discussed Query API requests for\nthe Hydra Voting project and met with community members to answer questions\nabout Hydra. Moving forward, the team plans to integrate the specification into\nthe repository, implement a short-term fix for the Rollbacks issue, and draft a\nQuery API ADR."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published monthly reports on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-03"},"website")),(0,n.kt)("li",{parentName:"ul"},"Separate last released and latest versions of docs (e.g. normal ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/core-concepts/behavior/#replay-of-past-server-outputs"},"released")," vs. ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/core-concepts/behavior/#replay-of-past-server-outputs"},"/unstable"),")"),(0,n.kt)("li",{parentName:"ul"},"Discussed Query API concerns from Hydra Voting project (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/discussions/797"},"link"),")"),(0,n.kt)("li",{parentName:"ul"},"Clarified rollbacks bug and defined possible solutions (short and long term) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Met with community members to answer questions about Hydra")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finally get the docs integrated into the repository ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693")),(0,n.kt)("li",{parentName:"ul"},"Dirt road fix for rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Disclaimer text and detail known issues about mainnet compatibility\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0645cd02.fa280ace.js b/assets/js/0645cd02.fa280ace.js new file mode 100644 index 00000000000..4f540a3cc2e --- /dev/null +++ b/assets/js/0645cd02.fa280ace.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46982],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=p(r),c=n,m=d["".concat(u,".").concat(c)]||d[c]||h[c]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=c;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-07-21-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-07-21-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-ledger.md",source:"@site/blog/2023-07-21-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.715,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-07-21-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-21-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-21-sre"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What we achieved",id:"what-we-achieved",level:2},{value:"What is currently in progress",id:"what-is-currently-in-progress",level:2}],s={toc:p},d="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet.\nAll members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era.\nWe also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release).\nAdditionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available.\nWe also made progress on the constraint-based generators, which can now generate valid transactions and ledger states. "),(0,n.kt)("h2",{id:"what-we-achieved"},"What we achieved"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3521"},"pull-3521"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3554"},"pull-3554"),"] Improved Governance model (GovernanceProcedures, ProposalProcedure)"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3520"},"pull-3520"),"] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert ) "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3531"},"pull-3531"),"] Refactored and simplified code interacting with Plutus"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3558"},"pull-3558"),"] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix. "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3550"},"pull-3550"),"] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed."),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3551"},"pull-3551"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3546"},"pull-3546"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3472"},"pull-3472"),"] Updated tools and added some small improvements "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3146"},"issue-3146"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3498"},"pull-3498"),"] Introduced Conway protocol parameters "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2948"},"issue-2948"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3499"},"pull-3499"),"] Implemented ConwayGenesis with the new protocol parameters")),(0,n.kt)("h2",{id:"what-is-currently-in-progress"},"What is currently in progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3494"},"issue-3494"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3495"},"pull-3495"),"] Implement returning of proposal deposits"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3436"},"issue-3436"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3523"},"pull-3523"),"] Implement transferring lovelace from UTxO to treasury"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3509"},"issue-3509"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3552"},"pull-3552"),"] Add script-support for the committee hot key"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3532"},"issue-3532"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3556"},"pull-3556"),"] Add script-support for the constitution"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3543"},"issue-3543"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3557"},"pull-3557"),"] Improve the 'new committee' governance action by specifying the members to be replaced, expiration epoch of new members and adding script-support")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/06a283ef.b8b2b1f9.js b/assets/js/06a283ef.b8b2b1f9.js new file mode 100644 index 00000000000..cb7eb0960be --- /dev/null +++ b/assets/js/06a283ef.b8b2b1f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2307],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),l=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return r.createElement(i.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),p=l(n),h=a,m=p["".concat(i,".").concat(h)]||p[h]||u[h]||o;return n?r.createElement(m,s(s({ref:t},d),{},{components:n})):r.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=h;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:a,s[1]=c;for(var l=2;l{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB Sync Team Update",slug:"2022-10-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},s=void 0,c={permalink:"/cardano-updates/2022-10-04-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-04-db-sync.md",source:"@site/blog/2022-10-04-db-sync.md",title:"DB Sync Team Update",description:"DBSync Update",date:"2022-10-04T00:00:00.000Z",formattedDate:"October 4, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB Sync Team Update",slug:"2022-10-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-05-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-04-node-cli-api"}},i={authorsImageUrls:[void 0]},l=[{value:"DBSync Update",id:"dbsync-update",level:2},{value:"Fast restarts",id:"fast-restarts",level:3},{value:"Property based testing",id:"property-based-testing",level:3},{value:"Tech Debt",id:"tech-debt",level:3},{value:"Smash",id:"smash",level:3}],d={toc:l},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"dbsync-update"},"DBSync Update"),(0,a.kt)("h3",{id:"fast-restarts"},"Fast restarts"),(0,a.kt)("p",null," We fixed a long overdue issue in db-sync which caused long delays on restarts\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1266"},"1266"),". This has been\none of db-sync main objectives for this period. Restarts are now very fast,\nbecause db-sync deletes almost nothing from the db, it just replays the ledger rules until it\nreaches the tip of the db. The fix also improves reconnection speed, in cases where the node\nrestarts or the connection is temporarily lost. It also speeds up even more in cases where due to a\ndeployment mess up a very old snapshot or no snapshot at all is used."),(0,a.kt)("h3",{id:"property-based-testing"},"Property based testing"),(0,a.kt)("p",null,"We added stateful property based testing, using ",(0,a.kt)("inlineCode",{parentName:"p"},"quickcheck-state-machine"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1269"},"1269"),". These tests use empty or\nalmost empty blocks to test the new behaviour of restarts and rollbacks."),(0,a.kt)("p",null," These tests generate arbitrarily a list of symbolic commands from these:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"RollForward Int\nRollBack BlockNo\nStopDBSync\nStartDBSync\nRestartNode\nAssertBlockNo BlockNo\n")),(0,a.kt)("p",null,"The commands are translated into real commands. For example ",(0,a.kt)("inlineCode",{parentName:"p"},"RollForward Int")," will forge a new block\nthat fits on the current chain. These real commands are executed against db-sync using the mock\nchain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync\nwhich looks like this:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-haskell"}," Model\n { serverTip :: BlockNo\n , dbSyncTip :: BlockNo\n , dbSynsIsOn :: Bool\n , dbSynsHasSynced :: Bool\n }\n")),(0,a.kt)("p",null,"Finally a number of postconditions are checked, related to the eventual block number of db-sync."),(0,a.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,a.kt)("p",null,"We handled a number of tech debt in\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1275"},"1275"),"\nThis improves the code format of db-sync, deletes many queries that were never used and groups the\nothers. This tech debt resolution not only improves the experience of working in db-sync, but can\nfacilitate some of our other objectives, as it makes it very explicit which queries are used\nduring syncing and which indexes are necessary."),(0,a.kt)("h3",{id:"smash"},"Smash"),(0,a.kt)("p",null,"We worked on fixing an issue related to fetching pool metadata\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1276"},"1276"),".\nThe issue which is described in\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1270"},"1270")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/07541956.2c467b7c.js b/assets/js/07541956.2c467b7c.js new file mode 100644 index 00000000000..4028b49217c --- /dev/null +++ b/assets/js/07541956.2c467b7c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39419],{95884:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/15","page":15,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/14","nextPage":"/cardano-updates/page/16","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/07fdf123.654288cb.js b/assets/js/07fdf123.654288cb.js new file mode 100644 index 00000000000..df9eebb6b25 --- /dev/null +++ b/assets/js/07fdf123.654288cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39439],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=a.createContext({}),p=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(r),m=n,b=d["".concat(i,".").concat(m)]||d[m]||c[m]||l;return r?a.createElement(b,o(o({ref:t},u),{},{components:r})):a.createElement(b,o({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:n,o[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"Node Release Team Update",slug:"2023-01-13-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2023-01-13-release",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-release.md",source:"@site/blog/2023-01-13-release.md",title:"Node Release Team Update",description:"Node Reelease Update",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:.64,hasTruncateMarker:!1,authors:[{name:"Samuel Leathers",title:"Service Reliability Manager",url:"https://github.com/disassembler",imageURL:"https://github.com/disassembler.png",key:"disassembler"}],frontMatter:{title:"Node Release Team Update",slug:"2023-01-13-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-13-hydra"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-01-13-system-test"}},i={authorsImageUrls:[void 0]},p=[{value:"Node Reelease Update",id:"node-reelease-update",level:2},{value:"2022-11-02 - 2023-01-13",id:"2022-11-02---2023-01-13",level:2},{value:"Executive Summary",id:"executive-summary",level:3},{value:"Completed",id:"completed",level:3},{value:"In Progress",id:"in-progress",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"node-reelease-update"},"Node Reelease Update"),(0,n.kt)("h2",{id:"2022-11-02---2023-01-13"},"2022-11-02 - 2023-01-13"),(0,n.kt)("h3",{id:"executive-summary"},"Executive Summary"),(0,n.kt)("p",null,"A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on\n",(0,n.kt)("inlineCode",{parentName:"p"},"release/1.35")," branch and does not bump cardano-ledger."),(0,n.kt)("p",null,"The team successfully integrated an interim release bump of ledger and consensus into cardano-node master.\nThis work will not be released in a node version, but will be continued by the current dependency bump in progress."),(0,n.kt)("p",null,"We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again."),(0,n.kt)("p",null,"The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress."),(0,n.kt)("h3",{id:"completed"},"Completed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/1.35.4"},"Release 1.35.4"))),(0,n.kt)("h3",{id:"in-progress"},"In Progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/commits/release/1.35"},"Release 1.35.5")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.5_rc1/src_docs/source/test_results/node/tag_1_35_5_rc1.rst"},"Test Status"))))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0801ba5a.ebcbb7d6.js b/assets/js/0801ba5a.ebcbb7d6.js new file mode 100644 index 00000000000..ec07cfb339c --- /dev/null +++ b/assets/js/0801ba5a.ebcbb7d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[19644],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(a),d=n,c=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-05-26-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-05-26-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-hydra.md",source:"@site/blog/2023-05-26-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.11,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-05-26-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-26-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-26-ledger"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:s},u="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team accomplished several important tasks. They held their\nmonthly review meeting and drafted the report for May. They made progress on\nimplementing the first end-to-end journey for external commits using "Option A"\nfor normal UTxOs, while still considering "Option B". The team also integrated a\nSpanish translation contributed by the community, created micro-benchmarks for\ntransaction validation and deserialization, and made improvements to\nhydra-node\'s version reporting. Last but not least, they implemented the ability\nto commit multiple UTxOs to a head at once.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Held the monthly review meeting (",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/1_N6b4RDe579TgLawiJzbE0NLofD3ljE6/view"},"recording")," + ",(0,n.kt)("a",{parentName:"li",href:"https://docs.google.com/presentation/d/1anUC3Z1idloyR6uwiSHLZtV6-LQvUcByHPMUgCBOVIA"},"slides"),") & drafted the report for May."),(0,n.kt)("li",{parentName:"ul"},"Have a first end-to-end journey for external commits implementing ","\u201c","Option A","\u201d","\nfor normal UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/887"},"#887")," (still considering ","\u201c","Option B","\u201d",")."),(0,n.kt)("li",{parentName:"ul"},"Integrated the spanish translation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/866"},"#866"),"."),(0,n.kt)("li",{parentName:"ul"},"Created micro-benchmarks for transaction validation and deserialization ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/884"},"#884"),"."),(0,n.kt)("li",{parentName:"ul"},"Improve hydra-node ","\u2013","version reporting on non-released builds ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/849"},"#849")),(0,n.kt)("li",{parentName:"ul"},"Some minor CI improvements following up last weeks changes."),(0,n.kt)("li",{parentName:"ul"},"Allow commit transactions with multiple UTxO ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/774"},"#774"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Investigate and re-open our team-internal head on mainnet."),(0,n.kt)("li",{parentName:"ul"},"Improve and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete external commits with script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),"."),(0,n.kt)("li",{parentName:"ul"},"Authenticate network messages ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"#727"),"."),(0,n.kt)("li",{parentName:"ul"},"Add hydra as tool to developr platform ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/872"},"#872"),".")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/089154c4.cd4dba30.js b/assets/js/089154c4.cd4dba30.js new file mode 100644 index 00000000000..d697bca0f8f --- /dev/null +++ b/assets/js/089154c4.cd4dba30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72344],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},d=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},c="mdxType",s={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,p=t.parentName,d=i(t,["components","mdxType","originalType","parentName"]),c=u(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||o;return a?n.createElement(h,l(l({ref:e},d),{},{components:a})):n.createElement(h,l({ref:e},d))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[c]="string"==typeof t?t:r,l[1]=i;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-11-02-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-11-02-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-node-cli-api.md",source:"@site/blog/2022-11-02-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.265,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-11-02-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-02-ledger"},nextItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2022-11-02-release"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],d={toc:u},c="wrapper";function s(t){let{components:e,...a}=t;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-11-02---2022-11-15"},"2022-11-02 - 2022-11-15"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Documentation improvments"),(0,r.kt)("li",{parentName:"ul"},"Merged community contributions"),(0,r.kt)("li",{parentName:"ul"},"Exposing types from cardano-api requested by the community/other teamss"),(0,r.kt)("li",{parentName:"ul"},"Test output has been improved so diagnosing failures is now easier"),(0,r.kt)("li",{parentName:"ul"},"Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)"),(0,r.kt)("li",{parentName:"ul"},"Refactoring of cardano-testnet making it more useable as a library (ongoing)"),(0,r.kt)("li",{parentName:"ul"},"Release 1.35.4 was merged & released")),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4567"},"Community contributions - doc fixes and spelling errors"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4546"},"Reduce exposed modules in cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4587"},"Add Ord instance for AddressInEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4496"},"Export TxTotalAndReturnCollateralSupportedInEra from Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4635"},"Expose TextEnvelopeCddl from Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4628"},"Expose txScriptValidityToScriptValidity in Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4599"},"export RawBytesHexError"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/2883"},"Add Plutus minting script doc")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4575/files"},"Improve test output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4586"},"Enable stale bot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4557"},"Add link to troubleshooting page in the wiki")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4550"},"Use environment files in Github Actions"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4544"},"Add single entrypoint for starting testnets")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4575"},"Improve cardano-testnet test output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4595"},"Reorder module hierarchy"))),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/08c82b6d.8647aa4f.js b/assets/js/08c82b6d.8647aa4f.js new file mode 100644 index 00000000000..0dc44ac2526 --- /dev/null +++ b/assets/js/08c82b6d.8647aa4f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[81],{7232:a=>{a.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"updates"}')}}]); \ No newline at end of file diff --git a/assets/js/09abc415.e2f175c7.js b/assets/js/09abc415.e2f175c7.js new file mode 100644 index 00000000000..78aeddad631 --- /dev/null +++ b/assets/js/09abc415.e2f175c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[416],{15546:a=>{a.exports=JSON.parse('{"label":"devx","permalink":"/cardano-updates/tags/devx","allTagsPath":"/cardano-updates/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/0a44a251.e62524d6.js b/assets/js/0a44a251.e62524d6.js new file mode 100644 index 00000000000..18f59201b6e --- /dev/null +++ b/assets/js/0a44a251.e62524d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[63565],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-12-14-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-12-14-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-node-cli-api.md",source:"@site/blog/2022-12-14-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.46,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-12-14-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2022-12-14-db-sync"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-12-14-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-12-14---2022-12-27"},"2022-12-14 - 2022-12-27"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped. "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4703"},"Move style guide to wiki"))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4734"},"Cache secp256k1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4717"},"Use cabal-cache")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4699"},"build(deps): bump certifi from 2020.4.5.2 to 2022.12.7 in /doc/.sphinx")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4724"},"Update cabal.project"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4125"},"Add aarch64-darwin to nix-shell"))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4626"},"Improved error message for failed asset name decode")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4700"},"Remove cardano-cli address build-script"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4698"},"Move signing key reading to cardano-api"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4712"},"Only run chairman test on latest era")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4679"},"Add fix and test for ",(0,r.kt)("inlineCode",{parentName:"a"},"foldBlocks")))),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Copyright updates"))),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ade4266.b7cf47d6.js b/assets/js/0ade4266.b7cf47d6.js new file mode 100644 index 00000000000..4b11f3f49cd --- /dev/null +++ b/assets/js/0ade4266.b7cf47d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16227],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(s,".").concat(c)]||d[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-11-17-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-17-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-17-hydra.md",source:"@site/blog/2023-11-17-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-11-17T00:00:00.000Z",formattedDate:"November 17, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.135,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-11-17-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Initial CIP 1694 Security Analysis and Responses",permalink:"/cardano-updates/2023-11-20-cip1694"},nextItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-11-17-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team made several impactful updates. They addressed\nmisleading errors regarding collect com transactions, resolved a security\nadvisory (CVE-2023-42806), and simplified the Hydra Head protocol by using\ninline datums. The team also tackled minor inconsistencies in specifications and\nimplementation, documented reasons for potentially dropped close transactions by\nthe cardano-node, and collaborated with SundaeLabs on an offline mode for\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node"),". Additionally, they engaged in discussions with researchers about\nincremental de-/commits."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Removed misleading errors about collect com transactions ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/839"},"#839")),(0,n.kt)("li",{parentName:"ul"},"Addressed security advisory ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq"},"CVE-2023-42806")," in PR ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1161"},"#1161")),(0,n.kt)("li",{parentName:"ul"},"Changed the head protocol to use inline datums, simplifying things in the hydra-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1162"},"#1162")),(0,n.kt)("li",{parentName:"ul"},"Addressed minor inconsistencies in spec and implementation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1104"},"#1104")),(0,n.kt)("li",{parentName:"ul"},"Documented why close transacations might be dropped by the cardano-node (can","\u2019","t fix) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1039"},"#1039")),(0,n.kt)("li",{parentName:"ul"},"Tidy up a few things here and there"),(0,n.kt)("li",{parentName:"ul"},"Worked with SundaeLabs on the offline mode for ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")),(0,n.kt)("li",{parentName:"ul"},"Discussed incremental de-/commits with researchers")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Start work on incremental decommits protocol specification ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1057"},"#1057")),(0,n.kt)("li",{parentName:"ul"},"Provide support to Hypix"),(0,n.kt)("li",{parentName:"ul"},"Address all ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/labels/bug%20%3Abug%3A"},"open bugs")),(0,n.kt)("li",{parentName:"ul"},"Release version 0.14.0 with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/milestone/14?closed=1"},"this scope")),(0,n.kt)("li",{parentName:"ul"},"Update dependencies to prepare for Conway ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1114"},"#1114")),(0,n.kt)("li",{parentName:"ul"},"Shepherd off-line mode PR over the finish line"),(0,n.kt)("li",{parentName:"ul"},"Complete tidying up chain layer via stateless observation changes in hydra-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1096"},"#1096"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0af81f82.4b115c93.js b/assets/js/0af81f82.4b115c93.js new file mode 100644 index 00000000000..df3b4507f64 --- /dev/null +++ b/assets/js/0af81f82.4b115c93.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[10114],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),s=p(a),c=n,m=s["".concat(u,".").concat(c)]||s[c]||h[c]||l;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=c;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-03-31-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-03-31-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-ledger.md",source:"@site/blog/2023-03-31-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.97,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-03-31-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-31-hydra"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-03-27-system-test"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Support for the next release",id:"support-for-the-next-release",level:3},{value:"Experiments for DRep stake distribution",id:"experiments-for-drep-stake-distribution",level:3},{value:"Technical debt and bug fixes",id:"technical-debt-and-bug-fixes",level:3},{value:"Documentation changes",id:"documentation-changes",level:3}],d={toc:p},s="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We are still heavily involved in work related to preparing the next release.\nThe other main thing we have worked on is experimentation about how we will\nhandle the DRep stake distribution for CIP-1694 in the conway ledger era.\nLastly, we merged a fix for\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4826"},"node-4826"),"\ninto our main branch (there will be a post-mortem shortly)."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"support-for-the-next-release"},"Support for the next release"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3363"},"pull-3363")," - Fix problems relating to Arbitrary instances used by consensus."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3361"},"pull-3361")," - Remove the alonze genesis from the conway genesis."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3360"},"pull-3360")," - Translate bad pointer addresses to valid ones in conway."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3357"},"pull-3357")," - Fix a bug relating to zero valued ADA in the script context."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3356"},"pull-3356")," - Added needed instances (Arbitrary and Serialization) for conway integration."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3345"},"pull-3345")," - Added helper functions for the CLI."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3342"},"pull-3342")," - Fix a bug with a CLI helper function (having to do with deposit tracking).")),(0,n.kt)("h3",{id:"experiments-for-drep-stake-distribution"},"Experiments for DRep stake distribution"),(0,n.kt)("p",null,"Adding another stake distribution to the ledger state presents some new challenges.\nWe would like to be able to use the current stake distribution at the epoch boundary\nfor DRep voting so that people can always vote themselves in time for any proposal.\nTo this end, we have a prototype of an incremental computation based on the incremental\nlambda calculus, together with tests and benchmarks (which are very promising).\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3344"},"pull-3344"),"."),(0,n.kt)("p",null,"Additionally, more of the ledger state is going to need to be rearranged to accomodate\nthe new incremental computations.\nWe have two draft PRs up for possibles solution.\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3353"},"pull-3353")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3364"},"pull-3364"),"."),(0,n.kt)("h3",{id:"technical-debt-and-bug-fixes"},"Technical debt and bug fixes"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3343"},"pull-3343")," - A fix ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/4826"},"node-4826"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3333"},"pull-3333")," - Moving more code out of the shelley packages. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3347"},"pull-3347")," - Bug fix for the multi-asset generators."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3341"},"pull-3341")," - Removal of code duplication.")),(0,n.kt)("h3",{id:"documentation-changes"},"Documentation changes"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3354"},"pull-3354"),' - Rename "optional datums" with "supplemental datums" in the alonzo spec.'),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3352"},"pull-3352")," - Add a section to the Shelly errata about the individual deposit tracking."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3351"},"pull-3351")," - Further clarify the details regarding the script integrity hash."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3350"},"pull-3350")," - Some cleanup of the Babbage spec.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0b0bfceb.29fc63d0.js b/assets/js/0b0bfceb.29fc63d0.js new file mode 100644 index 00000000000..7aabf57d633 --- /dev/null +++ b/assets/js/0b0bfceb.29fc63d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60903],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>h});var r=t(67294);function n(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function o(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var a=1;a=0||(n[t]=e[t]);return n}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var i=r.createContext({}),p=function(e){var a=r.useContext(i),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},c=function(e){var a=p(e.components);return r.createElement(i.Provider,{value:a},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var a=e.children;return r.createElement(r.Fragment,{},a)}},m=r.forwardRef((function(e,a){var t=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),m=n,h=d["".concat(i,".").concat(m)]||d[m]||u[m]||o;return t?r.createElement(h,l(l({ref:a},c),{},{components:t})):r.createElement(h,l({ref:a},c))}));function h(e,a){var t=arguments,n=a&&a.mdxType;if("string"==typeof e||n){var o=t.length,l=new Array(o);l[0]=m;var s={};for(var i in a)hasOwnProperty.call(a,i)&&(s[i]=a[i]);s.originalType=e,s[d]="string"==typeof e?e:n,l[1]=s;for(var p=2;p{t.r(a),t.d(a,{assets:()=>i,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=t(87462),n=(t(67294),t(3905));const o={title:"SRE Team Update",slug:"2023-10-13-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,s={permalink:"/cardano-updates/2023-10-13-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-sre.md",source:"@site/blog/2023-10-13-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-10-13T00:00:00.000Z",formattedDate:"October 13, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:2.595,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-10-13-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-10-13-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-11-mithril"}},i={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Sanchonet-demo",id:"sanchonet-demo",level:3}],c={toc:p},d="wrapper";function u(e){let{components:a,...t}=e;return(0,n.kt)(d,(0,r.Z)({},c,t,{components:a,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet environment was updated to 8.5.0-pre."),(0,n.kt)("li",{parentName:"ul"},"Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Various improvements and fixes including:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Add GHA cron schedule"),(0,n.kt)("li",{parentName:"ul"},"Add nix auto-gc to avoid running out of storage during large package set builds"),(0,n.kt)("li",{parentName:"ul"},"Add new packages to capkgs"),(0,n.kt)("li",{parentName:"ul"},"Reduce runner storage requirement leaving more room for builds"),(0,n.kt)("li",{parentName:"ul"},"Restructure capkgs attribute names to avoid package name collisions"),(0,n.kt)("li",{parentName:"ul"},"Return to non-musl builds for cardano packages to retain journald compatability"),(0,n.kt)("li",{parentName:"ul"},"Update cache usage to from file level to folder level to reduce network and latency overhead"),(0,n.kt)("li",{parentName:"ul"},"Commit diff: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/a274b72...b197e22"},"capkgs-compare"))))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/16"},"cardano-parts-pull-16")),(0,n.kt)("li",{parentName:"ul"},"Dbsync, smash, faucet and more: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/15"},"cardano-parts-pull-15"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes"),(0,n.kt)("li",{parentName:"ul"},"Adds nginx vhost metrics exporter profile"),(0,n.kt)("li",{parentName:"ul"},"Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down"),(0,n.kt)("li",{parentName:"ul"},"Adds bash *-ng autocompletion compatible wrappers"),(0,n.kt)("li",{parentName:"ul"},"Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview"),(0,n.kt)("li",{parentName:"ul"},"Adds downstream grafana cloud dashboard as templates"),(0,n.kt)("li",{parentName:"ul"},"Adds downstream grafana cloud alerts as templates"),(0,n.kt)("li",{parentName:"ul"},"Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish"),(0,n.kt)("li",{parentName:"ul"},"Updates the basic profile with IOG cache and commonly used bins"),(0,n.kt)("li",{parentName:"ul"},"Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning"),(0,n.kt)("li",{parentName:"ul"},"Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks"),(0,n.kt)("li",{parentName:"ul"},"Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets"),(0,n.kt)("li",{parentName:"ul"},"Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration"),(0,n.kt)("li",{parentName:"ul"},"Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion"),(0,n.kt)("li",{parentName:"ul"},"Updates the colmena template with dbsync, smash, faucet machines profiles and roles"),(0,n.kt)("li",{parentName:"ul"},"Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns"),(0,n.kt)("li",{parentName:"ul"},"Bumps capkgs node-ng to 8.5.0-pre")))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Dbsync, smash, faucet and more: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/3"},"cardano-playground-pull-3"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview"),(0,n.kt)("li",{parentName:"ul"},"Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts"),(0,n.kt)("li",{parentName:"ul"},"Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change"),(0,n.kt)("li",{parentName:"ul"},"Optimizes machine sizes"),(0,n.kt)("li",{parentName:"ul"},"Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets"),(0,n.kt)("li",{parentName:"ul"},"Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion"),(0,n.kt)("li",{parentName:"ul"},"Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning"),(0,n.kt)("li",{parentName:"ul"},"Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration")))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update sanchonet network to cardano-node 8.5.0: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/c8a480fa7cdb6eff4f8b4565450c57361ddfdec4"},"cardano-world-commit"))),(0,n.kt)("h3",{id:"sanchonet-demo"},"Sanchonet-demo"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo/commit/4124465c0c663d11c8cf4ef80af18a5246f89b31"},"sanchonet-demo-commit"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0b1b72af.a3f1baa4.js b/assets/js/0b1b72af.a3f1baa4.js new file mode 100644 index 00000000000..998e858da3f --- /dev/null +++ b/assets/js/0b1b72af.a3f1baa4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26276],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=s(r),h=n,g=m["".concat(u,".").concat(h)]||m[h]||c[h]||i;return r?a.createElement(g,l(l({ref:t},p),{},{components:r})):a.createElement(g,l({ref:t},p))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=h;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[m]="string"==typeof e?e:n,l[1]=o;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2022-12-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2022-12-09-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-crypto.md",source:"@site/blog/2022-12-09-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2022-12-09T00:00:00.000Z",formattedDate:"December 9, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.39,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-12-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-12-12-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-09-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"MuSig2",id:"musig2",level:3},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:2}],p={toc:s},m="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The four open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency. "),(0,n.kt)("li",{parentName:"ul"},"Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe. "),(0,n.kt)("li",{parentName:"ul"},"cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"[Still in progress]"," We are introducing a more granular error handling mechanism ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/33"},"PR#33")),(0,n.kt)("li",{parentName:"ul"},"We merged the API redesig ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/35"},"PR#35")),(0,n.kt)("li",{parentName:"ul"},"We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/36"},"PR#36"))),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We merged the individual signature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/620"},"PR#620")),(0,n.kt)("li",{parentName:"ul"},"We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes/commits/master"},"kes repo"),") ")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Nothing new to report. Still working in merging these PRs. "),(0,n.kt)("li",{parentName:"ul"},"We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a ",(0,n.kt)("a",{parentName:"li",href:"https://gitlab.haskell.org/ghc/ghc/-/issues/22564"},"bug in GHC"))),(0,n.kt)("h2",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We keep progressing in the secure forgetting PR and resolving some bugs on memory handling ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"PR#255")),(0,n.kt)("li",{parentName:"ul"},"Fixed a 'use-after-free' bug in the KES agent.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0b5e25e7.c75d5f30.js b/assets/js/0b5e25e7.c75d5f30.js new file mode 100644 index 00000000000..adf2a114d9f --- /dev/null +++ b/assets/js/0b5e25e7.c75d5f30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23621],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),d=o,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||a;return n?r.createElement(h,s(s({ref:t},p),{},{components:n})):r.createElement(h,s({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-11-01-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-11-01-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-01-consensus.md",source:"@site/blog/2023-11-01-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-11-01T00:00:00.000Z",formattedDate:"November 1, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.44,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-11-01-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-08-mithril"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-01-mithril"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2}],p={toc:l},c="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"This week the Consensus team made progress on two fronts: the question of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/422"},"survivable eclipse duration"),", which is part of our work ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/427"},"supporting Genesis delivery"),", and how to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4251"},"improve the handling of blocks from the future"),".\nRegarding the UTxO-HD branch, we managed to run a node with ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"legacy blocks"),", which is syncing with mainnet, up to including Alonzo.\nWe also ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/465#issuecomment-1788685122"},"investigated")," a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0c10bcf4.c8aa7ca2.js b/assets/js/0c10bcf4.c8aa7ca2.js new file mode 100644 index 00000000000..c86a466fe87 --- /dev/null +++ b/assets/js/0c10bcf4.c8aa7ca2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72872],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),u=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=u(a),m=n,c=h["".concat(s,".").concat(m)]||h[m]||d[m]||i;return a?r.createElement(c,o(o({ref:t},p),{},{components:a})):r.createElement(c,o({ref:t},p))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-05-19-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-19-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-19-hydra.md",source:"@site/blog/2023-05-19-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-05-19T00:00:00.000Z",formattedDate:"May 19, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.045,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-05-19-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-24-node-cli-api"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-17-consensus"}},s={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:u},h="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the "Coding Standards" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete validation of timed transactions feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/196"},"#196"),"."),(0,n.kt)("li",{parentName:"ul"},"Write ","\u201c","ops","\u201d"," instructions and troubleshooting ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/569"},"#569")," and improve logs."),(0,n.kt)("li",{parentName:"ul"},"Remove ",(0,n.kt)("inlineCode",{parentName:"li"},"--ledger-genesis")," argument to hydra-node options ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/863"},"#863"),"."),(0,n.kt)("li",{parentName:"ul"},"Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/877"},"#877"),"."),(0,n.kt)("li",{parentName:"ul"},"Use nix to build test binaries to increase CI speed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/867"},"#867"),"."),(0,n.kt)("li",{parentName:"ul"},"Updated our ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/wiki/Coding-Standards"},"Coding Standards"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting."),(0,n.kt)("li",{parentName:"ul"},'Have a first end-to-end journey for external commits implementing "Option A" ',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),"."),(0,n.kt)("li",{parentName:"ul"},"Integrate spanish translation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/866"},"#866"),"."),(0,n.kt)("li",{parentName:"ul"},"Improve and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"),"."),(0,n.kt)("li",{parentName:"ul"},"Allow commit transactions with multiple UTxO ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/774"},"#774"),"."),(0,n.kt)("li",{parentName:"ul"},"Explored stateless observation and refined hydra explorer ticket ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/696"},"#696"),".")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0c11045c.7ecdd83c.js b/assets/js/0c11045c.7ecdd83c.js new file mode 100644 index 00000000000..d2d3233f423 --- /dev/null +++ b/assets/js/0c11045c.7ecdd83c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39745],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(r),m=a,g=d["".concat(p,".").concat(m)]||d[m]||u[m]||o;return r?n.createElement(g,i(i({ref:t},c),{},{components:r})):n.createElement(g,i({ref:t},c))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-02-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-03-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-goedel.md",source:"@site/blog/2023-02-03-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-02-03T00:00:00.000Z",formattedDate:"February 3, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.57,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-02-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-03-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-03-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This sprint the team has been preparing several papers for peer review\nand knowledge sharing and consulting within IO and the community."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"R&D Seminar on experience participating in a member based organisation"),(0,a.kt)("li",{parentName:"ul"},"Full day tutorial on performance engineering presented at HiPEAC\n2023 conference"),(0,a.kt)("li",{parentName:"ul"},"Finished preparing and submitted a paper on performance engineering\nto an ACM workshop"),(0,a.kt)("li",{parentName:"ul"},"Preparing a draft paper for future submission about verifying design\nrefinements for distributed system design"),(0,a.kt)("li",{parentName:"ul"},"Consulting on performance design of other IO projects")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0c48efb1.01a06fce.js b/assets/js/0c48efb1.01a06fce.js new file mode 100644 index 00000000000..3f334329590 --- /dev/null +++ b/assets/js/0c48efb1.01a06fce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[41794],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var c=r.createContext({}),u=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),s=u(a),h=n,m=s["".concat(c,".").concat(h)]||s[h]||d[h]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-02-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-17-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-hydra.md",source:"@site/blog/2023-02-17-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.75,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-17-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-17-ledger"}},c={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:u},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team completed work on dealing differently with contests\nduring the contestation period. These will now always push out the deadline and\nhence contestation periods are easier to pick (depending on the network a Head\nruns on). Furthermore, they added an important acceptance test and completed\ninternal refactoring of the protocol logic making future changes easier."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Push contestation deadline on each contest ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/716"},"#716")),(0,n.kt)("li",{parentName:"ul"},"Wrote an acceptance (property) test ","\u201c","can always close/fanout when collect is successful","\u201d"),(0,n.kt)("li",{parentName:"ul"},"Internal refactoring of our ",(0,n.kt)("inlineCode",{parentName:"li"},"HeadLogic")),(0,n.kt)("li",{parentName:"ul"},"Groomed remaining things from ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/452"},"#452")," into dedicated features")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete full minting policy ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/720"},"#720")),(0,n.kt)("li",{parentName:"ul"},"Release 0.9.0 with updated scripts"),(0,n.kt)("li",{parentName:"ul"},"Plan mainnet milestone and a 0.10.0 version"),(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs for specification (upon feedback)"),(0,n.kt)("li",{parentName:"ul"},"Have smoke tests fixed and running regularly")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0d671897.dc5836f3.js b/assets/js/0d671897.dc5836f3.js new file mode 100644 index 00000000000..3f6b888392a --- /dev/null +++ b/assets/js/0d671897.dc5836f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29059],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,h=u["".concat(l,".").concat(d)]||u[d]||m[d]||i;return n?r.createElement(h,o(o({ref:t},p),{},{components:n})):r.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={title:"DB Sync Team Update",slug:"2022-11-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2022-11-01-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-01-db-sync.md",source:"@site/blog/2022-11-01-db-sync.md",title:"DB Sync Team Update",description:"High level summary",date:"2022-11-01T00:00:00.000Z",formattedDate:"November 1, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.86,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB Sync Team Update",slug:"2022-11-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-11-02-system-test"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-28-hydra"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Schema simplifications",id:"schema-simplifications",level:3},{value:"Performance",id:"performance",level:3},{value:"Migrations and resyncing",id:"migrations-and-resyncing",level:3},{value:"Release",id:"release",level:3}],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DBSync team is preparing a release which introduces schema simplifications, removes indexes,\nunique and foreign keys. It also provides a way to fix older values and migrates without the need to\nresync from genesis."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("h3",{id:"schema-simplifications"},"Schema simplifications"),(0,a.kt)("p",null,"Indexes, Unique and Foreign keys are removed in order to speedup syncing\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1295"},"#1295"),"\nThe same pr also introduces a different way to rollback, which doesn't rely on foreign keys and\nindexes."),(0,a.kt)("h3",{id:"performance"},"Performance"),(0,a.kt)("p",null,"The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A\nconservative number of these will be included in the next release and the rest can be found in\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/52/views/7"},"performance view"),"."),(0,a.kt)("h3",{id:"migrations-and-resyncing"},"Migrations and resyncing"),(0,a.kt)("p",null,"The next release will be 13.1.0, it will enable a migration without the need to resync. It will also\nintroduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1294"},"#1294")),(0,a.kt)("h3",{id:"release"},"Release"),(0,a.kt)("p",null,"The release has been mostly cherry-picked from master\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1294"},"#1294")," and its scope can be seen\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/52/views/6"},"release view")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0d7612e9.c2555544.js b/assets/js/0d7612e9.c2555544.js new file mode 100644 index 00000000000..562b954f71e --- /dev/null +++ b/assets/js/0d7612e9.c2555544.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95739],{1844:a=>{a.exports=JSON.parse('{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync","allTagsPath":"/cardano-updates/tags","count":14}')}}]); \ No newline at end of file diff --git a/assets/js/0d889cfb.7f793126.js b/assets/js/0d889cfb.7f793126.js new file mode 100644 index 00000000000..ba726f70298 --- /dev/null +++ b/assets/js/0d889cfb.7f793126.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27237],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,c=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-17-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-hydra.md",source:"@site/blog/2023-03-17-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-17T00:00:00.000Z",formattedDate:"March 17, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.015,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-17-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-17-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has continued work on the mainnet compatibility of the\nhydra-node. They added a golden test suite for ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts, added\nsome detection of ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," misconfiguration, established a limit of 100 ADA\nper commit and other smaller tasks to prepare for a mainnet beta release."),(0,n.kt)("p",null,"Next week there will be a small team workshop to push for demonstrating a Hydra\nHead on the Cardano mainnet, ideally just in time for the monthly review\nmeeting. See the hydra channels on the IOG Technical Community discord server\nfor details."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement a 100 ADA hard-coded commit limit in the hydra-node\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/763"},"#763")),(0,n.kt)("li",{parentName:"ul"},"Pay back funds to faucet after smoke-test run\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/773"},"#773")),(0,n.kt)("li",{parentName:"ul"},"Setup custom github runner for smoke-tests on mainnet\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/775"},"#775")),(0,n.kt)("li",{parentName:"ul"},"Created golden tests to assure the script hash stays the same between\nchanges ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/772"},"#772")),(0,n.kt)("li",{parentName:"ul"},"Removed hardcoded error codes in plutus scripts\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/768"},"#768")),(0,n.kt)("li",{parentName:"ul"},"Detect misconfiguration of a hydra-node given persistent state\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/767"},"#767")),(0,n.kt)("li",{parentName:"ul"},"Met with potential users for hydra-pay"),(0,n.kt)("li",{parentName:"ul"},"Prepared hydra workshop")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hydra monthly meeting"),(0,n.kt)("li",{parentName:"ul"},"Open a multi-party head on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0db650db.bac77798.js b/assets/js/0db650db.bac77798.js new file mode 100644 index 00000000000..0a623c57a25 --- /dev/null +++ b/assets/js/0db650db.bac77798.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[74607],{3905:(t,e,n)=>{n.d(e,{Zo:()=>p,kt:()=>d});var a=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,a)}return n}function l(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var u=a.createContext({}),s=function(t){var e=a.useContext(u),n=e;return t&&(n="function"==typeof t?t(e):l(l({},e),t)),n},p=function(t){var e=s(t.components);return a.createElement(u.Provider,{value:e},t.children)},m="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},h=a.forwardRef((function(t,e){var n=t.components,r=t.mdxType,o=t.originalType,u=t.parentName,p=i(t,["components","mdxType","originalType","parentName"]),m=s(n),h=r,d=m["".concat(u,".").concat(h)]||m[h]||c[h]||o;return n?a.createElement(d,l(l({ref:e},p),{},{components:n})):a.createElement(d,l({ref:e},p))}));function d(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=n.length,l=new Array(o);l[0]=h;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i[m]="string"==typeof t?t:r,l[1]=i;for(var s=2;s{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-03-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-22-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-consensus.md",source:"@site/blog/2023-03-22-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-03-22T00:00:00.000Z",formattedDate:"March 22, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.63,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-03-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-23-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-22-node-cli-api"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low-level details",id:"low-level-details",level:2}],p={toc:s},m="wrapper";function c(t){let{components:e,...n}=t;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This week the consensus team continued working on the refactoring of the UTxO HD\nprototype, and design and testing of Genesis. We also extracted the ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-sim"),"\npackage, which provides a file-system abstraction layer that can be used for\ntesting and simulation. This makes the Consensus code base smaller, while\nproviding a package that the community can reuse and contribute to. We also\nfixed a failing property test related to iterators. We are also working on\nmempool and VRF improvements."),(0,r.kt)("h2",{id:"low-level-details"},"Low-level details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Extraction of ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim")," code from ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-network"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4425"},"https://github.com/input-output-hk/ouroboros-network/pull/4425")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/1"},"https://github.com/input-output-hk/fs-sim/pull/1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/2"},"https://github.com/input-output-hk/fs-sim/pull/2")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4460"},"https://github.com/input-output-hk/ouroboros-network/pull/4460")))),(0,r.kt)("li",{parentName:"ul"},"Smaller changes in ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim")," code (some required by ",(0,r.kt)("inlineCode",{parentName:"li"},"UTxO-HD"),"):",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/5"},"https://github.com/input-output-hk/fs-sim/pull/5")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/6"},"https://github.com/input-output-hk/fs-sim/pull/6")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/7"},"https://github.com/input-output-hk/fs-sim/pull/7")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/8"},"https://github.com/input-output-hk/fs-sim/pull/8")))),(0,r.kt)("li",{parentName:"ul"},"Released cardano-lmdb-simple-0.6.0.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/20"},"https://github.com/input-output-hk/lmdb-simple/pull/20")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/150"},"https://github.com/input-output-hk/cardano-haskell-packages/pull/150"))))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0dc0e43e.00835288.js b/assets/js/0dc0e43e.00835288.js new file mode 100644 index 00000000000..6f7da5a995b --- /dev/null +++ b/assets/js/0dc0e43e.00835288.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29614],{67195:a=>{a.exports=JSON.parse('{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing","allTagsPath":"/cardano-updates/tags","count":25}')}}]); \ No newline at end of file diff --git a/assets/js/0de82e28.ff3d9525.js b/assets/js/0de82e28.ff3d9525.js new file mode 100644 index 00000000000..9ab23bcb2d4 --- /dev/null +++ b/assets/js/0de82e28.ff3d9525.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[66743],{37624:a=>{a.exports=JSON.parse('{"title":"Tutorial - Extras","slug":"/category/tutorial---extras","permalink":"/cardano-updates/docs/category/tutorial---extras","navigation":{"previous":{"title":"Congratulations!","permalink":"/cardano-updates/docs/tutorial-basics/congratulations"},"next":{"title":"Manage Docs Versions","permalink":"/cardano-updates/docs/tutorial-extras/manage-docs-versions"}}}')}}]); \ No newline at end of file diff --git a/assets/js/0dea9a3b.e1158297.js b/assets/js/0dea9a3b.e1158297.js new file mode 100644 index 00000000000..566fe9ede47 --- /dev/null +++ b/assets/js/0dea9a3b.e1158297.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4910],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(r),h=a,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||o;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=h;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:a,i[1]=p;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Open-Source Update",slug:"2023-01-13-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/quarterly/2023-01-13-open-source",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-13-open-source.md",source:"@site/quarterly/2023-01-13-open-source.md",title:"Open-Source Update",description:"Open Source Quarterly Update",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"open-source",permalink:"/cardano-updates/quarterly/tags/open-source"}],readingTime:2.215,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Open-Source Update",slug:"2023-01-13-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},prevItem:{title:"Network Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-13-network"},nextItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2022-11-15-consensus"}},l={authorsImageUrls:[void 0]},s=[{value:"Open Source Quarterly Update",id:"open-source-quarterly-update",level:2},{value:"2022-11 - 2023-01",id:"2022-11---2023-01",level:2},{value:"Summary",id:"summary",level:3},{value:"Detailed log",id:"detailed-log",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"open-source-quarterly-update"},"Open Source Quarterly Update"),(0,a.kt)("h2",{id:"2022-11---2023-01"},"2022-11 - 2023-01"),(0,a.kt)("h3",{id:"summary"},"Summary"),(0,a.kt)("p",null,"In the last quarter the open-source initiative delivered a comprehensive report\non the state of our repositories. As part of this work stream we\nidentified the key open-source repositories for the cardano project across all\nthe projects From a list of more than 500 repositories (some of which are\nforks) we identified key repositories which constitute the core of Cardano.\n20 of them were identified as to be transferred to the future MBO which will\ngovern Cardano development. Some where excluded (like ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim"},(0,a.kt)("inlineCode",{parentName:"a"},"io-sim"))," and\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols"},(0,a.kt)("inlineCode",{parentName:"a"},"typed-protocols")),"), to be govern by IOG, since they have a much broader\napplication than Cardano itself, and thus we think their open-source future\nwill be better outside of the Cardano umbrella."),(0,a.kt)("p",null,"Christian Taylor identified a number of ways we can improve our repositories to\nmake them more attractive for open-source contributions by analysing each of\nthem. This includes adding or improving various documentation files, like\n",(0,a.kt)("inlineCode",{parentName:"p"},"CONTRIBUTING")," files, adding code of conduct, improving readme files, issue\n& pull request templates etc. Christian also computed various interesting\nmetrics which gives a very good insight into the development practices: e.g.\naverage merge ratio, average number of reviews, comments and many more! The\npresentation is available ",(0,a.kt)("a",{parentName:"p",href:"https://docs.google.com/presentation/d/127IFEavlrZeeoFrVXFYWzSt0ugOkSL7isxjyM1vmMzQ"},"here"),"."),(0,a.kt)("p",null,"We followed with work on the ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},"Cardano Engineering Handbook"),". We included\na standard code of conduct which is now used by most important projects in the\nCardano space. We included ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),"'s security policy and added\na responsible disclosure policy. We also described how roles and\nresponsibilities should be clarified. This progress was made by\na collaborative effort of the Cardano Core, Plutus and Architecture teams, and\nit wouldn't be possible without Michael Peyton Jones, Arnaud Bailly, Kevin\nHammond, Jared Corduan and Marcin Szamotulski."),(0,a.kt)("p",null,"We also improved the documentation of key repositories, by adding description,\nimproving their ",(0,a.kt)("inlineCode",{parentName:"p"},"README")," file & ",(0,a.kt)("inlineCode",{parentName:"p"},"CONTRIBUTING")," files, adding code of conducts\nfollowing the ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},"Cardano Engineering Handbook"),". This includes improvements to:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network"},(0,a.kt)("inlineCode",{parentName:"a"},"ouroboros-network"))," (both ",(0,a.kt)("inlineCode",{parentName:"li"},"network")," & ",(0,a.kt)("inlineCode",{parentName:"li"},"consensus"),")"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger"},(0,a.kt)("inlineCode",{parentName:"a"},"cardano-ledger"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node"},(0,a.kt)("inlineCode",{parentName:"a"},"cardano-node")))),(0,a.kt)("p",null,"And also"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim"},(0,a.kt)("inlineCode",{parentName:"a"},"io-sim"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols"},(0,a.kt)("inlineCode",{parentName:"a"},"typed-protocols"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-prelude"},(0,a.kt)("inlineCode",{parentName:"a"},"cardano-prelude"))," (work in progress)")),(0,a.kt)("p",null,"The work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan. "),(0,a.kt)("p",null,"In this quarter we also identified a number of projects which can be published to\n",(0,a.kt)("inlineCode",{parentName:"p"},"Hackage")," (Haskell's package repository) or ",(0,a.kt)("inlineCode",{parentName:"p"},"crate")," (Rust package repository).\nThe list contains 21 packages, 2 of which (",(0,a.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/hedgehog-extras"},(0,a.kt)("inlineCode",{parentName:"a"},"hedgehog-extras"))," and\n",(0,a.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/quickcheck-dynamic"},(0,a.kt)("inlineCode",{parentName:"a"},"quickcheck-dynamic")),") are already published on Hackage and another 5 (from\nthe ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim"},(0,a.kt)("inlineCode",{parentName:"a"},"io-sim"))," repository) are close to be published."),(0,a.kt)("h3",{id:"detailed-log"},"Detailed log"),(0,a.kt)("p",null,"The progress of the open-source project is tracked in ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/60/views/1"},"this project"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0dfea636.45223f2a.js b/assets/js/0dfea636.45223f2a.js new file mode 100644 index 00000000000..c09fc4aab82 --- /dev/null +++ b/assets/js/0dfea636.45223f2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21200],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||o;return n?r.createElement(h,i(i({ref:t},s),{},{components:n})):r.createElement(h,i({ref:t},s))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-07-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-04-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-04-db-sync.md",source:"@site/blog/2023-07-04-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-07-04T00:00:00.000Z",formattedDate:"July 4, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.73,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-07-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-07-06-developer-experience"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-04-node-cli-api"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],s={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We've made progress in all high level objectives"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CIP-1694 integration design"),(0,a.kt)("li",{parentName:"ul"},"UTxO-HD integration proof of concept"),(0,a.kt)("li",{parentName:"ul"},"schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested"),(0,a.kt)("li",{parentName:"ul"},"Many devx issues resolved")),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We have improved and validated the design for the Conway integration in db-sync"),(0,a.kt)("li",{parentName:"ul"},"Improved the initial integration of the UTxO-HD feauture branches which are under test"),(0,a.kt)("li",{parentName:"ul"},"Prepared a new release 13.1.1.3 which supports node 8.1.1\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1455"},"#1455"),"."),(0,a.kt)("li",{parentName:"ul"},"This also fixes a bug\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1451"},"#1451")),(0,a.kt)("li",{parentName:"ul"},"Added new tests to the new tx_out options\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1429"},"#1429")),(0,a.kt)("li",{parentName:"ul"},"Fixed a chronic issue in db-sync related to exception handling and concurrency\nThis fixes many other issues and simplifies the logic in db-sync\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1447"},"#1447")),(0,a.kt)("li",{parentName:"ul"},"A number of fixes and improvements in ci, docker, devx, docs\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1436"},"#1436"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1442"},"#1442"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1448"},"#1448"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1452"},"#1452"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e0c98f4.b615e9a6.js b/assets/js/0e0c98f4.b615e9a6.js new file mode 100644 index 00000000000..60fdd49ced4 --- /dev/null +++ b/assets/js/0e0c98f4.b615e9a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60280],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>k});var r=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function i(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var p=r.createContext({}),l=function(e){var t=r.useContext(p),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(o),h=n,k=c["".concat(p,".").concat(h)]||c[h]||d[h]||a;return o?r.createElement(k,i(i({ref:t},u),{},{components:o})):r.createElement(k,i({ref:t},u))}));function k(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:n,i[1]=s;for(var l=2;l{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=o(87462),n=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-08-18-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-08-18-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-network.md",source:"@site/blog/2023-08-18-network.md",title:"Network Team Update",description:"High-level overview of sprint 42",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.09,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-08-18-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-18-ledger"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-18-sre"}},p={authorsImageUrls:[void 0]},l=[{value:"High-level overview of sprint 42",id:"high-level-overview-of-sprint-42",level:2},{value:"Eclipse Evasion",id:"eclipse-evasion",level:3},{value:"CDDL specs for protocol codecs",id:"cddl-specs-for-protocol-codecs",level:3},{value:"Ouroboros-Network-Framework API changes",id:"ouroboros-network-framework-api-changes",level:3},{value:"Nix setup (CI)",id:"nix-setup-ci",level:3},{value:"Other contributions",id:"other-contributions",level:2},{value:"Cardano Network Service Assurance",id:"cardano-network-service-assurance",level:3},{value:"Galois Review",id:"galois-review",level:3},{value:"CI",id:"ci",level:3},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3}],u={toc:l},c="wrapper";function d(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-42"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+42%22"},"sprint 42")),(0,n.kt)("h3",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,n.kt)("p",null,"We merged and released a new version of the ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," package (version\n",(0,n.kt)("inlineCode",{parentName:"p"},"0.9.0.0"),") which includes ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"big ledger peers feature"),".\nThis is the primary peer selection mechanism to defend against eclipses. We\nalso prepared a PR to updated ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/165"},(0,n.kt)("inlineCode",{parentName:"a"},"ouroboros-cosnensus")),"\nand ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ekg-forward/pull/30"},(0,n.kt)("inlineCode",{parentName:"a"},"ekg-forward"))," packages."),(0,n.kt)("h3",{id:"cddl-specs-for-protocol-codecs"},"CDDL specs for protocol codecs"),(0,n.kt)("p",null,"We made the ",(0,n.kt)("inlineCode",{parentName:"p"},"cddl")," spec for network codec more inline with the implementation\nwhich is highly polymorphic. ",(0,n.kt)("inlineCode",{parentName:"p"},"cddl")," doesn't have the notion of polymorphism,\nbut has ",(0,n.kt)("inlineCode",{parentName:"p"},"any")," which can generate any valid cbor term. We matched it with an\n",(0,n.kt)("inlineCode",{parentName:"p"},"Any")," type on the Haskell side and made all remaining tests & specs use it.\nThis simplified the specifications and made it easier to understand which parts\nare defined in the spec, and which parts are left unspecified. See\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4595"},"ouroboros-network#4595"),"."),(0,n.kt)("h3",{id:"ouroboros-network-framework-api-changes"},"Ouroboros-Network-Framework API changes"),(0,n.kt)("p",null,"We also released ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network-framework")," and other network components.\nThe ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network-framework")," package contains a redesign of API exposed to\n",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),". We consolidated, cleaned it and made it easier to\nextend in the future if there will be new arguments that need to be passed to\nmini-protocol initiator and responders which comes from the low-level network\nlayer."),(0,n.kt)("h3",{id:"nix-setup-ci"},"Nix setup (CI)"),(0,n.kt)("p",null,"We also made a major review of our ",(0,n.kt)("inlineCode",{parentName:"p"},"nix")," setup. With help from our DevX team\nwe ended up with a clean ",(0,n.kt)("inlineCode",{parentName:"p"},"flake.nix")," file which can:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"compile & test the code on ",(0,n.kt)("inlineCode",{parentName:"li"},"x86_64-linux"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"x86_64-darwin")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"aarch64-darwin")),(0,n.kt)("li",{parentName:"ul"},"cross-compile to ",(0,n.kt)("inlineCode",{parentName:"li"},"Windows")," on ",(0,n.kt)("inlineCode",{parentName:"li"},"x86_64-linux")," ")),(0,n.kt)("p",null,"And provides a shell which contains all the build tools, including ",(0,n.kt)("inlineCode",{parentName:"p"},"ghc-9.6"),",\n",(0,n.kt)("inlineCode",{parentName:"p"},"hls"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"cddl"),", and more. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4640"},"ouroboros-network#4640"),",\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4643"},"ouroboros-network#4643"),"."),(0,n.kt)("h2",{id:"other-contributions"},"Other contributions"),(0,n.kt)("h3",{id:"cardano-network-service-assurance"},"Cardano Network Service Assurance"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The work and writeup in finishing up the CNSA, first stage (first\ncontract)."),(0,n.kt)("li",{parentName:"ul"},"Getting Sam Cowger (Galois Inc) up to speed."),(0,n.kt)("li",{parentName:"ul"},"The IOG Networking team carried a reivew of CNSA project progress: a limitted\ncode & design review.")),(0,n.kt)("h3",{id:"galois-review"},"Galois Review"),(0,n.kt)("p",null,"Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3832"},"ouroboros-network#3832"),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3834"},"ouroboros-network#3834"),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3835"},"ouroboros-network#3835"),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3836"},"ouroboros-network#3836"),";")),(0,n.kt)("p",null,"scoping, requirements, and getting started."),(0,n.kt)("h3",{id:"ci"},"CI"),(0,n.kt)("p",null,"We added a nightly run for GitHub actions and made the GitHub actions test be\nexecuted with extra concurrency ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4637"},"ouroboros-network#4637"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4649"},"ouroboros-network#4649"),"."),(0,n.kt)("p",null,"We also added GitHub's dependabot ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4650"},"ouroboros-network#4650"),"."),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We settled on implementation design of bootstrap peers which is being\nimplemented, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4615"},"ouroboros-network#4615"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.2cd17c73.js b/assets/js/0e384e19.2cd17c73.js new file mode 100644 index 00000000000..9ffcc94ded0 --- /dev/null +++ b/assets/js/0e384e19.2cd17c73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59671],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,y=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(y,l(l({ref:t},c),{},{components:r})):n.createElement(y,l({ref:t},c))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={sidebar_position:1},l="Tutorial Intro",i={unversionedId:"intro",id:"intro",title:"Tutorial Intro",description:"Let's discover Docusaurus in less than 5 minutes.",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/cardano-updates/docs/intro",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"defaultSidebar",next:{title:"Tutorial - Basics",permalink:"/cardano-updates/docs/category/tutorial---basics"}},s={},u=[{value:"Getting Started",id:"getting-started",level:2},{value:"What you'll need",id:"what-youll-need",level:3},{value:"Generate a new site",id:"generate-a-new-site",level:2},{value:"Start your site",id:"start-your-site",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"tutorial-intro"},"Tutorial Intro"),(0,a.kt)("p",null,"Let's discover ",(0,a.kt)("strong",{parentName:"p"},"Docusaurus in less than 5 minutes"),"."),(0,a.kt)("h2",{id:"getting-started"},"Getting Started"),(0,a.kt)("p",null,"Get started by ",(0,a.kt)("strong",{parentName:"p"},"creating a new site"),"."),(0,a.kt)("p",null,"Or ",(0,a.kt)("strong",{parentName:"p"},"try Docusaurus immediately")," with ",(0,a.kt)("strong",{parentName:"p"},(0,a.kt)("a",{parentName:"strong",href:"https://docusaurus.new"},"docusaurus.new")),"."),(0,a.kt)("h3",{id:"what-youll-need"},"What you'll need"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://nodejs.org/en/download/"},"Node.js")," version 16.14 or above:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"When installing Node.js, you are recommended to check all checkboxes related to dependencies.")))),(0,a.kt)("h2",{id:"generate-a-new-site"},"Generate a new site"),(0,a.kt)("p",null,"Generate a new Docusaurus site using the ",(0,a.kt)("strong",{parentName:"p"},"classic template"),"."),(0,a.kt)("p",null,"The classic template will automatically be added to your project after you run the command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npm init docusaurus@latest my-website classic\n")),(0,a.kt)("p",null,"You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor."),(0,a.kt)("p",null,"The command also installs all necessary dependencies you need to run Docusaurus."),(0,a.kt)("h2",{id:"start-your-site"},"Start your site"),(0,a.kt)("p",null,"Run the development server:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"cd my-website\nnpm run start\n")),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"cd")," command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there."),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"npm run start")," command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/."),(0,a.kt)("p",null,"Open ",(0,a.kt)("inlineCode",{parentName:"p"},"docs/intro.md")," (this page) and edit some lines: the site ",(0,a.kt)("strong",{parentName:"p"},"reloads automatically")," and displays your changes."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e717c32.e588556c.js b/assets/js/0e717c32.e588556c.js new file mode 100644 index 00000000000..113584023bb --- /dev/null +++ b/assets/js/0e717c32.e588556c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26397],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),h=p(r),c=a,d=h["".concat(s,".").concat(c)]||h[c]||m[c]||n;return r?i.createElement(d,l(l({ref:t},u),{},{components:r})):i.createElement(d,l({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,l=new Array(n);l[0]=c;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[h]="string"==typeof e?e:a,l[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>n,metadata:()=>o,toc:()=>p});var i=r(87462),a=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-11-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-11-29-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-29-mithril.md",source:"@site/blog/2023-11-29-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-29T00:00:00.000Z",formattedDate:"November 29, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.415,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-29-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-24-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"This week, the Mithril team released the initial version of the ",(0,a.kt)("a",{parentName:"p",href:"https://crates.io/crates/mithril-client"},"Mithril client library"),", enabling developers to integrate core Mithril features into their applications. They also released a new distribution, ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2347.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2347.0")),", which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements."),(0,a.kt)("p",null,"The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance. "),(0,a.kt)("p",null,"Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Release of the ",(0,a.kt)("a",{parentName:"li",href:"https://crates.io/crates/mithril-client"},(0,a.kt)("inlineCode",{parentName:"a"},"mithril-client"))," library crate"),(0,a.kt)("li",{parentName:"ul"},"Publication of a ",(0,a.kt)("a",{parentName:"li",href:"https://mithril.network/doc/dev-blog/2023/11/27/mithril-client-library-released"},"dev blog post")," about the released Mithril library"),(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2347.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2347.0"))),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,a.kt)("inlineCode",{parentName:"strong"},"mithril-client")," WASM library")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1336"},"#1336")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Enhance Mithril/Cardano node communication")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1315"},"#1315")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"P2P threat modeling and risk analysis")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1350"},"#1350")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Support P2P relay in infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1361"},"#1361")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Make Cardano node version custom in CI/CD")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1355"},"#1355")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Manually deploy a test Mithril network")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1356"},"#1356")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"mithril-client verbosity not following usage menu")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1325"},"#1325")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Error message for mithril-client snapshot download")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1375"},"#1375"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e828f3a.84204c63.js b/assets/js/0e828f3a.84204c63.js new file mode 100644 index 00000000000..77494336018 --- /dev/null +++ b/assets/js/0e828f3a.84204c63.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[77338],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=p(a),c=n,h=m["".concat(u,".").concat(c)]||m[c]||d[c]||l;return a?r.createElement(h,i(i({ref:t},s),{},{components:a})):r.createElement(h,i({ref:t},s))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[m]="string"==typeof e?e:n,i[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-09-15-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-09-15-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-ledger.md",source:"@site/blog/2023-09-15-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.645,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-09-15-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-15-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-15-network"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3},{value:"Testing",id:"testing",level:3}],s={toc:p},m="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The Ledger team's focus is still mainly on the Conway era implementation."),(0,n.kt)("p",null,"We were able to add ability to specify initial Constitutional Comittee and the initial\nversion of Constitution. Priority in which Governance Action are now enacted matches the\nspecification. DRep's deposits are now properly accounted for. Governance actions that are\nnot allowed to be voted on by Stake Pool operators and Constitutional Committee members\nare prevented by transaction submission failure, rather than simply being ignored. There\nwas a few important CDDL fixes as well as a lot of new round trip serialization\ntests. Constraint based testing framework has also received a lot of improvements."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-era"},"Conway era"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3681"},"pull-3681")," - Conway Genesis additions"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3690"},"pull-3690")," - Preserve the order of ProposalProcedures"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3705"},"pull-3705")," - Removed ProtVer from EnactState"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3700"},"pull-3700")," - Add conway-specific certs to deposit/refunds"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3704"},"pull-3704")," - Add comments on deprecating certs to Conway CDDL"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3698"},"pull-3698")," - Reordering of governance actions"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3712"},"pull-3712")," - Disallow empty fields in ConwayTxBodyRaw"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3716"},"pull-3716")," - Abstract threshold calculation"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3725"},"pull-3725")," - Fix mistaken use of dollar sign in cddl files"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3718"},"pull-3718")," - Predicate failure for mismatched Voter GovAction"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3721"},"pull-3721")," - Committee expiration, validation and modification")),(0,n.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3629"},"pull-3629")," - Add rule-transition diagrams in dot syntax"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3680"},"pull-3680")," - Bump Plutus deps to 1.11"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3708"},"pull-3708")," - Post release changes")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3730"},"pull-3730")," - Implement ",(0,n.kt)("inlineCode",{parentName:"li"},"Show")," instance for ",(0,n.kt)("inlineCode",{parentName:"li"},"Rep")," using ",(0,n.kt)("inlineCode",{parentName:"li"},"IsTypeable")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3697"},"pull-3697")," - Rewrite testEql using Typeable to make it impossible to forget cases"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3709"},"pull-3709")," - Add many new features to the Constrained modues in cardano-ledger-test"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3726"},"pull-3726")," - Conway and other eras serialization roundtrip tests"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3713"},"pull-3713")," - Improve CI resiliency against GitHub issues")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ee9866d.aa05b5be.js b/assets/js/0ee9866d.aa05b5be.js new file mode 100644 index 00000000000..2a4ea25905b --- /dev/null +++ b/assets/js/0ee9866d.aa05b5be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87314],{25206:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/27","page":27,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/26","nextPage":"/cardano-updates/page/28","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/0fa2fd29.15fed629.js b/assets/js/0fa2fd29.15fed629.js new file mode 100644 index 00000000000..e5c7698772c --- /dev/null +++ b/assets/js/0fa2fd29.15fed629.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83646],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=s(a),c=n,m=h["".concat(u,".").concat(c)]||h[c]||d[c]||i;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-06-16-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-16-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-16-hydra.md",source:"@site/blog/2023-06-16-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-16T00:00:00.000Z",formattedDate:"June 16, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.815,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-16-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-23-sre"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-15-mithril"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},h="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team focused their efforts on continuing to investigate and\nexperiment operating a head on mainnet. They collected several bugs and issues\nand worked on fixing them. Now the team is soon to release a new version,\n0.11.0, which comes with a lot of improvements and bug fixes."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Restored and fixed a bug which stalled our head on mainnet ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/927"},"#927")),(0,n.kt)("li",{parentName:"ul"},"Solved one user issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/914"},"#914")),(0,n.kt)("li",{parentName:"ul"},"Reduced significantly local state size and logs by removing the full scripts from it ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/928"},"#928")),(0,n.kt)("li",{parentName:"ul"},"(pending review) Reduced snapshot size in the API, by only including tx ids ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/922"},"#922"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New release 0.11.0"),(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting."),(0,n.kt)("li",{parentName:"ul"},"Fix some minor bugs discovered when operating our head on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Complete journey for external commits using multiple script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"Publish benchmarks and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/10532414.69c8af62.js b/assets/js/10532414.69c8af62.js new file mode 100644 index 00000000000..c4c4a3f5ed6 --- /dev/null +++ b/assets/js/10532414.69c8af62.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6890],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),u=a,f=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return r?n.createElement(f,l(l({ref:t},s),{},{components:r})):n.createElement(f,l({ref:t},s))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-08-04-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-04-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-goedel.md",source:"@site/blog/2023-08-04-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.43,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-08-04-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-04-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-04-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is formalising mini protocols and also further developing the\nperformance modelling prototype."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Developing new framework for specification and verification of\nmini-protocols which is closer to the Haskell implementation.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Developed a new internal representation for the DeltaQ algebra that\nallows for more modularity in backend implementations")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Discussions regarding the Cardano networking specification"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/10659ce5.04295867.js b/assets/js/10659ce5.04295867.js new file mode 100644 index 00000000000..78b014d9b8e --- /dev/null +++ b/assets/js/10659ce5.04295867.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40400],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-11-16-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-11-16-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-node-cli-api.md",source:"@site/blog/2022-11-16-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-11-16T00:00:00.000Z",formattedDate:"November 16, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.68,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-11-16-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-16-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-16-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-11-16---2022-11-29"},"2022-11-16 - 2022-11-29"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4562"},"Add a native tokens tutorial and exercises"))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4674"},"Update cardano-cli's help")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4644"},"Remove error calls in renderShelleyTxCmdError"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4639"},"Implement Cardano.Api.DeserialiseAnyOf"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4650"},"Fix windows CI"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/113fed8c.43bf9228.js b/assets/js/113fed8c.43bf9228.js new file mode 100644 index 00000000000..07b8c4caa96 --- /dev/null +++ b/assets/js/113fed8c.43bf9228.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33215],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,h=p["".concat(l,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(h,s(s({ref:t},u),{},{components:n})):r.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-07-12-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-07-12-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-12-consensus.md",source:"@site/blog/2023-07-12-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-07-12T00:00:00.000Z",formattedDate:"July 12, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.59,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-07-12-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-13-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-07-12-performance-and-tracing"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4620"},"proposed fix"),". The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine."),(0,a.kt)("p",null,"The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility."),(0,a.kt)("p",null,"On the support front, the team ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/200"},"drafted")," an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/11423591.8e82ecb7.js b/assets/js/11423591.8e82ecb7.js new file mode 100644 index 00000000000..a1ff2823b32 --- /dev/null +++ b/assets/js/11423591.8e82ecb7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96410],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function n(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):n(n({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(a),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||o;return a?r.createElement(h,n(n({ref:t},d),{},{components:a})):r.createElement(h,n({ref:t},d))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=a.length,n=new Array(o);n[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:l,n[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>n,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-06-08-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},n=void 0,i={permalink:"/cardano-updates/2023-06-08-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-sre.md",source:"@site/blog/2023-06-08-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.795,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-06-08-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-08-goedel"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-06-08-system-test"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Bitte",id:"bitte",level:3},{value:"Bitte-cells",id:"bitte-cells",level:3},{value:"Cardano-graphql",id:"cardano-graphql",level:3},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Ci-ops",id:"ci-ops",level:3},{value:"Ci-world",id:"ci-world",level:3},{value:"Cicero",id:"cicero",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3},{value:"Openziti",id:"openziti",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer."),(0,l.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,l.kt)("h3",{id:"bitte"},"Bitte"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Equinix bare metal capability was added to bitte: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte/pull/194"},"bitte-pull-194")),(0,l.kt)("li",{parentName:"ul"},"Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte/pull/201"},"bitte-pull-201"))),(0,l.kt)("h3",{id:"bitte-cells"},"Bitte-cells"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Improvements made for patroni cluster recovery of large databases: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte-cells/compare/main...patroni-flex"},"bitte-cells-branch"))),(0,l.kt)("h3",{id:"cardano-graphql"},"Cardano-graphql"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update cardano-graphql and nixos service: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-graphql/pull/815"},"cardano-graphql-pull-815"))),(0,l.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update cardano-node to use the updated iohk-nix environments: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5241"},"cardano-node-pull-5241"))),(0,l.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update cardano-graphql, adds monitoring improvements and misc bug fixes: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/pull/411"},"cardano-ops-pull-411")),(0,l.kt)("li",{parentName:"ul"},"Work in progress on mixed legacy and p2p topology clusters in cardano-ops: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/master...ops-local"},"cardano-ops-branch"))),(0,l.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Add a declarative cardano-faucet dashboard: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/e7d40d34aff52bbeb309f87939bd0d40f585e60a"},"cardano-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Remove a requirement for root user in Nomad docker images: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/68"},"cardano-world-pull-68")),(0,l.kt)("li",{parentName:"ul"},"Enable explorer in cardano-world for high IOPS metal access: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/69"},"cardano-world-pull-69")),(0,l.kt)("li",{parentName:"ul"},"Migrate explorer cluster to cardano-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/75"},"cardano-world-pull-75")),(0,l.kt)("li",{parentName:"ul"},"Migrate testnet metadata server to cardano-world, cleanup envs: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/77"},"cardano-world-pull-77")),(0,l.kt)("li",{parentName:"ul"},"Add a faucet restore delegation script to cardano-world for non-functioning delegated pools: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/79"},"cardano-world-pull-79")),(0,l.kt)("li",{parentName:"ul"},"Integrate node 8.x into cardano-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/84"},"cardano-world-pull-84")),(0,l.kt)("li",{parentName:"ul"},"Update cardano-world to use iohk-nix for node environments: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/87"},"cardano-world-pull-87")),(0,l.kt)("li",{parentName:"ul"},"Create a stakepool analysis query for cluster pool performance overview: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/64fe3b9d4067c24eef028ac1c561d6f9a7d5a9a8"},"cardano-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Added an iptables fixup script for broken bridged networking nomad jobs: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/02550206e4e34d121135794b6e54084635e55a50"},"cardano-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Improve cardano-world job automation with additional parameterization: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/92"},"cardano-world-pr-92")),(0,l.kt)("li",{parentName:"ul"},"Update preview network experimental config defaults: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/93"},"cardano-world-pr-93"))),(0,l.kt)("h3",{id:"ci-ops"},"Ci-ops"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-ops/pull/108"},"ci-ops-pull-108"))),(0,l.kt)("h3",{id:"ci-world"},"Ci-world"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Resolve ci-world linux buildkite agent cleanup bug: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/commit/3d053b202a6e40fab23db49801de7d6e580fab1f"},"ci-world-commit")),(0,l.kt)("li",{parentName:"ul"},"Integrate new darwin builders into ci-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/pull/22"},"ci-world-pull-22")),(0,l.kt)("li",{parentName:"ul"},"Migrate patroni HA db to it's own namespace in ci-world: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/pull/24"},"ci-world-pull-24"))),(0,l.kt)("h3",{id:"cicero"},"Cicero"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Implement a cicero webhook backoff with exponential decay plus jitter: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cicero/pull/79"},"cicero-pull-79"))),(0,l.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Update iohk-nix to be source of truth for node environments: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/534"},"iohk-nix-pull-534")),(0,l.kt)("li",{parentName:"ul"},"Update preview network experimental config defaults: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/544"},"iohk-nix-pull-544"))),(0,l.kt)("h3",{id:"openziti"},"Openziti"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Add darwin intel and arm support to ziti-edge-tunnel nix modules: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/johnalotoski/openziti-bins/pull/1"},"openziti-bins-pull-1"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1147f4da.c6a37e99.js b/assets/js/1147f4da.c6a37e99.js new file mode 100644 index 00000000000..1aede2135fd --- /dev/null +++ b/assets/js/1147f4da.c6a37e99.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21463],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(n),p=a,g=c["".concat(s,".").concat(p)]||c[p]||m[p]||o;return n?r.createElement(g,i(i({ref:t},d),{},{components:n})):r.createElement(g,i({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Embedding Quality Workstream",slug:"2022-11-03-embedding-quality",authors:"dorin100",tags:["embedding-quality"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-03-embedding-quality",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-03-embedding-quality.md",source:"@site/blog/2022-11-03-embedding-quality.md",title:"Embedding Quality Workstream",description:"High level summary",date:"2022-11-03T00:00:00.000Z",formattedDate:"November 3, 2022",tags:[{label:"embedding-quality",permalink:"/cardano-updates/tags/embedding-quality"}],readingTime:.65,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"Embedding Quality Workstream",slug:"2022-11-03-embedding-quality",authors:"dorin100",tags:["embedding-quality"],hide_table_of_contents:!1},prevItem:{title:"Open-Source Team",permalink:"/cardano-updates/2022-10-31-open-source"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-02-consensus"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2}],d={toc:u},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We made good progress on most of the Action Items we agreed on Lisbon, like:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Cardano System Tests was fully open to public (tools, tests, results)\nSee ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests"},"cardano-node-tests webpage"),"."),(0,a.kt)("li",{parentName:"ul"},"We defined an ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/blob/master/.github/ISSUE_TEMPLATE/user-facing-feature.md"},"user-facing-functionality template")," that is used with the cardano-cli team ",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"this includes acceptance criteria & user stories, and definition of done"))),(0,a.kt)("li",{parentName:"ul"},"We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)"),(0,a.kt)("li",{parentName:"ul"},"We started to apply a ",(0,a.kt)("em",{parentName:"li"},"labelling convention")," on ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues"},"cardano-node issues")," that will be used to generate some visual dashboards with some metrics ","[TBD]"),(0,a.kt)("li",{parentName:"ul"},"Ziyand Liu started an ",(0,a.kt)("em",{parentName:"li"},"End-to-End Development and Testing Process for Plutus Features"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/120c0b00.b79d45ef.js b/assets/js/120c0b00.b79d45ef.js new file mode 100644 index 00000000000..1adbdb1ec74 --- /dev/null +++ b/assets/js/120c0b00.b79d45ef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59955],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-11-30-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2022-11-30-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-node-cli-api.md",source:"@site/blog/2022-11-30-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-11-30T00:00:00.000Z",formattedDate:"November 30, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.01,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-11-30-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-30-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-30-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-11-30---2022-12-13"},"2022-11-30 - 2022-12-13"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped. "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4675"},"Append tx output in cli transaction build command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4592"},"Update Error messages in cardano-cli"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4675"},"Replace Data.Map with Data.Map.Strict")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4708"},"Update Github actions"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12208c5e.498a6ea8.js b/assets/js/12208c5e.498a6ea8.js new file mode 100644 index 00000000000..34d08a9b809 --- /dev/null +++ b/assets/js/12208c5e.498a6ea8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32852],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),c=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(a),d=n,m=u["".concat(p,".").concat(d)]||u[d]||h[d]||o;return a?r.createElement(m,i(i({ref:t},s),{},{components:a})):r.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-07-21-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-21-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-hydra.md",source:"@site/blog/2023-07-21-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.7,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-21-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-26-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-07-21-ledger"}},p={authorsImageUrls:[void 0]},c=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team updated the specification to align with recent\noff-chain protocol changes, completed refactoring the snapshot emission\nin preparation for event-sourced protocol logic, and updated to GHC\n9.2.7, resulting in improved compile times and slightly smaller Plutus\nscripts."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated the specification to match the recent off-chain protocol\nchanges to complete\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Refactored the snapshot emission logic in preparation for event\nsourced protocol logic."),(0,n.kt)("li",{parentName:"ul"},"Updated to GHC 9.2.7, which led to improved compile times and\nslightly smaller plutus scripts.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting next wednesday and July report"),(0,n.kt)("li",{parentName:"ul"},"Reflect latest information onto our roadmap."),(0,n.kt)("li",{parentName:"ul"},"Actual implemention of event-sourced persistence\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/913"},"#913"),"."),(0,n.kt)("li",{parentName:"ul"},"Update the use cases section on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family"},"https://hydra.family")),(0,n.kt)("li",{parentName:"ul"},"Remove deprecated internal commit\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/954"},"#954"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12525f14.359b7596.js b/assets/js/12525f14.359b7596.js new file mode 100644 index 00000000000..2648ffa140d --- /dev/null +++ b/assets/js/12525f14.359b7596.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46207],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function p(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),i=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},h=function(e){var t=i(e.components);return n.createElement(o.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,p=e.originalType,o=e.parentName,h=u(e,["components","mdxType","originalType","parentName"]),d=i(a),c=r,m=d["".concat(o,".").concat(c)]||d[c]||s[c]||p;return a?n.createElement(m,l(l({ref:t},h),{},{components:a})):n.createElement(m,l({ref:t},h))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var p=a.length,l=new Array(p);l[0]=c;var u={};for(var o in t)hasOwnProperty.call(t,o)&&(u[o]=t[o]);u.originalType=e,u[d]="string"==typeof e?e:r,l[1]=u;for(var i=2;i{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>s,frontMatter:()=>p,metadata:()=>u,toc:()=>i});var n=a(87462),r=(a(67294),a(3905));const p={title:"Ledger Team Update",slug:"2023-04-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,u={permalink:"/cardano-updates/quarterly/2023-04-03-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-03-ledger.md",source:"@site/quarterly/2023-04-03-ledger.md",title:"Ledger Team Update",description:"Ledger Quarterly Update",date:"2023-04-03T00:00:00.000Z",formattedDate:"April 3, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/quarterly/tags/ledger"}],readingTime:6.405,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-04-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Network Q1 2023 Update",permalink:"/cardano-updates/quarterly/2023-04-04-network"},nextItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-18-consensus"}},o={authorsImageUrls:[void 0]},i=[{value:"Ledger Quarterly Update",id:"ledger-quarterly-update",level:2},{value:"2023-01 - 2023-03",id:"2023-01---2023-03",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"CIPs",id:"cips",level:4},{value:"Formal ledger model",id:"formal-ledger-model",level:4},{value:"Conway ledger era",id:"conway-ledger-era",level:4},{value:"DRep stake distribution computation",id:"drep-stake-distribution-computation",level:4},{value:"Integration work",id:"integration-work",level:4},{value:"Deposit tracking",id:"deposit-tracking",level:4},{value:"New ledger API",id:"new-ledger-api",level:4},{value:"Constraint-based generators",id:"constraint-based-generators",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Critical fixes",id:"critical-fixes",level:5},{value:"Next steps",id:"next-steps",level:3},{value:"More details",id:"more-details",level:3}],h={toc:i},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"ledger-quarterly-update"},"Ledger Quarterly Update"),(0,r.kt)("h2",{id:"2023-01---2023-03"},"2023-01 - 2023-03"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"cips"},"CIPs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Entering the Voltaire phase")," -\nCIP-1694 received a major update after participation in the design has expanded to\nmore and more people, including those who attended the Colorado workshop.\nSee ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Ledger CIP category")," -\nThe ledger team continues to embrace the CIP process, and has begun the process of\nregistering the ledger as an official CIP category.\nSee ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/456"},"CIP-84"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Ledger serialization")," -\nA CIP for the ledger serialization deprecation cycle has been accepted.\nSee ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/tree/master/CIP-0080"},"CIP-80"),".")),(0,r.kt)("h4",{id:"formal-ledger-model"},"Formal ledger model"),(0,r.kt)("p",null,"Our new formal specifications backed by Agda have seen a lot of progress.\nThe majority of the ideas in CIP-1694 are now present, and we have made enough progress\nthat we can now safely say that the PDF produced by the Agda model will be the\nofficial ledger specification for the Conway ledger era.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"the repository"),"."),(0,r.kt)("h4",{id:"conway-ledger-era"},"Conway ledger era"),(0,r.kt)("p",null,"Progress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model.\nThe major component still missing is the DRep stake distribution, which still presents some\ntechnical challenges."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3176"},"pull-3176"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3216"},"pull-3216"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3226"},"pull-3226"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3291"},"pull-3291"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3326"},"pull-3326"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3330"},"pull-3330"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3339"},"pull-3339"),"]"),(0,r.kt)("h4",{id:"drep-stake-distribution-computation"},"DRep stake distribution computation"),(0,r.kt)("p",null,"Adding another large stake distribution to the ledger state must proceed with caution.\nWe do not want the memory used by the node to increase too much,\nand performance problems can lead to reduced block production.\nWe have prototyped, tested, and benchmarked several approaches that could give us\nthe current DRep stake distribution at each epoch boundary.\nThis has very important implications, since we want every ADA holder to be able to at any\ntime (such as during a contentious vote) register themselves as a DRep and still have time\nto vote themselves on the issue."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3344"},"pull-3344"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3353"},"pull-3353"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3364"},"pull-3364"),"]"),(0,r.kt)("h4",{id:"integration-work"},"Integration work"),(0,r.kt)("p",null,"The ledger has made some wonderful improvements over the past six months,\nbut which entail a significant amount of integration efforts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Our new versioned CBOR schemes"),(0,r.kt)("li",{parentName:"ul"},"Individual deposit tracking"),(0,r.kt)("li",{parentName:"ul"},"An improved cross-era interface utilizing lenses"),(0,r.kt)("li",{parentName:"ul"},"A new ledger API"),(0,r.kt)("li",{parentName:"ul"},"Re-arranging the ledger stake in preparation for CIP-1694"),(0,r.kt)("li",{parentName:"ul"},"Versioning our Haskell packages\nusing ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaPs"),"."),(0,r.kt)("li",{parentName:"ul"},"Consistent conventions for variable names")),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3279"},"pull-3279"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3282"},"pull-3282"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3288"},"pull-3288"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3289"},"pull-3289"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3292"},"pull-3292"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3297"},"pull-3297"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3298"},"pull-3298"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3299"},"pull-3299"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3300"},"pull-3300"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3302"},"pull-3302"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3303"},"pull-3303"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3308"},"pull-3308"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3342"},"pull-3342"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3345"},"pull-3345"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3356"},"pull-3356"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3357"},"pull-3357"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3360"},"pull-3360"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3361"},"pull-3361"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3363"},"pull-3363"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4349"},"pull-4349"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/378"},"pull-378"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/376"},"pull-376"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/373"},"pull-373"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/370"},"pull-370"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/361"},"pull-361"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4976"},"pull-4976"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5013"},"pull-5013"),"]"),(0,r.kt)("h4",{id:"deposit-tracking"},"Deposit tracking"),(0,r.kt)("p",null,"Individual deposits (for stake credential and stake pool registrations) were not tracked by the ledger.\nDeposits were returned according to the current protocol parameters.\nWhen the values of these two protocol parameters change, the deposit pot\nis adjusted by adding to, or removing from, the reserves."),(0,r.kt)("p",null,"This has several problems:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Most people expect a deposit to be paid back exactly."),(0,r.kt)("li",{parentName:"ul"},"We cannot increase the deposit amount once the reserves hits zero."),(0,r.kt)("li",{parentName:"ul"},"If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials."),(0,r.kt)("li",{parentName:"ul"},"Because of the problems above, it is going to be incredibly hard to ever change the values."),(0,r.kt)("li",{parentName:"ul"},"There is a serious issue involving hard forks.\nThe consensus layer makes the decision about whether or not to enact a hard fork based on\nthe protocol parameter update state two stability windows before the end of the epoch.\nHowever, the ledger will reject a protocol parameter update on the epoch boundary\nif the deposit pot adjustments cannot be reconciled with the reseve pot.\nThis means that if quorum is met regarding changing the major protocol version,\nbut the update is rejected on the epoch boundary, consensus will change the era but the\nledger will not change the major protocol version, leaving the ledger in a split-brain state.")),(0,r.kt)("p",null,"Because we never actually changed the values of the two deposits amounts in the protocol parameters\non mainnet, we were able to retroactively change the behavior.\nWe made the following changes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Individual deposits are tracked in the ",(0,r.kt)("inlineCode",{parentName:"li"},"DState"),"."),(0,r.kt)("li",{parentName:"ul"},"The amount deposited is always returned.")),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3195"},"pull-3195"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3202"},"pull-3202"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3217"},"pull-3217"),"]"),(0,r.kt)("h4",{id:"new-ledger-api"},"New ledger API"),(0,r.kt)("p",null,"We have significantly built up the ledger API.\nWe will eventually replace much of the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-api")," in the node repository with this ledger API."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3242"},"pull-3242"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3248"},"pull-3248"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3328"},"pull-3328"),"]"),(0,r.kt)("h4",{id:"constraint-based-generators"},"Constraint-based generators"),(0,r.kt)("p",null,"Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks\nwhich span several epochs, mimicking a real network.\nThese tests are, in theory, excellent for checking properties.\nThey are, however, very difficult to maintain and are not as random as we would like\n(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks)."),(0,r.kt)("p",null,"We have a new declaritive infrastructure for building constraint-based generators,\nwhich instead generate a random ledger state representative of not just an initial state,\nbut also those representative of the end result of a long sequence of valid blocks.\nMoreover, these generators are very fast and are much more random than our old generators.\nBefore we can start using them for our existing property tests, however, we still need to\nexpand them to generate a valid block for a given ledger state."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"),"]"),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"We continued to address technical debt as much as we can."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3167"},"pull-3167"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3170"},"pull-3170"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3172"},"pull-3172"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3175"},"pull-3175"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3184"},"pull-3184"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3205"},"pull-3205"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3208"},"pull-3208"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3210"},"pull-3210"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3212"},"pull-3212"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3218"},"pull-3218"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3222"},"pull-3222"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3223"},"pull-3223"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3224"},"pull-3224"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3225"},"pull-3225"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3229"},"pull-3229"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3239"},"pull-3239"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3241"},"pull-3241"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3244"},"pull-3244"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3245"},"pull-3245"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3249"},"pull-3249"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3260"},"pull-3260"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3263"},"pull-3263"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3264"},"pull-3264"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3268"},"pull-3268"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3269"},"pull-3269"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3270"},"pull-3270"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3274"},"pull-3274"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3276"},"pull-3276"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3277"},"pull-3277"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3286"},"pull-3286"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3290"},"pull-3290"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3295"},"pull-3295"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3296"},"pull-3296"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3306"},"pull-3306"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3307"},"pull-3307"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3310"},"pull-3310"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3311"},"pull-3311"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3316"},"pull-3316"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3320"},"pull-3320"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3323"},"pull-3323"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3327"},"pull-3327"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3331"},"pull-3331"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3332"},"pull-3332"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3333"},"pull-3333"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3338"},"pull-3338"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3341"},"pull-3341"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3347"},"pull-3347"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3350"},"pull-3350"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3351"},"pull-3351"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3352"},"pull-3352"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3354"},"pull-3354"),"]"),(0,r.kt)("h5",{id:"critical-fixes"},"Critical fixes"),(0,r.kt)("p",null,"We fixed two critical issues:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Growing block production delay on the epoch boundary: [",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3209"},"pull-3209"),"]"),(0,r.kt)("li",{parentName:"ul"},"Unexpected node shutdown from ",(0,r.kt)("inlineCode",{parentName:"li"},"balanceR"),": [",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3343"},"pull-3343"),"]")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Conway spec")," -\nComplete the first version of the conway formal specification."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"DRep stake distribution")," -\nHave the ledger compute the DRep stake distribution with acceptible performance."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Devnet ready")," -\nHave the Haskell implementation of the conway era in sync with the formal specification,\nand integrate the changes with consensus and node.\nAll the details might not be finalized, but the wire specification and the API should\nbe stable so that conway can be placed on a devnet for tool builders to start integrating with."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Plutus V3")," -\nIntegrate Plutus V3 into the ledger, including a new script context which supports DReps.")),(0,r.kt)("h3",{id:"more-details"},"More details"),(0,r.kt)("p",null,"This quarterly report was based off of the following fortnightly ones:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-01-05-ledger"},"2023-01-05")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-01-19-ledger"},"2023-01-19")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-02-02-ledger"},"2023-02-02")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-02-17-ledger"},"2023-02-17")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-03-03-ledger"},"2023-03-03")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-03-17-ledger"},"2023-03-17")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-03-31-ledger"},"2023-03-31"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12637b23.8c689cc8.js b/assets/js/12637b23.8c689cc8.js new file mode 100644 index 00000000000..ae7d1207db6 --- /dev/null +++ b/assets/js/12637b23.8c689cc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32706],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),u=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(l,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[d]="string"==typeof e?e:r,i[1]=p;for(var u=2;u{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-05-24-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-05-24-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-24-node-cli-api.md",source:"@site/blog/2023-05-24-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-05-24T00:00:00.000Z",formattedDate:"May 24, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-05-24-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-26-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-19-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-05-24---2023-06-06"},"2023-05-24 - 2023-06-06"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released. "),(0,r.kt)("li",{parentName:"ul"},"We provided assitance where needed in the release"),(0,r.kt)("li",{parentName:"ul"},"An integration repository ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fusion-flamingo"},"https://github.com/input-output-hk/fusion-flamingo")," was created to enable my team to more easily work on cardano-cli and cardano-api")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5290"},"Update ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli")," changelog")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5197"},"Propagate protocol parameters conversion errors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5149"},"Command line option for parsing UTC time to slot number")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/31"},"Switch to ",(0,r.kt)("inlineCode",{parentName:"a"},"tasty-discover"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/30"},"Move tests to standard locations")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/26"},"Make cardano-api:internal component public")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/24"},"update chaps index")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/18"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"ErrorSpec")," check for all constructors, move golden tests together")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/17"},"Expose toAlonzoCostModels")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/9"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"ErrorsSpec")," use generated types and constructors names")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/32"},"Check changelog in tag script")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/34"},"Use tag script from ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-dev")," repository instead")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/38"},"Use .x suffix for release branches")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5291"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"cryptoInit")," instead of ",(0,r.kt)("inlineCode",{parentName:"a"},"sodiumInit"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5284"},"Move configuration tests to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-node")," tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5243"},"update chaps & integration")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5240"},"#5222 Remove ",(0,r.kt)("inlineCode",{parentName:"a"},"ApplicationName")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"ApplicationVersion")," config parameters")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/126e82e6.4290e249.js b/assets/js/126e82e6.4290e249.js new file mode 100644 index 00000000000..d1f689b8dce --- /dev/null +++ b/assets/js/126e82e6.4290e249.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96871],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(a),h=n,m=c["".concat(u,".").concat(h)]||c[h]||s[h]||o;return a?r.createElement(m,l(l({ref:t},d),{},{components:a})):r.createElement(m,l({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=h;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-11-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-11-02-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-ledger.md",source:"@site/blog/2022-11-02-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.275,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-02-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-02-node-cli-api"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Axiomatic Set Theory",id:"axiomatic-set-theory",level:3},{value:"Completed Technical Debt",id:"completed-technical-debt",level:3}],d={toc:p},c="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We have made the decision to use the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger repository"),"\nin place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure\nto the model. In particular, we now have a lot of support for axiomatic set theory.\nWhile the next ledger era is still in the design phase, most of the team remains working\non technical debt.\nIn particular, we have moved a lot more code out of the Shelley specific modules and into\na ledger core module, we have finished up our benchmarking around the problematic ",(0,n.kt)("inlineCode",{parentName:"p"},"TICKF"),"\nledger transition (while improving the performance), made conveniences to the development\nenvironment, cleaned up all the recent changes to the cost model, added a lot of documentation,\nfixed some flaky tests, and deleted some dead code."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"axiomatic-set-theory"},"Axiomatic Set Theory"),(0,n.kt)("p",null,"The formal ledger model now has support for much of the set theory that we make use of in\nthe formal ledger specifications. See [",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/20"},"pull-20"),"]."),(0,n.kt)("h3",{id:"completed-technical-debt"},"Completed Technical Debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We have addressed issues with two of our most problematic and flaky tests.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3039"},"pull-3039"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3093"},"pull-3093"),"]."),(0,n.kt)("li",{parentName:"ul"},"We have added more documentation and tests to the Twiddler module. This is a module which\nmakes our CBOR serialization round-trip tests much more robust, and will also hopefully\nhelp enforce the mandate for downstream libraries to never re-serialize data that needs\nto be hashed. See [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3073"},"pull-3073"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3095"},"pull-3095"),"]\n(we cannot merge 3095 just yet, due to a preference for merging other features)."),(0,n.kt)("li",{parentName:"ul"},"We have finished our long analysis of the problematic ",(0,n.kt)("inlineCode",{parentName:"li"},"TICKF")," transition.\nWe now have a lot of benchmarks surrounding this code, and have added performance improvements.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3068"},"pull-3068"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3035"},"issue-3035"),"]."),(0,n.kt)("li",{parentName:"ul"},"We have restored support for\n",(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/ghcid"},"ghcid"),"\nin our repository. This is a tool for developing with Haskell that many of us find greatly\nimproves our productivity by providing us with constant feedback from the type checker.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3112"},"pull-3112"),"]."),(0,n.kt)("li",{parentName:"ul"},"After much activity on the cost model, we have done some final clean up of the code.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3075"},"pull-3075"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3101"},"pull-3101"),"]."),(0,n.kt)("li",{parentName:"ul"},"We moved a lot of the existing user facing documentation regarding native tokens into the\nledger repository, and cleaned it up\n(most of the heavy lifting was done by our amazing technical writers).\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3091"},"pull-3091"),"]."),(0,n.kt)("li",{parentName:"ul"},"We removed dead code. See [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3089"},"pull-3089"),"]."),(0,n.kt)("li",{parentName:"ul"},"We moved a lot of code from the Shelley specific libraries to the ledger core library.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3109"},"pull-3109"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3110"},"pull-3110"),"]."),(0,n.kt)("li",{parentName:"ul"},"We've removed more of the awkward legacy template Haskell names.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3108"},"pull-3108"),"].")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12a1613f.0e2fe3c1.js b/assets/js/12a1613f.0e2fe3c1.js new file mode 100644 index 00000000000..1022b945806 --- /dev/null +++ b/assets/js/12a1613f.0e2fe3c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4615],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>g});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),m=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=m(e.components);return a.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=m(n),p=r,g=d["".concat(c,".").concat(p)]||d[p]||u[p]||i;return n?a.createElement(g,o(o({ref:t},s),{},{components:n})):a.createElement(g,o({ref:t},s))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var m=2;m{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>m});var a=n(87462),r=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-08-11-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-08-11-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-11-performance-and-tracing.md",source:"@site/blog/2023-08-11-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-08-11T00:00:00.000Z",formattedDate:"August 11, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.335,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-08-11-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-11-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-10-mithril"}},c={authorsImageUrls:[void 0]},m=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],s={toc:m},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: We've concluded benchmarking node version ",(0,r.kt)("inlineCode",{parentName:"li"},"8.2.0"),"."),(0,r.kt)("li",{parentName:"ul"},"Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.")),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"As part of our release benchmarking cycle, we've completed and analysed the runs for the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.0")," version of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version."),(0,r.kt)("h3",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"A significant amount of optimizations for the new tracing system has finally been merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),". At the moment,\nwe're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding\ninsight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward. "),(0,r.kt)("p",null,"Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent\nand reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were\nable to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks. "),(0,r.kt)("p",null,"A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12c83d8a.ebd0fc40.js b/assets/js/12c83d8a.ebd0fc40.js new file mode 100644 index 00000000000..e938f6ed272 --- /dev/null +++ b/assets/js/12c83d8a.ebd0fc40.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58774],{3905:(e,t,r)=>{r.d(t,{Zo:()=>h,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},h=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=p(r),m=n,d=s["".concat(u,".").concat(m)]||s[m]||c[m]||o;return r?a.createElement(d,i(i({ref:t},h),{},{components:r})):a.createElement(d,i({ref:t},h))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Hydra Team Update",slug:"2023-07-28-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-28-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-28-hydra.md",source:"@site/blog/2023-07-28-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-28T00:00:00.000Z",formattedDate:"July 28, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.005,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-28-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-07-31-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-27-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},s="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},h,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"During this week, the Hydra team achieved significant progress in various areas.\nThey conducted the monthly review meeting for July, which continously ensures\ntransparent communication and project evaluation. The team migrated the core\nlogic of the node to an event-sourced architecture and incremental writes of\nevents to persistence, enhancing the project","\u2019","s performance and maintainability.\nFurthermore, the team added the ability to read protocol parameters via the API\nand fixed the CI workflows to support pull requests from forks of external\ncontributors, streamlining the development process for community involvement."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Held the monthly review meeting for July (",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/14ANZ3efuxgXpYK94EBWxZLR9TtN7voru/"},"recording"),")"),(0,n.kt)("li",{parentName:"ul"},"Migrate the core logic of the node to an event-sourced architecture ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/999"},"#999")),(0,n.kt)("li",{parentName:"ul"},"Updated persistence to faster incremental writes of events ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1000"},"#1000")),(0,n.kt)("li",{parentName:"ul"},"Added ability to read protocol parameters via API ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/735"},"#735")),(0,n.kt)("li",{parentName:"ul"},"Fix CI workflows to support pull requests from forks of external contributors ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/993"},"#993")),(0,n.kt)("li",{parentName:"ul"},"Updated to GHC 9.2.8 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1005"},"#1005")),(0,n.kt)("li",{parentName:"ul"},"Prepared an updated use cases section on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family"},"https://hydra.family")," (published with next release)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Publish monthly report"),(0,n.kt)("li",{parentName:"ul"},"Complete user transaction submission work ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/966"},"#966")),(0,n.kt)("li",{parentName:"ul"},"Remove commit from internal wallet (deprecated) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/954"},"#954"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12d5d907.1addbe15.js b/assets/js/12d5d907.1addbe15.js new file mode 100644 index 00000000000..65c7b82bf48 --- /dev/null +++ b/assets/js/12d5d907.1addbe15.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16348],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),u=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=u(a),d=n,m=h["".concat(s,".").concat(d)]||h[d]||c[d]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-04-07-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-07-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-07-hydra.md",source:"@site/blog/2023-04-07-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-07T00:00:00.000Z",formattedDate:"April 7, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.875,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-07-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-14-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-06-mithril"}},s={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:u},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team published the monthly report for March, created\nseparate links for different versions of documentation, and clarified potential\nsolutions for the Rollbacks bug. The team also discussed Query API requests for\nthe Hydra Voting project and met with community members to answer questions\nabout Hydra. Moving forward, the team plans to integrate the specification into\nthe repository, implement a short-term fix for the Rollbacks issue, and draft a\nQuery API ADR."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published monthly reports on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-03"},"website")),(0,n.kt)("li",{parentName:"ul"},"Separate last released and latest versions of docs (e.g. normal ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/core-concepts/behavior/#replay-of-past-server-outputs"},"released")," vs. ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/core-concepts/behavior/#replay-of-past-server-outputs"},"/unstable"),")"),(0,n.kt)("li",{parentName:"ul"},"Discussed Query API concerns from Hydra Voting project (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/discussions/797"},"link"),")"),(0,n.kt)("li",{parentName:"ul"},"Clarified rollbacks bug and defined possible solutions (short and long term) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Met with community members to answer questions about Hydra")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finally get the docs integrated into the repository ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693")),(0,n.kt)("li",{parentName:"ul"},"Dirt road fix for rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Disclaimer text and detail known issues about mainnet compatibility\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/12ef8706.114e8e85.js b/assets/js/12ef8706.114e8e85.js new file mode 100644 index 00000000000..2382f66e295 --- /dev/null +++ b/assets/js/12ef8706.114e8e85.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[61039],{91703:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/6","page":6,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/5","nextPage":"/cardano-updates/tags/hydra/page/7","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/1377d1fa.d6f4b9df.js b/assets/js/1377d1fa.d6f4b9df.js new file mode 100644 index 00000000000..894437016b2 --- /dev/null +++ b/assets/js/1377d1fa.d6f4b9df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79841],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var u=n.createContext({}),p=function(t){var e=n.useContext(u),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},d=function(t){var e=p(t.components);return n.createElement(u.Provider,{value:e},t.children)},c="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,u=t.parentName,d=i(t,["components","mdxType","originalType","parentName"]),c=p(a),s=r,h=c["".concat(u,".").concat(s)]||c[s]||m[s]||o;return a?n.createElement(h,l(l({ref:e},d),{},{components:a})):n.createElement(h,l({ref:e},d))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i[c]="string"==typeof t?t:r,l[1]=i;for(var p=2;p{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-10-19-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-10-19-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-19-node-cli-api.md",source:"@site/blog/2022-10-19-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-10-19T00:00:00.000Z",formattedDate:"October 19, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.57,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-10-19-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-21-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-18-consensus"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-submit-api",id:"cardano-submit-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],d={toc:p},c="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-10-19---2022-11-01"},"2022-10-19 - 2022-11-01"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ask the node about the current mempool's capacity and sizes"),(0,r.kt)("li",{parentName:"ul"},"Request the next transaction from the mempool's current list"),(0,r.kt)("li",{parentName:"ul"},"Query if a particular transaction exists in the mempool")),(0,r.kt)("p",null,"Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric ",(0,r.kt)("inlineCode",{parentName:"p"},"tx_submit_fail_count")," has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Documentation improvments"),(0,r.kt)("li",{parentName:"ul"},"Release 1.35.4 was merged & released"),(0,r.kt)("li",{parentName:"ul"},"Exported various types from cardano-api that were requested by community members")),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4508"},"Release 1.35.4"))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4276"},"Add tx-mempool command to CLI")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4538"},"Fix query era mismatch bug in transaction build command")),(0,r.kt)("li",{parentName:"ul"},"[Serenity]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4516"},"Condense Read and Validation modules in cardano-cli"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4482"},"Return Lovelace for calculateMinimumUTxO")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4554"},"Export IsPlutusScriptLanguage from cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4546"},"Reduce exposed modules in cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4568"},"Add ToJSON and FromJSON instances for Address")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4565"},"Export TxIns type alias from Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4534"},"Export more generators from cardano-api"))),(0,r.kt)("h3",{id:"cardano-submit-api"},"cardano-submit-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4566"},"Add tx_submit_fail_count metric"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4549"},"Upgrade to cabal-3.8.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4613"},"Update building-the-node-using-nix.md"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"None")),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/144cea98.f99162b0.js b/assets/js/144cea98.f99162b0.js new file mode 100644 index 00000000000..c195150544a --- /dev/null +++ b/assets/js/144cea98.f99162b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[50881],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function o(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(o[a]=t[a]);return o}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(o[a]=t[a])}return o}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,o=t.mdxType,r=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=u(a),h=o,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||r;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,o=e&&e.mdxType;if("string"==typeof t||o){var r=a.length,l=new Array(r);l[0]=h;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[d]="string"==typeof t?t:o,l[1]=i;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(87462),o=(a(67294),a(3905));const r={title:"Node API & CLI Team Update",slug:"2023-02-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-02-22-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-22-node-cli-api.md",source:"@site/blog/2023-02-22-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-02-22T00:00:00.000Z",formattedDate:"February 22, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.385,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-02-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-22-consensus"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-02-21-db-sync"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"Documentation",id:"documentation",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function m(t){let{components:e,...a}=t;return(0,o.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"2023-02-22---2023-03-07"},"2023-02-22 - 2023-03-07"),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"General bug fixes "),(0,o.kt)("h2",{id:"completed"},"Completed"),(0,o.kt)("h3",{id:"docs"},"docs"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4882"},"Fix some markdown links")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4881"},"Update changelog with PR4788 changes"))),(0,o.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,o.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,o.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,o.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,o.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4901"},"Remove pattern Tx"))),(0,o.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs"))),(0,o.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,o.kt)("h2",{id:"in-progress"},"In Progress"),(0,o.kt)("h2",{id:"documentation"},"Documentation"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4949"},"Fix path to mkfiles.sh script in documentation"))),(0,o.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4932"},"New build complete job")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4764"},"Update ouroboros-network"))),(0,o.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4910"},"New --node-socket-path cli option")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4909"},"Fix qKesKesKeyExpiry to not always be null")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4880"},"Detect invalid counter and certificate")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4823"},"Straight line code for tx commands")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"New cardano-cli ping command.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4655"},"Move cardano-ping from ouroboros-network to cardano-node project"))),(0,o.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4941"},"Combinators for TxBodyCon\u017btent and related types")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4903"},"Reduce number of calls to toLedgerPParams")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4825"},"Better error message for query utxo without oops 2"))),(0,o.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4911"},"Less verbose node-to-client and node-to-node version logging"))),(0,o.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4879"},"Re-enable kes-period-info test")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3783"},"Transaction debug script command"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/144cf255.88218aa6.js b/assets/js/144cf255.88218aa6.js new file mode 100644 index 00000000000..c169b9f7788 --- /dev/null +++ b/assets/js/144cf255.88218aa6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55553],{3905:(e,t,r)=>{r.d(t,{Zo:()=>h,kt:()=>d});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},h=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(r),c=i,d=u["".concat(p,".").concat(c)]||u[c]||m[c]||a;return r?n.createElement(d,o(o({ref:t},h),{},{components:r})):n.createElement(d,o({ref:t},h))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(87462),i=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-11-04-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},o="High level overview",l={permalink:"/cardano-updates/2022-11-04-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-mithril.md",source:"@site/blog/2022-11-04-mithril.md",title:"Mithril Team Update",description:"This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.",date:"2022-11-04T00:00:00.000Z",formattedDate:"November 4, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.015,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Mithril Team Update",slug:"2022-11-04-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-04-hydra"},nextItem:{title:"Open-Source Team",permalink:"/cardano-updates/2022-10-31-open-source"}},p={authorsImageUrls:[void 0]},s=[],h={toc:s},u="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(u,(0,n.Z)({},h,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates."),(0,i.kt)("h1",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"We have been moving forward on the implementation of the release process ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/500"},"#500"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Setup of the new hosted environments for ",(0,i.kt)("inlineCode",{parentName:"li"},"testing-preview"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"pre-release-preview")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"release-preprod")," with their terraform and GitHub environments ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/542"},"#542")),(0,i.kt)("li",{parentName:"ul"},"Adapted the CI workflows to work with the new release process ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/543"},"#543")),(0,i.kt)("li",{parentName:"ul"},"Publication of an ",(0,i.kt)("a",{parentName:"li",href:"https://mithril.network/doc/adr/3"},"ADR3")),(0,i.kt)("li",{parentName:"ul"},"Publication of a ",(0,i.kt)("a",{parentName:"li",href:"https://mithril.network/doc/dev-blog/2022/10/28/updated-environments"},"dev blog post")," about Mithril networks evolution "),(0,i.kt)("li",{parentName:"ul"},"Releasing our first Mithril distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2244.0"},"2244.0")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the API versioning mechanism ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/565"},"#565")),(0,i.kt)("li",{parentName:"ul"},"Worked on the implementation of the stores migration process for the signer and aggregator nodes ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/562"},"#562")),(0,i.kt)("li",{parentName:"ul"},"Prepared a Mithril ",(0,i.kt)("inlineCode",{parentName:"li"},"devnet")," video demo ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/526"},"#526")),(0,i.kt)("li",{parentName:"ul"},"Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/484"},"#484"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.75d4fe89.js b/assets/js/14eb3368.75d4fe89.js new file mode 100644 index 00000000000..b68945b7bca --- /dev/null +++ b/assets/js/14eb3368.75d4fe89.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[9817],{31986:(e,t,a)=>{a.d(t,{Z:()=>p});var n=a(87462),r=a(67294),i=a(86010),l=a(35281),s=a(52802),c=a(48596),o=a(39960),m=a(44996),d=a(95999);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const h={breadcrumbsContainer:"breadcrumbsContainer_Z_bl",breadcrumbHomeIcon:"breadcrumbHomeIcon_OVgt"};function b(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function v(e){let{children:t,active:a,index:l,addMicrodata:s}=e;return r.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function g(){const e=(0,m.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:(0,i.Z)("breadcrumbs__link",h.breadcrumbsItemLink),href:e},r.createElement(u,{className:h.breadcrumbHomeIcon})))}function p(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,h.breadcrumbsContainer),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(g,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(v,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(b,{href:t.href,isLast:n},t.label))})))):null}},34228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>I});var n=a(67294),r=a(1944),i=a(52802),l=a(44996),s=a(86010),c=a(39960),o=a(13919),m=a(95999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,s.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,s.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,s.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(80049),N=a(23120),Z=a(44364),k=a(31986),_=a(92503);const L={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:L.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(_.Z,{as:"h1",className:L.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:L.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function I(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},80049:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(87462),r=a(67294),i=a(95999),l=a(32244);function s(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&r.createElement(l.Z,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(l.Z,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},44364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(67294),r=a(86010),i=a(95999),l=a(35281),s=a(74477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},23120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(67294),r=a(86010),i=a(52263),l=a(39960),s=a(95999),c=a(80143),o=a(35281),m=a(60373),d=a(74477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(s.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},92503:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(87462),r=a(67294),i=a(86010),l=a(95999),s=a(86668);const c={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function o(e){let{as:t,id:a,...o}=e;const{navbar:{hideOnScroll:m}}=(0,s.L)();return"h1"!==t&&a?r.createElement(t,(0,n.Z)({},o,{className:(0,i.Z)("anchor",m?c.anchorWithHideOnScrollNavbar:c.anchorWithStickyNavbar),id:a}),o.children,r.createElement("a",{className:"hash-link",href:`#${a}`,title:(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to heading",description:"Title for link to heading"})},"\u200b")):r.createElement(t,(0,n.Z)({},o,{id:void 0}))}},32244:(e,t,a)=>{a.d(t,{Z:()=>l});var n=a(67294),r=a(86010),i=a(39960);function l(e){const{permalink:t,title:a,subLabel:l,isNext:s}=e;return n.createElement(i.Z,{className:(0,r.Z)("pagination-nav__link",s?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},l&&n.createElement("div",{className:"pagination-nav__sublabel"},l),n.createElement("div",{className:"pagination-nav__label"},a))}}}]); \ No newline at end of file diff --git a/assets/js/14fc0a72.a4681214.js b/assets/js/14fc0a72.a4681214.js new file mode 100644 index 00000000000..cfc542ed521 --- /dev/null +++ b/assets/js/14fc0a72.a4681214.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43686],{52256:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/performance-tracing","page":1,"postsPerPage":5,"totalPages":5,"totalCount":25,"nextPage":"/cardano-updates/tags/performance-tracing/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/14ffac04.cf60f381.js b/assets/js/14ffac04.cf60f381.js new file mode 100644 index 00000000000..1bca6a1e668 --- /dev/null +++ b/assets/js/14ffac04.cf60f381.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59494],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(a),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||n;return a?r.createElement(h,o(o({ref:t},d),{},{components:a})):r.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:l,o[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-09-01-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-09-01-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-ledger.md",source:"@site/blog/2023-09-01-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.355,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-09-01-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-01-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-01-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3},{value:"Testing",id:"testing",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"Broadly speaking the Ledger team focused on a few main areas of Conway era:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Creation of voting state snapshots in order to correctly delay ratification for one epoch"),(0,l.kt)("li",{parentName:"ul"},"Validation of the Governance Actions sequencing and ordering"),(0,l.kt)("li",{parentName:"ul"},"Proper expiry of DReps and Proposal Procedures"),(0,l.kt)("li",{parentName:"ul"},"Expanding Conway Genesis functionality"),(0,l.kt)("li",{parentName:"ul"},"Utilization of some of the new Protocol Parameters in ledger validation rules")),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway-era"},"Conway era"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3659"},"pull-3659")," - Validate Network for ProposalProcedure and TreasuryWithdrawal"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3637"},"pull-3637")," - Avoid using sequence of tuples, by adding GovActionId to GovActionState"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3651"},"pull-3651")," - Inactive DReps"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3664"},"pull-3664")," - Track proposal expiry"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3668"},"pull-3668")," - Add min committee size predicate to NewCommittee"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3669"},"pull-3669")," - Add Proposal deposit check against PParam"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3676"},"pull-3676")," - Fix inactive PoolStake not counting as Drep Stake"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3635"},"pull-3635")," - Make snapshots of GovActionsState"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3670"},"pull-3670")," - Validate previously enacted govAction"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3694"},"pull-3694")," - Improve error reporting on the positive coin decoder"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3674"},"pull-3674")," - Added RATIFY thresholds"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3684"},"pull-3684")," - Add proposal delaying, remove predicate failure from ENACT"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3688"},"pull-3688")," - DRep Refunds and update evalTransactionBalance")),(0,l.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3677"},"pull-3677")," - Minor patch that fixes the DRep distribution computation"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3686"},"pull-3686")," - Post patch release fixup"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3695"},"pull-3695")," - Changelog for cardano-node-8.3 release"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3683"},"pull-3683")," - Add two new bench mark programs")),(0,l.kt)("h3",{id:"testing"},"Testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3662"},"pull-3662")," - Equality on raw types")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/15072f11.49e121a3.js b/assets/js/15072f11.49e121a3.js new file mode 100644 index 00000000000..dae693cb273 --- /dev/null +++ b/assets/js/15072f11.49e121a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83129],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),d=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=d(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=d(r),m=n,g=s["".concat(u,".").concat(m)]||s[m]||c[m]||o;return r?a.createElement(g,l(l({ref:t},p),{},{components:r})):a.createElement(g,l({ref:t},p))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:n,l[1]=i;for(var d=2;d{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-11-07-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/quarterly/2022-11-07-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-07-ledger.md",source:"@site/quarterly/2022-11-07-ledger.md",title:"Ledger Team Update",description:"Ledger Quarterly Update",date:"2022-11-07T00:00:00.000Z",formattedDate:"November 7, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/quarterly/tags/ledger"}],readingTime:1.255,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-07-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/quarterly/2022-11-09-network"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/quarterly/2022-10-07-node-cli-api"}},u={authorsImageUrls:[void 0]},d=[{value:"Ledger Quarterly Update",id:"ledger-quarterly-update",level:2},{value:"2022-09 - 2022-11-04",id:"2022-09---2022-11-04",level:2},{value:"Next steps",id:"next-steps",level:2}],p={toc:d},s="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"ledger-quarterly-update"},"Ledger Quarterly Update"),(0,n.kt)("h2",{id:"2022-09---2022-11-04"},"2022-09 - 2022-11-04"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We finished a minimal ledger era capable of master key rotation.\nThis will be re-purposed our upcoming work."),(0,n.kt)("li",{parentName:"ul"},"We have the humble beginnings of a proper ledger API."),(0,n.kt)("li",{parentName:"ul"},"We improved the problematic cost model serialization\n(recall the song and dance about updating the cost model one epoch after the hard fork)."),(0,n.kt)("li",{parentName:"ul"},"We have added benchmarks for problematic areas."),(0,n.kt)("li",{parentName:"ul"},"Massive repository restructure and cleanup.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Unified and consistent variable name schemes (not completely finished, but nearly there)."),(0,n.kt)("li",{parentName:"ul"},"Massive reduction in type constraints, which causes a lot of developer friction,\nin our code and also downstream."),(0,n.kt)("li",{parentName:"ul"},"More organized module structures."),(0,n.kt)("li",{parentName:"ul"},"Improved generators for our property tests."),(0,n.kt)("li",{parentName:"ul"},"We removed our dependency on cardano-prelude."))),(0,n.kt)("li",{parentName:"ul"},"The formal ledger model has come a long way.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"We created a fork of Agda that provides some meta-programming support for the ledger rules."),(0,n.kt)("li",{parentName:"ul"},"We have a large amount of the basic UTxO support in the model."),(0,n.kt)("li",{parentName:"ul"},"We can generate a good looking PDF from the model."),(0,n.kt)("li",{parentName:"ul"},"We can produce Haskell from the model."),(0,n.kt)("li",{parentName:"ul"},"We have a nice finite set theory library that we can use for many of the ledger rules."),(0,n.kt)("li",{parentName:"ul"},"We have nix support for the model.")))),(0,n.kt)("h2",{id:"next-steps"},"Next steps"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Individual tracking of deposits. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3113"},"issue-3113"),"]"),(0,n.kt)("li",{parentName:"ul"},"Versioned CBOR encoders/decoders. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3014"},"issue-3014"),"]"),(0,n.kt)("li",{parentName:"ul"},"New ledger era transaction body (and the surround work associated with it)."),(0,n.kt)("li",{parentName:"ul"},"Designs for the next ledger era.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/154dea53.1fc8ba85.js b/assets/js/154dea53.1fc8ba85.js new file mode 100644 index 00000000000..bf365f05d61 --- /dev/null +++ b/assets/js/154dea53.1fc8ba85.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45542],{46622:a=>{a.exports=JSON.parse('{"label":"ledger","permalink":"/cardano-updates/tags/ledger","allTagsPath":"/cardano-updates/tags","count":30}')}}]); \ No newline at end of file diff --git a/assets/js/15691c1d.51e197de.js b/assets/js/15691c1d.51e197de.js new file mode 100644 index 00000000000..9626a2cb299 --- /dev/null +++ b/assets/js/15691c1d.51e197de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43729],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>y});var i=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),u=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),h=a,y=d["".concat(l,".").concat(h)]||d[h]||p[h]||r;return n?i.createElement(y,o(o({ref:t},c),{},{components:n})):i.createElement(y,o({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var i=n(87462),a=(n(67294),n(3905));const r={title:"SECP bindings Security Issue Report",slug:"2023-08-17-secp-issue",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2023-08-17-secp-issue",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-secp-security-issue-report.md",source:"@site/blog/2023-08-17-secp-security-issue-report.md",title:"SECP bindings Security Issue Report",description:"Security Issue Report: SECP256k1 bug",date:"2023-08-17T00:00:00.000Z",formattedDate:"August 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:3.3,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"SECP bindings Security Issue Report",slug:"2023-08-17-secp-issue",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-08-17-db-sync"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-15-node-cli-api"}},l={authorsImageUrls:[void 0]},u=[{value:"Security Issue Report: SECP256k1 bug",id:"security-issue-report-secp256k1-bug",level:2},{value:"Summary of Issue",id:"summary-of-issue",level:3},{value:"Criticality Level",id:"criticality-level",level:4},{value:"What Action was Taken",id:"what-action-was-taken",level:4},{value:"Potential Effect",id:"potential-effect",level:4},{value:"Actual Effect",id:"actual-effect",level:4},{value:"Ongoing Mitigations Needed, if any",id:"ongoing-mitigations-needed-if-any",level:4},{value:"Responsibility for Mitigations",id:"responsibility-for-mitigations",level:4},{value:"Detailed description of Incident",id:"detailed-description-of-incident",level:3},{value:"Recommendations",id:"recommendations",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,i.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"security-issue-report-secp256k1-bug"},"Security Issue Report: SECP256k1 bug"),(0,a.kt)("p",null,"Date Occurred: July 15, 2022\nSeverity: Potentially Very High if exploited on Mainnet\nAuthors: I\xf1igo Querejeta Azurmendi"),(0,a.kt)("p",null,"Date of Report: August 17, 2023"),(0,a.kt)("h3",{id:"summary-of-issue"},"Summary of Issue"),(0,a.kt)("h4",{id:"criticality-level"},"Criticality Level"),(0,a.kt)("p",null,"Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet\nContext"),(0,a.kt)("p",null,"New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains.\nHow was the Issue Detected"),(0,a.kt)("p",null,"The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there."),(0,a.kt)("h4",{id:"what-action-was-taken"},"What Action was Taken"),(0,a.kt)("p",null,"The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod).\nFixes were applied to prevent the use of the primitives.\nA full security audit was carried out on the bindings.\nThe rollout of the primitives was postponed to a new hard fork (Valentine)"),(0,a.kt)("h4",{id:"potential-effect"},"Potential Effect"),(0,a.kt)("p",null,"The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction."),(0,a.kt)("h4",{id:"actual-effect"},"Actual Effect"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Delay to the Vasil hard-fork"),(0,a.kt)("li",{parentName:"ul"},"Temporary removal of SECP256k1 primitives"),(0,a.kt)("li",{parentName:"ul"},"Additional hard-fork to introduce SECP256k1 primitives")),(0,a.kt)("h4",{id:"ongoing-mitigations-needed-if-any"},"Ongoing Mitigations Needed, if any"),(0,a.kt)("p",null,"None"),(0,a.kt)("h4",{id:"responsibility-for-mitigations"},"Responsibility for Mitigations"),(0,a.kt)("p",null,"Core team"),(0,a.kt)("h3",{id:"detailed-description-of-incident"},"Detailed description of Incident"),(0,a.kt)("p",null,"New Plutus ",(0,a.kt)("strong",{parentName:"p"},"secp256k1")," cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet."),(0,a.kt)("p",null,"The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h#L518"},"This")," is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h#L61"},"expected")," structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely."),(0,a.kt)("li",{parentName:"ul"},"The same happened with the Schnorr ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1_schnorrsig.h#L170"},"verification function"),". It takes as input a SECP256k1_xonly_pubkey, which is again an ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1_extrakeys.h#L10"},"opaque structure")," that holds a parsed and valid public key.")),(0,a.kt)("p",null,"The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated."),(0,a.kt)("p",null,"The fix was addressed in ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/289"},"this")," PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts."),(0,a.kt)("h3",{id:"recommendations"},"Recommendations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Check all new Plutus bindings for correct use."),(0,a.kt)("li",{parentName:"ul"},"Audit all new Plutus built-in bindings."),(0,a.kt)("li",{parentName:"ul"},"Continue to develop specific End-to-End tests for all new Plutus features."),(0,a.kt)("li",{parentName:"ul"},'Do not assume that any existing library functions are "safe". Treat all external calls circumspectly.')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/15dc596d.ecdc1050.js b/assets/js/15dc596d.ecdc1050.js new file mode 100644 index 00000000000..72138efb580 --- /dev/null +++ b/assets/js/15dc596d.ecdc1050.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6962],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,y=c["".concat(l,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(y,s(s({ref:t},u),{},{components:r})):n.createElement(y,s({ref:t},u))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:a,s[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"System Test Team Update",slug:"2022-11-02-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-11-02-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-system-test.md",source:"@site/blog/2022-11-02-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.4,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"System Test Team Update",slug:"2022-11-02-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2022-11-02-release"},nextItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-11-01-db-sync"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have been focused on:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Fully opening our test results (on top of the existing tests & tools):",(0,a.kt)("br",{parentName:"li"}),"See ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/"},"cardano-node-tests webpage"),"."),(0,a.kt)("li",{parentName:"ul"},"Started to test and automate the new functionalities added in the ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35.4-rc1")," node tag",(0,a.kt)("br",{parentName:"li"}),"See ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.4_rc1/src_docs/source/test_results/node/tag_1_35_4_rc1.rst"},"test results tracking page"),"."),(0,a.kt)("li",{parentName:"ul"},"Made some improvements to the automated db-sync sync tests",(0,a.kt)("br",{parentName:"li"}),"See ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/tree/db_sync_tests/db_sync_tests"},"db-sync tests"),"."),(0,a.kt)("li",{parentName:"ul"},"Multiple cleanups and updates to the cardano-node-tests framework"),(0,a.kt)("li",{parentName:"ul"},"Updated the nightly pipelines for the cardano-node-tests after the Babbage HF")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/166775fd.be23135f.js b/assets/js/166775fd.be23135f.js new file mode 100644 index 00000000000..520e315ed9d --- /dev/null +++ b/assets/js/166775fd.be23135f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[99847],{39399:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/ledger/page/2","page":2,"postsPerPage":5,"totalPages":6,"totalCount":30,"previousPage":"/cardano-updates/tags/ledger","nextPage":"/cardano-updates/tags/ledger/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/16a93549.ab7d990e.js b/assets/js/16a93549.ab7d990e.js new file mode 100644 index 00000000000..84faca841d5 --- /dev/null +++ b/assets/js/16a93549.ab7d990e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4307],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},d=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(r),m=n,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||o;return r?a.createElement(h,l(l({ref:t},d),{},{components:r})):a.createElement(h,l({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"SRE Team Update",slug:"2023-07-07-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-07-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-sre.md",source:"@site/blog/2023-07-07-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.815,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-07-07-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-07-hydra"},nextItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-07-06-developer-experience"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ogmios",id:"cardano-ogmios",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-rosetta",id:"cardano-rosetta",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Spongix",id:"spongix",level:3}],d={toc:u},c="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment"),(0,n.kt)("li",{parentName:"ul"},"Explorer component updates"),(0,n.kt)("li",{parentName:"ul"},"Spongix caching server rewrite for R2 Cloudflare support and various performance improvements")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Nixos service update to enable non-systemd socket activation multi-node relays: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5360"},"cardano-node-pull-5360"))),(0,n.kt)("h3",{id:"cardano-ogmios"},"Cardano-ogmios"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano ogmios bump to 5.6.0 for nixos service: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ogmios/pull/6"},"cardano-ogmios-pull-6"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/88a17c9...dfde751"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-rosetta"},"Cardano-rosetta"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-rosetta nixos modifications for rosetta 2.1.0 service: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/cardano-rosetta/pull/532"},"cardano-rosetta-pull-532"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-node entrypoint improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/99"},"cardano-world-pull-99")),(0,n.kt)("li",{parentName:"ul"},"Further automate pool performance SQL query: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/100"},"cardano-world-pull-100")),(0,n.kt)("li",{parentName:"ul"},"Performance and benchmark job related tweaks: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/02f1ba424d3e36bd114df6f53b769d2cd25301c3"},"cardano-world-commit")),(0,n.kt)("li",{parentName:"ul"},"Explorer related component version bumps and traefik definition handline: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/101"},"cardano-world-pull-101"))),(0,n.kt)("h3",{id:"spongix"},"Spongix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/spongix/compare/afd77728f5823d61732425df52a363949096e163...4890ff93308f45584bea8443cc13fbc16c8ce911"},"spongix-simple-branch"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1752e4e5.873d8644.js b/assets/js/1752e4e5.873d8644.js new file mode 100644 index 00000000000..afdb1b96dc3 --- /dev/null +++ b/assets/js/1752e4e5.873d8644.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[770],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),m=a,d=c["".concat(u,".").concat(m)]||c[m]||h[m]||o;return n?r.createElement(d,s(s({ref:t},p),{},{components:n})):r.createElement(d,s({ref:t},p))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-10-18-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-18-consensus.md",source:"@site/blog/2023-10-18-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-10-18T00:00:00.000Z",formattedDate:"October 18, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-20-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-18-mithril"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Support",id:"support",level:3}],p={toc:l},c="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node."),(0,a.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The Plutus workload benchmark for the in-memory backend ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/203#issuecomment-1768560330"},"showed no regressions")," for the metrics of interest, but it does show an increase in resource usage."),(0,a.kt)("li",{parentName:"ul"},"We got additional ad-hoc ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/5495#issuecomment-1768593069"},"measurements")," on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB."),(0,a.kt)("li",{parentName:"ul"},"We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.")),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We produced the first draft for a Survivable Eclipse Duration Model (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/422"},"422"),").")),(0,a.kt)("h3",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/amesgen"},"Esgen")," finished his cycle as release engineer. Node ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.5.0-pre"},"8.5.0")," has been released."),(0,a.kt)("li",{parentName:"ul"},"We resumed work on the subpar handling of block from the future (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4251"},"4251"),")."),(0,a.kt)("li",{parentName:"ul"},"We prepared the integration of ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5502"},"new tracing events")," for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4251"},"issue"),").")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/17630979.ef34abf8.js b/assets/js/17630979.ef34abf8.js new file mode 100644 index 00000000000..678816b97c8 --- /dev/null +++ b/assets/js/17630979.ef34abf8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93724],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,y=c["".concat(l,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(y,s(s({ref:t},u),{},{components:r})):n.createElement(y,s({ref:t},u))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:a,s[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"System Test Team Update",slug:"2022-11-02-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-11-02-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-system-test.md",source:"@site/blog/2022-11-02-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.4,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"System Test Team Update",slug:"2022-11-02-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2022-11-02-release"},nextItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-11-01-db-sync"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have been focused on:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Fully opening our test results (on top of the existing tests & tools):",(0,a.kt)("br",{parentName:"li"}),"See ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/"},"cardano-node-tests webpage"),"."),(0,a.kt)("li",{parentName:"ul"},"Started to test and automate the new functionalities added in the ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35.4-rc1")," node tag",(0,a.kt)("br",{parentName:"li"}),"See ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.4_rc1/src_docs/source/test_results/node/tag_1_35_4_rc1.rst"},"test results tracking page"),"."),(0,a.kt)("li",{parentName:"ul"},"Made some improvements to the automated db-sync sync tests",(0,a.kt)("br",{parentName:"li"}),"See ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/tree/db_sync_tests/db_sync_tests"},"db-sync tests"),"."),(0,a.kt)("li",{parentName:"ul"},"Multiple cleanups and updates to the cardano-node-tests framework"),(0,a.kt)("li",{parentName:"ul"},"Updated the nightly pipelines for the cardano-node-tests after the Babbage HF")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/177280a4.d0786185.js b/assets/js/177280a4.d0786185.js new file mode 100644 index 00000000000..8081deba1ed --- /dev/null +++ b/assets/js/177280a4.d0786185.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95447],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(a),c=n,m=u["".concat(p,".").concat(c)]||u[c]||d[c]||o;return a?r.createElement(m,i(i({ref:t},h),{},{components:a})):r.createElement(m,i({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-11-11-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-11-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-hydra.md",source:"@site/blog/2022-11-11-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.94,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-11-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-11-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-11-ledger"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:s},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team published together with Obsidian Systems a light paper\non our "Hydra for Payments" project (',(0,n.kt)("a",{parentName:"p",href:"https://iohk.io/en/blog/posts/2022/11/10/hydra-for-payments-introducing-developer-tooling-to-unlock-micropayments-on-cardano/"},"Link"),"). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," processes. "),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published Hydra for Payments light paper (",(0,n.kt)("a",{parentName:"li",href:"https://iohk.io/en/blog/posts/2022/11/10/hydra-for-payments-introducing-developer-tooling-to-unlock-micropayments-on-cardano/"},"Link"),")"),(0,n.kt)("li",{parentName:"ul"},"Have a draft RFP ready for a first review internally"),(0,n.kt)("li",{parentName:"ul"},"Answered the internal auditor","\u2019","s questions"),(0,n.kt)("li",{parentName:"ul"},"Fixed a bug with following the chain when starting with persistence (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/599"},"#599"),")"),(0,n.kt)("li",{parentName:"ul"},"Minor improvements to logging for better observability (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/598"},"#598"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/600"},"#600"),")"),(0,n.kt)("li",{parentName:"ul"},"Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/590"},"#590"),")")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement event-sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Close more gaps ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: ",(0,n.kt)("strong",{parentName:"li"},'"Developing Hydra" on Day 2, Nov 21st, 13:50 CET'))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/17896441.12db7610.js b/assets/js/17896441.12db7610.js new file mode 100644 index 00000000000..549ad1badea --- /dev/null +++ b/assets/js/17896441.12db7610.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27918],{31986:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(87462),l=n(67294),r=n(86010),o=n(35281),s=n(52802),c=n(48596),i=n(39960),d=n(44996),m=n(95999);function u(e){return l.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),l.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl",breadcrumbHomeIcon:"breadcrumbHomeIcon_OVgt"};function b(e){let{children:t,href:n,isLast:a}=e;const r="breadcrumbs__link";return a?l.createElement("span",{className:r,itemProp:"name"},t):n?l.createElement(i.Z,{className:r,href:n,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:r},t)}function p(e){let{children:t,active:n,index:o,addMicrodata:s}=e;return l.createElement("li",(0,a.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,r.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,l.createElement("meta",{itemProp:"position",content:String(o+1)}))}function h(){const e=(0,d.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:(0,r.Z)("breadcrumbs__link",v.breadcrumbsItemLink),href:e},l.createElement(u,{className:v.breadcrumbHomeIcon})))}function g(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,r.Z)(o.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(h,null),e.map(((t,n)=>{const a=n===e.length-1;return l.createElement(p,{key:n,active:a,index:n,addMicrodata:!!t.href},l.createElement(b,{href:t.href,isLast:a},t.label))})))):null}},15154:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});var a=n(67294),l=n(1944),r=n(902);const o=a.createContext(null);function s(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(o.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(o);if(null===e)throw new r.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(86010),m=n(87524),u=n(80049);function v(){const{metadata:e}=c();return a.createElement(u.Z,{previous:e.previous,next:e.next})}var b=n(23120),p=n(44364),h=n(35281),g=n(95999);function E(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(g.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function f(e){let{lastUpdatedBy:t}=e;return a.createElement(g.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function L(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:h.k.common.lastUpdated},a.createElement(g.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(E,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(f,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var Z=n(84881),N=n(71526);const C={lastUpdated:"lastUpdated_vwxv"};function _(e){return a.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(N.Z,e)))}function k(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:r}=e;return a.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(Z.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",C.lastUpdated)},(n||l)&&a.createElement(L,{lastUpdatedAt:n,formattedLastUpdatedAt:r,lastUpdatedBy:l})))}function x(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:r,tags:o}=e,s=o.length>0,i=!!(t||n||r);return s||i?a.createElement("footer",{className:(0,d.Z)(h.k.docs.docFooter,"docusaurus-mt-lg")},s&&a.createElement(_,{tags:o}),i&&a.createElement(k,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:l})):null}var T=n(86043),H=n(93743),U=n(87462);const y={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function A(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,U.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",y.tocCollapsibleButton,!t&&y.tocCollapsibleButtonExpanded,n.className)}),a.createElement(g.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const w={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function I(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:r}=e;const{collapsed:o,toggleCollapsed:s}=(0,T.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(w.tocCollapsible,!o&&w.tocCollapsibleExpanded,n)},a.createElement(A,{collapsed:o,onClick:s}),a.createElement(T.z,{lazy:!0,className:w.tocCollapsibleContent,collapsed:o},a.createElement(H.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:r})))}const M={tocMobile:"tocMobile_ITEo"};function B(){const{toc:e,frontMatter:t}=c();return a.createElement(I,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(h.k.docs.docTocMobile,M.tocMobile)})}var O=n(39407);function V(){const{toc:e,frontMatter:t}=c();return a.createElement(O.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:h.k.docs.docTocDesktop})}var S=n(92503),P=n(80210);function R(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(h.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(S.Z,{as:"h1"},n)),a.createElement(P.Z,null,t))}var D=n(31986);const z={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function F(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,r=!l&&t.length>0;return{hidden:l,mobile:r?a.createElement(B,null):void 0,desktop:!r||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(V,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&z.docItemCol)},a.createElement(b.Z,null),a.createElement("div",{className:z.docItemContainer},a.createElement("article",null,a.createElement(D.Z,null),a.createElement(p.Z,null),n.mobile,a.createElement(R,null,t),a.createElement(x,null)),a.createElement(v,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function j(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(s,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement(F,null,a.createElement(n,null))))}},80049:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(87462),l=n(67294),r=n(95999),o=n(32244);function s(e){const{previous:t,next:n}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,r.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&l.createElement(o.Z,(0,a.Z)({},t,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&l.createElement(o.Z,(0,a.Z)({},n,{subLabel:l.createElement(r.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},44364:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(67294),l=n(86010),r=n(95999),o=n(35281),s=n(74477);function c(e){let{className:t}=e;const n=(0,s.E)();return n.badge?a.createElement("span",{className:(0,l.Z)(t,o.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(r.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}},23120:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(67294),l=n(86010),r=n(52263),o=n(39960),s=n(95999),c=n(80143),i=n(35281),d=n(60373),m=n(74477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function v(e){const t=u[e.versionMetadata.banner];return a.createElement(t,e)}function b(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(o.Z,{to:n,onClick:l},a.createElement(s.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function p(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:o}}=(0,r.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:p}=(0,c.Jo)(s),h=u??(g=p).docs.find((e=>e.id===g.mainDocId));var g;return a.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(v,{siteTitle:o,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(b,{versionLabel:p.label,to:h.path,onClick:()=>m(p.name)})))}function h(e){let{className:t}=e;const n=(0,m.E)();return n.banner?a.createElement(p,{className:t,versionMetadata:n}):null}},84881:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(67294),l=n(95999),r=n(35281),o=n(87462),s=n(86010);const c={iconEdit:"iconEdit_Z9Sw"};function i(e){let{className:t,...n}=e;return a.createElement("svg",(0,o.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.Z)(c.iconEdit,t),"aria-hidden":"true"},n),a.createElement("g",null,a.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function d(e){let{editUrl:t}=e;return a.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:r.k.common.editThisPage},a.createElement(i,null),a.createElement(l.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},32244:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(67294),l=n(86010),r=n(39960);function o(e){const{permalink:t,title:n,subLabel:o,isNext:s}=e;return a.createElement(r.Z,{className:(0,l.Z)("pagination-nav__link",s?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},o&&a.createElement("div",{className:"pagination-nav__sublabel"},o),a.createElement("div",{className:"pagination-nav__label"},n))}},39407:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(87462),l=n(67294),r=n(86010),o=n(93743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",i="table-of-contents__link--active";function d(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(s.tableOfContents,"thin-scrollbar",t)},l.createElement(o.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:i})))}},93743:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(87462),l=n(67294),r=n(86668);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function s(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=s({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:o}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:o}),c=i(s,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...b}=e;const p=(0,r.L)(),h=d??p.tableOfContents.minHeadingLevel,g=u??p.tableOfContents.maxHeadingLevel,E=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>s({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:h,maxHeadingLevel:g});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:h,maxHeadingLevel:g}}),[c,i,h,g])),l.createElement(v,(0,a.Z)({toc:E,className:n,linkClassName:c},b))}},13008:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(67294),l=n(86010),r=n(39960);const o={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function s(e){let{permalink:t,label:n,count:s}=e;return a.createElement(r.Z,{href:t,className:(0,l.Z)(o.tag,s?o.tagWithCount:o.tagRegular)},n,s&&a.createElement("span",null,s))}},71526:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(67294),l=n(86010),r=n(95999),o=n(13008);const s={tags:"tags_jXut",tag:"tag_QGVx"};function c(e){let{tags:t}=e;return a.createElement(a.Fragment,null,a.createElement("b",null,a.createElement(r.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),a.createElement("ul",{className:(0,l.Z)(s.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:n}=e;return a.createElement("li",{key:n,className:s.tag},a.createElement(o.Z,{label:t,permalink:n}))}))))}}}]); \ No newline at end of file diff --git a/assets/js/17e76f05.72c79f2a.js b/assets/js/17e76f05.72c79f2a.js new file mode 100644 index 00000000000..559a43bd396 --- /dev/null +++ b/assets/js/17e76f05.72c79f2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64966],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),h=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=h(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=h(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||p[c]||i;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var h=2;h{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-05-12-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-12-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-hydra.md",source:"@site/blog/2023-05-12-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.145,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-05-12-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-12-goedel"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-12-network"}},s={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:h},u="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team achieved a number of milestones, including the release\nof the first mainnet compatible version. Besides this they also addressed\ninconsistencies in rollback handling, added an architecture page to the website,\nreducing the size of logs using event IDs. They also had productive discussions\nwith researchers on plans for incremental commits/decommits and had a whiteboard\nsession on DeFi and lending protocols. The goals for next week include\ncompleting the validation of the timed transactions feature, exploring stateless\nobservation, refining the Hydra explorer ticket, writing ops instructions and\ntroubleshooting, and implementing the first end-to-end journey for external\ncommits."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released first mainnnet compatible version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.10.0"},"0.10.0")),(0,n.kt)("li",{parentName:"ul"},"Addressed inconsist handling of rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/core-concepts/architecture/"},"architecture page")," and fixed haddock links on our website ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/838"},"#838")),(0,n.kt)("li",{parentName:"ul"},"Opened a new hydra head on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Talked with researchers on initial plan for incremental commits/decommits"),(0,n.kt)("li",{parentName:"ul"},"Had a Whiteboard session on DeFi and lending protocols"),(0,n.kt)("li",{parentName:"ul"},"Reduced size of logs using event ids ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/859"},"#859")),(0,n.kt)("li",{parentName:"ul"},"Published the ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-04"},"monthly report for April"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete validation of timed transactions feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/196"},"#196")),(0,n.kt)("li",{parentName:"ul"},"Explored stateless observation and refined hydra explorer ticket ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/696"},"#696")),(0,n.kt)("li",{parentName:"ul"},"Write ","\u201c","ops","\u201d"," instructions and troubleshooting ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/569"},"#569")," and improve logs"),(0,n.kt)("li",{parentName:"ul"},"Have a first end-to-end journey for external commits implemented ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/17f4ca64.bfe3c38a.js b/assets/js/17f4ca64.bfe3c38a.js new file mode 100644 index 00000000000..f4fd74ed619 --- /dev/null +++ b/assets/js/17f4ca64.bfe3c38a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[37426],{32942:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/mithril/page/3","page":3,"postsPerPage":5,"totalPages":7,"totalCount":34,"previousPage":"/cardano-updates/tags/mithril/page/2","nextPage":"/cardano-updates/tags/mithril/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/187056c8.90cfbf91.js b/assets/js/187056c8.90cfbf91.js new file mode 100644 index 00000000000..23d662506cd --- /dev/null +++ b/assets/js/187056c8.90cfbf91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40430],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(r),d=n,h=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return r?a.createElement(h,i(i({ref:t},s),{},{components:r})):a.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2022-11-11-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-11-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-crypto.md",source:"@site/blog/2022-11-11-crypto.md",title:"Crypto Team Update",description:"High level overview",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.305,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-11-11-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-16-performance-and-tracing"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-11-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The SECP primitives AC has been met, and the test-vectors ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/320"},"PR")," has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/336"},"PR")," has been merged, and we've adapted the KES secure ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"PR")," to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#"),"). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork. "),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation. "),(0,n.kt)("li",{parentName:"ul"},"We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool. "),(0,n.kt)("li",{parentName:"ul"},"In parallel, we keep progressing on the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent"},"KES agent")),(0,n.kt)("li",{parentName:"ul"},"VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification. "),(0,n.kt)("li",{parentName:"ul"},"Our libsodium fork now links directly to upstream libsodium.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/18c41134.31284dc4.js b/assets/js/18c41134.31284dc4.js new file mode 100644 index 00000000000..c434dbdfcf2 --- /dev/null +++ b/assets/js/18c41134.31284dc4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[82859],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>k});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,k=d["".concat(l,".").concat(m)]||d[m]||p[m]||o;return n?r.createElement(k,s(s({ref:t},c),{},{components:n})):r.createElement(k,s({ref:t},c))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var u=2;u{n.r(t),n.d(t,{Highlight:()=>c,assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={sidebar_position:4},s="Markdown Features",i={unversionedId:"tutorial-basics/markdown-features",id:"tutorial-basics/markdown-features",title:"Markdown Features",description:"Docusaurus supports Markdown and a few additional features.",source:"@site/docs/tutorial-basics/markdown-features.mdx",sourceDirName:"tutorial-basics",slug:"/tutorial-basics/markdown-features",permalink:"/cardano-updates/docs/tutorial-basics/markdown-features",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"defaultSidebar",previous:{title:"Create a Blog Post",permalink:"/cardano-updates/docs/tutorial-basics/create-a-blog-post"},next:{title:"Deploy your site",permalink:"/cardano-updates/docs/tutorial-basics/deploy-your-site"}},l={},u=[{value:"Front Matter",id:"front-matter",level:2},{value:"Links",id:"links",level:2},{value:"Images",id:"images",level:2},{value:"Code Blocks",id:"code-blocks",level:2},{value:"Admonitions",id:"admonitions",level:2},{value:"MDX and React Components",id:"mdx-and-react-components",level:2}],c=e=>{let{children:t,color:n}=e;return(0,a.kt)("span",{style:{backgroundColor:n,borderRadius:"20px",color:"#fff",padding:"10px",cursor:"pointer"},onClick:()=>{alert(`You clicked the color ${n} with label ${t}`)}},t)},d={toc:u,Highlight:c},p="wrapper";function m(e){let{components:t,...o}=e;return(0,a.kt)(p,(0,r.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"markdown-features"},"Markdown Features"),(0,a.kt)("p",null,"Docusaurus supports ",(0,a.kt)("strong",{parentName:"p"},(0,a.kt)("a",{parentName:"strong",href:"https://daringfireball.net/projects/markdown/syntax"},"Markdown"))," and a few ",(0,a.kt)("strong",{parentName:"p"},"additional features"),"."),(0,a.kt)("h2",{id:"front-matter"},"Front Matter"),(0,a.kt)("p",null,"Markdown documents have metadata at the top called ",(0,a.kt)("a",{parentName:"p",href:"https://jekyllrb.com/docs/front-matter/"},"Front Matter"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-text",metastring:'title="my-doc.md"',title:'"my-doc.md"'},"// highlight-start\n---\nid: my-doc-id\ntitle: My document title\ndescription: My document description\nslug: /my-custom-url\n---\n// highlight-end\n\n## Markdown heading\n\nMarkdown text with [links](./hello.md)\n")),(0,a.kt)("h2",{id:"links"},"Links"),(0,a.kt)("p",null,"Regular Markdown links are supported, using url paths or relative file paths."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-md"},"Let's see how to [Create a page](/create-a-page).\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-md"},"Let's see how to [Create a page](./create-a-page.md).\n")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Result:")," Let's see how to ",(0,a.kt)("a",{parentName:"p",href:"/cardano-updates/docs/tutorial-basics/create-a-page"},"Create a page"),"."),(0,a.kt)("h2",{id:"images"},"Images"),(0,a.kt)("p",null,"Regular Markdown images are supported."),(0,a.kt)("p",null,"You can use absolute paths to reference images in the static directory (",(0,a.kt)("inlineCode",{parentName:"p"},"static/img/docusaurus.png"),"):"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-md"},"![Docusaurus logo](/img/docusaurus.png)\n")),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Docusaurus logo",src:n(6097).Z,width:"200",height:"200"})),(0,a.kt)("p",null,"You can reference images relative to the current file as well, as shown in ",(0,a.kt)("a",{parentName:"p",href:"/cardano-updates/docs/tutorial-extras/manage-docs-versions"},"the extra guides"),"."),(0,a.kt)("h2",{id:"code-blocks"},"Code Blocks"),(0,a.kt)("p",null,"Markdown code blocks are supported with Syntax highlighting."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'```jsx title="src/components/HelloDocusaurus.js"\nfunction HelloDocusaurus() {\n return (\n

Hello, Docusaurus!

\n )\n}\n```\n')),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-jsx",metastring:'title="src/components/HelloDocusaurus.js"',title:'"src/components/HelloDocusaurus.js"'},"function HelloDocusaurus() {\n return

Hello, Docusaurus!

;\n}\n")),(0,a.kt)("h2",{id:"admonitions"},"Admonitions"),(0,a.kt)("p",null,"Docusaurus has a special syntax to create admonitions and callouts:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},":::tip My tip\n\nUse this awesome feature option\n\n:::\n\n:::danger Take care\n\nThis action is dangerous\n\n:::\n")),(0,a.kt)("admonition",{title:"My tip",type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Use this awesome feature option")),(0,a.kt)("admonition",{title:"Take care",type:"danger"},(0,a.kt)("p",{parentName:"admonition"},"This action is dangerous")),(0,a.kt)("h2",{id:"mdx-and-react-components"},"MDX and React Components"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://mdxjs.com/"},"MDX")," can make your documentation more ",(0,a.kt)("strong",{parentName:"p"},"interactive")," and allows using any ",(0,a.kt)("strong",{parentName:"p"},"React components inside Markdown"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-jsx"},"export const Highlight = ({children, color}) => (\n {\n alert(`You clicked the color ${color} with label ${children}`)\n }}>\n {children}\n \n);\n\nThis is Docusaurus green !\n\nThis is Facebook blue !\n")),(0,a.kt)("p",null,"This is ",(0,a.kt)(c,{color:"#25c2a0",mdxType:"Highlight"},"Docusaurus green")," !"),(0,a.kt)("p",null,"This is ",(0,a.kt)(c,{color:"#1877F2",mdxType:"Highlight"},"Facebook blue")," !"))}m.isMDXComponent=!0},6097:(e,t,n)=>{n.d(t,{Z:()=>r});const r="data:image/png;base64,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"}}]); \ No newline at end of file diff --git a/assets/js/1a21d6a2.8c1f975e.js b/assets/js/1a21d6a2.8c1f975e.js new file mode 100644 index 00000000000..198aedc0663 --- /dev/null +++ b/assets/js/1a21d6a2.8c1f975e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18694],{98253:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/crypto","page":1,"postsPerPage":5,"totalPages":4,"totalCount":18,"nextPage":"/cardano-updates/tags/crypto/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/1a657a20.8a85f02f.js b/assets/js/1a657a20.8a85f02f.js new file mode 100644 index 00000000000..726825e0e30 --- /dev/null +++ b/assets/js/1a657a20.8a85f02f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97382],{26170:a=>{a.exports=JSON.parse('{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api","allTagsPath":"/cardano-updates/tags","count":27}')}}]); \ No newline at end of file diff --git a/assets/js/1a932c01.6aaf6224.js b/assets/js/1a932c01.6aaf6224.js new file mode 100644 index 00000000000..7a7521a9bb7 --- /dev/null +++ b/assets/js/1a932c01.6aaf6224.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2348],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>y});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=p(n),m=a,y=s["".concat(u,".").concat(m)]||s[m]||d[m]||o;return n?r.createElement(y,l(l({ref:t},c),{},{components:n})):r.createElement(y,l({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-08-17-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-17-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-db-sync.md",source:"@site/blog/2023-08-17-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-08-17T00:00:00.000Z",formattedDate:"August 17, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.41,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-08-17-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-17-crypto"},nextItem:{title:"SECP bindings Security Issue Report",permalink:"/cardano-updates/2023-08-17-secp-issue"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],c={toc:p},s="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(s,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have integrated many new Conway feutures and allow db-sync to sync sanchonet.\nWe also continued testing and improving the new db-sync options."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Conway integration\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1484"},"#1484")),(0,a.kt)("li",{parentName:"ul"},"Support for Sanchonet\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1476"},"#1476")),(0,a.kt)("li",{parentName:"ul"},"Stake distribution is computed earlier\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1484"},"#1484")),(0,a.kt)("li",{parentName:"ul"},"Deposit ledger events are now used. This reduces the db queries and makes syncing faster\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1484"},"#1484")),(0,a.kt)("li",{parentName:"ul"},"Testing new db-sync options\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1466"},"#1466")),(0,a.kt)("li",{parentName:"ul"},"Added support for ghc-9.6\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1479"},"#1479")),(0,a.kt)("li",{parentName:"ul"},"Tech debt: improve exceptions\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1471"},"#1471"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1afca88e.5924808c.js b/assets/js/1afca88e.5924808c.js new file mode 100644 index 00000000000..da0ab99a84f --- /dev/null +++ b/assets/js/1afca88e.5924808c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49835],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>m});var n=o(67294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(o),h=r,m=d["".concat(l,".").concat(h)]||d[h]||c[h]||a;return o?n.createElement(m,i(i({ref:t},u),{},{components:o})):n.createElement(m,i({ref:t},u))}));function m(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=o(87462),r=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-10-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-10-02-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-02-network.md",source:"@site/blog/2023-10-02-network.md",title:"Network Team Update",description:"High-level overview of sprint 45",date:"2023-10-02T00:00:00.000Z",formattedDate:"October 2, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.485,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-10-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-04-mithril"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-29-goedel"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level overview of sprint 45",id:"high-level-overview-of-sprint-45",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"Towards Typed Protocols 0.2.0.0",id:"towards-typed-protocols-0200",level:3},{value:"Tech Debt",id:"tech-debt",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"IOSimPOR",id:"iosimpor",level:4},{value:"IOSim",id:"iosim",level:4},{value:"Cardano Newtork Service Assurance",id:"cardano-newtork-service-assurance",level:3},{value:"P2P adoption",id:"p2p-adoption",level:3},{value:"Open Source",id:"open-source",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview-of-sprint-45"},"High-level overview of ",(0,r.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+45%22"},"sprint 45")),(0,r.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,r.kt)("p",null,"We started reviewing the bootstrap peers PR, ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4615"},"ouroboros-network#4615"),"."),(0,r.kt)("h3",{id:"towards-typed-protocols-0200"},"Towards Typed Protocols 0.2.0.0"),(0,r.kt)("p",null,"We discovered a performance regression when using ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0"),", and we\nstarted investigating where it comes from. Currently, we see that\n",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0")," can outperform ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.1.0.0")," when running\nin isolation with a simple ",(0,r.kt)("inlineCode",{parentName:"p"},"ping-pong")," protocol, so the regression might be in\nthe new block fetch implementation which comes with ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0"),"\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/3"},"typed-protocols#3"),"."),(0,r.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,r.kt)("p",null,"We merged two PRs written by Galois engineers:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"a pull request which refactors the main entry function for P2P, see ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3834"},"ouroboros-network#3834"),"; "),(0,r.kt)("li",{parentName:"ul"},"a pull request which reviews usage of ",(0,r.kt)("inlineCode",{parentName:"li"},"unsafe")," function in the network code based.")),(0,r.kt)("p",null,"Galois also made progress with the following two issues:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"add microbenchmarks to some of our tests: ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3832"},"ouroboros-network#3832")),(0,r.kt)("li",{parentName:"ul"},"inspect use of ",(0,r.kt)("inlineCode",{parentName:"li"},"error")," in ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-network")," repository:\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3836"},"ouroboros-network#3836"))),(0,r.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,r.kt)("h4",{id:"iosimpor"},"IOSimPOR"),(0,r.kt)("p",null,"We found and fixed a bug in ",(0,r.kt)("inlineCode",{parentName:"p"},"IOSimPOR"),". We'd like to thank Prof. John Hughes\n(Quviq AB) for helping us with debugging the issue."),(0,r.kt)("p",null,"We also provided a more uniform API for ",(0,r.kt)("inlineCode",{parentName:"p"},"IOSimPOR"),", and added ways to make the\ndebugging similar problems in the future easier."),(0,r.kt)("details",null,(0,r.kt)("summary",null,"Technical Details on IOSim refactoring"),"We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future."),(0,r.kt)("h4",{id:"iosim"},"IOSim"),(0,r.kt)("p",null,"To prepare for the next release, we consolidate packages taking advantage of\nthe public sublibraries supported now both by ",(0,r.kt)("inlineCode",{parentName:"p"},"cabal")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"Hackage"),". This is\na work in progress, ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/issues/114"},"io-sim#114"),"."),(0,r.kt)("h3",{id:"cardano-newtork-service-assurance"},"Cardano Newtork Service Assurance"),(0,r.kt)("p",null,"Galois made the following progress:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A test run of spinning up a CNSA instance was done, as a result documentation\nwas updated."),(0,r.kt)("li",{parentName:"ul"},"Based on the IOG code review of the CNSA code, updates to the CNSA code were\nmade."),(0,r.kt)("li",{parentName:"ul"},'Galois has started the design for adding a CNSA analysis for "fetched bytes\nover time while node is syncing".')),(0,r.kt)("h3",{id:"p2p-adoption"},"P2P adoption"),(0,r.kt)("p",null,"In the last two weeks, we've seen increase in P2P adoption.\n",(0,r.kt)("img",{alt:"P2P relays",src:o(53101).Z,width:"2668",height:"1576"})),(0,r.kt)("p",null,"The following graphs show several different versions of relays running on the mainnet. The\ngreen line ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionV10.True")," denotes P2P relays.\n",(0,r.kt)("img",{alt:"node versions",src:o(40970).Z,width:"2674",height:"1580"})),(0,r.kt)("h3",{id:"open-source"},"Open Source"),(0,r.kt)("p",null,"We upstreamed our FFI bindings to Windows named pipes to ",(0,r.kt)("inlineCode",{parentName:"p"},"Win32")," package, the\nPR was accepted and merged."),(0,r.kt)("p",null,"We also received an external contribution which enhanced our documentation, see\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4676"},"ouroboros-network#4676"),"."))}c.isMDXComponent=!0},53101:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/2023-10-04-p2p-relays-75c2baf57ea9346a40f0098b2abb4a99.png"},40970:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/2023-10-04-relay-versions-5168d3ed0ad365a18e86263fcccffd23.png"}}]); \ No newline at end of file diff --git a/assets/js/1b0bebd5.e1bd57de.js b/assets/js/1b0bebd5.e1bd57de.js new file mode 100644 index 00000000000..421423a65ad --- /dev/null +++ b/assets/js/1b0bebd5.e1bd57de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97801],{17169:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/61","page":61,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/60","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/1b2a226f.ac20107e.js b/assets/js/1b2a226f.ac20107e.js new file mode 100644 index 00000000000..3ef7c33499d --- /dev/null +++ b/assets/js/1b2a226f.ac20107e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88782],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var i=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),d=a,c=h["".concat(s,".").concat(d)]||h[d]||m[d]||n;return r?i.createElement(c,o(o({ref:t},u),{},{components:r})):i.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var i=r(87462),a=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-09-07-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-07-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-07-mithril.md",source:"@site/blog/2023-09-07-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-09-07T00:00:00.000Z",formattedDate:"September 7, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.53,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-09-07-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-08-hydra"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-07-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team has released a new distribution ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2335.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2335.0"))," which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information."),(0,a.kt)("p",null,"They have also worked on snapshots enhancements: implementation of the ",(0,a.kt)("inlineCode",{parentName:"p"},"zstandard")," compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes."),(0,a.kt)("p",null,"Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Use 'zstandard' compression for snapshot archives")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/876"},"#876")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design & implement stress test tool for aggregator - phase 2")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1155"},"#1155")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Provide progress information with '--json' option in Client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1095"},"#1095")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Make client download and extract the archive simultaneously")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1115"},"#1115")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add aggregator Cardano node version in snapshot artifact")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/948"},"#948")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Make Cardano node version part of the Mithril network configuration")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/947"},"#947")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Post deployment 'mainnet' infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1091"},"#1091")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Errors refactoring")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/798"},"#798")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add Cloudflare protection of infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/986"},"#986")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Failed to restore recent snapshot with strange error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1160"},"#1160")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update 'ed25519-dalek' to '2.0.0'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1188"},"#1188")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add target networks blocks in release notes")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1151"},"#1151")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Fix end to end 'wait_for_the_expected_time' test")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1191"},"#1191")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Fix docs 'git checkout' command")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1174"},"#1174"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1b2c892c.dc757eff.js b/assets/js/1b2c892c.dc757eff.js new file mode 100644 index 00000000000..cd2c1b43909 --- /dev/null +++ b/assets/js/1b2c892c.dc757eff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53210],{69530:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/tags/performance-tracing","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/1b2c8e6e.9c8b7196.js b/assets/js/1b2c8e6e.9c8b7196.js new file mode 100644 index 00000000000..32a800d27cd --- /dev/null +++ b/assets/js/1b2c8e6e.9c8b7196.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36303],{43673:a=>{a.exports=JSON.parse('{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api","allTagsPath":"/cardano-updates/tags","count":27}')}}]); \ No newline at end of file diff --git a/assets/js/1b34f23d.944aa387.js b/assets/js/1b34f23d.944aa387.js new file mode 100644 index 00000000000..1479b6b4a43 --- /dev/null +++ b/assets/js/1b34f23d.944aa387.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91990],{3905:(e,t,o)=>{o.d(t,{Zo:()=>h,kt:()=>m});var n=o(67294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},h=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),u=c(o),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||r;return o?n.createElement(m,i(i({ref:t},h),{},{components:o})):n.createElement(m,i({ref:t},h))}));function m(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,i=new Array(r);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var n=o(87462),a=(o(67294),o(3905));const r={title:"Initial CIP 1694 Security Analysis and Responses",slug:"2023-11-20-cip1694",authors:"kevinhammond",tags:["ledger","cip1694","security"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-11-20-cip1694",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-20-cip1694.md",source:"@site/blog/2023-11-20-cip1694.md",title:"Initial CIP 1694 Security Analysis and Responses",description:"High level summary",date:"2023-11-20T00:00:00.000Z",formattedDate:"November 20, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"},{label:"cip1694",permalink:"/cardano-updates/tags/cip-1694"},{label:"security",permalink:"/cardano-updates/tags/security"}],readingTime:5.345,hasTruncateMarker:!1,authors:[{name:"Kevin Hammond",title:"Head of Software Engineering, Cardano Core",url:"https://github.com/kevinhammond",imageURL:"https://github.com/kevinhammond.png",key:"kevinhammond"}],frontMatter:{title:"Initial CIP 1694 Security Analysis and Responses",slug:"2023-11-20-cip1694",authors:"kevinhammond",tags:["ledger","cip1694","security"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-22-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-17-hydra"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Initial CIP-1694 Security Analysis and Responses",id:"initial-cip-1694-security-analysis-and-responses",level:2},{value:"Section: The constitutional committee",id:"section-the-constitutional-committee",level:3},{value:"Section: Size of the constitutional committee",id:"section-size-of-the-constitutional-committee",level:3},{value:"Section: Terms",id:"section-terms",level:3},{value:"Section: Registered DReps",id:"section-registered-dreps",level:3},{value:"Section: Ratification",id:"section-ratification",level:3},{value:"Section: Content",id:"section-content",level:3},{value:"Section: Protocol Parameter groups",id:"section-protocol-parameter-groups",level:3},{value:"Section: Votes",id:"section-votes",level:3},{value:"Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes",id:"section-separation-of-hard-fork-initiation-from-standard-protocol-parameter-changes",level:3},{value:"Section: Changes post Edinburgh workshop (July 2023)",id:"section-changes-post-edinburgh-workshop-july-2023",level:3},{value:"Section: Reduced deposits for some government actions",id:"section-reduced-deposits-for-some-government-actions",level:3}],h={toc:c},u="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(u,(0,n.Z)({},h,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here."),(0,a.kt)("h2",{id:"initial-cip-1694-security-analysis-and-responses"},"Initial CIP-1694 Security Analysis and Responses"),(0,a.kt)("h3",{id:"section-the-constitutional-committee"},"Section: The constitutional committee"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},'\u201cFor example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.')),(0,a.kt)("p",null,"There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-size-of-the-constitutional-committee"},"Section: Size of the constitutional committee"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.")),(0,a.kt)("p",null,"Thanks. Yes, we\u2019ve been thinking about this issue for a long time, see for example the section \u2018Final safety measure, post bootstrapping\u2019. We don\u2019t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps"),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-terms"},"Section: Terms"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The following sentence is a bit awkward to read: \u201cFor example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.\u201d \u2014> Suggestion: \u201cFor example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.\u201d ")),(0,a.kt)("p",null,"Thanks. Yes, that suggestion is a bit easier to read."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-registered-dreps"},"Section: Registered DReps"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u201cAdditionally, registered DReps will need to vote regularly to still be considered active.\u201d - There is a minor issue with requiring \u201cvoting regularly\u201d. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).")),(0,a.kt)("p",null,"Thanks. We\u2019ve added a mechanism to prevent that issue in the spec/code where if there\u2019s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-ratification"},"Section: Ratification"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It is a bit unclear why protocol changes: network group and technical group are two separate groups.")),(0,a.kt)("p",null,"These correspond exactly to the groups that are administered by the Parameter Committee."),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"I didn\u2019t understand the rationale for requiring 100% \u201cYes\u201d votes to pass \u201cInfo\u201d type governance actions? It seems they have the least potential to harm the system.")),(0,a.kt)("p",null,"Yes, it\u2019s not about harming the system, since ",(0,a.kt)("inlineCode",{parentName:"p"},"Info"),"\nactions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action. "),(0,a.kt)("p",null,"Once an action is enacted it\u2019s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-content"},"Section: Content"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.")),(0,a.kt)("p",null,"Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-protocol-parameter-groups"},"Section: Protocol Parameter groups"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.")),(0,a.kt)("p",null,"These are existing protocol parameters, described in e.g. ",(0,a.kt)("a",{parentName:"p",href:"https://docs.cardano.org/explore-cardano/parameter-guide/#:~:text=Protocol%20parameters%20on%20Cardano%20are,to%20changing%20conditions%20over%20time."},"https://cips.cardano.org/cips/cip9/"),"9 or ",(0,a.kt)("a",{parentName:"p",href:"https://docs.cardano.org/explore-cardano/parameter-guide/#:~:text=Protocol%20parameters%20on%20Cardano%20are,to%20changing%20conditions%20over%20time."},"The Cardano Protocol Parameters Guide"),"."),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories. ")),(0,a.kt)("p",null,"All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-votes"},"Section: Votes"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?")),(0,a.kt)("p",null,"They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don\u2019t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-separation-of-hard-fork-initiation-from-standard-protocol-parameter-changes"},"Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.")),(0,a.kt)("p",null,"There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-changes-post-edinburgh-workshop-july-2023"},"Section: Changes post Edinburgh workshop (July 2023)"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u201cAll governance actions are enacted one epoch after they are ratified.\u201d - I\u2019m not sure if this line is currently in the main body of the CIP?")),(0,a.kt)("p",null,"It is, but it is phrased differently: \u2018All governance actions are enacted on the epoch boundary after their ratification.\u2019"),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-reduced-deposits-for-some-government-actions"},"Section: Reduced deposits for some government actions"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.")),(0,a.kt)("p",null,"Indeed. We have no plans for this at the moment."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1be78505.eb072735.js b/assets/js/1be78505.eb072735.js new file mode 100644 index 00000000000..836136e8ebc --- /dev/null +++ b/assets/js/1be78505.eb072735.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29514,4972],{19963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>fe});var a=n(67294),l=n(86010),o=n(1944),r=n(35281),c=n(43320),i=n(52802),s=n(74477),d=n(1116),m=n(93285),u=n(95999),b=n(12466),p=n(85936);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,l]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var f=n(16550),g=n(87524),k=n(86668),_=n(21327),v=n(87462);function C(e){return a.createElement("svg",(0,v.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const S={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function I(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,l.Z)("button button--secondary button--outline",S.collapseSidebarButton),onClick:t},a.createElement(C,{className:S.collapseSidebarButtonIcon}))}var N=n(59689),T=n(902);const Z=Symbol("EmptyContext"),x=a.createContext(Z);function B(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(x.Provider,{value:o},t)}var y=n(86043),L=n(48596),w=n(39960),A=n(72389);function M(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function F(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,k.L)(),f=function(e){const t=(0,A.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i.Wl)(e):void 0),[e,t])}(t),g=(0,i._F)(t,o),_=(0,L.Mg)(h,o),{collapsed:C,setCollapsed:S}=(0,y.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(x);if(e===Z)throw new T.i6("DocSidebarItemsExpandedStateProvider");return e}(),B=function(e){void 0===e&&(e=!C),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,T.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:g,collapsed:C,updateCollapsed:B}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":C},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_})},a.createElement(w.Z,(0,v.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{n?.(t),h?B(!1):(e.preventDefault(),B())}:()=>{n?.(t)},"aria-current":_?"page":void 0,"aria-expanded":b?!C:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(M,{categoryLabel:u,onClick:e=>{e.preventDefault(),B()}})),a.createElement(y.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:C},a.createElement(V,{items:m,tabIndex:C?-1:0,onItemClick:n,activePath:o,level:c+1})))}var H=n(13919),P=n(39471);const W={menuExternalLink:"menuExternalLink_NmtK"};function D(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,H.Z)(m);return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(w.Z,(0,v.Z)({className:(0,l.Z)("menu__link",!E&&W.menuExternalLink,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(P.Z,null)))}const R={menuHtmlItem:"menuHtmlItem_M9Kj"};function z(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[R.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function U(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(F,(0,v.Z)({item:t},n));case"html":return a.createElement(z,(0,v.Z)({item:t},n));default:return a.createElement(D,(0,v.Z)({item:t},n))}}function K(e){let{items:t,...n}=e;return a.createElement(B,null,t.map(((e,t)=>a.createElement(U,(0,v.Z)({key:t,item:e,index:t},n)))))}const V=(0,a.memo)(K),j={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function G(e){let{path:t,sidebar:n,className:o}=e;const c=function(){const{isActive:e}=(0,N.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{className:(0,l.Z)("menu thin-scrollbar",j.menu,c&&j.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(V,{items:n,activePath:t,level:1})))}const Y="sidebar_njMd",q="sidebarWithHideableNavbar_wUlq",O="sidebarHidden_VK0M",X="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,l.Z)(Y,c&&q,r&&O)},c&&a.createElement(_.Z,{tabIndex:-1,className:X}),a.createElement(G,{path:t,sidebar:n}),i&&a.createElement(I,{onClick:o}))}const Q=a.memo(J);var $=n(13102),ee=n(72961);const te=e=>{let{sidebar:t,path:n}=e;const o=(0,ee.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ne(e){return a.createElement($.Zo,{component:te,props:e})}const ae=a.memo(ne);function le(e){const t=(0,g.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement(Q,e),l&&a.createElement(ae,e))}const oe={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function re(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:oe.expandButton,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(C,{className:oe.expandButtonIcon}))}const ce={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry"};function ie(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function se(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e;const{pathname:c}=(0,f.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.Z)(r.k.docs.docSidebarContainer,ce.docSidebarContainer,n&&ce.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ce.docSidebarContainer)&&n&&s(!0)}},a.createElement(ie,null,a.createElement(le,{sidebar:t,path:c,onCollapse:d,isHidden:i})),i&&a.createElement(re,{toggleSidebar:d}))}const de={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function me(e){let{hiddenSidebarContainer:t,children:n}=e;const o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(de.docMainContainer,(t||!o)&&de.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.Z)("container padding-top--md padding-bottom--lg",de.docItemWrapper,t&&de.docItemWrapperEnhanced)},n))}const ue={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX"};function be(e){let{children:t}=e;const n=(0,d.V)(),[l,o]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:ue.docsWrapper},a.createElement(E,null),a.createElement("div",{className:ue.docPage},n&&a.createElement(se,{sidebar:n.items,hiddenSidebarContainer:l,setHiddenSidebarContainer:o}),a.createElement(me,{hiddenSidebarContainer:l},t)))}var pe=n(4972),he=n(90197);function Ee(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(he.Z,{version:t.version,tag:(0,c.os)(t.pluginId,t.version)}),a.createElement(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function fe(e){const{versionMetadata:t}=e,n=(0,i.hI)(e);if(!n)return a.createElement(pe.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(Ee,e),a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(be,null,c)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(67294),l=n(95999),o=n(1944),r=n(93285);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/1be923a7.8d35f70e.js b/assets/js/1be923a7.8d35f70e.js new file mode 100644 index 00000000000..7f100facccb --- /dev/null +++ b/assets/js/1be923a7.8d35f70e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47658],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),d=l(n),h=o,m=d["".concat(s,".").concat(h)]||d[h]||c[h]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=h;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[d]="string"==typeof e?e:o,i[1]=p;for(var l=2;l{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>p,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-06-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-06-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-12-network.md",source:"@site/blog/2023-06-12-network.md",title:"Network Team Update",description:"Network Update",date:"2023-06-12T00:00:00.000Z",formattedDate:"June 12, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.205,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-06-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-14-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-06-09-crypto"}},s={authorsImageUrls:[void 0]},l=[{value:"Network Update",id:"network-update",level:2},{value:"Key contributions and advances",id:"key-contributions-and-advances",level:3},{value:"New cardano-ping / cardano-cli ping release",id:"new-cardano-ping--cardano-cli-ping-release",level:4},{value:"Other smaller contributions",id:"other-smaller-contributions",level:3}],u={toc:l},d="wrapper";function c(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"network-update"},"Network Update"),(0,o.kt)("h3",{id:"key-contributions-and-advances"},"Key contributions and advances"),(0,o.kt)("p",null,"We merged ",(0,o.kt)("inlineCode",{parentName:"p"},"light peer sharing")," feature, which allows to include inbound peers\ninto outbound governor known peers. This is the primary way for new\nunregistered nodes to enter the network, which then can be shared using peer\nsharing. Note that peer sharing is an experimental feature which is disabled\nuntil genesis & eclipse evasion as fully implemented. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3596"},"#3596"),"."),(0,o.kt)("p",null,"We are making progress reviewing eclipse evasion, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"#3886"),"."),(0,o.kt)("p",null,"We fixed another bug in local root peers. We found out that if the local roots\nwhere ignored until the first domain name was resolved, see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4583"},"#4583"),". The bug\nfix was backported and released in ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.8.1.1"),"."),(0,o.kt)("p",null,"We re-started working on dynamically enabling block forging to address issue\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"#3159"),", which will enable us to release ",(0,o.kt)("inlineCode",{parentName:"p"},"P2P")," on block producing nodes. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/140"},"#140"),"."),(0,o.kt)("h4",{id:"new-cardano-ping--cardano-cli-ping-release"},"New ",(0,o.kt)("inlineCode",{parentName:"h4"},"cardano-ping")," / ",(0,o.kt)("inlineCode",{parentName:"h4"},"cardano-cli ping")," release"),(0,o.kt)("p",null,"We prepared a new release of ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ping")," library which supports the new\nquery feature (query supported versions). See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4589"},"#4589"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4593"},"#4593")," and ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"#5313"),".\nThe new version of ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," will use ",(0,o.kt)("inlineCode",{parentName:"p"},"ISO8601")," formatted\ntimestamps; also the formatting of ping results is slightly improved, and it\nwill introduce the new ",(0,o.kt)("inlineCode",{parentName:"p"},"--query-versions")," (",(0,o.kt)("inlineCode",{parentName:"p"},"-Q"),") switch. If the remote site\nsupports the query parameter, the command will print:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"redacted-ip:port network rtt: 0.064\nredacted-ip:port handshake rtt: 0.064010896s\nredacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat\norAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]\n")),(0,o.kt)("p",null,"otherwise it will print the negotiation results"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"redacted-ip:port network rtt: 0.045\nredacted-ip:port handshake rtt: 0.101867615s\nredacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder\n")),(0,o.kt)("p",null,"Note that in that case ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," offers ",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorAndResponder"),", which\nallows us to detect whether the remote side is an ",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorOnly")," or\n",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorAndResponder"),". Also ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," will no longer announce\nitself as ",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorAndResponder"),", except for the case mentioned above."),(0,o.kt)("h3",{id:"other-smaller-contributions"},"Other smaller contributions"),(0,o.kt)("p",null,"On a request from the Marlow Team, we published haddocks of ",(0,o.kt)("inlineCode",{parentName:"p"},"typed-protocols"),",\nwhich are now available ",(0,o.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/typed-protocols/"},"here")," (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/40"},"#40"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/41"},"#41"),")."),(0,o.kt)("p",null,"We made a new release of ",(0,o.kt)("inlineCode",{parentName:"p"},"strict-stm-1.1.0.1")," on Hackage, which fixed a bug in\npackage description file, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/101"},"#101")," ."),(0,o.kt)("p",null,"We also helped to debug a deadlock when using named pipes on Windows in the new\n",(0,o.kt)("inlineCode",{parentName:"p"},"RawBearer")," API. The API is being used to store secret keys only in memory.\nThe PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395"},"#4395")," is under review."),(0,o.kt)("p",null,"We also have two more PRs which are under review:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"#4530"),": enabling ledger peers on a fixed number of slots before the tip of the chain;"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4580"},"#4580"),": a PR which fixes inconsistencies in one of our cddl specs.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1c192ca4.8659f9df.js b/assets/js/1c192ca4.8659f9df.js new file mode 100644 index 00000000000..f63e20c04ae --- /dev/null +++ b/assets/js/1c192ca4.8659f9df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23146],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(r),c=a,d=m["".concat(s,".").concat(c)]||m[c]||h[c]||n;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var i=r(87462),a=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-11-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-15-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-15-mithril.md",source:"@site/blog/2023-11-15-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-15T00:00:00.000Z",formattedDate:"November 15, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.92,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-15-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-11-14-node-cli-api"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},m="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files."),(0,a.kt)("p",null,"Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Prototype a P2P relay with ",(0,a.kt)("inlineCode",{parentName:"strong"},"libp2p"))," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,a.kt)("inlineCode",{parentName:"strong"},"mithril-client")," library")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1311"},"#1311")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Fix certificate hashes re-computation in aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1343"},"#1343")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Remove ",(0,a.kt)("inlineCode",{parentName:"strong"},"unstable")," tag in ",(0,a.kt)("inlineCode",{parentName:"strong"},"unstable")," release")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1235"},"#1235")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1caacab6.f165aa95.js b/assets/js/1caacab6.f165aa95.js new file mode 100644 index 00000000000..c9f4eb9ab52 --- /dev/null +++ b/assets/js/1caacab6.f165aa95.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85442],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=s(a),h=n,m=u["".concat(p,".").concat(h)]||u[h]||c[h]||o;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-10-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-10-hydra.md",source:"@site/blog/2023-03-10-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-10T00:00:00.000Z",formattedDate:"March 10, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.825,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-16-goedel"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-09-mithril"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:s},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team addressed issues with committing complex UTxOs into a\nHydra Head, prepared the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," to be run on mainnet (soon) and improved\nthe test suite of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts. The specification is constantly\ngetting improved upon reviewer feedback on overleaf - this week the graphical\nnotation was refined to be more transaction-focused."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Clarified ","\u201c","bug","\u201d"," of committing UTxOs with reference scripts to a Hydra head ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/737"},"#737")),(0,n.kt)("li",{parentName:"ul"},"Prepare usage of ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")," on mainnet by updating command line options ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/715"},"#715")),(0,n.kt)("li",{parentName:"ul"},"Improved our mutation test suite to all expected errors ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/705"},"#705")),(0,n.kt)("li",{parentName:"ul"},"Re-opened our persistent hydraw demo head on ",(0,n.kt)("inlineCode",{parentName:"li"},"preprod")," using version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.9.0")),(0,n.kt)("li",{parentName:"ul"},"Updated on-chain graphs to be more transaction-focused in the specification")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature"),(0,n.kt)("li",{parentName:"ul"},"Prepare the Hydra workshop"),(0,n.kt)("li",{parentName:"ul"},"Address all todo\u2019s in the Hydra specification"),(0,n.kt)("li",{parentName:"ul"},"Unblock the auctions project with ","\u201c","commit from script","\u201d"," a solution")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1d10bd9e.e7b9cd1c.js b/assets/js/1d10bd9e.e7b9cd1c.js new file mode 100644 index 00000000000..b7cde83fe3a --- /dev/null +++ b/assets/js/1d10bd9e.e7b9cd1c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[5978],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-03-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-03-08-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-node-cli-api.md",source:"@site/blog/2023-03-08-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-03-08T00:00:00.000Z",formattedDate:"March 8, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.795,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-03-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-08-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-08-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-03-08---2023-03-21"},"2023-03-08 - 2023-03-21"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"General bug fixes and some refactoring "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4958"},"Remove error calls in Cardano.CLI.Shelley.Run.Transaction")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4880"},"Detect invalid counter and certificate")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5003"},"Add missing imports")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5001"},"Add LedgerStateBabbage and LedgerStateConway pattern synonyms")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4967"},"Remove unnecessary functions")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4953"},"Remove duplicate scripts when building transaction body for Mary, Alonzo and Babbage")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4903"},"Reduce number of calls to toLedgerPParams")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4686"},"Add ToJSON/FromJSON instances for ChainPoint")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4683"},"Derive Eq instance for AcquiringFailure")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4682"},"Export ",(0,r.kt)("inlineCode",{parentName:"a"},"fromShelleyBasedScript")," from Cardano.Api")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4344"},"Remove unnecessary validation of Data")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3775"},'Remove hint of "string" support for ScriptData')," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4988"},"Conway hard forks on prot-ver 9")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4968"},"Reinstate -Werror for cardano-node and fix errors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4921"},"Take all dependencies from Hackage or CHaP")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4911"},"Less verbose node-to-client and node-to-node version logging")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"Get AcceptedConnectionsLimit from the configuration")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4729"},"fix cardano-testnet Babbage genesis.json"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1da92289.64c6b1ce.js b/assets/js/1da92289.64c6b1ce.js new file mode 100644 index 00000000000..f916d2dd929 --- /dev/null +++ b/assets/js/1da92289.64c6b1ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22954],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(n),p=a,g=c["".concat(s,".").concat(p)]||c[p]||m[p]||o;return n?r.createElement(g,i(i({ref:t},d),{},{components:n})):r.createElement(g,i({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Embedding Quality Workstream",slug:"2022-11-03-embedding-quality",authors:"dorin100",tags:["embedding-quality"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-03-embedding-quality",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-03-embedding-quality.md",source:"@site/blog/2022-11-03-embedding-quality.md",title:"Embedding Quality Workstream",description:"High level summary",date:"2022-11-03T00:00:00.000Z",formattedDate:"November 3, 2022",tags:[{label:"embedding-quality",permalink:"/cardano-updates/tags/embedding-quality"}],readingTime:.65,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"Embedding Quality Workstream",slug:"2022-11-03-embedding-quality",authors:"dorin100",tags:["embedding-quality"],hide_table_of_contents:!1},prevItem:{title:"Open-Source Team",permalink:"/cardano-updates/2022-10-31-open-source"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-02-consensus"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2}],d={toc:u},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We made good progress on most of the Action Items we agreed on Lisbon, like:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Cardano System Tests was fully open to public (tools, tests, results)\nSee ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests"},"cardano-node-tests webpage"),"."),(0,a.kt)("li",{parentName:"ul"},"We defined an ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/blob/master/.github/ISSUE_TEMPLATE/user-facing-feature.md"},"user-facing-functionality template")," that is used with the cardano-cli team ",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"this includes acceptance criteria & user stories, and definition of done"))),(0,a.kt)("li",{parentName:"ul"},"We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)"),(0,a.kt)("li",{parentName:"ul"},"We started to apply a ",(0,a.kt)("em",{parentName:"li"},"labelling convention")," on ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues"},"cardano-node issues")," that will be used to generate some visual dashboards with some metrics ","[TBD]"),(0,a.kt)("li",{parentName:"ul"},"Ziyand Liu started an ",(0,a.kt)("em",{parentName:"li"},"End-to-End Development and Testing Process for Plutus Features"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1e0f95a7.4185e54d.js b/assets/js/1e0f95a7.4185e54d.js new file mode 100644 index 00000000000..06658bb9bab --- /dev/null +++ b/assets/js/1e0f95a7.4185e54d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65123],{85782:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/17","page":17,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/16","nextPage":"/cardano-updates/page/18","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/1e24dd00.03c90e48.js b/assets/js/1e24dd00.03c90e48.js new file mode 100644 index 00000000000..67383c0ff58 --- /dev/null +++ b/assets/js/1e24dd00.03c90e48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[11652],{42664:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/tags/open-source","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/1e4232ab.8f20f4ae.js b/assets/js/1e4232ab.8f20f4ae.js new file mode 100644 index 00000000000..666464c1819 --- /dev/null +++ b/assets/js/1e4232ab.8f20f4ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88818],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(r),m=n,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?a.createElement(f,i(i({ref:t},u),{},{components:r})):a.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={sidebar_position:2},i="Create a Document",l={unversionedId:"tutorial-basics/create-a-document",id:"tutorial-basics/create-a-document",title:"Create a Document",description:"Documents are groups of pages connected through:",source:"@site/docs/tutorial-basics/create-a-document.md",sourceDirName:"tutorial-basics",slug:"/tutorial-basics/create-a-document",permalink:"/cardano-updates/docs/tutorial-basics/create-a-document",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"defaultSidebar",previous:{title:"Create a Page",permalink:"/cardano-updates/docs/tutorial-basics/create-a-page"},next:{title:"Create a Blog Post",permalink:"/cardano-updates/docs/tutorial-basics/create-a-blog-post"}},s={},c=[{value:"Create your first Doc",id:"create-your-first-doc",level:2},{value:"Configure the Sidebar",id:"configure-the-sidebar",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"create-a-document"},"Create a Document"),(0,n.kt)("p",null,"Documents are ",(0,n.kt)("strong",{parentName:"p"},"groups of pages")," connected through:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a ",(0,n.kt)("strong",{parentName:"li"},"sidebar")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"previous/next navigation")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"versioning"))),(0,n.kt)("h2",{id:"create-your-first-doc"},"Create your first Doc"),(0,n.kt)("p",null,"Create a Markdown file at ",(0,n.kt)("inlineCode",{parentName:"p"},"docs/hello.md"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-md",metastring:'title="docs/hello.md"',title:'"docs/hello.md"'},"# Hello\n\nThis is my **first Docusaurus document**!\n")),(0,n.kt)("p",null,"A new document is now available at ",(0,n.kt)("a",{parentName:"p",href:"http://localhost:3000/docs/hello"},"http://localhost:3000/docs/hello"),"."),(0,n.kt)("h2",{id:"configure-the-sidebar"},"Configure the Sidebar"),(0,n.kt)("p",null,"Docusaurus automatically ",(0,n.kt)("strong",{parentName:"p"},"creates a sidebar")," from the ",(0,n.kt)("inlineCode",{parentName:"p"},"docs")," folder."),(0,n.kt)("p",null,"Add metadata to customize the sidebar label and position:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-md",metastring:'title="docs/hello.md" {1-4}',title:'"docs/hello.md"',"{1-4}":!0},"---\nsidebar_label: 'Hi!'\nsidebar_position: 3\n---\n\n# Hello\n\nThis is my **first Docusaurus document**!\n")),(0,n.kt)("p",null,"It is also possible to create your sidebar explicitly in ",(0,n.kt)("inlineCode",{parentName:"p"},"sidebars.js"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="sidebars.js"',title:'"sidebars.js"'},"module.exports = {\n tutorialSidebar: [\n 'intro',\n // highlight-next-line\n 'hello',\n {\n type: 'category',\n label: 'Tutorial',\n items: ['tutorial-basics/create-a-document'],\n },\n ],\n};\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1e57c0e2.66497df8.js b/assets/js/1e57c0e2.66497df8.js new file mode 100644 index 00000000000..0527b2dcdc1 --- /dev/null +++ b/assets/js/1e57c0e2.66497df8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64313],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(a),d=n,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return a?r.createElement(f,l(l({ref:t},c),{},{components:a})):r.createElement(f,l({ref:t},c))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:n,l[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-08-18-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-18-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-goedel.md",source:"@site/blog/2023-08-18-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.72,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-08-18-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-23-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-18-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:p},u="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Development of an automated prover for showing conformance of\nprograms to state machines (as part of the mini-protocol framework)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Completion of the documentation of the (current state of the)\nmini-protocol framework")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Discussion about two DeltaQ lectures with two practical sessions as part\nof 4th year masters course on distributed systemsby colleagues at UC\nLouvain in the Autumn")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Discussion about four DeltaQ lectures by colleagues at U. Bergen as part\nof a 5th year Masters course in the Autumn")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Adapted original DeltaQ implementation to the new typeclasses and\nwrote property tests for its algebraic laws"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.4c243540.js b/assets/js/1f391b9e.4c243540.js new file mode 100644 index 00000000000..029ae362029 --- /dev/null +++ b/assets/js/1f391b9e.4c243540.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[13085],{14247:(e,n,t)=>{t.r(n),t.d(n,{default:()=>d});var a=t(67294),l=t(86010),r=t(1944),c=t(35281),i=t(93285),o=t(80210),s=t(39407);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};function d(e){const{content:n}=e,{metadata:{title:t,description:d,frontMatter:u}}=n,{wrapperClassName:f,hide_table_of_contents:v}=u;return a.createElement(r.FG,{className:(0,l.Z)(f??c.k.wrapper.mdxPages,c.k.page.mdxPage)},a.createElement(r.d,{title:t,description:d}),a.createElement(i.Z,null,a.createElement("main",{className:"container container--fluid margin-vert--lg"},a.createElement("div",{className:(0,l.Z)("row",m.mdxPageWrapper)},a.createElement("div",{className:(0,l.Z)("col",!v&&"col--8")},a.createElement("article",null,a.createElement(o.Z,null,a.createElement(n,null)))),!v&&n.toc.length>0&&a.createElement("div",{className:"col col--2"},a.createElement(s.Z,{toc:n.toc,minHeadingLevel:u.toc_min_heading_level,maxHeadingLevel:u.toc_max_heading_level}))))))}},39407:(e,n,t)=>{t.d(n,{Z:()=>m});var a=t(87462),l=t(67294),r=t(86010),c=t(93743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},o="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function m(e){let{className:n,...t}=e;return l.createElement("div",{className:(0,r.Z)(i.tableOfContents,"thin-scrollbar",n)},l.createElement(c.Z,(0,a.Z)({},t,{linkClassName:o,linkActiveClassName:s})))}},93743:(e,n,t)=>{t.d(n,{Z:()=>v});var a=t(87462),l=t(67294),r=t(86668);function c(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const a=t.slice(2,e.level);e.parentIndex=Math.max(...a),t[e.level]=n}));const a=[];return n.forEach((e=>{const{parentIndex:t,...l}=e;t>=0?n[t].children.push(l):a.push(l)})),a}function i(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=i({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function s(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>o(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,l.useRef)(void 0),t=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:c}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const a=[];for(let l=n;l<=t;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:c}),o=s(i,{anchorTopOffset:t.current}),m=e.find((e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(l),e.classList.add(l),n.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,t])}function u(e){let{toc:n,className:t,linkClassName:a,isChild:r}=e;return n.length?l.createElement("ul",{className:r?void 0:t},n.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:t,linkClassName:a}))))):null}const f=l.memo(u);function v(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...v}=e;const g=(0,r.L)(),h=m??g.tableOfContents.minHeadingLevel,L=u??g.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:c(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:h,maxHeadingLevel:L});return d((0,l.useMemo)((()=>{if(o&&s)return{linkClassName:o,linkActiveClassName:s,minHeadingLevel:h,maxHeadingLevel:L}}),[o,s,h,L])),l.createElement(f,(0,a.Z)({toc:p,className:t,linkClassName:o},v))}}}]); \ No newline at end of file diff --git a/assets/js/1f965afe.e03ac866.js b/assets/js/1f965afe.e03ac866.js new file mode 100644 index 00000000000..b1736445455 --- /dev/null +++ b/assets/js/1f965afe.e03ac866.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20635],{1948:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/network/page/3","page":3,"postsPerPage":5,"totalPages":5,"totalCount":24,"previousPage":"/cardano-updates/tags/network/page/2","nextPage":"/cardano-updates/tags/network/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/1f9c0c9c.5dc5eee7.js b/assets/js/1f9c0c9c.5dc5eee7.js new file mode 100644 index 00000000000..a8d88f36fa1 --- /dev/null +++ b/assets/js/1f9c0c9c.5dc5eee7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[28323],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),m=a,d=h["".concat(s,".").concat(m)]||h[m]||c[m]||i;return r?n.createElement(d,o(o({ref:t},u),{},{components:r})):n.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const i={title:"Mithril Team Update",slug:"2023-09-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-20-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-20-mithril.md",source:"@site/blog/2023-09-20-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-09-20T00:00:00.000Z",formattedDate:"September 20, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.935,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-09-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-20-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-15-goedel"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports. "),(0,a.kt)("p",null,"Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Add snapshot compression parameters in infrastructure deployments")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1200"},"#1200")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Add Cloudflare protection of infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/986"},"#986")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Record statistics about the downloaded snapshot in the aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1127"},"#1127")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Error refactoring")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/798"},"#798")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Activate Cloudflare protection of infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1230"},"#1230")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Release new ",(0,a.kt)("inlineCode",{parentName:"strong"},"2337")," distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1219"},"#1219")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Upgrade dependencies")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1238"},"#1238"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2073b851.3d1c7c5a.js b/assets/js/2073b851.3d1c7c5a.js new file mode 100644 index 00000000000..2327e696336 --- /dev/null +++ b/assets/js/2073b851.3d1c7c5a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47704],{3529:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>u,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var n=o(87462),a=(o(67294),o(3905)),i=o(22004);const r={title:"Network Team Update",slug:"2022-09-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},u=void 0,s={permalink:"/cardano-updates/2022-09-27-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-27-network.md",source:"@site/blog/2022-09-27-network.md",title:"Network Team Update",description:"Network Update",date:"2022-09-27T00:00:00.000Z",formattedDate:"September 27, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.24,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-09-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-30-ledger"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-09-20-consensus"}},l={authorsImageUrls:[void 0]},p=[{value:"Network Update",id:"network-update",level:2},{value:"Ouroboros Network",id:"ouroboros-network",level:3},{value:"Ouroboros Consensus",id:"ouroboros-consensus",level:3},{value:"Some older items, which were not announced",id:"some-older-items-which-were-not-announced",level:4},{value:"Cardano Node",id:"cardano-node",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"Typed Protocols",id:"typed-protocols",level:3},{value:"Input Endorsers Simulation",id:"input-endorsers-simulation",level:3}],k={toc:p},h="wrapper";function d(e){let{components:t,...o}=e;return(0,a.kt)(h,(0,n.Z)({},k,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"network-update"},"Network Update"),(0,a.kt)("h3",{id:"ouroboros-network"},"Ouroboros Network"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We finished high and low level ",(0,a.kt)("em",{parentName:"li"},"peer sharing")," design. See\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/wiki/Peer-Sharing-Implementation-Plan"},"Peer Sharing Implementation Plan")),(0,a.kt)("li",{parentName:"ul"},"We started working on low-level design of ",(0,a.kt)("em",{parentName:"li"},"eclipse evasion")," (work in\nprogress)."),(0,a.kt)("li",{parentName:"ul"},"We decided to use ",(0,a.kt)("strong",{parentName:"li"},"peer sharing")," instead of overloaded and ambiguous ",(0,a.kt)("em",{parentName:"li"},"gossip")," term.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3980"},"PR input-output-hk/ouroboros-network#3980")),(0,a.kt)("li",{parentName:"ul"},"We fixed technical dept\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3905"},"issue input-output-hk/cardano-node#3905")," in\nthe simulation testing of diffusion\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4004"},"PR input-output-hk/cardano-node#4004")),(0,a.kt)("li",{parentName:"ul"},"We deployed all our nodes using our new nix based deployment architecture.\nWhen deploying we found an issue in the\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/3752"},(0,a.kt)("inlineCode",{parentName:"a"},"RTView")),".")),(0,a.kt)("h3",{id:"ouroboros-consensus"},"Ouroboros Consensus"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Recently we found out that the consensus does not log exceptions thrown during\nintiialisation. This was fixed in\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4015"},"PR input-output-hk/ouroboros-network#4015"),"\nAs part of this pull request we also changed that all exceptions rethrown by\nthe connection handler thread are wrapped in ",(0,a.kt)("inlineCode",{parentName:"li"},"ExceptionInHandler"),".")),(0,a.kt)("h4",{id:"some-older-items-which-were-not-announced"},"Some older items, which were not announced"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We identified and fixed an issue related to socket activation (socket options\nwhere not set for sockets passed through socket activation).\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3979"},"PR input-output-hk/cardano-node#3979"),"\nThis fix will be released in the next ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node")," release.")),(0,a.kt)("h3",{id:"cardano-node"},"Cardano Node"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We extended the NixOs service module so that one can modify ",(0,a.kt)("inlineCode",{parentName:"li"},"socketPath"),",\n",(0,a.kt)("inlineCode",{parentName:"li"},"runtimeDir"),", ",(0,a.kt)("inlineCode",{parentName:"li"},"databasePath"),", ",(0,a.kt)("inlineCode",{parentName:"li"},"traceSocketPathAccept"),",\n",(0,a.kt)("inlineCode",{parentName:"li"},"traceSocketPathConnect")," and ",(0,a.kt)("inlineCode",{parentName:"li"},"stateDir")," options.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4196"},"PR input-output-hk/cardano-node#4196"))),(0,a.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,a.kt)("p",null,"We resolved a number of issues before release of ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," on hackage:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2797"},"issue input-output-hk/ouroboros-network#2797")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2650"},"issue input-output-hk/ouroboros-network#2650")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3436"},"issue input-output-hk/ouroboros-network#3436")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2588"},"issue input-output-hk/ouroboros-network#2588")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2587"},"issue input-output-hk/ouroboros-network#2587")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2586"},"issue input-output-hk/ouroboros-network#2586"))),(0,a.kt)("p",null,"See ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/24"},"PR #24"),"."),(0,a.kt)("p",null,"We also improved experience for contributors of ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"typed-protocols")," by adding issue templates:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/25"},"PR input-output-hk/io-sim#25"))),(0,a.kt)("h3",{id:"typed-protocols"},"Typed Protocols"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We pushed a branch which identifies a GHC quirk:\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/tree/coot/typed-protocols-rewrite-StateToken-problem"},"coot/typed-protocols-rewrite-StateToken-problem"),".\nThat's too be resolved in order to push forward review of the redesign in\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/3"},"PR input-output-hk/typed-protocols#3"),"."),(0,a.kt)("li",{parentName:"ul"},"As for ",(0,a.kt)("inlineCode",{parentName:"li"},"io-sim"),", we wrote issue templates:\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/11"},"PR input-output-hk/typed-protocols#11"))),(0,a.kt)("h3",{id:"input-endorsers-simulation"},"Input Endorsers Simulation"),(0,a.kt)("p",null,"New features include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Histograms of block arrival frequency, for both network (inbound) and CPU\n(block validation). This is interesting to check that we're not overloading\nthe CPU block validation capacity, or network link capacity. Or alternatively\nto observe the behaviour in an overload situation if we set the block\ngeneration rate high enough.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},'Pie chart of utilisation of TCP links. This shows how small a fraction of\nlinks are being used at any one time, and shows that once the system "warms\nup" and is operating stably, most block delivery is ballistic.')),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Showing off the new screen layout combinators, that let us put multiple\ncharts, titles etc on screen at once and scale them to whatever screen or\nvideo resolution we like without having to tweak numbers (this example is\nscaled to fit 1080HD video resolution)."))),(0,a.kt)(i.Z,{playing:!0,controls:!0,url:"/p2p-relay-5.mp4",mdxType:"ReactPlayer"}))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/209bf559.8a8670ee.js b/assets/js/209bf559.8a8670ee.js new file mode 100644 index 00000000000..39093ff3072 --- /dev/null +++ b/assets/js/209bf559.8a8670ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80367],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>m});var n=o(67294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(o),h=r,m=d["".concat(l,".").concat(h)]||d[h]||c[h]||a;return o?n.createElement(m,i(i({ref:t},u),{},{components:o})):n.createElement(m,i({ref:t},u))}));function m(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=o(87462),r=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-10-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-10-02-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-02-network.md",source:"@site/blog/2023-10-02-network.md",title:"Network Team Update",description:"High-level overview of sprint 45",date:"2023-10-02T00:00:00.000Z",formattedDate:"October 2, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.485,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-10-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-04-mithril"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-29-goedel"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level overview of sprint 45",id:"high-level-overview-of-sprint-45",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"Towards Typed Protocols 0.2.0.0",id:"towards-typed-protocols-0200",level:3},{value:"Tech Debt",id:"tech-debt",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"IOSimPOR",id:"iosimpor",level:4},{value:"IOSim",id:"iosim",level:4},{value:"Cardano Newtork Service Assurance",id:"cardano-newtork-service-assurance",level:3},{value:"P2P adoption",id:"p2p-adoption",level:3},{value:"Open Source",id:"open-source",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview-of-sprint-45"},"High-level overview of ",(0,r.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+45%22"},"sprint 45")),(0,r.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,r.kt)("p",null,"We started reviewing the bootstrap peers PR, ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4615"},"ouroboros-network#4615"),"."),(0,r.kt)("h3",{id:"towards-typed-protocols-0200"},"Towards Typed Protocols 0.2.0.0"),(0,r.kt)("p",null,"We discovered a performance regression when using ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0"),", and we\nstarted investigating where it comes from. Currently, we see that\n",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0")," can outperform ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.1.0.0")," when running\nin isolation with a simple ",(0,r.kt)("inlineCode",{parentName:"p"},"ping-pong")," protocol, so the regression might be in\nthe new block fetch implementation which comes with ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0"),"\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/3"},"typed-protocols#3"),"."),(0,r.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,r.kt)("p",null,"We merged two PRs written by Galois engineers:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"a pull request which refactors the main entry function for P2P, see ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3834"},"ouroboros-network#3834"),"; "),(0,r.kt)("li",{parentName:"ul"},"a pull request which reviews usage of ",(0,r.kt)("inlineCode",{parentName:"li"},"unsafe")," function in the network code based.")),(0,r.kt)("p",null,"Galois also made progress with the following two issues:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"add microbenchmarks to some of our tests: ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3832"},"ouroboros-network#3832")),(0,r.kt)("li",{parentName:"ul"},"inspect use of ",(0,r.kt)("inlineCode",{parentName:"li"},"error")," in ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-network")," repository:\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3836"},"ouroboros-network#3836"))),(0,r.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,r.kt)("h4",{id:"iosimpor"},"IOSimPOR"),(0,r.kt)("p",null,"We found and fixed a bug in ",(0,r.kt)("inlineCode",{parentName:"p"},"IOSimPOR"),". We'd like to thank Prof. John Hughes\n(Quviq AB) for helping us with debugging the issue."),(0,r.kt)("p",null,"We also provided a more uniform API for ",(0,r.kt)("inlineCode",{parentName:"p"},"IOSimPOR"),", and added ways to make the\ndebugging similar problems in the future easier."),(0,r.kt)("details",null,(0,r.kt)("summary",null,"Technical Details on IOSim refactoring"),"We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future."),(0,r.kt)("h4",{id:"iosim"},"IOSim"),(0,r.kt)("p",null,"To prepare for the next release, we consolidate packages taking advantage of\nthe public sublibraries supported now both by ",(0,r.kt)("inlineCode",{parentName:"p"},"cabal")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"Hackage"),". This is\na work in progress, ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/issues/114"},"io-sim#114"),"."),(0,r.kt)("h3",{id:"cardano-newtork-service-assurance"},"Cardano Newtork Service Assurance"),(0,r.kt)("p",null,"Galois made the following progress:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A test run of spinning up a CNSA instance was done, as a result documentation\nwas updated."),(0,r.kt)("li",{parentName:"ul"},"Based on the IOG code review of the CNSA code, updates to the CNSA code were\nmade."),(0,r.kt)("li",{parentName:"ul"},'Galois has started the design for adding a CNSA analysis for "fetched bytes\nover time while node is syncing".')),(0,r.kt)("h3",{id:"p2p-adoption"},"P2P adoption"),(0,r.kt)("p",null,"In the last two weeks, we've seen increase in P2P adoption.\n",(0,r.kt)("img",{alt:"P2P relays",src:o(53101).Z,width:"2668",height:"1576"})),(0,r.kt)("p",null,"The following graphs show several different versions of relays running on the mainnet. The\ngreen line ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionV10.True")," denotes P2P relays.\n",(0,r.kt)("img",{alt:"node versions",src:o(40970).Z,width:"2674",height:"1580"})),(0,r.kt)("h3",{id:"open-source"},"Open Source"),(0,r.kt)("p",null,"We upstreamed our FFI bindings to Windows named pipes to ",(0,r.kt)("inlineCode",{parentName:"p"},"Win32")," package, the\nPR was accepted and merged."),(0,r.kt)("p",null,"We also received an external contribution which enhanced our documentation, see\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4676"},"ouroboros-network#4676"),"."))}c.isMDXComponent=!0},53101:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/2023-10-04-p2p-relays-75c2baf57ea9346a40f0098b2abb4a99.png"},40970:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/2023-10-04-relay-versions-5168d3ed0ad365a18e86263fcccffd23.png"}}]); \ No newline at end of file diff --git a/assets/js/20bc6fcd.6a2cce37.js b/assets/js/20bc6fcd.6a2cce37.js new file mode 100644 index 00000000000..b9b6effce06 --- /dev/null +++ b/assets/js/20bc6fcd.6a2cce37.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4093],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||d[m]||i;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const i={title:"Developer Experience Update",slug:"2023-06-09-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-09-developer-experience",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-developer-experience.md",source:"@site/blog/2023-06-09-developer-experience.md",title:"Developer Experience Update",description:"High level summary",date:"2023-06-09T00:00:00.000Z",formattedDate:"June 9, 2023",tags:[{label:"devx",permalink:"/cardano-updates/tags/devx"}],readingTime:2.035,hasTruncateMarker:!1,authors:[{name:"Moritz Angermann",title:"Head of Developer Experience",url:"https://github.com/angerman",imageURL:"https://github.com/angerman.png",key:"angerman"}],frontMatter:{title:"Developer Experience Update",slug:"2023-06-09-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-06-09-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-09-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"build support & maintainance",id:"build-support--maintainance",level:3},{value:"compiler upgrades",id:"compiler-upgrades",level:3},{value:"CHaP (cardano-haskell-packages)",id:"chap-cardano-haskell-packages",level:3},{value:"GitHub Actions",id:"github-actions",level:3},{value:"iohk-nix",id:"iohk-nix",level:3},{value:"haskell.nix",id:"haskellnix",level:3},{value:"devx",id:"devx",level:3},{value:"upstream tooling",id:"upstream-tooling",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements."),(0,r.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,r.kt)("h3",{id:"build-support--maintainance"},"build support & maintainance"),(0,r.kt)("p",null,"Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure ",(0,r.kt)("inlineCode",{parentName:"p"},"LoadDLL")," errors to ",(0,r.kt)("inlineCode",{parentName:"p"},"blst")," integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base"},"cardano-base")," experiencing significant reductions in CI complexity."),(0,r.kt)("h3",{id:"compiler-upgrades"},"compiler upgrades"),(0,r.kt)("p",null,"After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility."),(0,r.kt)("h3",{id:"chap-cardano-haskell-packages"},"CHaP (cardano-haskell-packages)"),(0,r.kt)("p",null,"We relocated the underlying tooling, (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/foliage"},"foliage"),"), for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP")," into the IOG organization. Furthermore, we have introduced ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/260"},"improved tooling to quickly add constraints to packages"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/issues/285"},"better error reporting for add-revision")," and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/foliage/pull/63"},"better hackage url compatibility")," to facilitate easer usage of CHaP."),(0,r.kt)("h3",{id:"github-actions"},"GitHub Actions"),(0,r.kt)("p",null,"Our repository, ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/actions"},"input-output-hk/actions"),", now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the ",(0,r.kt)("inlineCode",{parentName:"p"},"base")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"haskell")," install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking ",(0,r.kt)("inlineCode",{parentName:"p"},"cabal"),"."),(0,r.kt)("h3",{id:"iohk-nix"},"iohk-nix"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/iohk-nix"},"iohk-nix")," repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, ",(0,r.kt)("inlineCode",{parentName:"p"},"sodium"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"blst"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"secp256k1"),", are also fixed to certain revisions within the ",(0,r.kt)("inlineCode",{parentName:"p"},"iohk-nix")," repository."),(0,r.kt)("h3",{id:"haskellnix"},"haskell.nix"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/haskell.nix"},"Haskell.nix")," has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to ",(0,r.kt)("inlineCode",{parentName:"p"},"gmp"),"."),(0,r.kt)("h3",{id:"devx"},"devx"),(0,r.kt)("p",null,"The relatively new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/devx"},"devx")," repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The ",(0,r.kt)("inlineCode",{parentName:"p"},"devx")," repository's readme has been updated to reflect its purpose and usage guidelines."),(0,r.kt)("h3",{id:"upstream-tooling"},"upstream tooling"),(0,r.kt)("p",null,"Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/20ca2c37.5368fb83.js b/assets/js/20ca2c37.5368fb83.js new file mode 100644 index 00000000000..fbfc6eb9eeb --- /dev/null +++ b/assets/js/20ca2c37.5368fb83.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[38516],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||o;return n?r.createElement(h,i(i({ref:t},s),{},{components:n})):r.createElement(h,i({ref:t},s))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-07-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-04-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-04-db-sync.md",source:"@site/blog/2023-07-04-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-07-04T00:00:00.000Z",formattedDate:"July 4, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.73,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-07-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-07-06-developer-experience"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-04-node-cli-api"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],s={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We've made progress in all high level objectives"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CIP-1694 integration design"),(0,a.kt)("li",{parentName:"ul"},"UTxO-HD integration proof of concept"),(0,a.kt)("li",{parentName:"ul"},"schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested"),(0,a.kt)("li",{parentName:"ul"},"Many devx issues resolved")),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We have improved and validated the design for the Conway integration in db-sync"),(0,a.kt)("li",{parentName:"ul"},"Improved the initial integration of the UTxO-HD feauture branches which are under test"),(0,a.kt)("li",{parentName:"ul"},"Prepared a new release 13.1.1.3 which supports node 8.1.1\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1455"},"#1455"),"."),(0,a.kt)("li",{parentName:"ul"},"This also fixes a bug\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1451"},"#1451")),(0,a.kt)("li",{parentName:"ul"},"Added new tests to the new tx_out options\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1429"},"#1429")),(0,a.kt)("li",{parentName:"ul"},"Fixed a chronic issue in db-sync related to exception handling and concurrency\nThis fixes many other issues and simplifies the logic in db-sync\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1447"},"#1447")),(0,a.kt)("li",{parentName:"ul"},"A number of fixes and improvements in ci, docker, devx, docs\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1436"},"#1436"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1442"},"#1442"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1448"},"#1448"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1452"},"#1452"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2154b8e4.4635d227.js b/assets/js/2154b8e4.4635d227.js new file mode 100644 index 00000000000..d0a80f3d032 --- /dev/null +++ b/assets/js/2154b8e4.4635d227.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[28480],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var p=a.createContext({}),i=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=i(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},s=a.forwardRef((function(e,t){var r=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,d=u(e,["components","mdxType","originalType","parentName"]),c=i(r),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||n;return r?a.createElement(h,o(o({ref:t},d),{},{components:r})):a.createElement(h,o({ref:t},d))}));function h(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=r.length,o=new Array(n);o[0]=s;var u={};for(var p in t)hasOwnProperty.call(t,p)&&(u[p]=t[p]);u.originalType=e,u[c]="string"==typeof e?e:l,o[1]=u;for(var i=2;i{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>u,toc:()=>i});var a=r(87462),l=(r(67294),r(3905));const n={title:"Ledger Team Update",slug:"2023-05-26-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,u={permalink:"/cardano-updates/2023-05-26-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-ledger.md",source:"@site/blog/2023-05-26-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.565,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-05-26-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-26-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-26-network"}},p={authorsImageUrls:[void 0]},i=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway progress",id:"conway-progress",level:3},{value:"Improve testing",id:"improve-testing",level:3},{value:"Integration work",id:"integration-work",level:3},{value:"Technical debt",id:"technical-debt",level:3}],d={toc:i},c="wrapper";function m(e){let{components:t,...r}=e;return(0,l.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"The ledger team made progress on the conway ledger era. In particular, the design and implementation\nof the new certificates is near complete, we refactored some of our data structures\nto be able to support DReps, we cleaned up the serialization format, and renamed things to make\nclearer the differences with Shelley."),(0,l.kt)("p",null,"The team also completed integration work for the next node release, namely 8.1.0.\nAnd, as always, we continue to address technical debt."),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway-progress"},"Conway progress"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3408"},"pull-3408")," - Improve conway delegation certificates"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3428"},"pull-3428")," - Get rid of Constitutional in favor of Genesis and Committee"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3426"},"pull-3426")," - Add DRep to internal data struture (UMap)"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3425"},"pull-3425")," - Improve witness logic needed for conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3423"},"pull-3423")," - Rename ShelleyDelegCerts constructors to distinguish them from Conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3421"},"pull-3421")," - Rename DCert -> TxCert"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3454"},"pull-3454")," - conway CDDL minor fixes")),(0,l.kt)("h3",{id:"improve-testing"},"Improve testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3403"},"pull-3403")," - Add Plutus script context golden tests")),(0,l.kt)("h3",{id:"integration-work"},"Integration work"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3410"},"pull-3410")," - Update chaps index"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3416"},"pull-3416")," - Bump cardano-ledger-alonzo-test version"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3414"},"pull-3414")," - Bump cardano-ledger-shelley-test minor version"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3420"},"pull-3420")," - Bump cardano-ledger-shelley-ma-test version"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3441"},"pull-3441")," - Release cardano-ledger-","[alonzo|babbage]","-1.2.1")),(0,l.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3409"},"pull-3409")," - Unit test - no such thing as a reference datum"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3407"},"pull-3407")," - Fixup release process documentation"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3404"},"pull-3404")," - Create TotalDeposits events during all eras"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3402"},"pull-3402")," - Fix broken references in the Shelley spec"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3424"},"pull-3424")," - Remove no longer used cardano-ledger-shelley-ma package"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3432"},"pull-3432")," - Add an example on how to bump up versions in the changelog "),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3440"},"pull-3440")," - Revert back to the group serialization for ProtVer for PParams ")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/21735eff.0b009fcd.js b/assets/js/21735eff.0b009fcd.js new file mode 100644 index 00000000000..be257984d71 --- /dev/null +++ b/assets/js/21735eff.0b009fcd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64156],{60430:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/network/page/2","page":2,"postsPerPage":5,"totalPages":5,"totalCount":24,"previousPage":"/cardano-updates/tags/network","nextPage":"/cardano-updates/tags/network/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/21857c8f.db26831e.js b/assets/js/21857c8f.db26831e.js new file mode 100644 index 00000000000..d1c4d49a639 --- /dev/null +++ b/assets/js/21857c8f.db26831e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85417],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),m=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},p=function(e){var t=m(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=m(r),d=a,y=u["".concat(l,".").concat(d)]||u[d]||c[d]||o;return r?n.createElement(y,s(s({ref:t},p),{},{components:r})):n.createElement(y,s({ref:t},p))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:a,s[1]=i;for(var m=2;m{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>m});var n=r(87462),a=(r(67294),r(3905));const o={title:"System Test Team Update",slug:"2022-12-01-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-12-01-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-system-test.md",source:"@site/blog/2022-12-01-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2022-12-01T00:00:00.000Z",formattedDate:"December 1, 2022",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.765,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"System Test Team Update",slug:"2022-12-01-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-01-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-30-consensus"}},l={authorsImageUrls:[void 0]},m=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],p={toc:m},u="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the ",(0,a.kt)("em",{parentName:"p"},"P2P Single\nRelay")," functionality, and also tested some DB-Sync tags."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"moved the System Test CLI Pipelines from BuildKite to Github Actions"),(0,a.kt)("li",{parentName:"ul"},"improved the reporting tools to support the rerun of the failled tests and update of the reports "),(0,a.kt)("li",{parentName:"ul"},"added support for Github API in ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/mkoura/report-aggregator"},"report-aggregator"),", so reports will be generated from the GitHub nightly jobs from now on"),(0,a.kt)("li",{parentName:"ul"},"added support for mixed topology - P2P, legacy, mixed topologies"),(0,a.kt)("li",{parentName:"ul"},"planned the P2P Single Relay system test activities "),(0,a.kt)("li",{parentName:"ul"},"added support to start regression tests with PV8 + better selection of tests")),(0,a.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)"),(0,a.kt)("li",{parentName:"ul"},"tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/219856ee.fc647f5b.js b/assets/js/219856ee.fc647f5b.js new file mode 100644 index 00000000000..167c697872b --- /dev/null +++ b/assets/js/219856ee.fc647f5b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2109],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>f});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},m=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=n,f=s["".concat(p,".").concat(d)]||s[d]||u[d]||o;return r?a.createElement(f,l(l({ref:t},m),{},{components:r})):a.createElement(f,l({ref:t},m))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-04-28-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-04-28-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-goedel.md",source:"@site/blog/2023-04-28-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-04-28T00:00:00.000Z",formattedDate:"April 28, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.375,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-04-28-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-04-28-crypto"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-04-28-network"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],m={toc:c},s="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The team is working on porting an existing formalisation of Ouroboros\nPraos to a newer foundation."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team worked on documentation.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team worked on an application layer for the Praos formalisation.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2276e554.dfa87ea9.js b/assets/js/2276e554.dfa87ea9.js new file mode 100644 index 00000000000..7b252f2325a --- /dev/null +++ b/assets/js/2276e554.dfa87ea9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[28843],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),c=u(r),h=o,m=c["".concat(p,".").concat(h)]||c[h]||d[h]||a;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var n=r(87462),o=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-08-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-08-04-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-network.md",source:"@site/blog/2023-08-04-network.md",title:"Network Team Update",description:"High-level overview of sprint 41",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.515,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-08-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-04-ledger"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-04-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level overview of sprint 41",id:"high-level-overview-of-sprint-41",level:2},{value:"Other contributions",id:"other-contributions",level:2}],l={toc:u},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-overview-of-sprint-41"},"High-level overview of ",(0,o.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+41%22"},"sprint 41")),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"24th July - 6th August 2023")),(0,o.kt)("p",null,"We started the implementation of ",(0,o.kt)("strong",{parentName:"p"},"bootstrap peers"),". Bootstrap peers are designed\nto provide a safety guarantee for nodes joining the network while still taking\nadvantage of the distributed network for nodes that are synced. This will be\nan intermediate step before Genesis which will allow for further distribute the\nsystem. The bootstrap peers will be run by some trusted partners like CF,\nEmurgo or IOG. They are primarily designed for leaf nodes (e.g. full node\nwallets), which often end up syncing and require access to the honest chain. See\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4615"},"ouroboros-network#4615")," for a more detailed implementation plan."),(0,o.kt)("h2",{id:"other-contributions"},"Other contributions"),(0,o.kt)("p",null,"We started to use ",(0,o.kt)("inlineCode",{parentName:"p"},"nothunks")," library to discover if we have any unevaluated\nthunks which can lead to memory leaks ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4633"},"ouroboros-network#4633"),". We found\na small one in the peer metric component of the P2P networking stack. Fixing\nit put us on a small detour of fixing the API of the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/tree/master/strict-checked-vars"},(0,o.kt)("inlineCode",{parentName:"a"},"strict-checked-vars")),"\npackage: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pulls/431"},"cardano-base#431"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pulls/432"},"cardano-base#432"),", as well as adding ",(0,o.kt)("inlineCode",{parentName:"p"},"NFData"),"\ninstance to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/110"},(0,o.kt)("inlineCode",{parentName:"a"},"io-classes")),". We also improved ",(0,o.kt)("inlineCode",{parentName:"p"},"nothunks"),"\nlibrary to make debugging easier and we provided a ",(0,o.kt)("inlineCode",{parentName:"p"},"NoThunks")," instance for\n",(0,o.kt)("inlineCode",{parentName:"p"},"ThreadId")," which we will need in the future (see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/nothunks/pull/33"},"nothunks#33"),")."),(0,o.kt)("p",null,"We released a new version of ",(0,o.kt)("inlineCode",{parentName:"p"},"io-classes")," (version ",(0,o.kt)("inlineCode",{parentName:"p"},"1.2.0.0"),") and related\npackages to ",(0,o.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/io-classes-1.2.0.0io-classes-1.2.0.0"},"Hackage"),"."),(0,o.kt)("p",null,"We addressed all review comments on the eclipse evasion PR which introduces big\nledger peers, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"ouroboros-network#3886"),"."),(0,o.kt)("p",null,"We fixed how ",(0,o.kt)("inlineCode",{parentName:"p"},"SIGHUP")," signal handlers are registered, so it's not possible to\nshutdown a node which was starting while trying to update network topology,\nsee ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5421"},"cardano-node#5421"),"."),(0,o.kt)("p",null,"I didn't mention that in the previous update, so here it goes: in the previous\nsprint we released ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/blob/f84fcddce472d6cfc2b838b20a2ad085fe0896ed/ouroboros-network/CHANGELOG.md"},(0,o.kt)("inlineCode",{parentName:"a"},"ouroboros-network-0.8.2.0"))," and\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/blob/ouroboros-network-framework-0.7.0.0/ouroboros-network-framework/CHANGELOG.md"},(0,o.kt)("inlineCode",{parentName:"a"},"ouroboros-network-framework-0.7.0.0")),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/237aa4d6.8db3819a.js b/assets/js/237aa4d6.8db3819a.js new file mode 100644 index 00000000000..59ec098af03 --- /dev/null +++ b/assets/js/237aa4d6.8db3819a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98918],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),c=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(f,l(l({ref:t},s),{},{components:n})):r.createElement(f,l({ref:t},s))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-07-20-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-20-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-20-goedel.md",source:"@site/blog/2023-07-20-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-07-20T00:00:00.000Z",formattedDate:"July 20, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.47,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-07-20-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-21-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-18-node-cli-api"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is working on formalising mini protocols, the performance\nmodelling prototype and also finishing off their ICE papers."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Formalization of the chain synchronization mini-protocol in the\nthorn calculus")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Final pre-publication steps for ICE 2023 papers")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Developing approach for specification and verification of\nmini-protocols")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Started work on porting the DeltaQ framework to a new, more concrete\nbackend based on piecewise-polynomials"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/23a95b4f.a0a27f60.js b/assets/js/23a95b4f.a0a27f60.js new file mode 100644 index 00000000000..ab5aa8f1795 --- /dev/null +++ b/assets/js/23a95b4f.a0a27f60.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94583],{56372:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/tags/consensus","allTagsPath":"/cardano-updates/tags","count":32}')}}]); \ No newline at end of file diff --git a/assets/js/2455acc4.54c4fd43.js b/assets/js/2455acc4.54c4fd43.js new file mode 100644 index 00000000000..a928ffc9131 --- /dev/null +++ b/assets/js/2455acc4.54c4fd43.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21642],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},m="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,c=o(t,["components","mdxType","originalType","parentName"]),m=u(a),s=r,h=m["".concat(p,".").concat(s)]||m[s]||d[s]||i;return a?n.createElement(h,l(l({ref:e},c),{},{components:a})):n.createElement(h,l({ref:e},c))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,l=new Array(i);l[0]=s;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[m]="string"==typeof t?t:r,l[1]=o;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-08-15-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-08-15-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-15-node-cli-api.md",source:"@site/blog/2023-08-15-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-08-15T00:00:00.000Z",formattedDate:"August 15, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.29,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-08-15-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"SECP bindings Security Issue Report",permalink:"/cardano-updates/2023-08-17-secp-issue"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-11-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-08-02---2023-08-15"},"2023-08-02 - 2023-08-15"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"cardano-node 8.2.1 (pre-release) to SanchoNet"),(0,r.kt)("li",{parentName:"ul"},"Continue moving CLI into era-based top level command structure"),(0,r.kt)("li",{parentName:"ul"},"Wire-up DREP key generation,"),(0,r.kt)("li",{parentName:"ul"},"Fix DREP deregistration certificates"),(0,r.kt)("li",{parentName:"ul"},"Implement Constitutional Committee Key generation on the CLI"),(0,r.kt)("li",{parentName:"ul"},"Introducing era-based protocol parameters on the API"),(0,r.kt)("li",{parentName:"ul"},"Removing depracated functions and types on the API")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/169"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.13.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/164"},"Reenable golden tests")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/163"},"#128 DRep key generation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/160"},"Bump index states")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/159"},"Fix deregistration-certificate: generate deregistration instead of registration certs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/158"},"Structuring legacy code so that era-based code does not depend on it")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/151"},"Plural for command groups")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/144"},"Implement ",(0,r.kt)("inlineCode",{parentName:"a"},"conway governance committee key-hash")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/142"},"Wire up constitution creation in the new era based cli commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/140"},"cardano-cli 8.5.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/137"},"Wire up remaining DReps")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/136"},"Implement ",(0,r.kt)("inlineCode",{parentName:"a"},"conway governance committee hot-key-gen")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/127"},"Convert to use ",(0,r.kt)("inlineCode",{parentName:"a"},"tasty-discover")))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/189"},"Release cardano-api 8.13.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/187"},"Fix build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/185"},"cardano-api 8.13.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/181"},"Modify ",(0,r.kt)("inlineCode",{parentName:"a"},"queryGenesisParameters")," so that its type advertises it only returns genesis parameters for the Shelley era")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/180"},"Introduce EraBasedProtocolParametersUpdate")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/173"},"Delete deprecated functions and types")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/171"},"Simplify code with new constraints functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/170"},"Fix ",(0,r.kt)("inlineCode",{parentName:"a"},"EraCast Certificate"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/168"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.12.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/167"},"Fix committee hot keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/164"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.11.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/163"},"Fix typo Constitional -> Constitutional"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5430"},"cardano-git-rev: New version for CHaP")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5427"},"Fix broken links in docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5423"},"cardano-node 8.2.1"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5427"},"Fix broken links in docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5423"},"cardano-node 8.2.1"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5427"},"Fix broken links in docs")),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/127"},"Convert to use ",(0,r.kt)("inlineCode",{parentName:"a"},"tasty-discover")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/245ecae9.0554e2e3.js b/assets/js/245ecae9.0554e2e3.js new file mode 100644 index 00000000000..c42f5e8b555 --- /dev/null +++ b/assets/js/245ecae9.0554e2e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65356],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(a),d=n,m=s["".concat(p,".").concat(d)]||s[d]||c[d]||o;return a?r.createElement(m,i(i({ref:t},h),{},{components:a})):r.createElement(m,i({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-09-15-hydra",authors:["v0d1ch","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-09-15-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-hydra.md",source:"@site/blog/2023-09-15-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.94,hasTruncateMarker:!1,authors:[{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"},{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-15-hydra",authors:["v0d1ch","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-15-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-15-ledger"}},p={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, most of the Hydra team was attending a cardano scaling workshop in\nNantes, France. They used this oportunity to meet fellow mithril team and spend\nsome time together to hack on some code and, as always, reflect on the past work\nand find optimal path forward for both projects. They also fixed a bug that\ncaused hydra-node to crash when querying L1, worked on a new network resillience\nproof-of-concept and accepted a new ADR related to stateless transaction\nobservation."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano scaling workshop with members of hydra and mithril teams "),(0,n.kt)("li",{parentName:"ul"},"Accepted user contribution for possible new use-case ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1048"},"#1048")),(0,n.kt)("li",{parentName:"ul"},"Fix for the hydra-node crash related to internal wallet query ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1053"},"#1053")),(0,n.kt)("li",{parentName:"ul"},"Collected experimental CI findings ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1070"},"#1070")),(0,n.kt)("li",{parentName:"ul"},"Propose first POC for the network resilience ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1074"},"#1074"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting & report including updates from Mithril"),(0,n.kt)("li",{parentName:"ul"},"Review POC and discuss our options for the network resilience"),(0,n.kt)("li",{parentName:"ul"},"Update cardano-api to version 8.20"),(0,n.kt)("li",{parentName:"ul"},"Address TODOs on aiken commit validator ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1072"},"#1072")),(0,n.kt)("li",{parentName:"ul"},"Complete hydra-support in kupo ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/CardanoSolutions/kupo/pull/117"},"kupo#117"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/246d9f04.1a9615d1.js b/assets/js/246d9f04.1a9615d1.js new file mode 100644 index 00000000000..b898c4f1868 --- /dev/null +++ b/assets/js/246d9f04.1a9615d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7966],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=p(r),d=n,h=m["".concat(u,".").concat(d)]||m[d]||c[d]||i;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=d;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[m]="string"==typeof e?e:n,l[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-08-04-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-08-04-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-crypto.md",source:"@site/blog/2023-08-04-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.495,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-08-04-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-09-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-04-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"MuSig2",id:"musig2",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},m="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation"),(0,n.kt)("li",{parentName:"ul"},"mithril: Full node verifier"),(0,n.kt)("li",{parentName:"ul"},"musig2: Finalised the missing fuzz tests"),(0,n.kt)("li",{parentName:"ul"},"kes_agent: engineer on PTO. Work halted ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work on a mithril flaky test ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/1105"},"#1105")),(0,n.kt)("li",{parentName:"ul"},"Keep working on Full Node Verifier ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"),".\nShould be merged in the coming week.")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finalised the fuzz tests ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/43"},"#43"))),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2494f6fc.cb95a366.js b/assets/js/2494f6fc.cb95a366.js new file mode 100644 index 00000000000..21ace08ff85 --- /dev/null +++ b/assets/js/2494f6fc.cb95a366.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[57583],{4452:a=>{a.exports=JSON.parse('[{"label":"consensus","permalink":"/cardano-updates/quarterly/tags/consensus","count":4},{"label":"network","permalink":"/cardano-updates/quarterly/tags/network","count":4},{"label":"sre","permalink":"/cardano-updates/quarterly/tags/sre","count":2},{"label":"performance-tracing","permalink":"/cardano-updates/quarterly/tags/performance-tracing","count":1},{"label":"ledger","permalink":"/cardano-updates/quarterly/tags/ledger","count":2},{"label":"open-source","permalink":"/cardano-updates/quarterly/tags/open-source","count":1},{"label":"cli-api-quarterly","permalink":"/cardano-updates/quarterly/tags/cli-api-quarterly","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/24d5a6d9.56e383b8.js b/assets/js/24d5a6d9.56e383b8.js new file mode 100644 index 00000000000..5493e356336 --- /dev/null +++ b/assets/js/24d5a6d9.56e383b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98698],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=n,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||i;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Mithril Team Update",slug:"2023-09-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-27-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-27-mithril.md",source:"@site/blog/2023-09-27-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-09-27T00:00:00.000Z",formattedDate:"September 27, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.975,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-09-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-29-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-26-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team has released a new distribution ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2337.0"},(0,n.kt)("inlineCode",{parentName:"a"},"2337.0")),", which includes the following enhancements: support for ",(0,n.kt)("inlineCode",{parentName:"p"},"zstandard")," compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator."),(0,n.kt)("p",null,"They also completed the refactoring and standardization of the errors in the Mithril nodes and published an ",(0,n.kt)("a",{parentName:"p",href:"https://mithril.network/doc/adr/6"},"Architectural decision record")," on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure."),(0,n.kt)("p",null,"Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Release new ",(0,n.kt)("inlineCode",{parentName:"strong"},"2337")," distribution")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1219"},"#1219")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Errors refactoring")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/798"},"#798")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Client traffic creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1207"},"#1207")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Record statistics about the downloaded snapshot in the aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1127"},"#1127")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Create a SPO checklist for KES keys update")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1267"},"#1267")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Spike: Run client in browser WASM PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1254"},"#1254")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Benchmark aggregator performances")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1220"},"#1220")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Activate Cloudflare protection of infrastructure")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1230"},"#1230"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2529.3a3a1ec8.js b/assets/js/2529.3a3a1ec8.js new file mode 100644 index 00000000000..a1671d1f8c0 --- /dev/null +++ b/assets/js/2529.3a3a1ec8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2529],{39058:(e,t,a)=>{a.d(t,{Z:()=>h});var l=a(67294),n=a(86010),r=a(93285),s=a(87524),o=a(39960),i=a(95999);const c={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function m(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,n.Z)(c.sidebar,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,n.Z)(c.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,n.Z)(c.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:c.sidebarItem},l.createElement(o.Z,{isNavLink:!0,to:e.permalink,className:c.sidebarItemLink,activeClassName:c.sidebarItemLinkActive},e.title)))))))}var u=a(13102);function d(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(o.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function g(e){return l.createElement(u.Zo,{component:d,props:e})}function p(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(g,{sidebar:t}):l.createElement(m,{sidebar:t}):null}function h(e){const{sidebar:t,toc:a,children:s,...o}=e,i=t&&t.items.length>0;return l.createElement(r.Z,o,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(p,{sidebar:t}),l.createElement("main",{className:(0,n.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},30390:(e,t,a)=>{a.d(t,{Z:()=>R});var l=a(67294),n=a(86010),r=a(9460),s=a(44996);function o(e){let{children:t,className:a}=e;const{frontMatter:n,assets:o}=(0,r.C)(),{withBaseUrl:i}=(0,s.C)(),c=o.image??n.image;return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},c&&l.createElement("meta",{itemProp:"image",content:i(c,{absolute:!0})}),t)}var i=a(39960);const c={title:"title_f1Hy"};function m(e){let{className:t}=e;const{metadata:a,isBlogPostPage:s}=(0,r.C)(),{permalink:o,title:m}=a,u=s?"h1":"h2";return l.createElement(u,{className:(0,n.Z)(c.title,t),itemProp:"headline"},s?m:l.createElement(i.Z,{itemProp:"url",to:o},m))}var u=a(95999),d=a(88824);const g={container:"container_mt6G"};function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function b(e){let{className:t}=e;const{metadata:a}=(0,r.C)(),{date:s,formattedDate:o,readingTime:i}=a;return l.createElement("div",{className:(0,n.Z)(g.container,"margin-vert--md",t)},l.createElement(h,{date:s,formattedDate:o}),void 0!==i&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:i})))}function f(e){return e.href?l.createElement(i.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:r,title:s,url:o,imageURL:i,email:c}=t,m=o||c&&`mailto:${c}`||void 0;return l.createElement("div",{className:(0,n.Z)("avatar margin-bottom--sm",a)},i&&l.createElement(f,{href:m,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:i,alt:r})),r&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(f,{href:m,itemProp:"url"},l.createElement("span",{itemProp:"name"},r))),s&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},s)))}const _={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function N(e){let{className:t}=e;const{metadata:{authors:a},assets:s}=(0,r.C)();if(0===a.length)return null;const o=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,n.Z)("margin-top--md margin-bottom--sm",o?_.imageOnlyAuthorRow:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,n.Z)(!o&&"col col--6",o?_.imageOnlyAuthorCol:_.authorCol),key:t},l.createElement(v,{author:{...e,imageURL:s.authorsImageUrls[t]??e.imageURL}})))))}function P(){return l.createElement("header",null,l.createElement(m,null),l.createElement(b,null),l.createElement(N,null))}var Z=a(18780),k=a(80210);function C(e){let{children:t,className:a}=e;const{isBlogPostPage:s}=(0,r.C)();return l.createElement("div",{id:s?Z.blogPostContainerID:void 0,className:(0,n.Z)("markdown",a),itemProp:"articleBody"},l.createElement(k.Z,null,t))}var I=a(84881),T=a(71526),w=a(87462);function y(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function F(e){const{blogPostTitle:t,...a}=e;return l.createElement(i.Z,(0,w.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(y,null))}const L={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function B(){const{metadata:e,isBlogPostPage:t}=(0,r.C)(),{tags:a,title:s,editUrl:o,hasTruncateMarker:i}=e,c=!t&&i,m=a.length>0;return m||c||o?l.createElement("footer",{className:(0,n.Z)("row docusaurus-mt-lg",t&&L.blogPostFooterDetailsFull)},m&&l.createElement("div",{className:(0,n.Z)("col",{"col--9":c})},l.createElement(T.Z,{tags:a})),t&&o&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(I.Z,{editUrl:o})),c&&l.createElement("div",{className:(0,n.Z)("col text--right",{"col--3":m})},l.createElement(F,{blogPostTitle:s,to:e.permalink}))):null}function R(e){let{children:t,className:a}=e;const s=function(){const{isBlogPostPage:e}=(0,r.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(o,{className:(0,n.Z)(s,a)},l.createElement(P,null),l.createElement(C,null,t),l.createElement(B,null))}},84881:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(67294),n=a(95999),r=a(35281),s=a(87462),o=a(86010);const i={iconEdit:"iconEdit_Z9Sw"};function c(e){let{className:t,...a}=e;return l.createElement("svg",(0,s.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(i.iconEdit,t),"aria-hidden":"true"},a),l.createElement("g",null,l.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function m(e){let{editUrl:t}=e;return l.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:r.k.common.editThisPage},l.createElement(c,null),l.createElement(n.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},32244:(e,t,a)=>{a.d(t,{Z:()=>s});var l=a(67294),n=a(86010),r=a(39960);function s(e){const{permalink:t,title:a,subLabel:s,isNext:o}=e;return l.createElement(r.Z,{className:(0,n.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},s&&l.createElement("div",{className:"pagination-nav__sublabel"},s),l.createElement("div",{className:"pagination-nav__label"},a))}},13008:(e,t,a)=>{a.d(t,{Z:()=>o});var l=a(67294),n=a(86010),r=a(39960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function o(e){let{permalink:t,label:a,count:o}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(s.tag,o?s.tagWithCount:s.tagRegular)},a,o&&l.createElement("span",null,o))}},71526:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(67294),n=a(86010),r=a(95999),s=a(13008);const o={tags:"tags_jXut",tag:"tag_QGVx"};function i(e){let{tags:t}=e;return l.createElement(l.Fragment,null,l.createElement("b",null,l.createElement(r.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),l.createElement("ul",{className:(0,n.Z)(o.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:a}=e;return l.createElement("li",{key:a,className:o.tag},l.createElement(s.Z,{label:t,permalink:a}))}))))}},9460:(e,t,a)=>{a.d(t,{C:()=>o,n:()=>s});var l=a(67294),n=a(902);const r=l.createContext(null);function s(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const s=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return l.createElement(r.Provider,{value:s},t)}function o(){const e=(0,l.useContext)(r);if(null===e)throw new n.i6("BlogPostProvider");return e}},88824:(e,t,a)=>{a.d(t,{c:()=>c});var l=a(67294),n=a(52263);const r=["zero","one","two","few","many","other"];function s(e){return r.filter((t=>e.includes(t)))}const o={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function i(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),o}}),[e])}function c(){const e=i();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return l[Math.min(r,l.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/255b72b4.c906285c.js b/assets/js/255b72b4.c906285c.js new file mode 100644 index 00000000000..fb7acfdf25f --- /dev/null +++ b/assets/js/255b72b4.c906285c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22109],{42018:a=>{a.exports=JSON.parse('{"label":"ledger","permalink":"/cardano-updates/tags/ledger","allTagsPath":"/cardano-updates/tags","count":30}')}}]); \ No newline at end of file diff --git a/assets/js/26678b7e.706c9ffb.js b/assets/js/26678b7e.706c9ffb.js new file mode 100644 index 00000000000..f1b42679b70 --- /dev/null +++ b/assets/js/26678b7e.706c9ffb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47724],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),s=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(d.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,d=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(a),c=n,m=p["".concat(d,".").concat(c)]||p[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-12-02-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-02-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-02-hydra.md",source:"@site/blog/2022-12-02-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-12-02T00:00:00.000Z",formattedDate:"December 2, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.965,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-12-02-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-12-09-ledger"},nextItem:{title:"DB sync Team Update",permalink:"/cardano-updates/2022-12-01-db-sync"}},d={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:s},p="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has worked on cleaning up several things in progress\nafter last week's summit. They have extended their model-based testing (MBT)\napproach with transaction creation & observation\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/410"},"#410"),", solved\n",(0,n.kt)("inlineCode",{parentName:"p"},"AcquirePointTooOld")," problems of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," with by changing the wallet\ninitialization ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/439"},"#439"),".\nAlso, the Hydra researchers updated the security proofs of the Coordinated Hydra\nHead, which are bound to be included in the Hydra HeadV1 specification."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review & report - will also be published on our website ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/644"},"#644")),(0,n.kt)("li",{parentName:"ul"},"Extended the model-based testing (MBT) with transaction creation/observation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/410"},"#410")),(0,n.kt)("li",{parentName:"ul"},"Solve ",(0,n.kt)("inlineCode",{parentName:"li"},"AcquirePointTooOld")," problems with new wallet initialization ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/439"},"#439")),(0,n.kt)("li",{parentName:"ul"},"Fixed our hydraw deployments (EC2 instances)"),(0,n.kt)("li",{parentName:"ul"},"Created & discussed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," within tx validity work"),(0,n.kt)("li",{parentName:"ul"},"Received & discussed security proofs of Coordinated Hydra Head (requires more work)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Get ADR21 accepted & close tx validity gap in our implementation"),(0,n.kt)("li",{parentName:"ul"},"Complete review & integrate the Hydra tutorial"),(0,n.kt)("li",{parentName:"ul"},"Review latest hydra-pay work"),(0,n.kt)("li",{parentName:"ul"},"Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec"),(0,n.kt)("li",{parentName:"ul"},"Get Cicero (new CI) working")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/26a4b8b3.b55c0ab6.js b/assets/js/26a4b8b3.b55c0ab6.js new file mode 100644 index 00000000000..fa989622396 --- /dev/null +++ b/assets/js/26a4b8b3.b55c0ab6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47669],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>g});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},p=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=c(t),p=a,g=u["".concat(s,".").concat(p)]||u[p]||d[p]||o;return t?r.createElement(g,i(i({ref:n},m),{},{components:t})):r.createElement(g,i({ref:n},m))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=p;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=t(87462),a=(t(67294),t(3905));const o={title:"Performance & Tracing Update",slug:"2023-12-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-12-04-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-04-performance-and-tracing.md",source:"@site/blog/2023-12-04-performance-and-tracing.md",title:"Performance & Tracing Update",description:"High level summary",date:"2023-12-04T00:00:00.000Z",formattedDate:"December 4, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.085,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & Tracing Update",slug:"2023-12-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-12-06-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-12-01-hydra"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Development",id:"development",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,a.kt)(u,(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: Release benchmarking for node ",(0,a.kt)("inlineCode",{parentName:"li"},"8.7.0"),". Also, we performed the first-ever Conway benchmarks."),(0,a.kt)("li",{parentName:"ul"},"Development: Conway capability of our workload generator has been implemented and merged to ",(0,a.kt)("inlineCode",{parentName:"li"},"master"),"."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Quality-of-life improvements to tracing output and addition of a test suite."),(0,a.kt)("li",{parentName:"ul"},"Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"A full set of benchmarks for node ",(0,a.kt)("inlineCode",{parentName:"p"},"8.7.0")," has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of ",(0,a.kt)("inlineCode",{parentName:"p"},"8.7.0")," over ",(0,a.kt)("inlineCode",{parentName:"p"},"8.6.0"),", and can confirm no regressions have been introduced."),(0,a.kt)("p",null,"Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version.\nOnly Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty."),(0,a.kt)("h3",{id:"development"},"Development"),(0,a.kt)("p",null,"Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era.\nCurrently, we're looking into adding Conway-exclusive features, such as ",(0,a.kt)("inlineCode",{parentName:"p"},"DRep")," registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining ",(0,a.kt)("inlineCode",{parentName:"p"},"DRep")," sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've\nimproved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages.\nAdditionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/274d7200.08e977b8.js b/assets/js/274d7200.08e977b8.js new file mode 100644 index 00000000000..892992ef1a6 --- /dev/null +++ b/assets/js/274d7200.08e977b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26565],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=u(r),h=a,m=d["".concat(s,".").concat(h)]||d[h]||c[h]||o;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-11-11-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-11-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-ledger.md",source:"@site/blog/2022-11-11-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.41,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-11-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-11-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-11-network"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:u},d="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"I am extremely excited to say that we now have a pull request up which introduces our new versioned\nCBOR serialization. This was an enormous effort, but it will solve a host of problems that we have\nhad since the Shelley phase. It will take time to properly review it, and we will\nneed to put in a lot of effort to integrate it with the downstream components, but this is a huge\nmilestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction\nserialization schemes."),(0,a.kt)("p",null,"We also have a draft pull request that reworks how deposits are tracked. Users of the system will\nnot notice any difference, but it is a necessary change needed to prepare the way for\ndecentralizing the governance of Cardano."),(0,a.kt)("p",null,"Finally, we continued to address technical debt. In particular, we continued to make progress on\nbringing coherency and consistency to the code base with a common naming convention, and\nimproving some error messages."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We have a pull request up for our new versioned CBOR serialization.\nWhen we encounter a problem with our deserializers, it can be very difficult to implement a fix.\nIt is difficult because we can only fix such issues during a hard fork, and leading up to the\nhard fork we must maintain two serializations for the same type in order to not cause unintended\nnetwork splitting (the problematic version must be used before the hard fork,\nand the fixed version is used afterwards).\nThis can be especially tricky with the ",(0,a.kt)("inlineCode",{parentName:"li"},"FromCBOR")," typeclass, since it is not always easy to\nsearch for where all the problematic uses are located.\nThe new versioned CBOR serialization allows us to gracefully handle this transition.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3138"},"pull-3138"),"]."),(0,a.kt)("li",{parentName:"ul"},"We proposed a CIP for backwards compatibility of the transaction serialization schemes.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/372"},"pull-372"),"]."),(0,a.kt)("li",{parentName:"ul"},"We have draft for the new deposit tracking.\nThis draft is not as memory efficient as the final version will be,\nbut it is a sufficient proof of concept that we can write property tests against, ensuring\nthat we have not changed the semantics.\nWe will optimize after we are sure of the correctness.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3127"},"pull-3127"),"]."),(0,a.kt)("li",{parentName:"ul"},"We now provide better support for debugging failed Plutus scripts in an important helper\nfunction, named ",(0,a.kt)("inlineCode",{parentName:"li"},"evaluateTransactionExecutionUnits"),".\nIn particular, it now returns all the information needed to rerun the script with exactly the\nsame arguments. This feature will end up appearing in the CLI and other tools from the Plutus\ntools team.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3135"},"pull-3135"),"]."),(0,a.kt)("li",{parentName:"ul"},"We did a lot more renaming to bring coherency and consistency to the code base.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3126"},"pull-3126"),"], [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3120"},"pull-3120"),"], [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3118"},"pull-3118"),"], and [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3116"},"pull-3116"),"]."),(0,a.kt)("li",{parentName:"ul"},"We have added a few things to the ledger repository to make it conform to the\n",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},"Cardano Engineering Handbook"),"\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3139"},"pull-3139"),"].")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/27c15961.1370e42d.js b/assets/js/27c15961.1370e42d.js new file mode 100644 index 00000000000..f959dc4cbd2 --- /dev/null +++ b/assets/js/27c15961.1370e42d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73798],{32264:a=>{a.exports=JSON.parse('{"label":"goedel","permalink":"/cardano-updates/tags/goedel","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/27c463c7.c17177cd.js b/assets/js/27c463c7.c17177cd.js new file mode 100644 index 00000000000..fec35986c77 --- /dev/null +++ b/assets/js/27c463c7.c17177cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24327],{83769:a=>{a.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/28874657.18164af4.js b/assets/js/28874657.18164af4.js new file mode 100644 index 00000000000..218c69c2296 --- /dev/null +++ b/assets/js/28874657.18164af4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[28592],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),h=p(n),m=a,d=h["".concat(l,".").concat(m)]||h[m]||c[m]||r;return n?o.createElement(d,i(i({ref:t},u),{},{components:n})):o.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[h]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var o=n(87462),a=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2023-03-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-03-08-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-consensus.md",source:"@site/blog/2023-03-08-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-03-08T00:00:00.000Z",formattedDate:"March 8, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.46,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-03-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-09-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-08-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3},{value:"Support",id:"support",level:3}],u={toc:p},h="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(h,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The Consensus team continued working on refactoring and improving the UTxO-HD\nprototype, and introducing improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"lmdb")," related packages. In\nparticular we identified an opportunity to gain performance by handling locks in\na more optimal way."),(0,a.kt)("p",null,"On the Genesis front, we sketched a mitigation for an issue that ",(0,a.kt)("inlineCode",{parentName:"p"},"PNSol")," and\nResearchers caught. We also came op with a road map for not only testing the\nGenesis prototypes, but also for enriching the tests we already have."),(0,a.kt)("p",null,"Regarding technical debt, next to some minor improvements, we created\ncomponent-level micro-benchmarks for adding transactions to the mempool. The\nresults of these benchmarks will be published in the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/ouroboros-consensus/"},"web\npage"),"."),(0,a.kt)("p",null,"We also finished moving the Consensus documentation to the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),"\nrepository, released ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," ",(0,a.kt)("inlineCode",{parentName:"p"},"0.3.0.0"),", and reduced the time\nGitHub actions take in ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,a.kt)("p",null,"We continued working on refactoring and improving the UTxO-HD prototype. As a\nresult of the first round of sytem-level benchmarks, we identified an\nopportunity to optimise the way we handle locks to improve performance\n(",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4393"},"#4393"),")."),(0,a.kt)("p",null,"Also, we introduced several improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"lmdb")," related packages:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/19"},"New tests")," for read-only transaction handles."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/18"},"New functions")," and ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/13"},"data types"),"."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/11"},"Updates")," to support improved type safety and smaller constraints in\nthe UTxO HD prototype."),(0,a.kt)("li",{parentName:"ul"},"Windows and MacOS ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/haskell-lmdb/pull/8"},"CI support"),".")),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"We sketched out a mitigation of the issue that ",(0,a.kt)("inlineCode",{parentName:"p"},"PNSol")," and Researchers caught in\nthe Genesis design."),(0,a.kt)("p",null,"We came up with a road map for testing the Genesis prototypes, including early\nmilestones that are applicable to today's master branch, ie tests that are\nuseful before Genesis, and that will be nicely enriched when we do add Genesis."),(0,a.kt)("p",null,"We developed the aforementioned tests, specifically a ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," generator for\nthe Honest leader schedule and one as-aggressive-as-possible Adversarial\nleader schedule that together satisfy the Praos properties that the Consensus\ndesign takes as invariants."),(0,a.kt)("p",null,"We investigated why the improved ",(0,a.kt)("inlineCode",{parentName:"p"},"ChainDB")," queueing implementation behaves\ndifferently in the baseline compared to the prototype, and we are close to\nhaving a full picture of how the Consensus components interact during bulk sync."),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4400"},"created")," component-level micro-benchmarks for adding transactions\nto the mempool. We plan on extending this to more mempool actions and different\ntypes of blocks. We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4422"},"store")," the benchmark data to make it available\nto the GitHub action that ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/12"},"publishes")," the benchmarks results."),(0,a.kt)("p",null,"Other minor improvements include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4429"},"Removal")," of ",(0,a.kt)("inlineCode",{parentName:"li"},"Test.Util.Classify")," in favour of ",(0,a.kt)("inlineCode",{parentName:"li"},"Test.StateMachine.Labelling"),"."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4423"},"Addition")," of ",(0,a.kt)("inlineCode",{parentName:"li"},"-Wunused-packages")," to the default ",(0,a.kt)("inlineCode",{parentName:"li"},"ghc-options")," for Consensus\npackages.")),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We finished moving the Consensus documentation ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4374"},"from"),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/haskell-lmdb/pull/8"},"to")," ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),", in preparation for\nmigrating the code to the latter repository."),(0,a.kt)("h3",{id:"support"},"Support"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4412"},"released")," ouroboros-consensus 0.3.0.0."),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4421"},"reduced")," the load in the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," GitHub actions,\nthereby reducing the time CI jobs take."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/28bc1d1b.e033ce8a.js b/assets/js/28bc1d1b.e033ce8a.js new file mode 100644 index 00000000000..fb9d4e0acaa --- /dev/null +++ b/assets/js/28bc1d1b.e033ce8a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1285],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=u(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),p=u(r),c=a,k=p["".concat(i,".").concat(c)]||p[c]||d[c]||s;return r?n.createElement(k,o(o({ref:t},m),{},{components:r})):n.createElement(k,o({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=c;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[p]="string"==typeof e?e:a,o[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const s={title:"System Test Team Update",slug:"2023-06-08-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-08-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-system-test.md",source:"@site/blog/2023-06-08-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:1.005,hasTruncateMarker:!1,authors:[{name:"Martin Kourim",title:"System Test Engineer",url:"https://github.com/mkoura",imageURL:"https://github.com/mkoura.png",key:"mkoura"}],frontMatter:{title:"System Test Team Update",slug:"2023-06-08-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-08-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-06-07-node-cli-api"}},i={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"Testing improvements",id:"testing-improvements",level:3},{value:"Node:",id:"node",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],m={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the ",(0,a.kt)("em",{parentName:"p"},"1.35.7")," and ",(0,a.kt)("em",{parentName:"p"},"8.0.0")," releases."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node-tests/pulls?page=1&q=is%3Apr+is%3Aclosed+updated%3A2023-03-26..2023-06-08"},"Full list of closed PRs")),(0,a.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Make cardano-submit-api REST API service available and run corresponding regression tests by default"),(0,a.kt)("li",{parentName:"ul"},"Update cabal build testing for 8.0.0"),(0,a.kt)("li",{parentName:"ul"},"Add support for testing governance SPO poll"),(0,a.kt)("li",{parentName:"ul"},"Use Poetry for Python dependency management"),(0,a.kt)("li",{parentName:"ul"},"Check status of known GH issues during tests runtime and finish the test accordingly"),(0,a.kt)("li",{parentName:"ul"},"Generate topology files with both IP addresses and DNS names"),(0,a.kt)("li",{parentName:"ul"},"Log issues like failure to start a cluster instance and report errors during tests runtime")),(0,a.kt)("h3",{id:"testing-improvements"},"Testing improvements"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Add rollback testing:",(0,a.kt)("ol",{parentName:"li"},(0,a.kt)("li",{parentName:"ol"},"global consensus is reached after rollback, in situation where less than ",(0,a.kt)("inlineCode",{parentName:"li"},"securityParam")," blocks were produced since cluster split"),(0,a.kt)("li",{parentName:"ol"},"global consensus is not reached when more than ",(0,a.kt)("inlineCode",{parentName:"li"},"securityParam")," blocks were produced, and the result is permanent fork"))),(0,a.kt)("li",{parentName:"ul"},"Add tests to governance SPO poll commands")),(0,a.kt)("h3",{id:"node"},"Node:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"tested the ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_7.html"},"1.35.7")," release"),(0,a.kt)("li",{parentName:"ul"},"tested the ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_8_0_0.html"},"8.0.0")," release")),(0,a.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"improvements in db-sync sync tests"),(0,a.kt)("li",{parentName:"ul"},"improvements in db-sync functional tests")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/28d85025.84af456e.js b/assets/js/28d85025.84af456e.js new file mode 100644 index 00000000000..e9f7804c519 --- /dev/null +++ b/assets/js/28d85025.84af456e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[5214],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},m=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),d=u(a),c=n,h=d["".concat(p,".").concat(c)]||d[c]||s[c]||l;return a?r.createElement(h,o(o({ref:t},m),{},{components:a})):r.createElement(h,o({ref:t},m))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-12-06-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-12-06-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-06-ledger.md",source:"@site/blog/2023-12-06-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-12-06T00:00:00.000Z",formattedDate:"December 6, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.53,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-12-06-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-12-06-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway",id:"conway",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],m={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This period we reached a major milestone, namely we now have an initial version of Conway\nconformance testing working. We are now able to generate random valid data with the help\nof constraint based testing framework, apply that data to Conway Ledger rules and verify\nthat the output matches to the one produced by the executable version of the Formal Ledger\nSpecification, when it is applied to the same random data."),(0,n.kt)("p",null,"We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get\nConstitutional Committee query is complete and tested. Various improvements to the\ntesting tools. Addition of more test cases."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway"},"Conway"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3888"},"pull-3888")," - Add checks for valid ProtVer when a proposal is a HardFork"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3902"},"pull-3902")," - Fix pvCanFollow usage in Conway and improve clarity in Shelley"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3855"},"pull-3855")," - Remove unreachable proposals"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3903"},"pull-3903")," - Add lenient decoder for ",(0,n.kt)("inlineCode",{parentName:"li"},"Addr")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3878"},"pull-3878")," - Committee query - implement next epoch change")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3893"},"pull-3893")," - Move ",(0,n.kt)("inlineCode",{parentName:"li"},"tree-diff")," dependency to tests together with all instances"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3896"},"pull-3896")," - Fix Brute force failure"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3904"},"pull-3904")," - New ListWhere Pred added to the Constrained Solver."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3907"},"pull-3907")," - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3883"},"pull-3883")," - Committee QuerySpec Imp Test"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3909"},"pull-3909")," - Make ",(0,n.kt)("inlineCode",{parentName:"li"},"impAnn")," a bit more useful, by making the logs scoped by ",(0,n.kt)("inlineCode",{parentName:"li"},"impAnn")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3908"},"pull-3908")," - Use upstream testing instances for very basic types"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3912"},"pull-3912")," - Removed call to tail, and the ","'","watchPulser","'"," test"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3852"},"pull-3852")," - Added constrained generators to conformance tests - Part 1")),(0,n.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3891"},"pull-3891")," - Bump plutus to 1.17")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/29801efc.c897fcb8.js b/assets/js/29801efc.c897fcb8.js new file mode 100644 index 00000000000..e0954d4ec71 --- /dev/null +++ b/assets/js/29801efc.c897fcb8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[50307],{22660:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/45","page":45,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/44","nextPage":"/cardano-updates/page/46","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/2a8f0182.70e085a1.js b/assets/js/2a8f0182.70e085a1.js new file mode 100644 index 00000000000..bd6361a6b42 --- /dev/null +++ b/assets/js/2a8f0182.70e085a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[57227],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),c=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(h,i(i({ref:t},u),{},{components:a})):n.createElement(h,i({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-03-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-03-22-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-node-cli-api.md",source:"@site/blog/2023-03-22-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-03-22T00:00:00.000Z",formattedDate:"March 22, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.645,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-03-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-22-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-22-performance-and-tracing"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],u={toc:c},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-03-22---2023-04-05"},"2023-03-22 - 2023-04-05"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Added new cardano-cli ping command which allows users to ping remote cardano-nodes."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"transaction build")," command now can automatically balance multiassets"),(0,r.kt)("li",{parentName:"ul"},"New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5041"},"Remove unused error constructors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4909"},"Fix qKesKesKeyExpiry to not always be null")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"New cardano-cli ping command.")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5040"},"Remove use of AcquireFailure type")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5038"},"Simplify implementation of executeQueryAnyMode")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5002"},"Script data serialisation")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4956"},"Guard against overflows in Shelley TxIns")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4941"},"Combinators for TxBodyContent and related types")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5011"},"Use Haskell variables for passing values.")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4879"},"Re-enable kes-period-info test."))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2b637fd9.56e9f371.js b/assets/js/2b637fd9.56e9f371.js new file mode 100644 index 00000000000..4bfa9f03bc7 --- /dev/null +++ b/assets/js/2b637fd9.56e9f371.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[69376],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=s(n),d=a,h=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(h,l(l({ref:t},c),{},{components:n})):r.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[u]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-09-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-14-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-14-db-sync.md",source:"@site/blog/2023-09-14-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-09-14T00:00:00.000Z",formattedDate:"September 14, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.47,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-09-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-15-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-12-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],c={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have created a DBSync tag ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-1-1-0")," which can follow sanchonet. Also\nthe team has ran a number of benchmarks and tests for the new options/flavours of DBSync\nand prepared a blogpost which summorises them, for downstream components."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Integration of node-8.3.x and support for Sanchonet on Conway\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1498"},"#1498")),(0,a.kt)("li",{parentName:"ul"},"Simplifications of new feautures\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1496"},"#1496")),(0,a.kt)("li",{parentName:"ul"},"Makes it impossible to restart DBSync with different schema options and adds\ntests for them\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1466"},"#1466")),(0,a.kt)("li",{parentName:"ul"},"CI fixes\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1494"},"#1494"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1491"},"#1491")),(0,a.kt)("li",{parentName:"ul"},"Prepared a blogpost about different DBSync options\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/blob/blog/blog/blog.pdf"},"blog"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2bc04bf6.977be0a1.js b/assets/js/2bc04bf6.977be0a1.js new file mode 100644 index 00000000000..f3fe559a781 --- /dev/null +++ b/assets/js/2bc04bf6.977be0a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56010],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),u=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(i),d=r,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return i?a.createElement(c,o(o({ref:t},s),{},{components:i})):a.createElement(c,o({ref:t},s))}));function c(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-06-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-01-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-01-mithril.md",source:"@site/blog/2023-06-01-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-06-01T00:00:00.000Z",formattedDate:"June 1, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.415,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-06-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-02-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-31-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team released a new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2321.1"},(0,r.kt)("inlineCode",{parentName:"a"},"2321.1"))," distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots."),(0,r.kt)("p",null,"Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2321.1"},(0,r.kt)("inlineCode",{parentName:"a"},"2321.1"))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implements generic signing/verification of entity services ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance MessageAdapter for Artifact in aggregator REST API")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/925"},"#925")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Create the sub-command for 'Cardano Immutable Files Full' in client")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/895"},"#895")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance state machines Aggregator/Signer")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/933"},"#933")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Adapt the aggregator REST API to list certificates")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/892"},"#892")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Adapt end to end tests to handle new types of data")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/899"},"#899")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Update client documentation")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/897"},"#897")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Update architecture documentations for new types of data")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/898"},"#898")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance terraform infrastructure")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/930"},"#930")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that implements the computation of the stake distribution for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/880"},"#880"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Upgrade Cardano node to '8.0.0'")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/920"},"#920")))),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add export path in Client CLI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/512"},"#512"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2c045882.801eedcd.js b/assets/js/2c045882.801eedcd.js new file mode 100644 index 00000000000..52f97b88e32 --- /dev/null +++ b/assets/js/2c045882.801eedcd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98777],{52488:a=>{a.exports=JSON.parse('{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing","allTagsPath":"/cardano-updates/tags","count":25}')}}]); \ No newline at end of file diff --git a/assets/js/2d0da244.cbe1ecb9.js b/assets/js/2d0da244.cbe1ecb9.js new file mode 100644 index 00000000000..86ad765a557 --- /dev/null +++ b/assets/js/2d0da244.cbe1ecb9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26299],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),c=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),s=c(r),m=n,h=s["".concat(u,".").concat(m)]||s[m]||d[m]||o;return r?a.createElement(h,i(i({ref:t},p),{},{components:r})):a.createElement(h,i({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2023-04-28-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-28-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-crypto.md",source:"@site/blog/2023-04-28-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-04-28T00:00:00.000Z",formattedDate:"April 28, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.26,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-04-28-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-05-01-db-sync"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-28-goedel"}},u={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3}],p={toc:c},s="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library."),(0,n.kt)("li",{parentName:"ul"},"KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction."),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Started implementing ECC chip of JubJub over BLS12-381.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"#255")," finally merged \ud83c\udf89"),(0,n.kt)("li",{parentName:"ul"},"Additional tests for BLS bindings ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/384"},"#384")),(0,n.kt)("li",{parentName:"ul"},"Open PR for including test vectors created with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/zkcrypto/bls12_381"},"zkscrypto"),"'s library, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/397"},"PR#397"))),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/389"},"PR#389"),"."),(0,n.kt)("li",{parentName:"ul"},"Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"#317"),"."),(0,n.kt)("li",{parentName:"ul"},"Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim"),(0,n.kt)("li",{parentName:"ul"},"Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes"),(0,n.kt)("li",{parentName:"ul"},"Refactor MonadSodium into MonadMLock ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/388"},"PR#388"),".")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)"),(0,n.kt)("li",{parentName:"ul"},"Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2d52a685.16ff720d.js b/assets/js/2d52a685.16ff720d.js new file mode 100644 index 00000000000..d1603131b63 --- /dev/null +++ b/assets/js/2d52a685.16ff720d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20553],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=s(n),p=a,h=u["".concat(c,".").concat(p)]||u[p]||m[p]||o;return n?r.createElement(h,i(i({ref:t},d),{},{components:n})):r.createElement(h,i({ref:t},d))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-05-31-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-05-31-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-31-performance-and-tracing.md",source:"@site/blog/2023-05-31-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-05-31T00:00:00.000Z",formattedDate:"May 31, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.055,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-05-31-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-31-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-26-goedel"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build\nconfiguration: As it stands, the ",(0,a.kt)("inlineCode",{parentName:"p"},"ghc-bignum")," package is using the Haskell ",(0,a.kt)("inlineCode",{parentName:"p"},"native-backend")," as a default. We strive\nto benchmark a build with the ",(0,a.kt)("inlineCode",{parentName:"p"},"gmp-backend")," next. "),(0,a.kt)("p",null,"A variant of our ",(0,a.kt)("inlineCode",{parentName:"p"},"forge-stress")," local benchmark has been set up to serve as an early indicator for the resource usage profile\nwe'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way\nshorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great\nsupport when evaluating different compiler versions or RTS flags incrementally."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The hub of the new tracing system ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," is designed with a fixed output behaviour, which is limited to various\nlogging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to\ndirectly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with\njob definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing\nbenchmarking run required us to fine-tune communications with the nomad server. "),(0,a.kt)("p",null,"Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible\nand offers more detailed insight than the previous iteration in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-ops"),". The backend will enable you to formulate\nvery specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2d72833d.b2ed8410.js b/assets/js/2d72833d.b2ed8410.js new file mode 100644 index 00000000000..202944bd560 --- /dev/null +++ b/assets/js/2d72833d.b2ed8410.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18303],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var c=r.createContext({}),u=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),s=u(a),h=n,m=s["".concat(c,".").concat(h)]||s[h]||d[h]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-02-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-17-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-hydra.md",source:"@site/blog/2023-02-17-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.75,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-17-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-17-ledger"}},c={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:u},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team completed work on dealing differently with contests\nduring the contestation period. These will now always push out the deadline and\nhence contestation periods are easier to pick (depending on the network a Head\nruns on). Furthermore, they added an important acceptance test and completed\ninternal refactoring of the protocol logic making future changes easier."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Push contestation deadline on each contest ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/716"},"#716")),(0,n.kt)("li",{parentName:"ul"},"Wrote an acceptance (property) test ","\u201c","can always close/fanout when collect is successful","\u201d"),(0,n.kt)("li",{parentName:"ul"},"Internal refactoring of our ",(0,n.kt)("inlineCode",{parentName:"li"},"HeadLogic")),(0,n.kt)("li",{parentName:"ul"},"Groomed remaining things from ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/452"},"#452")," into dedicated features")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete full minting policy ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/720"},"#720")),(0,n.kt)("li",{parentName:"ul"},"Release 0.9.0 with updated scripts"),(0,n.kt)("li",{parentName:"ul"},"Plan mainnet milestone and a 0.10.0 version"),(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs for specification (upon feedback)"),(0,n.kt)("li",{parentName:"ul"},"Have smoke tests fixed and running regularly")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2d91c21f.2b35d919.js b/assets/js/2d91c21f.2b35d919.js new file mode 100644 index 00000000000..caf50c49544 --- /dev/null +++ b/assets/js/2d91c21f.2b35d919.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30335],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},s="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=d(e,["components","mdxType","originalType","parentName"]),s=c(n),m=o,g=s["".concat(l,".").concat(m)]||s[m]||p[m]||a;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var d={};for(var l in t)hasOwnProperty.call(t,l)&&(d[l]=t[l]);d.originalType=e,d[s]="string"==typeof e?e:o,i[1]=d;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const a={title:"Incident Report",slug:"2023-04-17-ledger",authors:"kevinhammond",tags:["ledger"],hide_table_of_contents:!1},i=void 0,d={permalink:"/cardano-updates/2023-04-17-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-17-incident.md",source:"@site/blog/2023-04-17-incident.md",title:"Incident Report",description:"Incident reporting: Cardano block production temporary outage",date:"2023-04-17T00:00:00.000Z",formattedDate:"April 17, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.38,hasTruncateMarker:!1,authors:[{name:"Kevin Hammond",title:"Head of Software Engineering, Cardano Core",url:"https://github.com/kevinhammond",imageURL:"https://github.com/kevinhammond.png",key:"kevinhammond"}],frontMatter:{title:"Incident Report",slug:"2023-04-17-ledger",authors:"kevinhammond",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-19-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-14-goedel"}},l={authorsImageUrls:[void 0]},c=[{value:"Incident reporting: Cardano block production temporary outage",id:"incident-reporting-cardano-block-production-temporary-outage",level:2},{value:"Further Details",id:"further-details",level:3}],u={toc:c},s="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(s,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"incident-reporting-cardano-block-production-temporary-outage"},"Incident reporting: Cardano block production temporary outage"),(0,o.kt)("p",null,"On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a \u2018critical\u2019 incident, thus warranting immediate response and investigation by IOG engineers.\nThe investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue \u2013 a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite.\nFollowing successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version.\nWith the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue."),(0,o.kt)("h3",{id:"further-details"},"Further Details"),(0,o.kt)("p",null,"You can read more details on the incident and how it was managed from SundaeSwap\u2019s Pi Lanningham ",(0,o.kt)("a",{parentName:"p",href:"https://www.314pool.com/post/cardano-post-mortem-1"},"here"),". Thanks again to all the community for its support in identifying and fixing this bug."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2dd2949a.e4a51357.js b/assets/js/2dd2949a.e4a51357.js new file mode 100644 index 00000000000..d148b1e1a2f --- /dev/null +++ b/assets/js/2dd2949a.e4a51357.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6996],{64145:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/58","page":58,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/57","nextPage":"/cardano-updates/page/59","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/2e28eb6b.9479c2e3.js b/assets/js/2e28eb6b.9479c2e3.js new file mode 100644 index 00000000000..3ca1956ae38 --- /dev/null +++ b/assets/js/2e28eb6b.9479c2e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46576],{3905:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>d});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(i),c=a,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||n;return i?r.createElement(d,o(o({ref:t},u),{},{components:i})):r.createElement(d,o({ref:t},u))}));function d(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var s=2;s{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-08-10-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-08-10-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-10-mithril.md",source:"@site/blog/2023-08-10-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-08-10T00:00:00.000Z",formattedDate:"August 10, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-08-10-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-11-performance-and-tracing"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-09-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,r.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the ",(0,a.kt)("strong",{parentName:"p"},"Mithril protocol\u2019s mainnet beta")," launch: the ",(0,a.kt)("inlineCode",{parentName:"p"},"release-mainnet")," network is now consistently producing new certificates and snapshots! The team has released a new distribution ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2331.1"},(0,a.kt)("inlineCode",{parentName:"a"},"2331.1"))," which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the ",(0,a.kt)("inlineCode",{parentName:"p"},"mainnet")," infrastructure."),(0,a.kt)("p",null,"Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2331.1"},(0,a.kt)("inlineCode",{parentName:"a"},"2331.1"))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Release 'mainnet' Mithril network")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/918"},"#918")),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator - phase 1")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Post deployment 'mainnet' infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1091"},"#1091"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Create Production Infrastructure Runbook")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1085"},"#1085")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Ingest 'mainnet' metrics/logs in Grafana")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1122"},"#1122")))),(0,a.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add a 'clean' file to extracted database in client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1131"},"#1131")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Create explorer page with registered signers")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1097"},"#1097")))),(0,a.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor (de)serialization of crypto entities")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/668"},"#668")))),(0,a.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Client fails to unpack some snapshot archive")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1137"},"#1137")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"The 'release-preprod' network stopped producing certificates")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1114"},"#1114")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"The 'release-mainnet' network does not show up in the explorer")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1111"},"#1111")))),(0,a.kt)("li",{parentName:"ul"},"Worked on dependencies:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Upgrade Cardano node to '8.1.2'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1090"},"#1090")))),(0,a.kt)("li",{parentName:"ul"},"Worked on troubleshooting:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Signer can't sign with 'Invalid signature for party' error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1125"},"#1125"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2e2abe90.2e84cbdd.js b/assets/js/2e2abe90.2e84cbdd.js new file mode 100644 index 00000000000..5a2d3c0944c --- /dev/null +++ b/assets/js/2e2abe90.2e84cbdd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[69467],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),s=p(r),h=a,m=s["".concat(u,".").concat(h)]||s[h]||c[h]||l;return r?n.createElement(m,o(o({ref:t},d),{},{components:r})):n.createElement(m,o({ref:t},d))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=h;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-01-19-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-01-19-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-19-ledger.md",source:"@site/blog/2023-01-19-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-01-19T00:00:00.000Z",formattedDate:"January 19, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.665,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-01-19-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-01-20-sre"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-01-14-db-sync"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Restructuring the ledger state",id:"restructuring-the-ledger-state",level:3},{value:"PDF hosting",id:"pdf-hosting",level:3},{value:"Powering the new ledger API",id:"powering-the-new-ledger-api",level:3},{value:"Constraint-based generators",id:"constraint-based-generators",level:3},{value:"Technical debt",id:"technical-debt",level:3}],d={toc:p},s="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The ledger team completed some preliminary ground work in preparation for CIP-1694\n(restructuring the ledger state),\nfixed the PDF hosting problem (mostly the formal specs),\nbuilt out more of the new user-friendly ledger API,\nfinished a proof of concept for constraint-based generators for property tests\n(with the hopes of being able to replace our trace generators one day),\nand addressed technical debt."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("h3",{id:"restructuring-the-ledger-state"},"Restructuring the ledger state"),(0,a.kt)("p",null,"The existing governance structures will be replace in the conway ledger era,\nas described in CIP-1694.\nIn particular, the ledger rules will be restructured as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"}," BBODY\n |\n |-------------------------------|\n v v\n TICK LEDGERS\n | |\n |---------| |\n v v v\n RUPD ~NEWEPOCH~ ~LEDGER~\n | |\n |----------| |--------|-------------------|-----------|\n v v v v v\n ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+\n | | |\n |---------|------------| v |\n v v v DELPL v\n SNAP POOLREAP -UPEC- | UTXO\n |--------| |\n v v v\n POOL DELEG ~UTXOS~\n\n-..- Removed\n+..+ Added\n~..~ Modified\n")),(0,a.kt)("p",null,"Moreover, the ledger state will also be restructured in accordance with the new rules.\nIn the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT.\nWe have also adapted all the data structures in the ledger state."),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3216"},"pull-3216"))),(0,a.kt)("h3",{id:"pdf-hosting"},"PDF hosting"),(0,a.kt)("p",null,"We now build all of our PDFs using a GitHub action which is triggered by pushing a tag\nwith a specific form, ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-ledger-spec-YYYY-MM-DD"),".\nThe action creates a GitHub release containing the PDFs.\nThe links in the main ledger README now point to the PDFs in the latest release."),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3245"},"pull-3245")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3260"},"pull-3260"))),(0,a.kt)("h3",{id:"powering-the-new-ledger-api"},"Powering the new ledger API"),(0,a.kt)("p",null,"We have now removed all the ",(0,a.kt)("inlineCode",{parentName:"p"},"HasField")," instances from the protocol parameter data types,\nand replaced them with lenses.\nThis is probably the last major restructuring that the ledger team will do on the code base\nfor the API for a while\n(the Plutus tools team will be working on it next, see ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/5"},"here"),").\nWe also added a new helpful function ",(0,a.kt)("inlineCode",{parentName:"p"},"ensureMinCoinTxOut"),"."),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3242"},"pull-3242")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3248"},"pull-3248"))),(0,a.kt)("h3",{id:"constraint-based-generators"},"Constraint-based generators"),(0,a.kt)("p",null,"Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks\nwhich span several epochs, mimicking a real network.\nThese tests are, in theory, excellent for checking properties.\nThey are, however, very difficult to maintain and are not as random as we would like\n(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks)."),(0,a.kt)("p",null,"We would like to switch to tests which instead generate a random ledger state representative\nof not just an initial state, generate a single random valid block, and then test our properties.\nThe hope is that these will be much more random and easier to maintain."),(0,a.kt)("p",null,"We have finished a proof of concept are encouraged that this approach could work!"),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"))),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3244"},"pull-3244")," massive CI speedup"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3249"},"pull-3249")," better types for fees in the protocol parameters"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3264"},"pull-3264")," move our annotator code to the ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-ledger-binary")," package where it belongs"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3239"},"pull-3239")," move the ",(0,a.kt)("inlineCode",{parentName:"li"},"Wdrls")," type to the ",(0,a.kt)("inlineCode",{parentName:"li"},"Core")," module.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2e52ad4e.1909c27b.js b/assets/js/2e52ad4e.1909c27b.js new file mode 100644 index 00000000000..bff6fc20d6f --- /dev/null +++ b/assets/js/2e52ad4e.1909c27b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[66840],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),u=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=u(r),d=n,h=c["".concat(s,".").concat(d)]||c[d]||m[d]||i;return r?a.createElement(h,o(o({ref:t},p),{},{components:r})):a.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-03-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-17-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-crypto.md",source:"@site/blog/2023-03-17-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-03-17T00:00:00.000Z",formattedDate:"March 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.255,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-03-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-21-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-17-hydra"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3}],p={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: RFP finished. Code ready for audit."),(0,n.kt)("li",{parentName:"ul"},"cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams."),(0,n.kt)("li",{parentName:"ul"},"KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing."),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Preparing proving system to use the curves needed for main-net PoC. ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/783"},"PR#783")),(0,n.kt)("li",{parentName:"ul"},"RFP for crypto audit ready.")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"BLS12-381 branch approved ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"),". Blocker is Windown's CI. Working on it"),(0,n.kt)("li",{parentName:"ul"},"Testing strategy for BLS bindings:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Preparing test-vectors for Groth16, and simple BLS signatures"),(0,n.kt)("li",{parentName:"ul"},"Finding community projects to help write their use cases"),(0,n.kt)("li",{parentName:"ul"},"Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)"))),(0,n.kt)("li",{parentName:"ul"},"Wrote ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/blogpost_breaking_ed25519_vrf/blob/main/blog.md"},"blogpost")," on how using the same key for ed25519 and VRF completely breaks the security of both systems ")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started integration of sockets interface used in consensus"),(0,n.kt)("li",{parentName:"ul"},"Use that for de/ser"),(0,n.kt)("li",{parentName:"ul"},"Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim"),(0,n.kt)("li",{parentName:"ul"},"Results in having to parametrise for IOSim in KES and DSIGN for testing")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages."),(0,n.kt)("li",{parentName:"ul"},"Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS."),(0,n.kt)("li",{parentName:"ul"},"EdDSA over JubJub ready")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2e69cd33.7723f713.js b/assets/js/2e69cd33.7723f713.js new file mode 100644 index 00000000000..2f1bd899bae --- /dev/null +++ b/assets/js/2e69cd33.7723f713.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45662],{15238:a=>{a.exports=JSON.parse('{"label":"ledger","permalink":"/cardano-updates/tags/ledger","allTagsPath":"/cardano-updates/tags","count":30}')}}]); \ No newline at end of file diff --git a/assets/js/2eba0b82.d58fcc5f.js b/assets/js/2eba0b82.d58fcc5f.js new file mode 100644 index 00000000000..867e71358c8 --- /dev/null +++ b/assets/js/2eba0b82.d58fcc5f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43898],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),s=p(r),c=n,h=s["".concat(u,".").concat(c)]||s[c]||m[c]||l;return r?a.createElement(h,i(i({ref:t},d),{},{components:r})):a.createElement(h,i({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,i=new Array(l);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[s]="string"==typeof e?e:n,i[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"SRE Team Update",slug:"2023-01-20-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-01-20-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-sre.md",source:"@site/blog/2023-01-20-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.13,hasTruncateMarker:!1,authors:[{name:"Michael Fellinger",title:"SRE Team Lead",url:"https://github.com/manveru",imageURL:"https://github.com/manveru.png",key:"manveru"}],frontMatter:{title:"SRE Team Update",slug:"2023-01-20-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-01-20-network"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-19-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cicero",id:"cicero",level:3},{value:"Tullia",id:"tullia",level:3},{value:"Bitte",id:"bitte",level:3},{value:"cardano-world",id:"cardano-world",level:3},{value:"bitte-world",id:"bitte-world",level:3},{value:"ci-world",id:"ci-world",level:3}],d={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing\nsupport for cardano-world."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cicero"},"Cicero"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixed various race conditions around transformers."),(0,n.kt)("li",{parentName:"ul"},"Brought our CI up to date."),(0,n.kt)("li",{parentName:"ul"},"Migrated to the Nomad exec driver with Nix support for many actions."),(0,n.kt)("li",{parentName:"ul"},"Moved Nix builds to the Nomad clients for much better cache locality."),(0,n.kt)("li",{parentName:"ul"},"Ongoing work on vastly improving the action matching and evaluation speed."),(0,n.kt)("li",{parentName:"ul"})),(0,n.kt)("h3",{id:"tullia"},"Tullia"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Made it easier to support cloning from a PR's fork"),(0,n.kt)("li",{parentName:"ul"},"Update to latest std"),(0,n.kt)("li",{parentName:"ul"},"Add workaround for cgroup issue: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/hashicorp/nomad/issues/12877"},"nomad#12877")),(0,n.kt)("li",{parentName:"ul"},"github preset: add ",(0,n.kt)("inlineCode",{parentName:"li"},"github.ci.remote")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"(read|get)Repository")," functions"),(0,n.kt)("li",{parentName:"ul"},"Fix various issues around CUE handling")),(0,n.kt)("h3",{id:"bitte"},"Bitte"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Upgrade to NixOS 22.11"),(0,n.kt)("li",{parentName:"ul"},"Prototype usage of ",(0,n.kt)("a",{parentName:"li",href:"https://colmena.cli.rs"},"Colmena")," for deploys instead of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/serokell/deploy-rs"},"deploy-rs")),(0,n.kt)("li",{parentName:"ul"},"Finalized work on Equinix Metal support"),(0,n.kt)("li",{parentName:"ul"},"Prototype better secrets management with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/yaxitech/ragenix"},"ragenix")," instead of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/Mic92/sops-nix"},"sops-nix")),(0,n.kt)("li",{parentName:"ul"},"Improve CI and bring it up to date")),(0,n.kt)("h3",{id:"cardano-world"},"cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixd various OOM issues on preview and preprod"),(0,n.kt)("li",{parentName:"ul"},"Rotated KES keys on preview and preprod"),(0,n.kt)("li",{parentName:"ul"},"Optimize mainnet db-sync to cope with higher load"),(0,n.kt)("li",{parentName:"ul"},"Fix an issue where PostgreSQL would fail after a reboot")),(0,n.kt)("h3",{id:"bitte-world"},"bitte-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated to NixOS 22.11")),(0,n.kt)("h3",{id:"ci-world"},"ci-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated to NixOS 22.11"),(0,n.kt)("li",{parentName:"ul"},"Added Equnix cluster"),(0,n.kt)("li",{parentName:"ul"},"Improve caching of Nix builds")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2ebccc4d.b7a55404.js b/assets/js/2ebccc4d.b7a55404.js new file mode 100644 index 00000000000..99a842849f9 --- /dev/null +++ b/assets/js/2ebccc4d.b7a55404.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98370],{18194:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/47","page":47,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/46","nextPage":"/cardano-updates/page/48","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/2f97c20a.ce7c08f0.js b/assets/js/2f97c20a.ce7c08f0.js new file mode 100644 index 00000000000..77fcea5a952 --- /dev/null +++ b/assets/js/2f97c20a.ce7c08f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15677],{8806:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/32","page":32,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/31","nextPage":"/cardano-updates/page/33","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/2fa57f55.9c6c3715.js b/assets/js/2fa57f55.9c6c3715.js new file mode 100644 index 00000000000..1b73c1918fc --- /dev/null +++ b/assets/js/2fa57f55.9c6c3715.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47176],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var d=n.createContext({}),s=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(d.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,d=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(d,".").concat(m)]||c[m]||p[m]||o;return a?n.createElement(h,i(i({ref:t},u),{},{components:a})):n.createElement(h,i({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-09-01-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-09-01-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-01-ledger.md",source:"@site/blog/2022-09-01-ledger.md",title:"Ledger Team Update",description:"Ledger Update",date:"2022-09-01T00:00:00.000Z",formattedDate:"September 1, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.94,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-09-01-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-16-ledger"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-08-31-consensus"}},d={authorsImageUrls:[void 0]},s=[{value:"Ledger Update",id:"ledger-update",level:2},{value:"New minimal ledger era",id:"new-minimal-ledger-era",level:3},{value:"Addressing technical debt",id:"addressing-technical-debt",level:3}],u={toc:s},c="wrapper";function p(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"ledger-update"},"Ledger Update"),(0,r.kt)("p",null,"Since finishing up support for the Vasil Hardfork, the ledger team has been\nfocused on two main things: a new ledger era and technical debt."),(0,r.kt)("h3",{id:"new-minimal-ledger-era"},"New minimal ledger era"),(0,r.kt)("p",null,"We have implemented a new ledger era named ",(0,r.kt)("inlineCode",{parentName:"p"},"conway")," which is nearly identical\nto the ",(0,r.kt)("inlineCode",{parentName:"p"},"babbage")," era. This has been the first time that we have been able to see\nwhat a minimal ledger era looks like. We have finished this task, modulo any\nintegration issues that might come up. The only thing that the ",(0,r.kt)("inlineCode",{parentName:"p"},"conway")," era\ndoes differently from the ",(0,r.kt)("inlineCode",{parentName:"p"},"babbage")," era is provide support for rotating\nthe master keys using the hardfork combinator's state translation.\nWe may end up adding features to the ",(0,r.kt)("inlineCode",{parentName:"p"},"conway")," era, but it is a nice exercise\nseeing what it looks like to get a minimal ledger era supported in all the\ndownstream components."),(0,r.kt)("h3",{id:"addressing-technical-debt"},"Addressing technical debt"),(0,r.kt)("p",null,"We have been addressing technical debt, mostly in an effort to make the\nrepository a more friendly code base to work in."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We have begun work on a ledger API, called ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-ledger-api"),"."),(0,r.kt)("li",{parentName:"ul"},"We have done a big re-design of the major type classes used in the ledger.\nWith hindsight on our side, we now have something much more organized and\neasier to use."),(0,r.kt)("li",{parentName:"ul"},"We have done a lot of re-naming. The names across eras are now much more\nuniform, avoid certain confusions that plagued us, and are clearer in where\nthey are from."),(0,r.kt)("li",{parentName:"ul"},"We have reduced a lot of code duplication that could lead to bugs if you\ndo not have the whole code base in your head."),(0,r.kt)("li",{parentName:"ul"},"We have added a handful of performance improvements."),(0,r.kt)("li",{parentName:"ul"},"We added type safety in a number of locations. In particular, the type of\nvalues that can be minted in a transaction no longer allow for Lovelace\nin the type, and some functions which used to handle both timelock scripts\nand plutus script now correctly enoforce at the type level that only one of\nthem can be used."),(0,r.kt)("li",{parentName:"ul"},"We made our generators so that they now produce a much richer set of\nvalid serializations. There is room within CBOR to serialize the same\ndata structure in multiple ways, and it is helpful to have the generators\nuse a wide variety."),(0,r.kt)("li",{parentName:"ul"},"We have begun re-organizing our test suites.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2fd426fa.ac550511.js b/assets/js/2fd426fa.ac550511.js new file mode 100644 index 00000000000..a2cb5116792 --- /dev/null +++ b/assets/js/2fd426fa.ac550511.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36016],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(n),h=a,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||o;return n?r.createElement(m,i(i({ref:t},p),{},{components:n})):r.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-01-11-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-01-11-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-11-consensus.md",source:"@site/blog/2023-01-11-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-01-11T00:00:00.000Z",formattedDate:"January 11, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.35,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-01-11-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-12-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-01-11-performance-and-tracing"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"New Conway era",id:"new-conway-era",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],p={toc:u},c="wrapper";function d(e){let{components:t,...o}=e;return(0,a.kt)(c,(0,r.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The consensus team is resuming its activities after the Christmas break. During\nthese weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and\ndiscussing with the Ledger team the changes that might be required for the next\niterations. The pull request that adds the Conway era is waiting for a second\nreview round and we hope to merge it soon. On the technical debt side we are\nlooking into a property-test failure found in the iterators. We are\ninvestigating if this is an error in the model or in the implementation. We also\nimproved the documentation of our testing code."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,a.kt)("p",null,"We worked with the Ledger team to start preparing the next versions of UTxO-HD.\nThe Ledger team is concerned that for the remaining maps we might need the full\nledger state on epoch boundaries. Since the main consumer of the ledger rules is\nConsensus, the code that requires access to a full state could be moved from the\nledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take\nplace in such bridge, instead of querying the ledger for the values that are\nrequired in the epoch-transition computations."),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4234"},"relocated")," some UTxO-HD definitions, in preparation for merging\nthe prototype into ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."),(0,a.kt)("p",null,"We also completed updated local benchmarks comparing the replay time and memory\nconsumption of:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"the baseline node (",(0,a.kt)("inlineCode",{parentName:"li"},"f2fc76ef45647275c98634da1718290b976ff364"),") "),(0,a.kt)("li",{parentName:"ul"},"the UTxO-HD node with the in-memory backend "),(0,a.kt)("li",{parentName:"ul"},"the UTxO-HD node with the LMDB backend")),(0,a.kt)("p",null,"The following plot shows the results: we can see that the LMDB node barely\nreaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The\nin-memory backend is about 30 minutes faster, but still slower than the baseline\nversion. We are aware of this phenomenon and it is inherent to the problem of\nmaintaining sequences of differences of the last ",(0,a.kt)("inlineCode",{parentName:"p"},"k")," ledger states that allows\nus to perform rollback and roll-forward. We are in the process of measuring\nsyncing from scratch times."),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(15253).Z,width:"2500",height:"1700"})),(0,a.kt)("p",null,"We also ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4263"},"added ",(0,a.kt)("inlineCode",{parentName:"a"},"StaticEither")," accessors")," that helped us to simplify\nthe UTxO-HD prototype."),(0,a.kt)("h3",{id:"new-conway-era"},"New Conway era"),(0,a.kt)("p",null,"We incorporated the feedback of the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3971"},"pull request"),", and rebased this\nbranch on top of ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". The PR is pending a second review round and we hope\nto merge this soon."),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("p",null,"We are investigating a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4183"},"property-testing failure")," involving\niterators. Solving this requires understanding the expected behavior of\niterators in the counterexample found by ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," to determine if the error\nis in the model or in the implementation."),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4248"},"moved")," the contents of ",(0,a.kt)("inlineCode",{parentName:"p"},"docs/Testing.md")," closer to the code, so that the\nexplanations about the tests are easier to find in the relevant modules, and the\ndocumentation is easier to keep up to date."))}d.isMDXComponent=!0},15253:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/2023-01-11-utxo-hd-replay-benchmarks-dcf6daaf5460de7591a60db1457d2e58.png"}}]); \ No newline at end of file diff --git a/assets/js/301cd1f4.2e5b4d2a.js b/assets/js/301cd1f4.2e5b4d2a.js new file mode 100644 index 00000000000..e04492c1c31 --- /dev/null +++ b/assets/js/301cd1f4.2e5b4d2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[11952],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),d=a,m=c["".concat(u,".").concat(d)]||c[d]||h[d]||o;return n?r.createElement(m,s(s({ref:t},p),{},{components:n})):r.createElement(m,s({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-08-23-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-08-23-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-23-consensus.md",source:"@site/blog/2023-08-23-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-08-23T00:00:00.000Z",formattedDate:"August 23, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.42,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-08-23-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-24-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-18-goedel"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Tech debt",id:"tech-debt",level:2},{value:"Support",id:"support",level:2}],p={toc:l},c="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests.\nOn the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base."),(0,a.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We addressed the issues that came from the benchmarking and testing phase (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/314"},"#314"),").",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We fixed the operational-certificate update exception (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/305"},"#305"),").")))),(0,a.kt)("h2",{id:"tech-debt"},"Tech debt"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/tree/jasagredo/consensus-api"},"this branch"),")."),(0,a.kt)("li",{parentName:"ul"},"We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/tree/jasagredo/test-sop"},"this branch"),")."),(0,a.kt)("li",{parentName:"ul"},"We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/275"},"#275"),")."),(0,a.kt)("li",{parentName:"ul"},"We decreased the flakiness for our test suite (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/284"},"#284"),")."),(0,a.kt)("li",{parentName:"ul"},"We incorporated and merged the pull-request on query versioning (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/273"},"#273"),")."),(0,a.kt)("li",{parentName:"ul"},"We started working on new performance-based regression tests for mempool operations.")),(0,a.kt)("h2",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Nick Frisby")," continues with his engineer responsibilities. Notably getting the Consensus release out for node ",(0,a.kt)("inlineCode",{parentName:"li"},"pre-release 8.3"),". Nick also began integrating it into downstream branches (",(0,a.kt)("inlineCode",{parentName:"li"},"cardano{-api,-cli,-node}"),"). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/283"},"#283")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/301"},"#301")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/304"},"#304")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/308"},"#308"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/31025fde.797a7c77.js b/assets/js/31025fde.797a7c77.js new file mode 100644 index 00000000000..92b3b455640 --- /dev/null +++ b/assets/js/31025fde.797a7c77.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22519],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(r),d=n,m=c["".concat(u,".").concat(d)]||c[d]||h[d]||i;return r?a.createElement(m,o(o({ref:t},p),{},{components:r})):a.createElement(m,o({ref:t},p))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Hydra Team Update",slug:"2023-09-08-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-08-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-08-hydra.md",source:"@site/blog/2023-09-08-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-08T00:00:00.000Z",formattedDate:"September 8, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.06,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-08-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-12-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-07-mithril"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},c="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team improved the commit process with support for inline\ndatums. They simplified the chain layer by refactoring how the chain state is\npersisted. Updates to the Hydra tutorial were completed, including CI workflows\nto keep it up-to-date. The team engaged in discussions with researchers about\nincremental commits & decommits, and drafted an architectural decision record\nfor a resource-based API. They also explored simpler solutions for the upcoming\nnetwork resilience feature."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Support InlineScriptDatum in commit\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1043"},"#1043")),(0,n.kt)("li",{parentName:"ul"},"Refactored chain state persistency\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1049"},"#1049")),(0,n.kt)("li",{parentName:"ul"},"Completed tutorial updates (by adding CI and some cleanup)\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/997"},"#997")),(0,n.kt)("li",{parentName:"ul"},"Intersect Open Source committee meeting"),(0,n.kt)("li",{parentName:"ul"},'Experimented with various models to better express the \\"Network\nresilience problem\\" to find a KISS solution for\n',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"Drafted and discussed incremental de-/commit features within team\nand with researchers\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/199"},"#199")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1057"},"#1057")),(0,n.kt)("li",{parentName:"ul"},"Created ADR for a resource based overhaul of the API\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1028"},"#1028"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Meetup of Hydra & Mithril contributors in Nantes, France"),(0,n.kt)("li",{parentName:"ul"},"Integrated cardano-api 8.15 to have GHC 9.6 support"),(0,n.kt)("li",{parentName:"ul"},"A clear design for incremental commits (decommits are already\nunderstood)"),(0,n.kt)("li",{parentName:"ul"},"An ADR for improving tx construction & observation to not need chain\nstate")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3143eb67.b959afc8.js b/assets/js/3143eb67.b959afc8.js new file mode 100644 index 00000000000..8ace20c4778 --- /dev/null +++ b/assets/js/3143eb67.b959afc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7204],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=s(n),d=a,h=m["".concat(l,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(h,i(i({ref:t},p),{},{components:n})):r.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:a,i[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-01-11-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-01-11-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-11-performance-and-tracing.md",source:"@site/blog/2023-01-11-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-01-11T00:00:00.000Z",formattedDate:"January 11, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.865,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2023-01-11-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-11-consensus"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-06-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks."),(0,a.kt)("li",{parentName:"ol"},"New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs."),(0,a.kt)("li",{parentName:"ol"},"Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components."),(0,a.kt)("p",null,"On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters.\nWe now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes."),(0,a.kt)("p",null,"We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development.\nOnce this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/31889a8f.911b77aa.js b/assets/js/31889a8f.911b77aa.js new file mode 100644 index 00000000000..fb829553bcf --- /dev/null +++ b/assets/js/31889a8f.911b77aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96446],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),h=p(n),d=r,m=h["".concat(l,".").concat(d)]||h[d]||u[d]||o;return n?a.createElement(m,i(i({ref:t},c),{},{components:n})):a.createElement(m,i({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[h]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-10-02-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-10-02-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-consensus.md",source:"@site/blog/2022-11-02-consensus.md",title:"Consensus Team Update",description:"High-level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:3.53,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-10-02-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Embedding Quality Workstream",permalink:"/cardano-updates/2022-11-03-embedding-quality"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-02-ledger"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"High-level status report",id:"high-level-status-report",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Finish the UTxO HD prototype",id:"finish-the-utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:2},{value:"Benchmarking the CSJ prototype",id:"benchmarking-the-csj-prototype",level:3},{value:"Technical debt",id:"technical-debt",level:2}],c={toc:p},h="wrapper";function u(e){let{components:t,...o}=e;return(0,r.kt)(h,(0,a.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"During the past two weeks, the consensus team continued its work on testing the\nUTxO HD prototype. We completed the era-transition and backing store tests, and\nthe mempool tests are advancing at a steady pace. Regarding our work in the\nGenesis design, we continued our collaboration with the research and networking\nteams, and we continue investigating strategies for making the chain-sync\njumping prototype faster."),(0,r.kt)("h2",{id:"high-level-status-report"},"High-level status report"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish the UTxO HD prototype: on track.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We worked on state-machine tests for the mempool, and spotted potential bugs\nin the implementation. Investigation is ongoing."),(0,r.kt)("li",{parentName:"ul"},"We have a set of property tests for the backing store. We still need to\nincorporate the improvements to the LMDB cursor API that these tests\nmade possible."),(0,r.kt)("li",{parentName:"ul"},"We merged the era-transition tests PR."))),(0,r.kt)("li",{parentName:"ul"},"Genesis: on track.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Design work around Genesis continues in collaboration with researchers and\nthe networking team."),(0,r.kt)("li",{parentName:"ul"},"We continued trying to improve the performance of the chain-sync jumping\nprototype. We gained additional insight on which parameters to tweak next.\nIn spite of the baseline still being faster, the current prototype already\nachieves a significant speedup when compared to the naive approach of simply\nrunning full chain-sync with all peers."))),(0,r.kt)("li",{parentName:"ul"},"Tech debt: on track.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We clarified a common source of confusion around VRF tie-breaking and\ncross-era chain selection.")))),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"finish-the-utxo-hd-prototype"},"Finish the UTxO HD prototype"),(0,r.kt)("p",null,"We continued working on property-tests for the UTxO HD prototype. In particular\nwe merged the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4073"},"era-transition tests\nPR"),"."),(0,r.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4081"},"backing store property tests\nPR")," has been\nreviewed. The next steps are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improve error handling and command generation."),(0,r.kt)("li",{parentName:"ul"},"Add coverage testing to check that we are not failing to cover interesting\ntest cases.")),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"monadic cursor API"),"\nwent through its first review round. The API is in a relatively stable state.\nThis PR also unifies the ",(0,r.kt)("inlineCode",{parentName:"p"},"cborg")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"serialise"),"-based interfaces to LMDB\noperations. The next steps are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Write\n",(0,r.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/quickcheck-dynamic"},(0,r.kt)("inlineCode",{parentName:"a"},"quickcheck-dynamic")),"\nstate-machine tests for this API."),(0,r.kt)("li",{parentName:"ul"},"Adapt the changes in the serialisation interface in the backing store property\ntests. This will involve adding boilerplate code in consensus to make up for\nthe removal of the ",(0,r.kt)("inlineCode",{parentName:"li"},"cborg"),"-based interface.")),(0,r.kt)("h2",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,r.kt)("p",null,"We worked on the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4121"},"LSM tree\nprototype"),". In\nparticular, we focused on tuning the LSM tree design to the different workloads\nthat consensus has (eg syncing, normal node operation, etc)."),(0,r.kt)("h3",{id:"benchmarking-the-csj-prototype"},"Benchmarking the CSJ prototype"),(0,r.kt)("p",null,'Work on improving the chain-sync jumping performance is ongoing. In particular\nwe compared the performance of different jump intervals, which, somewhat\nsurprisingly, do not make a significant difference. In particular, we are seeing\nperiodic "plateaus" where the chain-sync tip does not progress, but they are\nmuch longer for the prototype. Our hypothesis is that this seem to be due to a\ncombination of the garbage collector (GC) pauses, and the actual time it takes\nthe non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo\nfragment.'),(0,r.kt)("p",null,"In the coming weeks we will try to shorten these plateaus via a combination of\ntweaking GC options and less synchronisation in the CSJ governor."),(0,r.kt)("p",null,"The following plot shows the performance of the chain-sync jumping prototype\nusing different jumping intervals. It compares the syncing progress by plotting\nthe slots of adopted blocks against time. The baseline is still faster, however\nit is worth noting that the current prototype already achieves a significant\nspeedup when compared to the naive approach of simply running full chain-sync\nwith all peers."),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(39294).Z,width:"998",height:"445"})),(0,r.kt)("p",null,'The second plot shows the syncing progress sliced to a chosen ~5min interval,\nand includes, in addition to the slots of adopted blocks, the slots of the tip\nof the ChainSync fragment. This allows us to see how far ahead of the selected\ntip the CS dynamo is, i.e. how much room we have for BlockFetch not to get\nstalled. It shows periodic behaviour (due to the forecasting limit), and shows\nthat the CS fragment tip is not progressing for significant periods\n("plateaus").'),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(96185).Z,width:"998",height:"445"})),(0,r.kt)("h2",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"We ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4098"},"clarified")," a\ncommon source of confusion around VRF tie-breaking and cross-era chain\nselection. This PR involved correcting potentially misleading names of\nVRF-related functions, and providing context for a particular VRF value is\nused for tie-breaking."))}u.isMDXComponent=!0},96185:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-02-csj-vs-baseline-sliced-77ff018af70191b4122b1e7cf56c79b8.svg"},39294:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-02-csj-vs-baseline-9fd0e0e080975cc6cfbe035731b4f38d.svg"}}]); \ No newline at end of file diff --git a/assets/js/324138c8.0ffe20ee.js b/assets/js/324138c8.0ffe20ee.js new file mode 100644 index 00000000000..a1e30d34295 --- /dev/null +++ b/assets/js/324138c8.0ffe20ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95613],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),h=r,m=d["".concat(l,".").concat(h)]||d[h]||c[h]||a;return n?o.createElement(m,s(s({ref:t},u),{},{components:n})):o.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:r,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-02-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-02-22-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-22-consensus.md",source:"@site/blog/2023-02-22-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-02-22T00:00:00.000Z",formattedDate:"February 22, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.45,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-02-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-23-performance-and-tracing"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-22-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Support",id:"support",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the past two weeks we got the results from the system level benchmarks\nfor UTxO HD. They showed a substantial performance regression, so we spent some\ntime analyzing the results. We found out the frequency at which ledger snapshots\nwere taken was too high, so we requested the benchmarking team a new run with a\nmore realistic snapshotting policy. We continued refactoring and improving the\nprototype, and we released UTxO-HD related packages to CHaP."),(0,r.kt)("p",null,"We met with IOG researchers and networking specialists to discuss the Genesis\ndesign, which was well received. We continued working on testing and\nbenchmarking different Genesis prototypes."),(0,r.kt)("p",null,"We are also working on solving a test failure related to iterators. This work\nderived in several improvements such as better documentation, a framework for\nwriting unit (and regression) tests, and the possibility of debugging\n",(0,r.kt)("inlineCode",{parentName:"p"},"QuickCheck")," counter examples in the REPL."),(0,r.kt)("p",null,"Finally, we released ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," 0.2.0.0 and\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-cardano")," 0.3.0.0 to CHaP"),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,r.kt)("p",null,"We got the results of the first system level benchmarks for UTxO HD. They seemed\nto indicate a significant regression in performance. After looking into the\nbenchmark logs we found that the benchmark runs took ledger state snapshots too\noften, due to the default snapshotting policy depending on ",(0,r.kt)("inlineCode",{parentName:"p"},"k"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"k")," being so\nsmall in the benchmark runs. Therefore, the next step is to re-run the\nbenchmarks with a snapshotting policy that more closely resembles the one from\nmainnet."),(0,r.kt)("p",null,"At the same time, we continued refactoring and cleaning up the prototype. "),(0,r.kt)("p",null,"Also, we prepared the ",(0,r.kt)("inlineCode",{parentName:"p"},"anti-diff")," packages (",(0,r.kt)("inlineCode",{parentName:"p"},"fingertree-rm"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"diff-containers"),",\n",(0,r.kt)("inlineCode",{parentName:"p"},"simple-semigroupoids"),") and the ",(0,r.kt)("inlineCode",{parentName:"p"},"lmdb")," related packages (",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-lmdb")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-lmdb-simple"),") to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP"),"."),(0,r.kt)("h3",{id:"genesis"},"Genesis"),(0,r.kt)("p",null,"The Genesis design was presented to the IOG researchers and Peter Thompson from\nNSol. It was well received. They pointed out one blindspot, but we think it'll\nbe relatively simple to mitigate."),(0,r.kt)("p",null,"In parallel, we continued developing test and benchmarks for the Genesis\nprototypes. I particular we tested and implemented a potential fix for\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4037#issuecomment-1439708022"},"increased ChainDB dequeue timings"),", which partly\nbehaved as we expected, but still needs further investigation. Also we obtained\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4037#issuecomment-1434745031"},"new benchmarking data")," for the prototype."),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"Related to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4183"},"#4183"),", we developed a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4379"},"DSL")," for specifying\n",(0,r.kt)("inlineCode",{parentName:"p"},"ChainDB")," unit tests. This will allow us to better understand the\ncounter-examples returned by QuickCheck tests, and to write ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4383"},"regression\ntests")," for them. Also, we ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4358"},"added a module")," to enable\nQuickCheck counter-examples to be run on the REPL, allowing for faster debugging\nfeedback. Also, we improved the documentation related to followers\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4372"},"#4372"),")."),(0,r.kt)("p",null,"We are also working on a design for optimizing the way we handle blocks from the\nfuture."),(0,r.kt)("h3",{id:"support"},"Support"),(0,r.kt)("p",null,"We released ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," 0.2.0.0 and ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-cardano"),"\n0.3.0.0 to CHaP. Remember that we decided to split the packages related to\nConsensus into two bundles, one with the core functionality, Cardano-agnostic\ncode, and another bundle with instantiations specific to Cardano."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/32d4ad41.059e2e13.js b/assets/js/32d4ad41.059e2e13.js new file mode 100644 index 00000000000..db0e417f561 --- /dev/null +++ b/assets/js/32d4ad41.059e2e13.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42575],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(a),c=n,m=u["".concat(p,".").concat(c)]||u[c]||d[c]||o;return a?r.createElement(m,i(i({ref:t},h),{},{components:a})):r.createElement(m,i({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-11-11-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-11-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-hydra.md",source:"@site/blog/2022-11-11-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.94,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-11-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-11-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-11-ledger"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:s},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team published together with Obsidian Systems a light paper\non our "Hydra for Payments" project (',(0,n.kt)("a",{parentName:"p",href:"https://iohk.io/en/blog/posts/2022/11/10/hydra-for-payments-introducing-developer-tooling-to-unlock-micropayments-on-cardano/"},"Link"),"). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," processes. "),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published Hydra for Payments light paper (",(0,n.kt)("a",{parentName:"li",href:"https://iohk.io/en/blog/posts/2022/11/10/hydra-for-payments-introducing-developer-tooling-to-unlock-micropayments-on-cardano/"},"Link"),")"),(0,n.kt)("li",{parentName:"ul"},"Have a draft RFP ready for a first review internally"),(0,n.kt)("li",{parentName:"ul"},"Answered the internal auditor","\u2019","s questions"),(0,n.kt)("li",{parentName:"ul"},"Fixed a bug with following the chain when starting with persistence (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/599"},"#599"),")"),(0,n.kt)("li",{parentName:"ul"},"Minor improvements to logging for better observability (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/598"},"#598"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/600"},"#600"),")"),(0,n.kt)("li",{parentName:"ul"},"Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/590"},"#590"),")")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement event-sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Close more gaps ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: ",(0,n.kt)("strong",{parentName:"li"},'"Developing Hydra" on Day 2, Nov 21st, 13:50 CET'))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3328a3bf.2a0ee70d.js b/assets/js/3328a3bf.2a0ee70d.js new file mode 100644 index 00000000000..bc269e2330a --- /dev/null +++ b/assets/js/3328a3bf.2a0ee70d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86393],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),l=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return r.createElement(i.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),p=l(n),h=a,m=p["".concat(i,".").concat(h)]||p[h]||u[h]||o;return n?r.createElement(m,s(s({ref:t},d),{},{components:n})):r.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=h;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:a,s[1]=c;for(var l=2;l{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB Sync Team Update",slug:"2022-10-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},s=void 0,c={permalink:"/cardano-updates/2022-10-04-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-04-db-sync.md",source:"@site/blog/2022-10-04-db-sync.md",title:"DB Sync Team Update",description:"DBSync Update",date:"2022-10-04T00:00:00.000Z",formattedDate:"October 4, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB Sync Team Update",slug:"2022-10-04-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-05-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-04-node-cli-api"}},i={authorsImageUrls:[void 0]},l=[{value:"DBSync Update",id:"dbsync-update",level:2},{value:"Fast restarts",id:"fast-restarts",level:3},{value:"Property based testing",id:"property-based-testing",level:3},{value:"Tech Debt",id:"tech-debt",level:3},{value:"Smash",id:"smash",level:3}],d={toc:l},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"dbsync-update"},"DBSync Update"),(0,a.kt)("h3",{id:"fast-restarts"},"Fast restarts"),(0,a.kt)("p",null," We fixed a long overdue issue in db-sync which caused long delays on restarts\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1266"},"1266"),". This has been\none of db-sync main objectives for this period. Restarts are now very fast,\nbecause db-sync deletes almost nothing from the db, it just replays the ledger rules until it\nreaches the tip of the db. The fix also improves reconnection speed, in cases where the node\nrestarts or the connection is temporarily lost. It also speeds up even more in cases where due to a\ndeployment mess up a very old snapshot or no snapshot at all is used."),(0,a.kt)("h3",{id:"property-based-testing"},"Property based testing"),(0,a.kt)("p",null,"We added stateful property based testing, using ",(0,a.kt)("inlineCode",{parentName:"p"},"quickcheck-state-machine"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1269"},"1269"),". These tests use empty or\nalmost empty blocks to test the new behaviour of restarts and rollbacks."),(0,a.kt)("p",null," These tests generate arbitrarily a list of symbolic commands from these:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"RollForward Int\nRollBack BlockNo\nStopDBSync\nStartDBSync\nRestartNode\nAssertBlockNo BlockNo\n")),(0,a.kt)("p",null,"The commands are translated into real commands. For example ",(0,a.kt)("inlineCode",{parentName:"p"},"RollForward Int")," will forge a new block\nthat fits on the current chain. These real commands are executed against db-sync using the mock\nchain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync\nwhich looks like this:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-haskell"}," Model\n { serverTip :: BlockNo\n , dbSyncTip :: BlockNo\n , dbSynsIsOn :: Bool\n , dbSynsHasSynced :: Bool\n }\n")),(0,a.kt)("p",null,"Finally a number of postconditions are checked, related to the eventual block number of db-sync."),(0,a.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,a.kt)("p",null,"We handled a number of tech debt in\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1275"},"1275"),"\nThis improves the code format of db-sync, deletes many queries that were never used and groups the\nothers. This tech debt resolution not only improves the experience of working in db-sync, but can\nfacilitate some of our other objectives, as it makes it very explicit which queries are used\nduring syncing and which indexes are necessary."),(0,a.kt)("h3",{id:"smash"},"Smash"),(0,a.kt)("p",null,"We worked on fixing an issue related to fetching pool metadata\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1276"},"1276"),".\nThe issue which is described in\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1270"},"1270")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/335868d9.3ea9cbb3.js b/assets/js/335868d9.3ea9cbb3.js new file mode 100644 index 00000000000..02b9e07226a --- /dev/null +++ b/assets/js/335868d9.3ea9cbb3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45480],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),l=p(n),m=a,h=l["".concat(u,".").concat(m)]||l[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},c),{},{components:n})):r.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[l]="string"==typeof e?e:a,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-11-29-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-11-29-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-29-consensus.md",source:"@site/blog/2023-11-29-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-11-29T00:00:00.000Z",formattedDate:"November 29, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.51,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-11-29-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-12-01-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-29-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:p},l="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(l,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The Consensus team implemented and tested a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/525"},"patch")," that does not propagate future headers.\nIt is under review, and we expect it can be released in the next Cardano node version.\nOn the UTxO-HD front, we ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/510"},"finished")," prototyping the ",(0,a.kt)("inlineCode",{parentName:"p"},"LedgerDB")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"BackingStore")," redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend.\nWith this prototype finished we can start integrating the rest of the code.\nWe ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/513"},"investigated")," the unexpected performance degradation observed when acquiring the block context.\nWe also ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.7.0-pre"},"released Cardano node 8.7.0")," and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3893"},"moved")," ",(0,a.kt)("inlineCode",{parentName:"p"},"tree-diff")," outside ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-ledger")," libraries."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3399a664.cb1ecec9.js b/assets/js/3399a664.cb1ecec9.js new file mode 100644 index 00000000000..f5c3a94107f --- /dev/null +++ b/assets/js/3399a664.cb1ecec9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70950],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(a),s=i,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||r;return a?n.createElement(h,o(o({ref:t},d),{},{components:a})):n.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,o=new Array(r);o[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var n=a(87462),i=(a(67294),a(3905));const r={title:"Node API & CLI Team Update",slug:"2023-09-12-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-09-12-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-12-node-cli-api.md",source:"@site/blog/2023-09-12-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-09-12T00:00:00.000Z",formattedDate:"September 12, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:2.605,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-09-12-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-09-14-db-sync"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-08-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,i.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"2023-08-30---2023-09-12"},"2023-08-30 - 2023-09-12"),(0,i.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,i.kt)("p",null,"Release of ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.3.0-pre"},"Cardano-node 8.3.0-pre")," for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs.\nThis release completes ",(0,i.kt)("a",{parentName:"p",href:"https://sancho.network/get-started#sanchonet-feature-rollout"},"phase 2 of SanchoNet feature roll out plan")),(0,i.kt)("p",null,"CLI continues on its migration to a era-based top-level commands. This sprint we moved ",(0,i.kt)("inlineCode",{parentName:"p"},"text-view"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"key"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"query"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"genesis"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"node"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"address")," into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints."),(0,i.kt)("p",null,"We are moving the ",(0,i.kt)("inlineCode",{parentName:"p"},"drep delegation-certificate")," to the stake-address command so delegating to a drep is done via ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-addres vote-delegation-certificate"),". Along the same lines, we are renaming\n",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address delegation-certificate")," (delagating to a stake pool) to ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address stake-delegation-certificate")," to distinguish between stake delegation to a pool and votes delegation to a drep. On top\nof that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address stake-and-vote-delegation-certificate"),". Note that change is not included on 8.3 but will come on 8.4.\nRemoving ",(0,i.kt)("inlineCode",{parentName:"p"},"--conway-era")," flag from all the ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction")," sub-commands."),(0,i.kt)("p",null,"Update description fields in delegation certificates from ",(0,i.kt)("inlineCode",{parentName:"p"},"Stake Address Delegation Certificate")," to respectively (Conway onwards):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stake Delegation Certificate")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Vote Delegation Certificate")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stake and Vote Delegation Certificate"))),(0,i.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/261"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address vote-delegation-certificate")," command")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/257"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address stake-and-vote-delegation-certificate")," command")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/260"},"Change ",(0,i.kt)("inlineCode",{parentName:"a"},"TreasuryWithdrawalCmd")," to a record")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/256"},"Simplify ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address stake-delegation-certificate")," command across eras")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/254"},"Remove ",(0,i.kt)("inlineCode",{parentName:"a"},"EraBased")," prefix and add ",(0,i.kt)("inlineCode",{parentName:"a"},"Cmd")," suffix")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/250"},"#221 Update description fields on delegation certificates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/249"},"Update error message for eras mismatch between node and cli")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/248"},"Era based ",(0,i.kt)("inlineCode",{parentName:"a"},"address")," commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/246"},"Consistent naming for ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-pool")," command related types, functions and modules")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/245"},"Disable ",(0,i.kt)("inlineCode",{parentName:"a"},"redundant-constraints")," warning only on ",(0,i.kt)("inlineCode",{parentName:"a"},"ghc-8.10.7"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/244"},"Remove ",(0,i.kt)("inlineCode",{parentName:"a"},"EraBased")," prefix from era-based commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/243"},"Rename ",(0,i.kt)("inlineCode",{parentName:"a"},"delegation-certificate")," to ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-delegation-certificate")," only in era-based command structure")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/242"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"node")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/241"},"Era-based ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address")," command group")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/240"},"Remove duplicate instances and add new ",(0,i.kt)("inlineCode",{parentName:"a"},"FeatureInEra ShelleyBasedEra")," instance")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/239"},"Remove ",(0,i.kt)("inlineCode",{parentName:"a"},"EraBased")," prefix from errors")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/238"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"text-view")," run commands implementation into era-based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/237"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"key")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/236"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"query")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/235"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"genesis")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/234"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"pool")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/233"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/232"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"address")," run command implementation into era-based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/231"},"Delete legacy ",(0,i.kt)("inlineCode",{parentName:"a"},"conway governance")," commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/230"},"Era sensitive transaction run commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/229"},"Move transaction command code into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/228"},"Fix query ",(0,i.kt)("inlineCode",{parentName:"a"},"key-period-info"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/227"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"hprop_golden_shelleyStakeAddressRegistrationCertificateWithBuildRaw")," test")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/225"},"Prefix complex delegation certificate option"))),(0,i.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/233"},"Fix test constraints functions")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/231"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"caseShelleyToBabbageAndConwayEraOnwards")," function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/230"},"Delete deprecated functions and types")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/228"},"Release 8.19.0.0")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/226"},(0,i.kt)("inlineCode",{parentName:"a"},"FeatureInEra")," instances for ",(0,i.kt)("inlineCode",{parentName:"a"},"CardanoEra")," and ",(0,i.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/225"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"mapSomeAddressVerification")," key function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/224"},"Fix type signature of ",(0,i.kt)("inlineCode",{parentName:"a"},"queryGenesisParameters")," so that it can be queried in any era")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/222"},"Release 8.18.0.0")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/221"},"Fix exception when executing drep queries"))),(0,i.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.3.0-pre"},"Cardano-node 8.3.0-pre")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5460"},"Fix deadlock issue with stdout tracer in tx-generator")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5453"},"nix: workbench tracing configuration"))),(0,i.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,i.kt)("h3",{id:"docs"},"docs"),(0,i.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/34012593.05c2493c.js b/assets/js/34012593.05c2493c.js new file mode 100644 index 00000000000..4d1b2fe230b --- /dev/null +++ b/assets/js/34012593.05c2493c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86809],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>g});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),c=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(a),u=r,g=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return a?n.createElement(g,l(l({ref:t},s),{},{components:a})):n.createElement(g,l({ref:t},s))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=a(87462),r=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-03-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-03-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-goedel.md",source:"@site/blog/2023-03-03-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.815,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-03-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-03-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-03-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint the team has been working on drafts of two papers and one\ntechnical report, improving the deltaQ tutorial, consulting on\nperformance design, and the Djed paper has been accepted for\npublication."),(0,r.kt)("h2",{id:"details"},"Details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing draft of DeltaQSD algebra paper for FORTE 2023")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Extending the technical report on which the above paper is based")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Consulting with an external company on performance engineering of Plutus contracts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Planning improvements and collecting material for the deltaQ\ntutorial based on experience with systems that manage risk at\nmultiple timescales")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing sections on the communication language and idempontency\nlaws for draft paper about verifying design refinements for\ndistributed system design")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Studying Cardano chain sync protocol")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'"Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin\nProtocol" has been accepted for publication at IEEE ICBC 2023'))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/347c3e4d.648bedec.js b/assets/js/347c3e4d.648bedec.js new file mode 100644 index 00000000000..f367afbe8b4 --- /dev/null +++ b/assets/js/347c3e4d.648bedec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23271],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(r),m=a,h=u["".concat(c,".").concat(m)]||u[m]||d[m]||s;return r?n.createElement(h,o(o({ref:t},p),{},{components:r})):n.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:a,o[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var n=r(87462),a=(r(67294),r(3905));const s={title:"DB sync Team Update",slug:"2022-12-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2022-12-01-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-db-sync.md",source:"@site/blog/2022-12-01-db-sync.md",title:"DB sync Team Update",description:"High level summary",date:"2022-12-01T00:00:00.000Z",formattedDate:"December 1, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.78,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB sync Team Update",slug:"2022-12-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-02-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-01-mithril"}},c={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DB Sync team prepared a release ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.0-rc2")," which includes many improvements for db-sync,\nit makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces\nmigrations. This release finalises the objectives that were set for db-sync for the previous\n3 months period and part of the syncing speed objective set for the next period\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/blob/3640e5aa00b8bada61e5d4b6eee063749866711b/cardano-db-sync/CHANGELOG.md#13100"},"Changelog")),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Branch ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/compare/release/13.0.x..3640e5aa00b8bada61e5d4b6eee063749866711b"},"release/13.1.0.x"),"\nincludes all the improvements related to the release. The release is passing through the testing\nphase and a number of bugs and issues have been fixed, like\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1312"},"#1312"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1311"},"#1311"),".\nAlso many new unit tests have been added.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Part of the release branch is cherry-picked back into master, in a way that it respects the new\nrelease and development process, so that it takes into account migrations\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1305"},"release process"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"The DB Sync team has also tagged release ",(0,a.kt)("inlineCode",{parentName:"p"},"13.0.6")," which better supports preview and preprod for\ndocker."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/34c17ec8.6d76c4fb.js b/assets/js/34c17ec8.6d76c4fb.js new file mode 100644 index 00000000000..b1a73ac0b83 --- /dev/null +++ b/assets/js/34c17ec8.6d76c4fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91902],{52219:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly","page":1,"postsPerPage":10,"totalPages":2,"totalCount":15,"nextPage":"/cardano-updates/quarterly/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/35369e36.c570c97c.js b/assets/js/35369e36.c570c97c.js new file mode 100644 index 00000000000..6a2ca3ea23b --- /dev/null +++ b/assets/js/35369e36.c570c97c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[74433],{54137:a=>{a.exports=JSON.parse('{"label":"goedel","permalink":"/cardano-updates/tags/goedel","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/354f96c6.f214d6fc.js b/assets/js/354f96c6.f214d6fc.js new file mode 100644 index 00000000000..79051ec3509 --- /dev/null +++ b/assets/js/354f96c6.f214d6fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78580],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),d=a,m=p["".concat(l,".").concat(d)]||p[d]||h[d]||o;return n?r.createElement(m,s(s({ref:t},c),{},{components:n})):r.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-10-04-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-10-04-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-04-consensus.md",source:"@site/blog/2023-10-04-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-10-04T00:00:00.000Z",formattedDate:"October 4, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.135,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-10-04-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-10-06-performance-and-tracing"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-04-mithril"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:3},{value:"Support",id:"support",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],c={toc:u},p="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the ",(0,a.kt)("em",{parentName:"p"},"in-memory")," backend."),(0,a.kt)("p",null,"On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain.\nWe also merged a fix for the Babbage to Conway transition, and released a new version of Consensus."),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/392"},"392"),").")),(0,a.kt)("h3",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/366"},"366"),")."),(0,a.kt)("li",{parentName:"ul"},"We enabled richer tracers in ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node")," that can be useful in future debugging (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/384"},"384"),")."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/amesgen"},"Esgen")," continues with his release engineer activities, and created a new Consensus release.")),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/369"},"369"),").")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35785fae.0a17f637.js b/assets/js/35785fae.0a17f637.js new file mode 100644 index 00000000000..ba4e937bc69 --- /dev/null +++ b/assets/js/35785fae.0a17f637.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7233],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),c=p(a),u=n,m=c["".concat(s,".").concat(u)]||c[u]||d[u]||o;return a?r.createElement(m,i(i({ref:t},h),{},{components:a})):r.createElement(m,i({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-01-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-01-27-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-27-hydra.md",source:"@site/blog/2023-01-27-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-01-27T00:00:00.000Z",formattedDate:"January 27, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.945,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-01-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-02-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-26-mithril"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},c="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team had a monthly review meeting with their stakeholders,\ncontributors and interested people from the community. The monthly repot for\n",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2023-01"},"January 2023")," is a digest\nof the things presented and also includes a summary of the meeting. The Hydra\nspecification was getting discussed and the team is incorporating suggested\nchanges of reviewers. Last but not least, they compute and publish script\ninformation on every PR and also on the\n",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/benchmarks/transaction-cost/#script-summary"},"website"),"\nnow."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Had the monthly review meeting with a broader audience"),(0,n.kt)("li",{parentName:"ul"},"Published the monthly report for ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-01"},"January 2023")),(0,n.kt)("li",{parentName:"ul"},"Reviewed the spec and discussed individual aborts with researchers"),(0,n.kt)("li",{parentName:"ul"},"Compute and publish script information along benchmarks on every PR and ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/benchmarks/transaction-cost/#script-summary"},"website"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add rollback section to Hydra spec, update pictures and publish it as part of repository"),(0,n.kt)("li",{parentName:"ul"},"Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository."),(0,n.kt)("li",{parentName:"ul"},"Groom & plan actions required for a maintainable Head explorer + break down ","\u201c","align gaps","\u201d"," feature.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35961293.d0fa4575.js b/assets/js/35961293.d0fa4575.js new file mode 100644 index 00000000000..ad7bc63aeda --- /dev/null +++ b/assets/js/35961293.d0fa4575.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6115],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=n,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-11-22-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-22-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-22-mithril.md",source:"@site/blog/2023-11-22-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-22T00:00:00.000Z",formattedDate:"November 22, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.895,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-22-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-22-ledger"},nextItem:{title:"Initial CIP 1694 Security Analysis and Responses",permalink:"/cardano-updates/2023-11-20-cip1694"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer."),(0,n.kt)("p",null,"Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Prototype a P2P relay with ",(0,n.kt)("inlineCode",{parentName:"strong"},"libp2p"))," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1326"},"#1326")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Manually deploy a test Mithril network")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1356"},"#1356")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Make Cardano node version custom in CI/CD")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1355"},"#1355")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Support P2P relay in infrastructure")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1361"},"#1361")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"mithril-client fails to extract archive")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1352"},"#1352"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/359aa856.a7e87b7a.js b/assets/js/359aa856.a7e87b7a.js new file mode 100644 index 00000000000..2d3a32526c0 --- /dev/null +++ b/assets/js/359aa856.a7e87b7a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97317],{2112:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/embedding-quality","page":1,"postsPerPage":5,"totalPages":1,"totalCount":1,"blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/35c3586e.55caad30.js b/assets/js/35c3586e.55caad30.js new file mode 100644 index 00000000000..477a1896ae0 --- /dev/null +++ b/assets/js/35c3586e.55caad30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2789],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(u,".").concat(c)]||d[c]||h[c]||i;return a?r.createElement(m,l(l({ref:t},s),{},{components:a})):r.createElement(m,l({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,l[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-10-06-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-10-06-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-06-hydra.md",source:"@site/blog/2023-10-06-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-06T00:00:00.000Z",formattedDate:"October 6, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.88,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-06-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-10-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-10-06-performance-and-tracing"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums."),(0,n.kt)("p",null,"The team also delivered the first version of the network resilience layer, significantly increasing head availability."),(0,n.kt)("p",null,"Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra."),(0,n.kt)("p",null,"Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Release ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.13.0"},"0.13.0")),(0,n.kt)("li",{parentName:"ul"},"Published vulnerability reports ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1088"},"#1088")),(0,n.kt)("li",{parentName:"ul"},"Merged network resilience work part I ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1074"},"#1074")),(0,n.kt)("li",{parentName:"ul"},"Planning for Cardano Summit participation "),(0,n.kt)("li",{parentName:"ul"},"Discussions with funded Catalyst projects wanting to build on Hydra for support"),(0,n.kt)("li",{parentName:"ul"},"Merged typos fix PR from @omahs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1095"},"#1095"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete Aiken commit validator script ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1072"},"#1072")),(0,n.kt)("li",{parentName:"ul"},"Complete Kupo integration ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1078"},"#1078")),(0,n.kt)("li",{parentName:"ul"},"Brick upgrade on TUI ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1103"},"#1103")),(0,n.kt)("li",{parentName:"ul"},"Clean backlog"),(0,n.kt)("li",{parentName:"ul"},"Prepare and rehearse demo and talk for Cardano Summit")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35e2a0c5.c76faf09.js b/assets/js/35e2a0c5.c76faf09.js new file mode 100644 index 00000000000..88a43340f3b --- /dev/null +++ b/assets/js/35e2a0c5.c76faf09.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90999],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var l=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,l)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var u=l.createContext({}),o=function(e){var t=l.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=o(e.components);return l.createElement(u.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},h=l.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,u=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),m=o(a),h=r,c=m["".concat(u,".").concat(h)]||m[h]||d[h]||n;return a?l.createElement(c,i(i({ref:t},s),{},{components:a})):l.createElement(c,i({ref:t},s))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,i=new Array(n);i[0]=h;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p[m]="string"==typeof e?e:r,i[1]=p;for(var o=2;o{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>n,metadata:()=>p,toc:()=>o});var l=a(87462),r=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-09-29-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-09-29-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-ledger.md",source:"@site/blog/2023-09-29-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.465,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-09-29-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-29-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-29-sre"}},u={authorsImageUrls:[void 0]},o=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Performance",id:"performance",level:3},{value:"Releasing",id:"releasing",level:3},{value:"Testing",id:"testing",level:3}],s={toc:o},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,l.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"Few important Conway related features were completed in this two week period:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Constitutional Committee was the last missing Conway related entity that has now been\nfully implemented."),(0,r.kt)("li",{parentName:"ul"},"Treasury withdrawals governance actions have been fixed and now behave as expected."),(0,r.kt)("li",{parentName:"ul"},"Current treasury amount supplied in the transaction is now enforced by the rules."),(0,r.kt)("li",{parentName:"ul"},"DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no\nproposals to vote on."),(0,r.kt)("li",{parentName:"ul"},"Semantics of how CostModels are updated with Protocol Parameters have been changed to\nallow for individual Plutus language version updates, rather than requiring a complete\nreplacement of all CostModels")),(0,r.kt)("p",null,"Besides the new features there were also important performance and testing improvements:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"In particular stake distribution computation and native script handling received some\noptimizations."),(0,r.kt)("li",{parentName:"ul"},"New testing DSL has been implemented that drastically simplifies writing unit tests for\nledger rules."),(0,r.kt)("li",{parentName:"ul"},"Integration tests and benchmarks are now possible for Conway era because of the overhaul\nof functionality for initial funds and staking injection whenever node starts up in\nConway, while bypassing all previous eras.")),(0,r.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,r.kt)("h3",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3729"},"pull-3729")," - DRep expiry update after a contiguous set of epochs with no proposals to vote on"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3739"},"pull-3739")," - Rename some PParams to be consistent with Agda specification"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3743"},"pull-3743")," - Move DRepDistr from VState to ConwayGovState"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3746"},"pull-3746")," - Implement ",(0,r.kt)("inlineCode",{parentName:"li"},"tcTranslationContextL")," for Shelley"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3737"},"pull-3737")," - Implement EraTransition"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3749"},"pull-3749")," - Add predicate failure: current treasury value mismatch in LEDGER"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3748"},"pull-3748")," - Apply enacted treasury withdrawals"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3745"},"pull-3745")," - Constitutional Committee Ratification"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3763"},"pull-3763")," - Plutus interface improvements"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3771"},"pull-3771")," - Changed how costmodel updates are applied"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3766"},"pull-3766")," - Prevent updating protocol version with ",(0,r.kt)("inlineCode",{parentName:"li"},"PParamUpdate"))),(0,r.kt)("h3",{id:"performance"},"Performance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3765"},"pull-3765")," - Improve native script handling"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3747"},"pull-3747")," - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3758"},"pull-3758")," - Cardano-Perf regression: UMap.size regression fix"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3754"},"pull-3754")," - Use Alonzo-style TxOut encoder when possible")),(0,r.kt)("h3",{id:"releasing"},"Releasing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3742"},"pull-3742")," - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3744"},"pull-3744")," - Changelog 8.4"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3752"},"pull-3752")," - Patch release of cardano ledger conway 1.8.1.0"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3753"},"pull-3753")," - Minor cleanup and changelog entries"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3760"},"pull-3760")," - Fixup issues for release"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3764"},"pull-3764")," - Bump plutus deps to 1.13")),(0,r.kt)("h3",{id:"testing"},"Testing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3734"},"pull-3734")," - Removed ",(0,r.kt)("inlineCode",{parentName:"li"},"Shaped")," instance for ",(0,r.kt)("inlineCode",{parentName:"li"},"Rep")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3735"},"pull-3735")," - Simplify the implementations of ",(0,r.kt)("inlineCode",{parentName:"li"},"hasOrd")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"hasEq")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3728"},"pull-3728")," - STS tests based on constraints"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3714"},"pull-3714")," - Implement the remaining upgradable families"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3733"},"pull-3733")," - Add some unit tests for Conway features"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3762"},"pull-3762")," - Update CDDL for praos headers.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35ef34ae.d5d7c472.js b/assets/js/35ef34ae.d5d7c472.js new file mode 100644 index 00000000000..9d11e6d1edd --- /dev/null +++ b/assets/js/35ef34ae.d5d7c472.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[44966],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(r),m=n,f=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return r?a.createElement(f,l(l({ref:t},c),{},{components:r})):a.createElement(f,l({ref:t},c))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"SRE Team Update",slug:"2023-08-04-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-04-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-sre.md",source:"@site/blog/2023-08-04-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.64,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-08-04-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-04-performance-and-tracing"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-01-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-world",id:"cardano-world",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Preprod and preview envionments were updated to 8.1.2."),(0,n.kt)("li",{parentName:"ul"},"Sanchonet and shelley-qa environments were updated to 8.2.0-pre."),(0,n.kt)("li",{parentName:"ul"},"Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Deploy cardano-node 8.1.2, merge p2p modifications, script fixes and cleanup: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/pull/416"},"cardano-ops-pull-416"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf"},"cardano-perf-repo"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Deploy cardano-node 8.1.2, emurgo p2p config, optimize faucet resources: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/104"},"cardano-world-pull-104")),(0,n.kt)("li",{parentName:"ul"},"Resolve nomad segfaults via nix versioning and fixup dbSync metal job for iohkNix env update: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/105"},"cardano-world-pull-105")),(0,n.kt)("li",{parentName:"ul"},"Add nomad dbSync fix for iohkNix env update: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/106"},"cardano-world-pull-106"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35f1ce0d.c093fa38.js b/assets/js/35f1ce0d.c093fa38.js new file mode 100644 index 00000000000..9a1436849cb --- /dev/null +++ b/assets/js/35f1ce0d.c093fa38.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35400],{80299:a=>{a.exports=JSON.parse('{"label":"crypto","permalink":"/cardano-updates/tags/crypto","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/36a96f5a.9a5af48d.js b/assets/js/36a96f5a.9a5af48d.js new file mode 100644 index 00000000000..5b129f3d6e6 --- /dev/null +++ b/assets/js/36a96f5a.9a5af48d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92160],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=p(n),d=a,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return n?r.createElement(h,l(l({ref:t},s),{},{components:n})):r.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,l[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-11-09-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-11-09-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-09-db-sync.md",source:"@site/blog/2023-11-09-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-11-09T00:00:00.000Z",formattedDate:"November 9, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.485,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-11-09-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-10-sre"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-08-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],s={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have created new tag ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-2-2-0"),", which integrates missing Conway feautures and some minor fix\ntags ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-2-1-0"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-2-0-1"),".\nWe have completed the initial implementation for the bootstrap instance objective."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Add a new ",(0,a.kt)("inlineCode",{parentName:"li"},"--disable-gov")," flag which disabled Conway ferautures\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1558"},"#1558")),(0,a.kt)("li",{parentName:"ul"},"Fix of the committee key size\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1544"},"#1544")),(0,a.kt)("li",{parentName:"ul"},"Workaround a ledger issue with unregistered pools\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1542"},"#1542")),(0,a.kt)("li",{parentName:"ul"},"Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1539"},"#1539")),(0,a.kt)("li",{parentName:"ul"},"Rename offline to offchain\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1533"},"#1533")),(0,a.kt)("li",{parentName:"ul"},"Transfer existing tests to Conway era\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1529"},"#1529"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1547"},"#1547"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/370c5287.99fe1c0a.js b/assets/js/370c5287.99fe1c0a.js new file mode 100644 index 00000000000..b9f1597700d --- /dev/null +++ b/assets/js/370c5287.99fe1c0a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32438],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),p=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(n),h=r,m=d["".concat(s,".").concat(h)]||d[h]||c[h]||a;return n?o.createElement(m,i(i({ref:t},u),{},{components:n})):o.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2022-10-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-28-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-network.md",source:"@site/blog/2022-10-28-network.md",title:"Network Team Update",description:"High-level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.665,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-10-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-28-hydra"},nextItem:{title:"Performance & Tracing Team Update",permalink:"/cardano-updates/2022-10-28-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"Detailed description",id:"detailed-description",level:2},{value:"P2P Network Stack",id:"p2p-network-stack",level:3},{value:"Consensus",id:"consensus",level:3},{value:"Cardano Node",id:"cardano-node",level:3},{value:"Peer Sharing",id:"peer-sharing",level:3},{value:"Eclipse Evasion",id:"eclipse-evasion",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"Open Source",id:"open-source",level:3},{value:"Mithril Cardano Integration",id:"mithril-cardano-integration",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"The team has focused on debuging & fixing bugs for the ",(0,r.kt)("strong",{parentName:"p"},"P2P single relay release"),", which included"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"diagnosing, fixing and writing tests for a bug in ",(0,r.kt)("inlineCode",{parentName:"li"},"peer-state-actions")," which\nfortunately hasn't been released;"),(0,r.kt)("li",{parentName:"ul"},"diagnosing & preventing misconfiguration of DNS")),(0,r.kt)("p",null,"We also focused on developing ",(0,r.kt)("strong",{parentName:"p"},"peer sharing"),". We also held a session with\nthe scientists on eclipse evasion."),(0,r.kt)("h2",{id:"detailed-description"},"Detailed description"),(0,r.kt)("h3",{id:"p2p-network-stack"},"P2P Network Stack"),(0,r.kt)("p",null,"During the past two weeks the team focused on p2p single relay release and peer\nsharing. We found and fixed an important bug recently introduced in one of the\ncomponents of p2p networking stack (fortunately never released). Together with\na fix, we designed a unit test diffusion simulation as well as quickcheck\nproperty test (both could reproduce it). We also changed the code in a way that\nif such a bug is reintroduced in the future, it will be obvious to diagnose.\nFor more see:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4067"},"ouroboros-network#4067")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4086"},"ouroboros-network#4086"))),(0,r.kt)("p",null,"Initial benchmarking run of the P2P code was executed. The results where\nunlike what we see on the mainnet. We found a possible misconfiguration of the\ncluster (caused by 0 TTL on domain names), which could be the direct cause of\nit. We wrote a PR which rules out such misconfiguration. We are awaiting on\nthe next benchmarking results. See more at:"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4106"},"ouroboros-network#4106")),(0,r.kt)("p",null,"We also started working on P2P single relay release. The PR\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4120"},"ouroboros-network#4120"),"\nincludes ",(0,r.kt)("em",{parentName:"p"},"108")," patches cherry-picked from the ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch. We started\nworking toward integration these changes against the release branch of\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". Early next week we ought to be able to have an early version\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," with ",(0,r.kt)("em",{parentName:"p"},"non experimental P2P support"),"!"),(0,r.kt)("p",null,"For more detailed release plan please see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3888"},"P2P - Single\nRelay"),"\nissue."),(0,r.kt)("h3",{id:"consensus"},"Consensus"),(0,r.kt)("p",null,"We identified and fixed missing error reporting in consensus\ninitialisation phase. See more at\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4015"},"ouroboros-network#4015")),(0,r.kt)("h3",{id:"cardano-node"},"Cardano Node"),(0,r.kt)("p",null,"We also made changes in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," in order to give better experience for\nnode operators. This includes updating severities of some of the traces as\nwell as implementing new format of the p2p topology file. For more see:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4563"},"cardano-node#4563"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4561"},"cardano-node#4561"))),(0,r.kt)("h3",{id:"peer-sharing"},"Peer Sharing"),(0,r.kt)("p",null,"We continued working on implementation of peer sharing. We have an early\nimplementation which will be reviewed and analysed in next weeks. We started\nworking on ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," integration. We need\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4392"},"PR #4392")," to be merged\nbefore such integration will be able to land in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),", although this\nis ",(0,r.kt)("em",{parentName:"p"},"not blocking")," us currently. See more at:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"ouroboros-network#4019"))),(0,r.kt)("h3",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,r.kt)("p",null,"We held a session which included Alexander Russel, Sandro Coretti-Drayton and\nNick Frisby from the consensus team. We discussed high lever design of the\neclipse evasion scheme, which is important for the design and implementation of\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-genesis"),". We got a positive feedback from the researchers."),(0,r.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,r.kt)("p",null,"In this period we made little progress towards releasing ",(0,r.kt)("inlineCode",{parentName:"p"},"IO-Sim")," on Hackage.\nA single ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/32"},"PR")," which added\na few missing instances of the ",(0,r.kt)("inlineCode",{parentName:"p"},"STM")," monad."),(0,r.kt)("h3",{id:"open-source"},"Open Source"),(0,r.kt)("p",null,"We made sure the CI runs for PRs which comes from forks (which is important to\naccept contributions from 3rd parties)."),(0,r.kt)("h3",{id:"mithril-cardano-integration"},"Mithril Cardano Integration"),(0,r.kt)("p",null,"We held initial discussions with Arnaud Bailly about possible path to integrate\nmithril to ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," and take advantage of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"\ndiffusion layer."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/372219b0.103948fa.js b/assets/js/372219b0.103948fa.js new file mode 100644 index 00000000000..1df2edfa4d8 --- /dev/null +++ b/assets/js/372219b0.103948fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24251],{13598:a=>{a.exports=JSON.parse('[{"label":"ledger","permalink":"/cardano-updates/tags/ledger","count":30},{"label":"mithril","permalink":"/cardano-updates/tags/mithril","count":34},{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing","count":25},{"label":"hydra","permalink":"/cardano-updates/tags/hydra","count":55},{"label":"consensus","permalink":"/cardano-updates/tags/consensus","count":32},{"label":"sre","permalink":"/cardano-updates/tags/sre","count":15},{"label":"cip1694","permalink":"/cardano-updates/tags/cip-1694","count":1},{"label":"security","permalink":"/cardano-updates/tags/security","count":1},{"label":"network","permalink":"/cardano-updates/tags/network","count":24},{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api","count":27},{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync","count":14},{"label":"goedel","permalink":"/cardano-updates/tags/goedel","count":18},{"label":"crypto","permalink":"/cardano-updates/tags/crypto","count":18},{"label":"devx","permalink":"/cardano-updates/tags/devx","count":2},{"label":"system-test","permalink":"/cardano-updates/tags/system-test","count":5},{"label":"release","permalink":"/cardano-updates/tags/release","count":5},{"label":"open-source","permalink":"/cardano-updates/tags/open-source","count":1},{"label":"embedding-quality","permalink":"/cardano-updates/tags/embedding-quality","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/376dd8e8.2261b7dd.js b/assets/js/376dd8e8.2261b7dd.js new file mode 100644 index 00000000000..c86f69ea948 --- /dev/null +++ b/assets/js/376dd8e8.2261b7dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55413],{36140:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/tags/consensus","allTagsPath":"/cardano-updates/tags","count":32}')}}]); \ No newline at end of file diff --git a/assets/js/37b247a8.bcaeb502.js b/assets/js/37b247a8.bcaeb502.js new file mode 100644 index 00000000000..76972730e7b --- /dev/null +++ b/assets/js/37b247a8.bcaeb502.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21080],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),c=n,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-12-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-12-06-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-06-mithril.md",source:"@site/blog/2023-12-06-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-12-06T00:00:00.000Z",formattedDate:"December 6, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.01,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-12-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-12-06-ledger"},nextItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-12-04-performance-and-tracing"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking."),(0,n.kt)("p",null,"Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," WASM library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1336"},"#1336")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P threat modeling and risk analysis")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1350"},"#1350")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Create a test network on ",(0,n.kt)("inlineCode",{parentName:"strong"},"Sanchonet"))," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1173"},"#1173")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Upgrade breaking changes crates")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1357"},"#1357")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Enhance Mithril/Cardano node communication")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1315"},"#1315")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," examples full crates")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1385"},"#1385")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Manual publication to crates.io with GitHub action")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1380"},"#1380")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Remove ",(0,n.kt)("inlineCode",{parentName:"strong"},"sqlite")," dependency from ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1390"},"#1390"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/37b2e4a4.2c8ca832.js b/assets/js/37b2e4a4.2c8ca832.js new file mode 100644 index 00000000000..f14c0b1356a --- /dev/null +++ b/assets/js/37b2e4a4.2c8ca832.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83051],{94819:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/consensus/page/7","page":7,"postsPerPage":5,"totalPages":7,"totalCount":32,"previousPage":"/cardano-updates/tags/consensus/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/38284ae5.6211d81b.js b/assets/js/38284ae5.6211d81b.js new file mode 100644 index 00000000000..3452655da99 --- /dev/null +++ b/assets/js/38284ae5.6211d81b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49105],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>h});var a=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},m=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=s(t),u=r,h=d["".concat(c,".").concat(u)]||d[u]||p[u]||i;return t?a.createElement(h,o(o({ref:n},m),{},{components:t})):a.createElement(h,o({ref:n},m))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=u;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=t(87462),r=(t(67294),t(3905));const i={title:"Performance & Tracing Update",slug:"2023-11-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-17-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-17-performance-and-tracing.md",source:"@site/blog/2023-11-17-performance-and-tracing.md",title:"Performance & Tracing Update",description:"High level summary",date:"2023-11-17T00:00:00.000Z",formattedDate:"November 17, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.585,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & Tracing Update",slug:"2023-11-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-17-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-11-16-network"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Development",id:"development",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"Workbench",id:"workbench",level:3}],m={toc:s},d="wrapper";function p(e){let{components:n,...t}=e;return(0,r.kt)(d,(0,a.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: Release benchmarking for node ",(0,r.kt)("inlineCode",{parentName:"li"},"8.6.0")," as well as benchmarks scrutinizing GHC versions and the new tracing system."),(0,r.kt)("li",{parentName:"ul"},"Development: PlutusV3 capability of our workload generator has been implemented."),(0,r.kt)("li",{parentName:"ul"},"Tracing: First round of optimization of the ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-tracer")," service has completed, awaiting validation."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: A significant PR has landed addressing automation features and debugging capabilites."),(0,r.kt)("li",{parentName:"ul"},"Workbench: Configurable remote environments and improvements to run documentation have been merged to ",(0,r.kt)("inlineCode",{parentName:"li"},"master"),".")),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"We've performed and analyzed a full set of benchmarks for node ",(0,r.kt)("inlineCode",{parentName:"p"},"8.6.0"),", both in comparison to recent release tags\nand mainnet version ",(0,r.kt)("inlineCode",{parentName:"p"},"8.1.2"),". A lot of development work has entered the system since then, so it is crucial\nwe can rule out any potential performance risks for the next mainnet release. "),(0,r.kt)("p",null,"Additionally, we've been benchmarking GHC9.6.3 builds of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform. "),(0,r.kt)("p",null,"A last set of benchmarks was dedicated to the new tracing system with node ",(0,r.kt)("inlineCode",{parentName:"p"},"8.6.0"),". We were able to show that\nthere is no performance risk to enabling the new system, even when forwarding all trace messages to a ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-tracer"),"\nservice on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression."),(0,r.kt)("h3",{id:"development"},"Development"),(0,r.kt)("p",null,"For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes\nto the execution budgets by developing specialized workloads."),(0,r.kt)("h3",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," service has received its first batch of optimizations. Profiling output is promising; to measure\nperformance for a long service run time, we're currently equipping the service binary with the same capability to\nemit regular resource traces as ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". Analysis of those will be the basis for validating this and possible future optimization efforts."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"Many improvements for the nomad backend have been implemented and merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),". This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service,\nmore detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables\nour team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred."),(0,r.kt)("h3",{id:"workbench"},"Workbench"),(0,r.kt)("p",null,"Our performance workbench has seen upgrades in documenting and reporting ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler.\nWhen alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential. "),(0,r.kt)("p",null,"Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/387f3426.93ddf683.js b/assets/js/387f3426.93ddf683.js new file mode 100644 index 00000000000..56a682716a8 --- /dev/null +++ b/assets/js/387f3426.93ddf683.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[34719],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>c});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),h=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=h(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=h(a),m=r,c=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(c,i(i({ref:t},u),{},{components:a})):n.createElement(c,i({ref:t},u))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var h=2;h{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>h});var n=a(87462),r=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-11-10-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-11-10-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-10-hydra.md",source:"@site/blog/2023-11-10-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-11-10T00:00:00.000Z",formattedDate:"November 10, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-11-10-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-11-14-node-cli-api"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-10-sre"}},p={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],u={toc:h},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,'The last two weeks, the Hydra team achieved several milestones. They published\nthe monthly report for October, providing updates on project developments. The\nteam delivered a presentation and workshop at the Cardano Summit, contributing\nto community engagement. They implemented a \\"dirt road\\" solution for the\n\\"Ignored init tx\\" notification and moved the ',(0,r.kt)("inlineCode",{parentName:"p"},"hydra-poll")," example project to a\ndedicated repository. Additionally, the team built a ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-chain-observer")," tool\nfor Hydra Heads, updated the toolchain to GHC 9.6.3, and made various\nimprovements to tooling and code formatting. They addressed specific issues,\nsuch as fixing the ",(0,r.kt)("inlineCode",{parentName:"p"},"gen-hydra-keys")," command and resolving concerns with the\nrewritten ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-tui"),". The team also enhanced the ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-cluster")," smoke test\nsuite by fetching network configurations dynamically. Lastly, they actively\nreviewed pull requests and architectural decision records from the community,\nincluding contributions from SundaeSwap. An experiment, the Hydra tally, was\ncompleted and successfully deployed to the mainnet by the Cardano Foundation."),(0,r.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Published the monthly ",(0,r.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-10"},"report for\noctober")),(0,r.kt)("li",{parentName:"ul"},"Given a presentation / workshop at the Cardano summit\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1109"},"#1109")),(0,r.kt)("li",{parentName:"ul"},'Dirt road implementation for \\"Ignored init tx\\" notification\n',(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/529"},"#529")," (without\nstateless observation)"),(0,r.kt)("li",{parentName:"ul"},"Completed and moved ",(0,r.kt)("inlineCode",{parentName:"li"},"hydra-poll")," example project into a\ndedicated\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-scaling/hydra-poll"},"repository")),(0,r.kt)("li",{parentName:"ul"},"Built a first version of a chain observation tool for Hydra Heads\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1096"},"#1096")),(0,r.kt)("li",{parentName:"ul"},"Switched toolchain to GHC 9.6.3 and various improvements on tooling\nand code formatting\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1135"},"#1135"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1152"},"#1152"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1151"},"#1151"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1154"},"#1154")),(0,r.kt)("li",{parentName:"ul"},"Fix ",(0,r.kt)("inlineCode",{parentName:"li"},"gen-hydra-keys")," command to not overwrite existing\nkeys ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1136"},"#1136")),(0,r.kt)("li",{parentName:"ul"},"Fixed the rewritten ",(0,r.kt)("inlineCode",{parentName:"li"},"hydra-tui"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1113"},"#1113"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1137"},"#1137")),(0,r.kt)("li",{parentName:"ul"},"Fetch network configurations instead of packaging them into\nhydra-cluster (smoke) test suite\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1156"},"#1156")),(0,r.kt)("li",{parentName:"ul"},"Reviewing PRs and ADRs from the community (SundaeSwap)\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1118"},"#1118"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1157"},"#1157")),(0,r.kt)("li",{parentName:"ul"},"Hydra tally experiment (Cardano Foundation) deployed to mainnet")),(0,r.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Tackle reported bugs"),(0,r.kt)("li",{parentName:"ul"},"Shepherd contributed off-line mode PR to the main codeline"),(0,r.kt)("li",{parentName:"ul"},"Improve chain observation tool to include more data and refactor\nexisting code towards more stateless observation"),(0,r.kt)("li",{parentName:"ul"},"Start work on incremental decommits")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/388f6888.258f2772.js b/assets/js/388f6888.258f2772.js new file mode 100644 index 00000000000..9c29bc20cf3 --- /dev/null +++ b/assets/js/388f6888.258f2772.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96394],{24279:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/54","page":54,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/53","nextPage":"/cardano-updates/page/55","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/391126a1.ec0b455d.js b/assets/js/391126a1.ec0b455d.js new file mode 100644 index 00000000000..298f6f3a40f --- /dev/null +++ b/assets/js/391126a1.ec0b455d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80542],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(r),m=n,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||l;return r?a.createElement(h,o(o({ref:t},d),{},{components:r})):a.createElement(h,o({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,o[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-03-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-03-17-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-ledger.md",source:"@site/blog/2023-03-17-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-03-17T00:00:00.000Z",formattedDate:"March 17, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.415,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-03-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-17-hydra"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-16-goedel"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Expanded ledger API",id:"expanded-ledger-api",level:3},{value:"Conway ledger rules",id:"conway-ledger-rules",level:3},{value:"Incremental SPO/DRep stake distribution computation",id:"incremental-spodrep-stake-distribution-computation",level:3},{value:"Technical debt",id:"technical-debt",level:3}],d={toc:u},c="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We made further progress on the conway ledger era.\nIn particular, we expanded the ledger API significantly, including lots of governance features.\nWe also made progress on the specification and corresponding work in the Haskell implementation."),(0,n.kt)("p",null,"We also continued to integrate the latest ledger packages into cardano node and addressed\ntechnical debt."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"expanded-ledger-api"},"Expanded ledger API"),(0,n.kt)("p",null,"The ledger API was significantly expanded to include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a lot of protocol parameter support"),(0,n.kt)("li",{parentName:"ul"},"versioning support (type level ledger eras and protocol versions)"),(0,n.kt)("li",{parentName:"ul"},"auxiliary data support"),(0,n.kt)("li",{parentName:"ul"},"many new lenses"),(0,n.kt)("li",{parentName:"ul"},"support for witnesses"),(0,n.kt)("li",{parentName:"ul"},"support for conway governance")),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3328"},"pull-3328"),"."),(0,n.kt)("h3",{id:"conway-ledger-rules"},"Conway ledger rules"),(0,n.kt)("p",null,"We have made progress on the formal ledger specification for the Conway era.\nMoreover, the corresponding Haskell updates were also completed:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3339"},"pull-3339")),(0,n.kt)("li",{parentName:"ul"},"See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3326"},"pull-3326")),(0,n.kt)("li",{parentName:"ul"},"See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3330"},"pull-3330"))),(0,n.kt)("h3",{id:"incremental-spodrep-stake-distribution-computation"},"Incremental SPO/DRep stake distribution computation"),(0,n.kt)("p",null,"We have a working (and correct) proof of concept for how to use the incremental lambda calculus\nto maintain several of the stake distributions incrementally.\nFor the per-SPO distribution, this is a performance improvement.\nFor the (conway) per-DRep distribution, this is will allow those who have delegated their votes\nto a DRep to have time to react to any votes that they disapprove of.\n(Sorry, no code to share just yet, more to come.)"),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improved CBOR testing facilities ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3332"},"pull-3332")),(0,n.kt)("li",{parentName:"ul"},"GitHub actions improvement ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3320"},"pull-3320")),(0,n.kt)("li",{parentName:"ul"},"Move ToJSON orphans from cardano-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3338"},"pull-3323")),(0,n.kt)("li",{parentName:"ul"},"Minor OCert improvements ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3327"},"pull-3327")),(0,n.kt)("li",{parentName:"ul"},"Remove duplication ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3341"},"pull-3341")),(0,n.kt)("li",{parentName:"ul"},"Enforce unique elements in CBOR sets ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3331"},"pull-3331")," ")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/393be207.17ef41bf.js b/assets/js/393be207.17ef41bf.js new file mode 100644 index 00000000000..5d1a82357ac --- /dev/null +++ b/assets/js/393be207.17ef41bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87414],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),i=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(l.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=i(r),d=a,m=s["".concat(l,".").concat(d)]||s[d]||f[d]||o;return r?n.createElement(m,p(p({ref:t},u),{},{components:r})):n.createElement(m,p({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[s]="string"==typeof e?e:a,p[1]=c;for(var i=2;i{r.r(t),r.d(t,{contentTitle:()=>p,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var n=r(87462),a=(r(67294),r(3905));const o={title:"Markdown page example"},p="Markdown page example",c={type:"mdx",permalink:"/cardano-updates/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"}},l=[],i={toc:l},u="wrapper";function s(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"markdown-page-example"},"Markdown page example"),(0,a.kt)("p",null,"You don't need React to write simple standalone pages."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/393cd824.593da712.js b/assets/js/393cd824.593da712.js new file mode 100644 index 00000000000..b6620d66d77 --- /dev/null +++ b/assets/js/393cd824.593da712.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65773],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-04-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-04-05-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-node-cli-api.md",source:"@site/blog/2023-04-05-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-04-05T00:00:00.000Z",formattedDate:"April 5, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.315,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-04-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-05-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-05-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-04-05---2023-04-19"},"2023-04-05 - 2023-04-19"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Introduce new governance commands create, answer and verify. This allows us to have onchain polls."),(0,r.kt)("li",{parentName:"ul"},"Begin making changes in cardano-api to accomodate for CIP-1694"),(0,r.kt)("li",{parentName:"ul"},"Rename ",(0,r.kt)("inlineCode",{parentName:"li"},"TestEnableDevelopmentHardForkEras")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"ExperimentalHardForksEnabled")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"TestEnableDevelopmentNetworkProtocols")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"ExperimentalProtocolsEnabled")),(0,r.kt)("li",{parentName:"ul"},"Various bug fixes and improvements ")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5112"},"Add new interim governance commands: {create, answer, verify}-poll")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5061"},"Remove --stake-address option from stake-address build")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5059"},"Frozen callstack for checkTextEnvelopeFormat function")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5053"},"#5052 Remove reading protocol parameters from Shelley genesis file")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5046"},"Move parsers to reusable location")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4910"},"New --socket-path cli option")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5108"},"CIP-1694 make space for DRep certificates")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5105"},"File type to track the content and direction of files")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5087"},"Fix import warning")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5086"},"Expose UsingRawBytes et al types")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5085"},"Expose SerialiseAsRawBytesError in Cardano.Api")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5072"},"Introduce new AnyShelleyBasedEra type and simplify CDDL tests.")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5071"},"New genCardanoKeyWitness function")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5069"},"Replace roundtripCBOR with trippingCbor")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5064"},"Remove non-round-trippable value TxInsReferenceNone for babbage onwards in generator")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5063"},"Improve roundtrip functions to report annotations on callsite")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5057"},"Define Functor instance for FileError")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5049"},"Split serialisation from IO")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5115"},"Master build failure fixes")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5106"},"Allow renamed fields to exist if values the same")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5091"},"workbench: updates")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5084"},"Delete duplicate packages sort packages and imports")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras and TestEnableDevelopmentNetworkProtocols")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5110"},"Additional check for not-leader slots in LeadershipSchedule tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5099"},"Fix epochLength and securityParam to conform to the formula 10 * k / f")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5083"},"Ergonomic directory creation code in tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5036"},"Default Cardano.Testnet to NodeLoggingFormatAsJson")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5013"},"Integrate latest ledger dependencies"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/397686d4.61d37a76.js b/assets/js/397686d4.61d37a76.js new file mode 100644 index 00000000000..c0a85b4c465 --- /dev/null +++ b/assets/js/397686d4.61d37a76.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89756],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>g});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),m=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=m(e.components);return a.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=m(n),p=r,g=d["".concat(c,".").concat(p)]||d[p]||u[p]||i;return n?a.createElement(g,o(o({ref:t},s),{},{components:n})):a.createElement(g,o({ref:t},s))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var m=2;m{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>m});var a=n(87462),r=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-08-11-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-08-11-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-11-performance-and-tracing.md",source:"@site/blog/2023-08-11-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-08-11T00:00:00.000Z",formattedDate:"August 11, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.335,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-08-11-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-11-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-10-mithril"}},c={authorsImageUrls:[void 0]},m=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],s={toc:m},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: We've concluded benchmarking node version ",(0,r.kt)("inlineCode",{parentName:"li"},"8.2.0"),"."),(0,r.kt)("li",{parentName:"ul"},"Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.")),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"As part of our release benchmarking cycle, we've completed and analysed the runs for the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.0")," version of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version."),(0,r.kt)("h3",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"A significant amount of optimizations for the new tracing system has finally been merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),". At the moment,\nwe're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding\ninsight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward. "),(0,r.kt)("p",null,"Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent\nand reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were\nable to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks. "),(0,r.kt)("p",null,"A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a3a2602.b09aebb4.js b/assets/js/3a3a2602.b09aebb4.js new file mode 100644 index 00000000000..26717723bc7 --- /dev/null +++ b/assets/js/3a3a2602.b09aebb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20974],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(a),d=n,m=c["".concat(p,".").concat(d)]||c[d]||h[d]||i;return a?r.createElement(m,o(o({ref:t},s),{},{components:a})):r.createElement(m,o({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-07-14-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-07-14-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-14-hydra.md",source:"@site/blog/2023-07-14-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-14T00:00:00.000Z",formattedDate:"July 14, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.79,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-14-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-18-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-13-mithril"}},p={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:u},c="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week the team focused on exploring the event sourced persistence in order\nto improve ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," performance. Because of this work the team noticed we\nneed to refactor the emit snapshot emission logic and update the spec in the\nlight of new changes. They also took the time to revisit their goals and product\nplans for the next quarter as well as doing some security fixes related to\nmultisignatures."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finished spike about performance improvements of event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/963"},"#963"),"."),(0,n.kt)("li",{parentName:"ul"},"Refactor snapshot emission in protocol logic."),(0,n.kt)("li",{parentName:"ul"},"Revisited our roadmap and goals."),(0,n.kt)("li",{parentName:"ul"},"Prepared and conducated a learning session on lean-waste."),(0,n.kt)("li",{parentName:"ul"},"Improve security of multi-signature checks, see ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-c8qp-cv4h-vcc4"},"this Github security advisory"),"."),(0,n.kt)("li",{parentName:"ul"},"Implemented a cache friendly way to version our binaries ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/962"},"#962"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement Event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/913"},"#913"),"."),(0,n.kt)("li",{parentName:"ul"},"Remove deprecated internal commit ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/954"},"#954")," and close ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/728"},"#728"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a40f46b.b5ec8c54.js b/assets/js/3a40f46b.b5ec8c54.js new file mode 100644 index 00000000000..ce22dfe46ca --- /dev/null +++ b/assets/js/3a40f46b.b5ec8c54.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36337],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=u(a),c=l,h=d["".concat(p,".").concat(c)]||d[c]||m[c]||n;return a?r.createElement(h,o(o({ref:t},s),{},{components:a})):r.createElement(h,o({ref:t},s))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:l,o[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-11-22-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-11-22-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-22-ledger.md",source:"@site/blog/2023-11-22-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-11-22T00:00:00.000Z",formattedDate:"November 22, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.705,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-11-22-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-24-sre"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-22-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway",id:"conway",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],s={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of\nCDDL specification. Important bugfixes include:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Fix deserialization of ",(0,l.kt)("inlineCode",{parentName:"li"},"ValueNotConservedUTxO")," predicate failure that could not\npreviously report zero ADA."),(0,l.kt)("li",{parentName:"ul"},"Fix deserialization of ",(0,l.kt)("inlineCode",{parentName:"li"},"CostModels")," in the ",(0,l.kt)("inlineCode",{parentName:"li"},"PParamsUpdate"),". Invalid ",(0,l.kt)("inlineCode",{parentName:"li"},"CostModels")," are no\nlonger allowed, only ",(0,l.kt)("inlineCode",{parentName:"li"},"CostModels")," for unrecognized Plutus versions are allowed starting\nwith Conway"),(0,l.kt)("li",{parentName:"ul"},"Fix returning of Deposits for ProposalProcedures")),(0,l.kt)("p",null,"Testing tooling has been improved and new tests have been implemented for Conway era."),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway"},"Conway"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3858"},"pull-3858")," - Restructure computing Refunds and Deposits in a TxBody across all eras"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3860"},"pull-3860")," - Removed ",(0,l.kt)("inlineCode",{parentName:"li"},"mock/crypto.cddl"),", added optional tag to sets"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3864"},"pull-3864")," - Fix Proposal deposits and add deposit tests to imp tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3859"},"pull-3859")," - Rename ProposalsSnapshot to Proposals"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3867"},"pull-3867")," - ",(0,l.kt)("inlineCode",{parentName:"li"},"MaryValue")," fixes"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3869"},"pull-3869")," - Indicate that tag 258 is optional for OSet. Fix rational CDDL"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3863"},"pull-3863")," - Improve deposits refunds re-usability"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3861"},"pull-3861")," - Fail PParamsUpdate deserialization for invalid costmodels in Conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3875"},"pull-3875")," - Fix cddl spec for CostModels in Conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3876"},"pull-3876")," - Change 4 PParam fields from EpochNo to EpochInterval"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3884"},"pull-3884")," - Relax requirement on the Set tag 258 to be enforced in the next era")),(0,l.kt)("h3",{id:"testing"},"Testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3868"},"pull-3868")," - Improvements to support property tests on Traces with simple Tx with DRep related Certs"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3792"},"pull-3792")," - RATIFY and GOV constraint tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3885"},"pull-3885")," - Added a test for genTxAndNewEpoch"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3886"},"pull-3886")," - QuickCheck Imp integration")),(0,l.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3854"},"pull-3854")," - Integration work for node 8.7.0"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3872"},"pull-3872")," - Fixup ReadTheDocs build"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3871"},"pull-3871")," - Bump plutus dep to 1.16"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3874"},"pull-3874")," - Post release changes"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3880"},"pull-3880")," - Remove generic-monoid dependency"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3887"},"pull-3887")," - Add changelog for features that landed in cardano-node-8.7")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a493dd8.735658ae.js b/assets/js/3a493dd8.735658ae.js new file mode 100644 index 00000000000..c2754df9a86 --- /dev/null +++ b/assets/js/3a493dd8.735658ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39071],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(a),d=n,c=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-05-26-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-05-26-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-hydra.md",source:"@site/blog/2023-05-26-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.11,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-05-26-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-26-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-26-ledger"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:s},u="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team accomplished several important tasks. They held their\nmonthly review meeting and drafted the report for May. They made progress on\nimplementing the first end-to-end journey for external commits using "Option A"\nfor normal UTxOs, while still considering "Option B". The team also integrated a\nSpanish translation contributed by the community, created micro-benchmarks for\ntransaction validation and deserialization, and made improvements to\nhydra-node\'s version reporting. Last but not least, they implemented the ability\nto commit multiple UTxOs to a head at once.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Held the monthly review meeting (",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/1_N6b4RDe579TgLawiJzbE0NLofD3ljE6/view"},"recording")," + ",(0,n.kt)("a",{parentName:"li",href:"https://docs.google.com/presentation/d/1anUC3Z1idloyR6uwiSHLZtV6-LQvUcByHPMUgCBOVIA"},"slides"),") & drafted the report for May."),(0,n.kt)("li",{parentName:"ul"},"Have a first end-to-end journey for external commits implementing ","\u201c","Option A","\u201d","\nfor normal UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/887"},"#887")," (still considering ","\u201c","Option B","\u201d",")."),(0,n.kt)("li",{parentName:"ul"},"Integrated the spanish translation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/866"},"#866"),"."),(0,n.kt)("li",{parentName:"ul"},"Created micro-benchmarks for transaction validation and deserialization ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/884"},"#884"),"."),(0,n.kt)("li",{parentName:"ul"},"Improve hydra-node ","\u2013","version reporting on non-released builds ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/849"},"#849")),(0,n.kt)("li",{parentName:"ul"},"Some minor CI improvements following up last weeks changes."),(0,n.kt)("li",{parentName:"ul"},"Allow commit transactions with multiple UTxO ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/774"},"#774"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Investigate and re-open our team-internal head on mainnet."),(0,n.kt)("li",{parentName:"ul"},"Improve and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete external commits with script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),"."),(0,n.kt)("li",{parentName:"ul"},"Authenticate network messages ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"#727"),"."),(0,n.kt)("li",{parentName:"ul"},"Add hydra as tool to developr platform ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/872"},"#872"),".")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3ab5f4e0.04ccd5a8.js b/assets/js/3ab5f4e0.04ccd5a8.js new file mode 100644 index 00000000000..f6a634287b7 --- /dev/null +++ b/assets/js/3ab5f4e0.04ccd5a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4376],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,l(l({ref:t},u),{},{components:n})):r.createElement(h,l({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-03-23-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-23-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-23-db-sync.md",source:"@site/blog/2023-03-23-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-03-23T00:00:00.000Z",formattedDate:"March 23, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.755,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-03-23-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-24-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-23-mithril"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DBSync team worked in performance enhancements issues, on providing new db-sync options and on\ntechnical debt and bug fixing. The DBSync team also on boarded a new member."),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on an issue which causes ",(0,a.kt)("inlineCode",{parentName:"li"},"ada_pots")," tables to include the values related not only to an\nepoch, but also the first epoch of the last epoch.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1367"},"#1367")),(0,a.kt)("li",{parentName:"ul"},"Fixed an issue where the ",(0,a.kt)("inlineCode",{parentName:"li"},"epoch")," table didn't rollback and caused wrong values\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1370"},"#1370")),(0,a.kt)("li",{parentName:"ul"},"Fixed an issue were users with ",(0,a.kt)("inlineCode",{parentName:"li"},"disable-ledger")," option had to provide the state dir option, even\nthough it was never used. Also refactored the no ledger part of the codebase.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1378"},"#1378")),(0,a.kt)("li",{parentName:"ul"},"Improved the perforance by using the cache more. Also provided many new options which enables or\ndisables parts of db-sync. In addition a new ",(0,a.kt)("inlineCode",{parentName:"li"},"--turbo")," mode is enables which allows db-sync to sync\nmainnet in hours.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1379"},"#1379"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3ac14561.1cd1f4d0.js b/assets/js/3ac14561.1cd1f4d0.js new file mode 100644 index 00000000000..aead14d0397 --- /dev/null +++ b/assets/js/3ac14561.1cd1f4d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79765],{30455:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/12","page":12,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/11","nextPage":"/cardano-updates/page/13","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/3ac610ff.316c8e11.js b/assets/js/3ac610ff.316c8e11.js new file mode 100644 index 00000000000..681a08c19ac --- /dev/null +++ b/assets/js/3ac610ff.316c8e11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15091],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=c(r),u=n,f=d["".concat(p,".").concat(u)]||d[u]||m[u]||o;return r?a.createElement(f,l(l({ref:t},s),{},{components:r})):a.createElement(f,l({ref:t},s))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-03-16-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-16-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-16-goedel.md",source:"@site/blog/2023-03-16-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-03-16T00:00:00.000Z",formattedDate:"March 16, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.55,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-03-16-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-17-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-10-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},d="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team has been working on drafts of two papers\nimproving the deltaQ tutorial, consulting on performance design, and\nthe final version of the Djed paper."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Preparing draft of DeltaQSD algebra paper for ICE 2023")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Successful outcome of Marlowe consultancy leading to substantial\nimprovement in performance")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Preparing sections on the communication language and bisimulation\nproofs for draft paper about verifying design refinements for\ndistributed system design")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Camera ready version of Djed paper under preparation"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3bb06773.29b34cb1.js b/assets/js/3bb06773.29b34cb1.js new file mode 100644 index 00000000000..5d93617b151 --- /dev/null +++ b/assets/js/3bb06773.29b34cb1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65029],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=u(a),s=r,h=m["".concat(p,".").concat(s)]||m[s]||d[s]||i;return a?n.createElement(h,o(o({ref:t},c),{},{components:a})):n.createElement(h,o({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-08-29-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-08-29-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-29-node-cli-api.md",source:"@site/blog/2023-08-29-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-08-29T00:00:00.000Z",formattedDate:"August 29, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.55,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-08-29-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-01-sre"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-28-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-08-16---2023-08-29"},"2023-08-16 - 2023-08-29"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CLI is making progress towards phases 3 and 4 of SanchoNet."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Ability to create info, no-confidence and new committee governance actions.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Voting as DREP is possible now on the CLI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"API is now using Ledger's PParams and VotingProcedures")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Expose following queries from consensus:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"- GetGovState\n- GetDRepState\n- GetDRepStakeDistr\n- GetCommitteeState\n- GetConstitution\n")))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/179"},"Add goverance info action creation to era based cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/176"},"Add create-no-confidence command to era based cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/175"},"Add create-new-committee command to era based cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/204"},"Enable ",(0,r.kt)("inlineCode",{parentName:"a"},"--drep-script-hash")," option")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/211"},"Remove ",(0,r.kt)("inlineCode",{parentName:"a"},"experimental")," subcommand")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/210"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.17.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/194"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"governance drep id")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/189"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"governance query")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/187"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--verification-key")," option to ",(0,r.kt)("inlineCode",{parentName:"a"},"committee key-hash")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/203"},"Read and write ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingProcedures")," files instead of ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingEntry")," files")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/201"},"Release 8.6.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/195"},"Merge ",(0,r.kt)("inlineCode",{parentName:"a"},"LegacyClientCmdError")," into ",(0,r.kt)("inlineCode",{parentName:"a"},"CmdError")," ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/193"},"Add test for conway governance action create-constitution")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/192"},"Move legacy errors out of legacy command structure modules")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/191"},"Governance ",(0,r.kt)("inlineCode",{parentName:"a"},"drep")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"vote")," command groups")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/188"},"Move command errors from era-based to ",(0,r.kt)("inlineCode",{parentName:"a"},"CmdError")," module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/186"},"Move some error types")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/185"},"Delete unused module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/183"},"Refactor: Use ",(0,r.kt)("inlineCode",{parentName:"a"},"maybeFeatureInEra")," instead of ",(0,r.kt)("inlineCode",{parentName:"a"},"featureInEra")," where possible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/182"},"Remove all uses of ",(0,r.kt)("inlineCode",{parentName:"a"},"toS"),", ",(0,r.kt)("inlineCode",{parentName:"a"},"purer"),", ",(0,r.kt)("inlineCode",{parentName:"a"},"cborError")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"intercalate")," from ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Prelude"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/180"},"Remove example era-based parsers we don't need anymore")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/174"},"Bump CHaP index in preparation for 8.3.0 pre"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/216"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.17.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/214"},"Replace ProtocolParameters usage with ledger's PParams")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/210"},"Use injective type families to improve type inference")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/209"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"TxVotes")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingEntry")," and use ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingProcedures")," instead")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/208"},"New functions ",(0,r.kt)("inlineCode",{parentName:"a"},"emptyVotingProcedures"),", ",(0,r.kt)("inlineCode",{parentName:"a"},"singletonVotingProcedures")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"mergeVotingProcedures"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/207"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"makeStakeAddressAndDRepDelegationCertificate")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/206"},"Expose ledger lenses for governance types")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/205"},"New version cardano-api-8.16.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/204"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingProcedures")," type")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/202"},"Release 8.16.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/200"},"Update createAnchor to use hashAnchorData")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/197"},"Release 8.15.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/196"},"Add consensus governance queries"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3bb415e3.ede0fcad.js b/assets/js/3bb415e3.ede0fcad.js new file mode 100644 index 00000000000..867a115ec1f --- /dev/null +++ b/assets/js/3bb415e3.ede0fcad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94900],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),u=n,h=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-06-23-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-06-23-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-goedel.md",source:"@site/blog/2023-06-23-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.335,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-06-23-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-28-performance-and-tracing"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-23-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the teams presented two papers at ICE 2023."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Presented two papers at ICE 2023: ",(0,n.kt)("a",{parentName:"p",href:"https://www.discotec.org/2023/ice"},"https://www.discotec.org/2023/ice"))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Analysing and implementing chain synchronization mini protocol")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3bc8fe23.54d3883d.js b/assets/js/3bc8fe23.54d3883d.js new file mode 100644 index 00000000000..25bffb32e40 --- /dev/null +++ b/assets/js/3bc8fe23.54d3883d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[12029],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(r),h=n,d=c["".concat(s,".").concat(h)]||c[h]||m[h]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-10-11-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-11-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-11-mithril.md",source:"@site/blog/2023-10-11-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-11T00:00:00.000Z",formattedDate:"October 11, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.77,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-11-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-13-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-10-node-cli-api"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on ",(0,n.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io"),", the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures."),(0,n.kt)("p",null,"Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate a library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1141"},"#1141")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano transactions history PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"ProtocolKeyRegistration")," creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1187"},"#1187")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Update ",(0,n.kt)("inlineCode",{parentName:"strong"},"Rust")," compiler in ",(0,n.kt)("inlineCode",{parentName:"strong"},"nix")," CI")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1282"},"#1282")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Mithril networks infrastructure maintenance")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1218"},"#1218")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Activate Cloudflare protection of infrastructure")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1230"},"#1230"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3be95f92.45db99c1.js b/assets/js/3be95f92.45db99c1.js new file mode 100644 index 00000000000..691d546dbb3 --- /dev/null +++ b/assets/js/3be95f92.45db99c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[9140],{72016:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/performance-tracing/page/5","page":5,"postsPerPage":5,"totalPages":5,"totalCount":25,"previousPage":"/cardano-updates/tags/performance-tracing/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/3c2e75b4.1fb064d3.js b/assets/js/3c2e75b4.1fb064d3.js new file mode 100644 index 00000000000..caa1e61d16c --- /dev/null +++ b/assets/js/3c2e75b4.1fb064d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30843],{7697:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/ledger/page/6","page":6,"postsPerPage":5,"totalPages":6,"totalCount":30,"previousPage":"/cardano-updates/tags/ledger/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/3c3d2bff.6a9b8a9e.js b/assets/js/3c3d2bff.6a9b8a9e.js new file mode 100644 index 00000000000..6bd1732db20 --- /dev/null +++ b/assets/js/3c3d2bff.6a9b8a9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49706],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>y});var i=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),u=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),h=a,y=d["".concat(l,".").concat(h)]||d[h]||p[h]||r;return n?i.createElement(y,o(o({ref:t},c),{},{components:n})):i.createElement(y,o({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,o[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var i=n(87462),a=(n(67294),n(3905));const r={title:"SECP bindings Security Issue Report",slug:"2023-08-17-secp-issue",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2023-08-17-secp-issue",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-secp-security-issue-report.md",source:"@site/blog/2023-08-17-secp-security-issue-report.md",title:"SECP bindings Security Issue Report",description:"Security Issue Report: SECP256k1 bug",date:"2023-08-17T00:00:00.000Z",formattedDate:"August 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:3.3,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"SECP bindings Security Issue Report",slug:"2023-08-17-secp-issue",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-08-17-db-sync"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-15-node-cli-api"}},l={authorsImageUrls:[void 0]},u=[{value:"Security Issue Report: SECP256k1 bug",id:"security-issue-report-secp256k1-bug",level:2},{value:"Summary of Issue",id:"summary-of-issue",level:3},{value:"Criticality Level",id:"criticality-level",level:4},{value:"What Action was Taken",id:"what-action-was-taken",level:4},{value:"Potential Effect",id:"potential-effect",level:4},{value:"Actual Effect",id:"actual-effect",level:4},{value:"Ongoing Mitigations Needed, if any",id:"ongoing-mitigations-needed-if-any",level:4},{value:"Responsibility for Mitigations",id:"responsibility-for-mitigations",level:4},{value:"Detailed description of Incident",id:"detailed-description-of-incident",level:3},{value:"Recommendations",id:"recommendations",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,i.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"security-issue-report-secp256k1-bug"},"Security Issue Report: SECP256k1 bug"),(0,a.kt)("p",null,"Date Occurred: July 15, 2022\nSeverity: Potentially Very High if exploited on Mainnet\nAuthors: I\xf1igo Querejeta Azurmendi"),(0,a.kt)("p",null,"Date of Report: August 17, 2023"),(0,a.kt)("h3",{id:"summary-of-issue"},"Summary of Issue"),(0,a.kt)("h4",{id:"criticality-level"},"Criticality Level"),(0,a.kt)("p",null,"Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet\nContext"),(0,a.kt)("p",null,"New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains.\nHow was the Issue Detected"),(0,a.kt)("p",null,"The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there."),(0,a.kt)("h4",{id:"what-action-was-taken"},"What Action was Taken"),(0,a.kt)("p",null,"The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod).\nFixes were applied to prevent the use of the primitives.\nA full security audit was carried out on the bindings.\nThe rollout of the primitives was postponed to a new hard fork (Valentine)"),(0,a.kt)("h4",{id:"potential-effect"},"Potential Effect"),(0,a.kt)("p",null,"The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction."),(0,a.kt)("h4",{id:"actual-effect"},"Actual Effect"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Delay to the Vasil hard-fork"),(0,a.kt)("li",{parentName:"ul"},"Temporary removal of SECP256k1 primitives"),(0,a.kt)("li",{parentName:"ul"},"Additional hard-fork to introduce SECP256k1 primitives")),(0,a.kt)("h4",{id:"ongoing-mitigations-needed-if-any"},"Ongoing Mitigations Needed, if any"),(0,a.kt)("p",null,"None"),(0,a.kt)("h4",{id:"responsibility-for-mitigations"},"Responsibility for Mitigations"),(0,a.kt)("p",null,"Core team"),(0,a.kt)("h3",{id:"detailed-description-of-incident"},"Detailed description of Incident"),(0,a.kt)("p",null,"New Plutus ",(0,a.kt)("strong",{parentName:"p"},"secp256k1")," cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet."),(0,a.kt)("p",null,"The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h#L518"},"This")," is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h#L61"},"expected")," structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely."),(0,a.kt)("li",{parentName:"ul"},"The same happened with the Schnorr ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1_schnorrsig.h#L170"},"verification function"),". It takes as input a SECP256k1_xonly_pubkey, which is again an ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1_extrakeys.h#L10"},"opaque structure")," that holds a parsed and valid public key.")),(0,a.kt)("p",null,"The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated."),(0,a.kt)("p",null,"The fix was addressed in ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/289"},"this")," PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts."),(0,a.kt)("h3",{id:"recommendations"},"Recommendations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Check all new Plutus bindings for correct use."),(0,a.kt)("li",{parentName:"ul"},"Audit all new Plutus built-in bindings."),(0,a.kt)("li",{parentName:"ul"},"Continue to develop specific End-to-End tests for all new Plutus features."),(0,a.kt)("li",{parentName:"ul"},'Do not assume that any existing library functions are "safe". Treat all external calls circumspectly.')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3c8518bb.e3668a02.js b/assets/js/3c8518bb.e3668a02.js new file mode 100644 index 00000000000..268dd4eced6 --- /dev/null +++ b/assets/js/3c8518bb.e3668a02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86983],{45088:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/25","page":25,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/24","nextPage":"/cardano-updates/page/26","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/3cb4be67.1f1b2aaa.js b/assets/js/3cb4be67.1f1b2aaa.js new file mode 100644 index 00000000000..2fddfc15fb9 --- /dev/null +++ b/assets/js/3cb4be67.1f1b2aaa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96774],{40264:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/28","page":28,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/27","nextPage":"/cardano-updates/page/29","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/3cb9fdac.eb9b02da.js b/assets/js/3cb9fdac.eb9b02da.js new file mode 100644 index 00000000000..766aa15edde --- /dev/null +++ b/assets/js/3cb9fdac.eb9b02da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55638],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),c=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},u),{},{components:a})):n.createElement(h,i({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-04-20-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-04-20-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-20-node-cli-api.md",source:"@site/blog/2023-04-20-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-04-20T00:00:00.000Z",formattedDate:"April 20, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.4,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-04-20-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-20-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-19-consensus"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],u={toc:c},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-04-20---2023-05-04"},"2023-04-20 - 2023-05-04"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Various fixes and improvements")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5136"},"Modify golden test functions to automatically create parent directories")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5132"},"SPO on-chain poll commands adjustments")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5119"},"New environment variable CARDANO_NODE_NETWORK_ID")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5172"},(0,r.kt)("inlineCode",{parentName:"a"},"--out-file")," option for governance commands")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5130"},"UTC Time to slots conversion function")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5157"},"Update CHaP to get latest ledger with performance fix")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4854"},"Integration with Peer Sharing")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3ce290cc.49694d77.js b/assets/js/3ce290cc.49694d77.js new file mode 100644 index 00000000000..e9632a5397f --- /dev/null +++ b/assets/js/3ce290cc.49694d77.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18654],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(r),u=a,g=d["".concat(p,".").concat(u)]||d[u]||m[u]||o;return r?n.createElement(g,i(i({ref:t},c),{},{components:r})):n.createElement(g,i({ref:t},c))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-02-17-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-17-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-goedel.md",source:"@site/blog/2023-02-17-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.53,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-02-17-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-17-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-17-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},d="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This sprint the team has been working on drafts of two papers and one\ntechnical report, distributivity properties of deltaQ, and consulting\non performance design with the Marlowe team."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Processing reviews on performance engineering paper and planning\npaper revisions accordingly")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Investigating distributivity properties of DeltaQ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Preparing sections on the thorn calculus and idempotency laws for\ndraft paper about verifying design refinements for distributed\nsystem design")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Consulting on performance design with Marlowe team"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3dbbac8a.56fe0fb3.js b/assets/js/3dbbac8a.56fe0fb3.js new file mode 100644 index 00000000000..ae41672c833 --- /dev/null +++ b/assets/js/3dbbac8a.56fe0fb3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16855],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function l(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),u=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):l(l({},t),e)),i},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),h=u(i),d=r,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return i?a.createElement(c,l(l({ref:t},s),{},{components:i})):a.createElement(c,l({ref:t},s))}));function c(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,l=new Array(n);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[h]="string"==typeof e?e:r,l[1]=o;for(var u=2;u{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>n,metadata:()=>o,toc:()=>u});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-07-13-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-07-13-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-13-mithril.md",source:"@site/blog/2023-07-13-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-07-13T00:00:00.000Z",formattedDate:"July 13, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.92,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-07-13-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-14-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-12-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team created a new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2327.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2327.0"))," distribution. They focused on preparing the beta launch on the ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet"),": they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet")," infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library. "),(0,r.kt)("p",null,"Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2327.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2327.0"))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add infrastructure monitoring")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/987"},"#987")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Deploy 'mainnet' infrastructure")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/988"},"#988")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Handle Secrets management")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/989"},"#989")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,r.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,r.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Remove certificate hash from Artifact")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/932"},"#932")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Check vulnerabilities in CI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1037"},"#1037")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add 'created_at' in Mithril Stake Distribution messages")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1030"},"#1030")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add a 'run-only' option in end to end test")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1048"},"#1048")))),(0,r.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Factorize protocol crypto operations")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/669"},"#669")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Refactor aggregator dependency injection and services")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1058"},"#1058")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Build static binaries in CI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/874"},"#874")))),(0,r.kt)("li",{parentName:"ul"},"Worked on documentation:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Prepare SPO on-boarding guide")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1049"},"#1049")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add instructions to set firewall using iptables")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1040"},"#1040")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Update ufw command to set firewall on Mithril Signer installation instructions")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1041"},"#1041")))),(0,r.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Aggregator does not detect certificate chain epoch gap")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/952"},"#952")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"'testing-preview' network does not create certificates")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1015"},"#1015")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"SQLite compatibility in aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/837"},"#837")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Q&A followup fixes")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1035"},"#1035")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"E2E tests are flaky in CI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1023"},"#1023"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3e93a65d.c81741e5.js b/assets/js/3e93a65d.c81741e5.js new file mode 100644 index 00000000000..a77cea41c07 --- /dev/null +++ b/assets/js/3e93a65d.c81741e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51164],{35089:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/20","page":20,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/19","nextPage":"/cardano-updates/page/21","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/3eae7101.1c3bfdde.js b/assets/js/3eae7101.1c3bfdde.js new file mode 100644 index 00000000000..d151070c052 --- /dev/null +++ b/assets/js/3eae7101.1c3bfdde.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[69399],{44659:a=>{a.exports=JSON.parse('{"label":"network","permalink":"/cardano-updates/quarterly/tags/network","allTagsPath":"/cardano-updates/quarterly/tags","count":4}')}}]); \ No newline at end of file diff --git a/assets/js/3ede3d79.3f739406.js b/assets/js/3ede3d79.3f739406.js new file mode 100644 index 00000000000..ef5eaa4c010 --- /dev/null +++ b/assets/js/3ede3d79.3f739406.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2221],{4562:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"2023-12-06-ledger","metadata":{"permalink":"/cardano-updates/2023-12-06-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-06-ledger.md","source":"@site/blog/2023-12-06-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-12-06T00:00:00.000Z","formattedDate":"December 6, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.53,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-12-06-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-12-06-mithril"}},"content":"## High level summary\\n\\nThis period we reached a major milestone, namely we now have an initial version of Conway\\nconformance testing working. We are now able to generate random valid data with the help\\nof constraint based testing framework, apply that data to Conway Ledger rules and verify\\nthat the output matches to the one produced by the executable version of the Formal Ledger\\nSpecification, when it is applied to the same random data.\\n\\nWe also had a couple of Conway bugs fixed and a few new predicate check implemented. Get\\nConstitutional Committee query is complete and tested. Various improvements to the\\ntesting tools. Addition of more test cases.\\n\\n## Low level summary\\n\\n### Conway\\n\\n* [pull-3888] - Add checks for valid ProtVer when a proposal is a HardFork\\n* [pull-3902] - Fix pvCanFollow usage in Conway and improve clarity in Shelley\\n* [pull-3855] - Remove unreachable proposals\\n* [pull-3903] - Add lenient decoder for `Addr`\\n* [pull-3878] - Committee query - implement next epoch change\\n\\n### Testing\\n\\n* [pull-3893] - Move `tree-diff` dependency to tests together with all instances\\n* [pull-3896] - Fix Brute force failure\\n* [pull-3904] - New ListWhere Pred added to the Constrained Solver.\\n* [pull-3907] - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file\\n* [pull-3883] - Committee QuerySpec Imp Test\\n* [pull-3909] - Make `impAnn` a bit more useful, by making the logs scoped by `impAnn`\\n* [pull-3908] - Use upstream testing instances for very basic types\\n* [pull-3912] - Removed call to tail, and the 'watchPulser' test\\n* [pull-3852] - Added constrained generators to conformance tests - Part 1\\n\\n### Improvements and releasing\\n\\n* [pull-3891] - Bump plutus to 1.17\\n\\n[pull-3891]: https://github.com/input-output-hk/cardano-ledger/pull/3891\\n[pull-3888]: https://github.com/input-output-hk/cardano-ledger/pull/3888\\n[pull-3893]: https://github.com/input-output-hk/cardano-ledger/pull/3893\\n[pull-3896]: https://github.com/input-output-hk/cardano-ledger/pull/3896\\n[pull-3855]: https://github.com/input-output-hk/cardano-ledger/pull/3855\\n[pull-3904]: https://github.com/input-output-hk/cardano-ledger/pull/3904\\n[pull-3907]: https://github.com/input-output-hk/cardano-ledger/pull/3907\\n[pull-3903]: https://github.com/input-output-hk/cardano-ledger/pull/3903\\n[pull-3902]: https://github.com/input-output-hk/cardano-ledger/pull/3902\\n[pull-3883]: https://github.com/input-output-hk/cardano-ledger/pull/3883\\n[pull-3878]: https://github.com/input-output-hk/cardano-ledger/pull/3878\\n[pull-3909]: https://github.com/input-output-hk/cardano-ledger/pull/3909\\n[pull-3908]: https://github.com/input-output-hk/cardano-ledger/pull/3908\\n[pull-3852]: https://github.com/input-output-hk/cardano-ledger/pull/3852\\n[pull-3912]: https://github.com/input-output-hk/cardano-ledger/pull/3912"},{"id":"2023-12-06-mithril","metadata":{"permalink":"/cardano-updates/2023-12-06-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-06-mithril.md","source":"@site/blog/2023-12-06-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-12-06T00:00:00.000Z","formattedDate":"December 6, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.01,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-12-06-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-12-06-ledger"},"nextItem":{"title":"Performance & Tracing Update","permalink":"/cardano-updates/2023-12-04-performance-and-tracing"}},"content":"## High level overview\\n\\nThis week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator\'s performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking.\\n\\nFinally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io.\\n\\n## Low level overview\\n- Worked on the issue **Light Wallet: Release `mithril-client` WASM library** [#1336](https://github.com/input-output-hk/mithril/issues/1336)\\n- Worked on the issue **P2P threat modeling and risk analysis** [#1350](https://github.com/input-output-hk/mithril/issues/1350)\\n- Worked on the issue **Create a test network on `Sanchonet`** [#1173](https://github.com/input-output-hk/mithril/issues/1173)\\n- Worked on the issue **Upgrade breaking changes crates** [#1357](https://github.com/input-output-hk/mithril/issues/1357)\\n- Worked on the issue **Enhance Mithril/Cardano node communication** [#1315](https://github.com/input-output-hk/mithril/issues/1315)\\n- Completed the issue **Enhance aggregator REST API performances** [#1327](https://github.com/input-output-hk/mithril/issues/1327)\\n- Completed the issue **Signer runtime is stuck for some SPO** [#1312](https://github.com/input-output-hk/mithril/issues/1312)\\n- Completed the issue **Make `mithril-client` examples full crates** [#1385](https://github.com/input-output-hk/mithril/issues/1385)\\n- Completed the issue **Manual publication to crates.io with GitHub action** [#1380](https://github.com/input-output-hk/mithril/issues/1380)\\n- Completed the issue **Remove `sqlite` dependency from `mithril-client` crate** [#1390](https://github.com/input-output-hk/mithril/issues/1390)"},{"id":"2023-12-04-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-12-04-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-04-performance-and-tracing.md","source":"@site/blog/2023-12-04-performance-and-tracing.md","title":"Performance & Tracing Update","description":"High level summary","date":"2023-12-04T00:00:00.000Z","formattedDate":"December 4, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.085,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & Tracing Update","slug":"2023-12-04-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-12-06-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-12-01-hydra"}},"content":"## High level summary\\n\\n* Benchmarking: Release benchmarking for node `8.7.0`. Also, we performed the first-ever Conway benchmarks.\\n* Development: Conway capability of our workload generator has been implemented and merged to `master`.\\n* Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data.\\n* Tracing: Quality-of-life improvements to tracing output and addition of a test suite.\\n* Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nA full set of benchmarks for node `8.7.0` has been performed, with the focus of enabling the next mainnet release. We\'ve measured slight performance improvements of `8.7.0` over `8.6.0`, and can confirm no regressions have been introduced.\\n\\nFurthermore, we\'ve run system integration level benchmarks in the Conway era for the first time, on the same node version.\\nOnly Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty.\\n\\n### Development\\n\\nOur transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era.\\nCurrently, we\'re looking into adding Conway-exclusive features, such as `DRep` registration. Those would be submitted at the very beginning of a run, as we\'re interested in seeing potential performance implications of maintaining `DRep` sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying.\\n\\n### Infrastructure\\n\\nAs our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we\'ve\\nimproved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data.\\n\\n### Tracing\\n\\nThe new tracing system is currently receiving usability improvements as we\'re reworking the output of several trace messages.\\nAdditionally, we\'re setting up a rigorous test suite to provide safety for future development of and component integration inte the system.\\n\\n### Nomad backend\\n\\nWe\'ve been working on adapting various benchmarking workloads, which are defined by our workbench\'s profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we\'re implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases."},{"id":"2023-12-01-hydra","metadata":{"permalink":"/cardano-updates/2023-12-01-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-01-hydra.md","source":"@site/blog/2023-12-01-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-12-01T00:00:00.000Z","formattedDate":"December 1, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.865,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-12-01-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & Tracing Update","permalink":"/cardano-updates/2023-12-04-performance-and-tracing"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-11-29-consensus"}},"content":"### High-level summary\\n\\nThis week, the Hydra team conducted a packed Monthly Review meeting,\\nfeaturing demonstrations and the preparation of the monthly report. They\\naddressed flakiness in tests and enhanced the logs json schema,\\nimproving overall test reliability. Additionally, the team successfully\\nbuilt MacOS ARM64 (`aarch64-darwin`) binaries in CI, expanding platform\\nsupport. They further improved the network configuration by detecting\\nincompatible persisted states, contributing to overall system\\nrobustness. Finally, the team released version 0.14.0, highlighting\\ntheir commitment to delivering regular updates and improvements.\\n\\n### What did the team achieve this week\\n\\n- Monthly Review\\n [meeting](https://drive.google.com/file/d/1-iv8IveUzA2KrJV_Kqrgx4ts05Ow0zjM)\\n packed with demonstrations and prepared monthly report\\n [\\\\#1189](https://github.com/input-output-hk/hydra/pull/1189)\\n- Fixed several flaky tests and improved the logs json schema\\n [\\\\#1188](https://github.com/input-output-hk/hydra/pull/1188)\\n [\\\\#1190](https://github.com/input-output-hk/hydra/issues/1190)\\n [\\\\#1192](https://github.com/input-output-hk/hydra/pull/1192)\\n- Built MacOS ARM64 (`aarch64-darwin`) binaries in CI\\n [\\\\#1182](https://github.com/input-output-hk/hydra/pull/1182)\\n- Improved network configuration by detecting incompatible persisted\\n states [\\\\#1174](https://github.com/input-output-hk/hydra/issues/1174)\\n- Released version 0.14.0\\n\\n### What are the goals of next week\\n\\n- Start work on incremental decommit\\n- Continue shepherding contributed PRs to completion\\n- Finish stateless-observation work\\n- Open a head on a Conway network"},{"id":"2023-11-29-consensus","metadata":{"permalink":"/cardano-updates/2023-11-29-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-29-consensus.md","source":"@site/blog/2023-11-29-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-11-29T00:00:00.000Z","formattedDate":"November 29, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.51,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-11-29-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-12-01-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-29-mithril"}},"content":"## High level summary\\n\\nThe Consensus team implemented and tested a [patch](https://github.com/input-output-hk/ouroboros-consensus/pull/525) that does not propagate future headers.\\nIt is under review, and we expect it can be released in the next Cardano node version.\\nOn the UTxO-HD front, we [finished](https://github.com/input-output-hk/ouroboros-consensus/issues/510) prototyping the `LedgerDB` and `BackingStore` redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend.\\nWith this prototype finished we can start integrating the rest of the code.\\nWe [investigated](https://github.com/input-output-hk/ouroboros-consensus/pull/513) the unexpected performance degradation observed when acquiring the block context.\\nWe also [released Cardano node 8.7.0](https://github.com/input-output-hk/cardano-node/releases/tag/8.7.0-pre) and [moved](https://github.com/input-output-hk/cardano-ledger/pull/3893) `tree-diff` outside `cardano-ledger` libraries."},{"id":"2023-11-29-mithril","metadata":{"permalink":"/cardano-updates/2023-11-29-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-29-mithril.md","source":"@site/blog/2023-11-29-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-11-29T00:00:00.000Z","formattedDate":"November 29, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.415,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-11-29-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-11-29-consensus"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-11-24-hydra"}},"content":"## High level overview\\n\\nThis week, the Mithril team released the initial version of the [Mithril client library](https://crates.io/crates/mithril-client), enabling developers to integrate core Mithril features into their applications. They also released a new distribution, [`2347.0`](https://github.com/input-output-hk/mithril/releases/tag/2347.0), which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements.\\n\\nThe team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance. \\n\\nFinally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users.\\n\\n## Low level overview\\n- Release of the [`mithril-client`](https://crates.io/crates/mithril-client) library crate\\n- Publication of a [dev blog post](https://mithril.network/doc/dev-blog/2023/11/27/mithril-client-library-released) about the released Mithril library\\n- Released the new distribution [`2347.0`](https://github.com/input-output-hk/mithril/releases/tag/2347.0)\\n- Worked on the issue **Light Wallet: Release `mithril-client` WASM library** [#1336](https://github.com/input-output-hk/mithril/issues/1336)\\n- Worked on the issue **Enhance Mithril/Cardano node communication** [#1315](https://github.com/input-output-hk/mithril/issues/1315)\\n- Worked on the issue **P2P threat modeling and risk analysis** [#1350](https://github.com/input-output-hk/mithril/issues/1350)\\n- Worked on the issue **Enhance aggregator REST API performances** [#1327](https://github.com/input-output-hk/mithril/issues/1327)\\n- Worked on the issue **Signer runtime is stuck for some SPO** [#1312](https://github.com/input-output-hk/mithril/issues/1312)\\n- Completed the issue **Support P2P relay in infrastructure** [#1361](https://github.com/input-output-hk/mithril/issues/1361)\\n- Completed the issue **Make Cardano node version custom in CI/CD** [#1355](https://github.com/input-output-hk/mithril/issues/1355)\\n- Completed the issue **Manually deploy a test Mithril network** [#1356](https://github.com/input-output-hk/mithril/issues/1356)\\n- Completed the issue **mithril-client verbosity not following usage menu** [#1325](https://github.com/input-output-hk/mithril/issues/1325)\\n- Completed the issue **Error message for mithril-client snapshot download** [#1375](https://github.com/input-output-hk/mithril/issues/1375)"},{"id":"2023-11-24-hydra","metadata":{"permalink":"/cardano-updates/2023-11-24-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-24-hydra.md","source":"@site/blog/2023-11-24-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-11-24T00:00:00.000Z","formattedDate":"November 24, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.12,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-11-24-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-29-mithril"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-11-24-sre"}},"content":"### High-level summary\\n\\nThis week, the Hydra team spent significant time opening a head among\\nthemselves on `mainnet` using the release candidate, revealing and\\naddressing lurking bugs such as\\n[\\\\#1174](https://github.com/input-output-hk/hydra/issues/1174). Also\\nrequired was this change to dynamically calculate the min utxo value\\n[\\\\#1176](https://github.com/input-output-hk/hydra/pull/1176), a\\nnecessary adjustment following the switch to inline datums. The team\\nengaged with `cardano-cli` / `cardano-api` maintainers to discuss recent\\nchanges and collaborated on drafting feature ideas, including providing\\n[Conway support](https://github.com/input-output-hk/hydra/issues/1177)\\nfor the Hydra roadmap. As part of ongoing improvements, they\\nexperimented with writing the specification in markdown instead of\\nLaTex.\\n\\n### What did the team achieve this week\\n\\n- Opened head among us on mainnet and uncovered a few lurking bugs like\\n [\\\\#1174](https://github.com/input-output-hk/hydra/issues/1174) in the\\n release candidate\\n- Calculate the min utxo value instead of hard-coding it\\n [\\\\#1176](https://github.com/input-output-hk/hydra/pull/1176), which is\\n needed since we switched to inline datums.\\n- Met with the `cardano-cli` / `cardano-api` maintainers to discuss\\n recent changes and way forward\\n- Drafted features ideas to provide [Conway\\n support](https://github.com/input-output-hk/hydra/issues/1177) on the\\n Hydra roadmap\\n- Experimented in writing the specification in markdown instead of LaTex\\n\\n### What are the goals of next week\\n\\n- Have the Monthly review meeting with several demos\\n- Release version 0.14.0 with [this\\n scope](https://github.com/input-output-hk/hydra/milestone/14?closed=1)\\n- Complete tidying up chain layer via stateless observation changes in\\n hydra-node\\n [\\\\#1096](https://github.com/input-output-hk/hydra/issues/1096)\\n- Update dependencies to prepare for Conway\\n [\\\\#1114](https://github.com/input-output-hk/hydra/issues/1114)"},{"id":"2023-11-24-sre","metadata":{"permalink":"/cardano-updates/2023-11-24-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-24-sre.md","source":"@site/blog/2023-11-24-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-11-24T00:00:00.000Z","formattedDate":"November 24, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":3.115,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-11-24-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-11-24-hydra"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-11-22-ledger"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent changes, updates or improvements include:\\n* The cardano-node nixos service now supports SIGHUP p2p topology reloading when the `useSystemdReload` option is enabled\\n\\n## Lower level summary\\n\\n### Capkgs\\n* Update cardano-db-sync and offchain-metadata-tools package paths and/or references: [capkgs-compare](https://github.com/input-output-hk/capkgs/compare/994696f...3ce364f)\\n\\n### Cardano-node\\n* Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: [cardano-node-pull-5537](https://github.com/input-output-hk/cardano-node/pull/5537)\\n * Creates a useSystemdReload bool option for the cardano-node nixos service\\n * This will move the topology file(s) to `/etc/cardano-node/topology-$i.yaml` and inject systemd reload hooks for p2p configured cardano-node instances\\n * Moving topology files to `/etc` also allows for manual topology updates when a quick test is needed and full service re-deployment isn\'t desired\\n\\n### Cardano-parts\\n* Adds a metadata server profile and a number of other features and improvements: [cardano-parts-pull-20](https://github.com/input-output-hk/cardano-parts/pull/20)\\n * Adds a new metadata-service profile\\n * Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile\\n * Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster\'s static needs, with each cached behind varnish\\n * Adds extra node list producers and public producers for cardano-node-topology profile\\n * Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch\\n * Adds select systemd metrics reporting to grafana-agent profile\\n * Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS\\n * Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it\\n * Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo\\n * Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation\\n * Adds support for grafana recording rules in the template files\\n * Improves cardano-group profile handling of producers with respect to multiple instance nodes\\n * Improves grafana-agent profile metrics handling for multi-instance cardano-node servers\\n * Improves smash service preStart handling while waiting for a node socket\\n * Updates Justfile for ERA_CMD demo support\\n * Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates\\n * Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile\\n * Defaults cardano-postgres profile psqlrc use to false\\n\\n### Cardano-playground\\n* Adds a new testnet metadata server, cluster webserver, and other improvements: [cardano-playground-pull-6](https://github.com/input-output-hk/cardano-playground/pull/6)\\n * Adds a new metadata server\\n * Adds a new webserver for the cluster\'s static virtualhost needs\\n * Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo\\n * Adds systemd metrics monitoring to the cluster\\n * Resizes sanchonet machines to support the growing chain\\n * Completes migration of preprod from world\\n * Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes\\n * Updates Justfile for ERA_CMD demo support\\n * Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile\\n * Migrates book static code to playground from world, with refactor, cleanup and updates\\n * Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules\\n\\n### Offchain-metadata-tools\\n* Adds db password option with obfuscation plus misc improvements: [offchain-metadata-tools-pull-61](https://github.com/input-output-hk/offchain-metadata-tools/pull/61)\\n * Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services\\n * Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile\\n * Moves from std use in the nix flake to standard flake schema\\n * Fixes hydra CI failures\\n * Builds update-docs in hydra to avoid long local build times\\n * Removes deprecated tullia\\n * Removes deprecated check-hydra from pkgs\\n * Removes deprecated bors files and references"},{"id":"2023-11-22-ledger","metadata":{"permalink":"/cardano-updates/2023-11-22-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-22-ledger.md","source":"@site/blog/2023-11-22-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-11-22T00:00:00.000Z","formattedDate":"November 22, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.705,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-11-22-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-11-24-sre"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-22-mithril"}},"content":"## High level summary\\n\\nLast two weeks progress was mainly on testing, bug fixes and improvements to clarity of\\nCDDL specification. Important bugfixes include:\\n\\n* Fix deserialization of `ValueNotConservedUTxO` predicate failure that could not\\n previously report zero ADA.\\n* Fix deserialization of `CostModels` in the `PParamsUpdate`. Invalid `CostModels` are no\\n longer allowed, only `CostModels` for unrecognized Plutus versions are allowed starting\\n with Conway\\n* Fix returning of Deposits for ProposalProcedures\\n\\nTesting tooling has been improved and new tests have been implemented for Conway era.\\n\\n## Low level summary\\n\\n### Conway\\n\\n* [pull-3858] - Restructure computing Refunds and Deposits in a TxBody across all eras\\n* [pull-3860] - Removed `mock/crypto.cddl`, added optional tag to sets\\n* [pull-3864] - Fix Proposal deposits and add deposit tests to imp tests\\n* [pull-3859] - Rename ProposalsSnapshot to Proposals\\n* [pull-3867] - `MaryValue` fixes\\n* [pull-3869] - Indicate that tag 258 is optional for OSet. Fix rational CDDL\\n* [pull-3863] - Improve deposits refunds re-usability\\n* [pull-3861] - Fail PParamsUpdate deserialization for invalid costmodels in Conway\\n* [pull-3875] - Fix cddl spec for CostModels in Conway\\n* [pull-3876] - Change 4 PParam fields from EpochNo to EpochInterval\\n* [pull-3884] - Relax requirement on the Set tag 258 to be enforced in the next era\\n\\n### Testing\\n\\n* [pull-3868] - Improvements to support property tests on Traces with simple Tx with DRep related Certs\\n* [pull-3792] - RATIFY and GOV constraint tests\\n* [pull-3885] - Added a test for genTxAndNewEpoch\\n* [pull-3886] - QuickCheck Imp integration\\n\\n### Improvements and releasing\\n\\n* [pull-3854] - Integration work for node 8.7.0\\n* [pull-3872] - Fixup ReadTheDocs build\\n* [pull-3871] - Bump plutus dep to 1.16\\n* [pull-3874] - Post release changes\\n* [pull-3880] - Remove generic-monoid dependency\\n* [pull-3887] - Add changelog for features that landed in cardano-node-8.7\\n\\n[pull-3858]: https://github.com/input-output-hk/cardano-ledger/pull/3858\\n[pull-3860]: https://github.com/input-output-hk/cardano-ledger/pull/3860\\n[pull-3864]: https://github.com/input-output-hk/cardano-ledger/pull/3864\\n[pull-3859]: https://github.com/input-output-hk/cardano-ledger/pull/3859\\n[pull-3867]: https://github.com/input-output-hk/cardano-ledger/pull/3867\\n[pull-3869]: https://github.com/input-output-hk/cardano-ledger/pull/3869\\n[pull-3863]: https://github.com/input-output-hk/cardano-ledger/pull/3863\\n[pull-3854]: https://github.com/input-output-hk/cardano-ledger/pull/3854\\n[pull-3861]: https://github.com/input-output-hk/cardano-ledger/pull/3861\\n[pull-3872]: https://github.com/input-output-hk/cardano-ledger/pull/3872\\n[pull-3871]: https://github.com/input-output-hk/cardano-ledger/pull/3871\\n[pull-3875]: https://github.com/input-output-hk/cardano-ledger/pull/3875\\n[pull-3874]: https://github.com/input-output-hk/cardano-ledger/pull/3874\\n[pull-3868]: https://github.com/input-output-hk/cardano-ledger/pull/3868\\n[pull-3880]: https://github.com/input-output-hk/cardano-ledger/pull/3880\\n[pull-3792]: https://github.com/input-output-hk/cardano-ledger/pull/3792\\n[pull-3876]: https://github.com/input-output-hk/cardano-ledger/pull/3876\\n[pull-3885]: https://github.com/input-output-hk/cardano-ledger/pull/3885\\n[pull-3884]: https://github.com/input-output-hk/cardano-ledger/pull/3884\\n[pull-3887]: https://github.com/input-output-hk/cardano-ledger/pull/3887\\n[pull-3886]: https://github.com/input-output-hk/cardano-ledger/pull/3886"},{"id":"2023-11-22-mithril","metadata":{"permalink":"/cardano-updates/2023-11-22-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-22-mithril.md","source":"@site/blog/2023-11-22-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-11-22T00:00:00.000Z","formattedDate":"November 22, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":0.895,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-11-22-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-11-22-ledger"},"nextItem":{"title":"Initial CIP 1694 Security Analysis and Responses","permalink":"/cardano-updates/2023-11-20-cip1694"}},"content":"## High level overview\\n\\n\\nThis week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer.\\n\\nFinally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release.\\n\\n## Low level overview\\n- Completed the issue **Prototype a P2P relay with `libp2p`** [#1326](https://github.com/input-output-hk/mithril/issues/1326)\\n- Worked on the issue **Enhance aggregator REST API performances** [#1327](https://github.com/input-output-hk/mithril/issues/1327)\\n- Worked on the issue **Signer runtime is stuck for some SPO** [#1312](https://github.com/input-output-hk/mithril/issues/1312)\\n- Completed the issue **Manually deploy a test Mithril network** [#1356](https://github.com/input-output-hk/mithril/issues/1356)\\n- Completed the issue **Make Cardano node version custom in CI/CD** [#1355](https://github.com/input-output-hk/mithril/issues/1355)\\n- Worked on the issue **Support P2P relay in infrastructure** [#1361](https://github.com/input-output-hk/mithril/issues/1361)\\n- Completed the issue **mithril-client fails to extract archive** [#1352](https://github.com/input-output-hk/mithril/issues/1352)"},{"id":"2023-11-20-cip1694","metadata":{"permalink":"/cardano-updates/2023-11-20-cip1694","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-20-cip1694.md","source":"@site/blog/2023-11-20-cip1694.md","title":"Initial CIP 1694 Security Analysis and Responses","description":"High level summary","date":"2023-11-20T00:00:00.000Z","formattedDate":"November 20, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"},{"label":"cip1694","permalink":"/cardano-updates/tags/cip-1694"},{"label":"security","permalink":"/cardano-updates/tags/security"}],"readingTime":5.345,"hasTruncateMarker":false,"authors":[{"name":"Kevin Hammond","title":"Head of Software Engineering, Cardano Core","url":"https://github.com/kevinhammond","imageURL":"https://github.com/kevinhammond.png","key":"kevinhammond"}],"frontMatter":{"title":"Initial CIP 1694 Security Analysis and Responses","slug":"2023-11-20-cip1694","authors":"kevinhammond","tags":["ledger","cip1694","security"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-22-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-11-17-hydra"}},"content":"## High level summary\\n\\nWe have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.\\n\\n## Initial CIP-1694 Security Analysis and Responses\\n\\n### Section: The constitutional committee\\n\\n---\\n\\n- \u201cFor example, if we consider the hypothetical Constitution rule \\"The Cardano network must always be able to produce new blocks\\" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.\\n\\nThere is a \'guardrails document\' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.\\n\\n---\\n\\n### Section: Size of the constitutional committee\\n\\n---\\n\\n- A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.\\n\\nThanks. Yes, we\u2019ve been thinking about this issue for a long time, see for example the section \u2018Final safety measure, post bootstrapping\u2019. We don\u2019t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps\\n\\n---\\n\\n### Section: Terms\\n\\n---\\n\\n- The following sentence is a bit awkward to read: \u201cFor example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.\u201d \u2014> Suggestion: \u201cFor example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.\u201d \\n\\nThanks. Yes, that suggestion is a bit easier to read.\\n\\n---\\n\\n### Section: Registered DReps\\n\\n---\\n\\n- \u201cAdditionally, registered DReps will need to vote regularly to still be considered active.\u201d - There is a minor issue with requiring \u201cvoting regularly\u201d. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).\\n\\nThanks. We\u2019ve added a mechanism to prevent that issue in the spec/code where if there\u2019s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.\\n\\n---\\n\\n### Section: Ratification\\n\\n---\\n\\n- It is a bit unclear why protocol changes: network group and technical group are two separate groups.\\n \\nThese correspond exactly to the groups that are administered by the Parameter Committee.\\n\\n---\\n\\n- I didn\u2019t understand the rationale for requiring 100% \u201cYes\u201d votes to pass \u201cInfo\u201d type governance actions? It seems they have the least potential to harm the system.\\n\\nYes, it\u2019s not about harming the system, since `Info` \\nactions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action. \\n\\nOnce an action is enacted it\u2019s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.\\n\\n---\\n\\n### Section: Content\\n\\n---\\n\\n- For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.\\n\\nProtocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.\\n\\n---\\n\\n### Section: Protocol Parameter groups\\n\\n---\\n\\n- It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.\\n\\nThese are existing protocol parameters, described in e.g. [https://cips.cardano.org/cips/cip9/](https://docs.cardano.org/explore-cardano/parameter-guide/#:~:text=Protocol%20parameters%20on%20Cardano%20are,to%20changing%20conditions%20over%20time.)9 or [The Cardano Protocol Parameters Guide](https://docs.cardano.org/explore-cardano/parameter-guide/#:~:text=Protocol%20parameters%20on%20Cardano%20are,to%20changing%20conditions%20over%20time.).\\n\\n\\n---\\n\\n- With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories. \\n\\nAll of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.\\n\\n---\\n\\n### Section: Votes\\n\\n---\\n\\n- Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?\\n\\nThey may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don\u2019t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.\\n\\n---\\n\\n\\n### Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes\\n\\n---\\n\\n- It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.\\n\\nThere is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.\\n\\n---\\n\\n### Section: Changes post Edinburgh workshop (July 2023)\\n\\n---\\n\\n- \u201cAll governance actions are enacted one epoch after they are ratified.\u201d - I\u2019m not sure if this line is currently in the main body of the CIP?\\n\\nIt is, but it is phrased differently: \u2018All governance actions are enacted on the epoch boundary after their ratification.\u2019\\n\\n---\\n\\n### Section: Reduced deposits for some government actions\\n\\n---\\n\\n- Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.\\n\\nIndeed. We have no plans for this at the moment."},{"id":"2023-11-17-hydra","metadata":{"permalink":"/cardano-updates/2023-11-17-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-17-hydra.md","source":"@site/blog/2023-11-17-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-11-17T00:00:00.000Z","formattedDate":"November 17, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.135,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-11-17-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Initial CIP 1694 Security Analysis and Responses","permalink":"/cardano-updates/2023-11-20-cip1694"},"nextItem":{"title":"Performance & Tracing Update","permalink":"/cardano-updates/2023-11-17-performance-and-tracing"}},"content":"## High-level summary\\n\\nThis week, the Hydra team made several impactful updates. They addressed\\nmisleading errors regarding collect com transactions, resolved a security\\nadvisory (CVE-2023-42806), and simplified the Hydra Head protocol by using\\ninline datums. The team also tackled minor inconsistencies in specifications and\\nimplementation, documented reasons for potentially dropped close transactions by\\nthe cardano-node, and collaborated with SundaeLabs on an offline mode for\\n`hydra-node`. Additionally, they engaged in discussions with researchers about\\nincremental de-/commits.\\n\\n## What did the team achieve this week\\n\\n- Removed misleading errors about collect com transactions [#839](https://github.com/input-output-hk/hydra/issues/839)\\n- Addressed security advisory [CVE-2023-42806](https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq) in PR [#1161](https://github.com/input-output-hk/hydra/pull/1161)\\n- Changed the head protocol to use inline datums, simplifying things in the hydra-node [#1162](https://github.com/input-output-hk/hydra/pull/1162)\\n- Addressed minor inconsistencies in spec and implementation [#1104](https://github.com/input-output-hk/hydra/issues/1104)\\n- Documented why close transacations might be dropped by the cardano-node (can’t fix) [#1039](https://github.com/input-output-hk/hydra/issues/1039)\\n- Tidy up a few things here and there\\n- Worked with SundaeLabs on the offline mode for `hydra-node`\\n- Discussed incremental de-/commits with researchers\\n\\n## What are the goals of next week\\n\\n- Start work on incremental decommits protocol specification [#1057](https://github.com/input-output-hk/hydra/issues/1057)\\n- Provide support to Hypix\\n- Address all [open bugs](https://github.com/input-output-hk/hydra/labels/bug%20%3Abug%3A)\\n- Release version 0.14.0 with [this scope](https://github.com/input-output-hk/hydra/milestone/14?closed=1)\\n- Update dependencies to prepare for Conway [#1114](https://github.com/input-output-hk/hydra/issues/1114)\\n- Shepherd off-line mode PR over the finish line\\n- Complete tidying up chain layer via stateless observation changes in hydra-node [#1096](https://github.com/input-output-hk/hydra/issues/1096)"},{"id":"2023-11-17-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-11-17-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-17-performance-and-tracing.md","source":"@site/blog/2023-11-17-performance-and-tracing.md","title":"Performance & Tracing Update","description":"High level summary","date":"2023-11-17T00:00:00.000Z","formattedDate":"November 17, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.585,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & Tracing Update","slug":"2023-11-17-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-11-17-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-11-16-network"}},"content":"## High level summary\\n\\n* Benchmarking: Release benchmarking for node `8.6.0` as well as benchmarks scrutinizing GHC versions and the new tracing system.\\n* Development: PlutusV3 capability of our workload generator has been implemented.\\n* Tracing: First round of optimization of the `cardano-tracer` service has completed, awaiting validation.\\n* Nomad backend: A significant PR has landed addressing automation features and debugging capabilites.\\n* Workbench: Configurable remote environments and improvements to run documentation have been merged to `master`.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nWe\'ve performed and analyzed a full set of benchmarks for node `8.6.0`, both in comparison to recent release tags\\nand mainnet version `8.1.2`. A lot of development work has entered the system since then, so it is crucial\\nwe can rule out any potential performance risks for the next mainnet release. \\n\\nAdditionally, we\'ve been benchmarking GHC9.6.3 builds of `cardano-node`. Overall, we\'ve observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we\'ve seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform. \\n\\nA last set of benchmarks was dedicated to the new tracing system with node `8.6.0`. We were able to show that\\nthere is no performance risk to enabling the new system, even when forwarding all trace messages to a `cardano-tracer`\\nservice on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression.\\n\\n### Development\\n\\nFor future benchmarks to be built around PlutusV3, we\'ve equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes\\nto the execution budgets by developing specialized workloads.\\n\\n### Tracing\\n\\nThe `cardano-tracer` service has received its first batch of optimizations. Profiling output is promising; to measure\\nperformance for a long service run time, we\'re currently equipping the service binary with the same capability to\\nemit regular resource traces as `cardano-node`. Analysis of those will be the basis for validating this and possible future optimization efforts.\\n\\n### Nomad backend\\n\\nMany improvements for the nomad backend have been implemented and merged to `master`. This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service,\\nmore detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables\\nour team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred.\\n\\n### Workbench\\n\\nOur performance workbench has seen upgrades in documenting and reporting `cardano-node` builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler.\\nWhen alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential. \\n\\nFurthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance."},{"id":"2023-11-16-network","metadata":{"permalink":"/cardano-updates/2023-11-16-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-16-network.md","source":"@site/blog/2023-11-16-network.md","title":"Network Team Update","description":"High-level overview of sprint 48","date":"2023-11-16T00:00:00.000Z","formattedDate":"November 16, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":0.545,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-11-16-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & Tracing Update","permalink":"/cardano-updates/2023-11-17-performance-and-tracing"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-11-15-consensus"}},"content":"## High-level overview of [sprint 48][sprint-48]\\n\\n### Bootstrap Peers\\n\\nWe continued reviewing bootstrap peers, [ouroboros-network#4555].\\n\\n### IOClasses / IOSim\\n\\nWe prepared slides for a Haskell meetup were we presented a talk on `IOSimPOR`.\\nThe recording will be availble on `YouTube`.\\n\\nWe also used the opportunity to do some refactoring of the `IOSim` code base: [io-sim#117].\\nWe released `io-sim-1.3.0.0` on `Hackage`: [io-sim#119].\\n\\nWe also added `forkFinally` to `MonadFork` (not included in `1.3.0.0` release): [io-sim#123].\\n\\n### Tech debt\\n\\nWe refactored `Resource` used by the DNS subsystem: [ouroboros-network#4707].\\nWe continued reviewing the [ouroboros-network#4625] PR, which refactors\\n`RootPeersDNS` module.\\n\\n[io-sim#117]: https://github.com/input-output-hk/io-sim/pull/117\\n[io-sim#119]: https://github.com/input-output-hk/io-sim/pull/119\\n[io-sim#123]: https://github.com/input-output-hk/io-sim/pull/123\\n[ouroboros-network#4555]: https://github.com/input-output-hk/ouroboros-network/pull/4555\\n[ouroboros-network#4625]: https://github.com/input-output-hk/ouroboros-network/pull/4625\\n[ouroboros-network#4707]: https://github.com/input-output-hk/ouroboros-network/pull/4707\\n[sprint-48]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+48%22"},{"id":"2023-11-15-consensus","metadata":{"permalink":"/cardano-updates/2023-11-15-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-15-consensus.md","source":"@site/blog/2023-11-15-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-11-15T00:00:00.000Z","formattedDate":"November 15, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.34,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-11-15-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-11-16-network"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-15-mithril"}},"content":"## High level summary\\n\\nOver the last two weeks, we managed to run a UTxO-HD capable node in _legacy mode_, which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does).\\nThis _legacy mode_ could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not.\\nHowever, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter.\\nOn the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node.\\nTherefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend.\\n\\nOn the Genesis front, we reviewed the [peer simulator](https://github.com/input-output-hk/ouroboros-consensus/pull/434) for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team.\\n\\nWe also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos.\\n\\n[Javier Sagredo](https://github.com/jasagredo) continues his cycle as release engineer, and he is working on version 8.7 of Cardano node."},{"id":"2023-11-15-mithril","metadata":{"permalink":"/cardano-updates/2023-11-15-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-15-mithril.md","source":"@site/blog/2023-11-15-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-11-15T00:00:00.000Z","formattedDate":"November 15, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":0.92,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-11-15-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-11-15-consensus"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-11-14-node-cli-api"}},"content":"## High level overview\\n\\nThis week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files.\\n\\nFinally, they continued addressing some performance issue associated with the \'release-mainnet\' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation.\\n\\n## Low level overview\\n- Worked on the issue **Prototype a P2P relay with `libp2p`** [#1300](https://github.com/input-output-hk/mithril/issues/1300)\\n- Completed the issue **Light Wallet: Release `mithril-client` library** [#1311](https://github.com/input-output-hk/mithril/issues/1311)\\n- Completed the issue **Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC** [#1283](https://github.com/input-output-hk/mithril/issues/1283)\\n- Completed the issue **`release-mainnet` aggregator is unreachable** [#1310](https://github.com/input-output-hk/mithril/issues/1310)\\n- Completed the issue **Fix certificate hashes re-computation in aggregator** [#1343](https://github.com/input-output-hk/mithril/issues/1343)\\n- Completed the issue **Remove `unstable` tag in `unstable` release** [#1235](https://github.com/input-output-hk/mithril/issues/1235)\\n- Worked on the issue **Enhance aggregator REST API performances** [#1327](https://github.com/input-output-hk/mithril/issues/1327)\\n- Worked on the issue **Signer runtime is stuck for some SPO** [#1312](https://github.com/input-output-hk/mithril/issues/1312)"},{"id":"2023-11-14-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-11-14-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-14-node-cli-api.md","source":"@site/blog/2023-11-14-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-11-14T00:00:00.000Z","formattedDate":"November 14, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.155,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-11-14-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-15-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-11-10-hydra"}},"content":"# 2023-11-01 - 2023-11-14\\n\\n## High level summary\\n\\nCARDANO-NODE\\n- [Pre-release of Cardano Node 8.6.0-pre](https://github.com/input-output-hk/cardano-node/releases/tag/8.6.0-pre)\\n\\nCARDANO-CLI\\n- Improve golden tests\\n- Clean-up of conway era commands\\n\\n### cardano-cli\\n- [Replace usages of assertFileOccurences (6/6)](https://github.com/input-output-hk/cardano-cli/pull/451)\\n- [Replace usages of assertFileOccurences (5/6)](https://github.com/input-output-hk/cardano-cli/pull/448)\\n- [Replace usages of assertFileOccurences by usage of new functions \u2728 (4/n)](https://github.com/input-output-hk/cardano-cli/pull/444)\\n- [put n shelley/byron key witnesses arguments in correct order](https://github.com/input-output-hk/cardano-cli/pull/443)\\n- [Replace usages of assertFileOccurences by comparisons with golden files (3/n)](https://github.com/input-output-hk/cardano-cli/pull/441)\\n- [Replace usages of assertFileOccurences by comparisons with golden files (2/n)](https://github.com/input-output-hk/cardano-cli/pull/436)\\n- [Update to `cardano-8.31.0.0`](https://github.com/input-output-hk/cardano-cli/pull/435)\\n- [Remove remaining uses of `IsCardanoEra`](https://github.com/input-output-hk/cardano-cli/pull/434)\\n- [Release 8.14.0.0](https://github.com/input-output-hk/cardano-cli/pull/432)\\n- [Upgrade cardano-api to 8.30](https://github.com/input-output-hk/cardano-cli/pull/430)\\n- [Command types for `node` commands](https://github.com/input-output-hk/cardano-cli/pull/428)\\n- [Split governance `MIRTransferConstructor`](https://github.com/input-output-hk/cardano-cli/pull/427)\\n- [Replace usages of assertFileOccurences by comparisons with golden files (1/n)](https://github.com/input-output-hk/cardano-cli/pull/426)\\n- [Command argument types for `drep` commands](https://github.com/input-output-hk/cardano-cli/pull/425)\\n- [Add golden test for `governance action create-no-confidence`](https://github.com/input-output-hk/cardano-cli/pull/421)\\n- [Command arguments types for stake-pool commands](https://github.com/input-output-hk/cardano-cli/pull/419)\\n\\n\\n### cardano-api\\n- [New version `cardano-api-8.31.0.0`](https://github.com/input-output-hk/cardano-api/pull/364)\\n- [Use ledger presentation of multi-asset values directly. Lens to make this uniform over `ShelleyBasedEra`](https://github.com/input-output-hk/cardano-api/pull/360)\\n- [Protocol version change is not common to all versions anymore](https://github.com/input-output-hk/cardano-api/pull/358)\\n- [Delete `ByronAndAllegraEraOnwards`](https://github.com/input-output-hk/cardano-api/pull/355)\\n- [Replace `IsCardanoEra` and `IsShelleyBasedEra` contraints in GADT constructors with `Typeable`](https://github.com/input-output-hk/cardano-api/pull/354)\\n- [Modify foldBlocks to recurse on ledger events ](https://github.com/input-output-hk/cardano-api/pull/353)\\n- [Add generators for `EraBasedProtocolParametersUpdate`](https://github.com/input-output-hk/cardano-api/pull/352)\\n- [New version `cardano-api-8.30.0.0`](https://github.com/input-output-hk/cardano-api/pull/351)\\n\\n### cardano-node\\n- [Pre-release of Cardano Node 8.6.0-pre](https://github.com/input-output-hk/cardano-node/releases/tag/8.6.0-pre)\\n- - [cardano-node: use ouroboros-network-protocols-0.5.2](https://github.com/input-output-hk/cardano-node/pull/5525)\\n\\n\\n### cardano-testnet\\n\\n### docs\\n\\n### CI & project maintenance"},{"id":"2023-11-10-hydra","metadata":{"permalink":"/cardano-updates/2023-11-10-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-10-hydra.md","source":"@site/blog/2023-11-10-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-11-10T00:00:00.000Z","formattedDate":"November 10, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.65,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-11-10-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-11-14-node-cli-api"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-11-10-sre"}},"content":"### High-level summary\\n\\nThe last two weeks, the Hydra team achieved several milestones. They published\\nthe monthly report for October, providing updates on project developments. The\\nteam delivered a presentation and workshop at the Cardano Summit, contributing\\nto community engagement. They implemented a \\\\\\"dirt road\\\\\\" solution for the\\n\\\\\\"Ignored init tx\\\\\\" notification and moved the `hydra-poll` example project to a\\ndedicated repository. Additionally, the team built a `hydra-chain-observer` tool\\nfor Hydra Heads, updated the toolchain to GHC 9.6.3, and made various\\nimprovements to tooling and code formatting. They addressed specific issues,\\nsuch as fixing the `gen-hydra-keys` command and resolving concerns with the\\nrewritten `hydra-tui`. The team also enhanced the `hydra-cluster` smoke test\\nsuite by fetching network configurations dynamically. Lastly, they actively\\nreviewed pull requests and architectural decision records from the community,\\nincluding contributions from SundaeSwap. An experiment, the Hydra tally, was\\ncompleted and successfully deployed to the mainnet by the Cardano Foundation.\\n\\n### What did the team achieve this week\\n\\n- Published the monthly [report for\\n october](https://hydra.family/head-protocol/monthly/2023-10)\\n- Given a presentation / workshop at the Cardano summit\\n [#1109](https://github.com/input-output-hk/hydra/issues/1109)\\n- Dirt road implementation for \\\\\\"Ignored init tx\\\\\\" notification\\n [#529](https://github.com/input-output-hk/hydra/issues/529) (without\\n stateless observation)\\n- Completed and moved `hydra-poll` example project into a\\n dedicated\\n [repository](https://github.com/cardano-scaling/hydra-poll)\\n- Built a first version of a chain observation tool for Hydra Heads\\n [#1096](https://github.com/input-output-hk/hydra/issues/1096)\\n- Switched toolchain to GHC 9.6.3 and various improvements on tooling\\n and code formatting\\n [#1135](https://github.com/input-output-hk/hydra/pull/1135)\\n [#1152](https://github.com/input-output-hk/hydra/pull/1152)\\n [#1151](https://github.com/input-output-hk/hydra/pull/1151)\\n [#1154](https://github.com/input-output-hk/hydra/pull/1154)\\n- Fix `gen-hydra-keys` command to not overwrite existing\\n keys [#1136](https://github.com/input-output-hk/hydra/issues/1136)\\n- Fixed the rewritten `hydra-tui`\\n [#1113](https://github.com/input-output-hk/hydra/issues/1113)\\n [#1137](https://github.com/input-output-hk/hydra/issues/1137)\\n- Fetch network configurations instead of packaging them into\\n hydra-cluster (smoke) test suite\\n [#1156](https://github.com/input-output-hk/hydra/pull/1156)\\n- Reviewing PRs and ADRs from the community (SundaeSwap)\\n [#1118](https://github.com/input-output-hk/hydra/pull/1118)\\n [#1157](https://github.com/input-output-hk/hydra/pull/1157)\\n- Hydra tally experiment (Cardano Foundation) deployed to mainnet\\n\\n### What are the goals of next week\\n\\n- Tackle reported bugs\\n- Shepherd contributed off-line mode PR to the main codeline\\n- Improve chain observation tool to include more data and refactor\\n existing code towards more stateless observation\\n- Start work on incremental decommits"},{"id":"2023-11-10-sre","metadata":{"permalink":"/cardano-updates/2023-11-10-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-10-sre.md","source":"@site/blog/2023-11-10-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-11-10T00:00:00.000Z","formattedDate":"November 10, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":2.225,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-11-10-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-11-10-hydra"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-11-09-db-sync"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent changes, updates or improvements include:\\n* Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the [cardano-playground](https://github.com/input-output-hk/cardano-playground) stack\\n\\n## Lower level summary\\n\\n### Capkgs\\n* Minor bug fix and db-sync sanchonet package update: [capkgs-compare](https://github.com/input-output-hk/capkgs/compare/b1f1cbd...994696f)\\n\\n### Cardano-parts\\n* General migration support PR for cardano-world to cardano-playground [cardano-parts-pull-18](https://github.com/input-output-hk/cardano-parts/pull/18)\\n * Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground\\n * Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes\\n * Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains\\n * The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state\\n * The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable\\n * Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0\\n * For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true\\n * Template updates include:\\n * Adds optional TF AZ declaration on ec2 resources\\n * Adds a cardano node p2p dashboard to the grafana cloud stack\\n * Adds a dbsync pool performance analysis query\\n * Updates python distribute and delegation scripts from world for playground compatibility\\n * Starts a python script lib to reduce shared code among the python scripts\\n * Several justfile improvements and new recipes\\n * More detail is available in the PR description\\n* Update submit action script for 8.6 [cardano-parts-pull-19](https://github.com/input-output-hk/cardano-parts/pull/19)\\n* Update scripts for 8.6.0-pre [cardano-parts-pull-21](https://github.com/input-output-hk/cardano-parts/pull/21)\\n * Fixes subcommand names based on ERA_CMD\\n * Adds deposits to some commands\\n * Separates CC cold/hot key generation as host authorization has to occur after action is approved\\n * CC voting enabled in vote job\\n\\n### Cardano-playground\\n* Migration PR to largely complete the network migration from cardano-world to cardano-playground: [cardano-playground-pull-5](https://github.com/input-output-hk/cardano-playground/pull/5)\\n * Adds re-spun private chain network\\n * Migrates shelley-qa chain network from world\\n * Justfile improvements and new recipes\\n * Improve concurrent environment chain support\\n * More detail is available in the PR description\\n\\n### Iohk-nix\\n* Migration to play: [iohk-nix-pull-561](https://github.com/input-output-hk/iohk-nix/pull/561)\\n * Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org\\n * Remove deprecated cardano-lib p2p network environment\\n * Update sanchonet chain with respin changes\\n * Update private chain with respin changes\\n * Bump private and shelley-qa chains to sanchonet equivalent conway genesis\\n * Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing\\n\\n### Sanchonet-demo\\n* Update for cardano-node 8.6.0-pre demo: [sanchonet-demo-commit](https://github.com/input-output-hk/sanchonet-demo/commit/b54da94057ac0949421918208fd04795d029447d)"},{"id":"2023-11-09-db-sync","metadata":{"permalink":"/cardano-updates/2023-11-09-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-09-db-sync.md","source":"@site/blog/2023-11-09-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-11-09T00:00:00.000Z","formattedDate":"November 9, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.485,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-11-09-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-11-10-sre"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-11-08-ledger"}},"content":"## High level summary\\nWe have created new tag `sancho-2-2-0`, which integrates missing Conway feautures and some minor fix\\ntags `sancho-2-1-0`, `sancho-2-0-1`.\\nWe have completed the initial implementation for the bootstrap instance objective.\\n\\n## Lower level summary\\n- Add a new `--disable-gov` flag which disabled Conway ferautures\\n[#1558](https://github.com/input-output-hk/cardano-db-sync/pull/1558)\\n- Fix of the committee key size\\n[#1544](https://github.com/input-output-hk/cardano-db-sync/pull/1544)\\n- Workaround a ledger issue with unregistered pools\\n[#1542](https://github.com/input-output-hk/cardano-db-sync/pull/1542)\\n- Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs\\n[#1539](https://github.com/input-output-hk/cardano-db-sync/pull/1539)\\n- Rename offline to offchain\\n[#1533](https://github.com/input-output-hk/cardano-db-sync/pull/1533)\\n- Transfer existing tests to Conway era\\n[#1529](https://github.com/input-output-hk/cardano-db-sync/pull/1529)\\n[#1547](https://github.com/input-output-hk/cardano-db-sync/pull/1547)"},{"id":"2023-11-08-ledger","metadata":{"permalink":"/cardano-updates/2023-11-08-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-08-ledger.md","source":"@site/blog/2023-11-08-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-11-08T00:00:00.000Z","formattedDate":"November 8, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.685,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-11-08-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-11-09-db-sync"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-08-mithril"}},"content":"## High level summary\\n\\nThis update contains mostly improvements to quality of Conway era implementation and\\ntooling that we use for testing Ledger. Major Conway bugs that were discovered and\\nsquashed are:\\n\\n* PParamsUpdate proposals will now correctly use DRep thresholds for ratification\\n* Treasury withdrawals are now properly enacted.\\n* Corrected snapshotting and DRep Stake Distribution Pulser initialization\\n* Delegation to non-existent Stake pool is no longer possible\\n\\nOther important quality of life improvements are addition of reusable interfaces for an\\nordered set `OSet` and ordered map `OMap`. Which allowed us to disable duplicate\\ncertificates and proposals in a transaction. As a precursor to `PlutusV3` integration, a\\nserious reorganization of Plutus related functionality was performed.\\n\\nConway related additions that are noteworthy: Conway Ledger events, disallowing voting on\\nexpired proposals, addition of Anchor to Constitutional Committee resignation proposals.\\n\\nSignificant improvements have been made to a specialized \\"Imp\\" test library that allows us\\nwriting concise stateful unit tests for verifying the Ledger logic. Serious progress has\\nbeen made on the conformance testing, where we can now interface with Haskell generated\\ncode from the Agda specification. Serialization testing has been extended to increase\\nbinary conformance coverage.\\n\\n\\n## Low level summary\\n\\n### Conway\\n\\n* [pull-3808] - Enhance `CommitteeMembersState` query to return quorum and NoConfidence\\n* [pull-3801] - Fix epoch rule and tests\\n* [pull-3803] - Fix delegation validation\\n* [pull-3759] - Reshuffle things to the DRepPulser incorporates some snap shot things\\n* [pull-3779] - Prevent duplicate certs and proposals\\n* [pull-3794] - Added anchor to resign certs\\n* [pull-3797] - Cleanup JSON instances for Conway governance\\n* [pull-3848] - Plutus modules restructure\\n* [pull-3840] - Fix anomalies in Deposits in the Conway Era\\n* [pull-3856] - Add governance related ledger events\\n* [pull-3825] - Prevent voting on expired GovActions\\n* [pull-3831] - Treasury withdrawal fix\\n* [pull-3791] - Use a Data.OMap.Strict to replace ProposalsSnapshot\\n* [pull-3836] - PParamsUpdate enactment fix\\n* [pull-3846] - Revert argument order swap.\\n\\n### Testing\\n\\n* [pull-3782] - Move `ImpTest` to Shelley testlib\\n* [pull-3842] - Imp improvements\\n* [pull-3844] - Add mappings to Agda types\\n* [pull-3853] - Fix strange assertion failure, which hides real Block too big problem.\\n* [pull-3809] - CDDL roundtrip testing\\n* [pull-3832] - Treasury withdrawals tests\\n* [pull-3839] - Added `cardano-ledger-conformance`\\n* [pull-3841] - Add `sha256` to `cardano-ledger-executable-spec`\\n\\n### Improvements and releasing\\n\\n* [pull-3843] - Add ...WithLogs versions of evalScripts and friends\\n* [pull-3795] - Bump plutus to 1.15\\n* [pull-3798] - Bump urllib3 from 1.26.17 to 1.26.18 in /doc\\n* [pull-3799] - Changes needed for 8.6 release\\n* [pull-3807] - Add invalidBeforeL and invalidHereAfterL functions\\n* [pull-3819] - Fixups needed for a release\\n* [pull-3829] - Post release CHANGELOG version bumps\\n* [pull-3830] - Bump aeson to 2.2\\n* [pull-3833] - Backport release cardano-ledger-conway-1.10.1.0\\n* [pull-3828] - Add changelog for node release 8.6\\n\\n[pull-3759]: https://github.com/input-output-hk/cardano-ledger/pull/3759\\n[pull-3795]: https://github.com/input-output-hk/cardano-ledger/pull/3795\\n[pull-3794]: https://github.com/input-output-hk/cardano-ledger/pull/3794\\n[pull-3798]: https://github.com/input-output-hk/cardano-ledger/pull/3798\\n[pull-3797]: https://github.com/input-output-hk/cardano-ledger/pull/3797\\n[pull-3782]: https://github.com/input-output-hk/cardano-ledger/pull/3782\\n[pull-3779]: https://github.com/input-output-hk/cardano-ledger/pull/3779\\n[pull-3801]: https://github.com/input-output-hk/cardano-ledger/pull/3801\\n[pull-3803]: https://github.com/input-output-hk/cardano-ledger/pull/3803\\n[pull-3799]: https://github.com/input-output-hk/cardano-ledger/pull/3799\\n[pull-3808]: https://github.com/input-output-hk/cardano-ledger/pull/3808\\n[pull-3807]: https://github.com/input-output-hk/cardano-ledger/pull/3807\\n[pull-3819]: https://github.com/input-output-hk/cardano-ledger/pull/3819\\n[pull-3809]: https://github.com/input-output-hk/cardano-ledger/pull/3809\\n[pull-3825]: https://github.com/input-output-hk/cardano-ledger/pull/3825\\n[pull-3829]: https://github.com/input-output-hk/cardano-ledger/pull/3829\\n[pull-3830]: https://github.com/input-output-hk/cardano-ledger/pull/3830\\n[pull-3833]: https://github.com/input-output-hk/cardano-ledger/pull/3833\\n[pull-3831]: https://github.com/input-output-hk/cardano-ledger/pull/3831\\n[pull-3832]: https://github.com/input-output-hk/cardano-ledger/pull/3832\\n[pull-3839]: https://github.com/input-output-hk/cardano-ledger/pull/3839\\n[pull-3791]: https://github.com/input-output-hk/cardano-ledger/pull/3791\\n[pull-3841]: https://github.com/input-output-hk/cardano-ledger/pull/3841\\n[pull-3828]: https://github.com/input-output-hk/cardano-ledger/pull/3828\\n[pull-3836]: https://github.com/input-output-hk/cardano-ledger/pull/3836\\n[pull-3846]: https://github.com/input-output-hk/cardano-ledger/pull/3846\\n[pull-3842]: https://github.com/input-output-hk/cardano-ledger/pull/3842\\n[pull-3843]: https://github.com/input-output-hk/cardano-ledger/pull/3843\\n[pull-3844]: https://github.com/input-output-hk/cardano-ledger/pull/3844\\n[pull-3853]: https://github.com/input-output-hk/cardano-ledger/pull/3853\\n[pull-3848]: https://github.com/input-output-hk/cardano-ledger/pull/3848\\n[pull-3840]: https://github.com/input-output-hk/cardano-ledger/pull/3840\\n[pull-3856]: https://github.com/input-output-hk/cardano-ledger/pull/3856"},{"id":"2023-11-08-mithril","metadata":{"permalink":"/cardano-updates/2023-11-08-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-08-mithril.md","source":"@site/blog/2023-11-08-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-11-08T00:00:00.000Z","formattedDate":"November 8, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":0.805,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-11-08-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-11-08-ledger"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-11-01-consensus"}},"content":"## High level overview\\n\\nThis week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files.\\n\\nFinally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the \'release-mainnet\' aggregator.\\n\\n## Low level overview\\n- Worked on the issue **Prototype a P2P relay with `libp2p`** [#1300](https://github.com/input-output-hk/mithril/issues/1300)\\n- Worked on the issue **Light Wallet: Release `mithril-client` library** [#1311](https://github.com/input-output-hk/mithril/issues/1311)\\n- Worked on the issue **Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC** [#1283](https://github.com/input-output-hk/mithril/issues/1283)\\n- Worked on the issue **`release-mainnet` aggregator is unreachable** [#1310](https://github.com/input-output-hk/mithril/issues/1310)\\n- Completed the issue **Client Docker package is incorrect** [#1322](https://github.com/input-output-hk/mithril/issues/1322)"},{"id":"2023-11-01-consensus","metadata":{"permalink":"/cardano-updates/2023-11-01-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-01-consensus.md","source":"@site/blog/2023-11-01-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-11-01T00:00:00.000Z","formattedDate":"November 1, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.44,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-11-01-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-08-mithril"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-01-mithril"}},"content":"## High level summary\\n\\n\\nThis week the Consensus team made progress on two fronts: the question of [survivable eclipse duration](https://github.com/input-output-hk/ouroboros-consensus/pull/422), which is part of our work [supporting Genesis delivery](https://github.com/input-output-hk/ouroboros-consensus/issues/427), and how to [improve the handling of blocks from the future](https://github.com/input-output-hk/ouroboros-network/issues/4251).\\nRegarding the UTxO-HD branch, we managed to run a node with [legacy blocks](https://github.com/input-output-hk/ouroboros-consensus/issues/344), which is syncing with mainnet, up to including Alonzo.\\nWe also [investigated](https://github.com/input-output-hk/ouroboros-consensus/issues/465#issuecomment-1788685122) a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release."},{"id":"2023-11-01-mithril","metadata":{"permalink":"/cardano-updates/2023-11-01-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-01-mithril.md","source":"@site/blog/2023-11-01-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-11-01T00:00:00.000Z","formattedDate":"November 1, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":0.895,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-11-01-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-11-01-consensus"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-27-hydra"}},"content":"## High level overview\\n\\nThis week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the `release-mainnet` aggregator.\\n\\nFinally, they implemented new Docker images that build the Mithril nodes on the \'devnet\' faster and fixed some regressions in the Mithril client CLI.\\n\\n## Low level overview\\n- Worked on the issue **P2P Networking - Proof of Concept** [#1300](https://github.com/input-output-hk/mithril/issues/1300)\\n- Completed the issue **Build `mithril-common` and `mithril-client` in WASM PoC** [#1284](https://github.com/input-output-hk/mithril/issues/1284)\\n- Completed the issue **Fix `devnet` Mithril Docker images** [#1272](https://github.com/input-output-hk/mithril/issues/1272\\n- Worked on the issue **Light Wallet: Release `mithril-client` library** [#1311](https://github.com/input-output-hk/mithril/issues/1311)\\n- Worked on the issue **Compute deterministic Cardano UTxO set PoC** [#1283](https://github.com/input-output-hk/mithril/issues/1283)\\n- Worked on the issue **`release-mainnet` aggregator is unreachable** [#1310](https://github.com/input-output-hk/mithril/issues/1310)\\n- Completed the issue **Client regressions in snapshot list and download** [#1321](https://github.com/input-output-hk/mithril/issues/1321)"},{"id":"2023-10-27-hydra","metadata":{"permalink":"/cardano-updates/2023-10-27-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-hydra.md","source":"@site/blog/2023-10-27-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-10-27T00:00:00.000Z","formattedDate":"October 27, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.895,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-10-27-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-01-mithril"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-10-27-network"}},"content":"### High-level summary\\n\\nThis week, the Hydra team fixed the `gen-hydra-keys` command to avoid\\noverwriting existing keys, and resolved issues related to the rewritten\\n`hydra-tui`. They also worked on a \\\\\\"dirt road\\\\\\" implementation for the\\n\\\\\\"Ignored init tx\\\\\\" notification, improving the robustness of the system.\\n\\nThe team finalized preparations for the Cardano Summit presentation, including\\nimplementation of the `hydra-poll` example DApp.\\n\\nIf you happen to read this and attend the Summit in Dubai, make sure to check\\nout our Masterclass about \\\\\\"Developing Hydra + Mithril for Scaling Cardano\\\\\\" on\\nFriday, November 3 at 14:00-15:30 local time in the \\\\\\"Al Dar\\\\\\" room!\\n\\n### What did the team achieve this week\\n\\n- Fix `gen-hydra-keys` command to not overwrite existing keys\\n [#1136](https://github.com/input-output-hk/hydra/issues/1136)\\n- Fixed the rewritten `hydra-tui`\\n [#1113](https://github.com/input-output-hk/hydra/issues/1113)\\n [#1137](https://github.com/input-output-hk/hydra/issues/1137)\\n- Finalized cardano summit preparation\\n [#1109](https://github.com/input-output-hk/hydra/issues/1109)\\n- Implemented the `hydra-poll` example DApp [link to\\n repository](https://github.com/cardano-scaling/hydra-poll)\\n- Dirt road implementation for \\\\\\"Ignored init tx\\\\\\" notification\\n [#529](https://github.com/input-output-hk/hydra/issues/529)\\n\\n### What are the goals of next week\\n\\n- Attend cardano summit and deliver presentation\\n- Clarify / close user created issues\\n- Build `aarch64-darwin` binaries in CI"},{"id":"2023-10-27-network","metadata":{"permalink":"/cardano-updates/2023-10-27-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-network.md","source":"@site/blog/2023-10-27-network.md","title":"Network Team Update","description":"High-level overview of sprint 47","date":"2023-10-27T00:00:00.000Z","formattedDate":"October 27, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.765,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-10-27-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-27-hydra"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-10-27-sre"}},"content":"## High-level overview of [sprint 47][sprint-47]\\n\\n### Bootstrap Peers\\n\\nWe continued to review the process of bootstrap peers, see [ouroboros-network#4555]\\n\\n### CI / Tests\\n\\nWe investigated our CI issues. We found a memory leak in `typed-protocols`\\nfunction used for testing codecs which triggered out of memory manager (OOM) on\\nsome platforms ([typed-protocols#43]); we also found a bug in the connection manager which resulted in CI\\n`timeouts` (see [connection-manager-fix]). \\n\\n### KeepAlive client\\n\\nWe found two small issues with the keep-alive client, which were addressed\\nby Karl Knutsson ([Cardano Foundation][CF]), [ouroboros-network#4689].\\n\\n### Galois\\n\\nWe merged two large PRs prepared by [Galois]:\\n* [inspect `error` call sites][ouroboros-network#4660]\\n* [implement micro benchmarks for `PeerMetrics`][ouroboros-network#4663]\\n\\n### Cardano Network Service Assurance (CNSA)\\n\\nGalois made the following progress on CNSA:\\n* a simple [InfuxDB] database backend has been added;\\n* the documentation has been updated;\\n* internal improvements to the code;\\n* progress on a new \\"CSNA analysis\\" that provides, for each sampler node, the\\n block download throughput in bytes over time.\\n\\n### New CHaP Release\\n\\nWe cut a new release of `ouroboros-netowrk` packages to `CHaP`: [chap#547]\\n\\n## More details\\n\\n### CI / Tests\\n\\nWe improved the memory footprint of some of our tests by analysing a stream of\\n`IOSim` traces without retaining them, see [ouroboros-network#4696]\\n\\nAs a safety measure, we introduced an upper bound for heap memory used by test\\nartefacts in our `nix` tests. We use `200MB` limit for all tests except for\\n`network-mux` tests which use `350MB` limit, see [ouroboros-network#4702].\\n\\nWe refactored one of our tests to use ephemeral ports thus allowing it to\\nrun concurrently, see [ouroboros-network#4702].\\n\\nWe merged [ouroboros-network#4623] which fixes a bunch of test failures.\\n* [inbound-governor: connection leak][ouroboros-network#4694]\\n* [connection-manager: assertion failure][ouroboros-network#4607]\\n* [not released connection][ouroboros-network#4605]\\n\\nAll of them were due to a bug in test logic rather than a bug in production\\ncode.\\n\\n### Release Process\\n\\nWe updated our release process & associated scripts, see\\n[ouroboros-network#4705].\\n\\n[CF]: https://cardanofoundation.org/\\n[Galois]: https://galois.com/\\n[chap#547]: https://github.com/input-output-hk/cardano-haskell-packages/pull/547\\n[connection-manager-fix]: https://github.com/input-output-hk/ouroboros-network/pull/4696/commits/010d9b2bd76356373d8c139eaedd8aea7ad90680\\n[ouroboros-network#4555]: https://github.com/input-output-hk/ouroboros-network/pull/4555\\n[ouroboros-network#4605]: https://github.com/input-output-hk/ouroboros-network/issues/4605\\n[ouroboros-network#4607]: https://github.com/input-output-hk/ouroboros-network/issues/4607\\n[ouroboros-network#4623]: https://github.com/input-output-hk/ouroboros-network/pull/4623\\n[ouroboros-network#4660]: https://github.com/input-output-hk/ouroboros-network/issues/4660\\n[ouroboros-network#4663]: https://github.com/input-output-hk/ouroboros-network/issues/4663\\n[ouroboros-network#4689]: https://github.com/input-output-hk/ouroboros-network/issues/4689\\n[ouroboros-network#4694]: https://github.com/input-output-hk/ouroboros-network/issues/4694\\n[ouroboros-network#4696]: https://github.com/input-output-hk/ouroboros-network/pull/4696\\n[ouroboros-network#4702]: https://github.com/input-output-hk/ouroboros-network/pull/4702\\n[ouroboros-network#4705]: https://github.com/input-output-hk/ouroboros-network/pull/4705\\n[sprint-47]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+47%22\\n[typed-protocols#43]: https://github.com/input-output-hk/typed-protocols/pull/43\\n[InfluxDB]: https://www.influxdata.com/"},{"id":"2023-10-27-sre","metadata":{"permalink":"/cardano-updates/2023-10-27-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-sre.md","source":"@site/blog/2023-10-27-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-10-27T00:00:00.000Z","formattedDate":"October 27, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":1.405,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-10-27-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-10-27-network"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-25-mithril"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent changes, updates or improvements include:\\n* Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the [cardano-playground](https://github.com/input-output-hk/cardano-playground) stack\\n\\n## Lower level summary\\n\\n### Capkgs\\n* Adds offchain-metadata-tools, dbsync sanchonet updates: [capkgs-compare](https://github.com/input-output-hk/capkgs/compare/b197e22...b1f1cbd)\\n\\n### Cardano-parts\\n* General package updates, modules improvements and template recipes to support network migration from world to playground [cardano-parts-pull-17](https://github.com/input-output-hk/cardano-parts/pull/17)\\n * Bumps cardano-db-sync-ng to sancho-2-0-0 tag\\n * Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play\\n * Adds more machine system bins and devShell bins for scripting and debug purposes\\n * Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module\\n * Adds profile-cardano-node-topology module for a simplified interface to most common topology needs\\n * Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs\\n * Adds a topology function to filter self from group machines with an allowList for matching infixes\\n * Adds metadata-server and related offchain-metadata-tools bins from capkgs\\n * Updates justfile template with:\\n * a new query-all recipe for getting status of multiple concurrent running environments\\n * a new set-default-cardano-env recipe for fast switching between environments\\n * a new start-demo recipe for forking a custom env into conway\\n * a new start-node recipe for generic environment start\\n * a new stop-node recipe for generic environment stop\\n * updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions\\n * updated query-tip recipe to a generic query tip compatible with each environment\\n\\n### Cardano-playground\\n* Migrates sanchonet from world, prepares further migration and support automation: [cardano-playground-pull-4](https://github.com/input-output-hk/cardano-playground/pull/4)"},{"id":"2023-10-25-mithril","metadata":{"permalink":"/cardano-updates/2023-10-25-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-25-mithril.md","source":"@site/blog/2023-10-25-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-10-25T00:00:00.000Z","formattedDate":"October 25, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.125,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-10-25-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-10-27-sre"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-10-24-node-cli-api"}},"content":"## High level overview\\n\\nThis week, the Mithril team released a new distribution [`2342.0`](https://github.com/input-output-hk/mithril/releases/tag/2342.0). This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes.\\n\\nThey also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files. \\n\\nFinally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the `release-mainnet` aggregator, and enhanced the Mithril explorer UI.\\n\\n## Low level overview\\n- Worked on the issue **P2P Networking - Proof of Concept** [#1300](https://github.com/input-output-hk/mithril/issues/1300)\\n- Completed the issue **Make `mithril-client` crate a library** [#1141](https://github.com/input-output-hk/mithril/issues/1141)\\n- Worked on the issue **Compute deterministic Cardano UTxO set PoC** [#1283](https://github.com/input-output-hk/mithril/issues/1283)\\n- Completed the issue **`ProtocolKeyRegistration` creates performance bottleneck in aggregator** [#1187](https://github.com/input-output-hk/mithril/issues/1187)\\n- Worked on the issue **Fix `devnet` Mithril Docker images** [#1272](https://github.com/input-output-hk/mithril/issues/1272)\\n- Worked on the issue **`release-mainnet` aggregator is unreachable** [#1310](https://github.com/input-output-hk/mithril/issues/1310)\\n- Worked on the issue **Build `mithril-common` and `mithril-client` in WASM PoC** [#1284](https://github.com/input-output-hk/mithril/issues/1284)\\n- Completed the issue **Display a summary of signers before the full list in explorer** [#1133](https://github.com/input-output-hk/mithril/issues/1133)\\n- Completed the issue **Add certificates list in explorer** [#1184](https://github.com/input-output-hk/mithril/issues/1184)\\n- Completed the issue **`CoreVerifier` setup does not compute `total_stake` correctly** [#1306](https://github.com/input-output-hk/mithril/issues/1306)"},{"id":"2023-10-24-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-10-24-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-24-node-cli-api.md","source":"@site/blog/2023-10-24-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-10-24T00:00:00.000Z","formattedDate":"October 24, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.68,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-10-24-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-25-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-20-hydra"}},"content":"# 2023-10-11 - 2023-10-24\\n\\n## High level summary\\n\\nCARDANO-CLI\\n- Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified.\\n- `stake-address-info` now shows deposits balance.\\n- Added `conway governance action view` to allow to inspect governance action files before submitting them on a transaction.\\n- `build-raw` support for `--vote-file` and `--proposal-file`\\n\\n\\nCARDANO-API\\n- Support DRep extended keys\\n- Support Plutus V1 in Conway\\n\\n### cardano-cli\\n- [Upgrade to `cardano-api-8.28.0.0`](https://github.com/input-output-hk/cardano-cli/pull/394)\\n- [Simplify `toTxOutInAnyEra`](https://github.com/input-output-hk/cardano-cli/pull/393)\\n- [Upgrade to `cardano-api-8.27.0.0`](https://github.com/input-output-hk/cardano-cli/pull/390)\\n- [Upgrade to `cardano-api-8.26.0.0`](https://github.com/input-output-hk/cardano-cli/pull/389)\\n- [Check that poll answer index is not negative, to avoid a Prelude.!! error](https://github.com/input-output-hk/cardano-cli/pull/380)\\n- [drep registration-certificate: add a golden test](https://github.com/input-output-hk/cardano-cli/pull/379)\\n- [Disambiguate treasury withdrawal flags](https://github.com/input-output-hk/cardano-cli/pull/378)\\n- [Make `stake-address-info` query also return deposit](https://github.com/input-output-hk/cardano-cli/pull/375)\\n- [Add `conway governance action view`](https://github.com/input-output-hk/cardano-cli/pull/374)\\n- [Ch/clearer anchor flags](https://github.com/input-output-hk/cardano-cli/pull/372)\\n- [Command argument types for `transaction` commands](https://github.com/input-output-hk/cardano-cli/pull/371)\\n- [Remove eras\' constitution-hash](https://github.com/input-output-hk/cardano-cli/pull/370)\\n- [Shelley to Alonzo: add create-genesis-key-delegation-certificate to governance](https://github.com/input-output-hk/cardano-cli/pull/368)\\n- [Enable reading of Conway `TxWitness`es](https://github.com/input-output-hk/cardano-cli/pull/367)\\n- [Make `governance action create-protocol-parameters-update` Conway onwards only](https://github.com/input-output-hk/cardano-cli/pull/366)\\n- [`transaction build-raw` support for `--vote-file` and `--proposal-file`](https://github.com/input-output-hk/cardano-cli/pull/365)\\n- [Command argument types for governance key commands](https://github.com/input-output-hk/cardano-cli/pull/364)\\n- [Add test of voting using a cc hot key](https://github.com/input-output-hk/cardano-cli/pull/363)\\n\\n### cardano-api\\n- [Add Show instance for FoldBlocksError](https://github.com/input-output-hk/cardano-api/pull/338)\\n- [Upgrade typed-protocols to 1.1.1](https://github.com/input-output-hk/cardano-api/pull/336)\\n- [Improved validity range handling](https://github.com/input-output-hk/cardano-api/pull/332)\\n- [New version `cardano-api-8.28.0.0`](https://github.com/input-output-hk/cardano-api/pull/331)\\n- [Delete `AlonzoEraOnly`](https://github.com/input-output-hk/cardano-api/pull/330)\\n- [New `shelleyToAlonzoEraToShelleyToBabbageEra` function](https://github.com/input-output-hk/cardano-api/pull/329)\\n- [DRep extended key: add CastVerificationKeyRole](https://github.com/input-output-hk/cardano-api/pull/327)\\n- [New version `cardadno-api-8.27.0.0`](https://github.com/input-output-hk/cardano-api/pull/326)\\n- [Delete unnecessary calls to `shelleyBasedEraConstraints`](https://github.com/input-output-hk/cardano-api/pull/325)\\n- [New version `cardadno-api-8.27.0.0`](https://github.com/input-output-hk/cardano-api/pull/324)\\n- [Support Plutus V1 in Conway](https://github.com/input-output-hk/cardano-api/pull/323)\\n- [Parameterize GovernanceAction on era ](https://github.com/input-output-hk/cardano-api/pull/322)\\n- [Support DRep extended keys](https://github.com/input-output-hk/cardano-api/pull/320)\\n- [New version `cardano-api-8.26.0.0`](https://github.com/input-output-hk/cardano-api/pull/317)\\n- [Haddock document the case functions, so that their behavior is easier to understand when calling them](https://github.com/input-output-hk/cardano-api/pull/314)\\n- [Avoid `IsShelleyBasedEra` and `IsCardanoEra` where possible](https://github.com/input-output-hk/cardano-api/pull/313)\\n- [New `MaryEraOnly` eon. Disjoint functions](https://github.com/input-output-hk/cardano-api/pull/312)\\n\\n### cardano-node\\n\\n### cardano-testnet\\n- [Factor out file creation for SPO](https://github.com/input-output-hk/cardano-node/pull/5515)\\n\\n### docs\\n- [Tracer documentation generation enhacements ](https://github.com/input-output-hk/cardano-node/pull/5504)\\n\\n### CI & project maintenance"},{"id":"2023-10-20-hydra","metadata":{"permalink":"/cardano-updates/2023-10-20-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-20-hydra.md","source":"@site/blog/2023-10-20-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-10-20T00:00:00.000Z","formattedDate":"October 20, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.84,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-10-20-hydra","authors":["ffakenz"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-10-24-node-cli-api"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-10-18-consensus"}},"content":"## High-level summary\\n\\nThis week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023.\\n\\nIn addition, they improved the Hydra node API\'s submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON.\\nThis improvement offers users greater flexibility and ease of interaction with the API.\\n\\nFinally, the team has followed up on the TUI brick upgrade to version 1.10.\\nThis effort has resulted in addressing minor details and enhancing the overall user experience with the TUI.\\n\\n\\n## What did the team achieve this week\\n\\n- Prepare presentation and workshop for Cardano Summit.\\n- More TUI fixes and improvements.\\n + [#1127](https://github.com/input-output-hk/hydra/pull/1127)\\n + [#1120](https://github.com/input-output-hk/hydra/issues/1120)\\n- Upgrade GHC from 9.2.8 -> 9.6.2 [#1105](https://github.com/input-output-hk/hydra/pull/1105)\\n- Solved user issue related to submitting transactions in cbor format [#1111](https://github.com/input-output-hk/hydra/issues/1111).\\n- Fix hydraw connection issue making it more stable [#1121](https://github.com/input-output-hk/hydra/pull/1121).\\n\\n\\n## What are the goals of next week\\n\\n- Work on hydra-poll dApp for Cardano summit.\\n- Start the work on packaging hydra-node and related services."},{"id":"2023-10-18-consensus","metadata":{"permalink":"/cardano-updates/2023-10-18-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-18-consensus.md","source":"@site/blog/2023-10-18-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-10-18T00:00:00.000Z","formattedDate":"October 18, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.65,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-10-18-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-20-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-18-mithril"}},"content":"## High level summary\\n\\nDuring the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node.\\n\\n### UTxO-HD\\n\\n- The Plutus workload benchmark for the in-memory backend [showed no regressions](https://github.com/input-output-hk/ouroboros-consensus/issues/203#issuecomment-1768560330) for the metrics of interest, but it does show an increase in resource usage.\\n- We got additional ad-hoc [measurements](https://github.com/input-output-hk/cardano-node/issues/5495#issuecomment-1768593069) on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB.\\n- We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.\\n\\n### Genesis\\n\\n- We produced the first draft for a Survivable Eclipse Duration Model ([422](https://github.com/input-output-hk/ouroboros-consensus/pull/422)).\\n\\n### Support\\n\\n- [Esgen](https://github.com/amesgen) finished his cycle as release engineer. Node [8.5.0](https://github.com/input-output-hk/cardano-node/releases/tag/8.5.0-pre) has been released.\\n- We resumed work on the subpar handling of block from the future ([4251](https://github.com/input-output-hk/ouroboros-network/issues/4251)).\\n- We prepared the integration of [new tracing events](https://github.com/input-output-hk/cardano-node/pull/5502) for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned [issue](https://github.com/input-output-hk/ouroboros-network/issues/4251))."},{"id":"2023-10-18-mithril","metadata":{"permalink":"/cardano-updates/2023-10-18-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-18-mithril.md","source":"@site/blog/2023-10-18-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-10-18T00:00:00.000Z","formattedDate":"October 18, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.07,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-10-18-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-10-18-consensus"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-10-15-network"}},"content":"## High level overview\\n\\nThis week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay.\\n\\nFinally, they enhanced the CI/CD to publish multiple packages to [crates.io](https://crates.io/) and started improving the developer experience with the Mithril devnet.\\n\\n## Low level overview\\n\\n- Published the security advisory **Mithril relay could expose Cardano block producer internal IP when updated** [#GHSA-9m3h-72xj-x2gq](https://github.com/input-output-hk/mithril/security/advisories/GHSA-9m3h-72xj-x2gq)\\n- Worked on the issue **P2P Networking - Proof of Concept** [#1300](https://github.com/input-output-hk/mithril/issues/1300)\\n- Worked on the issue **Make `mithril-client` crate a library** [#1141](https://github.com/input-output-hk/mithril/issues/1141)\\n- Worked on the issue **Compute deterministic Cardano transactions history PoC** [#1283](https://github.com/input-output-hk/mithril/issues/1283)\\n- Worked on the issue **`ProtocolKeyRegistration` creates performance bottleneck in aggregator** [#1187](https://github.com/input-output-hk/mithril/issues/1187)\\n- Completed the issue **Publish multiple packages to `crates.io`** [#1298](https://github.com/input-output-hk/mithril/issues/1298)\\n- Completed the issue **Rename public key published in releases** [#1292](https://github.com/input-output-hk/mithril/issues/1292)\\n- Completed the issue **Mithril networks infrastructure maintenance** [#1218](https://github.com/input-output-hk/mithril/issues/1218)\\n- Worked on the issue **Fix `devnet` Mithril Docker images** [#1272](https://github.com/input-output-hk/mithril/issues/1272)"},{"id":"2023-10-15-network","metadata":{"permalink":"/cardano-updates/2023-10-15-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-15-network.md","source":"@site/blog/2023-10-15-network.md","title":"Network Team Update","description":"High-level overview of sprint 46","date":"2023-10-15T00:00:00.000Z","formattedDate":"October 15, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":0.59,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-10-15-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-18-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-13-hydra"}},"content":"## High-level overview of [sprint 46][sprint-46]\\n\\n### Bootstrap Peers\\n\\nWe continued reviewing of bootstrap peers, see [ouroboros-network#4555].\\n\\n### Towards Typed Protocols 0.2.0.0\\n\\nWe diagnosed the performance regression of the new design. The work on\\n`typed-protocols` will be postponed. For more details see the\\n[typed-protocols#3]. As an outcome of the performance debugging we prepared\\n[PR][ouroboros-network#4691] which updates the `demo-ping-pong` and\\n`demo-chain-sync` applications.\\n\\n### Peer Sharing\\n\\nWe made progress in review of [ouroboros-network#4644], which simplifies the\\npeer sharing and fixes the [ouroboros-network#4642] issue.\\n\\n### Tech Debt\\n\\nWe reviewed the [ouroboros-network#3836] PR which inspects all the uses of\\n`error` in `ouroboros-network`. The PR was prepared by Galois.\\n\\n\\n[sprint-46]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+46%22\\n[typed-protocols#3]: https://github.com/input-output-hk/typed-protocols/pull/3\\n[ouroboros-network#3836]: https://github.com/input-output-hk/ouroboros-network/pull/3836\\n[ouroboros-network#4555]: https://github.com/input-output-hk/ouroboros-network/pull/4555\\n[ouroboros-network#4642]: https://github.com/input-output-hk/ouroboros-network/pull/4642\\n[ouroboros-network#4644]: https://github.com/input-output-hk/ouroboros-network/pull/4644\\n[ouroboros-network#4691]: https://github.com/input-output-hk/ouroboros-network/pull/4691"},{"id":"2023-10-13-hydra","metadata":{"permalink":"/cardano-updates/2023-10-13-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-hydra.md","source":"@site/blog/2023-10-13-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-10-13T00:00:00.000Z","formattedDate":"October 13, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.745,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-10-13-hydra","authors":["ffakenz"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-10-15-network"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-10-13-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team\'s primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity.\\n\\nThey also completed the exploration of potentially moving the Plutus validator scripts to Aiken.\\n\\nAdditionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project\'s structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project.\\n\\n\\n## What did the team achieve this week\\n\\n- Network Resilience Persistence (#1101)[https://github.com/input-output-hk/hydra/pull/1101].\\n- Upgrade brick on TUI (#1103)[https://github.com/input-output-hk/hydra/pull/1103].\\n- Aiken commit validator translation (#1072)[https://github.com/input-output-hk/hydra/pull/1072].\\n- Fixed some bugs in our TUI client.\\n\\n\\n## What are the goals of next week\\n\\n- Prepare presentation and workshop for Cardano Summit.\\n- Work on hydra-poll dApp for Cardano summit.\\n- Start the work on packaging hydra-node and related services."},{"id":"2023-10-13-ledger","metadata":{"permalink":"/cardano-updates/2023-10-13-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-ledger.md","source":"@site/blog/2023-10-13-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-10-13T00:00:00.000Z","formattedDate":"October 13, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":0.965,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-10-13-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-13-hydra"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-10-13-sre"}},"content":"## High level summary\\n\\nThe Ledger team has been shifting focus from implementing Conway related features to\\ntesting. For this reason there is a very little amount features that are reported this\\ntime aorund. Notable Conway related changes are a specialized ledger query for getting\\nConstitutional Committee state and prevention of submitting proposal procedures that have\\nno valid path to enactment.\\n\\nTesting related work was mainly on a constraint base system as well as on roundtrip\\nserialization. As a result of this extra testing a bug in Conway Genesis serialization\\nwas eliminated.\\n\\n## Low level summary\\n\\n### Conway era\\n\\n* [pull-3768] - Fail proposal on invalid prevGovActionId\\n* [pull-3781] - CommitteeState query\\n\\n### Integration and releasing\\n\\n* [pull-3774] - Bump urllib3 from 1.26.10 to 1.26.17 in /doc\\n* [pull-3770] - cabal.project: Bump index states\\n* [pull-3778] - Bump plutus to 1.14\\n\\n### Testing\\n\\n* [pull-3769] - Add roundtrip testing by validating FlatTerm\\n* [pull-3783] - Update TranslationInstance.hs\\n* [pull-3775] - Refactor and improve constraint based STS tests\\n* [pull-3793] - Fix sums with negative RHS.\\n\\n[pull-3774]: https://github.com/input-output-hk/cardano-ledger/pull/3774\\n[pull-3770]: https://github.com/input-output-hk/cardano-ledger/pull/3770\\n[pull-3778]: https://github.com/input-output-hk/cardano-ledger/pull/3778\\n[pull-3769]: https://github.com/input-output-hk/cardano-ledger/pull/3769\\n[pull-3768]: https://github.com/input-output-hk/cardano-ledger/pull/3768\\n[pull-3781]: https://github.com/input-output-hk/cardano-ledger/pull/3781\\n[pull-3783]: https://github.com/input-output-hk/cardano-ledger/pull/3783\\n[pull-3775]: https://github.com/input-output-hk/cardano-ledger/pull/3775\\n[pull-3793]: https://github.com/input-output-hk/cardano-ledger/pull/3793"},{"id":"2023-10-13-sre","metadata":{"permalink":"/cardano-updates/2023-10-13-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-sre.md","source":"@site/blog/2023-10-13-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-10-13T00:00:00.000Z","formattedDate":"October 13, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":2.595,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-10-13-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-10-13-ledger"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-11-mithril"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent changes, updates or improvements include:\\n* Sanchonet environment was updated to 8.5.0-pre.\\n* Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring\\n\\n## Lower level summary\\n\\n### Capkgs\\n* Various improvements and fixes including:\\n * Add GHA cron schedule\\n * Add nix auto-gc to avoid running out of storage during large package set builds\\n * Add new packages to capkgs\\n * Reduce runner storage requirement leaving more room for builds\\n * Restructure capkgs attribute names to avoid package name collisions\\n * Return to non-musl builds for cardano packages to retain journald compatability\\n * Update cache usage to from file level to folder level to reduce network and latency overhead\\n * Commit diff: [capkgs-compare](https://github.com/input-output-hk/capkgs/compare/a274b72...b197e22)\\n\\n### Cardano-parts\\n* Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: [cardano-parts-pull-16](https://github.com/input-output-hk/cardano-parts/pull/16)\\n* Dbsync, smash, faucet and more: [cardano-parts-pull-15](https://github.com/input-output-hk/cardano-parts/pull/15)\\n * Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes\\n * Adds nginx vhost metrics exporter profile\\n * Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down\\n * Adds bash *-ng autocompletion compatible wrappers\\n * Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview\\n * Adds downstream grafana cloud dashboard as templates\\n * Adds downstream grafana cloud alerts as templates\\n * Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish\\n * Updates the basic profile with IOG cache and commonly used bins\\n * Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning\\n * Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks\\n * Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets\\n * Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration\\n * Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion\\n * Updates the colmena template with dbsync, smash, faucet machines profiles and roles\\n * Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns\\n * Bumps capkgs node-ng to 8.5.0-pre\\n\\n### Cardano-playground\\n* Dbsync, smash, faucet and more: [cardano-playground-pull-3](https://github.com/input-output-hk/cardano-playground/pull/3)\\n * Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview\\n * Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts\\n * Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change\\n * Optimizes machine sizes\\n * Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets\\n * Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion\\n * Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning\\n * Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration\\n\\n### Cardano-world\\n* Update sanchonet network to cardano-node 8.5.0: [cardano-world-commit](https://github.com/input-output-hk/cardano-world/commit/c8a480fa7cdb6eff4f8b4565450c57361ddfdec4)\\n\\n### Sanchonet-demo\\n* Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: [sanchonet-demo-commit](https://github.com/input-output-hk/sanchonet-demo/commit/4124465c0c663d11c8cf4ef80af18a5246f89b31)"},{"id":"2023-10-11-mithril","metadata":{"permalink":"/cardano-updates/2023-10-11-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-11-mithril.md","source":"@site/blog/2023-10-11-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-10-11T00:00:00.000Z","formattedDate":"October 11, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":0.77,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-10-11-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-10-13-sre"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-10-10-node-cli-api"}},"content":"## High level overview\\n\\nThis week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on [crates.io](https://crates.io/), the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures.\\n\\nFinally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI.\\n\\n## Low level overview\\n\\n- Worked on the issue **Make `mithril-client` crate a library** [#1141](https://github.com/input-output-hk/mithril/issues/1141)\\n- Worked on the issue **Compute deterministic Cardano transactions history PoC** [#1283](https://github.com/input-output-hk/mithril/issues/1283)\\n- Worked on the issue **`ProtocolKeyRegistration` creates performance bottleneck in aggregator** [#1187](https://github.com/input-output-hk/mithril/issues/1187)\\n- Completed the issue **Update `Rust` compiler in `nix` CI** [#1282](https://github.com/input-output-hk/mithril/issues/1282)\\n- Worked on the issue **Mithril networks infrastructure maintenance** [#1218](https://github.com/input-output-hk/mithril/issues/1218)\\n- Worked on the issue **Activate Cloudflare protection of infrastructure** [#1230](https://github.com/input-output-hk/mithril/issues/1230)"},{"id":"2023-10-10-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-10-10-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-10-node-cli-api.md","source":"@site/blog/2023-10-10-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-10-10T00:00:00.000Z","formattedDate":"October 10, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.985,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-10-10-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-11-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-06-hydra"}},"content":"# 2023-09-27 - 2023-10-10\\n\\n## High level summary\\n\\nCARDANO-NODE\\n- [Pre-release of cardano-node 8.5.0-pre](https://github.com/input-output-hk/cardano-node/releases/tag/8.5.0-pre)\\n\\nCARDANO-CLI\\n- Depracated governance query commands and moved all governance related queries to `cardano-cli query`\\n- Drep registration certificates now allow to include an anchor\\n- Integrated Drep retirement ceriticates\\n- clean up of Drep registration certificates.\\n\\nCARDANO-API\\n- Add support for committee hot key witnesses\\n- Require conway onwards for voting\\n- Conway drep registration: expose ledger anchor parameter\\n- Add certs to txbody of Conway transactions\\n\\n### cardano-cli\\n\\n- [Move `governance query` commands to `query` command group](https://github.com/input-output-hk/cardano-cli/pull/347)\\n- [Rename create-new-committee into update-committee](https://github.com/input-output-hk/cardano-cli/pull/344)\\n- [New version cardano-cli-8.12.0.0](https://github.com/input-output-hk/cardano-cli/pull/341)\\n- [Add support for committee hot key witnesses](https://github.com/input-output-hk/cardano-cli/pull/338)\\n- [conway governance vote create: make it possible to use cc hot keys](https://github.com/input-output-hk/cardano-cli/pull/337)\\n- [New version `cardano-cli-8.11.0.0`](https://github.com/input-output-hk/cardano-cli/pull/331)\\n- [Drep certification registration: add parameters for anchor](https://github.com/input-output-hk/cardano-cli/pull/330)\\n- [Upgrade to `cardano-api-8.25.0.1`](https://github.com/input-output-hk/cardano-cli/pull/329)\\n- [Move files that are not golden files into `input` directory](https://github.com/input-output-hk/cardano-cli/pull/327)\\n- [Update to cardano-api-8.24](https://github.com/input-output-hk/cardano-cli/pull/324)\\n- [Fix #311 - Add Cold Committee Key text envelope](https://github.com/input-output-hk/cardano-cli/pull/323)\\n- [create-poll, answer-poll, verify-poll: move to \'babbage governance\' block](https://github.com/input-output-hk/cardano-cli/pull/322)\\n- [Update to `cardano-api-8.23.1.0`](https://github.com/input-output-hk/cardano-cli/pull/320)\\n- [Make `transaction view` emit JSON](https://github.com/input-output-hk/cardano-cli/pull/319)\\n- [Tidy up query command structure](https://github.com/input-output-hk/cardano-cli/pull/318)\\n- [Use `caseShelleyToBabbageOrConwayEraOnwards` from `cardano-api`](https://github.com/input-output-hk/cardano-cli/pull/317)\\n- [Add DRep Retirement Certificate command](https://github.com/input-output-hk/cardano-cli/pull/316)\\n- [Update to cardano api 8.22.0.0](https://github.com/input-output-hk/cardano-cli/pull/310)\\n- [drep registration-certificate: remove mix with SPO registration](https://github.com/input-output-hk/cardano-cli/pull/309)\\n\\n### cardano-api\\n\\n- [Delete `EraCast` instance for `Certificate`](https://github.com/input-output-hk/cardano-api/pull/307)\\n- [Add certs to txbody of Conway transactions](https://github.com/input-output-hk/cardano-api/pull/306)\\n- [Move DRep reg certificate anchor types from cardano-cli to cardano-api](https://github.com/input-output-hk/cardano-api/pull/305)\\n- [Add BabbageEraOnly](https://github.com/input-output-hk/cardano-api/pull/304)\\n- [New version cardano-api-8.25.2.0](https://github.com/input-output-hk/cardano-api/pull/303)\\n- [Add support for committee hot key witnesses](https://github.com/input-output-hk/cardano-api/pull/300)\\n- [Reduce constraint usage with eons](https://github.com/input-output-hk/cardano-api/pull/299)\\n- [Delete `withShelleyBasedEraConstraintsForLedger`](https://github.com/input-output-hk/cardano-api/pull/297)\\n- [Simplify `DebugLedgerState` with eons](https://github.com/input-output-hk/cardano-api/pull/296)\\n- [New version cardano-api-8.25.0.0](https://github.com/input-output-hk/cardano-api/pull/294)\\n- [Require conway onwards for voting](https://github.com/input-output-hk/cardano-api/pull/293)\\n- [Add witness committee cold key](https://github.com/input-output-hk/cardano-api/pull/292)\\n- [Fix CHaP failure due to haddock issue](https://github.com/input-output-hk/cardano-api/pull/291)\\n- [Amend cardano-api/pull/284 to use ReexposeLedger](https://github.com/input-output-hk/cardano-api/pull/290)\\n- [Rename `AnyEraInEon` to `EraInEon`](https://github.com/input-output-hk/cardano-api/pull/289)\\n- [Release 8.24.0.0](https://github.com/input-output-hk/cardano-api/pull/288)\\n- [Parameterize `AnyEraInEon`. Add `AnyEon`](https://github.com/input-output-hk/cardano-api/pull/287)\\n- [New version `cardano-api-8.23.0.0`](https://github.com/input-output-hk/cardano-api/pull/286)\\n- [conway drep registration: expose ledger anchor parameter](https://github.com/input-output-hk/cardano-api/pull/284)\\n- [New `caseAlonzoOnlyOrBabbageEraOnwards` and `alonzoEraOnlyToAlonzoEraOnwards` functions](https://github.com/input-output-hk/cardano-api/pull/282)\\n- [Rename eon functions](https://github.com/input-output-hk/cardano-api/pull/281)\\n- [New `AnyEraInEon`](https://github.com/input-output-hk/cardano-api/pull/280)\\n- [Replace `ValidityLowerBoundSupportedInEra`](https://github.com/input-output-hk/cardano-api/pull/279)\\n- [Replace `TxExtraKeyWitnessesSupportedInEra`](https://github.com/input-output-hk/cardano-api/pull/278)\\n- [Explicit pattern match on all ledger certificates constructors. Remove redundant module](https://github.com/input-output-hk/cardano-api/pull/277)\\n- [Release 8.22.0.0](https://github.com/input-output-hk/cardano-api/pull/276)\\n- [Replace `TxTotalAndReturnCollateralSupportedInEra`](https://github.com/input-output-hk/cardano-api/pull/275)\\n\\n### cardano-node\\n\\n- [Integrate upstream libraries for 8.5](https://github.com/input-output-hk/cardano-node/pull/5490)\\n\\n### cardano-testnet\\n\\n- [bump cardano-api to 8.25.2](https://github.com/input-output-hk/cardano-node/pull/5497)\\n- [Remove unused code in cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/5491)\\n- [Integrate upstream libraries for 8.5](https://github.com/input-output-hk/cardano-node/pull/5490)\\n\\n### docs\\n\\n### CI & project maintenance"},{"id":"2023-10-06-hydra","metadata":{"permalink":"/cardano-updates/2023-10-06-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-06-hydra.md","source":"@site/blog/2023-10-06-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-10-06T00:00:00.000Z","formattedDate":"October 6, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.88,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-10-06-hydra","authors":["ffakenz"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-10-10-node-cli-api"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-10-06-performance-and-tracing"}},"content":"## High-level summary\\n\\nThis week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums.\\n\\nThe team also delivered the first version of the network resilience layer, significantly increasing head availability.\\n\\nAdditionally, they have been providing support to several funded Catalyst projects that want to build on Hydra.\\n\\nLast but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra.\\n\\n\\n## What did the team achieve this week\\n- Release [0.13.0](https://github.com/input-output-hk/hydra/releases/tag/0.13.0)\\n- Published vulnerability reports [#1088](https://github.com/input-output-hk/hydra/pull/1088)\\n- Merged network resilience work part I [#1074](https://github.com/input-output-hk/hydra/pull/1074)\\n- Planning for Cardano Summit participation \\n- Discussions with funded Catalyst projects wanting to build on Hydra for support\\n- Merged typos fix PR from @omahs [#1095](https://github.com/input-output-hk/hydra/pull/1095)\\n\\n\\n## What are the goals of next week\\n\\n- Complete Aiken commit validator script [#1072](https://github.com/input-output-hk/hydra/pull/1072)\\n- Complete Kupo integration [#1078](https://github.com/input-output-hk/hydra/issues/1078)\\n- Brick upgrade on TUI [#1103](https://github.com/input-output-hk/hydra/pull/1103)\\n- Clean backlog\\n- Prepare and rehearse demo and talk for Cardano Summit"},{"id":"2023-10-06-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-10-06-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-06-performance-and-tracing.md","source":"@site/blog/2023-10-06-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-10-06T00:00:00.000Z","formattedDate":"October 6, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.625,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-10-06-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-10-06-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-10-04-consensus"}},"content":"## High level summary\\n\\n* Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system.\\n* Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7.\\n* Development: We\'ve developed strategies for future benchmarks of PlutusV3 and UTxO-HD\'s on-disk backing store.\\n* Tracing: The machine-readable tracer configuration has been merged. Optimization of `cardano-tracer` started.\\n* Nomad backend: Ongoing variance analysis and refined cluster topology.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nPerforming and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the\\nperformance of the in-memory backing store and evaluate possible optimizations (or regressions) for it. \\n\\nFurthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results\\nshow all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the `cardano-tracer` service.\\n\\n### Consensus QTAs\\n\\nThe Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The\\nfeedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype.\\n\\n### Development\\n\\nBenchmarking UTxO-HD\'s on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort. \\n\\nPlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time,\\nwe\'d like to validate the many improvements that have gone into the Plutus evaluator.\\n\\n### Tracing\\n\\nThe focus for further optimization of the new tracing system has shifted to `cardano-tracer` - the service\\nreceiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in `cardano-node` is\\nmore performance critical, the receiving service must still minimize its resource footprint. Moreover, it can\\ngenerate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations.\\n\\n### Nomad backend\\n\\nVariance analysis of new nomad backend has revealed a necessary adjustment of the cluster\'s topology. We repeated\\nthe same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery."},{"id":"2023-10-04-consensus","metadata":{"permalink":"/cardano-updates/2023-10-04-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-04-consensus.md","source":"@site/blog/2023-10-04-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-10-04T00:00:00.000Z","formattedDate":"October 4, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.135,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-10-04-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-10-06-performance-and-tracing"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-04-mithril"}},"content":"## High level summary\\n\\nThe value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the *in-memory* backend.\\n\\nOn the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain.\\nWe also merged a fix for the Babbage to Conway transition, and released a new version of Consensus.\\n\\n\\n### Genesis\\n\\n- We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain ([392](https://github.com/input-output-hk/ouroboros-consensus/issues/392)).\\n\\n\\n### Support\\n\\n- We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition ([366](https://github.com/input-output-hk/ouroboros-consensus/pull/366)).\\n- We enabled richer tracers in `cardano-node` that can be useful in future debugging ([384](https://github.com/input-output-hk/ouroboros-consensus/pull/384)).\\n- [Esgen](https://github.com/amesgen) continues with his release engineer activities, and created a new Consensus release.\\n\\n### Fostering collaboration\\n\\n- We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface ([369](https://github.com/input-output-hk/ouroboros-consensus/pull/369))."},{"id":"2023-10-04-mithril","metadata":{"permalink":"/cardano-updates/2023-10-04-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-04-mithril.md","source":"@site/blog/2023-10-04-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-10-04T00:00:00.000Z","formattedDate":"October 4, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.15,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-10-04-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-10-04-consensus"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-10-02-network"}},"content":"## High level overview\\nThis week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion [on implementing Mithril in a light wallet](https://github.com/input-output-hk/mithril/discussions/1273) to receive feedback and contributions from the community.\\n\\nThey also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks.\\n\\nFinally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs.\\n\\n## Low level overview\\n- Created the discussion **Implement Mithril in a light wallet** [#1273](https://github.com/input-output-hk/mithril/discussions/1273)\\n- Completed the issue **Run client in browser WASM PoC** [#1254](https://github.com/input-output-hk/mithril/issues/1254)\\n- Completed the issue **Benchmark aggregator performances** [#1220](https://github.com/input-output-hk/mithril/issues/1220)\\n- Worked on the issue **Add SPO tickers in explorer** [#1185](https://github.com/input-output-hk/mithril/issues/1185)\\n- Completed the issue **Add a non `404` status code on the aggregator endpoint** [#1103](https://github.com/input-output-hk/mithril/issues/1103)\\n- Completed the issue **Use source attribute in errors** [#1265](https://github.com/input-output-hk/mithril/issues/1265)\\n- Completed the issue **Create a SPO checklist for KES keys update** [#1267](https://github.com/input-output-hk/mithril/issues/1267)\\n- Completed the issue **Configure status page and alerting** [#1277](https://github.com/input-output-hk/mithril/issues/1277)\\n- Completed the issue **Upgrade dependencies** [#1274](https://github.com/input-output-hk/mithril/issues/1274)"},{"id":"2023-10-02-network","metadata":{"permalink":"/cardano-updates/2023-10-02-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-02-network.md","source":"@site/blog/2023-10-02-network.md","title":"Network Team Update","description":"High-level overview of sprint 45","date":"2023-10-02T00:00:00.000Z","formattedDate":"October 2, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":2.485,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-10-02-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-10-04-mithril"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-09-29-goedel"}},"content":"## High-level overview of [sprint 45][sprint-45]\\n\\n[sprint-45]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+45%22\\n\\n### Bootstrap Peers\\n\\nWe started reviewing the bootstrap peers PR, [ouroboros-network#4615].\\n\\n### Towards Typed Protocols 0.2.0.0\\n\\nWe discovered a performance regression when using `typed-protocols-0.2.0.0`, and we\\nstarted investigating where it comes from. Currently, we see that\\n`typed-protocols-0.2.0.0` can outperform `typed-protocols-0.1.0.0` when running\\nin isolation with a simple `ping-pong` protocol, so the regression might be in\\nthe new block fetch implementation which comes with `typed-protocols-0.2.0.0`\\nSee [typed-protocols#3].\\n\\n### Tech Debt\\n\\nWe merged two PRs written by Galois engineers:\\n\\n* a pull request which refactors the main entry function for P2P, see [ouroboros-network#3834]; \\n* a pull request which reviews usage of `unsafe` function in the network code based.\\n\\nGalois also made progress with the following two issues:\\n * add microbenchmarks to some of our tests: [ouroboros-network#3832]\\n * inspect use of `error` in `ouroboros-network` repository:\\n [ouroboros-network#3836]\\n\\n### IO-Sim\\n\\n#### IOSimPOR\\nWe found and fixed a bug in `IOSimPOR`. We\'d like to thank Prof. John Hughes\\n(Quviq AB) for helping us with debugging the issue.\\n\\nWe also provided a more uniform API for `IOSimPOR`, and added ways to make the\\ndebugging similar problems in the future easier.\\n\\n
\\nTechnical Details on IOSim refactoring\\nWe removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means\\nremoving parallel evaluation of discovered races. We found out that it gives\\nonly 25% better performance. In the future QuickCheck will offer running\\ndifferent cases in parallel which should provide better performance as there\\nare no dependencies between the evaluation of different test cases, while schedules\\nare discovered while running which limits the possible gains from running them\\nconcurrently. The performance was not the only factor though. When using\\nparallelism in the lazy `ST` monad we\'d need to rely on memory guarantees of\\n`STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it\\nmight not be the case in the future.\\n
\\n\\n#### IOSim\\n\\nTo prepare for the next release, we consolidate packages taking advantage of\\nthe public sublibraries supported now both by `cabal` and `Hackage`. This is\\na work in progress, [io-sim#114].\\n\\n### Cardano Newtork Service Assurance\\n\\nGalois made the following progress:\\n\\n* A test run of spinning up a CNSA instance was done, as a result documentation\\n was updated.\\n* Based on the IOG code review of the CNSA code, updates to the CNSA code were\\n made.\\n* Galois has started the design for adding a CNSA analysis for \\"fetched bytes\\n over time while node is syncing\\".\\n\\n### P2P adoption\\n\\nIn the last two weeks, we\'ve seen increase in P2P adoption.\\n![P2P relays](/images/network/2023-10-04-p2p-relays.png)\\n\\n\\nThe following graphs show several different versions of relays running on the mainnet. The\\ngreen line `NodeToNodeVersionV10.True` denotes P2P relays.\\n![node versions](/images/network/2023-10-04-relay-versions.png)\\n\\n### Open Source\\n\\nWe upstreamed our FFI bindings to Windows named pipes to `Win32` package, the\\nPR was accepted and merged.\\n\\nWe also received an external contribution which enhanced our documentation, see\\n[ouroboros-network#4676].\\n\\n[ouroboros-network#3832]: https://github.com/input-output-hk/ouroboros-network/issues/3832\\n[ouroboros-network#3834]: https://github.com/input-output-hk/ouroboros-network/issues/3834\\n[ouroboros-network#3835]: https://github.com/input-output-hk/ouroboros-network/issues/3835\\n[ouroboros-network#3836]: https://github.com/input-output-hk/ouroboros-network/issues/3836\\n[ouroboros-network#4615]: https://github.com/input-output-hk/ouroboros-network/issues/4615\\n[ouroboros-network#4676]: https://github.com/input-output-hk/ouroboros-network/pull/4676\\n[io-sim#113]: https://github.com/input-output-hk/io-sim/issues/113\\n[io-sim#114]: https://github.com/input-output-hk/io-sim/issues/114\\n[typed-protocols#3]: https://github.com/input-output-hk/typed-protocols/pull/3"},{"id":"2023-09-29-goedel","metadata":{"permalink":"/cardano-updates/2023-09-29-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-goedel.md","source":"@site/blog/2023-09-29-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-09-29T00:00:00.000Z","formattedDate":"September 29, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.42,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-09-29-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-10-02-network"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-29-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThe team is currently formalising mini protocols and testing the\\nperformance analysis tool\\n\\n## Details\\n\\n* drafting processs calculus semantics of mini protocol programs\\n\\n* testing the new performance modelling tool\\n\\n* further work on specification of mini protocols\\n\\n* extension of mini protocol framework to support communication of\\n programs with local environments via synchronous channels"},{"id":"2023-09-29-hydra","metadata":{"permalink":"/cardano-updates/2023-09-29-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-hydra.md","source":"@site/blog/2023-09-29-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-09-29T00:00:00.000Z","formattedDate":"September 29, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.49,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-09-29-hydra","authors":["ffakenz"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-09-29-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-09-29-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team mainly focused on having a working new reliability\\nnetwork layer; and specified its expected behavior in a new ADR.\\n\\nThey also revisited the security policy and vulnerability disclosure policy on\\nhow to handle security vulnerability within Hydra, and in particular how to\\nhandle so-called \\"Silent fixes\\".\\n\\n\\n## What did the team achieve this week\\n\\n- Updated security policy and vulnerability disclosure policy [#1088](https://github.com/input-output-hk/hydra/pull/1088)\\n- Adr/network reliability [#1082](https://github.com/input-output-hk/hydra/pull/1082)\\n\\n\\n## What are the goals of next week\\n\\n- Introduce reliability network layer [#1074] (https://github.com/input-output-hk/hydra/pull/1074)\\n- Refactor the vCommit validator in Aiken [#1072](https://github.com/input-output-hk/hydra/pull/1072)"},{"id":"2023-09-29-ledger","metadata":{"permalink":"/cardano-updates/2023-09-29-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-ledger.md","source":"@site/blog/2023-09-29-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-09-29T00:00:00.000Z","formattedDate":"September 29, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.465,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-09-29-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-29-hydra"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-09-29-sre"}},"content":"## High level summary\\n\\nFew important Conway related features were completed in this two week period:\\n\\n* Constitutional Committee was the last missing Conway related entity that has now been\\n fully implemented.\\n* Treasury withdrawals governance actions have been fixed and now behave as expected.\\n* Current treasury amount supplied in the transaction is now enforced by the rules.\\n* DRep\'s expiry is prevented by delaying the expiry for all DReps whenever there are no\\nproposals to vote on.\\n* Semantics of how CostModels are updated with Protocol Parameters have been changed to\\nallow for individual Plutus language version updates, rather than requiring a complete\\nreplacement of all CostModels\\n\\nBesides the new features there were also important performance and testing improvements:\\n\\n* In particular stake distribution computation and native script handling received some\\noptimizations.\\n* New testing DSL has been implemented that drastically simplifies writing unit tests for\\nledger rules.\\n* Integration tests and benchmarks are now possible for Conway era because of the overhaul\\nof functionality for initial funds and staking injection whenever node starts up in\\nConway, while bypassing all previous eras.\\n\\n## Low level summary\\n\\n### Conway era\\n\\n* [pull-3729] - DRep expiry update after a contiguous set of epochs with no proposals to vote on\\n* [pull-3739] - Rename some PParams to be consistent with Agda specification\\n* [pull-3743] - Move DRepDistr from VState to ConwayGovState\\n* [pull-3746] - Implement `tcTranslationContextL` for Shelley\\n* [pull-3737] - Implement EraTransition\\n* [pull-3749] - Add predicate failure: current treasury value mismatch in LEDGER\\n* [pull-3748] - Apply enacted treasury withdrawals\\n* [pull-3745] - Constitutional Committee Ratification\\n* [pull-3763] - Plutus interface improvements\\n* [pull-3771] - Changed how costmodel updates are applied\\n* [pull-3766] - Prevent updating protocol version with `PParamUpdate`\\n\\n### Performance\\n\\n* [pull-3765] - Improve native script handling\\n* [pull-3747] - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin\\n* [pull-3758] - Cardano-Perf regression: UMap.size regression fix\\n* [pull-3754] - Use Alonzo-style TxOut encoder when possible\\n\\n### Releasing\\n\\n* [pull-3742] - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes\\n* [pull-3744] - Changelog 8.4\\n* [pull-3752] - Patch release of cardano ledger conway 1.8.1.0\\n* [pull-3753] - Minor cleanup and changelog entries\\n* [pull-3760] - Fixup issues for release\\n* [pull-3764] - Bump plutus deps to 1.13\\n\\n### Testing\\n\\n* [pull-3734] - Removed `Shaped` instance for `Rep`\\n* [pull-3735] - Simplify the implementations of `hasOrd` and `hasEq`\\n* [pull-3728] - STS tests based on constraints\\n* [pull-3714] - Implement the remaining upgradable families\\n* [pull-3733] - Add some unit tests for Conway features\\n* [pull-3762] - Update CDDL for praos headers.\\n\\n\\n[pull-3729]: https://github.com/input-output-hk/cardano-ledger/pull/3729\\n[pull-3739]: https://github.com/input-output-hk/cardano-ledger/pull/3739\\n[pull-3742]: https://github.com/input-output-hk/cardano-ledger/pull/3742\\n[pull-3744]: https://github.com/input-output-hk/cardano-ledger/pull/3744\\n[pull-3743]: https://github.com/input-output-hk/cardano-ledger/pull/3743\\n[pull-3746]: https://github.com/input-output-hk/cardano-ledger/pull/3746\\n[pull-3728]: https://github.com/input-output-hk/cardano-ledger/pull/3728\\n[pull-3737]: https://github.com/input-output-hk/cardano-ledger/pull/3737\\n[pull-3735]: https://github.com/input-output-hk/cardano-ledger/pull/3735\\n[pull-3747]: https://github.com/input-output-hk/cardano-ledger/pull/3747\\n[pull-3749]: https://github.com/input-output-hk/cardano-ledger/pull/3749\\n[pull-3748]: https://github.com/input-output-hk/cardano-ledger/pull/3748\\n[pull-3745]: https://github.com/input-output-hk/cardano-ledger/pull/3745\\n[pull-3734]: https://github.com/input-output-hk/cardano-ledger/pull/3734\\n[pull-3714]: https://github.com/input-output-hk/cardano-ledger/pull/3714\\n[pull-3752]: https://github.com/input-output-hk/cardano-ledger/pull/3752\\n[pull-3754]: https://github.com/input-output-hk/cardano-ledger/pull/3754\\n[pull-3753]: https://github.com/input-output-hk/cardano-ledger/pull/3753\\n[pull-3760]: https://github.com/input-output-hk/cardano-ledger/pull/3760\\n[pull-3758]: https://github.com/input-output-hk/cardano-ledger/pull/3758\\n[pull-3764]: https://github.com/input-output-hk/cardano-ledger/pull/3764\\n[pull-3762]: https://github.com/input-output-hk/cardano-ledger/pull/3762\\n[pull-3763]: https://github.com/input-output-hk/cardano-ledger/pull/3763\\n[pull-3733]: https://github.com/input-output-hk/cardano-ledger/pull/3733\\n[pull-3771]: https://github.com/input-output-hk/cardano-ledger/pull/3771\\n[pull-3765]: https://github.com/input-output-hk/cardano-ledger/pull/3765\\n[pull-3766]: https://github.com/input-output-hk/cardano-ledger/pull/3766"},{"id":"2023-09-29-sre","metadata":{"permalink":"/cardano-updates/2023-09-29-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-sre.md","source":"@site/blog/2023-09-29-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-09-29T00:00:00.000Z","formattedDate":"September 29, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":0.68,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-09-29-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-09-29-ledger"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-09-27-mithril"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent changes, updates or improvements include:\\n* Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node [8.4.0-pre](https://github.com/input-output-hk/cardano-node/releases/tag/8.4.0-pre).\\n* The use of cardano-node [docker hub](https://hub.docker.com/r/inputoutput/cardano-node) will be deprecated in preference of [GHCR](https://github.com/input-output-hk/cardano-node/pkgs/container/cardano-node)\\n\\n## Lower level summary\\n\\n### Capkgs\\n* Refactor parsing scripts, add github action automation, various bugfixes and cleanup: [capkgs-compare](https://github.com/input-output-hk/capkgs/compare/c2c7680...a274b72)\\n\\n### Cardano-parts\\n* Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: [cardano-parts-pull-8](https://github.com/input-output-hk/cardano-parts/pull/14)\\n\\n### Cardano-playground\\n* Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: [cardano-playground](https://github.com/input-output-hk/cardano-playground/pull/2)\\n\\n### Cardano-world\\n* Update sanchonet network to cardano-node 8.4.0: [cardano-world-compare](https://github.com/input-output-hk/cardano-world/compare/8cb559a...3edafb9)\\n* Rotate KES on shelley-qa: [cardano-world-commit](https://github.com/input-output-hk/cardano-world/commit/8301b044ad106ff8ca71dcbbdb5b17fe9ec6fc6d)"},{"id":"2023-09-27-mithril","metadata":{"permalink":"/cardano-updates/2023-09-27-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-27-mithril.md","source":"@site/blog/2023-09-27-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-09-27T00:00:00.000Z","formattedDate":"September 27, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":0.975,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-09-27-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-09-29-sre"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-09-26-node-cli-api"}},"content":"## High level overview\\nThe Mithril team has released a new distribution [`2337.0`](https://github.com/input-output-hk/mithril/releases/tag/2337.0), which includes the following enhancements: support for `zstandard` compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator.\\n\\nThey also completed the refactoring and standardization of the errors in the Mithril nodes and published an [Architectural decision record](https://mithril.network/doc/adr/6) on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure.\\n\\nFinally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs.\\n\\n## Low level overview\\n- Completed the issue **Release new `2337` distribution** [#1219](https://github.com/input-output-hk/mithril/issues/1219)\\n- Completed the issue **Errors refactoring** [#798](https://github.com/input-output-hk/mithril/issues/798)\\n- Completed the issue **Client traffic creates performance bottleneck in aggregator** [#1207](https://github.com/input-output-hk/mithril/issues/1207)\\n- Completed the issue **Record statistics about the downloaded snapshot in the aggregator** [#1127](https://github.com/input-output-hk/mithril/issues/1127)\\n- Completed the issue **Create a SPO checklist for KES keys update** [#1267](https://github.com/input-output-hk/mithril/issues/1267)\\n- Worked on the issue **Spike: Run client in browser WASM PoC** [#1254](https://github.com/input-output-hk/mithril/issues/1254)\\n- Worked on the issue **Benchmark aggregator performances** [#1220](https://github.com/input-output-hk/mithril/issues/1220)\\n- Worked on the issue **Activate Cloudflare protection of infrastructure** [#1230](https://github.com/input-output-hk/mithril/issues/1230)"},{"id":"2023-09-26-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-09-26-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-26-node-cli-api.md","source":"@site/blog/2023-09-26-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-09-26T00:00:00.000Z","formattedDate":"September 26, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.68,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-09-26-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-09-27-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-22-hydra"}},"content":"# 2023-09-13 - 2023-09-26\\n\\n## High level summary\\n* [cardano-node 8.4.0-pre](https://github.com/input-output-hk/cardano-node/releases/tag/8.4.0-pre) release suitable for SanchoNet.\\n* CLI continues making progress integrating governance features. During this sprint we integrated the **info** and **new-committee** governance actions.\\n* The team continued moving to the ERA top-level commands structure. Removed `--conway-era` flag from the legacy commands making conway era commands only accessible via `cardano-cli conway`.\\n* `stake-pool` command is now under the ERA top level structure.\\n* API continues integration with governance features, it is worth to higlight that now _ProposeNewCommitee_ uses the right key type (cc-cold)\\n\\n### cardano-cli\\n\\n- [Disambiguate 2-n flags in governance new-committee action](https://github.com/input-output-hk/cardano-cli/pull/302)\\n- [New version `cardano-cli-8.10.0.0`](https://github.com/input-output-hk/cardano-cli/pull/298)\\n- [Upgrade to `cardano-api-8.20.2`](https://github.com/input-output-hk/cardano-cli/pull/295)\\n- [cardano-cli: add governance create-info command](https://github.com/input-output-hk/cardano-cli/pull/292)\\n- [Release 8.9.0.0](https://github.com/input-output-hk/cardano-cli/pull/287)\\n- [Export `Cardano.CLI.Legacy.Options.pLegacyCardanoEra` for cardano-testnet](https://github.com/input-output-hk/cardano-cli/pull/286)\\n- [Rename `SomeWitness` to `SomeSigningWitness`. Rename constructors to avoid name conflicts.](https://github.com/input-output-hk/cardano-cli/pull/284)\\n- [Update cardano-api to 8.20.1.0](https://github.com/input-output-hk/cardano-cli/pull/283)\\n- [Remove unused governance-related code](https://github.com/input-output-hk/cardano-cli/pull/282)\\n- [Fix typo in stake-pool help text and clarify drep queries arguments](https://github.com/input-output-hk/cardano-cli/pull/281)\\n- [Remove redundant conversions in JSON friendly instances ](https://github.com/input-output-hk/cardano-cli/pull/280)\\n- [Regularise era based command structure](https://github.com/input-output-hk/cardano-cli/pull/279)\\n- [Simplify era handling](https://github.com/input-output-hk/cardano-cli/pull/277)\\n- [Remove `--conway-era` flag](https://github.com/input-output-hk/cardano-cli/pull/276)\\n- [Era-based `stake-pool` command](https://github.com/input-output-hk/cardano-cli/pull/275)\\n- [Fix git revision in `version` command](https://github.com/input-output-hk/cardano-cli/pull/274)\\n- [cardano-cli-8.8.0.0](https://github.com/input-output-hk/cardano-cli/pull/273)\\n\\n### cardano-api\\n\\n- [Organise eon re-exports. Export `MaryEraOnwards`](https://github.com/input-output-hk/cardano-api/pull/265)\\n- [cardano-api-internal: ProposeNewCommittee: StakeKey -> CommitteeColdKey](https://github.com/input-output-hk/cardano-api/pull/264)\\n- [New version `cardano-api-8.21.0.0`](https://github.com/input-output-hk/cardano-api/pull/262)\\n- [Delete unused eon constraints](https://github.com/input-output-hk/cardano-api/pull/256)\\n- [Export ByronEraOnly](https://github.com/input-output-hk/cardano-api/pull/255)\\n- [Replace only `AdaSupportedInEra` and `MultiAssetSupportedInEra` with eons](https://github.com/input-output-hk/cardano-api/pull/254)\\n- [New version `cardano-api-8.20.2.0`](https://github.com/input-output-hk/cardano-api/pull/250)\\n- [Add JSON instance for Hash GenesisKey ](https://github.com/input-output-hk/cardano-api/pull/249)\\n- [Support more ledger constraints](https://github.com/input-output-hk/cardano-api/pull/248)\\n- [Rename `FeatureInEra` to `Eon`](https://github.com/input-output-hk/cardano-api/pull/247)\\n- [Release 8.20.1.0](https://github.com/input-output-hk/cardano-api/pull/246)\\n- [Fix DRep Stake and DRep Stake queries for empty lists](https://github.com/input-output-hk/cardano-api/pull/245)\\n- [Delete `TxFeesExplicitInEra` and `TxFeesImplicitInEra`](https://github.com/input-output-hk/cardano-api/pull/244)\\n- [Fix typos in some deserialization error messages](https://github.com/input-output-hk/cardano-api/pull/243)\\n- [Fix querying for dreps in `transaction build` in eras before conway](https://github.com/input-output-hk/cardano-api/pull/240)\\n\\n### cardano-node\\n\\n- [Trace Configuration Trace Message Enhancement](https://github.com/input-output-hk/cardano-node/pull/5480)\\n- [Bump versions for cardano-node-8.4.0-pre](https://github.com/input-output-hk/cardano-node/pull/5474)\\n- [Updated dependencies for cardano-node-8.4.0-pre](https://github.com/input-output-hk/cardano-node/pull/5467)\\n- [cardano-node: reduce orphan instances](https://github.com/input-output-hk/cardano-node/pull/5466)\\n\\n### cardano-testnet\\n\\n- [Bump versions for cardano-node-8.4.0-pre](https://github.com/input-output-hk/cardano-node/pull/5474)\\n- [Update to cardano-cli 8.9.0.0](https://github.com/input-output-hk/cardano-node/pull/5471)\\n- [Updated dependencies for cardano-node-8.4.0-pre](https://github.com/input-output-hk/cardano-node/pull/5467)\\n\\n### docs\\n\\n### CI & project maintenance"},{"id":"2023-09-22-hydra","metadata":{"permalink":"/cardano-updates/2023-09-22-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-22-hydra.md","source":"@site/blog/2023-09-22-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-09-22T00:00:00.000Z","formattedDate":"September 22, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.035,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-09-22-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-09-26-node-cli-api"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-09-22-performance-and-tracing"}},"content":"## High-level summary\\n\\nThis week, the Hydra team conducted the monthly review meeting in\\ncollaboration with Mithril, enhancing project coordination.\\n\\nThe team improved the gen-hydra-key node command for smoother usability\\nand identified concrete steps to enhance network resiliency in feature\\nitems [#188](https://github.com/input-output-hk/hydra/issues/188),\\n[#1080](https://github.com/input-output-hk/hydra/issues/1080), and\\n[#1079](https://github.com/input-output-hk/hydra/issues/1079).\\nAdditionally, they contributed the aiken-mode editor integration to the\\naiken-lang organization, updated dependencies to utilize cardano-api\\n8.20, and published the Hydra security advisory CVE-2023-42806 with a\\nworkaround available for users.\\n\\nThese efforts demonstrate the team\\\\\'s commitment to project improvement,\\nsecurity, and open-source community collaboration.\\n\\n## What did the team achieve this week\\n\\n- Conducted the monthly review meeting together with Mithril\\n- Improved gen-hydra-key node command\\n [#1077](https://github.com/input-output-hk/hydra/pull/1077)\\n- Established a clear plan to improve resiliency of network and manifested\\n feature items [#188](https://github.com/input-output-hk/hydra/issues/188),\\n [#1080](https://github.com/input-output-hk/hydra/issues/1080) and\\n [#1079](https://github.com/input-output-hk/hydra/issues/1079)\\n- Moved [aiken-mode](https://github.com/aiken-lang/aiken-mode) (created by SN)\\n to aiken-lang organization\\n- Updated dependencies to using cardano-api 8.20\\n [#1075](https://github.com/input-output-hk/hydra/pull/1075)\\n- Published security advisory\\n [CVE-2023-42806](https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq)\\n (workaround available)\\n\\n## What are the goals of next week\\n\\n- Write-up the monthly report for September\\n- Finish \\"network resilience to disconnects\\"\\n [#188](https://github.com/input-output-hk/hydra/issues/188)\\n- Finish kupo integration with hydra\\n [#1078](https://github.com/input-output-hk/hydra/issues/1078)\\n- Discuss and decide on using aiken or not\\n- Address the published security advisory\\n [CVE-2023-42806](https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq)\\n (to not require workaround)\\n- Ideally, release 0.13.0"},{"id":"2023-09-22-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-09-22-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-22-performance-and-tracing.md","source":"@site/blog/2023-09-22-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-09-22T00:00:00.000Z","formattedDate":"September 22, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.445,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-09-22-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-22-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-09-20-consensus"}},"content":"## High level summary\\n\\n* Benchmarking: We\'ve performed both low-level network and high-level variance analysis of our benchmarking clusters.\\n* Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time.\\n* Tracing: Work on machine-readable tracing of tracer configuration is ongoing.\\n* Nomad backend: We\'ve been able to eliminate several possible confounders on the nomad cluster.\\n* Team: We\'re currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Bl\xf6ndal!\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nAs part of the effort to bring the Nomad backend into production use, we\'ve been equipping both that and the existing benchmarking\\nbackend with means to measure and document network latency for each run. Furthermore we\'ve implemented means to\\ncapture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences\\nin the behaviour of the underlying networking stack at OS level. \\n\\nAdditionally, we\'re running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We\'ve concluded that baseline profile runs aren\'t directly comparable between the two, so we decided\\nto compare standard deviations instead to validate the measurements from nomad.\\n\\n### Infrastructure\\n\\nReporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline\\nhave been merged to `master`. They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis. \\n\\nBeyond that, we\'ve looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for `trace-dispatcher` and `tx-generator` we were able to address those issues.\\n\\n### Tracing\\n\\nAfter various steps in constructing a configuration upon node startup, it is vital to document\\nwhich runtime configuration the node arrived eventually. We\'re working on providing a machine-readable JSON/YAML\\ntrace message for that purpose. \\n\\nThis will facilitate hot-reloading a node\'s tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node. \\n\\n### Nomad backend\\n\\nAs with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it\\nproduces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an\\nimpact on our measurements, as we\'d be basically using two different instruments to take them. \\n\\nAlong the way we\'ve already been successful in eliminating some possible confounders that had been introduced by the nomad service\\nor the slightly different system architecture of the new cluster.\\n\\n### New team member\\n\\nBaldur Bl\xf6ndal is an extremely capable and experienced Haskell developer. Also, he\'s an excellent fit for our existing team.\\nSo I\'m very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on `cardano-tracer`, the component receiving, processing and making available node traces and metrics."},{"id":"2023-09-20-consensus","metadata":{"permalink":"/cardano-updates/2023-09-20-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-20-consensus.md","source":"@site/blog/2023-09-20-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-09-20T00:00:00.000Z","formattedDate":"September 20, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.82,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-09-20-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-09-22-performance-and-tracing"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-09-20-mithril"}},"content":"## High level summary\\n\\nWe have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks.\\nWe are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough.\\nOn the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain.\\nWe also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway.\\n\\n### UTxO-HD\\n\\n- We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version ([349](https://github.com/input-output-hk/ouroboros-consensus/pull/349)). System level benchmark results are pending.\\n- Regarding the workaround to keep the node\'s baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders ([344](https://github.com/input-output-hk/ouroboros-consensus/issues/344)), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run.\\n- We also brought the `UTxO-HD` branch up to date with node version `8.4.0`.\\n\\n### Genesis\\n\\n- We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain.\\n We are now drafting the final self-contained argument. ([4157](https://github.com/input-output-hk/ouroboros-network/issues/4157))\\n\\n### Support\\n\\n- We debugged a bad parameter update on the `Babbage` to `Conway` transition in the SanchoNet testnet ([339](https://github.com/input-output-hk/ouroboros-consensus/issues/339)).\\n A superficial patch is within reach and we are in the process of reviewing the PRs related to this fix ([340](https://github.com/input-output-hk/ouroboros-consensus/pull/340), [354](https://github.com/input-output-hk/ouroboros-consensus/pull/354), and [355](https://github.com/input-output-hk/ouroboros-consensus/pull/355))\\n However we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the `ConsensusProtocol` type class and the `HardForkBlock` combinator ([345](https://github.com/input-output-hk/ouroboros-consensus/issues/345) and [346](https://github.com/input-output-hk/ouroboros-consensus/pull/346)). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later."},{"id":"2023-09-20-mithril","metadata":{"permalink":"/cardano-updates/2023-09-20-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-20-mithril.md","source":"@site/blog/2023-09-20-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-09-20T00:00:00.000Z","formattedDate":"September 20, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":0.935,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-09-20-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-09-20-consensus"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-09-15-goedel"}},"content":"## High level overview\\nThis week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports. \\n\\nFinally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution.\\n\\n## Low level overview\\n- Completed the issue **Add snapshot compression parameters in infrastructure deployments** [#1200](https://github.com/input-output-hk/mithril/issues/1200)\\n- Completed the issue **Add Cloudflare protection of infrastructure** [#986](https://github.com/input-output-hk/mithril/issues/986)\\n- Worked on the issue **Record statistics about the downloaded snapshot in the aggregator** [#1127](https://github.com/input-output-hk/mithril/issues/1127)\\n- Worked on the issue **Error refactoring** [#798](https://github.com/input-output-hk/mithril/issues/798)\\n- Worked on the issue **Activate Cloudflare protection of infrastructure** [#1230](https://github.com/input-output-hk/mithril/issues/1230)\\n- Worked on the issue **Release new `2337` distribution** [#1219](https://github.com/input-output-hk/mithril/issues/1219)\\n- Completed the issue **Upgrade dependencies** [#1238](https://github.com/input-output-hk/mithril/issues/1238)"},{"id":"2023-09-15-goedel","metadata":{"permalink":"/cardano-updates/2023-09-15-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-goedel.md","source":"@site/blog/2023-09-15-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-09-15T00:00:00.000Z","formattedDate":"September 15, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.44,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-09-15-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-09-20-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-15-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThe team is currently formalising mini protocols and also further\\ndeveloping the performance modelling prototype.\\n\\n## Details\\n\\n* working on collating and open sourcing performance analysis prototype\\n\\n* improvements to Ouroboros Praos specification in Isabelle\\n\\n* working on formalising chain sync mini-protocol\\n\\n* reviewing an alternatice semantics for DeltaQ\\n\\n* Seminar talk at U. Bergen on algebraic properties of timeliness"},{"id":"2023-09-15-hydra","metadata":{"permalink":"/cardano-updates/2023-09-15-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-hydra.md","source":"@site/blog/2023-09-15-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-09-15T00:00:00.000Z","formattedDate":"September 15, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.94,"hasTruncateMarker":false,"authors":[{"name":"Sasha Bogicevic","title":"Hydra Software Engineer","url":"https://github.com/v0d1ch","imageURL":"https://github.com/v0d1ch.png","key":"v0d1ch"},{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-09-15-hydra","authors":["v0d1ch","ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-09-15-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-09-15-ledger"}},"content":"## High-level summary\\n\\nThis week, most of the Hydra team was attending a cardano scaling workshop in\\nNantes, France. They used this oportunity to meet fellow mithril team and spend\\nsome time together to hack on some code and, as always, reflect on the past work\\nand find optimal path forward for both projects. They also fixed a bug that\\ncaused hydra-node to crash when querying L1, worked on a new network resillience\\nproof-of-concept and accepted a new ADR related to stateless transaction\\nobservation.\\n\\n## What did the team achieve this week\\n\\n- Cardano scaling workshop with members of hydra and mithril teams \\n- Accepted user contribution for possible new use-case [#1048](https://github.com/input-output-hk/hydra/pull/1048)\\n- Fix for the hydra-node crash related to internal wallet query [#1053](https://github.com/input-output-hk/hydra/pull/1053)\\n- Collected experimental CI findings [#1070](https://github.com/input-output-hk/hydra/pull/1070)\\n- Propose first POC for the network resilience [#1074](https://github.com/input-output-hk/hydra/pull/1074)\\n\\n## What are the goals of next week\\n\\n- Monthly review meeting & report including updates from Mithril\\n- Review POC and discuss our options for the network resilience\\n- Update cardano-api to version 8.20\\n- Address TODOs on aiken commit validator [#1072](https://github.com/input-output-hk/hydra/pull/1072)\\n- Complete hydra-support in kupo [kupo#117](https://github.com/CardanoSolutions/kupo/pull/117)"},{"id":"2023-09-15-ledger","metadata":{"permalink":"/cardano-updates/2023-09-15-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-ledger.md","source":"@site/blog/2023-09-15-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-09-15T00:00:00.000Z","formattedDate":"September 15, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.645,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-09-15-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-15-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-09-15-network"}},"content":"## High level summary\\n\\nThe Ledger team\'s focus is still mainly on the Conway era implementation.\\n\\nWe were able to add ability to specify initial Constitutional Comittee and the initial\\nversion of Constitution. Priority in which Governance Action are now enacted matches the\\nspecification. DRep\'s deposits are now properly accounted for. Governance actions that are\\nnot allowed to be voted on by Stake Pool operators and Constitutional Committee members\\nare prevented by transaction submission failure, rather than simply being ignored. There\\nwas a few important CDDL fixes as well as a lot of new round trip serialization\\ntests. Constraint based testing framework has also received a lot of improvements.\\n\\n## Low level summary\\n\\n### Conway era\\n\\n* [pull-3681] - Conway Genesis additions\\n* [pull-3690] - Preserve the order of ProposalProcedures\\n* [pull-3705] - Removed ProtVer from EnactState\\n* [pull-3700] - Add conway-specific certs to deposit/refunds\\n* [pull-3704] - Add comments on deprecating certs to Conway CDDL\\n* [pull-3698] - Reordering of governance actions\\n* [pull-3712] - Disallow empty fields in ConwayTxBodyRaw\\n* [pull-3716] - Abstract threshold calculation\\n* [pull-3725] - Fix mistaken use of dollar sign in cddl files\\n* [pull-3718] - Predicate failure for mismatched Voter GovAction\\n* [pull-3721] - Committee expiration, validation and modification\\n\\n### Improvements and releasing\\n\\n* [pull-3629] - Add rule-transition diagrams in dot syntax\\n* [pull-3680] - Bump Plutus deps to 1.11\\n* [pull-3708] - Post release changes\\n\\n### Testing\\n\\n* [pull-3730] - Implement `Show` instance for `Rep` using `IsTypeable`\\n* [pull-3697] - Rewrite testEql using Typeable to make it impossible to forget cases\\n* [pull-3709] - Add many new features to the Constrained modues in cardano-ledger-test\\n* [pull-3726] - Conway and other eras serialization roundtrip tests\\n* [pull-3713] - Improve CI resiliency against GitHub issues\\n\\n[pull-3681]: https://github.com/input-output-hk/cardano-ledger/pull/3681\\n[pull-3690]: https://github.com/input-output-hk/cardano-ledger/pull/3690\\n[pull-3705]: https://github.com/input-output-hk/cardano-ledger/pull/3705\\n[pull-3680]: https://github.com/input-output-hk/cardano-ledger/pull/3680\\n[pull-3708]: https://github.com/input-output-hk/cardano-ledger/pull/3708\\n[pull-3700]: https://github.com/input-output-hk/cardano-ledger/pull/3700\\n[pull-3704]: https://github.com/input-output-hk/cardano-ledger/pull/3704\\n[pull-3698]: https://github.com/input-output-hk/cardano-ledger/pull/3698\\n[pull-3713]: https://github.com/input-output-hk/cardano-ledger/pull/3713\\n[pull-3712]: https://github.com/input-output-hk/cardano-ledger/pull/3712\\n[pull-3697]: https://github.com/input-output-hk/cardano-ledger/pull/3697\\n[pull-3629]: https://github.com/input-output-hk/cardano-ledger/pull/3629\\n[pull-3716]: https://github.com/input-output-hk/cardano-ledger/pull/3716\\n[pull-3725]: https://github.com/input-output-hk/cardano-ledger/pull/3725\\n[pull-3718]: https://github.com/input-output-hk/cardano-ledger/pull/3718\\n[pull-3709]: https://github.com/input-output-hk/cardano-ledger/pull/3709\\n[pull-3726]: https://github.com/input-output-hk/cardano-ledger/pull/3726\\n[pull-3721]: https://github.com/input-output-hk/cardano-ledger/pull/3721\\n[pull-3730]: https://github.com/input-output-hk/cardano-ledger/pull/3730"},{"id":"2023-09-15-network","metadata":{"permalink":"/cardano-updates/2023-09-15-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-network.md","source":"@site/blog/2023-09-15-network.md","title":"Network Team Update","description":"High-level overview of sprint 44","date":"2023-09-15T00:00:00.000Z","formattedDate":"September 15, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.41,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-09-15-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-09-15-ledger"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-09-15-sre"}},"content":"## High-level overview of [sprint 44][sprint-44]\\n\\n### Bootstrap Peers\\n\\nIn this sprint, we focused on developing bootstrap peers.\\n\\nThanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we\\nidentified a possible improvement to bootstrap peers. A more detailed\\ndescription is available [here][ouroboros-network-#4675].\\n\\n### Cardano-Node-8.4.0 Release\\n\\nWe also were responsible for the `cardano-node-8.4.0-pre` release. A final\\nintegration [PR][cardano-node-#5467] is currently being merged. We published\\nnew versions of `ouroboros-consensus`, `cardano-api` and `cardano-cli`.\\n\\n### Towards Typed Protocols 0.2.0.0\\n\\nWe also updated the future `typed-protocols-0.2.0.0` and its integration with\\n`cardano-node`. This is towards our goal which we planned for the next\\nquarter. The identified tasks are to fix breaking tests, and then measure and\\naddress possible performance regressions.\\n\\n### Tech Debt\\n\\nMark Tullsen (Galois) submitted two more PRs: [ouroboros-network-#4663],\\n[ouroboros-network-#4664]. We provided feedback on their other pull requests: [ouroboros-network-#4661] and \\n[ouroboros-network-#4660].\\n\\n### P2P adoption\\n\\nIn the last two weeks, there was a regression in P2P adoption concerning\\nthe number of SPOs or stakes, although the number of overall P2P relays has\\nincreased. Karl Knutsson ([Cardano Foundation][CF]) is investigating \\nthis issue.\\n![P2P relays](/images/network/2023-09-14-p2p-relays.png)\\n\\n\\nThe following graphs show several different versions of relays running on the mainnet. The\\ngreen line `NodeToNodeVersionV10.True` denotes P2P relays, which slowly\\nincrease over time. The `V9` and earlier versions of the `node-to-node`\\nthe protocol indicates nodes version `1.35.x` or earlier.\\n![node versions](/images/network/2023-09-14-relay-versions.png)\\n\\nData has been kindly provided by [Cardano Foundation][CF] and their mainnet\\nmonitoring infrastructure.\\n\\n### Open Source\\n\\nWe are in the process of upstreaming our ffi to Windows Named Pipes API to the `Win32` package, see [win32-220].\\n\\n[CF]: https://cardanofoundation.org/\\n[Galois]: https://galois.com/\\n[cardano-node-#5467]: https://github.com/input-output-hk/cardano-node/pull/5467\\n[ouroboros-network-#3836]: https://github.com/input-output-hk/ouroboros-network/issues/3836\\n[ouroboros-network-#4660]: https://github.com/input-output-hk/ouroboros-network/pull/4660\\n[ouroboros-network-#4661]: https://github.com/input-output-hk/ouroboros-network/pull/4661\\n[ouroboros-network-#4663]: https://github.com/input-output-hk/ouroboros-network/pull/4663\\n[ouroboros-network-#4664]: https://github.com/input-output-hk/ouroboros-network/pull/4664\\n[ouroboros-network-#4675]: https://github.com/input-output-hk/ouroboros-network/issues/4675\\n[sprint-44]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+44%22\\n[win32-#220]: https://github.com/haskell/win32/pull/220"},{"id":"2023-09-15-sre","metadata":{"permalink":"/cardano-updates/2023-09-15-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-sre.md","source":"@site/blog/2023-09-15-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-09-15T00:00:00.000Z","formattedDate":"September 15, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":1.055,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-09-15-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-09-15-network"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-09-14-db-sync"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent updates or improvements include:\\n* Sanchonet environment was updated to 8.3.0-pre.\\n* [Cardano-parts](https://github.com/input-output-hk/cardano-parts) now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is [here](https://github.com/input-output-hk/cardano-playground/blob/main/flake/colmena.nix#L89-L108).\\n\\n## Lower level summary\\n\\n### Capkgs\\n* Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: [capkgs-compare](https://github.com/input-output-hk/capkgs/compare/f3dcffb...c2c7680)\\n\\n### Cardano-ops\\n* Adjust mainnet p2p relays to ~100%, with a legacy canary: [cardano-ops-commit](https://github.com/input-output-hk/cardano-ops/commit/d3cce2585fae6a52ff5833373137af3cddbc6710)\\n\\n### Cardano-parts\\n* Utilize content addressed binaries to significantly improve eval, build and devShell performance: [cardano-parts-pull-8](https://github.com/input-output-hk/cardano-parts/pull/8)\\n* Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: [cardano-parts-pull-10](https://github.com/input-output-hk/cardano-parts/pull/10)\\n* Fix warns thrown during some builds and devShell usage: [cardano-parts-pull-11](https://github.com/input-output-hk/cardano-parts/pull/11)\\n* Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: [cardano-parts-pull-12](https://github.com/input-output-hk/cardano-parts/pull/12)\\n* Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: [cardano-parts-pull-13](https://github.com/input-output-hk/cardano-parts/pull/13)\\n\\n### Cardano-perf\\n* Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: [cardano-perf-compare](https://github.com/input-output-hk/cardano-perf/compare/9f9917c...7fc1b4c)\\n\\n### Cardano-playground\\n* Define preliminary cardano-world networks on cardano-playground: [cardano-playground](https://github.com/input-output-hk/cardano-playground/pull/1)\\n\\n### Cardano-world\\n* Rotate KES on preview and preprod, purge unused subnets, adjust explorer rate limits: [cardano-world-compare](https://github.com/input-output-hk/cardano-world/compare/306ef6c...e9b2ed2)\\n* Update sanchonet network to 8.3.0: [cardano-world-compare](https://github.com/input-output-hk/cardano-world/compare/master...sanchonet-updated)"},{"id":"2023-09-14-db-sync","metadata":{"permalink":"/cardano-updates/2023-09-14-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-14-db-sync.md","source":"@site/blog/2023-09-14-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-09-14T00:00:00.000Z","formattedDate":"September 14, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.47,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-09-14-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-09-15-sre"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-09-12-node-cli-api"}},"content":"## High level summary\\nWe have created a DBSync tag `sancho-1-1-0` which can follow sanchonet. Also\\nthe team has ran a number of benchmarks and tests for the new options/flavours of DBSync\\nand prepared a blogpost which summorises them, for downstream components.\\n\\n## Lower level summary\\n- Integration of node-8.3.x and support for Sanchonet on Conway\\n[#1498](https://github.com/input-output-hk/cardano-db-sync/pull/1498)\\n- Simplifications of new feautures\\n[#1496](https://github.com/input-output-hk/cardano-db-sync/pull/1496)\\n- Makes it impossible to restart DBSync with different schema options and adds\\ntests for them\\n[#1466](https://github.com/input-output-hk/cardano-db-sync/pull/1466)\\n- CI fixes\\n[#1494](https://github.com/input-output-hk/cardano-db-sync/pull/1494)\\n[#1491](https://github.com/input-output-hk/cardano-db-sync/pull/1491)\\n- Prepared a blogpost about different DBSync options\\n[blog](https://github.com/input-output-hk/cardano-db-sync/blob/blog/blog/blog.pdf)"},{"id":"2023-09-12-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-09-12-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-12-node-cli-api.md","source":"@site/blog/2023-09-12-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-09-12T00:00:00.000Z","formattedDate":"September 12, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":2.605,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-09-12-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-09-14-db-sync"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-08-hydra"}},"content":"# 2023-08-30 - 2023-09-12\\n\\n## High level summary\\n\\nRelease of [Cardano-node 8.3.0-pre](https://github.com/input-output-hk/cardano-node/releases/tag/8.3.0-pre) for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs.\\nThis release completes [phase 2 of SanchoNet feature roll out plan](https://sancho.network/get-started#sanchonet-feature-rollout)\\n\\nCLI continues on its migration to a era-based top-level commands. This sprint we moved `text-view`, `key`, `query`, `genesis`, `node`, `stake-address`, `transaction` and `address` into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints.\\n\\nWe are moving the `drep delegation-certificate` to the stake-address command so delegating to a drep is done via `stake-addres vote-delegation-certificate`. Along the same lines, we are renaming\\n`stake-address delegation-certificate` (delagating to a stake pool) to `stake-address stake-delegation-certificate` to distinguish between stake delegation to a pool and votes delegation to a drep. On top\\nof that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly `stake-address stake-and-vote-delegation-certificate`. Note that change is not included on 8.3 but will come on 8.4.\\nRemoving `--conway-era` flag from all the `transaction` sub-commands.\\n\\nUpdate description fields in delegation certificates from `Stake Address Delegation Certificate` to respectively (Conway onwards):\\n - `Stake Delegation Certificate`\\n - `Vote Delegation Certificate`\\n - `Stake and Vote Delegation Certificate`\\n\\n### cardano-cli\\n\\n- [New `stake-address vote-delegation-certificate` command](https://github.com/input-output-hk/cardano-cli/pull/261)\\n- [New `stake-address stake-and-vote-delegation-certificate` command](https://github.com/input-output-hk/cardano-cli/pull/257)\\n- [Change `TreasuryWithdrawalCmd` to a record](https://github.com/input-output-hk/cardano-cli/pull/260)\\n- [Simplify `stake-address stake-delegation-certificate` command across eras](https://github.com/input-output-hk/cardano-cli/pull/256)\\n- [Remove `EraBased` prefix and add `Cmd` suffix](https://github.com/input-output-hk/cardano-cli/pull/254)\\n- [#221 Update description fields on delegation certificates](https://github.com/input-output-hk/cardano-cli/pull/250)\\n- [Update error message for eras mismatch between node and cli](https://github.com/input-output-hk/cardano-cli/pull/249)\\n- [Era based `address` commands](https://github.com/input-output-hk/cardano-cli/pull/248)\\n- [Consistent naming for `stake-pool` command related types, functions and modules](https://github.com/input-output-hk/cardano-cli/pull/246)\\n- [Disable `redundant-constraints` warning only on `ghc-8.10.7`](https://github.com/input-output-hk/cardano-cli/pull/245)\\n- [Remove `EraBased` prefix from era-based commands](https://github.com/input-output-hk/cardano-cli/pull/244)\\n- [Rename `delegation-certificate` to `stake-delegation-certificate` only in era-based command structure](https://github.com/input-output-hk/cardano-cli/pull/243)\\n- [Move `node` run commands implementation into era based](https://github.com/input-output-hk/cardano-cli/pull/242)\\n- [Era-based `stake-address` command group](https://github.com/input-output-hk/cardano-cli/pull/241)\\n- [Remove duplicate instances and add new `FeatureInEra ShelleyBasedEra` instance](https://github.com/input-output-hk/cardano-cli/pull/240)\\n- [Remove `EraBased` prefix from errors](https://github.com/input-output-hk/cardano-cli/pull/239)\\n- [Move `text-view` run commands implementation into era-based](https://github.com/input-output-hk/cardano-cli/pull/238)\\n- [Move `key` run commands implementation into era based](https://github.com/input-output-hk/cardano-cli/pull/237)\\n- [Move `query` run commands implementation into era based](https://github.com/input-output-hk/cardano-cli/pull/236)\\n- [Move `genesis` run commands implementation into era based](https://github.com/input-output-hk/cardano-cli/pull/235)\\n- [Move `pool` run commands implementation into era based](https://github.com/input-output-hk/cardano-cli/pull/234)\\n- [Move `stake-address` run commands implementation into era based](https://github.com/input-output-hk/cardano-cli/pull/233)\\n- [Move `address` run command implementation into era-based](https://github.com/input-output-hk/cardano-cli/pull/232)\\n- [Delete legacy `conway governance` commands](https://github.com/input-output-hk/cardano-cli/pull/231)\\n- [Era sensitive transaction run commands](https://github.com/input-output-hk/cardano-cli/pull/230)\\n- [Move transaction command code into era based](https://github.com/input-output-hk/cardano-cli/pull/229)\\n- [Fix query `key-period-info`](https://github.com/input-output-hk/cardano-cli/pull/228)\\n- [New `hprop_golden_shelleyStakeAddressRegistrationCertificateWithBuildRaw` test](https://github.com/input-output-hk/cardano-cli/pull/227)\\n- [Prefix complex delegation certificate option](https://github.com/input-output-hk/cardano-cli/pull/225)\\n\\n### cardano-api\\n\\n- [Fix test constraints functions](https://github.com/input-output-hk/cardano-api/pull/233)\\n- [New `caseShelleyToBabbageAndConwayEraOnwards` function](https://github.com/input-output-hk/cardano-api/pull/231)\\n- [Delete deprecated functions and types](https://github.com/input-output-hk/cardano-api/pull/230)\\n- [Release 8.19.0.0](https://github.com/input-output-hk/cardano-api/pull/228)\\n- [`FeatureInEra` instances for `CardanoEra` and `ShelleyBasedEra`](https://github.com/input-output-hk/cardano-api/pull/226)\\n- [New `mapSomeAddressVerification` key function](https://github.com/input-output-hk/cardano-api/pull/225)\\n- [Fix type signature of `queryGenesisParameters` so that it can be queried in any era](https://github.com/input-output-hk/cardano-api/pull/224)\\n- [Release 8.18.0.0](https://github.com/input-output-hk/cardano-api/pull/222)\\n- [Fix exception when executing drep queries](https://github.com/input-output-hk/cardano-api/pull/221)\\n\\n### cardano-node\\n\\n- [Cardano-node 8.3.0-pre](https://github.com/input-output-hk/cardano-node/releases/tag/8.3.0-pre)\\n- [Fix deadlock issue with stdout tracer in tx-generator](https://github.com/input-output-hk/cardano-node/pull/5460)\\n- [nix: workbench tracing configuration](https://github.com/input-output-hk/cardano-node/pull/5453)\\n\\n### cardano-testnet\\n\\n### docs\\n\\n### CI & project maintenance"},{"id":"2023-09-08-hydra","metadata":{"permalink":"/cardano-updates/2023-09-08-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-08-hydra.md","source":"@site/blog/2023-09-08-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-09-08T00:00:00.000Z","formattedDate":"September 8, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.06,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-09-08-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-09-12-node-cli-api"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-09-07-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team improved the commit process with support for inline\\ndatums. They simplified the chain layer by refactoring how the chain state is\\npersisted. Updates to the Hydra tutorial were completed, including CI workflows\\nto keep it up-to-date. The team engaged in discussions with researchers about\\nincremental commits & decommits, and drafted an architectural decision record\\nfor a resource-based API. They also explored simpler solutions for the upcoming\\nnetwork resilience feature.\\n\\n## What did the team achieve this week\\n\\n- Support InlineScriptDatum in commit\\n [#1043](https://github.com/input-output-hk/hydra/issues/1043)\\n- Refactored chain state persistency\\n [#1049](https://github.com/input-output-hk/hydra/pull/1049)\\n- Completed tutorial updates (by adding CI and some cleanup)\\n [#997](https://github.com/input-output-hk/hydra/issues/997)\\n- Intersect Open Source committee meeting\\n- Experimented with various models to better express the \\\\\\"Network\\n resilience problem\\\\\\" to find a KISS solution for\\n [#188](https://github.com/input-output-hk/hydra/issues/188)\\n- Drafted and discussed incremental de-/commit features within team\\n and with researchers\\n [#199](https://github.com/input-output-hk/hydra/issues/199) and\\n [#1057](https://github.com/input-output-hk/hydra/issues/1057)\\n- Created ADR for a resource based overhaul of the API\\n [#1028](https://github.com/input-output-hk/hydra/pull/1028)\\n\\n## What are the goals of next week\\n\\n- Meetup of Hydra & Mithril contributors in Nantes, France\\n- Integrated cardano-api 8.15 to have GHC 9.6 support\\n- A clear design for incremental commits (decommits are already\\n understood)\\n- An ADR for improving tx construction & observation to not need chain\\n state"},{"id":"2023-09-07-mithril","metadata":{"permalink":"/cardano-updates/2023-09-07-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-07-mithril.md","source":"@site/blog/2023-09-07-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-09-07T00:00:00.000Z","formattedDate":"September 7, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.53,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-09-07-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-08-hydra"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-09-07-performance-and-tracing"}},"content":"## High level overview\\nThe Mithril team has released a new distribution [`2335.0`](https://github.com/input-output-hk/mithril/releases/tag/2335.0) which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information.\\n\\nThey have also worked on snapshots enhancements: implementation of the `zstandard` compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes.\\n\\nFinally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client.\\n\\n## Low level overview\\n- Completed the issue `Use \'zstandard\' compression for snapshot archives` [#876](https://github.com/input-output-hk/mithril/issues/876)\\n- Completed the issue `Design & implement stress test tool for aggregator - phase 2` [#1155](https://github.com/input-output-hk/mithril/issues/1155)\\n- Completed the issue `Provide progress information with \'--json\' option in Client` [#1095](https://github.com/input-output-hk/mithril/issues/1095)\\n- Completed the issue `Make client download and extract the archive simultaneously` [#1115](https://github.com/input-output-hk/mithril/issues/1115)\\n- Completed the issue `Add aggregator Cardano node version in snapshot artifact` [#948](https://github.com/input-output-hk/mithril/issues/948)\\n- Completed the issue `Make Cardano node version part of the Mithril network configuration` [#947](https://github.com/input-output-hk/mithril/issues/947)\\n- Completed the issue `Post deployment \'mainnet\' infrastructure` [#1091](https://github.com/input-output-hk/mithril/issues/1091)\\n- Worked on the issue `Errors refactoring` [#798](https://github.com/input-output-hk/mithril/issues/798)\\n- Worked on the issue `Add Cloudflare protection of infrastructure` [#986](https://github.com/input-output-hk/mithril/issues/986)\\n- Completed the issue `Failed to restore recent snapshot with strange error` [#1160](https://github.com/input-output-hk/mithril/issues/1160)\\n- Completed the issue `Update \'ed25519-dalek\' to \'2.0.0\'` [#1188](https://github.com/input-output-hk/mithril/issues/1188)\\n- Completed the issue `Add target networks blocks in release notes` [#1151](https://github.com/input-output-hk/mithril/issues/1151)\\n- Completed the issue `Fix end to end \'wait_for_the_expected_time\' test` [#1191](https://github.com/input-output-hk/mithril/issues/1191)\\n- Completed the issue `Fix docs \'git checkout\' command` [#1174](https://github.com/input-output-hk/mithril/issues/1174)"},{"id":"2023-09-07-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-09-07-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-07-performance-and-tracing.md","source":"@site/blog/2023-09-07-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-09-07T00:00:00.000Z","formattedDate":"September 7, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.3,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-09-07-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-09-07-mithril"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-09-06-consensus"}},"content":"## High level summary\\n\\n* Benchmarking: We\'ve performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack.\\n* Infrastructure: Various improvements of our analysis pipeline have been merged to `master`, supporting safe log truncation.\\n* Tracing: Namespace consistency checks have been merged to `master` along with a curated configuration for benchmarking.\\n* Nomad backend: We\'re productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nWe\'ve completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer. \\n\\nWith our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance. \\n\\nThe Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack.\\n\\n### Infrastructure\\n\\nAs a result of optimizing in-memory representation of log objects, which are constructed from a node\'s traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation\\noperation that keeps the interdependencies of block events intact. \\n\\nTruncation might happen at a slightly different point\\nin time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time.\\n\\n### Tracing\\n\\nConsistency checking of namespace implementation and configuration when using the new system has been completed.\\nThis feature enables feedback on when tracer implementation details in some component might have changed. It\'s also able to detect when a configuration used for operating a `cardano-node` shows inconsistencies with the namespaces the system provides - and hence needs attention. \\n \\nFurthermore, we\'ve created a fine-grained configuration of the new system that caters to benchmarking\'s need of very many\\ndetailed trace messages. It\'s aimed at mirroring the same amount of trace messages, and information, we\'re seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable.\\n\\n### Nomad backend\\n\\nThe new backend is currently being used for further validation with regard to the existing cluster. Additionally, we\'re using it in production mode to comparatively benchmark both tracing systems after merging past month\'s optimizations - which is the\\nfirst real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend."},{"id":"2023-09-06-consensus","metadata":{"permalink":"/cardano-updates/2023-09-06-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-06-consensus.md","source":"@site/blog/2023-09-06-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-09-06T00:00:00.000Z","formattedDate":"September 6, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":2.22,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-09-06-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-09-07-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-09-01-goedel"}},"content":"## High level summary\\n\\nWe were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation.\\nOn the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers.\\nThe Consensus release engineer finished his rotation: version `8.3.0-pre` of `cardano-node` is releasing 2023 September 5.\\n\\n## UTxO-HD\\n\\n- We ran the first successful system-level benchmarks for UTxO-HD (see [#203](https://github.com/input-output-hk/ouroboros-consensus/issues/203)) using the *in-memory* backend.\\n - We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot.\\n - After the mempool regression is fixed the benchmarks need to be ran again.\\n - System-level UTxO-HD benchmarks with the LMDB are still pending.\\n- UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see [#344](https://github.com/input-output-hk/ouroboros-consensus/issues/344)).\\n- We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in `GetUTxOByAddress` (see [this comment](https://github.com/input-output-hk/ouroboros-consensus/issues/205#issuecomment-1706878418)). Preliminary results are promising.\\n- Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory ([#344](https://github.com/input-output-hk/ouroboros-consensus/issues/344)), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.\\n\\n## Tech debt\\n\\n- We added tests that Consensus emits valid CBOR ([#3099](https://github.com/input-output-hk/ouroboros-network/issues/3099)). This helped us detect a couple of serialization bugs. The tests still need to be merged into the `main` branch ([#323](https://github.com/input-output-hk/ouroboros-consensus/pull/323)).\\n\\n## Support\\n\\n- [Nick Frisby](https://github.com/nfrisby) finished his release engineer rotation; `cardano-node 8.3.0-pre` is releasing 2023 September 5.\\n- We helped to investigate a protocol version bug in Sanchonet (see [#3491](https://github.com/input-output-hk/cardano-ledger/issues/3491)).\\n- We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see [#91](https://github.com/input-output-hk/ouroboros-consensus/issues/91)."},{"id":"2023-09-01-goedel","metadata":{"permalink":"/cardano-updates/2023-09-01-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-goedel.md","source":"@site/blog/2023-09-01-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-09-01T00:00:00.000Z","formattedDate":"September 1, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.43,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-09-01-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-09-06-consensus"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-01-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThe team is currently formalising mini protocols and also further\\ndeveloping the performance modelling prototype.\\n\\n## Details\\n\\n* finalising a presenting performance analysis internship work to the\\n formal methods team\\n\\n* developed a new Isabelle mini-protocol framework and examples\\n\\n* planning an extended version of the ICE DeltaQ paper\\n\\n* working on algebraic rules for properisation of any-to-finish"},{"id":"2023-09-01-hydra","metadata":{"permalink":"/cardano-updates/2023-09-01-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-hydra.md","source":"@site/blog/2023-09-01-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-09-01T00:00:00.000Z","formattedDate":"September 1, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.93,"hasTruncateMarker":false,"authors":[{"name":"Sasha Bogicevic","title":"Hydra Software Engineer","url":"https://github.com/v0d1ch","imageURL":"https://github.com/v0d1ch.png","key":"v0d1ch"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-09-01-hydra","authors":["v0d1ch"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-09-01-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-09-01-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team focused primarily on changes needed in the network\\nlayer and have the first draft document related to needed design. They also\\nimproved the user experience by allowing a commit using inline datums.\\nDiscussed the off-chain governance with researchers and improved internal model\\ntests. \\n\\n## What did the team achieve this week\\n\\n- Monthly report published\\n- Small changes to hydraw and tutorial in light of the Masterclass\\n- Investigated a bug and saw it was solved by recent developments\\n- Improved the model tests by fully validating L1 transactions\\n- Enhanced the /commit API to also allow commit from scripts with inline datums (user request)\\n- Discussed off-chain governance with IOG and CF researchers\\n- Drafted a first network specification document in the context of Network resilience\\n\\n## What are the goals of next week\\n\\n- Have a clear understanding of the changes we need for the \\"Improve network resiliency\\" feature\\n- Groomed and agreed plan on incremental commits/decommits\\n- Updated tutorials including CI workflows to check consistency\\n- Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)"},{"id":"2023-09-01-ledger","metadata":{"permalink":"/cardano-updates/2023-09-01-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-ledger.md","source":"@site/blog/2023-09-01-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-09-01T00:00:00.000Z","formattedDate":"September 1, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.355,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-09-01-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-09-01-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-09-01-network"}},"content":"## High level summary\\n\\nBroadly speaking the Ledger team focused on a few main areas of Conway era:\\n\\n* Creation of voting state snapshots in order to correctly delay ratification for one epoch\\n* Validation of the Governance Actions sequencing and ordering\\n* Proper expiry of DReps and Proposal Procedures\\n* Expanding Conway Genesis functionality\\n* Utilization of some of the new Protocol Parameters in ledger validation rules\\n\\n## Low level summary\\n\\n### Conway era\\n\\n* [pull-3659] - Validate Network for ProposalProcedure and TreasuryWithdrawal\\n* [pull-3637] - Avoid using sequence of tuples, by adding GovActionId to GovActionState\\n* [pull-3651] - Inactive DReps\\n* [pull-3664] - Track proposal expiry\\n* [pull-3668] - Add min committee size predicate to NewCommittee\\n* [pull-3669] - Add Proposal deposit check against PParam\\n* [pull-3676] - Fix inactive PoolStake not counting as Drep Stake\\n* [pull-3635] - Make snapshots of GovActionsState\\n* [pull-3670] - Validate previously enacted govAction\\n* [pull-3694] - Improve error reporting on the positive coin decoder\\n* [pull-3674] - Added RATIFY thresholds\\n* [pull-3684] - Add proposal delaying, remove predicate failure from ENACT\\n* [pull-3688] - DRep Refunds and update evalTransactionBalance\\n\\n### Improvements and releasing\\n\\n* [pull-3677] - Minor patch that fixes the DRep distribution computation\\n* [pull-3686] - Post patch release fixup\\n* [pull-3695] - Changelog for cardano-node-8.3 release\\n* [pull-3683] - Add two new bench mark programs\\n\\n### Testing\\n\\n* [pull-3662] - Equality on raw types\\n\\n[pull-3659]: https://github.com/input-output-hk/cardano-ledger/pull/3659\\n[pull-3637]: https://github.com/input-output-hk/cardano-ledger/pull/3637\\n[pull-3651]: https://github.com/input-output-hk/cardano-ledger/pull/3651\\n[pull-3664]: https://github.com/input-output-hk/cardano-ledger/pull/3664\\n[pull-3668]: https://github.com/input-output-hk/cardano-ledger/pull/3668\\n[pull-3669]: https://github.com/input-output-hk/cardano-ledger/pull/3669\\n[pull-3662]: https://github.com/input-output-hk/cardano-ledger/pull/3662\\n[pull-3676]: https://github.com/input-output-hk/cardano-ledger/pull/3676\\n[pull-3677]: https://github.com/input-output-hk/cardano-ledger/pull/3677\\n[pull-3635]: https://github.com/input-output-hk/cardano-ledger/pull/3635\\n[pull-3683]: https://github.com/input-output-hk/cardano-ledger/pull/3683\\n[pull-3686]: https://github.com/input-output-hk/cardano-ledger/pull/3686\\n[pull-3670]: https://github.com/input-output-hk/cardano-ledger/pull/3670\\n[pull-3694]: https://github.com/input-output-hk/cardano-ledger/pull/3694\\n[pull-3674]: https://github.com/input-output-hk/cardano-ledger/pull/3674\\n[pull-3684]: https://github.com/input-output-hk/cardano-ledger/pull/3684\\n[pull-3695]: https://github.com/input-output-hk/cardano-ledger/pull/3695\\n[pull-3688]: https://github.com/input-output-hk/cardano-ledger/pull/3688"},{"id":"2023-09-01-network","metadata":{"permalink":"/cardano-updates/2023-09-01-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-network.md","source":"@site/blog/2023-09-01-network.md","title":"Network Team Update","description":"High-level overview of sprint 43","date":"2023-09-01T00:00:00.000Z","formattedDate":"September 1, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":2.765,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-09-01-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-09-01-ledger"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-09-01-sre"}},"content":"## High-level overview of [sprint 43][sprint-43]\\n\\nIn this sprint, we received contributions from [CF] & [Galois]. Karl Knutsson\\n([CF]) has addressed various issues regarding peer churning in P2P, timeouts\\nand our `WireShark` dissector. While the [Galois] developers focused on\\naddressing issues from their review last year. See below for more details.\\n\\nWe continued working on bootstrap peers [ouroboros-network-#4661].\\n\\nWe refactored our test suites: they are split into `io-tests` which require to\\nbe run natively on all platforms (these tests mostly contain tests that\\nrequire `IO` system calls) and `sim-tests` which are platform independent. We\\nrun `io-tests` on all supported platforms (e.g. `x86_64-linux`,\\n`x86-64-darwin`, `aarch64-darwin` and `x86_64-w64-mingw32` (Windows)) natively.\\nThe `sim-tests` are not executed on `Windows` due to memory limitations on\\nGitHub Actions runners. [ouroboros-network-#4653]\\n\\nWe also started rebasing `typed-protocols` refactoring branches.\\n\\nMarcin was appointed as the `cardano-node` release engineer for the `8.4.0-pre`\\nversion. So far he integrated `cardano-ledger-conway-1.8` and\\n`ouroboros-network-0.9.1.0` to `ouroboros-consensus`, `cardano-cli` and\\n`cardano-api`. Once we will have an integration branch for `cardano-node`,\\n`cardano-ledger-conway-1.8` and `ouroboros-consensus` packages can be released\\nto `CHaP` and PRs can be merged once they go through review & CI.\\n\\nWe also fixed some smaller issues regarding peer sharing (both were discovered\\nby Karl from [CF]). More details are included below.\\n\\n### Progress on P2P addoption\\n\\n#### SPO relays\\n\\nThere are currently ~2000 relays running P2P\\nenabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On\\n16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil\\nAda.\\n\\n![P2P relays](/images/network/2023-08-31-p2p-relays.png)\\n\\nThe following graphs show several different versions of relays running on the mainnet. The\\ngreen line `NodeToNodeVersionV10.True` denotes P2P relays, which slowly\\nincrease over time. The `V9` and earlier versions of the `node-to-node`\\nthe protocol indicates nodes version `1.35.x` or earlier.\\n![node versions](/images/network/2023-08-31-relay-versions.png)\\n\\nData has been kindly provided by [CF] and their mainnet monitoring\\ninfrastructure.\\n\\n#### IOG relays\\n\\nAs of this week, 90% of IOG relays are running a P2P setup. In the next sprint all\\nIOG relays will be running P2P.\\n\\n## Detailed description\\n\\nIn this sprint, we got a few contributions from [CF]:\\n* Karl made peer churning mechanism less aggressive [ouroboros-network-#4656]; and\\n* he added timeouts for idle states in `ChainSync` & `KeepAlive`\\n miniprotocols. These timeouts help a node remove idle connections from the\\n responder (server) side [ouroboros-network-#4648].\\n* he improved the `WireShark` dissector by adding support for the `peer-sharing` mini-protocol [ouroboros-network-#4656].\\n\\n[Galois] has been making progress in addressing some of the issues they raised in their review (last year):\\n* Mark Tullsen ([Galois]) has been working on refactoring the main entry function of P2P [ouroboros-network-#4661] (in review);\\n* Sam Cowger ([Galois]) has been reviewing all use cases of `error` and `unsafe` calls\\n [ouroboros-network-#4661] (in review).\\n\\n## Peer Sharing\\n\\n* Light peer sharing is only enabled when peer sharing is turned on [ouroboros-network-#4652];\\n* Handshake incorrectly reports peer sharing value. It\'s supposed to relay the\\n remote value, but instead, it returns the local value. [ouroboros-network-#4642] (in review).\\n\\n## Async Demotion Test Fix\\n\\n* We fixed an async demotion test failure which turned out to be a weakness of\\n the test itself rather than a bug in the connection manager. [ouroboros-network-#4655]\\n\\n[CF]: https://cardanofoundation.org/\\n[Galois]: https://galois.com/\\n[sprint-43]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+43%22\\n[ouroboros-network-#4615]: https://github.com/input-output-hk/ouroboros-network/issues/4615\\n[ouroboros-network-#4648]: https://github.com/input-output-hk/ouroboros-network/pull/4648\\n[ouroboros-network-#4653]: https://github.com/input-output-hk/ouroboros-network/issues/4653\\n[ouroboros-network-#4656]: https://github.com/input-output-hk/ouroboros-network/pull/4656\\n[ouroboros-network-#4657]: https://github.com/input-output-hk/ouroboros-network/pull/4657\\n[ouroboros-network-#4660]: https://github.com/input-output-hk/ouroboros-network/pull/4660\\n[ouroboros-network-#4661]: https://github.com/input-output-hk/ouroboros-network/pull/4661\\n[ouroboros-network-#4652]: https://github.com/input-output-hk/ouroboros-network/pull/4652\\n[ouroboros-network-#4642]: https://github.com/input-output-hk/ouroboros-network/issues/4642\\n[ouroboros-network-#4655]: https://github.com/input-output-hk/ouroboros-network/issues/4655"},{"id":"2023-09-01-sre","metadata":{"permalink":"/cardano-updates/2023-09-01-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-sre.md","source":"@site/blog/2023-09-01-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-09-01T00:00:00.000Z","formattedDate":"September 1, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":1.075,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-09-01-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-09-01-network"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-08-29-node-cli-api"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent updates or improvements include:\\n* Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes\\n* Work on a new [capkgs](https://github.com/input-output-hk/capkgs) repository started -- \\"Content Addressed Packages\\"\\n * This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output\\n * These packages don\'t have the associated IFD, long eval times and large source dependencies that the originating source repositories often do\\n * Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers\\n\\n## Lower level summary\\n\\n### Capkgs\\n* Content addressed packages -- new repo: [capkgs](https://github.com/input-output-hk/capkgs)\\n\\n### Cardano-ops\\n* Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: [cardano-ops-compare](https://github.com/input-output-hk/cardano-ops/compare/5a0eabe...03e8e42)\\n\\n### Cardano-parts\\n* Flake devShell module improvements: [cardano-parts-pull-4](https://github.com/input-output-hk/cardano-parts/pull/4)\\n* Cardano-world entrypoints migrated to flake parts module: [cardano-parts-pull-5](https://github.com/input-output-hk/cardano-parts/pull/5)\\n* Cardano-world jobs migrated to flake parts module: [cardano-parts-pull-6](https://github.com/input-output-hk/cardano-parts/pull/6)\\n* Drep delegation fixups: [cardano-parts-pull-7](https://github.com/input-output-hk/cardano-parts/pull/7)\\n* Utilize content addressed binaries, WIP: [cardano-parts-pull-8](https://github.com/input-output-hk/cardano-parts/pull/8)\\n* Cardano-node module preparation branch, WIP: [cardano-parts-compare](https://github.com/input-output-hk/cardano-parts/compare/capkgs...node-module)\\n\\n### Cardano-perf\\n* Availability zone pinning and explorer mods: [cardano-perf-compare](https://github.com/input-output-hk/cardano-perf/compare/d3a8644...9f9917c)\\n\\n### Cardano-world\\n* Remove performance nodes for migration to cardano-perf: [cardano-world-commit](https://github.com/input-output-hk/cardano-world/commit/306ef6c6dd6c09d9b90b9768f2b84a1d05cded26)\\n\\n### Sanchonet-demo\\n* Sanchonet demonstration repository: [sanchonet-demo](https://github.com/input-output-hk/sanchonet-demo)"},{"id":"2023-08-29-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-08-29-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-29-node-cli-api.md","source":"@site/blog/2023-08-29-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-08-29T00:00:00.000Z","formattedDate":"August 29, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.55,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-08-29-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-09-01-sre"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-08-28-mithril"}},"content":"# 2023-08-16 - 2023-08-29\\n\\n## High level summary\\n\\nCLI is making progress towards phases 3 and 4 of SanchoNet.\\n- Ability to create info, no-confidence and new committee governance actions.\\n- Voting as DREP is possible now on the CLI\\n\\n- API is now using Ledger\'s PParams and VotingProcedures\\n- Expose following queries from consensus:\\n - GetGovState\\n - GetDRepState\\n - GetDRepStakeDistr\\n - GetCommitteeState\\n - GetConstitution\\n\\n### cardano-cli\\n\\n- [Add goverance info action creation to era based cli](https://github.com/input-output-hk/cardano-cli/pull/179)\\n- [Add create-no-confidence command to era based cardano-cli](https://github.com/input-output-hk/cardano-cli/pull/176)\\n- [Add create-new-committee command to era based cli](https://github.com/input-output-hk/cardano-cli/pull/175)\\n- [Enable `--drep-script-hash` option](https://github.com/input-output-hk/cardano-cli/pull/204)\\n- [Remove `experimental` subcommand](https://github.com/input-output-hk/cardano-cli/pull/211)\\n- [Upgrade to `cardano-api-8.17.0.0`](https://github.com/input-output-hk/cardano-cli/pull/210)\\n- [New `governance drep id` command](https://github.com/input-output-hk/cardano-cli/pull/194)\\n- [Add `governance query` commands](https://github.com/input-output-hk/cardano-cli/pull/189)\\n- [Add `--verification-key` option to `committee key-hash` command](https://github.com/input-output-hk/cardano-cli/pull/187)\\n- [Read and write `VotingProcedures` files instead of `VotingEntry` files](https://github.com/input-output-hk/cardano-cli/pull/203)\\n- [Release 8.6.0.0](https://github.com/input-output-hk/cardano-cli/pull/201)\\n- [Merge `LegacyClientCmdError` into `CmdError` ](https://github.com/input-output-hk/cardano-cli/pull/195)\\n- [Add test for conway governance action create-constitution](https://github.com/input-output-hk/cardano-cli/pull/193)\\n- [Move legacy errors out of legacy command structure modules](https://github.com/input-output-hk/cardano-cli/pull/192)\\n- [Governance `drep` and `vote` command groups](https://github.com/input-output-hk/cardano-cli/pull/191)\\n- [Move command errors from era-based to `CmdError` module](https://github.com/input-output-hk/cardano-cli/pull/188)\\n- [Move some error types](https://github.com/input-output-hk/cardano-cli/pull/186)\\n- [Delete unused module](https://github.com/input-output-hk/cardano-cli/pull/185)\\n- [Refactor: Use `maybeFeatureInEra` instead of `featureInEra` where possible](https://github.com/input-output-hk/cardano-cli/pull/183)\\n- [Remove all uses of `toS`, `purer`, `cborError` and `intercalate` from `Cardano.Prelude`](https://github.com/input-output-hk/cardano-cli/pull/182)\\n- [Remove example era-based parsers we don\'t need anymore](https://github.com/input-output-hk/cardano-cli/pull/180)\\n- [Bump CHaP index in preparation for 8.3.0 pre](https://github.com/input-output-hk/cardano-cli/pull/174)\\n\\n\\n### cardano-api\\n\\n- [New version `cardano-api-8.17.0.0`](https://github.com/input-output-hk/cardano-api/pull/216)\\n- [Replace ProtocolParameters usage with ledger\'s PParams](https://github.com/input-output-hk/cardano-api/pull/214)\\n- [Use injective type families to improve type inference](https://github.com/input-output-hk/cardano-api/pull/210)\\n- [Delete `TxVotes` and `VotingEntry` and use `VotingProcedures` instead](https://github.com/input-output-hk/cardano-api/pull/209)\\n- [New functions `emptyVotingProcedures`, `singletonVotingProcedures` and `mergeVotingProcedures`](https://github.com/input-output-hk/cardano-api/pull/208)\\n- [New `makeStakeAddressAndDRepDelegationCertificate` function](https://github.com/input-output-hk/cardano-api/pull/207)\\n- [Expose ledger lenses for governance types](https://github.com/input-output-hk/cardano-api/pull/206)\\n- [New version cardano-api-8.16.1.0](https://github.com/input-output-hk/cardano-api/pull/205)\\n- [Add `VotingProcedures` type](https://github.com/input-output-hk/cardano-api/pull/204)\\n- [Release 8.16.0.0](https://github.com/input-output-hk/cardano-api/pull/202)\\n- [Update createAnchor to use hashAnchorData](https://github.com/input-output-hk/cardano-api/pull/200)\\n- [Release 8.15.0.0](https://github.com/input-output-hk/cardano-api/pull/197)\\n- [Add consensus governance queries](https://github.com/input-output-hk/cardano-api/pull/196)\\n\\n### cardano-node\\n\\n### cardano-testnet\\n\\n### docs\\n\\n### CI & project maintenance"},{"id":"2023-08-28-mithril","metadata":{"permalink":"/cardano-updates/2023-08-28-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-28-mithril.md","source":"@site/blog/2023-08-28-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-08-28T00:00:00.000Z","formattedDate":"August 28, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-08-28-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-08-29-node-cli-api"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-25-hydra"}},"content":"## High level overview\\nThe Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of `zstandard` compression of the snapshot archive, and streaming its download and decompression in the client.\\n\\nFinally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer. \\n\\n## Low level overview\\n- Completed the issue `Create explorer page with registered signers` [#1097](https://github.com/input-output-hk/mithril/issues/1097)\\n- Completed the issue `Simplify logs on the Signer/Aggregator` [#1106](https://github.com/input-output-hk/mithril/issues/1106)\\n- Completed the issue `Refactor (de)serialization of crypto entities` [#668](https://github.com/input-output-hk/mithril/issues/668)\\n- Completed the issue `Mithril client last snapshot download` [#1078](https://github.com/input-output-hk/mithril/issues/1078)\\n- Completed the issue `Use the \'/signers/registered\' route to verify if a signer is registered` [#1152](https://github.com/input-output-hk/mithril/issues/1152)\\n- Worked on the issue `Provide progress information with \'--json\' option in Client` [#1095](https://github.com/input-output-hk/mithril/issues/1095)\\n- Worked on the issue `Use \'zstandard\' compression for snapshot archives` [#876](https://github.com/input-output-hk/mithril/issues/876)\\n- Worked on the issue `Make client download and extract the archive simultaneously` [#1115](https://github.com/input-output-hk/mithril/issues/1115)"},{"id":"2023-08-25-hydra","metadata":{"permalink":"/cardano-updates/2023-08-25-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-25-hydra.md","source":"@site/blog/2023-08-25-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-08-25T00:00:00.000Z","formattedDate":"August 25, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.875,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-08-25-hydra","authors":["ffakenz"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-08-28-mithril"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-08-24-performance-and-tracing"}},"content":"## High-level summary\\n\\nThis week, the Hydra team conducted the monthly review meeting for Agust,which\\ncontinously ensures transparent communication and project evaluation.\\n\\nIn terms of community engagement, the Hydra team gave a Hydra master-class at\\nRareEvo workshop as an educational initiative for the community.\\nAdditionally, the team updated the Hydra demo and tutorial to include Mithril\\nand latest release changes.\\n\\nThey also focused on exploring the Hydra network resiliance in order to improve\\n`hydra-node` availability, as it becomes stuck very easily and that leads to a\\nbad user experience.\\n\\n## What did the team achieve this week\\n\\n- Hydra master-class at RareEvo workshop!\\n- Monthly report & review meeting\\n- Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff\\n- Groomed network resilience and explorer features [#188](https://github.com/input-output-hk/hydra/issues/188)\\n- New ADR for \u201cResourced based API\u201d [#1028](https://github.com/input-output-hk/hydra/pull/1028)\\n\\n## What are the goals of next week\\n\\n- Have a poc on network resilience working [#188](https://github.com/input-output-hk/hydra/issues/188)\\n- Fix issue [#931](https://github.com/input-output-hk/hydra/issues/931): \u201cChain state in head state not updated on replayed observation\u201d\\n- Fix issue [#1039](https://github.com/input-output-hk/hydra/issues/1039): \\"Close transaction dropped from cardano-node\\""},{"id":"2023-08-24-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-08-24-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-24-performance-and-tracing.md","source":"@site/blog/2023-08-24-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-08-24T00:00:00.000Z","formattedDate":"August 24, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.7,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-08-24-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-25-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-08-23-consensus"}},"content":"## High level summary\\n\\n* Benchmarking: Benchmarking node version `8.2.1` has concluded. Additionally we\'re developing benchmarking setups for GHC9.6 and UTxO-HD.\\n* Infrastructure: Our analysis pipeline has received improvements reducing memory footprint.\\n* Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing.\\n* Nomad backend: We\'re performing and analysing various runs for validation purposes on the new hardware cluster.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nWe\'ve performed and analysed the benchmarks for the `8.2.1` version of `cardano-node` as part of our release benchmarking cycle. \\n\\nSetting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we\'re working on respective integrations on both those paths.\\n\\n### Infrastructure\\n\\nAs cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held\\nin memory, which wouldn\'t fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline.\\n\\n### Tracing\\n\\nThe next portion of optimizations has been completed and merged to `master`, getting rid of Haskell\'s native `String` representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by `cardano-node`. \\n\\nThe implementation for validation of consistent naming and configuration is ongoing. We\'re splitting out everything that\'s verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup.\\n\\n### Nomad backend\\n\\nThe verification phase of the nomad cloud backend is ongoing. We\'re able to perform full runs on the new hardware cluster\\nand porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend."},{"id":"2023-08-23-consensus","metadata":{"permalink":"/cardano-updates/2023-08-23-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-23-consensus.md","source":"@site/blog/2023-08-23-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-08-23T00:00:00.000Z","formattedDate":"August 23, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.42,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-08-23-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-08-24-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-08-18-goedel"}},"content":"## High level summary\\n\\nOn the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests.\\nOn the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base.\\n\\n## UTxO-HD\\n\\n- We addressed the issues that came from the benchmarking and testing phase (see [#314](https://github.com/input-output-hk/ouroboros-consensus/issues/314)).\\n - We fixed the operational-certificate update exception ([#305](https://github.com/input-output-hk/ouroboros-consensus/pull/305)).\\n\\n## Tech debt \\n\\n- We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see [this branch](https://github.com/input-output-hk/cardano-api/tree/jasagredo/consensus-api)).\\n- We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see [this branch](https://github.com/input-output-hk/ouroboros-consensus/tree/jasagredo/test-sop)).\\n- We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see [#275](https://github.com/input-output-hk/ouroboros-consensus/issues/275)).\\n- We decreased the flakiness for our test suite ([#284](https://github.com/input-output-hk/ouroboros-consensus/pull/284)).\\n- We incorporated and merged the pull-request on query versioning ([#273](https://github.com/input-output-hk/ouroboros-consensus/pull/273)).\\n- We started working on new performance-based regression tests for mempool operations.\\n\\n## Support \\n\\n- [Nick Frisby](https://github.com/nfrisby) continues with his engineer responsibilities. Notably getting the Consensus release out for node `pre-release 8.3`. Nick also began integrating it into downstream branches (`cardano{-api,-cli,-node}`). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:\\n - [#283](https://github.com/input-output-hk/ouroboros-consensus/pull/283)\\n - [#301](https://github.com/input-output-hk/ouroboros-consensus/pull/301)\\n - [#304](https://github.com/input-output-hk/ouroboros-consensus/pull/304)\\n\\t- [#308](https://github.com/input-output-hk/ouroboros-consensus/pull/308)"},{"id":"2023-08-18-goedel","metadata":{"permalink":"/cardano-updates/2023-08-18-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-goedel.md","source":"@site/blog/2023-08-18-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-08-18T00:00:00.000Z","formattedDate":"August 18, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.72,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-08-18-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-08-23-consensus"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-18-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThe team is currently formalising mini protocols and also further\\ndeveloping the performance modelling prototype.\\n\\n## Details\\n\\n\\n* Development of an automated prover for showing conformance of\\n programs to state machines (as part of the mini-protocol framework)\\n\\n* Completion of the documentation of the (current state of the)\\n mini-protocol framework\\n\\n* Discussion about two DeltaQ lectures with two practical sessions as part\\n of 4th year masters course on distributed systemsby colleagues at UC\\n Louvain in the Autumn\\n\\n* Discussion about four DeltaQ lectures by colleagues at U. Bergen as part\\n of a 5th year Masters course in the Autumn\\n\\n* Adapted original DeltaQ implementation to the new typeclasses and\\n wrote property tests for its algebraic laws"},{"id":"2023-08-18-hydra","metadata":{"permalink":"/cardano-updates/2023-08-18-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-hydra.md","source":"@site/blog/2023-08-18-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-08-18T00:00:00.000Z","formattedDate":"August 18, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.13,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-08-18-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-08-18-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-08-18-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team released version 0.12.0, a significant update that\\nbrings support for cardano-node 8.1.2, along with performance enhancements and\\nvarious API improvements. Additionally, the team successfully onboarded a new\\ncontributor who is now actively participating in operating a Hydra Head. They\\ntook part in a meeting of the Intersect open source committee and prepared the\\nHydra master-class for RareEvo, an educational initiative for the community.\\n\\nIf you happen to be at RareEvo, register for the Hydra master-class [using this\\nform](https://docs.google.com/forms/d/1Q9KIxwKeyZeNrKDBiYWceYjnbxIxaEwC8Eo5LWxSa2g/viewform?edit_requested=true).\\nWe hope to make it possible to follow along on-line as well and will announce\\ndetails on the Hydra announcements channel on the [IOG discord\\nserver](https://discord.gg/Qq5vNTg9PT).\\n\\n## What did the team achieve this week\\n\\n- Released version 0.12.0 which adds support for cardano-node 8.1.2, performance\\n and several API improvements. [Release notes](https://github.com/input-output-hk/hydra/releases/tag/0.12.0)\\n- Replaced commit via websocket with external draft + submit. [#954](https://github.com/input-output-hk/hydra/issues/954)\\n- Onboarded new contributor to the point where he actively participates in operating a Head now.\\n- Joined a first meeting of the Intersect open source committee\\n- Prepared the Hydra master-class for RareEvo.\\n\\n## What are the goals of next week\\n\\n- Monthly review meeting\\n- Run the Hydra master-class at RareEvo!\\n- Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff\\n- Clear out red bin items (technical debt)\\n- Groom network resilience and explorer features"},{"id":"2023-08-18-ledger","metadata":{"permalink":"/cardano-updates/2023-08-18-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-ledger.md","source":"@site/blog/2023-08-18-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-08-18T00:00:00.000Z","formattedDate":"August 18, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.7,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-08-18-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-18-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-08-18-network"}},"content":"## High level summary\\n\\nThe ledger team made great progress in advancing Conway era forward. In particular, voting\\nfor DRep and Stake Pool Operators is now at the state that can be used by downstream\\ncomponents. Addition of new ledger state queries makes it possible to verify changes to\\nthe governance state, such as placement of votes, submission of governance proposals,\\ninspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the\\nability to enact all of the governance actions, except for the hard fork initiation.\\n\\n\\n## Low level summary\\n\\n### Conway progress\\n\\n* [pull-3577] - Move `PParams` to `GovState`\\n* [pull-3609] - Adjust thresholds for sanchonet\\n* [pull-3604] - README: update CIP-1694 link\\n* [pull-3616] - Switch `TreasuryWithdrawals` to use `RewardAcnt`\\n* [pull-3599] - Add governance action well-formedness check\\n* [pull-3607] - Rename governance to gov\\n* [pull-3601] - Added `DRep` anchors\\n* [pull-3615] - Add optional previous `GovActionId` in some `ProposalProcedures`\\n* [pull-3596] - Upgradeable families\\n* [pull-3625] - Change constitution to use `Anchor`\\n* [pull-3592] - Added pulsing incremental computation of the DRep distribution\\n* [pull-3523] - Treasury donations\\n* [pull-3633] - Prevent state changes on phase2 failure\\n* [pull-3634] - Disable serialization of protocolVersion param update\\n* [pull-3630] - Implemented DRep refreshing\\n* [pull-3640] - Remove crypto parameterization from `AnchorData`\\n* [pull-3636] - Implement DRep ratification with an \\"always passing\\"; threshold\\n* [pull-3648] - Governance queries\\n* [pull-3650] - Change environment for `ShelleyPOOLREAP` rule\\n* [pull-3658] - Set `DRep` ratify threshold to 51%\\n* [pull-3628] - `DELEG`, `POOL`, `GOVCERT` conformance with Spec v0.8\\n\\n### Testing\\n\\n* [pull-3619] - Disabled a broken test\\n\\n### Improvements and releasing\\n\\n* [pull-3660] - Fix bounds and versions\\n* [pull-3661] - Adjust versions, bounds and CHANGELOGs to account for the latest release\\n\\n[pull-3577]: https://github.com/input-output-hk/cardano-ledger/pull/3577\\n[pull-3609]: https://github.com/input-output-hk/cardano-ledger/pull/3609\\n[pull-3604]: https://github.com/input-output-hk/cardano-ledger/pull/3604\\n[pull-3616]: https://github.com/input-output-hk/cardano-ledger/pull/3616\\n[pull-3599]: https://github.com/input-output-hk/cardano-ledger/pull/3599\\n[pull-3619]: https://github.com/input-output-hk/cardano-ledger/pull/3619\\n[pull-3607]: https://github.com/input-output-hk/cardano-ledger/pull/3607\\n[pull-3601]: https://github.com/input-output-hk/cardano-ledger/pull/3601\\n[pull-3615]: https://github.com/input-output-hk/cardano-ledger/pull/3615\\n[pull-3596]: https://github.com/input-output-hk/cardano-ledger/pull/3596\\n[pull-3625]: https://github.com/input-output-hk/cardano-ledger/pull/3625\\n[pull-3592]: https://github.com/input-output-hk/cardano-ledger/pull/3592\\n[pull-3523]: https://github.com/input-output-hk/cardano-ledger/pull/3523\\n[pull-3633]: https://github.com/input-output-hk/cardano-ledger/pull/3633\\n[pull-3634]: https://github.com/input-output-hk/cardano-ledger/pull/3634\\n[pull-3630]: https://github.com/input-output-hk/cardano-ledger/pull/3630\\n[pull-3640]: https://github.com/input-output-hk/cardano-ledger/pull/3640\\n[pull-3636]: https://github.com/input-output-hk/cardano-ledger/pull/3636\\n[pull-3648]: https://github.com/input-output-hk/cardano-ledger/pull/3648\\n[pull-3650]: https://github.com/input-output-hk/cardano-ledger/pull/3650\\n[pull-3658]: https://github.com/input-output-hk/cardano-ledger/pull/3658\\n[pull-3628]: https://github.com/input-output-hk/cardano-ledger/pull/3628\\n[pull-3660]: https://github.com/input-output-hk/cardano-ledger/pull/3660\\n[pull-3661]: https://github.com/input-output-hk/cardano-ledger/pull/3661"},{"id":"2023-08-18-network","metadata":{"permalink":"/cardano-updates/2023-08-18-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-network.md","source":"@site/blog/2023-08-18-network.md","title":"Network Team Update","description":"High-level overview of sprint 42","date":"2023-08-18T00:00:00.000Z","formattedDate":"August 18, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":2.09,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-08-18-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-08-18-ledger"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-08-18-sre"}},"content":"## High-level overview of [sprint 42][sprint-42]\\n\\n### Eclipse Evasion\\n\\nWe merged and released a new version of the `ouroboros-network` package (version\\n`0.9.0.0`) which includes [big ledger peers feature][ouroboros-network#3886].\\nThis is the primary peer selection mechanism to defend against eclipses. We\\nalso prepared a PR to updated [`ouroboros-cosnensus`][ouroboros-consensus#165]\\nand [`ekg-forward`][ekg-forward#30] packages.\\n\\n### CDDL specs for protocol codecs\\n\\nWe made the `cddl` spec for network codec more inline with the implementation\\nwhich is highly polymorphic. `cddl` doesn\'t have the notion of polymorphism,\\nbut has `any` which can generate any valid cbor term. We matched it with an\\n`Any` type on the Haskell side and made all remaining tests & specs use it.\\nThis simplified the specifications and made it easier to understand which parts\\nare defined in the spec, and which parts are left unspecified. See\\n[ouroboros-network#4595].\\n\\n### Ouroboros-Network-Framework API changes\\n\\nWe also released `ouroboros-network-framework` and other network components.\\nThe `ouroboros-network-framework` package contains a redesign of API exposed to\\n`ouroboros-consensus`. We consolidated, cleaned it and made it easier to\\nextend in the future if there will be new arguments that need to be passed to\\nmini-protocol initiator and responders which comes from the low-level network\\nlayer.\\n\\n### Nix setup (CI)\\n\\nWe also made a major review of our `nix` setup. With help from our DevX team\\nwe ended up with a clean `flake.nix` file which can:\\n\\n* compile & test the code on `x86_64-linux`, `x86_64-darwin` and `aarch64-darwin`\\n* cross-compile to `Windows` on `x86_64-linux` \\n\\nAnd provides a shell which contains all the build tools, including `ghc-9.6`,\\n`hls`, `cddl`, and more. See [ouroboros-network#4640],\\n[ouroboros-network#4643].\\n\\n\\n## Other contributions\\n\\n### Cardano Network Service Assurance\\n\\n* The work and writeup in finishing up the CNSA, first stage (first\\n contract).\\n* Getting Sam Cowger (Galois Inc) up to speed.\\n* The IOG Networking team carried a reivew of CNSA project progress: a limitted\\n code & design review.\\n\\n### Galois Review\\n\\nSam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues\\n\\n* [ouroboros-network#3832],\\n* [ouroboros-network#3834],\\n* [ouroboros-network#3835],\\n* [ouroboros-network#3836];\\n\\nscoping, requirements, and getting started.\\n\\n### CI\\n\\nWe added a nightly run for GitHub actions and made the GitHub actions test be\\nexecuted with extra concurrency [ouroboros-network#4637], [ouroboros-network#4649].\\n\\nWe also added GitHub\'s dependabot [ouroboros-network#4650].\\n\\n### Bootstrap Peers\\n\\nWe settled on implementation design of bootstrap peers which is being\\nimplemented, [ouroboros-network#4615].\\n\\n\\n[sprint-42]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+42%22\\n\\n[ekg-forward#30]: https://github.com/input-output-hk/ekg-forward/pull/30\\n\\n[ouroboros-consensus#165]: https://github.com/input-output-hk/ouroboros-consensus/pull/165\\n\\n[ouroboros-network#3832]: https://github.com/input-output-hk/ouroboros-network/issues/3832\\n[ouroboros-network#3834]: https://github.com/input-output-hk/ouroboros-network/issues/3834\\n[ouroboros-network#3835]: https://github.com/input-output-hk/ouroboros-network/issues/3835\\n[ouroboros-network#3836]: https://github.com/input-output-hk/ouroboros-network/issues/3836\\n[ouroboros-network#3886]: https://github.com/input-output-hk/ouroboros-network/issues/3886\\n[ouroboros-network#4595]: https://github.com/input-output-hk/ouroboros-network/issues/4595\\n[ouroboros-network#4615]: https://github.com/input-output-hk/ouroboros-network/issues/4615\\n[ouroboros-network#4637]: https://github.com/input-output-hk/ouroboros-network/pull/4637\\n[ouroboros-network#4640]: https://github.com/input-output-hk/ouroboros-network/pull/4640\\n[ouroboros-network#4643]: https://github.com/input-output-hk/ouroboros-network/pull/4643\\n[ouroboros-network#4649]: https://github.com/input-output-hk/ouroboros-network/pull/4649\\n[ouroboros-network#4650]: https://github.com/input-output-hk/ouroboros-network/pull/4650"},{"id":"2023-08-18-sre","metadata":{"permalink":"/cardano-updates/2023-08-18-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-sre.md","source":"@site/blog/2023-08-18-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-08-18T00:00:00.000Z","formattedDate":"August 18, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":0.66,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-08-18-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-08-18-network"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-08-17-crypto"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent updates or improvements include:\\n* Sanchonet and shelley-qa environments were updated to 8.2.1-pre.\\n* Work on two new repos utilizing [flake parts](https://flake.parts) for cardano cluster generation, automation and operation.\\n * [cardano-parts](https://github.com/input-output-hk/cardano-parts) -- Nix flake parts for cardano clusters\\n * [cardano-playground](https://github.com/input-output-hk/cardano-playground) -- Cardano testnet clusters\\n\\n## Lower level summary\\n\\n### Cardano-ops\\n* Cardano p2p relay and alert threshold adjustments: [cardano-ops-compare](https://github.com/input-output-hk/cardano-ops/compare/c4a04cc...5a0eabe)\\n\\n### Cardano-parts\\n* New repo: [cardano-parts](https://github.com/input-output-hk/cardano-parts)\\n\\n### Cardano-perf\\n* Misc improvements to perf cluster functionality: [cardano-perf-compare](https://github.com/input-output-hk/cardano-perf/compare/0944c40...d3a8644)\\n\\n### Cardano-playground\\n* New repo: [cardano-playground](https://github.com/input-output-hk/cardano-playground)\\n\\n### Cardano-world\\n* Improve explorer topology generation alerting: [cardano-world-pull-109](https://github.com/input-output-hk/cardano-world/pull/109)\\n* Update p2p configs: [cardano-world-pull-110](https://github.com/input-output-hk/cardano-world/pull/110)\\n\\n### Inputs-check\\n* A flake parts module to check input closure sizes recursively for optimization considerations: [inputs-check](https://github.com/input-output-hk/inputs-check)"},{"id":"2023-08-17-crypto","metadata":{"permalink":"/cardano-updates/2023-08-17-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-crypto.md","source":"@site/blog/2023-08-17-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-08-17T00:00:00.000Z","formattedDate":"August 17, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":0.65,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-08-17-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-08-18-sre"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-08-17-db-sync"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation\\n* mithril: Full node verifier\\n* musig2: Include MuSig2 description in cryptography handbook\\n* kes_agent: Finilising test and CI. Working on KES binary\\n\\n## Low level summary\\n### Mithril\\n* Full Node Verifier merged [#939](https://github.com/input-output-hk/mithril/pull/939).\\n### MuSig2\\n* Started describing MuSig2 to include it as part of the cryptography handbook \\n### Sidechains\\n* Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in [this](https://github.com/alexandroszacharakis8/halo2/tree/iquerejeta) fork.\\n### KES agent\\n* KES agent is ready:\\n * CI ready [#19](https://github.com/input-output-hk/kes-agent/issues/19)\\n * Receipt confirmation message [#20](https://github.com/input-output-hk/kes-agent/issues/20)\\n * KES agent binary ready [#21](https://github.com/input-output-hk/kes-agent/issues/21)\\n * Control client implemented [#11](https://github.com/input-output-hk/kes-agent/issues/11)"},{"id":"2023-08-17-db-sync","metadata":{"permalink":"/cardano-updates/2023-08-17-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-db-sync.md","source":"@site/blog/2023-08-17-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-08-17T00:00:00.000Z","formattedDate":"August 17, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.41,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-08-17-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-08-17-crypto"},"nextItem":{"title":"SECP bindings Security Issue Report","permalink":"/cardano-updates/2023-08-17-secp-issue"}},"content":"## High level summary\\nWe have integrated many new Conway feutures and allow db-sync to sync sanchonet.\\nWe also continued testing and improving the new db-sync options.\\n\\n## Lower level summary\\n- Conway integration\\n[#1484](https://github.com/input-output-hk/cardano-db-sync/pull/1484)\\n- Support for Sanchonet\\n[#1476](https://github.com/input-output-hk/cardano-db-sync/pull/1476)\\n- Stake distribution is computed earlier\\n[#1484](https://github.com/input-output-hk/cardano-db-sync/pull/1484)\\n- Deposit ledger events are now used. This reduces the db queries and makes syncing faster\\n[#1484](https://github.com/input-output-hk/cardano-db-sync/pull/1484)\\n- Testing new db-sync options\\n[#1466](https://github.com/input-output-hk/cardano-db-sync/pull/1466)\\n- Added support for ghc-9.6\\n[#1479](https://github.com/input-output-hk/cardano-db-sync/pull/1479)\\n- Tech debt: improve exceptions\\n[#1471](https://github.com/input-output-hk/cardano-db-sync/pull/1471)"},{"id":"2023-08-17-secp-issue","metadata":{"permalink":"/cardano-updates/2023-08-17-secp-issue","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-secp-security-issue-report.md","source":"@site/blog/2023-08-17-secp-security-issue-report.md","title":"SECP bindings Security Issue Report","description":"Security Issue Report: SECP256k1 bug","date":"2023-08-17T00:00:00.000Z","formattedDate":"August 17, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":3.3,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"SECP bindings Security Issue Report","slug":"2023-08-17-secp-issue","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-08-17-db-sync"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-08-15-node-cli-api"}},"content":"## Security Issue Report: SECP256k1 bug\\n\\nDate Occurred: July 15, 2022\\nSeverity: Potentially Very High if exploited on Mainnet\\nAuthors: I\xf1igo Querejeta Azurmendi\\n\\nDate of Report: August 17, 2023\\n### Summary of Issue\\n#### Criticality Level\\nActually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet\\nContext\\n\\nNew SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains.\\nHow was the Issue Detected\\n\\nThe issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there.\\n\\n#### What Action was Taken\\nThe Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod).\\nFixes were applied to prevent the use of the primitives.\\nA full security audit was carried out on the bindings.\\nThe rollout of the primitives was postponed to a new hard fork (Valentine)\\n\\n#### Potential Effect\\nThe potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction.\\n\\n#### Actual Effect\\n* Delay to the Vasil hard-fork\\n* Temporary removal of SECP256k1 primitives\\n* Additional hard-fork to introduce SECP256k1 primitives\\n\\n#### Ongoing Mitigations Needed, if any\\nNone\\n\\n#### Responsibility for Mitigations\\nCore team\\n\\n### Detailed description of Incident\\nNew Plutus **secp256k1** cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet.\\n\\nThe problem was not in the deserialization functions of the underlying library (Bitcoin\'s library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing.\\n\\n* [This](https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h#L518) is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an [expected](https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h#L61) structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely.\\n* The same happened with the Schnorr [verification function](https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1_schnorrsig.h#L170). It takes as input a SECP256k1_xonly_pubkey, which is again an [opaque structure](https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1_extrakeys.h#L10) that holds a parsed and valid public key.\\n\\nThe FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated.\\n\\nThe fix was addressed in [this](https://github.com/input-output-hk/cardano-base/pull/289) PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts.\\n\\n### Recommendations\\n* Check all new Plutus bindings for correct use.\\n* Audit all new Plutus built-in bindings.\\n* Continue to develop specific End-to-End tests for all new Plutus features.\\n* Do not assume that any existing library functions are \\"safe\\". Treat all external calls circumspectly."},{"id":"2023-08-15-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-08-15-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-15-node-cli-api.md","source":"@site/blog/2023-08-15-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-08-15T00:00:00.000Z","formattedDate":"August 15, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.29,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-08-15-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"SECP bindings Security Issue Report","permalink":"/cardano-updates/2023-08-17-secp-issue"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-11-hydra"}},"content":"# 2023-08-02 - 2023-08-15\\n\\n## High level summary\\n\\n- cardano-node 8.2.1 (pre-release) to SanchoNet\\n- Continue moving CLI into era-based top level command structure\\n- Wire-up DREP key generation,\\n- Fix DREP deregistration certificates\\n- Implement Constitutional Committee Key generation on the CLI\\n- Introducing era-based protocol parameters on the API\\n- Removing depracated functions and types on the API\\n\\n\\n### cardano-cli\\n\\n- [Update to `cardano-api-8.13.0.0`](https://github.com/input-output-hk/cardano-cli/pull/169)\\n- [Reenable golden tests](https://github.com/input-output-hk/cardano-cli/pull/164)\\n- [#128 DRep key generation](https://github.com/input-output-hk/cardano-cli/pull/163)\\n- [Bump index states](https://github.com/input-output-hk/cardano-cli/pull/160)\\n- [Fix deregistration-certificate: generate deregistration instead of registration certs](https://github.com/input-output-hk/cardano-cli/pull/159)\\n- [Structuring legacy code so that era-based code does not depend on it](https://github.com/input-output-hk/cardano-cli/pull/158)\\n- [Plural for command groups](https://github.com/input-output-hk/cardano-cli/pull/151)\\n- [Implement `conway governance committee key-hash` command](https://github.com/input-output-hk/cardano-cli/pull/144)\\n- [Wire up constitution creation in the new era based cli commands](https://github.com/input-output-hk/cardano-cli/pull/142)\\n- [cardano-cli 8.5.0.0](https://github.com/input-output-hk/cardano-cli/pull/140)\\n- [Wire up remaining DReps](https://github.com/input-output-hk/cardano-cli/pull/137)\\n- [Implement `conway governance committee hot-key-gen` command](https://github.com/input-output-hk/cardano-cli/pull/136)\\n- [Convert to use `tasty-discover`](https://github.com/input-output-hk/cardano-cli/pull/127)\\n\\n### cardano-api\\n\\n- [Release cardano-api 8.13.1.0](https://github.com/input-output-hk/cardano-api/pull/189)\\n- [Fix build](https://github.com/input-output-hk/cardano-api/pull/187)\\n- [cardano-api 8.13.0.0](https://github.com/input-output-hk/cardano-api/pull/185)\\n- [Modify `queryGenesisParameters` so that its type advertises it only returns genesis parameters for the Shelley era](https://github.com/input-output-hk/cardano-api/pull/181)\\n- [Introduce EraBasedProtocolParametersUpdate](https://github.com/input-output-hk/cardano-api/pull/180)\\n- [Delete deprecated functions and types](https://github.com/input-output-hk/cardano-api/pull/173)\\n- [Simplify code with new constraints functions](https://github.com/input-output-hk/cardano-api/pull/171)\\n- [Fix `EraCast Certificate`](https://github.com/input-output-hk/cardano-api/pull/170)\\n- [New version `cardano-api-8.12.0.0`](https://github.com/input-output-hk/cardano-api/pull/168)\\n- [Fix committee hot keys](https://github.com/input-output-hk/cardano-api/pull/167)\\n- [New version `cardano-api-8.11.1.0`](https://github.com/input-output-hk/cardano-api/pull/164)\\n- [Fix typo Constitional -> Constitutional](https://github.com/input-output-hk/cardano-api/pull/163)\\n\\n\\n### cardano-node\\n\\n- [cardano-git-rev: New version for CHaP](https://github.com/input-output-hk/cardano-node/pull/5430)\\n- [Fix broken links in docs](https://github.com/input-output-hk/cardano-node/pull/5427)\\n- [cardano-node 8.2.1](https://github.com/input-output-hk/cardano-node/pull/5423)\\n\\n\\n### cardano-testnet\\n\\n- [Fix broken links in docs](https://github.com/input-output-hk/cardano-node/pull/5427)\\n- [cardano-node 8.2.1](https://github.com/input-output-hk/cardano-node/pull/5423)\\n\\n\\n### docs\\n\\n[Fix broken links in docs](https://github.com/input-output-hk/cardano-node/pull/5427)\\n\\n### CI & project maintenance\\n\\n- [Convert to use `tasty-discover`](https://github.com/input-output-hk/cardano-cli/pull/127)"},{"id":"2023-08-11-hydra","metadata":{"permalink":"/cardano-updates/2023-08-11-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-11-hydra.md","source":"@site/blog/2023-08-11-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-08-11T00:00:00.000Z","formattedDate":"August 11, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.8,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"},{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-08-11-hydra","authors":["ffakenz","ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-08-15-node-cli-api"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-08-11-performance-and-tracing"}},"content":"## High-level summary\\n\\nThis week, the Hydra team updated `hydra-node` to support `cardano-node` version\\n8.1.2, ensuring compatibility with the latest mainnet release. The team also\\nparticipated in discussions about a \\"cardanonical\\" JSON schema and added it as a\\nsubmodule to the project, contributing to improved data modeling and\\ninteroperability.\\n\\nIn terms of community engagement, the team successfully onboarded a new\\ncontributor, also participated in a RareEvo Twitter space, and continued\\npreparations for the Hydra master-class.\\n\\n## What did the team achieve this week\\n\\n- Updated dependencies to support cardano-node 8.1.2 [#1007](https://github.com/input-output-hk/hydra/issues/1007)\\n- Engaged in discussions about a “cardanonical” json schema and\\n add it as submodule to the project\\n [#1013](https://github.com/input-output-hk/hydra/pull/1013)\\n- Onboarded a new contributor to the hydra project (@locallycompact)\\n- Joined RareEvo twitter space and continued preparation of hydra master-class\\n\\n## What are the goals of next week\\n\\n- Update & streamline tutorial to work with latest version of hydra-node\\n- Remove the internal commit functionality [#954](https://github.com/input-output-hk/hydra/issues/954)\\n- Release 0.12.0"},{"id":"2023-08-11-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-08-11-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-11-performance-and-tracing.md","source":"@site/blog/2023-08-11-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-08-11T00:00:00.000Z","formattedDate":"August 11, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.335,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-08-11-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-11-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-08-10-mithril"}},"content":"## High level summary\\n\\n* Benchmarking: We\'ve concluded benchmarking node version `8.2.0`.\\n* Tracing: Optimization of the new tracing system has been merged; we\'re currently working on self-documenting tracing configuration.\\n* Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nAs part of our release benchmarking cycle, we\'ve completed and analysed the runs for the `8.2.0` version of `cardano-node`. In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version.\\n\\n### Tracing\\n\\nA significant amount of optimizations for the new tracing system has finally been merged to `master`. At the moment,\\nwe\'re working on having a trace message self-document the final tracing configuration of a running node. Apart from adding\\ninsight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward. \\n\\nFurthermore, we\'re setting up a final round of system integration level benchmarks comparing new against legacy tracing.\\n\\n### Nomad backend\\n\\nThe new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent\\nand reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were\\nable to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks. \\n\\nA PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to `master`."},{"id":"2023-08-10-mithril","metadata":{"permalink":"/cardano-updates/2023-08-10-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-10-mithril.md","source":"@site/blog/2023-08-10-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-08-10T00:00:00.000Z","formattedDate":"August 10, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.7,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-08-10-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-08-11-performance-and-tracing"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-08-09-consensus"}},"content":"## High level overview\\nThe Mithril team completed the **Mithril protocol\u2019s mainnet beta** launch: the `release-mainnet` network is now consistently producing new certificates and snapshots! The team has released a new distribution [`2331.1`](https://github.com/input-output-hk/mithril/releases/tag/2331.1) which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the `mainnet` infrastructure.\\n\\nFinally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network.\\n\\n## Low level overview\\n- Released the new distribution [`2331.1`](https://github.com/input-output-hk/mithril/releases/tag/2331.1)\\n- Completed the epic `Release \'mainnet\' Mithril network` [#918](https://github.com/input-output-hk/mithril/issues/918)\\n- Worked on the epic `Benchmark performances of Mithril Aggregator` [#904](https://github.com/input-output-hk/mithril/issues/904):\\n - Completed the issue `Design & implement basic stress test tool for aggregator - phase 1` [#991](https://github.com/input-output-hk/mithril/issues/991)\\n- Worked on the epic `Post deployment \'mainnet\' infrastructure` [#1091](https://github.com/input-output-hk/mithril/issues/1091):\\n - Completed the issue `Create Production Infrastructure Runbook` [#1085](https://github.com/input-output-hk/mithril/issues/1085)\\n - Completed the issue `Ingest \'mainnet\' metrics/logs in Grafana` [#1122](https://github.com/input-output-hk/mithril/issues/1122)\\n- Worked on optimizations:\\n - Completed the issue `Add a \'clean\' file to extracted database in client` [#1131](https://github.com/input-output-hk/mithril/issues/1131)\\n - Worked on the issue `Create explorer page with registered signers` [#1097](https://github.com/input-output-hk/mithril/issues/1097)\\n- Worked on refactoring:\\n - Worked on the issue `Refactor (de)serialization of crypto entities` [#668](https://github.com/input-output-hk/mithril/issues/668)\\n- Worked on bugs:\\n - Completed the issue `Client fails to unpack some snapshot archive` [#1137](https://github.com/input-output-hk/mithril/issues/1137)\\n - Completed the issue `The \'release-preprod\' network stopped producing certificates` [#1114](https://github.com/input-output-hk/mithril/issues/1114)\\n - Completed the issue `The \'release-mainnet\' network does not show up in the explorer` [#1111](https://github.com/input-output-hk/mithril/issues/1111)\\n- Worked on dependencies:\\n - Completed the issue `Upgrade Cardano node to \'8.1.2\'` [#1090](https://github.com/input-output-hk/mithril/issues/1090)\\n- Worked on troubleshooting:\\n - Completed the issue `Signer can\'t sign with \'Invalid signature for party\' error` [#1125](https://github.com/input-output-hk/mithril/issues/1125)"},{"id":"2023-08-09-consensus","metadata":{"permalink":"/cardano-updates/2023-08-09-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-09-consensus.md","source":"@site/blog/2023-08-09-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-08-09T00:00:00.000Z","formattedDate":"August 9, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.46,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-08-09-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-08-10-mithril"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-08-04-crypto"}},"content":"## High level summary\\n\\nThis week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of `fs-sim` and `fs-api`, and released `strict-checked-vars`.\\n\\n## UTxO-HD\\n\\n- Rebased UTxO-HD on top of node 8.2 ([issue](https://github.com/input-output-hk/ouroboros-consensus/issues/256))\\n- Address new `Maybe` translations for UTxOs in Conway 1.6. ([PR](https://github.com/input-output-hk/ouroboros-consensus/pull/261)).\\n- Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory.\\n- [Fixed](https://github.com/input-output-hk/cardano-node/compare/96e92351ad35cfce1b0c2c47c4ed05792bf81fad..90d4c93af0846c9b027d530c042180c51aeee4fd) an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully.\\n- Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running `QueryUTxOByAddress` ([PR](https://github.com/input-output-hk/ouroboros-consensus/pull/273)).\\n- Measured the speed of `QueryUTxOByAddress` under different `queryBatchSize` values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution.\\n- Refactored and implemented ledgertable-related classes for the general `HardforkBlock`.\\n\\n## Genesis\\n\\n- [Frisby](https://github.com/nfrisby) and [Esgen](https://github.com/amesgen) continue to engage with the Researchers on grinding against the Genesis design.\\n\\n## Fostering collaboration\\n\\n- Drafted a document explaining versioning of local state queries [#273](https://github.com/input-output-hk/ouroboros-consensus/pull/273).\\n\\n## Support\\n\\n- [Frisby](https://github.com/nfrisby) is the release engineer this cycle.\\n- Successfully created work-in-progress `ouroboros-consensus` and `cardano-api` commits that integrate the 2023 Aug 7 tip of `cardano-ledger`. This will require a release of `ouroboros-consensus`, which hasn\'t happened yet."},{"id":"2023-08-04-crypto","metadata":{"permalink":"/cardano-updates/2023-08-04-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-crypto.md","source":"@site/blog/2023-08-04-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-08-04T00:00:00.000Z","formattedDate":"August 4, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":0.495,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-08-04-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-08-09-consensus"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-08-04-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation\\n* mithril: Full node verifier\\n* musig2: Finalised the missing fuzz tests\\n* kes_agent: engineer on PTO. Work halted \\n\\n## Low level summary\\n### Mithril\\n* Work on a mithril flaky test [#1105](https://github.com/input-output-hk/mithril/pull/1105)\\n* Keep working on Full Node Verifier [#939](https://github.com/input-output-hk/mithril/pull/939).\\n Should be merged in the coming week.\\n### MuSig2\\n* Finalised the fuzz tests [#43](https://github.com/input-output-hk/musig2/pull/43)\\n### Sidechains\\n* Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier."},{"id":"2023-08-04-goedel","metadata":{"permalink":"/cardano-updates/2023-08-04-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-goedel.md","source":"@site/blog/2023-08-04-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-08-04T00:00:00.000Z","formattedDate":"August 4, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.43,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-08-04-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-08-04-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-04-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThe team is formalising mini protocols and also further developing the\\nperformance modelling prototype.\\n\\n## Details\\n\\n* Developing new framework for specification and verification of\\n mini-protocols which is closer to the Haskell implementation.\\n\\n* Developed a new internal representation for the DeltaQ algebra that\\n allows for more modularity in backend implementations\\n\\n* Discussions regarding the Cardano networking specification"},{"id":"2023-08-04-hydra","metadata":{"permalink":"/cardano-updates/2023-08-04-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-hydra.md","source":"@site/blog/2023-08-04-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-08-04T00:00:00.000Z","formattedDate":"August 4, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.06,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-08-04-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-08-04-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-08-04-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team achieved notable progress in various aspects of the\\nproject. The team updated the use case section for auctions on the [/unstable](https://hydra.family/head-protocol/unstable/use-cases/)\\nbranch of the website, improving the understanding of Hydra’s applicability.\\n\\nFrom the development side, the team successfully completed event-sourced\\npersistence, a key enhancement in the project’s architecture which improves\\noff-chain transaction processing performance. They also added a\\n“submit-transaction” endpoint to the API.\\n\\nIn addition to project-related progress, the team actively engaged in community\\nreviews for several catalyst proposals related to Hydra and Mithril,\\ncontributing to the wider Cardano ecosystem.\\n\\nFinally, the full report for the month of July was also published [here](https://hydra.family/head-protocol/monthly/2023-07).\\n\\n## What did the team achieve this week\\n\\n- Published the [monthly report for July](https://hydra.family/head-protocol/monthly/2023-07)\\n- Updated the use case section for auctions (published on [/unstable](https://hydra.family/head-protocol/unstable/use-cases/) branch)\\n- Completed event sourced persistence [#913](https://github.com/input-output-hk/hydra/issues/913)\\n- Added a “submit-transaction” endpoint to the API [#966](https://github.com/input-output-hk/hydra/issues/966)\\n- Community reviews for several catalyst proposals related to Hydra and Mithril\\n- Created a network testing tool (hydra-net) [#1006](https://github.com/input-output-hk/hydra/pull/1006)\\n\\n## What are the goals of next week\\n\\n- Update hydra-node to work with cardano-node version 8.x\\n- Remove the internal commit functionality\\n- Release version 0.12.0\\n- Update & streamline tutorial to work with latest version of hydra-node"},{"id":"2023-08-04-ledger","metadata":{"permalink":"/cardano-updates/2023-08-04-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-ledger.md","source":"@site/blog/2023-08-04-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-08-04T00:00:00.000Z","formattedDate":"August 4, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.915,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-08-04-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-08-04-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-08-04-network"}},"content":"## High level summary\\n\\nThe ledger team was working almost exclusively on the Conway era implementation. In\\nparticular, the main focus was directed towards solidifying transaction related types and\\ntheir binary representation. We also directed some effort into unblocking Plutus team with\\nrespect to PlutusV3 integration.\\n\\n## Low level summary\\n\\n### Conway progress\\n\\n* [pull-3552] - Allow Constitutional Committee Hot Key to be ScriptHash\\n* [pull-3581] - Make Constitutional Committee Cold Key to be ScriptHash\\n* [pull-3571] - Implement a portion of the TICKF rule.\\n* [pull-3556] - Add Script to Constitution\\n* [pull-3576] - Add optional Anchor to ConwayRegDRep certificate\\n* [pull-3495] - Implement refund logic for Proposal deposits\\n* [pull-3579] - Change voting procedure in the transaction to a nested Map\\n* [pull-3585] - Rename `CommitteeCert` into a `GovCert`\\n* [pull-3587] - Remove `DelegStakeTxCert` from the `COMPLETE` pragma for `TxCert`\\n* [pull-3586] - Add `CurrentTreasuryValue` to `TxBody`\\n* [pull-3588] - Rename key roles\\n* [pull-3557] - Update `NewCommittee` action to use `RewardAcnt` and add more info\\n* [pull-3595] - Add `ConwayUpdateDRep` constructor to ConwayTxCertGov type\\n* [pull-3600] - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway\\n* [pull-3597] - Update `ProposalProcedure` return address to be a `RewardAcnt`\\n\\n### Testing\\n\\n* [pull-3374] - New features for generation subject to constraints\\n* [pull-3519] - Basic Conway features test\\n\\n### Bugfixes\\n\\n* [pull-3566] - Mint field translation bugfix.\\n\\n### Plutus integration\\n\\n* [issue-3538] - A fairly complete specification was created for the PlutusV3 context\\n* [pull-3593] - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality\\n\\n### Improvements and releasing\\n\\n* [pull-3574] - Improve clarity and performance of collateral Non-ADA validation:\\n* [pull-3573] - Update top-level `CHANGELOG.md` with cardano-node relevant changes\\n* [pull-3555] - Bump pygments from 2.12.0 to 2.15.0 in /doc\\n* [pull-3575] - Bump certifi from 2022.12.7 to 2023.7.22 in /doc\\n* [pull-3567] - Backport mint field translation bugfix\\n* [pull-3568] - Fixed typo in byron ledger spec\\n* [pull-3572] - Release/backport tickf bugfix\\n\\n\\n\\n[issue-3538]: https://github.com/input-output-hk/cardano-ledger/issues/3538\\n[pull-3555]: https://github.com/input-output-hk/cardano-ledger/pull/3555\\n[pull-3566]: https://github.com/input-output-hk/cardano-ledger/pull/3566\\n[pull-3567]: https://github.com/input-output-hk/cardano-ledger/pull/3567\\n[pull-3568]: https://github.com/input-output-hk/cardano-ledger/pull/3568\\n[pull-3572]: https://github.com/input-output-hk/cardano-ledger/pull/3572\\n[pull-3552]: https://github.com/input-output-hk/cardano-ledger/pull/3552\\n[pull-3571]: https://github.com/input-output-hk/cardano-ledger/pull/3571\\n[pull-3575]: https://github.com/input-output-hk/cardano-ledger/pull/3575\\n[pull-3573]: https://github.com/input-output-hk/cardano-ledger/pull/3573\\n[pull-3556]: https://github.com/input-output-hk/cardano-ledger/pull/3556\\n[pull-3574]: https://github.com/input-output-hk/cardano-ledger/pull/3574\\n[pull-3576]: https://github.com/input-output-hk/cardano-ledger/pull/3576\\n[pull-3581]: https://github.com/input-output-hk/cardano-ledger/pull/3581\\n[pull-3495]: https://github.com/input-output-hk/cardano-ledger/pull/3495\\n[pull-3579]: https://github.com/input-output-hk/cardano-ledger/pull/3579\\n[pull-3585]: https://github.com/input-output-hk/cardano-ledger/pull/3585\\n[pull-3587]: https://github.com/input-output-hk/cardano-ledger/pull/3587\\n[pull-3586]: https://github.com/input-output-hk/cardano-ledger/pull/3586\\n[pull-3588]: https://github.com/input-output-hk/cardano-ledger/pull/3588\\n[pull-3557]: https://github.com/input-output-hk/cardano-ledger/pull/3557\\n[pull-3593]: https://github.com/input-output-hk/cardano-ledger/pull/3593\\n[pull-3595]: https://github.com/input-output-hk/cardano-ledger/pull/3595\\n[pull-3374]: https://github.com/input-output-hk/cardano-ledger/pull/3374\\n[pull-3600]: https://github.com/input-output-hk/cardano-ledger/pull/3600\\n[pull-3597]: https://github.com/input-output-hk/cardano-ledger/pull/3597\\n[pull-3519]: https://github.com/input-output-hk/cardano-ledger/pull/3519"},{"id":"2023-08-04-network","metadata":{"permalink":"/cardano-updates/2023-08-04-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-network.md","source":"@site/blog/2023-08-04-network.md","title":"Network Team Update","description":"High-level overview of sprint 41","date":"2023-08-04T00:00:00.000Z","formattedDate":"August 4, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.515,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-08-04-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-08-04-ledger"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-08-04-performance-and-tracing"}},"content":"## High-level overview of [sprint 41][sprint-41]\\n_24th July - 6th August 2023_\\n\\nWe started the implementation of __bootstrap peers__. Bootstrap peers are designed\\nto provide a safety guarantee for nodes joining the network while still taking\\nadvantage of the distributed network for nodes that are synced. This will be\\nan intermediate step before Genesis which will allow for further distribute the\\nsystem. The bootstrap peers will be run by some trusted partners like CF,\\nEmurgo or IOG. They are primarily designed for leaf nodes (e.g. full node\\nwallets), which often end up syncing and require access to the honest chain. See\\n[ouroboros-network#4615] for a more detailed implementation plan.\\n\\n## Other contributions\\n\\nWe started to use `nothunks` library to discover if we have any unevaluated\\nthunks which can lead to memory leaks [ouroboros-network#4633]. We found\\na small one in the peer metric component of the P2P networking stack. Fixing\\nit put us on a small detour of fixing the API of the [`strict-checked-vars`]\\npackage: [cardano-base#431], [cardano-base#432], as well as adding `NFData`\\ninstance to [`io-classes`][io-classes#110]. We also improved `nothunks`\\nlibrary to make debugging easier and we provided a `NoThunks` instance for\\n`ThreadId` which we will need in the future (see [nothunks#33]).\\n\\nWe released a new version of `io-classes` (version `1.2.0.0`) and related\\npackages to [Hackage][io-classes-1.2.0.0].\\n\\nWe addressed all review comments on the eclipse evasion PR which introduces big\\nledger peers, [ouroboros-network#3886].\\n\\nWe fixed how `SIGHUP` signal handlers are registered, so it\'s not possible to\\nshutdown a node which was starting while trying to update network topology,\\nsee [cardano-node#5421].\\n\\nI didn\'t mention that in the previous update, so here it goes: in the previous\\nsprint we released [`ouroboros-network-0.8.2.0`] and\\n[`ouroboros-network-framework-0.7.0.0`].\\n\\n[sprint-41]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+41%22\\n\\n[`strict-checked-vars`]: https://github.com/input-output-hk/cardano-base/tree/master/strict-checked-vars\\n[cardano-base#431]: https://github.com/input-output-hk/cardano-base/pulls/431\\n[cardano-base#432]: https://github.com/input-output-hk/cardano-base/pulls/432\\n[cardano-node#5421]: https://github.com/input-output-hk/cardano-node/pull/5421\\n[ouroboros-network#3886]: https://github.com/input-output-hk/ouroboros-network/issues/3886\\n[ouroboros-network#4615]: https://github.com/input-output-hk/ouroboros-network/issues/4615\\n[ouroboros-network#4633]: https://github.com/input-output-hk/ouroboros-network/issues/4633\\n[`ouroboros-network-0.8.2.0`]: https://github.com/input-output-hk/ouroboros-network/blob/f84fcddce472d6cfc2b838b20a2ad085fe0896ed/ouroboros-network/CHANGELOG.md\\n[`ouroboros-network-framework-0.7.0.0`]: https://github.com/input-output-hk/ouroboros-network/blob/ouroboros-network-framework-0.7.0.0/ouroboros-network-framework/CHANGELOG.md\\n[io-classes#110]: https://github.com/input-output-hk/io-sim/pull/110\\n[io-classes-1.2.0.0]: https://hackage.haskell.org/package/io-classes-1.2.0.0io-classes-1.2.0.0\\n[nothunks#33]: https://github.com/input-output-hk/nothunks/pull/33"},{"id":"2023-08-04-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-08-04-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-performance-and-tracing.md","source":"@site/blog/2023-08-04-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-08-04T00:00:00.000Z","formattedDate":"August 4, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.76,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-08-04-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-08-04-network"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-08-04-sre"}},"content":"## High level summary\\n\\n* Benchmarking: We\'re adjusting the benchmarking cluster to handle runs for node version `8.2.0`.\\n* Tracing: We\'ve finished optimization of the new tracing system and added extra robustness with regard to namespacing.\\n* Infrastructure: We\'ve been working on making all benchmarking code compliant with the latest GHC9.6.\\n* Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we\'ve successfully performed various benchmarking runs on it.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nThe `8.2.0` version of `cardano-node` required adjustment of some of the sanity checks that are part of our benchmarking\\ncluster automation. We\'ve pinpointed the necessary changes and are currently setting up the cluster for the new node version.\\n\\n### Tracing\\n\\nThe optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint\\nwhen using it as default for a running node. \\n\\nA linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any\\ninconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node.\\nThis feature adds another layer of robustness to the whole system.\\n\\n### Infrastructure\\n\\nA potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler\\nversions. We\'ve future-proofed our benchmarking code.\\n\\n### Nomad backend\\n\\nThe hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend\\naccordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant. \\n\\nThe validation phase is ongoing. We were able to perform successful runs and analyses for various `8.x` node versions, including `8.2.0-pre`. With parallel runs on the current cluster, we hope to measure the same effects we\'ve observed with the\\nnomad backend - which will be a big step towards production use."},{"id":"2023-08-04-sre","metadata":{"permalink":"/cardano-updates/2023-08-04-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-sre.md","source":"@site/blog/2023-08-04-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-08-04T00:00:00.000Z","formattedDate":"August 4, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":0.64,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-08-04-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-08-04-performance-and-tracing"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-08-01-node-cli-api"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent updates or improvements include:\\n* Preprod and preview envionments were updated to 8.1.2.\\n* Sanchonet and shelley-qa environments were updated to 8.2.0-pre.\\n* Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.\\n\\n## Lower level summary\\n\\n### Cardano-ops\\n* Deploy cardano-node 8.1.2, merge p2p modifications, script fixes and cleanup: [cardano-ops-pull-416](https://github.com/input-output-hk/cardano-ops/pull/416)\\n\\n### Cardano-perf\\n* New repo: [cardano-perf-repo](https://github.com/input-output-hk/cardano-perf)\\n\\n### Cardano-world\\n* Deploy cardano-node 8.1.2, emurgo p2p config, optimize faucet resources: [cardano-world-pull-104](https://github.com/input-output-hk/cardano-world/pull/104)\\n* Resolve nomad segfaults via nix versioning and fixup dbSync metal job for iohkNix env update: [cardano-world-pull-105](https://github.com/input-output-hk/cardano-world/pull/105)\\n* Add nomad dbSync fix for iohkNix env update: [cardano-world-pull-106](https://github.com/input-output-hk/cardano-world/pull/106)"},{"id":"2023-08-01-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-08-01-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-01-node-cli-api.md","source":"@site/blog/2023-08-01-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-08-01T00:00:00.000Z","formattedDate":"August 1, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.76,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-08-01-node-cli-api","tags":["cli-api"],"authors":"carlos","hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-08-04-sre"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-07-31-network"}},"content":"# 2023-07-19 - 2023-08-01\\n\\n## High level summary\\n\\n- Release of Node 8.2.0\\n - Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694.\\n - This release is phase 1 of the SanchoNet roll out\\n - Allows SPOs to vote on changes to the on-chain constitution.\\n - Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag.\\n - Updates to the networking packages prepare the road for peer sharing.\\n- cardano-cli and cardano-api continue to integrate Conway era features\\n- Continue refactoring of cardano-testnet\\n\\n### cardano-cli\\n\\n- [Use AnyShelleyToBabbageEra from cardano-api instead](https://github.com/input-output-hk/cardano-cli/pull/116)\\n- [Update to `cardano-api-8.10.2.0`](https://github.com/input-output-hk/cardano-cli/pull/115)\\n- [Add rendering for `ConwayCertificate` in `Cardano.Cli.Json.Friendly`](https://github.com/input-output-hk/cardano-cli/pull/113)\\n- [Update to `cardano-api-8.10.1.0`](https://github.com/input-output-hk/cardano-cli/pull/111)\\n- [Add DRep registration certificate command](https://github.com/input-output-hk/cardano-cli/pull/110)\\n- [Add options to delegate voting stake ](https://github.com/input-output-hk/cardano-cli/pull/109)\\n- [Share MIR certificates code between era-based and legacy CLI parsers](https://github.com/input-output-hk/cardano-cli/pull/107)\\n- [Release cardano-cli 8.4.0.0](https://github.com/input-output-hk/cardano-cli/pull/106)\\n- [Update to`cardano-api-8.10.0.0`](https://github.com/input-output-hk/cardano-cli/pull/103)\\n- [Change directory structure from Options/.. to EraBased/..](https://github.com/input-output-hk/cardano-cli/pull/100)\\n- [Era-sensitive command structure](https://github.com/input-output-hk/cardano-cli/pull/98)\\n- [#86 Set default era to Babbage in stake-address, stake-pool and governance commmands](https://github.com/input-output-hk/cardano-cli/pull/90)\\n\\n\\n### cardano-api\\n\\n\\n- [Deprecate `shelleyCertificateConstraints` and `conwayCertificateConstraints`](https://github.com/input-output-hk/cardano-api/pull/155)\\n- [Deprecate `TxVotesSupportedInEra`](https://github.com/input-output-hk/cardano-api/pull/154)\\n- [Add SerialiseAsBech32 instances for committee cold and hot keys](https://github.com/input-output-hk/cardano-api/pull/152)\\n- [Deprecate some constraint functions](https://github.com/input-output-hk/cardano-api/pull/151)\\n- [Deprecate `TxGovernanceActionSupportedInEra`](https://github.com/input-output-hk/cardano-api/pull/150)\\n- [More `shelleyBasedEraConstraint` constraints](https://github.com/input-output-hk/cardano-api/pull/149)\\n- [New version `cardano-api-8.10.2.0`](https://github.com/input-output-hk/cardano-api/pull/148)\\n- [Expose shelleyCertificateConstraints and conwayCertificateConstraints](https://github.com/input-output-hk/cardano-api/pull/147)\\n- [Remove unnecessary function `getShelleyEraTxBodyConstraint`](https://github.com/input-output-hk/cardano-api/pull/146)\\n- [Provide additional constraints in `shelleyBasedEraConstraints`](https://github.com/input-output-hk/cardano-api/pull/143)\\n- [Update changelogs for `cardano-api-8.10.1.0`](https://github.com/input-output-hk/cardano-api/pull/142)\\n- [handleFileForWritingWithOwnerPermissionImpl: Fix permisions](https://github.com/input-output-hk/cardano-api/pull/141)\\n- [Update DRepKey with correct `Voting` keyrole](https://github.com/input-output-hk/cardano-api/pull/138)\\n- [Support more constraints for Conway witnesses](https://github.com/input-output-hk/cardano-api/pull/137)\\n- [New version `cardano-api-8.10.0.0`](https://github.com/input-output-hk/cardano-api/pull/135)\\n- [Expose toShelleyPoolParams for conway integration](https://github.com/input-output-hk/cardano-api/pull/134)\\n- [`FeatureInEra` instance for `ShelleyBasedEra`](https://github.com/input-output-hk/cardano-api/pull/131)\\n- [Expose more functionality from cardano-api](https://github.com/input-output-hk/cardano-api/pull/130)\\n- [Improved feature ergonomics](https://github.com/input-output-hk/cardano-api/pull/128)\\n- [Rename `AtMostBabbageEra` to `ShelleyToBabbageEra`](https://github.com/input-output-hk/cardano-api/pull/127)\\n\\n\\n### cardano-node\\n\\n- [Fix stubbed LogFormatting instances](https://github.com/input-output-hk/cardano-node/pull/5412)\\n- [8.2.0 version bumps](https://github.com/input-output-hk/cardano-node/pull/5411)\\n- [Bump network packages version](https://github.com/input-output-hk/cardano-node/pull/5409)\\n- [Fix missing `ToObject` tracing instances.](https://github.com/input-output-hk/cardano-node/pull/5404)\\n- [input-output-hk/cardano-cli#85 Fix node crashing in babbage](https://github.com/input-output-hk/cardano-node/pull/5401)\\n\\n\\n### cardano-testnet\\n\\n- [8.2.0 version bumps](https://github.com/input-output-hk/cardano-node/pull/5411)\\n- [Bump network packages version](https://github.com/input-output-hk/cardano-node/pull/5409)\\n- [Fix missing `ToObject` tracing instances.](https://github.com/input-output-hk/cardano-node/pull/5404)\\n- [Fix plutus script costing in cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/5400)\\n\\n### docs\\n\\n- [Bump network packages version](https://github.com/input-output-hk/cardano-node/pull/5409)\\n - [WarmValency](https://github.com/input-output-hk/cardano-node/blob/05c0392b4722d7fe2f82db1854b28de4f28a917b/doc/getting-started/understanding-config-files.md?plain=1#L84C1-L97C42)\\n\\n### CI & project maintenance"},{"id":"2023-07-31-network","metadata":{"permalink":"/cardano-updates/2023-07-31-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-31-network.md","source":"@site/blog/2023-07-31-network.md","title":"Network Team Update","description":"Network Update (Sprints 39 & 40)","date":"2023-07-31T00:00:00.000Z","formattedDate":"July 31, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":2.18,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-07-31-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-08-01-node-cli-api"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-28-hydra"}},"content":"## Network Update (Sprints 39 & 40)\\n\\nThe network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away.\\nIt was great to see and talk to so many of the community members.\\n\\n### Sprint 39 (Jun 26 - Jul 09)\\n\\n#### Major changes\\n\\nNow the following __list of traces will be turned on by default__:\\n\\n##### `node-to-client` protocol\\n\\n- `LocalConnectionManagerTracer` \\n- `LocalInboundGovernor`\\n- `LocalHandshake`\\n- `LocalServer`\\n\\n##### `node-to-node` protocol\\n\\n- `Server`\\n\\nSee [cardano-node#5353]. This will be released in `node-8.2.0`.\\n\\n\\nWe made sure that `cardano-client-0.1.0.x` library (which is `db-sync`) is not using the experimental `node-to-client` protocol.\\nThe `cardano-client-0.2.0.0` was not affected.\\nSee [ouroboros-network#4612].\\n\\nWe merged the __dynamic block production feature__ to `ouroboros-consensus` (also available in the `cardano-node-8.2.0` release).\\nDynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes.\\nSee [ouroboros-network#3159], [ouroboros-consensu#140].\\n\\nWe continued to review the implementation of big ledger peers for eclipse evasion, see [ouroboros-network#4462].\\n\\n#### Minor changes\\n\\n- We refactored the top level `cardano-node` error handler: [cardano-node#5356]\\n\\n\\n### Sprint 40 (Jul 09 - Jul 23)\\n\\n#### Major changes\\n\\nWe integrated `ouroboros-network-0.8.2.0` with the `master` branch of `cardano-node` for the `8.2.0` release (the version match between `ouroboros-network` and `cardano-node` is purely accidental).\\nThis includes:\\n\\n* integration with __dynamic block production__ feature.\\n This feature is documented in the [following PR][cardano-node#5399].\\n* __Warm valency__ for local root peers (see below).\\n\\nFor the full list of features included in the `8.2.0` release from the network side, please take a look at the [pre-release nodes][cardano-node-8.2.0-pre].\\n\\n\\nWe __improved the memory footprint__ of peer metrics measured by the P2P stack.\\nPeer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation).\\nSee [ouroboros-network#4620].\\nThe improvement will be available in `cardano-node-8.2.0`.\\n\\nWe added an __optional explicit warm valency__ to local root peers of the __P2P topology file__.\\nPreviously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to.\\nThe hot valency (previously known simply as valency) hasn\'t changed, but it must be smaller than the warm valency as hot peers are selected from warm ones.\\nWarm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses.\\nSee [ouroboros-network#4575], [cardano-node#5409].\\n\\n[cardano-node#5353]: https://github.com/input-output-hk/cardano-node/pull/5353\\n[cardano-node#5356]: https://github.com/input-output-hk/cardano-node/pull/5356\\n[cardano-node#5399]: https://github.com/input-output-hk/cardano-node/pull/5399\\n[cardano-node#5409]: https://github.com/input-output-hk/cardano-node/pull/5409\\n[cardano-node-8.2.0-pre]: https://github.com/input-output-hk/cardano-node/releases/tag/8.2.0-pre\\n[ouroboros-network#4575]: https://github.com/input-output-hk/ouroboros-network/pull/4575\\n[ouroboros-network#4612]: https://github.com/input-output-hk/ouroboros-network/pull/4612\\n[ouroboros-network#4620]: https://github.com/input-output-hk/ouroboros-network/pull/4620\\n[ouroboros-network#3159]: https://github.com/input-output-hk/ouroboros-network/issues/3159\\n[ouroboros-network#4462]: https://github.com/input-output-hk/ouroboros-network/pull/4462\\n[ouroboros-consensus#140]: https://github.com/input-output-hk/ouroboros-consensus/pull/140\\n\\n[sprint-39]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22Sprint+39%22\\n[sprint-40]: https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22Sprint+40%22"},{"id":"2023-07-28-hydra","metadata":{"permalink":"/cardano-updates/2023-07-28-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-28-hydra.md","source":"@site/blog/2023-07-28-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-07-28T00:00:00.000Z","formattedDate":"July 28, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.005,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-07-28-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-07-31-network"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-07-27-mithril"}},"content":"## High-level summary\\n\\nDuring this week, the Hydra team achieved significant progress in various areas.\\nThey conducted the monthly review meeting for July, which continously ensures\\ntransparent communication and project evaluation. The team migrated the core\\nlogic of the node to an event-sourced architecture and incremental writes of\\nevents to persistence, enhancing the project’s performance and maintainability.\\nFurthermore, the team added the ability to read protocol parameters via the API\\nand fixed the CI workflows to support pull requests from forks of external\\ncontributors, streamlining the development process for community involvement.\\n\\n## What did the team achieve this week\\n\\n- Held the monthly review meeting for July ([recording](https://drive.google.com/file/d/14ANZ3efuxgXpYK94EBWxZLR9TtN7voru/))\\n- Migrate the core logic of the node to an event-sourced architecture [#999](https://github.com/input-output-hk/hydra/pull/999)\\n- Updated persistence to faster incremental writes of events [#1000](https://github.com/input-output-hk/hydra/pull/1000)\\n- Added ability to read protocol parameters via API [#735](https://github.com/input-output-hk/hydra/issues/735)\\n- Fix CI workflows to support pull requests from forks of external contributors [#993](https://github.com/input-output-hk/hydra/pull/993)\\n- Updated to GHC 9.2.8 [#1005](https://github.com/input-output-hk/hydra/pull/1005)\\n- Prepared an updated use cases section on (published with next release)\\n\\n## What are the goals of next week\\n\\n- Publish monthly report\\n- Complete user transaction submission work [#966](https://github.com/input-output-hk/hydra/issues/966)\\n- Remove commit from internal wallet (deprecated) [#954](https://github.com/input-output-hk/hydra/issues/954)"},{"id":"2023-07-27-mithril","metadata":{"permalink":"/cardano-updates/2023-07-27-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-27-mithril.md","source":"@site/blog/2023-07-27-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-07-27T00:00:00.000Z","formattedDate":"July 27, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.715,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-07-27-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-28-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-07-26-consensus"}},"content":"## High level overview\\nThe Mithril team launched **Mithril protocol\u2019s mainnet beta**: the `release-mainnet` network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch. \\n\\nThey have released a new distribution [`2329.0`](https://github.com/input-output-hk/mithril/releases/tag/2329.0), which is running on the `release-mainnet` network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator.\\n\\nFinally, they have worked on enhancing the documentation for [onboarding SPOs](https://mithril.network/doc/manual/getting-started/SPO-on-boarding-guide) and setting up a [Mithril signer](https://mithril.network/doc/manual/getting-started/run-signer-node), and fixing installation bugs of the binary artifacts produced in the CI.\\n\\n\\n## Low level overview\\n- Created the dev blog post [Mithril Protocol\u2019s Mainnet Beta Launch](https://mithril.network/doc/dev-blog/2023/07/21/mainnet-beta-launch)\\n- Released the new distribution [`2329.0`](https://github.com/input-output-hk/mithril/releases/tag/2329.0)\\n- Closed the epic that prepares the Mithril infrastructure for `mainnet` [#767](https://github.com/input-output-hk/mithril/issues/767):\\n - Completed the issue `Deploy \'mainnet\' infrastructure` [#988](https://github.com/input-output-hk/mithril/issues/988)\\n - Completed the issue `Handle Secrets management` [#989](https://github.com/input-output-hk/mithril/issues/989)\\n- Worked on the epic `Release \'mainnet\' Mithril network` [#918](https://github.com/input-output-hk/mithril/issues/918)\\n - Completed the issue `Prepare SPO on-boarding guide` [#1049](https://github.com/input-output-hk/mithril/issues/1049)\\n- Worked on the epic `Benchmark performances of Mithril Aggregator` [#904](https://github.com/input-output-hk/mithril/issues/904):\\n - Worked on the issue `Design & implement basic stress test tool for aggregator` [#991](https://github.com/input-output-hk/mithril/issues/991)\\n- Worked on optimizations:\\n - Completed the issue `Enhance the configuration of Mithril relay` [#1080](https://github.com/input-output-hk/mithril/issues/1080)\\n - Completed the issue `Remove legacy store adapters from aggregator` [#1053](https://github.com/input-output-hk/mithril/issues/1053)\\n - Completed the issue `Add a \'sign\' sub-command to \'genesis\' command in aggregator` [#1081](https://github.com/input-output-hk/mithril/issues/1081)\\n- Worked on refactoring:\\n - Worked on the issue `Refactor (de)serialization of crypto entities` [#668](https://github.com/input-output-hk/mithril/issues/668)\\n- Worked on documentation:\\n - Completed the issue `Enhance \'Run a Mithril Signer node (SPO)\' guide` [#1055](https://github.com/input-output-hk/mithril/issues/1055)\\n- Worked on bugs:\\n - Completed the issue `Shared library error in CI binaries` [#1073](https://github.com/input-output-hk/mithril/issues/1073)\\n - Completed the issue `Debian package does not install cleanly on older ubuntu versions` [#834](https://github.com/input-output-hk/mithril/issues/834)\\n - Completed the issue `Aggregator panics with new (de)serialization of \'ProtocolVerificationKey\'` [#1083](https://github.com/input-output-hk/mithril/issues/1083)"},{"id":"2023-07-26-consensus","metadata":{"permalink":"/cardano-updates/2023-07-26-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-26-consensus.md","source":"@site/blog/2023-07-26-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-07-26T00:00:00.000Z","formattedDate":"July 26, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.85,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-07-26-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-07-27-mithril"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-21-hydra"}},"content":"## High level summary\\n\\nThe `db-sync` team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now.\\nWe also focused on completing tracing support for UTxO-HD in `cardano-node`.\\nCurrently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further. \\n\\nThe team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the `ChainSync` client as part of the onboarding efforts for the team that will implement Genesis.\\n\\nThe Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team.\\n\\n### Genesis liaising\\n\\nImprovements to the `ChainSync` client:\\n\\n- [#222](https://github.com/input-output-hk/ouroboros-consensus/pull/222).\\n- [#233](https://github.com/input-output-hk/ouroboros-consensus/pull/233)."},{"id":"2023-07-21-hydra","metadata":{"permalink":"/cardano-updates/2023-07-21-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-hydra.md","source":"@site/blog/2023-07-21-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-07-21T00:00:00.000Z","formattedDate":"July 21, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.7,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-07-21-hydra","authors":["ch1bo"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-07-26-consensus"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-07-21-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team updated the specification to align with recent\\noff-chain protocol changes, completed refactoring the snapshot emission\\nin preparation for event-sourced protocol logic, and updated to GHC\\n9.2.7, resulting in improved compile times and slightly smaller Plutus\\nscripts.\\n\\n## What did the team achieve this week\\n\\n- Updated the specification to match the recent off-chain protocol\\n changes to complete\\n [#728](https://github.com/input-output-hk/hydra/pull/728)\\n- Refactored the snapshot emission logic in preparation for event\\n sourced protocol logic.\\n- Updated to GHC 9.2.7, which led to improved compile times and\\n slightly smaller plutus scripts.\\n\\n## What are the goals of next week\\n\\n- Monthly review meeting next wednesday and July report\\n- Reflect latest information onto our roadmap.\\n- Actual implemention of event-sourced persistence\\n [#913](https://github.com/input-output-hk/hydra/pull/913).\\n- Update the use cases section on \\n- Remove deprecated internal commit\\n [#954](https://github.com/input-output-hk/hydra/pull/954)."},{"id":"2023-07-21-ledger","metadata":{"permalink":"/cardano-updates/2023-07-21-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-ledger.md","source":"@site/blog/2023-07-21-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-07-21T00:00:00.000Z","formattedDate":"July 21, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.715,"hasTruncateMarker":false,"authors":[{"name":"Alexey Kuleshevich","title":"Ledger Team Software Engineer","url":"https://github.com/lehins","imageURL":"https://github.com/lehins.png","key":"lehins"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-07-21-ledger","authors":"lehins","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-21-hydra"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-07-21-sre"}},"content":"## High level summary\\n\\nOur focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet. \\nAll members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era.\\nWe also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release).\\nAdditionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available.\\nWe also made progress on the constraint-based generators, which can now generate valid transactions and ledger states. \\n\\n## What we achieved \\n\\n* [[pull-3521]] [[pull-3554]] Improved Governance model (GovernanceProcedures, ProposalProcedure)\\n* [[pull-3520]] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert ) \\n* [[pull-3531]] Refactored and simplified code interacting with Plutus\\n* [[pull-3558]] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix. \\n* [[pull-3550]] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed.\\n* [[pull-3551]] [[pull-3546]] [[pull-3472]] Updated tools and added some small improvements \\n* [[issue-3146]] [[pull-3498]] Introduced Conway protocol parameters \\n* [[issue-2948]] [[pull-3499]] Implemented ConwayGenesis with the new protocol parameters\\n\\n## What is currently in progress\\n\\n* [[issue-3494]] [[pull-3495]] Implement returning of proposal deposits\\n* [[issue-3436]] [[pull-3523]] Implement transferring lovelace from UTxO to treasury\\n* [[issue-3509]] [[pull-3552]] Add script-support for the committee hot key\\n* [[issue-3532]] [[pull-3556]] Add script-support for the constitution\\n* [[issue-3543]] [[pull-3557]] Improve the \'new committee\' governance action by specifying the members to be replaced, expiration epoch of new members and adding script-support\\n\\n\\n[pull-3521]: https://github.com/input-output-hk/cardano-ledger/pull/3521\\n[pull-3554]: https://github.com/input-output-hk/cardano-ledger/pull/3554\\n[pull-3520]: https://github.com/input-output-hk/cardano-ledger/pull/3520\\n[pull-3531]: https://github.com/input-output-hk/cardano-ledger/pull/3531\\n[pull-3558]: https://github.com/input-output-hk/cardano-ledger/pull/3558\\n[pull-3550]: https://github.com/input-output-hk/cardano-ledger/pull/3550\\n[pull-3551]: https://github.com/input-output-hk/cardano-ledger/pull/3551\\n[pull-3546]: https://github.com/input-output-hk/cardano-ledger/pull/3546\\n[pull-3472]: https://github.com/input-output-hk/cardano-ledger/pull/3472\\n[pull-3498]: https://github.com/input-output-hk/cardano-ledger/pull/3498\\n[pull-3499]: https://github.com/input-output-hk/cardano-ledger/pull/3499\\n[pull-3495]: https://github.com/input-output-hk/cardano-ledger/pull/3495 \\n[pull-3523]: https://github.com/input-output-hk/cardano-ledger/pull/3523\\n[pull-3552]: https://github.com/input-output-hk/cardano-ledger/pull/3552\\n[pull-3556]: https://github.com/input-output-hk/cardano-ledger/pull/3556\\n[pull-3557]: https://github.com/input-output-hk/cardano-ledger/pull/3557 \\n[issue-3494]: https://github.com/input-output-hk/cardano-ledger/issues/3494\\n[issue-2948]: https://github.com/input-output-hk/cardano-ledger/issues/2948\\n[issue-3436]: https://github.com/input-output-hk/cardano-ledger/issues/3436\\n[issue-3532]: https://github.com/input-output-hk/cardano-ledger/issues/3532\\n[issue-3509]: https://github.com/input-output-hk/cardano-ledger/issues/3509\\n[issue-3146]: https://github.com/input-output-hk/cardano-ledger/issues/3146\\n[issue-3543]: https://github.com/input-output-hk/cardano-ledger/issues/3543"},{"id":"2023-07-21-sre","metadata":{"permalink":"/cardano-updates/2023-07-21-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-sre.md","source":"@site/blog/2023-07-21-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-07-21T00:00:00.000Z","formattedDate":"July 21, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":0.685,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-07-21-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-07-21-ledger"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-07-20-goedel"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements and general environment maintenance.\\n\\nSome notable recent improvements include:\\n* Re-spin sanchonet for testing a new node version followed by fork to Conway\\n* Deploying a sanchonet compatible faucet to sanchonet\\n* Migrate shelley qa legacy environment to cardano-world\\n\\n## Lower level summary\\n\\n### Cardano-node\\n* Bump iohk-nix for sanchonet and shelley qa environment updates: [cardano-node-pull-5406](https://github.com/input-output-hk/cardano-node/pull/5406)\\n\\n### Cardano-ops\\n* Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: [cardano-ops-compare](https://github.com/input-output-hk/cardano-ops/compare/31cce1a...496f085)\\n\\n### Cardano-world\\n* Cardano-node p2p all local roots entrypoint option was added: [cardano-world-pull-102](https://github.com/input-output-hk/cardano-world/pull/102)\\n* Migrate shelley qa legacy environment to cardano-world: [cardano-world-pull-103](https://github.com/input-output-hk/cardano-world/pull/103)\\n* Create a sanchonet compatible faucet: [cardano-world-pull-91](https://github.com/input-output-hk/cardano-world/pull/91)\\n\\n### Iohk-nix\\n\\n* Migrate shelley qa legacy environment to cardano-world: [iohk-nix-pull-549](https://github.com/input-output-hk/iohk-nix/pull/549)\\n* Drop legacy byron environment parameters: [iohk-nix-pull-550](https://github.com/input-output-hk/iohk-nix/pull/550)"},{"id":"2023-07-20-goedel","metadata":{"permalink":"/cardano-updates/2023-07-20-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-20-goedel.md","source":"@site/blog/2023-07-20-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-07-20T00:00:00.000Z","formattedDate":"July 20, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.47,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-07-20-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-07-21-sre"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-07-18-node-cli-api"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThe team is working on formalising mini protocols, the performance\\nmodelling prototype and also finishing off their ICE papers.\\n\\n## Details\\n\\n* Formalization of the chain synchronization mini-protocol in the\\n thorn calculus\\n\\n* Final pre-publication steps for ICE 2023 papers\\n\\n* Developing approach for specification and verification of\\n mini-protocols\\n\\n* Started work on porting the DeltaQ framework to a new, more concrete\\n backend based on piecewise-polynomials"},{"id":"2023-07-18-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-07-18-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-18-node-cli-api.md","source":"@site/blog/2023-07-18-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-07-18T00:00:00.000Z","formattedDate":"July 18, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.065,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-07-18-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-07-20-goedel"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-14-hydra"}},"content":"# 2023-07-05 - 2023-07-18\\n\\n## High level summary\\n\\n- Integrate Conway certificates in cardano-api\\n- Prepare cardano-cli and cardano-api for cardano-node 8.1.2\\n- Tagged cardano-cli 8.3.0.0\\n - Query for the hash of the constitution (Conway)\\n - Ability to create votes and governance actions\\n- Tagged cardano-cli 8.3.1.0\\n - Make it build with ghc-9.6\\n- Upgrade to optparse-applicative-fork-0.18.1.0 for parsing command line options\\n\\n\\n### cardano-cli\\n\\n- [Upgrade to `optparse-applicative-fork-0.18.1.0`](https://github.com/input-output-hk/cardano-cli/pull/74)\\n- [Integrate cardano-api changes for fixed Show and Eq instances for Proposal type](https://github.com/input-output-hk/cardano-cli/pull/72)\\n- [New version `cardano-cli-8.3.1.0`](https://github.com/input-output-hk/cardano-cli/pull/68)\\n- [Add alonzo era to `Parser AnyShelleyBasedEra`](https://github.com/input-output-hk/cardano-cli/pull/67)\\n- [Use `sbe` variable name for the type is `ShelleyBasedEra`](https://github.com/input-output-hk/cardano-cli/pull/66)\\n- [New version `cardano-cli-8.3.0.0`](https://github.com/input-output-hk/cardano-cli/pull/65)\\n\\n### cardano-api\\n\\n- [Fix ghc version CPP](https://github.com/input-output-hk/cardano-api/pull/123)\\n- [Add a HasTypeProxy constraint to getVerificationKey](https://github.com/input-output-hk/cardano-api/pull/122)\\n- [Incorporate remaining ledger certificates](https://github.com/input-output-hk/cardano-api/pull/119)\\n- [Release cardano-api 8.8.1.0, cardano-api-gen 8.1.1.0](https://github.com/input-output-hk/cardano-api/pull/117)\\n- [Fix Eq, Show for Proposal type](https://github.com/input-output-hk/cardano-api/pull/115)\\n- [Wire up remaining governance actions](https://github.com/input-output-hk/cardano-api/pull/112)\\n- [Export `withShelleyBasedEraConstraintsForLedger`](https://github.com/input-output-hk/cardano-api/pull/108)\\n- [Remove unnecessary constraint](https://github.com/input-output-hk/cardano-api/pull/106)\\n- [Make it build with ghc-9.6](https://github.com/input-output-hk/cardano-api/pull/104)\\n- [New `shelleyBasedEraConstraints` function](https://github.com/input-output-hk/cardano-api/pull/103)\\n- [New version `cardano-api-8.8.0.0`](https://github.com/input-output-hk/cardano-api/pull/102)\\n- [Add CastVerificationKeyRole StakePoolKey StakeKey instance](https://github.com/input-output-hk/cardano-api/pull/101)\\n- [Update ledger and consensus](https://github.com/input-output-hk/cardano-api/pull/99)\\n- [Rename `era` to `sbe` when type is `ShelleyBasedEra`](https://github.com/input-output-hk/cardano-api/pull/98)\\n\\n### cardano-node\\n\\n### cardano-testnet\\n\\n- [Fix Shutdown test for new exit codes](https://github.com/input-output-hk/cardano-node/pull/5391)\\n\\n### docs\\n\\n- [Fix markdown links](https://github.com/input-output-hk/cardano-node/pull/5387)\\n\\n### CI & project maintenance\\n\\n- [Apply `stylish-haskell` to project](https://github.com/input-output-hk/cardano-cli/pull/69)"},{"id":"2023-07-14-hydra","metadata":{"permalink":"/cardano-updates/2023-07-14-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-14-hydra.md","source":"@site/blog/2023-07-14-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-07-14T00:00:00.000Z","formattedDate":"July 14, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.79,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"},{"name":"Sasha Bogicevic","title":"Hydra Software Engineer","url":"https://github.com/v0d1ch","imageURL":"https://github.com/v0d1ch.png","key":"v0d1ch"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-07-14-hydra","authors":["ffakenz","v0d1ch"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-07-18-node-cli-api"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-07-13-mithril"}},"content":"## High-level summary\\n\\nThis week the team focused on exploring the event sourced persistence in order\\nto improve `hydra-node` performance. Because of this work the team noticed we\\nneed to refactor the emit snapshot emission logic and update the spec in the\\nlight of new changes. They also took the time to revisit their goals and product\\nplans for the next quarter as well as doing some security fixes related to\\nmultisignatures.\\n\\n## What did the team achieve this week\\n\\n- Finished spike about performance improvements of event sourced persistence [#963](https://github.com/input-output-hk/hydra/pull/963).\\n- Refactor snapshot emission in protocol logic.\\n- Revisited our roadmap and goals.\\n- Prepared and conducated a learning session on lean-waste.\\n- Improve security of multi-signature checks, see [this Github security advisory](https://github.com/input-output-hk/hydra/security/advisories/GHSA-c8qp-cv4h-vcc4).\\n- Implemented a cache friendly way to version our binaries [#962](https://github.com/input-output-hk/hydra/pull/962).\\n\\n## What are the goals of next week\\n\\n- Implement Event sourced persistence [#913](https://github.com/input-output-hk/hydra/pull/913).\\n- Remove deprecated internal commit [#954](https://github.com/input-output-hk/hydra/pull/954) and close [#728](https://github.com/input-output-hk/hydra/pull/728)."},{"id":"2023-07-13-mithril","metadata":{"permalink":"/cardano-updates/2023-07-13-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-13-mithril.md","source":"@site/blog/2023-07-13-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-07-13T00:00:00.000Z","formattedDate":"July 13, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.92,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-07-13-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-14-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-07-12-consensus"}},"content":"## High level overview\\nThe Mithril team created a new [`2327.0`](https://github.com/input-output-hk/mithril/releases/tag/2327.0) distribution. They focused on preparing the beta launch on the `mainnet`: they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the `mainnet` infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library. \\n\\nFinally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs.\\n\\n## Low level overview\\n- Released the new distribution [`2327.0`](https://github.com/input-output-hk/mithril/releases/tag/2327.0)\\n- Worked on the epic that prepares the Mithril infrastructure for `mainnet` [#767](https://github.com/input-output-hk/mithril/issues/767):\\n - Completed the issue `Add infrastructure monitoring` [#987](https://github.com/input-output-hk/mithril/issues/987)\\n - Worked on the issue `Deploy \'mainnet\' infrastructure` [#988](https://github.com/input-output-hk/mithril/issues/988)\\n - Worked on the issue `Handle Secrets management` [#989](https://github.com/input-output-hk/mithril/issues/989)\\n- Worked on the epic `Benchmark performances of Mithril Aggregator` [#904](https://github.com/input-output-hk/mithril/issues/904):\\n - Worked on the issue `Design & implement basic stress test tool for aggregator` [#991](https://github.com/input-output-hk/mithril/issues/991)\\n- Worked on optimizations:\\n - Completed the issue `Remove certificate hash from Artifact` [#932](https://github.com/input-output-hk/mithril/issues/932)\\n - Completed the issue `Check vulnerabilities in CI` [#1037](https://github.com/input-output-hk/mithril/issues/1037)\\n - Completed the issue `Add \'created_at\' in Mithril Stake Distribution messages` [#1030](https://github.com/input-output-hk/mithril/issues/1030)\\n - Completed the issue `Add a \'run-only\' option in end to end test` [#1048](https://github.com/input-output-hk/mithril/issues/1048)\\n- Worked on refactoring:\\n - Completed the issue `Factorize protocol crypto operations` [#669](https://github.com/input-output-hk/mithril/issues/669)\\n - Completed the issue `Refactor aggregator dependency injection and services` [#1058](https://github.com/input-output-hk/mithril/issues/1058)\\n - Completed the issue `Build static binaries in CI` [#874](https://github.com/input-output-hk/mithril/issues/874)\\n- Worked on documentation:\\n - Completed the issue `Prepare SPO on-boarding guide` [#1049](https://github.com/input-output-hk/mithril/issues/1049)\\n - Completed the issue `Add instructions to set firewall using iptables` [#1040](https://github.com/input-output-hk/mithril/issues/1040)\\n - Completed the issue `Update ufw command to set firewall on Mithril Signer installation instructions` [#1041](https://github.com/input-output-hk/mithril/issues/1041)\\n- Worked on bugs:\\n - Completed the issue `Aggregator does not detect certificate chain epoch gap` [#952](https://github.com/input-output-hk/mithril/issues/952)\\n - Completed the issue `\'testing-preview\' network does not create certificates` [#1015](https://github.com/input-output-hk/mithril/issues/1015)\\n - Completed the issue `SQLite compatibility in aggregator` [#837](https://github.com/input-output-hk/mithril/issues/837)\\n - Completed the issue `Q&A followup fixes` [#1035](https://github.com/input-output-hk/mithril/issues/1035)\\n - Completed the issue `E2E tests are flaky in CI` [#1023](https://github.com/input-output-hk/mithril/issues/1023)"},{"id":"2023-07-12-consensus","metadata":{"permalink":"/cardano-updates/2023-07-12-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-12-consensus.md","source":"@site/blog/2023-07-12-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-07-12T00:00:00.000Z","formattedDate":"July 12, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.59,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-07-12-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-07-13-mithril"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-07-12-performance-and-tracing"}},"content":"## High level summary\\n\\nThis week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a [proposed fix](https://github.com/input-output-hk/ouroboros-network/pull/4620). The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine.\\n\\nThe team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility.\\n\\nOn the support front, the team [drafted](https://github.com/input-output-hk/ouroboros-consensus/pull/200) an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load."},{"id":"2023-07-12-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-07-12-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-12-performance-and-tracing.md","source":"@site/blog/2023-07-12-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-07-12T00:00:00.000Z","formattedDate":"July 12, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.29,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-07-12-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-07-12-consensus"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-07-07-crypto"}},"content":"## High level summary\\n\\n* Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed.\\n* Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends.\\n* Tracing: Optimization of the new tracing system is ongoing and yielding good performance results.\\n* Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nOur analysis of the GHC9 build of `cardano-node` has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation. \\n \\nIn an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into `cardano-node`. This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle.\\n\\n### Infrastructure\\n\\nWe have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in `master`.\\n\\n### Tracing\\n\\nMuch effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance.\\n\\n### Nomad backend\\n\\nFor reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run. \\n\\nFurthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to `master`."},{"id":"2023-07-07-crypto","metadata":{"permalink":"/cardano-updates/2023-07-07-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-crypto.md","source":"@site/blog/2023-07-07-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-07-07T00:00:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":0.795,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-07-07-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-07-12-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-07-07-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Sidechains: First version of snark-based ATMS\\n* mithril: Full node verifier\\n* kes_agent: Keep progress, and prepare CIP and CPS\\n* CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP\\n\\n## Low level summary\\n### kes_agent\\n* KES Agent CIP/CSP. Preparing documents. Will become public in the future.\\n* KES Agent testsuite (https://github.com/input-output-hk/kes-agent/issues/14)\\n* RawBearer abstraction in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395)\\n* Maintaining required changes to cardano-base for KES Agent (https://github.com/input-output-hk/cardano-base/pull/317)\\n### Mithril\\n* Final review of the implementation of Full Node Verifier [#939](https://github.com/input-output-hk/mithril/pull/939).\\n Included benchmarks and further tests.\\n### Sidechains\\n* Schnorr signature implemented\\n* ATMS signature implemented\\n* First benchmarks show that for the committe size we expect, we need 2^21 constraints. \\n### CIPs and community\\n* Addressed some review comments in [#PR506](https://github.com/cardano-foundation/CIPs/pull/506)\\n* Worked with the communityt on [#PR524](https://github.com/cardano-foundation/CIPs/pull/524) to include Keccak as part of the next Plutus release."},{"id":"2023-07-07-goedel","metadata":{"permalink":"/cardano-updates/2023-07-07-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-goedel.md","source":"@site/blog/2023-07-07-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-07-07T00:00:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.42,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-07-07-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-07-07-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-07-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the teams have been working on finalising their ICE papers\\nfor publication in EPTCS, formalising concensus, and investigating chain\\nsync.\\n\\n## Details\\n\\n* Preparing final versions of ICE papers\\n\\n* Reviewing the chain sync design and documentation\\n\\n* Refactoring the thorn calculus\\n\\n* First draft of Praos specification\\n\\n* Developing bounding factors on timeouts"},{"id":"2023-07-07-hydra","metadata":{"permalink":"/cardano-updates/2023-07-07-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-hydra.md","source":"@site/blog/2023-07-07-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-07-07T00:00:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.865,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"},{"name":"Sasha Bogicevic","title":"Hydra Software Engineer","url":"https://github.com/v0d1ch","imageURL":"https://github.com/v0d1ch.png","key":"v0d1ch"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-07-07-hydra","authors":["ffakenz","v0d1ch"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-07-07-goedel"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-07-07-sre"}},"content":"## High-level summary\\n\\nThis week the Hydra team accomplished some nice progress. They secured the\\nnetwork layer further by implementing authentication of the messages between the\\npeers in the Head protocol. In the process they also managed to separate\\nHeartBeat messages from the protocol ones which somewhat improved the quality of\\ncode in Hydra. The team also finished work related to sending only transaction\\nids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark\\npublishing on the website.\\n\\n## What did the team achieve this week\\n\\n- [Implemented](https://github.com/input-output-hk/hydra/issues/727) authenticated messages\\n- [Implemented](https://github.com/input-output-hk/hydra/issues/728) send only transaction ids in ReqSn messages\\n- Separate [HeartBeat](https://github.com/input-output-hk/hydra/pull/969) messages from the core network protocol messages\\n- Publish multiple pre-defined [benchmarks](https://github.com/input-output-hk/hydra/pull/947)\\n- [Fixed](https://github.com/input-output-hk/hydra/pull/967) a smoke-test issue where funds would not be returned to the faucet\\n- Found a bug in the [off-chain signature\\n verification](https://github.com/input-output-hk/hydra-ghsa-c8qp-cv4h-vcc4/pull/1)\\n\\n## What are the goals of next week\\n\\n- Spike on performance improvements of event sourced persistence [#913](https://github.com/input-output-hk/hydra/issues/913)\\n- Add new endpoint for submitting client transactions\\n- Remove commit from internal wallet"},{"id":"2023-07-07-sre","metadata":{"permalink":"/cardano-updates/2023-07-07-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-sre.md","source":"@site/blog/2023-07-07-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-07-07T00:00:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":0.815,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-07-07-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-07-07-hydra"},"nextItem":{"title":"Developer Experience Update","permalink":"/cardano-updates/2023-07-06-developer-experience"}},"content":"## High level summary\\n\\nThe SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance.\\n\\nSome notable recent improvements include:\\n* Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment\\n* Explorer component updates\\n* Spongix caching server rewrite for R2 Cloudflare support and various performance improvements\\n\\n## Lower level summary\\n\\n### Cardano-node\\n* Nixos service update to enable non-systemd socket activation multi-node relays: [cardano-node-pull-5360](https://github.com/input-output-hk/cardano-node/pull/5360)\\n\\n### Cardano-ogmios\\n* Cardano ogmios bump to 5.6.0 for nixos service: [cardano-ogmios-pull-6](https://github.com/input-output-hk/cardano-ogmios/pull/6)\\n\\n### Cardano-ops\\n* Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: [cardano-ops-compare](https://github.com/input-output-hk/cardano-ops/compare/88a17c9...dfde751)\\n\\n### Cardano-rosetta\\n* Cardano-rosetta nixos modifications for rosetta 2.1.0 service: [cardano-rosetta-pull-532](https://github.com/cardano-foundation/cardano-rosetta/pull/532)\\n\\n### Cardano-world\\n* Cardano-node entrypoint improvements: [cardano-world-pull-99](https://github.com/input-output-hk/cardano-world/pull/99)\\n* Further automate pool performance SQL query: [cardano-world-pull-100](https://github.com/input-output-hk/cardano-world/pull/100)\\n* Performance and benchmark job related tweaks: [cardano-world-commit](https://github.com/input-output-hk/cardano-world/commit/02f1ba424d3e36bd114df6f53b769d2cd25301c3)\\n* Explorer related component version bumps and traefik definition handline: [cardano-world-pull-101](https://github.com/input-output-hk/cardano-world/pull/101)\\n\\n### Spongix\\n* Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: [spongix-simple-branch](https://github.com/input-output-hk/spongix/compare/afd77728f5823d61732425df52a363949096e163...4890ff93308f45584bea8443cc13fbc16c8ce911)"},{"id":"2023-07-06-developer-experience","metadata":{"permalink":"/cardano-updates/2023-07-06-developer-experience","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-06-developer-experience.md","source":"@site/blog/2023-07-06-developer-experience.md","title":"Developer Experience Update","description":"High level summary","date":"2023-07-06T00:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"devx","permalink":"/cardano-updates/tags/devx"}],"readingTime":1.145,"hasTruncateMarker":false,"authors":[{"name":"Moritz Angermann","title":"Head of Developer Experience","url":"https://github.com/angerman","imageURL":"https://github.com/angerman.png","key":"angerman"}],"frontMatter":{"title":"Developer Experience Update","slug":"2023-07-06-developer-experience","authors":"angerman","tags":["devx"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-07-07-sre"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-07-04-db-sync"}},"content":"## High level summary\\n\\nThe Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements.\\n\\n## Lower level summary\\n\\n### build support & maintainance\\n\\nThe DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions.\\n\\n### compiler upgrades\\n\\nCompatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We\'ve also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests.\\n\\n\\n### Hydra Tools\\nOur repository, [input-output-hk/actions](https://github.com/input-output-hk/hydra-tools), has seen quite some improvements to facility the hydra <-> github integration.\\n\\n\\n### haskell.nix\\n[Haskell.nix](https://github.com/input-output-hk/haskell.nix) has been maintained and updated with the addition of preliminary GHC 9.8 support.\\n\\n### devx\\n\\nThe [devx](https://github.com/input-output-hk/devx) repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our [actions/devx](https://github.com/input-output-hk/actions) GitHub Actions, we have a consistent set of tooling for\\n- nix develop shells\\n- GitHub CodeSpaces integration\\n- VSCode DevContainer support\\n- GitHub Actions integration\\n\\n### upstream tooling\\n\\nOur team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix."},{"id":"2023-07-04-db-sync","metadata":{"permalink":"/cardano-updates/2023-07-04-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-04-db-sync.md","source":"@site/blog/2023-07-04-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-07-04T00:00:00.000Z","formattedDate":"July 4, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.73,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-07-04-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Developer Experience Update","permalink":"/cardano-updates/2023-07-06-developer-experience"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-07-04-node-cli-api"}},"content":"## High level summary\\nWe\'ve made progress in all high level objectives\\n- CIP-1694 integration design\\n- UTxO-HD integration proof of concept\\n- schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested\\n- Many devx issues resolved\\n\\n## Lower level summary\\n- We have improved and validated the design for the Conway integration in db-sync\\n- Improved the initial integration of the UTxO-HD feauture branches which are under test\\n- Prepared a new release 13.1.1.3 which supports node 8.1.1\\n[#1455](https://github.com/input-output-hk/cardano-db-sync/pull/1455).\\n- This also fixes a bug\\n[#1451](https://github.com/input-output-hk/cardano-db-sync/issues/1451)\\n- Added new tests to the new tx_out options\\n[#1429](https://github.com/input-output-hk/cardano-db-sync/pull/1429)\\n- Fixed a chronic issue in db-sync related to exception handling and concurrency\\nThis fixes many other issues and simplifies the logic in db-sync\\n[#1447](https://github.com/input-output-hk/cardano-db-sync/pull/1447)\\n- A number of fixes and improvements in ci, docker, devx, docs\\n[#1436](https://github.com/input-output-hk/cardano-db-sync/pull/1436)\\n[#1442](https://github.com/input-output-hk/cardano-db-sync/pull/1442)\\n[#1448](https://github.com/input-output-hk/cardano-db-sync/pull/1448)\\n[#1452](https://github.com/input-output-hk/cardano-db-sync/pull/1452)"},{"id":"2023-07-04-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-07-04-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-04-node-cli-api.md","source":"@site/blog/2023-07-04-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-07-04T00:00:00.000Z","formattedDate":"July 4, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.495,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-07-04-node-cli-api","authors":"carlos","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-07-04-db-sync"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-30-hydra"}},"content":"# 2023-06-21 - 2023-07-04\\n\\n## High level summary\\n\\n- Started integration of conway era into the cardano-api,\\n- Pre-release of cardano-cli 8.2.1 which enables creating goveranance \\"Update constitution\\" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.\\n- Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities.\\n- Continue refactoring cardano-testnet\\n- CI and docs house keeping on the new cardnao-cli and cardano-api repositories\\n\\n\\n### cardano-cli\\n\\n- [Update to `cardano-api-8.7.0.0`](https://github.com/input-output-hk/cardano-cli/pull/60)\\n- [Release 8.2.1](https://github.com/input-output-hk/cardano-cli/pull/44)\\n- [Use new function-based API instead of using query data types directly](https://github.com/input-output-hk/cardano-cli/pull/39)\\n\\n### cardano-api\\n\\n- [Release cardano-api 8.7](https://github.com/input-output-hk/cardano-api/pull/94)\\n- [New version `cardano-api-8.6.0.0`](https://github.com/input-output-hk/cardano-api/pull/92)\\n- [New version `cardano-api-8.2.0.0.1.0.0`](https://github.com/input-output-hk/cardano-api/pull/90)\\n- [Backport: Add era phantom type parameter to Certificate](https://github.com/input-output-hk/cardano-api/pull/88)\\n- [Parameterise `Certificate` type with phantom `era` type argument](https://github.com/input-output-hk/cardano-api/pull/86)\\n- [Voting procedure and proposal procedure updates](https://github.com/input-output-hk/cardano-api/pull/85)\\n- [Parameterise `Certificate` with `era`](https://github.com/input-output-hk/cardano-api/pull/84)\\n- [Parameterise `Certificate` type with phantom `era` type argument](https://github.com/input-output-hk/cardano-api/pull/83)\\n- [Add contributing guide](https://github.com/input-output-hk/cardano-api/pull/79)\\n- [Unified `ShelleyBasedEra` constraint summoning](https://github.com/input-output-hk/cardano-api/pull/77)\\n- [Update CHaP index](https://github.com/input-output-hk/cardano-api/pull/70)\\n- [CIP-1694 API - Part 1](https://github.com/input-output-hk/cardano-api/pull/41)\\n\\n\\n### cardano-node\\n\\n- [cardano-node top level error handler](https://github.com/input-output-hk/cardano-node/pull/5356)\\n- [Turn on some traces by default](https://github.com/input-output-hk/cardano-node/pull/5353)\\n\\n### cardano-testnet\\n\\n- [Report payment address and UTxOs in testnets](https://github.com/input-output-hk/cardano-node/pull/5364)\\n- [New Conway `stake-snapshot` tests](https://github.com/input-output-hk/cardano-node/pull/5362)\\n\\n### docs\\n\\n- [Add contributing guide](https://github.com/input-output-hk/cardano-api/pull/79)\\n- [Release workflow description](https://github.com/input-output-hk/cardano-api/pull/33)\\n- [Turn on some traces by default](https://github.com/input-output-hk/cardano-node/pull/5353)\\n\\n\\n\\n### CI & project maintenance\\n\\n- [Add PR changelog check](https://github.com/input-output-hk/cardano-api/pull/75)\\n- [Fix stylish haskell in github action workflow](https://github.com/input-output-hk/cardano-api/pull/71)\\n- [Enable CI on PRs from forks](https://github.com/input-output-hk/cardano-api/pull/62)\\n- [Remove merge_group trigger from changelog check CI](https://github.com/input-output-hk/cardano-cli/pull/53)\\n- [Add PR changelog check. Add core-tech group to GHA description codeowners.](https://github.com/input-output-hk/cardano-cli/pull/46)\\n- [Fix stylish haskell in github action workflow](https://github.com/input-output-hk/cardano-cli/pull/41)\\n- [Enable CI in PRs from forks](https://github.com/input-output-hk/cardano-cli/pull/40)\\n- [Add contributing guide](https://github.com/input-output-hk/cardano-cli/pull/48)"},{"id":"2023-06-30-hydra","metadata":{"permalink":"/cardano-updates/2023-06-30-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-30-hydra.md","source":"@site/blog/2023-06-30-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-06-30T00:00:00.000Z","formattedDate":"June 30, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.925,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-06-30-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-07-04-node-cli-api"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-06-29-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team wrote and published the monthly report for June,\\nimplemented the end-to-end functionality for external commits, and tested it on\\nthe preview environment. They also listed Hydra as a tool on the Cardano\\ndeveloper portal, providing more visibility for the project. The team clarified\\nthe path forward for L2 protocol improvements and explored an alternative CI\\napproach using cabal instead of nix. Additionally, they released version 0.11.0,\\nmarking another milestone in the project’s development.\\n\\n## What did the team achieve this week\\n\\n- Written and published the monthly report for [June](https://hydra.family/head-protocol/monthly/2023-06)\\n- Implemented external commits end-to-end incl. tested it on preview [#215](https://github.com/input-output-hk/hydra/issues/215)\\n- Listed Hydra as a tool on cardano [developer portal](https://developers.cardano.org/tools/)\\n- Cleared up path forward on L2 protocol improvements [#728](https://github.com/input-output-hk/hydra/issues/728)\\n- Established an alternative CI using more cabal tools [#923](https://github.com/input-output-hk/hydra/pull/923)\\n- Release version [0.11.0](https://github.com/input-output-hk/hydra/releases/tag/0.10.0)\\n\\n## What are the goals of next week\\n\\n- Spike on performance improvements of event sourced persistence [#913](https://github.com/input-output-hk/hydra/issues/913)\\n- Complete ReqSn only sends transaction ids [#728](https://github.com/input-output-hk/hydra/issues/728)\\n- Groom and plan last items for 0.12.0 (remove internal commit)\\n- Improve reliability of benchmarks"},{"id":"2023-06-29-mithril","metadata":{"permalink":"/cardano-updates/2023-06-29-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-29-mithril.md","source":"@site/blog/2023-06-29-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-06-29T00:00:00.000Z","formattedDate":"June 29, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":2.205,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-06-29-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-30-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-06-28-consensus"}},"content":"## High level overview\\nThe Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano `mainnet` infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator.\\n\\nFinally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1.\\n\\n## Low level overview\\n- Worked on the epic that prepares the Mithril infrastructure for `mainnet` [#767](https://github.com/input-output-hk/mithril/issues/767):\\n - Worked on the issue `Add infrastructure monitoring` [#987](https://github.com/input-output-hk/mithril/issues/987)\\n- Completed the epic `Prepare Mithril Signer deployment model for SPO` [#862](https://github.com/input-output-hk/mithril/issues/862):\\n - Completed the issue `Design recommended deployment model for SPOs on \'mainnet\' and \'preview\'/\'preprod\'` [#961](https://github.com/input-output-hk/mithril/issues/961)\\n - Completed the issue `Adapt infrastructure to use Mithril Relay` [#1018](https://github.com/input-output-hk/mithril/issues/1018)\\n - Completed the issue `Announce the new signer deployment model in a dev blog post` [#1017](https://github.com/input-output-hk/mithril/issues/1017)\\n- Worked on the epic `Benchmark performances of Mithril Aggregator` [#904](https://github.com/input-output-hk/mithril/issues/904):\\n - Worked on the issue `Design & implement basic stress test tool for aggregator` [#991](https://github.com/input-output-hk/mithril/issues/991)\\n- Worked on bugs:\\n - Completed the issue `Aggregator does not exit on critical error` [#993](https://github.com/input-output-hk/mithril/issues/993)\\n - Completed the issue `Computation of master certificate of an epoch is incorrect` [#1006](https://github.com/input-output-hk/mithril/issues/1006)\\n - Completed the issue `End to end tests are flaky` [#954](https://github.com/input-output-hk/mithril/issues/954)\\n - Worked on the issue `\'testing-preview\' network does not create certificates` [#1015](https://github.com/input-output-hk/mithril/issues/1015)\\n- Worked on optimizations:\\n - Completed the issue `Dates format is not standardized` [#946](https://github.com/input-output-hk/mithril/issues/946)\\n - Completed the issue `Add \'recompute-certificates-hash\' command to aggregator` [#1001](https://github.com/input-output-hk/mithril/issues/1001)\\n - Completed the issue `Add a retry mechanism for artifact creation in aggregator` [#984](https://github.com/input-output-hk/mithril/issues/984)\\n - Completed the issue `Log node version at startup in Aggregator/Signer` [#944](https://github.com/input-output-hk/mithril/issues/944)\\n - Completed the issue `Reactivate Publish Results job in CI` [#978](https://github.com/input-output-hk/mithril/issues/978)\\n - Completed the issue `Clean \'pending_snapshot\' directory of aggregator` [#983](https://github.com/input-output-hk/mithril/issues/983)\\n - Completed the issue `Update OpenAPI spec examples` [#1000](https://github.com/input-output-hk/mithril/issues/1000)\\n- Worked on refactoring:\\n - Completed the issue `Refactor \'MithrilStakeDistribution\' entity` [#967](https://github.com/input-output-hk/mithril/issues/967)\\n - Completed the issue `Refactoring client` [#982](https://github.com/input-output-hk/mithril/issues/982)\\n - Completed the issue `Refactor download code in client` [#1010](https://github.com/input-output-hk/mithril/issues/1010)\\n - Worked on the issue `Factorize protocol crypto operations` [#669](https://github.com/input-output-hk/mithril/issues/669)\\n- Worked on dependencies:\\n - Completed the issue `Upgrade Cardano node to \'8.1.1\'` [#973](https://github.com/input-output-hk/mithril/issues/973)"},{"id":"2023-06-28-consensus","metadata":{"permalink":"/cardano-updates/2023-06-28-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-28-consensus.md","source":"@site/blog/2023-06-28-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-06-28T00:00:00.000Z","formattedDate":"June 28, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.85,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-06-28-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-06-29-mithril"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-06-28-performance-and-tracing"}},"content":"## High level summary\\n\\nDuring the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team. \\n\\nThe team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components.\\n\\nRegarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node. \\n\\n### Genesis\\n\\n- We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.\\n\\n- We [decided on an approach](https://github.com/input-output-hk/ouroboros-consensus/issues/101#issuecomment-1607767722) of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team.\\n\\n### UTxO-HD\\n\\n- We merged the last of the PRs that were part of UTxO-HD improvements for version [0.1](https://github.com/input-output-hk/ouroboros-consensus/issues/149): expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size.\\n- We [added](https://github.com/input-output-hk/ouroboros-consensus/pull/87) a new \\"legacy\\" cardano block in a new `ouroboros-consensus-cardano-legacy-block` package that should ease the transition for some downstream packages to UTxO-HD, like `db-sync`. This is really only useful for downstream packages that use the parts of consensus that don\'t involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block.\\n- We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this."},{"id":"2023-06-28-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-06-28-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-28-performance-and-tracing.md","source":"@site/blog/2023-06-28-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-06-28T00:00:00.000Z","formattedDate":"June 28, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.885,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-06-28-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-06-28-consensus"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-06-23-goedel"}},"content":"## High level summary\\n\\n* Benchmarking: We\'ve performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9.\\n* Infrastructure: The first batch of refactoring and documentation for our `tx-generator` has been merged to `master`.\\n* Tracing: We\'ve looked into an issue where the tracing system\'s concurrency could prevent a graceful node shutdown.\\n* Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nThe compiler switch to GHC9 as the default build platform for `cardano-node` and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9\'s significantly different inlining behaviour may produce those effects. We\'re currently locating the specific places in component code that have the most extensive effect in that regard. \\n \\nUsing the `forge-stress` approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node.\\n\\n### Infrastructure\\n\\nThe `tx-generator` is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to `master`. Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base.\\n\\n### Tracing\\n\\nThe tracing system\'s concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue.\\n\\n### Nomad backend\\n\\nWith the data gathered from running the new nomad cloud backend, we\'ve been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress.\\n\\nAdditionally, we\'re continuing the new backend\'s validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend."},{"id":"2023-06-23-goedel","metadata":{"permalink":"/cardano-updates/2023-06-23-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-goedel.md","source":"@site/blog/2023-06-23-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-06-23T00:00:00.000Z","formattedDate":"June 23, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.335,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-06-23-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-06-28-performance-and-tracing"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-23-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the teams presented two papers at ICE 2023.\\n\\n## Details\\n\\n* Presented two papers at ICE 2023: https://www.discotec.org/2023/ice\\n\\n* Analysing and implementing chain synchronization mini protocol\\n\\n* The team is hiring a performance engineering intern - https://apply.workable.com/io-global/j/BFEC5B0AFF/"},{"id":"2023-06-23-hydra","metadata":{"permalink":"/cardano-updates/2023-06-23-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-hydra.md","source":"@site/blog/2023-06-23-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-06-23T00:00:00.000Z","formattedDate":"June 23, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.79,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"},{"name":"Pascal Grange","title":"Hydra Software Engineer","url":"https://github.com/pgrange","imageURL":"https://github.com/pgrange.png","key":"pgrange"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-06-23-hydra","authors":["ffakenz","pgrange"],"tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-06-23-goedel"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-06-23-network"}},"content":"## High-level summary\\n\\nThis week, the Hydra team shared progress updates during the monthly review\\nmeeting (monthly report and video recording available soon) and started\\nexperimenting on preview network with the new commit from external wallet\\nfeature.\\n\\n## What did the team achieve this week\\n\\n- Monthly report & review meeting, demonstrating [commit from external\\n wallet](https://github.com/input-output-hk/hydra/pull/887)\\n- Published regular [benchmarks for\\n Hydra](https://hydra.family/head-protocol/unstable/benchmarks/end-to-end-benchmarks)\\n- Moved forward the journey for external commits using multiple script UTxOs\\n [#903](https://github.com/input-output-hk/hydra/pull/903)\\n- Changed the API to only put transaction id in snapshots, instead of the full\\n transactions [#922](https://github.com/input-output-hk/hydra/pull/922) -> this\\n is now evolved into fully addressing [#728](\\n https://github.com/input-output-hk/hydra/issues/728)\\n- Fuel marking is now optional as one can now commit from an external wallet\\n [#924](https://github.com/input-output-hk/hydra/pull/924)\\n- Add flag option to display node version on tui\\n [#934](https://github.com/input-output-hk/hydra/pull/934)\\n\\n## What are the goals of next week\\n\\n- Complete external commits using multiple script UTxOs [#903](https://github.com/input-output-hk/hydra/pull/903)\\n- New release 0.11.0\\n- Dirtroad solution of improved persistence performance [#913](https://github.com/input-output-hk/hydra/pull/913)"},{"id":"2023-06-23-network","metadata":{"permalink":"/cardano-updates/2023-06-23-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-network.md","source":"@site/blog/2023-06-23-network.md","title":"Network Team Update","description":"Network Update","date":"2023-06-23T00:00:00.000Z","formattedDate":"June 23, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.7,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-06-23-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-23-hydra"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-06-23-sre"}},"content":"## Network Update\\n\\n### Key contributions\\n\\nWe held a series of session to review the implementation of big ledger peers\\n(eclipse evasion). See [#4462].\\n\\nWe get a request from a 3rd party to clarify an inconsistency between CDDL spec\\nand protocol implementation. We worked out a nice solution which takes\\nadvantage of the `any` notion available in `CDDL`. On the Haskell side we\\nprovide `Any` type which gen generate almost any CBOR term (some are excluded\\nonly because they are not decoded back to the same form, and we relay on that\\nproperty). See [#4580].\\n\\nWe fixed a bunch of problems of the `cardano-cli ping` command. It also now has\\na limited support of `node-to-client` mini-protocol (the `-c` option is\\nignored, as it cannot be supported by `node-to-client` protocol). Note that\\nthe format of messages has changed, timestamps are printed in ISO8601 format.\\nSee [#4601], [#5326], [#5313], [#30]\\n\\nIn order to provide a new flag in the topology file which enables ledger peers\\nwhen the chain is close to the tip, we continued to work on [#4530]. This is\\ncurrently in review, the consensus team will need to provide us with the new\\napi. This feature is useful for two reasons: makes it easier to maintain\\na topology file, it will also limit the traffic on public roots generated by\\nfor example full node wallets and distribute it to ledger peers.\\n\\nWe also continued to work on a blog post which describes the journey of design\\n& implementation of the dynamic P2P network layer. Too be announced soon :). \\n\\n### Other smaller changes\\n\\nWe limit the concurrency of resolving dns names. Up to 8 root peers or ledger\\npeers DNS names are resolved concurrently, and at most 2 local root peer DNS\\nnames. See [#4596].\\n\\nWe fixed handshake query timeout in [#4603].\\n\\nWe renamed one of the block-fetch decision constructors as requested by the\\nconsensus team, see [#4608].\\n\\n[#30]: https://github.com/input-output-hk/cardano-cli/pull/30\\n[#4462]: https://github.com/input-output-hk/ouroboros-network/pull/4462\\n[#4580]: https://github.com/input-output-hk/ouroboros-network/pull/4580\\n[#4596]: https://github.com/input-output-hk/ouroboros-network/pull/4596\\n[#4598]: https://github.com/input-output-hk/ouroboros-network/issues/4598\\n[#4601]: https://github.com/input-output-hk/ouroboros-network/pull/4601\\n[#5313]: https://github.com/input-output-hk/cardano-node/pull/5313\\n[#5326]: https://github.com/input-output-hk/cardano-node/pull/5326\\n[#4603]: https://github.com/input-output-hk/ouroboros-network/pull/4603\\n[#4530]: https://github.com/input-output-hk/ouroboros-network/issues/4530\\n[#4608]: https://github.com/input-output-hk/ouroboros-network/pull/4608"},{"id":"2023-06-23-sre","metadata":{"permalink":"/cardano-updates/2023-06-23-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-sre.md","source":"@site/blog/2023-06-23-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-06-23T00:00:00.000Z","formattedDate":"June 23, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":0.98,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-06-23-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-06-23-network"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-16-hydra"}},"content":"## High level summary\\n\\nThe SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:\\n* A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality\\n* Cardano Sanchonet environment was stood up to test Conway era functionality\\n* Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case\\n* Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments\\n\\n## Lower level summary\\n\\n### Cardano-node\\n\\n- Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: [cardano-node-pull-5318](https://github.com/input-output-hk/cardano-node/pull/5318)\\n\\n### Cardano-ops\\n\\n- Updates required for node 8.1.1 nixos service: [cardano-ops-pull-414](https://github.com/input-output-hk/cardano-ops/pull/414)\\n- Work in progress continues on mixed legacy and p2p topology clusters in cardano-ops: [cardano-ops-ops-local](https://github.com/input-output-hk/cardano-ops/tree/ops-local), [cardano-ops-mn-mixed-p2p](https://github.com/input-output-hk/cardano-ops/tree/mn-mixed-p2p)\\n\\n### Cardano-world\\n\\n- Add Sanchonet environment: [cardano-world-pull-96](https://github.com/input-output-hk/cardano-world/pull/96)\\n\\n### Ci-ops\\n\\n- Add devx-ci cluster integration for legacy darwin [ci-ops-compare](https://github.com/input-output-hk/ci-ops/compare/b158b17...ed875b9)\\n\\n### Ci-world\\n\\n- Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: [ci-world-compare](https://github.com/input-output-hk/ci-world/compare/840cdb6...b08c250)\\n\\n### Devx-ci\\n\\n- A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: [devx-ci-repo](https://github.com/input-output-hk/devx-ci)\\n\\n### Iohk-nix\\n\\n- Add Sanchonet environment: [iohk-nix-pull-545](https://github.com/input-output-hk/iohk-nix/pull/545)"},{"id":"2023-06-16-hydra","metadata":{"permalink":"/cardano-updates/2023-06-16-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-16-hydra.md","source":"@site/blog/2023-06-16-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-06-16T00:00:00.000Z","formattedDate":"June 16, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.815,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-06-16-hydra","authors":"ffakenz","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-06-23-sre"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-06-15-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team focused their efforts on continuing to investigate and\\nexperiment operating a head on mainnet. They collected several bugs and issues\\nand worked on fixing them. Now the team is soon to release a new version,\\n0.11.0, which comes with a lot of improvements and bug fixes.\\n\\n\\n## What did the team achieve this week\\n\\n- Restored and fixed a bug which stalled our head on mainnet [#927](https://github.com/input-output-hk/hydra/issues/927)\\n- Solved one user issue [#914](https://github.com/input-output-hk/hydra/issues/914)\\n- Reduced significantly local state size and logs by removing the full scripts from it [#928](https://github.com/input-output-hk/hydra/pull/928)\\n- (pending review) Reduced snapshot size in the API, by only including tx ids [#922](https://github.com/input-output-hk/hydra/pull/922)\\n\\n## What are the goals of next week\\n\\n- New release 0.11.0\\n- Monthly report & review meeting.\\n- Fix some minor bugs discovered when operating our head on mainnet\\n- Complete journey for external commits using multiple script UTxOs [#903](https://github.com/input-output-hk/hydra/pull/903)\\n- Publish benchmarks and provide regular benchmarks for Hydra [#186](https://github.com/input-output-hk/hydra/issues/186)"},{"id":"2023-06-15-mithril","metadata":{"permalink":"/cardano-updates/2023-06-15-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-15-mithril.md","source":"@site/blog/2023-06-15-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-06-15T00:00:00.000Z","formattedDate":"June 15, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.795,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-06-15-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-16-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-06-14-consensus"}},"content":"## High level overview\\nThe Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client\u2019s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet.\\n\\nFinally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI.\\n\\n## Low level overview\\n- Completed on the epic that designs and implements generic signing/verification of entity services [#780](https://github.com/input-output-hk/mithril/issues/780):\\n - Completed the issue `Create the sub-command for \'Mithril Stake Distribution\' in client` [#896](https://github.com/input-output-hk/mithril/issues/896)\\n - Completed the issue `Adapt end to end tests to handle new types of data` [#899](https://github.com/input-output-hk/mithril/issues/899)\\n - Completed the issue `Update client documentation` [#897](https://github.com/input-output-hk/mithril/issues/897)\\n - Completed the issue `Update architecture documentations for new types of data` [#898](https://github.com/input-output-hk/mithril/issues/898)\\n - Completed the issue `Refactoring client` [#960](https://github.com/input-output-hk/mithril/issues/960)\\n- Worked on the epic that prepares the Mithril infrastructure for `mainnet` [#767](https://github.com/input-output-hk/mithril/issues/767):\\n - Completed the issue `Enhance terraform infrastructure` [#930](https://github.com/input-output-hk/mithril/issues/930)\\n- Completed the epic that implements the computation of the stake distribution for `mainnet` [#880](https://github.com/input-output-hk/mithril/issues/880):\\n - Completed the issue `Check performance impact of new stake distribution command on the \'mainnet\'` [#962](https://github.com/input-output-hk/mithril/issues/962)\\n- Worked on the epic `Prepare Mithril Signer deployment model for SPO` [#862](https://github.com/input-output-hk/mithril/issues/862):\\n - Worked on the issue `Design recommended deployment model for SPOs on \'mainnet\' and \'preview\'/\'preprod\'` [#961](https://github.com/input-output-hk/mithril/issues/961)\\n- Worked on bugs and optimizations:\\n - Completed the issue `Aggregator does not always detect new immutable file` [#953](https://github.com/input-output-hk/mithril/issues/953)\\n - Completed the issue `CI tests fail with Rust \'1.70.0\'` [#958](https://github.com/input-output-hk/mithril/issues/958)\\n - Worked on the issue `End to end tests are flaky` [#954](https://github.com/input-output-hk/mithril/issues/954)\\n - Worked on the issue `Certificate dates in metadata are not on the same timezone` [#946](https://github.com/input-output-hk/mithril/issues/946)\\n - Worked on the issue `Refactor \'MithrilStakeDistribution\' entity` [#967](https://github.com/input-output-hk/mithril/issues/967)\\n - Completed the issue `Fix \'Mithril Client multi-platform test\' with new client interface` [#956](https://github.com/input-output-hk/mithril/issues/956)\\n - Completed the issue `Enhance \'ImmutableDigesterError::NotEnoughImmutable\' error` [#969](https://github.com/input-output-hk/mithril/issues/969)\\n - Completed the issue `Client \'snapshot download\' command fails with option \'--download-dir\'` [#979](https://github.com/input-output-hk/mithril/issues/979)"},{"id":"2023-06-14-consensus","metadata":{"permalink":"/cardano-updates/2023-06-14-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-14-consensus.md","source":"@site/blog/2023-06-14-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-06-14T00:00:00.000Z","formattedDate":"June 14, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.115,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-06-14-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-06-15-mithril"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-06-14-performance-and-tracing"}},"content":"## High level summary\\n\\nThe Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the `Byron` and `TPraos` eras do not need to be checkpointed for an MVP.\\nThere is one remaining question (which applies also to the `Praos` era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated \\"Limit on Patience\\" timeout sufficiently bounds how long the adversary can inflate a victim\'s overall sync time.\\n\\nOn the UTxO-HD front, the prototype branch was rebased on top of the latest `ouroboros-consensus` `main` branch and integrated on top of `cardano-node 8.1.1-pre`. As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD.\\nWe managed to run a node again with UTxO-HD enabled. \\nWe also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for `cardano-node`, which uncovered a performance regression on the Network component when using `GHC-9.2/9.4`. This is being addressed.\\n\\nRegarding our support activities, we Released `fs-sim-0.2.0.0` and are in the process of preparing the 8.2 release of `cardano-node`. We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests."},{"id":"2023-06-14-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-06-14-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-14-performance-and-tracing.md","source":"@site/blog/2023-06-14-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-06-14T00:00:00.000Z","formattedDate":"June 14, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.515,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-06-14-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-06-14-consensus"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-06-12-network"}},"content":"## High level summary\\n\\n* Benchmarking: We\'ve continued release benchmarking and established a new baseline for `8.0.0`.\\n* New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined.\\n* Nomad backend: The healthcheck system for the the nomad cloud has been completed. We\'ve performed the first full runs on the new backend.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nIn our release benchmarking cycle, we established a new performance baseline for `8.0.0`. Additionally, we\'ve measured\\nperformance under various workloads for `8.1.1-pre`; the results look promising and validate the optimization efforts\\ndone on several system components. \\n \\nIn the meantime, we\'ve finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for\\nbenchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper.\\n\\n\\n### Tracing\\n\\nThe legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be\\nmeaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific\\ntrace messages are closely aligned. We\'ve found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles. \\n\\nAdditionally, we\'ve had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD.\\n\\n\\n### Nomad backend\\n\\nAs the new backend\'s healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we\'ve performed our first 52-node cluster runs on nomad cloud. We\'re currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs. \\n\\nThis means the backend is entering validation phase, where we systematically compare all metrics taken from the new\\ninfrastructure to the existing ones, including determining reproducibility and variance."},{"id":"2023-06-12-network","metadata":{"permalink":"/cardano-updates/2023-06-12-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-12-network.md","source":"@site/blog/2023-06-12-network.md","title":"Network Team Update","description":"Network Update","date":"2023-06-12T00:00:00.000Z","formattedDate":"June 12, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":2.205,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-06-12-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-06-14-performance-and-tracing"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-06-09-crypto"}},"content":"## Network Update\\n\\n### Key contributions and advances\\n\\nWe merged `light peer sharing` feature, which allows to include inbound peers\\ninto outbound governor known peers. This is the primary way for new\\nunregistered nodes to enter the network, which then can be shared using peer\\nsharing. Note that peer sharing is an experimental feature which is disabled\\nuntil genesis & eclipse evasion as fully implemented. See [#3596].\\n\\nWe are making progress reviewing eclipse evasion, [#3886].\\n\\nWe fixed another bug in local root peers. We found out that if the local roots\\nwhere ignored until the first domain name was resolved, see [#4583]. The bug\\nfix was backported and released in `ouroboros-network-0.8.1.1`.\\n\\nWe re-started working on dynamically enabling block forging to address issue\\n[#3159], which will enable us to release `P2P` on block producing nodes. See [#140].\\n\\n#### New `cardano-ping` / `cardano-cli ping` release\\n\\nWe prepared a new release of `cardano-ping` library which supports the new\\nquery feature (query supported versions). See [#4589], [#4593] and [#5313].\\nThe new version of `cardano-cli ping` will use `ISO8601` formatted\\ntimestamps; also the formatting of ping results is slightly improved, and it\\nwill introduce the new `--query-versions` (`-Q`) switch. If the remote site\\nsupports the query parameter, the command will print:\\n```\\nredacted-ip:port network rtt: 0.064\\nredacted-ip:port handshake rtt: 0.064010896s\\nredacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat\\norAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]\\n```\\notherwise it will print the negotiation results\\n```\\nredacted-ip:port network rtt: 0.045\\nredacted-ip:port handshake rtt: 0.101867615s\\nredacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder\\n```\\nNote that in that case `cardano-cli ping` offers `InitiatorAndResponder`, which\\nallows us to detect whether the remote side is an `InitiatorOnly` or\\n`InitiatorAndResponder`. Also `cardano-cli ping` will no longer announce\\nitself as `InitiatorAndResponder`, except for the case mentioned above.\\n\\n### Other smaller contributions\\n\\nOn a request from the Marlow Team, we published haddocks of `typed-protocols`,\\nwhich are now available [here][typed-protocols-haddocks] ([#40], [#41]).\\n\\nWe made a new release of `strict-stm-1.1.0.1` on Hackage, which fixed a bug in\\npackage description file, [#101] .\\n\\nWe also helped to debug a deadlock when using named pipes on Windows in the new\\n`RawBearer` API. The API is being used to store secret keys only in memory.\\nThe PR [#4395] is under review.\\n\\nWe also have two more PRs which are under review:\\n\\n* [#4530]: enabling ledger peers on a fixed number of slots before the tip of the chain;\\n* [#4580]: a PR which fixes inconsistencies in one of our cddl specs.\\n\\n[typed-protocols-haddocks]: https://input-output-hk.github.io/typed-protocols/\\n\\n[#40]: https://github.com/input-output-hk/typed-protocols/pull/40\\n[#41]: https://github.com/input-output-hk/typed-protocols/pull/41\\n[#101]: https://github.com/input-output-hk/io-sim/pull/101\\n[#140]: https://github.com/input-output-hk/ouroboros-consensus/pull/140\\n[#3159]: https://github.com/input-output-hk/ouroboros-network/issues/3159\\n[#3596]: https://github.com/input-output-hk/ouroboros-network/issues/3596\\n[#3886]: https://github.com/input-output-hk/ouroboros-network/issues/3886\\n[#4395]: https://github.com/input-output-hk/ouroboros-network/pull/4395\\n[#4530]: https://github.com/input-output-hk/ouroboros-network/issues/4530\\n[#4580]: https://github.com/input-output-hk/ouroboros-network/issues/4580\\n[#4583]: https://github.com/input-output-hk/ouroboros-network/issues/4583\\n[#4589]: https://github.com/input-output-hk/ouroboros-network/pull/4589\\n[#4593]: https://github.com/input-output-hk/ouroboros-network/pull/4593\\n[#5313]: https://github.com/input-output-hk/cardano-node/pull/5313"},{"id":"2023-06-09-crypto","metadata":{"permalink":"/cardano-updates/2023-06-09-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-crypto.md","source":"@site/blog/2023-06-09-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-06-09T00:00:00.000Z","formattedDate":"June 9, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":0.705,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-06-09-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-06-12-network"},"nextItem":{"title":"Developer Experience Update","permalink":"/cardano-updates/2023-06-09-developer-experience"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* cardano-base: E2E tests for BLS bindings and KES agent \\n* Sidechains: Implement ECC chip and Rescue hash primitives for ATMS\\n* mithril: Full node verifier\\n\\n## Low level summary\\n### cardano-base\\n* RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); blocked due to issue with windows\' localSnocket. Trying to resolve.\\n* Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors [#317](https://github.com/input-output-hk/cardano-base/pull/317).\\n* Above, blocked by the simplification of typeclasses [#404](https://github.com/input-output-hk/cardano-base/pull/404).\\n* Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings\\n### Mithril\\n* Implementation of Full Node Verifier [#939](https://github.com/input-output-hk/mithril/pull/939)\\n### Sidechains\\n* [ECC chip](https://github.com/input-output-hk/sidechains-zk/tree/master/prover/src/ecc) implemented for JubJub over BLS12-381\\n* [Rescue chip](https://github.com/input-output-hk/sidechains-zk/tree/master/prover/src/rescue) implemented for hashing.\\n* Currently working on Schnorr signature (which uses the above constraints)"},{"id":"2023-06-09-developer-experience","metadata":{"permalink":"/cardano-updates/2023-06-09-developer-experience","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-developer-experience.md","source":"@site/blog/2023-06-09-developer-experience.md","title":"Developer Experience Update","description":"High level summary","date":"2023-06-09T00:00:00.000Z","formattedDate":"June 9, 2023","tags":[{"label":"devx","permalink":"/cardano-updates/tags/devx"}],"readingTime":2.035,"hasTruncateMarker":false,"authors":[{"name":"Moritz Angermann","title":"Head of Developer Experience","url":"https://github.com/angerman","imageURL":"https://github.com/angerman.png","key":"angerman"}],"frontMatter":{"title":"Developer Experience Update","slug":"2023-06-09-developer-experience","authors":"angerman","tags":["devx"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-06-09-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-09-hydra"}},"content":"## High level summary\\n\\nThe Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements.\\n\\n## Lower level summary\\n\\n### build support & maintainance\\n\\nOur DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure `LoadDLL` errors to `blst` integration across Nix and Github CI. We\'ve also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like [cardano-base](https://github.com/input-output-hk/cardano-base) experiencing significant reductions in CI complexity.\\n\\n### compiler upgrades\\nAfter the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we\'re prioritizing compaining even stronger for better backwards compatibility.\\n\\n### CHaP (cardano-haskell-packages)\\nWe relocated the underlying tooling, ([foliage](https://github.com/input-output-hk/foliage)), for [CHaP](https://github.com/input-output-hk/cardano-haskell-packages) into the IOG organization. Furthermore, we have introduced [improved tooling to quickly add constraints to packages](https://github.com/input-output-hk/cardano-haskell-packages/pull/260), [better error reporting for add-revision](https://github.com/input-output-hk/cardano-haskell-packages/issues/285) and [better hackage url compatibility](https://github.com/input-output-hk/foliage/pull/63) to facilitate easer usage of CHaP.\\n\\n### GitHub Actions\\nOur repository, [input-output-hk/actions](https://github.com/input-output-hk/actions), now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the `base` and `haskell` install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking `cabal`.\\n\\n\\n### iohk-nix\\nThe [iohk-nix](https://github.com/input-output-hk/iohk-nix) repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, `sodium`, `blst`, and `secp256k1`, are also fixed to certain revisions within the `iohk-nix` repository.\\n\\n### haskell.nix\\n[Haskell.nix](https://github.com/input-output-hk/haskell.nix) has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to `gmp`.\\n\\n\\n### devx\\n\\nThe relatively new [devx](https://github.com/input-output-hk/devx) repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The `devx` repository\'s readme has been updated to reflect its purpose and usage guidelines.\\n\\n### upstream tooling\\n\\nOur team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix."},{"id":"2023-06-09-hydra","metadata":{"permalink":"/cardano-updates/2023-06-09-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-hydra.md","source":"@site/blog/2023-06-09-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-06-09T00:00:00.000Z","formattedDate":"June 9, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.18,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-06-09-hydra","authors":"ffakenz","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Developer Experience Update","permalink":"/cardano-updates/2023-06-09-developer-experience"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-06-08-db-sync"}},"content":"## High-level summary\\n\\nThis week, the Hydra team worked on multiple fronts. They finished the\\ninvestigation about the broken head on mainnet and re-opened their persistent\\nhead instance. The team also fixed the monthly report publication on their\\nwebsite and started sketching ideas and further improvements. Also, they are on\\nthe last mile to deliver a new feature which will allow parties to commit funds\\nfrom extern wallets. Finally the team started to work on optimizing the\\nperformance on their benchmarks.\\n\\n## What did the team achieve this week\\n\\n- Finished investigation on broken head on mainnet [#897](https://github.com/input-output-hk/hydra/issues/897) and re-opened it.\\n- Added support for externally committing regular utxo [#887](https://github.com/input-output-hk/hydra/pull/887)\\n- Fix monthly report publication on docs website and published the [monthly report](https://hydra.family/head-protocol/monthly/2023-05). Odd problems when publishing monthly report:\\n + Make us think about if we should change something about the website [#908](https://github.com/input-output-hk/hydra/issues/908)\\n + Open issue to docusaurus [#9036](https://github.com/facebook/docusaurus/issues/9036)\\n- Fixed a bug in the benchmark process [#910](https://github.com/input-output-hk/hydra/pull/910)\\n- Explored performance of the `hydra-node`{.verbatim} and identified a\\n bottleneck.\\n- Timed transaction feature is being used by the auction project \ud83c\udf89 \\n\\n## What are the goals of next week\\n\\n- Complete performance analysis and start/plan improvements and provide\\n regular benchmarks for Hydra [#186](https://github.com/input-output-hk/hydra/issues/186)\\n- Add hydra as tool to developer platform [#872](https://github.com/input-output-hk/hydra/issues/872).\\n- Authenticate network messages [#727](https://github.com/input-output-hk/hydra/issues/727).\\n- Complete journey for external commits using multiple script UTxOs [#903](https://github.com/input-output-hk/hydra/pull/903)\\n- Start implementing _Option B_ for external commits [#215](https://github.com/input-output-hk/hydra/issues/215)."},{"id":"2023-06-08-db-sync","metadata":{"permalink":"/cardano-updates/2023-06-08-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-db-sync.md","source":"@site/blog/2023-06-08-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-06-08T00:00:00.000Z","formattedDate":"June 8, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.745,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-06-08-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-09-hydra"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-06-08-goedel"}},"content":"## High level summary\\nWe\'ve made progress in all high level objectives\\n- CIP-1694 integration design\\n- UTxO-HD integration proof of concept\\n- schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2\\n- A new hire will help us with devx issues.\\n\\n## Lower level summary\\n- We have an initial design for the Conway integration in db-sync\\n- The initial UTxO-HD integration resulted in a requested feuture that\\nthe consensus team is working on\\n[#88](https://github.com/input-output-hk/ouroboros-consensus/issues/88).\\n- Added two optional migrations that speed up querying UTxO\\n[#1416](https://github.com/input-output-hk/cardano-db-sync/pull/1416)\\n- Work on improving the above feauture by adding tests and fixing tech debt\\n[#1429](https://github.com/input-output-hk/cardano-db-sync/pull/1429)\\n[#1419](https://github.com/input-output-hk/cardano-db-sync/pull/1419)\\n- Fixed issue with ada_pots being wrong\\nhttps://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/1ad4521a5601e8e98dc06bba2826d6b2f9b4fcf4\\n- Added a process which fixes in place scripts with wrong CBOR serialisation.\\nhttps://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/8792f72e2485b320de26c02dacc4d504d377ba17\\n- Prepared a tag [`13.1.1.2`](https://github.com/input-output-hk/cardano-db-sync/releases)\\nwhich is tested and ready to release. It contains many of the above."},{"id":"2023-06-08-goedel","metadata":{"permalink":"/cardano-updates/2023-06-08-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-goedel.md","source":"@site/blog/2023-06-08-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-06-08T00:00:00.000Z","formattedDate":"June 8, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.605,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-06-08-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-06-08-db-sync"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-06-08-sre"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has been working on giving and preparing public\\ntalks, also on preparing final versions of their ICE 2023 papers, and\\non analysing chain selection.\\n\\nThis sprint the team has been working on final revisions for the\\npre-proceedings versions of two ICE 2023 papers.\\n\\n## Details\\n\\n* Lambda Days keynote by Kevin Hammond:\\n https://www.lambdadays.org/lambdadays2023\\n\\n* Codebeam keynote by Peter Van Roy: https://www.youtube.com/watch?v=h8sE3Ai8Dsk; https://www.youtube.com/watch?v=h8sE3Ai8Dsk\\n\\n* Preparing talks and final versions for two ICE 2023 contributions:\\n https://www.discotec.org/2023/ice\\n\\n* Analysing chain selection.\\n\\n* The team is hiring a performance engineering intern - https://apply.workable.com/io-global/j/BFEC5B0AFF/"},{"id":"2023-06-08-sre","metadata":{"permalink":"/cardano-updates/2023-06-08-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-sre.md","source":"@site/blog/2023-06-08-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-06-08T00:00:00.000Z","formattedDate":"June 8, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":1.795,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-06-08-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-06-08-goedel"},"nextItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2023-06-08-system-test"}},"content":"## High level summary\\n\\nThe SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer.\\n\\n## Lower level summary\\n\\n### Bitte\\n\\n- Equinix bare metal capability was added to bitte: [bitte-pull-194](https://github.com/input-output-hk/bitte/pull/194)\\n- Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: [bitte-pull-201](https://github.com/input-output-hk/bitte/pull/201)\\n\\n### Bitte-cells\\n\\n- Improvements made for patroni cluster recovery of large databases: [bitte-cells-branch](https://github.com/input-output-hk/bitte-cells/compare/main...patroni-flex)\\n\\n### Cardano-graphql\\n\\n- Update cardano-graphql and nixos service: [cardano-graphql-pull-815](https://github.com/input-output-hk/cardano-graphql/pull/815)\\n\\n### Cardano-node\\n\\n- Update cardano-node to use the updated iohk-nix environments: [cardano-node-pull-5241](https://github.com/input-output-hk/cardano-node/pull/5241)\\n\\n### Cardano-ops\\n\\n- Update cardano-graphql, adds monitoring improvements and misc bug fixes: [cardano-ops-pull-411](https://github.com/input-output-hk/cardano-ops/pull/411)\\n- Work in progress on mixed legacy and p2p topology clusters in cardano-ops: [cardano-ops-branch](https://github.com/input-output-hk/cardano-ops/compare/master...ops-local)\\n\\n### Cardano-world\\n\\n- Add a declarative cardano-faucet dashboard: [cardano-world-commit](https://github.com/input-output-hk/cardano-world/commit/e7d40d34aff52bbeb309f87939bd0d40f585e60a)\\n- Remove a requirement for root user in Nomad docker images: [cardano-world-pull-68](https://github.com/input-output-hk/cardano-world/pull/68)\\n- Enable explorer in cardano-world for high IOPS metal access: [cardano-world-pull-69](https://github.com/input-output-hk/cardano-world/pull/69)\\n- Migrate explorer cluster to cardano-world: [cardano-world-pull-75](https://github.com/input-output-hk/cardano-world/pull/75)\\n- Migrate testnet metadata server to cardano-world, cleanup envs: [cardano-world-pull-77](https://github.com/input-output-hk/cardano-world/pull/77)\\n- Add a faucet restore delegation script to cardano-world for non-functioning delegated pools: [cardano-world-pull-79](https://github.com/input-output-hk/cardano-world/pull/79)\\n- Integrate node 8.x into cardano-world: [cardano-world-pull-84](https://github.com/input-output-hk/cardano-world/pull/84)\\n- Update cardano-world to use iohk-nix for node environments: [cardano-world-pull-87](https://github.com/input-output-hk/cardano-world/pull/87)\\n- Create a stakepool analysis query for cluster pool performance overview: [cardano-world-commit](https://github.com/input-output-hk/cardano-world/commit/64fe3b9d4067c24eef028ac1c561d6f9a7d5a9a8)\\n- Added an iptables fixup script for broken bridged networking nomad jobs: [cardano-world-commit](https://github.com/input-output-hk/cardano-world/commit/02550206e4e34d121135794b6e54084635e55a50)\\n- Improve cardano-world job automation with additional parameterization: [cardano-world-pr-92](https://github.com/input-output-hk/cardano-world/pull/92)\\n- Update preview network experimental config defaults: [cardano-world-pr-93](https://github.com/input-output-hk/cardano-world/pull/93)\\n\\n### Ci-ops\\n\\n- Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: [ci-ops-pull-108](https://github.com/input-output-hk/ci-ops/pull/108)\\n\\n### Ci-world\\n\\n- Resolve ci-world linux buildkite agent cleanup bug: [ci-world-commit](https://github.com/input-output-hk/ci-world/commit/3d053b202a6e40fab23db49801de7d6e580fab1f)\\n- Integrate new darwin builders into ci-world: [ci-world-pull-22](https://github.com/input-output-hk/ci-world/pull/22)\\n- Migrate patroni HA db to it\'s own namespace in ci-world: [ci-world-pull-24](https://github.com/input-output-hk/ci-world/pull/24)\\n\\n### Cicero\\n\\n- Implement a cicero webhook backoff with exponential decay plus jitter: [cicero-pull-79](https://github.com/input-output-hk/cicero/pull/79)\\n\\n### Iohk-nix\\n\\n- Update iohk-nix to be source of truth for node environments: [iohk-nix-pull-534](https://github.com/input-output-hk/iohk-nix/pull/534)\\n- Update preview network experimental config defaults: [iohk-nix-pull-544](https://github.com/input-output-hk/iohk-nix/pull/544)\\n\\n### Openziti\\n\\n- Add darwin intel and arm support to ziti-edge-tunnel nix modules: [openziti-bins-pull-1](https://github.com/johnalotoski/openziti-bins/pull/1)"},{"id":"2023-06-08-system-test","metadata":{"permalink":"/cardano-updates/2023-06-08-system-test","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-system-test.md","source":"@site/blog/2023-06-08-system-test.md","title":"System Test Team Update","description":"High level summary","date":"2023-06-08T00:00:00.000Z","formattedDate":"June 8, 2023","tags":[{"label":"system-test","permalink":"/cardano-updates/tags/system-test"}],"readingTime":1.005,"hasTruncateMarker":false,"authors":[{"name":"Martin Kourim","title":"System Test Engineer","url":"https://github.com/mkoura","imageURL":"https://github.com/mkoura.png","key":"mkoura"}],"frontMatter":{"title":"System Test Team Update","slug":"2023-06-08-system-test","authors":"mkoura","tags":["system-test"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-06-08-sre"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-06-07-node-cli-api"}},"content":"## High level summary\\nSince the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the _1.35.7_ and _8.0.0_ releases.\\n\\n## Workstreams\\n\\n[Full list of closed PRs](https://github.com/input-output-hk/cardano-node-tests/pulls?page=1&q=is%3Apr+is%3Aclosed+updated%3A2023-03-26..2023-06-08)\\n\\n### Framework improvements:\\n- Make cardano-submit-api REST API service available and run corresponding regression tests by default\\n- Update cabal build testing for 8.0.0\\n- Add support for testing governance SPO poll\\n- Use Poetry for Python dependency management\\n- Check status of known GH issues during tests runtime and finish the test accordingly\\n- Generate topology files with both IP addresses and DNS names\\n- Log issues like failure to start a cluster instance and report errors during tests runtime\\n\\n### Testing improvements\\n- Add rollback testing:\\n 1. global consensus is reached after rollback, in situation where less than `securityParam` blocks were produced since cluster split\\n 1. global consensus is not reached when more than `securityParam` blocks were produced, and the result is permanent fork\\n- Add tests to governance SPO poll commands\\n\\n### Node:\\n- tested the [1.35.7](https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_7.html) release\\n- tested the [8.0.0](https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_8_0_0.html) release\\n\\n### DB-Sync:\\n- improvements in db-sync sync tests\\n- improvements in db-sync functional tests"},{"id":"2023-06-07-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-06-07-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-07-node-cli-api.md","source":"@site/blog/2023-06-07-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-06-07T00:00:00.000Z","formattedDate":"June 7, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.37,"hasTruncateMarker":false,"authors":[{"name":"Carlos LopezDeLara","title":"Node Product Owner","url":"https://github.com/CarlosLopezDeLara","imageURL":"https://github.com/CarlosLopezDeLara.png","key":"carlos"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-06-07-node-cli-api","tags":["cli-api"],"authors":"carlos","hide_table_of_contents":false},"prevItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2023-06-08-system-test"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-02-hydra"}},"content":"# 2023-06-07 - 2023-06-20\\n\\n## High level summary\\n\\n* Completed cardano-cli migration to input-output-hk/cardano-cli\\n* cardano-cli ping now uses cardano-ping-0.2.0.5\\n* New queries on API:\\n * `queryCurrentEpochState`\\n * `queryDebugLedgerState`\\n * `queryGenesisParameters`\\n * `queryPoolDistribution`\\n * `queryPoolState`\\n * `queryProtocolParameters`\\n * `queryProtocolParametersUpdate`\\n * `queryProtocolState`\\n * `queryStakeAddresses`\\n * `queryStakeDistribution`\\n * `queryStakePoolParameters`\\n * `queryStakeSnapshot`\\n* Deprecate:\\n * `queryPparams`\\n* Export query API as functions\\n * `genFeatureValueInEra`\\n * `featureInShelleyBasedEra`\\n * `isFeatureValue`\\n * `valueOrDefault`\\n * `asFeatureValue`\\n * `asFeatureValueInShelleyBasedEra`\\n * `queryEpoch`\\n * `requireShelleyBasedEra`\\n* Restructure cardano-testnet (WIP)\\n____\\n\\n### cardano-cli\\n\\n- [update network dependency and versions](https://github.com/input-output-hk/cardano-node/pull/5328)\\n- [Updated cardano-cli to use `cardano-ping-0.2.0.5`.](https://github.com/input-output-hk/cardano-node/pull/5326)\\n- [Use `cardano-cli` from CHaP](https://github.com/input-output-hk/cardano-node/pull/5316)\\n- [Add `--conway-era` flag](https://github.com/input-output-hk/cardano-node/pull/5315)\\n- [Updated cardano-cli ping command](https://github.com/input-output-hk/cardano-node/pull/5313)\\n- [Add `--conway-era` flag](https://github.com/input-output-hk/cardano-node/pull/5311)\\n\\n- [Use cardano-ping-0.2.0.5](https://github.com/input-output-hk/cardano-cli/pull/30)\\n- [Deprecate `--protocol-params-file` option of the `transaction build` command more thoroughly](https://github.com/input-output-hk/cardano-cli/pull/28)\\n- [New `Cardano.Api.Query.Expr` module](https://github.com/input-output-hk/cardano-cli/pull/25)\\n- [Use simplified `queryStateForBalancedTx`](https://github.com/input-output-hk/cardano-cli/pull/24)\\n- [Add `--conway-era` flag](https://github.com/input-output-hk/cardano-cli/pull/20)\\n\\n\\n### cardano-api\\n\\n- [New version `cardano-api-8.5.2.0`](https://github.com/input-output-hk/cardano-api/pull/59)\\n- [New `requireShelleyBasedEra` function](https://github.com/input-output-hk/cardano-api/pull/58)\\n- [New version cardano-api-8.5.1.0](https://github.com/input-output-hk/cardano-api/pull/57)\\n- [New `queryEpoch` function](https://github.com/input-output-hk/cardano-api/pull/56)\\n- [New version 8.5.0.0](https://github.com/input-output-hk/cardano-api/pull/55)\\n- [Error on `hlint` warnings in CI](https://github.com/input-output-hk/cardano-api/pull/54)\\n- [Additional query expression functions](https://github.com/input-output-hk/cardano-api/pull/53)\\n- [New version `cardano-api-8.4.0.0`](https://github.com/input-output-hk/cardano-api/pull/52)\\n- [New version `cardano-api-8.3.0.0`](https://github.com/input-output-hk/cardano-api/pull/49)\\n- [New `Cardano.Api.Query.Expr` module](https://github.com/input-output-hk/cardano-api/pull/48)\\n- [Simplify `queryStateForBalancedTx`](https://github.com/input-output-hk/cardano-api/pull/47)\\n- [Revert to use `testProperty` now that it isn\'t deprecated anymore](https://github.com/input-output-hk/cardano-api/pull/46)\\n\\n### cardano-node\\n\\n- [cardano-node 8.1.1 release](https://github.com/input-output-hk/cardano-node/releases/tag/8.1.1)\\n- [update network dependency and versions](https://github.com/input-output-hk/cardano-node/pull/5328)\\n\\n### cardano-testnet\\n\\n- [Add ability to retry tests with DISABLE_RETRIES=1](https://github.com/input-output-hk/cardano-node/pull/5340)\\n- [Move golden files to proper location](https://github.com/input-output-hk/cardano-node/pull/5339)\\n- [Conway testnet](https://github.com/input-output-hk/cardano-node/pull/5336)\\n- [Don\'t retry testnet when failed](https://github.com/input-output-hk/cardano-node/pull/5335)\\n- [Remove YAML filepath record from data Conf](https://github.com/input-output-hk/cardano-node/pull/5321)\\n- [Add `--conway-era` flag](https://github.com/input-output-hk/cardano-node/pull/5315)\\n- [Add `--conway-era` flag](https://github.com/input-output-hk/cardano-node/pull/5311)\\n- [Remove duplicate --testnet-magic flag](https://github.com/input-output-hk/cardano-node/pull/5309)\\n- [Restructure cardano testnet ](https://github.com/input-output-hk/cardano-node/pull/5307)\\n\\n### docs\\n\\n### CI & project maintenance\\n\\n- [Fix Windows CI issues](https://github.com/input-output-hk/cardano-cli/pull/18)"},{"id":"2023-06-02-hydra","metadata":{"permalink":"/cardano-updates/2023-06-02-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-02-hydra.md","source":"@site/blog/2023-06-02-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-06-02T00:00:00.000Z","formattedDate":"June 2, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.215,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-06-02-hydra","authors":"ffakenz","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-06-07-node-cli-api"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-06-01-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team has put their effort on finding solutions on many\\ndifferent problems, such as our broken head on mainnet\\n[#897](https://github.com/input-output-hk/hydra/issues/897), our fragile monthly\\nreport publications on the website and implementing “Option A” for\\nexternal commits [#215](https://github.com/input-output-hk/hydra/issues/215).\\nAlthough most of these items are still open, huge progress has been made. To\\naccelerate the investigation, they improved their logging to give more precise\\nerrors when a transition requirement fails, and to reduce duplication on effets\\nlogged content. Last but not least, the team is exploring formal methods and\\nattended a workshop on formalizing cryptographic protocols in Agda.\\n\\n\\n## What did the team achieve this week\\n\\n- Continued investigating broken head and opened an issue to keep track [#897](https://github.com/input-output-hk/hydra/issues/897).\\n \\n As part of this issue, improvements were made to the node logs:\\n\\n + Give a precise error when a transition requirement fails [#895](https://github.com/input-output-hk/hydra/pull/895).\\n\\n + Reduce duplication for effects logged content by using sequential eventId and effectId pair [#896](https://github.com/input-output-hk/hydra/pull/896).\\n\\n- Fixed references in the hydra specification [#893](https://github.com/input-output-hk/hydra/pull/893).\\n\\n- Attended a workshop on formal methods and crypto in Agda.\\n\\n## What are the goals of next week\\n\\n- Investigate and re-open our team-internal head on mainnet.\\n- Improve and provide regular benchmarks for Hydra [#186](https://github.com/input-output-hk/hydra/issues/186).\\n- Complete journey for external commits implementing “Option A” and start implementing “Option B” [#215](https://github.com/input-output-hk/hydra/issues/215).\\n- Authenticate network messages [#727](https://github.com/input-output-hk/hydra/issues/727).\\n- Add hydra as tool to developr platform [#872](https://github.com/input-output-hk/hydra/issues/872).\\n- Fix monthly report publication on docs website."},{"id":"2023-06-01-mithril","metadata":{"permalink":"/cardano-updates/2023-06-01-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-01-mithril.md","source":"@site/blog/2023-06-01-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-06-01T00:00:00.000Z","formattedDate":"June 1, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.415,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-06-01-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-06-02-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-05-31-consensus"}},"content":"## High level overview\\nThe Mithril team released a new [`2321.1`](https://github.com/input-output-hk/mithril/releases/tag/2321.1) distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots.\\n\\nFinally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks.\\n\\n## Low level overview\\n- Released the new distribution [`2321.1`](https://github.com/input-output-hk/mithril/releases/tag/2321.1)\\n- Worked on the epic that designs and implements generic signing/verification of entity services [#780](https://github.com/input-output-hk/mithril/issues/780):\\n - Completed the issue `Enhance MessageAdapter for Artifact in aggregator REST API` [#925](https://github.com/input-output-hk/mithril/issues/925)\\n - Completed the issue `Create the sub-command for \'Cardano Immutable Files Full\' in client` [#895](https://github.com/input-output-hk/mithril/issues/895)\\n - Completed the issue `Enhance state machines Aggregator/Signer` [#933](https://github.com/input-output-hk/mithril/issues/933)\\n - Completed the issue `Adapt the aggregator REST API to list certificates` [#892](https://github.com/input-output-hk/mithril/issues/892)\\n - Worked on the issue `Adapt end to end tests to handle new types of data` [#899](https://github.com/input-output-hk/mithril/issues/899)\\n - Worked on the issue `Update client documentation` [#897](https://github.com/input-output-hk/mithril/issues/897)\\n - Worked on the issue `Update architecture documentations for new types of data` [#898](https://github.com/input-output-hk/mithril/issues/898)\\n- Worked on the epic that prepares the Mithril infrastructure for `mainnet` [#767](https://github.com/input-output-hk/mithril/issues/767):\\n - Worked on the issue `Enhance terraform infrastructure` [#930](https://github.com/input-output-hk/mithril/issues/930)\\n- Worked on the epic that implements the computation of the stake distribution for `mainnet` [#880](https://github.com/input-output-hk/mithril/issues/880):\\n - Completed the issue `Upgrade Cardano node to \'8.0.0\'` [#920](https://github.com/input-output-hk/mithril/issues/920)\\n- Completed the issue `Add export path in Client CLI` [#512](https://github.com/input-output-hk/mithril/issues/512)"},{"id":"2023-05-31-consensus","metadata":{"permalink":"/cardano-updates/2023-05-31-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-31-consensus.md","source":"@site/blog/2023-05-31-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-05-31T00:00:00.000Z","formattedDate":"May 31, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.825,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-05-31-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-06-01-mithril"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-05-31-performance-and-tracing"}},"content":"## High level summary\\n\\nDuring the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network\'s ledger-peer selection (see [this issue](https://github.com/input-output-hk/ouroboros-consensus/issues/101)). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain.\\n\\nOn the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano.\\n\\n## UTxO-HD\\n\\n- We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking `SOP` classes like `HPure` and `HAp` . In short, we implement generalised versions of important classes like `Applicative` and `Traversable`.\\n\\n## Support\\n\\n- `fs-sim-0.1.0.2` and `fs-api-0.1.0.2` were released, which makes them now compatible with GHC up to `9.6`.\\n- `ouroboros-consensus-0.7.0.0` was released for `cardano-node` `8.1`, including query serialization fixes for backwards compatibility."},{"id":"2023-05-31-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-05-31-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-31-performance-and-tracing.md","source":"@site/blog/2023-05-31-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-05-31T00:00:00.000Z","formattedDate":"May 31, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.055,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-05-31-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-05-31-consensus"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-05-26-goedel"}},"content":"## High level summary\\n\\n* Benchmarking: We\'ve performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster.\\n* New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism.\\n* Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.\\n\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nThe first set of runs with GHC9.2 as a build platform are in. We\'ve discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build\\nconfiguration: As it stands, the `ghc-bignum` package is using the Haskell `native-backend` as a default. We strive\\nto benchmark a build with the `gmp-backend` next. \\n\\nA variant of our `forge-stress` local benchmark has been set up to serve as an early indicator for the resource usage profile\\nwe\'d expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way\\nshorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great\\nsupport when evaluating different compiler versions or RTS flags incrementally.\\n\\n### Tracing\\n\\nThe hub of the new tracing system `cardano-tracer` is designed with a fixed output behaviour, which is limited to various\\nlogging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to \\ndirectly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all.\\n\\n\\n### Nomad backend\\nWe\'re currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with\\njob definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing\\nbenchmarking run required us to fine-tune communications with the nomad server. \\n\\nRelated to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible\\nand offers more detailed insight than the previous iteration in `cardano-ops`. The backend will enable you to formulate\\nvery specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met."},{"id":"2023-05-26-goedel","metadata":{"permalink":"/cardano-updates/2023-05-26-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-goedel.md","source":"@site/blog/2023-05-26-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-05-26T00:00:00.000Z","formattedDate":"May 26, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.39,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-05-26-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-05-31-performance-and-tracing"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-05-26-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has been working on final revisions for the\\npre-proceedings versions of two ICE 2023 papers.\\n\\n## Details\\n\\n* Porting Ouroboros Praos formalisation to new application layer.\\n\\n* Preparing pre-proceedings version of two ICE 2023 papers.\\n\\n* The team is hiring a performance engineering intern - https://apply.workable.com/io-global/j/BFEC5B0AFF/"},{"id":"2023-05-26-hydra","metadata":{"permalink":"/cardano-updates/2023-05-26-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-hydra.md","source":"@site/blog/2023-05-26-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-05-26T00:00:00.000Z","formattedDate":"May 26, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.11,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-05-26-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-05-26-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-05-26-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team accomplished several important tasks. They held their\\nmonthly review meeting and drafted the report for May. They made progress on\\nimplementing the first end-to-end journey for external commits using \\"Option A\\"\\nfor normal UTxOs, while still considering \\"Option B\\". The team also integrated a\\nSpanish translation contributed by the community, created micro-benchmarks for\\ntransaction validation and deserialization, and made improvements to\\nhydra-node\'s version reporting. Last but not least, they implemented the ability\\nto commit multiple UTxOs to a head at once.\\n\\n## What did the team achieve this week\\n\\n- Held the monthly review meeting ([recording](https://drive.google.com/file/d/1_N6b4RDe579TgLawiJzbE0NLofD3ljE6/view) + [slides](https://docs.google.com/presentation/d/1anUC3Z1idloyR6uwiSHLZtV6-LQvUcByHPMUgCBOVIA)) & drafted the report for May.\\n- Have a first end-to-end journey for external commits implementing “Option A”\\n for normal UTxOs [#887](https://github.com/input-output-hk/hydra/pull/887) (still considering “Option B”).\\n- Integrated the spanish translation [#866](https://github.com/input-output-hk/hydra/pull/866).\\n- Created micro-benchmarks for transaction validation and deserialization [#884](https://github.com/input-output-hk/hydra/pull/884).\\n- Improve hydra-node –version reporting on non-released builds [#849](https://github.com/input-output-hk/hydra/issues/849)\\n- Some minor CI improvements following up last weeks changes.\\n- Allow commit transactions with multiple UTxO [#774](https://github.com/input-output-hk/hydra/pull/774).\\n\\n## What are the goals of next week\\n\\n- Investigate and re-open our team-internal head on mainnet.\\n- Improve and provide regular benchmarks for Hydra [#186](https://github.com/input-output-hk/hydra/issues/186).\\n- Complete external commits with script UTxOs [#215](https://github.com/input-output-hk/hydra/issues/215).\\n- Authenticate network messages [#727](https://github.com/input-output-hk/hydra/issues/727).\\n- Add hydra as tool to developr platform [#872](https://github.com/input-output-hk/hydra/issues/872)."},{"id":"2023-05-26-ledger","metadata":{"permalink":"/cardano-updates/2023-05-26-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-ledger.md","source":"@site/blog/2023-05-26-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-05-26T00:00:00.000Z","formattedDate":"May 26, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.565,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-05-26-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-05-26-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-05-26-network"}},"content":"## High level summary\\n\\nThe ledger team made progress on the conway ledger era. In particular, the design and implementation\\nof the new certificates is near complete, we refactored some of our data structures\\nto be able to support DReps, we cleaned up the serialization format, and renamed things to make\\nclearer the differences with Shelley.\\n\\nThe team also completed integration work for the next node release, namely 8.1.0.\\nAnd, as always, we continue to address technical debt.\\n\\n## Low level summary\\n\\n### Conway progress\\n\\n- [pull-3408] - Improve conway delegation certificates\\n- [pull-3428] - Get rid of Constitutional in favor of Genesis and Committee\\n- [pull-3426] - Add DRep to internal data struture (UMap)\\n- [pull-3425] - Improve witness logic needed for conway\\n- [pull-3423] - Rename ShelleyDelegCerts constructors to distinguish them from Conway\\n- [pull-3421] - Rename DCert -> TxCert\\n- [pull-3454] - conway CDDL minor fixes\\n\\n### Improve testing\\n\\n- [pull-3403] - Add Plutus script context golden tests\\n\\n### Integration work\\n\\n- [pull-3410] - Update chaps index\\n- [pull-3416] - Bump cardano-ledger-alonzo-test version\\n- [pull-3414] - Bump cardano-ledger-shelley-test minor version\\n- [pull-3420] - Bump cardano-ledger-shelley-ma-test version\\n- [pull-3441] - Release cardano-ledger-[alonzo|babbage]-1.2.1\\n\\n### Technical debt\\n\\n- [pull-3409] - Unit test - no such thing as a reference datum\\n- [pull-3407] - Fixup release process documentation\\n- [pull-3404] - Create TotalDeposits events during all eras\\n- [pull-3402] - Fix broken references in the Shelley spec\\n- [pull-3424] - Remove no longer used cardano-ledger-shelley-ma package\\n- [pull-3432] - Add an example on how to bump up versions in the changelog \\n- [pull-3440] - Revert back to the group serialization for ProtVer for PParams \\n\\n[pull-3409]: https://github.com/input-output-hk/cardano-ledger/pull/3409\\n[pull-3408]: https://github.com/input-output-hk/cardano-ledger/pull/3408\\n[pull-3407]: https://github.com/input-output-hk/cardano-ledger/pull/3407\\n[pull-3404]: https://github.com/input-output-hk/cardano-ledger/pull/3404\\n[pull-3403]: https://github.com/input-output-hk/cardano-ledger/pull/3403\\n[pull-3402]: https://github.com/input-output-hk/cardano-ledger/pull/3402\\n[pull-3410]: https://github.com/input-output-hk/cardano-ledger/pull/3410\\n[pull-3416]: https://github.com/input-output-hk/cardano-ledger/pull/3416\\n[pull-3414]: https://github.com/input-output-hk/cardano-ledger/pull/3414\\n[pull-3428]: https://github.com/input-output-hk/cardano-ledger/pull/3428\\n[pull-3426]: https://github.com/input-output-hk/cardano-ledger/pull/3426\\n[pull-3425]: https://github.com/input-output-hk/cardano-ledger/pull/3425\\n[pull-3424]: https://github.com/input-output-hk/cardano-ledger/pull/3424\\n[pull-3423]: https://github.com/input-output-hk/cardano-ledger/pull/3423\\n[pull-3421]: https://github.com/input-output-hk/cardano-ledger/pull/3421\\n[pull-3420]: https://github.com/input-output-hk/cardano-ledger/pull/3420\\n[pull-3432]: https://github.com/input-output-hk/cardano-ledger/pull/3432\\n[pull-3454]: https://github.com/input-output-hk/cardano-ledger/pull/3454\\n[pull-3441]: https://github.com/input-output-hk/cardano-ledger/pull/3441\\n[pull-3440]: https://github.com/input-output-hk/cardano-ledger/pull/3440"},{"id":"2023-05-26-network","metadata":{"permalink":"/cardano-updates/2023-05-26-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-network.md","source":"@site/blog/2023-05-26-network.md","title":"Network Team Update","description":"High level summary","date":"2023-05-26T00:00:00.000Z","formattedDate":"May 26, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":0.515,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-05-26-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-05-26-ledger"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-05-24-node-cli-api"}},"content":"## High level summary\\n\\nWe continued working on `eclipse-evasion`. We also analysed and fixed a bug\\nwhen using DNS names in local root peers. We continued working on engineering\\nblog post about P2P. We released a new version of packages for\\n`cardano-node-8.1.0` release.\\n\\nWe improved our CI, removed obsolete scripts add extra validation which checks\\nif `CHANGELOG.md` files were updated.\\n\\nWe also improved release scripts.\\n\\n## Detailed summary\\n\\n* Eclipse evasion: [#4462]\\n* Local root peers bug fix: [#4559]\\n* Release to CHaP: [#4573]\\n* CI improvements: [#4572]\\n* Release script improvements: [#4573]\\n\\n[#4462]: https://github.com/input-output-hk/ouroboros-network/pull/4462\\n[#4558]: https://github.com/input-output-hk/ouroboros-network/pull/4558\\n[#4559]: https://github.com/input-output-hk/ouroboros-network/pull/4559\\n[#4572]: https://github.com/input-output-hk/ouroboros-network/pull/4572\\n[#4573]: https://github.com/input-output-hk/ouroboros-network/pull/4573"},{"id":"2023-05-24-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-05-24-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-24-node-cli-api.md","source":"@site/blog/2023-05-24-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-05-24T00:00:00.000Z","formattedDate":"May 24, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-05-24-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-05-26-network"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-05-19-hydra"}},"content":"# 2023-05-24 - 2023-06-06\\n\\n## High level summary\\n- The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released. \\n- We provided assitance where needed in the release\\n- An integration repository https://github.com/input-output-hk/fusion-flamingo was created to enable my team to more easily work on cardano-cli and cardano-api\\n\\n### docs\\n\\n### CI & project maintenance\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Update `cardano-cli` changelog](https://github.com/input-output-hk/cardano-node/pull/5290) \\n- [Propagate protocol parameters conversion errors](https://github.com/input-output-hk/cardano-node/pull/5197) \\n- [Command line option for parsing UTC time to slot number](https://github.com/input-output-hk/cardano-node/pull/5149) \\n\\n### cardano-api\\n- [Switch to `tasty-discover`](https://github.com/input-output-hk/cardano-api/pull/31) \\n- [Move tests to standard locations](https://github.com/input-output-hk/cardano-api/pull/30) \\n- [Make cardano-api:internal component public](https://github.com/input-output-hk/cardano-api/pull/26) \\n- [update chaps index](https://github.com/input-output-hk/cardano-api/pull/24) \\n- [Make `ErrorSpec` check for all constructors, move golden tests together](https://github.com/input-output-hk/cardano-api/pull/18) \\n- [Expose toAlonzoCostModels](https://github.com/input-output-hk/cardano-api/pull/17) \\n- [Make `ErrorsSpec` use generated types and constructors names](https://github.com/input-output-hk/cardano-api/pull/9) \\n- [Check changelog in tag script](https://github.com/input-output-hk/cardano-api/pull/32) \\n- [Use tag script from `cardano-dev` repository instead](https://github.com/input-output-hk/cardano-api/pull/34) \\n- [Use .x suffix for release branches](https://github.com/input-output-hk/cardano-api/pull/38) \\n\\n### cardano-node\\n- [Use `cryptoInit` instead of `sodiumInit`](https://github.com/input-output-hk/cardano-node/pull/5291) \\n- [Move configuration tests to `cardano-node` tests](https://github.com/input-output-hk/cardano-node/pull/5284) \\n- [update chaps & integration](https://github.com/input-output-hk/cardano-node/pull/5243) \\n- [#5222 Remove `ApplicationName` and `ApplicationVersion` config parameters](https://github.com/input-output-hk/cardano-node/pull/5240) \\n\\n### cardano-testnet"},{"id":"2023-05-19-hydra","metadata":{"permalink":"/cardano-updates/2023-05-19-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-19-hydra.md","source":"@site/blog/2023-05-19-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-05-19T00:00:00.000Z","formattedDate":"May 19, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.045,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-05-19-hydra","authors":"ffakenz","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-05-24-node-cli-api"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-05-17-consensus"}},"content":"## High-level summary\\n\\nThis week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the \\"Coding Standards\\" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.\\n\\n## What did the team achieve this week\\n\\n- Complete validation of timed transactions feature [#196](https://github.com/input-output-hk/hydra/issues/196).\\n- Write “ops” instructions and troubleshooting [#569](https://github.com/input-output-hk/hydra/issues/569) and improve logs.\\n- Remove `--ledger-genesis` argument to hydra-node options [#863](https://github.com/input-output-hk/hydra/pull/863).\\n- Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows [#877](https://github.com/input-output-hk/hydra/pull/877).\\n- Use nix to build test binaries to increase CI speed [#867](https://github.com/input-output-hk/hydra/pull/867).\\n- Updated our [Coding Standards](https://github.com/input-output-hk/hydra/wiki/Coding-Standards).\\n\\n## What are the goals of next week\\n\\n- Monthly report & review meeting.\\n- Have a first end-to-end journey for external commits implementing \\"Option A\\" [#215](https://github.com/input-output-hk/hydra/issues/215).\\n- Integrate spanish translation [#866](https://github.com/input-output-hk/hydra/pull/866).\\n- Improve and provide regular benchmarks for Hydra [#186](https://github.com/input-output-hk/hydra/issues/186).\\n- Allow commit transactions with multiple UTxO [#774](https://github.com/input-output-hk/hydra/pull/774).\\n- Explored stateless observation and refined hydra explorer ticket [#696](https://github.com/input-output-hk/hydra/issues/696)."},{"id":"2023-05-17-consensus","metadata":{"permalink":"/cardano-updates/2023-05-17-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-consensus.md","source":"@site/blog/2023-05-17-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-05-17T00:00:00.000Z","formattedDate":"May 17, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.285,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-05-17-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-05-19-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-05-17-mithril"}},"content":"## High level summary\\n\\nDuring the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the [Genesis][#genesis] section for more details.\\n\\nRegarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our `main` branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain.\\n\\nWe improved our tooling by releasing an [immutable DB server](https://github.com/input-output-hk/ouroboros-consensus/pull/68), which can be used for testing and benchmarking purposes, and a [`db-truncater`](https://github.com/input-output-hk/ouroboros-consensus/pull/70) program, which can be used in disaster recovery and benchmarking scenarios.\\n\\n## Genesis \\n\\nThe consensus team working on Genesis:\\n\\n- Improved the genesis selection rule as a result of our interaction with IO Research.\\n- Studied how the hard-fork combinator handles forecasting at era transitions, and [improved our documentation](https://github.com/input-output-hk/ouroboros-consensus/pull/89).\\n- Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP.\\n- Elaborated concrete proposal for the Genesis State Machine.\\n- Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it\'s similar to the Genesis State Machine).\\n\\nThe team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we\'ve re-introduced the Genesis State Machine."},{"id":"2023-05-17-mithril","metadata":{"permalink":"/cardano-updates/2023-05-17-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-mithril.md","source":"@site/blog/2023-05-17-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-05-17T00:00:00.000Z","formattedDate":"May 17, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.555,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-05-17-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-05-17-consensus"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-05-17-performance-and-tracing"}},"content":"## High level overview\\nThe Mithril team released a new [`2318.0`](https://github.com/input-output-hk/mithril/releases/tag/2318.0) distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types.\\n\\nFinally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node `8.0.0` (along with the backward compatibility for previous `1.35.x` versions).\\n\\n## Low level overview\\n- Worked on the epic that designs and implements generic signing/verification of entity services [#780](https://github.com/input-output-hk/mithril/issues/780):\\n - Completed the handling of multiple types of signed entity in the aggregator runtime [#907](https://github.com/input-output-hk/mithril/issues/907)\\n - Completed the adaptation of the signer runtime to use the signable builder service [#854](https://github.com/input-output-hk/mithril/issues/854)\\n - Completed the adaptation of the aggregator runtime to use the artifact builder service [#869](https://github.com/input-output-hk/mithril/issues/869)\\n - Completed the appending of the next AVK to all protocol messages [#888](https://github.com/input-output-hk/mithril/issues/888)\\n - Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced [#893](https://github.com/input-output-hk/mithril/issues/893)\\n - Completed the adaptation of the explorer to handle new artifact routes of the aggregator [#927](https://github.com/input-output-hk/mithril/issues/927)\\n- Worked on the epic that implements the computation of the stake distribution for `mainnet` [#880](https://github.com/input-output-hk/mithril/issues/880):\\n - Completed the implementation of the new stake distribution computation in the chain observer [#919](https://github.com/input-output-hk/mithril/issues/919)\\n - Worked on upgrading the Cardano node to `8.0.0` [#920](https://github.com/input-output-hk/mithril/issues/920)"},{"id":"2023-05-17-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-05-17-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-performance-and-tracing.md","source":"@site/blog/2023-05-17-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-05-17T00:00:00.000Z","formattedDate":"May 17, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":3.21,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-05-17-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-05-17-mithril"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-05-12-crypto"}},"content":"## High level summary\\n\\n* Benchmarking: We\'re preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes.\\n* New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due.\\n* Analysis pipeline: First steps on implementing incremental analysis have been untertaken.\\n* Open Sourcing: Exhaustive dataflow charts for both our analysis tool `locli` and our `workbanch` have been merged to `master`\\n* Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we\'re porting the definition of our model cluster.\\n* P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland.\\n* Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we\'re busy with the handover.\\n\\n## Low level overview\\n\\n### Benchmarking\\n\\nAs a compiler switch to GHC 9.2.7 for `cardano-node`\'s default build environment is around the corner, we\'re setting up our benchmarking cluster to\\nhandle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This\\nalso involves choosing a reliable baseline as reference point for inter-version comparisons. \\n\\nAdditionally we\'ve been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet,\\nwe strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to\\nbe balanced against resource demand for all our cluster\'s nodes.\\n\\n### Tracing\\n\\nFor our new tracing system, we\'re currently validating the behaviour of the system after optimizations have been applied. Furthermore, some\\nquality-of-life details that have changed required us to revision the system documentation.\\n\\n### Analysis\\n\\nAs a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been\\nnormally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a\\nhuge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken. \\n\\n### Open Sourcing\\n\\nA very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking\\ncopmonents more accessible. As a result, detailed charts for both our LogObject CLI `locli` and our `workbench` have been merged to `master`. \\n\\n### Nomad backend\\nWhile our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we\'ve been adjusting\\nthose profiles of our `workbench` that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality\\nof the nomad cloud backend. \\n\\nAdditionally, we\'re porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster.\\n\\n### Performance & Tracing Meetup\\n\\nWe held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive\\ndays together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future.\\nAlso, it was a great opportunity to finally meet in person.\\n\\n### Offboarding\\n\\nLast not least we regret that our team lead is leaving at the end of May. Currently, he\'s handing over all his obligations, which requires reorganisation\\nof team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!"},{"id":"2023-05-12-crypto","metadata":{"permalink":"/cardano-updates/2023-05-12-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-crypto.md","source":"@site/blog/2023-05-12-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-05-12T00:00:00.000Z","formattedDate":"May 12, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.095,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-05-12-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-05-17-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-05-12-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* cardano-base: Include final tests for BLS signature. Further adaptations for KES agent. \\n* Sidechains: Implement BLS and JubJub using upstream\'s macros to merge these curves in halo2curves.\\n## Low level summary\\n### cardano-base\\n* RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); this is needed for KES Agent. Review ongoing.\\n* Facilitate BLS test vectors in Haskell test suite (https://github.com/input-output-hk/cardano-base/pull/408)\\n* Add the SignKeyWithKES type to cardano-base (https://github.com/input-output-hk/cardano-base/pull/389)\\n* Restructuring and simplifying the MLocking code in cardano-base (https://github.com/input-output-hk/cardano-base/pull/404, https://github.com/input-output-hk/cardano-base/pull/405), getting rid of the purpose-built MonadMLock etc. typeclasses in the process\\n* Merging the DSIGN and DSIGNM APIs such that the same phantom type can be used to select both the pure and mlocked versions of the same DSIGN algorithm (https://github.com/input-output-hk/cardano-base/pull/411)\\n* Simplifying the KES API into a single KESAlgorithm typeclass, merging the KESSignAlgorithm class into it (this is possible due to the simplifications from #404). (Same PR as above: https://github.com/input-output-hk/cardano-base/pull/411).\\n* Update CIP-0381 with new plutus built-in functions, [#506](https://github.com/cardano-foundation/CIPs/pull/506). In particular hash_to_curve now takes as input a secon input for the Domain Separation Tag (DST), and we limit to have a maximu size of 255 bytes. \\n### Sidechains\\n* Opened PR in halo2curves to include BLS12-381 and JubJub, [#38](https://github.com/privacy-scaling-explorations/halo2curves/pull/38)\\n* Addition constraint over JubJub merged [#10](https://github.com/input-output-hk/sidechains-zk/pull/10)"},{"id":"2023-05-12-goedel","metadata":{"permalink":"/cardano-updates/2023-05-12-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-goedel.md","source":"@site/blog/2023-05-12-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-05-12T00:00:00.000Z","formattedDate":"May 12, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.445,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-05-12-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-05-12-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-05-12-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team had two paper accepted for ICE 2023\\n(https://www.discotec.org/2023/ice). The event will be held in Lisbon\\non 19th June 2023. The papers will be published in EPTCS.\\n\\n## Details\\n\\n* Application layer for Praos formalisation in review.\\n\\n* Participating in interactive peer review process for ICE 2023.\\n\\n* The team is hiring a performance engineering intern - https://apply.workable.com/io-global/j/BFEC5B0AFF/"},{"id":"2023-05-12-hydra","metadata":{"permalink":"/cardano-updates/2023-05-12-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-hydra.md","source":"@site/blog/2023-05-12-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-05-12T00:00:00.000Z","formattedDate":"May 12, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.145,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-05-12-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-05-12-goedel"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-05-12-network"}},"content":"## High-level summary\\n\\nThis week, the Hydra team achieved a number of milestones, including the release\\nof the first mainnet compatible version. Besides this they also addressed\\ninconsistencies in rollback handling, added an architecture page to the website,\\nreducing the size of logs using event IDs. They also had productive discussions\\nwith researchers on plans for incremental commits/decommits and had a whiteboard\\nsession on DeFi and lending protocols. The goals for next week include\\ncompleting the validation of the timed transactions feature, exploring stateless\\nobservation, refining the Hydra explorer ticket, writing ops instructions and\\ntroubleshooting, and implementing the first end-to-end journey for external\\ncommits.\\n\\n## What did the team achieve this week\\n\\n- Released first mainnnet compatible version [0.10.0](https://github.com/input-output-hk/hydra/releases/tag/0.10.0)\\n- Addressed inconsist handling of rollbacks [#784](https://github.com/input-output-hk/hydra/issues/784)\\n- Added [architecture page](https://hydra.family/head-protocol/core-concepts/architecture/) and fixed haddock links on our website [#838](https://github.com/input-output-hk/hydra/pull/838)\\n- Opened a new hydra head on mainnet\\n- Talked with researchers on initial plan for incremental commits/decommits\\n- Had a Whiteboard session on DeFi and lending protocols\\n- Reduced size of logs using event ids [#859](https://github.com/input-output-hk/hydra/pull/859)\\n- Published the [monthly report for April](https://hydra.family/head-protocol/monthly/2023-04)\\n\\n## What are the goals of next week\\n\\n- Complete validation of timed transactions feature [#196](https://github.com/input-output-hk/hydra/issues/196)\\n- Explored stateless observation and refined hydra explorer ticket [#696](https://github.com/input-output-hk/hydra/issues/696)\\n- Write “ops” instructions and troubleshooting [#569](https://github.com/input-output-hk/hydra/issues/569) and improve logs\\n- Have a first end-to-end journey for external commits implemented [#215](https://github.com/input-output-hk/hydra/issues/215)"},{"id":"2023-05-12-network","metadata":{"permalink":"/cardano-updates/2023-05-12-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-network.md","source":"@site/blog/2023-05-12-network.md","title":"Network Team Update","description":"High level summary","date":"2023-05-12T00:00:00.000Z","formattedDate":"May 12, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.79,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-05-12-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-05-12-hydra"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-05-05-ledger"}},"content":"## High level summary\\n\\nWe started working on a new way to switch between root & ledger peers (see\\nbelow). We continued to work on `eclipse-evasion`. We merged changes to\\nHandshake contributed by Galois Inc. We made improvements to our tests (fixed\\na flaky test, added cddl specs for `NodeToNodeVersionData` and\\n`NodeToClientVersionData`). We improved our CI and automated the process of\\nreleasing new package version to `CHaP`.\\n\\n## Detailed summary\\n\\nWe continued to work on testing `eclipse-evasion`.\\n\\nWe came up with an idea to limit how full node wallets relay on root peers\\n(currently operated by IOG, in future also CF and Emurgo). We designed\\na switch to use ledger peers if the node tip is close enough to the current\\ntime. For more details see [#4530].\\n\\nWe merged changes to the handshake mini-protocol which allow one to query\\nserver\'s `node-to-node` / `node-to-client` parameters. We are grateful to\\nGalois Inc. for implementing it, [#4256] and [#4538]. We published new version\\nof packages to CHaP [chap-#253].\\n\\nWe added `DiffusionError` wrapper. Thanks to it, `ouroboros-consensus` will\\nnot duplicate diffusion errors messages in the log, [#4537].\\n\\nWe fixed an issue which caused one of our tests to be flaky, [#4515].\\n\\nWe added cddl tests for `NodeToNodeVersionData` and `NodeToClientVersionData`:\\n[#4540], [#4544] (in review).\\n\\nWe wrote scripts which will help us release packages as well as verify that we\\nreleased all the package necessary to build the newest set of packages,\\n[#4542].\\n\\nWe renamed the consensus startup tracer and make sure it doesn\'t log\\n`ExitSuccess` exceptions, [consensus-#71].\\n\\nWe reviewed PR which adds `RawBearer` API, [#4395].\\n\\nWe made series of improvements to our CI:\\n* [#4539]: we don\'t need to install cryptographic libraries in CI;\\n* [#4545]: Javier Sagredo (consensus) cleaned up CI after `consensus` moved\\n to a new repo;\\n* [#4546]: we switched to use [GitHub merge queues][mq];\\n* [#4549]: we made it possible to trigger building haddocks manually;\\n* [#4553]: we fixed and enhanced caching of building dependencies.\\n\\n[#4256]: https://github.com/input-output-hk/ouroboros-network/issues/4256\\n[#4395]: https://github.com/input-output-hk/ouroboros-network/issues/4395\\n[#4515]: https://github.com/input-output-hk/ouroboros-network/issues/4515\\n[#4530]: https://github.com/input-output-hk/ouroboros-network/issues/4530\\n[#4537]: https://github.com/input-output-hk/ouroboros-network/issues/4537\\n[#4538]: https://github.com/input-output-hk/ouroboros-network/issues/4538\\n[#4539]: https://github.com/input-output-hk/ouroboros-network/issues/4539\\n[#4540]: https://github.com/input-output-hk/ouroboros-network/issues/4540\\n[#4542]: https://github.com/input-output-hk/ouroboros-network/issues/4542\\n[#4544]: https://github.com/input-output-hk/ouroboros-network/issues/4544\\n[#4545]: https://github.com/input-output-hk/ouroboros-network/issues/4545\\n[#4546]: https://github.com/input-output-hk/ouroboros-network/issues/4546\\n[#4549]: https://github.com/input-output-hk/ouroboros-network/issues/4549\\n[#4553]: https://github.com/input-output-hk/ouroboros-network/issues/4553\\n\\n[chap-#253]: https://github.com/input-output-hk/cardano-haskell-packages/pull/253\\n\\n[consensus-#71]: https://github.com/input-output-hk/ouroboros-consensus/pulls/71\\n\\n[mq]: https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue"},{"id":"2023-05-05-ledger","metadata":{"permalink":"/cardano-updates/2023-05-05-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-05-ledger.md","source":"@site/blog/2023-05-05-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-05-05T00:00:00.000Z","formattedDate":"May 5, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.235,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-05-05-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-05-12-network"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-05-05-node-cli-api"}},"content":"## High level summary\\n\\nThe ledger team focused mainly on the conway ledger era and node integration.\\nFor conway, we completed a large structural change that now allows\\nfor delegation certificates to be parameterized by era, and introducing\\nnew certificates for the first time since Shelley.\\nWe also continue to build out our contraint based generators that we will\\nuse to property test the conway era.\\nIn particular, we can now generate an entire ledger state and a\\ntransaction which is balanced with respect to the ledger state.\\n\\n## Low level summary\\n\\n## Conway certificates\\n\\nCertificiates are now abstracted as a type family in the ledger codebase.\\nMoreover, there are new certificates in the Conway era to support CIP-1694,\\nand MIR certificates have been removed.\\n\\n* [pull-3387]\\n\\n## Constraint based testing\\n\\nOur plan for property testing in the conway era is to no longer use the trace generators,\\nbut instead generate ledger states and transactions based on constraints.\\nWe hit a milestone this week, namely the ability to generate a balanced transaction in the context\\nof a ledger state, all based on our ever growing constaint language.\\n\\n* [pull-3374]\\n* [pull-3386]\\n\\n## Integration work\\n\\n* [pull-3393] - Performance improvements\\n* [pull-3395] - Conway instances\\n* [pull-3398] - Fix mint translation in the script context\\n\\n## Technical debt\\n\\n* [pull-3389] - Reduce github pages size\\n* [pull-3390] - Reinstate the tickf optimizations\\n\\n[pull-3374]: https://github.com/input-output-hk/cardano-ledger/pull/3374\\n[pull-3398]: https://github.com/input-output-hk/cardano-ledger/pull/3398\\n[pull-3395]: https://github.com/input-output-hk/cardano-ledger/pull/3395\\n[pull-3393]: https://github.com/input-output-hk/cardano-ledger/pull/3393\\n[pull-3390]: https://github.com/input-output-hk/cardano-ledger/pull/3390\\n[pull-3389]: https://github.com/input-output-hk/cardano-ledger/pull/3389\\n[pull-3386]: https://github.com/input-output-hk/cardano-ledger/pull/3386\\n[pull-3387]: https://github.com/input-output-hk/cardano-ledger/pull/3387"},{"id":"2023-05-05-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-05-05-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-05-node-cli-api.md","source":"@site/blog/2023-05-05-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-05-05T00:00:00.000Z","formattedDate":"May 5, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.81,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-05-05-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-05-05-ledger"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-05-04-mithril"}},"content":"# 2023-05-05 - 2023-05-23\\n\\n## High level summary\\n- Golden tests for cardano-cli command help output were added.\\n- Documentation was updated with new libsodium installation instructions.\\n- There were several updates for the cardano-cli:\\n - Deletion of the deprecated shelley command group.\\n - Addition of golden tests for CLI help.\\n - An improvement to avoid bare IO in tests, allowing better error reporting in failed tests.\\n - Generation of UTCTime test values without leap seconds (avoids erroneous test failures)\\n - Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32.\\n- The cardano-api underwent multiple refinements:\\n - Implementing deposit handling when balancing transactions (necessary for Conway)\\n - Cleaning up socket file path code.\\n- Several changes were made to the cardano-testnet:\\n - Adding golden tests for cardano-testnet help.\\n - Removing all hardcoded yaml files in cardano-testnet\\n - Improving cardano-testnet help output.\\n - Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.\\n\\n### docs\\n- [Update libsodium installation instructions](https://github.com/input-output-hk/cardano-node/pull/5181) \\n\\n### CI & project maintenance\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Delete deprecated `shelley` command group](https://github.com/input-output-hk/cardano-node/pull/5264) \\n- [Add golden tests for CLI help](https://github.com/input-output-hk/cardano-node/pull/5206) \\n- [Avoid bare IO in tests](https://github.com/input-output-hk/cardano-node/pull/5201) \\n- [Split `cardano-cli` test files into separate directories](https://github.com/input-output-hk/cardano-node/pull/5200) \\n- [Make UTCTime test generator generate values without leap seconds](https://github.com/input-output-hk/cardano-node/pull/5198) \\n- [Add support with signing transactions with `GenesisDelegateSigningKey_ed25519_bip32`](https://github.com/input-output-hk/cardano-node/pull/5189) \\n- [Rename --signed-tx-file argument to --tx-file argument in verify-poll command](https://github.com/input-output-hk/cardano-node/pull/5184) \\n- [Simplify socket path code](https://github.com/input-output-hk/cardano-node/pull/5120) \\n\\n### cardano-api\\n- [refactor: make renderScriptWitnessIndex output more explicit](https://github.com/input-output-hk/cardano-node/pull/5221) \\n- [Implement deposit handling when balancing transactions](https://github.com/input-output-hk/cardano-node/pull/5218) \\n- [Replace remaining `FilePath` use in `cardano-api`](https://github.com/input-output-hk/cardano-node/pull/5217) \\n- [Cleanup socket file path code](https://github.com/input-output-hk/cardano-node/pull/5215) \\n- [Delete `readEnvSocketPath` function](https://github.com/input-output-hk/cardano-node/pull/5207) \\n- [IO functions for reading. Remove PoolMetadataFile type](https://github.com/input-output-hk/cardano-node/pull/5194) \\n- [Expose config reader](https://github.com/input-output-hk/cardano-node/pull/5191) \\n- [Golden tests for `cardano-api` errors](https://github.com/input-output-hk/cardano-node/pull/5188) \\n- [Fix `toEraInMode` for conway](https://github.com/input-output-hk/cardano-node/pull/5175) \\n- [Use machine readable output for ToJSON ScriptWitnessIndex](https://github.com/input-output-hk/cardano-node/pull/5168) \\n- [Expose LocalTxSubmissionClient data constructor](https://github.com/input-output-hk/cardano-node/pull/5096) \\n- [Use cardano-api from separate repository](https://github.com/input-output-hk/cardano-node/pull/5047) \\n- [[cardano-api] Export fromConsensusPointHF](https://github.com/input-output-hk/cardano-node/pull/4684) \\n\\n### cardano-node\\n- [Provide orphan `ToJSON` instances for `HardForkNodeToClientVersion` and `HardForkNodeToNodeVersion`](https://github.com/input-output-hk/cardano-node/pull/5022) \\n\\n### cardano-testnet\\n- [Add golden test for `cardano-testnet` help](https://github.com/input-output-hk/cardano-node/pull/5254) \\n- [Remove all hardcoded yaml files from cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/5242) \\n- [Fix cardano-testnet help](https://github.com/input-output-hk/cardano-node/pull/5234) \\n- [Parameterize default yaml configuration value in cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/5211) \\n- [Freeze callstack in integration and integrationRetryWorkspace functions](https://github.com/input-output-hk/cardano-node/pull/5165) \\n- [Create defaultYamlValue for cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/5128)"},{"id":"2023-05-04-mithril","metadata":{"permalink":"/cardano-updates/2023-05-04-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-04-mithril.md","source":"@site/blog/2023-05-04-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-05-04T00:00:00.000Z","formattedDate":"May 4, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.56,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-05-04-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-05-05-node-cli-api"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-05-03-consensus"}},"content":"## High level overview\\nThe Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version `1.35.7`.\\n\\nFinally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain.\\n\\n## Low level overview\\n- Worked on the epic that designs and implements generic signing/verification of entity services [#780](https://github.com/input-output-hk/mithril/issues/780):\\n - Completed the implementation of the `Certifier` service in the aggregator [#850](https://github.com/input-output-hk/mithril/issues/850)\\n - Completed the implementation of the signable builder for the `Mithril Stake Distribution` [#851](https://github.com/input-output-hk/mithril/issues/851)\\n - Completed the implementation of the artifact builder for the `Mithril Stake Distribution` [#870](https://github.com/input-output-hk/mithril/issues/870)\\n - Completed the implementation of the signable builder for the `Full Immutables Snapshot` [#852](https://github.com/input-output-hk/mithril/issues/852)\\n - Completed the implementation of the artifact builder for the `Full Immutables Snapshot` [#871](https://github.com/input-output-hk/mithril/issues/871)\\n - Completed the adaptation of the aggregator runtime to use the signable builder service [#853](https://github.com/input-output-hk/mithril/issues/853)\\n - Worked on the adaptation of the signer runtime to use the signable builder service [#854](https://github.com/input-output-hk/mithril/issues/854)\\n - Completed the definition of the entity service interface for verification/restoration [#868](https://github.com/input-output-hk/mithril/issues/868)\\n - Completed the refactoring of the `OpenMessage` type [#878](https://github.com/input-output-hk/mithril/issues/878)\\n- Completed the epic that simplifies the multi-signer in the aggregator [#398](https://github.com/input-output-hk/mithril/issues/398):\\n - Completed the extraction of the single signature registration from the multi-signer [#643](https://github.com/input-output-hk/mithril/issues/643)\\n- Completed the upgrade of the Cardano node to version `1.35.7` [#881](https://github.com/input-output-hk/mithril/issues/881)\\n- Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators [#873](https://github.com/input-output-hk/mithril/issues/873)"},{"id":"2023-05-03-consensus","metadata":{"permalink":"/cardano-updates/2023-05-03-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-03-consensus.md","source":"@site/blog/2023-05-03-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-05-03T00:00:00.000Z","formattedDate":"May 3, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.755,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-05-03-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-05-04-mithril"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-05-03-performance-and-tracing"}},"content":"## High level summary\\n\\nDuring the past two weeks we made some important progress in the Genesis design.\\nIt seems the `BlockFetch` logic need not be modified for Genesis, although this\\nneeds to be confirmed. We started a DoS mitigation handbook and updated our\\nconceptual component diagram to guide the Genesis design. We engaged with the\\nIOG researchers to work on the Limit on Patience attack vector, work in this\\narea is still ongoing. We sketched a design to decouple the CPU load of the node\\nfrom its responsiveness to the socket. Finally, we discussed with Networking our\\napproach to lower the performance impact of the BlockFetch decision logic, and\\ngot green light from them.\\n\\nWe migrated the consensus code to a [new\\nrepository](https://github.com/input-output-hk/ouroboros-consensus), splitting\\nit from the `ouroboros-network` repository, and released version 0.6 of\\nConsensus.\\n\\nWe also merged the mempool fairness improvement to main branch.\\n\\nAnother significant enhancement to our documentation was the addition of an\\nexplanation of the hardfork combinator forecast horizon.\\n\\nSee the sections below for more details.\\n\\n## Genesis\\n\\nWe reviewed the `BlockFetch` design documentation, and added some source-code\\ncomments that emphasize certain properties of the decisions the `BlockFetch`\\nlogic makes that are helping us confirm that Genesis does not require any\\nchanges to `BlockFetch`. We are waiting on input from our former system\\narchitect to verify this.\\n\\nWe migrated and updated the conceptual component diagram in the `ouroboros-consensus`\\nrepository which helps us situate the Genesis design and argument.\\n\\nWe engaged with the IOG researchers about the Genesis design. We sketched out a\\nway to address the concern that the Limit on Patiente (LoP) attack vector duty\\ncycle is indeed low, but it\'s still non-trivial to ultimately conclude it\'s\\nsufficiently low.\\n\\nWe also sketched a design to decouple the CPU load of the node from its\\nresponsiveness to the socket, since the LoP is a relatively tight timeout, and\\nnode performance bugs inducing seconds-worth of latency are unfortunately\\nfamiliar phenomena.\\n\\n## Fostering collaboration\\n\\nWe [added an\\nexplanation](https://github.com/input-output-hk/ouroboros-consensus/pull/62) of\\na question that we had to explain many times about the exact behavior of the\\nhardfork combinator forecast horizon."},{"id":"2023-05-03-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-05-03-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-03-performance-and-tracing.md","source":"@site/blog/2023-05-03-performance-and-tracing.md","title":"Performance & tracing update","description":"* Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.","date":"2023-05-03T00:00:00.000Z","formattedDate":"May 3, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.76,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-05-03-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-05-03-consensus"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-05-01-db-sync"}},"content":"* Benchmarking: The benchmarks and performance investigations for the new `8.0` release branch are ongoing.\\n* New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint.\\n* Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on.\\n* Infrastructure: The `plutus-apps` flake input for `cardano-node` has finally been removed.\\n* Nomad backend: A PR implementing placement of benchmarking clusters has been merged.\\n \\n# Benchmarking\\n\\nThe performance investigations on the `8.0` release branch have lead to pinpointing and addressing incosistent behaviour. For that,\\nwe created yet another local reproduction with the workbench\'s `forge-stress` benchmark. \\n\\nCurrently we\'re working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into `8.0` and\\nsubsequent releases. \\n\\nAdditionally, we\'ve refined the `trace-bench` family of profiles that target benchmarking our own new tracing system. \\n\\n# Tracing\\n\\nOptimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally\\nintended to run on a performance-critical codepath. We\'ve worked on improving those, as well as eliminating cases of redundant\\nconversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system.\\n\\n# Infrastructure & Analysis\\n\\n### Dataflow documentation\\nThe LogObject CLI `locli` is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate\\nfurther development, we\'re creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting. \\n\\n### Remove redundant Plutus flake input\\nThis step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input,\\nwe simplify the dependency graph for `cardano-node`, as well as enable immediate feedback when developing Plutus benchmarks.\\n\\n### Nomad backend\\nSophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking.\\nThis capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along\\nwith various quality-of-life improvements, has been merged to `master`."},{"id":"2023-05-01-db-sync","metadata":{"permalink":"/cardano-updates/2023-05-01-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-01-db-sync.md","source":"@site/blog/2023-05-01-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-05-01T00:00:00.000Z","formattedDate":"May 1, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.515,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-05-01-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-05-03-performance-and-tracing"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-04-28-crypto"}},"content":"## High level summary\\n\\n\\n\\n## Lower level summary\\n- Prepared a schema change which is expected to speed up queries and help clients\\n[#1389](https://github.com/input-output-hk/cardano-db-sync/pull/1389).\\n- Ran a big number of benchmarks on the above to evaluate if this change is reasonable.\\n- Performance optimization related to rewards\\n[#1382](https://github.com/input-output-hk/cardano-db-sync/pull/1382)\\n- Using the cache in more places to reduce recourses usage\\n[#1380](https://github.com/input-output-hk/cardano-db-sync/pull/1380)\\n- Evaluated risks related to UTXO-HD integration\\n- Worked on a feauture request to split the `tx_out` to an address table\\n[#1396](https://github.com/input-output-hk/cardano-db-sync/pull/1396)\\n- Worked on another feauture request to prune the consumed entries from the `tx_out` table\\n[#1398](https://github.com/input-output-hk/cardano-db-sync/pull/1398)\\n- Prepared for CIP-1694 integration"},{"id":"2023-04-28-crypto","metadata":{"permalink":"/cardano-updates/2023-04-28-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-crypto.md","source":"@site/blog/2023-04-28-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-04-28T00:00:00.000Z","formattedDate":"April 28, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.26,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-04-28-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-05-01-db-sync"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-04-28-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto\'s library.\\n* KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction.\\n* Sidechains: Started implementing ECC chip of JubJub over BLS12-381.\\n## Low level summary\\n### cardano-base\\n* [#255](https://github.com/input-output-hk/cardano-base/pull/255) finally merged :tada:\\n* Additional tests for BLS bindings [#384](https://github.com/input-output-hk/cardano-base/pull/384)\\n* Open PR for including test vectors created with [zkscrypto](https://github.com/zkcrypto/bls12_381)\'s library, [PR#397](https://github.com/input-output-hk/cardano-base/pull/397)\\n### KES agent\\n* Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period [PR#389](https://github.com/input-output-hk/cardano-base/pull/389).\\n* Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) [#317](https://github.com/input-output-hk/cardano-base/pull/317).\\n* Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim\\n* Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes\\n* Refactor MonadSodium into MonadMLock [PR#388](https://github.com/input-output-hk/cardano-base/pull/388).\\n### Sidechains\\n* Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)\\n* Use macros used by PSE library to try and merge our fork of halo2curves into PSE\'s repo"},{"id":"2023-04-28-goedel","metadata":{"permalink":"/cardano-updates/2023-04-28-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-goedel.md","source":"@site/blog/2023-04-28-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-04-28T00:00:00.000Z","formattedDate":"April 28, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.375,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-04-28-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-04-28-crypto"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-04-28-network"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThe team is working on porting an existing formalisation of Ouroboros\\nPraos to a newer foundation.\\n\\n## Details\\n\\n* The team worked on documentation.\\n\\n* The team worked on an application layer for the Praos formalisation.\\n\\n* The team is hiring a performance engineering intern - https://apply.workable.com/io-global/j/BFEC5B0AFF/"},{"id":"2023-04-28-network","metadata":{"permalink":"/cardano-updates/2023-04-28-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-network.md","source":"@site/blog/2023-04-28-network.md","title":"Network Team Update","description":"High level summary","date":"2023-04-28T00:00:00.000Z","formattedDate":"April 28, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.21,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-04-28-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-04-28-goedel"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-27-hydra"}},"content":"## High level summary\\n\\nThe networking team has released the following packages to `Hackage`:\\n\\n* [`io-classes`],\\n* [`io-classes-mtl`]\\n* [`io-sim`],\\n* [`strict-stm`],\\n* [`strict-mvar`]\\n\\nWe published an announcement [blog post][io-sim-blog-post]. We made progress\\nalso on another blog post which will describes the design of the P2P networking\\nlayer.\\n\\nAfter moving `ouroboros-consensus` to its own repository, we made\\n`ouroboros-network` compatible with `GHC` `9.4` and `9.6`.\\n\\nWe made `cardano-client` library independent of\\n`ouroboros-consensus-diffusion`.\\n\\nWe prepared release of network packages for `cardano-node-8.0`.\\n\\n## Detailed log\\n\\n### Ouroboros-Network\\n\\n* Compatibility with `io-classes-1.1.0.0`: [ouroboros-network#4281].\\n* Compatibility with `GHC` `9.4` and `9.6`: [ouroboros-network#4527].\\n* `cardano-client` independent of `ouroboros-cosnensus-diffusion`: [ouroboros-network#4526].\\n* Release new versions of packages for `cardano-node-8.0`: [ouroboros-network#4532].\\n* Galois Inc, has been making progress towards merging [ouroboros-network#4256].\\n\\n### IO-Sim\\n\\n* `io-classes-1.0.0.0`, and following up releases: `1.0.0.1` (`ghc-9.6`\\n support), `1.1.0.0` (documentation fix).\\n* Fixed timeouts and delays in `io-sim` in a series of PRs: [io-sim#81],\\n [io-sim#82], [io-sim#86], [io-sim#87].\\n* Renamed a module: [io-sim#88].\\n* Fixed a failing `registerDelayCancellable` test: [io-sim#80].\\n* Use GitHub merge queue in `io-sim` repository.\\n* CI: download `stylish-haskell`: [io-sim#83].\\n\\n### Typed Protocols\\n\\n* Released `typed-protocols-0.1.0.4` which support `io-classes-1.1.0.0`:\\n [typed-protocols#227].\\n* Use GitHub merge queue in `typed-protocols`: [typed-protocols#30].\\n* CI: download `stylish-haskell`: [typed-protocols#29].\\n\\n\\n[`io-classes`]: https://hackage.haskell.org/package/io-classes\\n[`io-classes-mtl`]: https://hackage.haskell.org/package/io-classes-mtl\\n[`io-sim`]: https://hackage.haskell.org/package/io-sim\\n[`strict-stm`]: https://hackage.haskell.org/package/strict-stm\\n[`strict-mvar`]: https://hackage.haskell.org/package/strict-mvar\\n[io-sim-blog-post]: https://engineering.iog.io/2023-04-14-io-sim-annoucement\\n\\n[io-sim#81]: https://github.com/input-output-hk/io-sim/pull/81\\n[io-sim#82]: https://github.com/input-output-hk/io-sim/pull/82\\n[io-sim#83]: https://github.com/input-output-hk/io-sim/pull/83\\n[io-sim#86]: https://github.com/input-output-hk/io-sim/pull/86\\n[io-sim#87]: https://github.com/input-output-hk/io-sim/pull/87\\n[io-sim#88]: https://github.com/input-output-hk/io-sim/pull/88\\n[io-sim#90]: https://github.com/input-output-hk/io-sim/pull/90\\n\\n[ouroboros-network#4256]: https://github.com/input-output-hk/ouroboros-network/pull/4256\\n[ouroboros-network#4281]: https://github.com/input-output-hk/ouroboros-network/pull/4281\\n[ouroboros-network#4526]: https://github.com/input-output-hk/ouroboros-network/pull/4526\\n[ouroboros-network#4527]: https://github.com/input-output-hk/ouroboros-network/pull/4527\\n[ouroboros-network#4532]: https://github.com/input-output-hk/ouroboros-network/pull/4532\\n\\n[typed-protocols#29]: https://github.com/input-output-hk/typed-protocols/pull/29\\n[typed-protocols#30]: https://github.com/input-output-hk/typed-protocols/pull/30\\n[typed-protocols#227]: https://github.com/input-output-hk/cardano-haskell-packages/pull/227"},{"id":"2023-04-27-hydra","metadata":{"permalink":"/cardano-updates/2023-04-27-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-27-hydra.md","source":"@site/blog/2023-04-27-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-04-27T00:00:00.000Z","formattedDate":"April 27, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.11,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-04-27-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-04-28-network"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-21-hydra"}},"content":"## High-level summary\\n\\nThis week, the Hydra team held their Monthly review meeting and drafted the\\nreport which likely is published next week. They put the spec into the\\nrepository and website, addressed a user issue and fixed the TUI peer list.\\nFurthermore, they updated dependencies, conducted a Twitter space on Auctions\\nuse cases, covered the rollback bug with tests and implemented a solution.\\nLooking ahead, their goals for next week include releasing 0.10.0, implementing\\ntimed transactions support, writing a Query API ADR, and grooming work items\\nlike off-chain benchmarks.\\n\\n## What did the team achieve this week\\n\\n- Held the Monthly review meeting and drafted the report (to be published next week)\\n- Added the spec into the repository\\n [#693](https://github.com/input-output-hk/hydra/issues/693) and published on\\n [the\\n website](https://hydra.family/head-protocol/unstable/core-concepts/specification)\\n- Groom and addressed user issue [#823](https://github.com/input-output-hk/hydra/issues/823)\\n- Covered the rollback bug with tests and implemented a solution (to be reviewed) [#784](https://github.com/input-output-hk/hydra/issues/784)\\n- Fixed the TUI peer list\\n- Updated dependencies to match `cardano-node` master\\n- Conducted a twitter space on Auctions use cases\\n\\n## What are the goals of next week\\n\\n- Release 0.10.0\\n- Support timed transactions solution drafted and validated API with users\\n- Write Query API ADR and groom a concrete step\\n- Groom and solve `PostTxOnChainFailed` UX problem [#832](https://github.com/input-output-hk/hydra/issues/832)\\n- Groom off-chain benchmarks idea [#186](https://github.com/input-output-hk/hydra/issues/186) and turn it into a “feature”"},{"id":"2023-04-21-hydra","metadata":{"permalink":"/cardano-updates/2023-04-21-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-21-hydra.md","source":"@site/blog/2023-04-21-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-04-21T00:00:00.000Z","formattedDate":"April 21, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.26,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-04-21-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-27-hydra"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-04-21-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team worked on several fronts, including fixing state\\nmachine continuity on-chain, discussing voting project solutions, exploring\\nadding Hydra support to kupo, and improving API navigation with a sidebar. The\\nteam also updated dependencies and fixed issues in their test suites. Moving\\nforward, the team plans to hold the next monthly review meeting, address a user\\nissue, prepare for the 0.10.0 release, and work on a dirt road fix for the\\nrollbacks issue with proper test coverage.\\n\\n## What did the team achieve this week\\n\\n- Fixed scripts to enforce state machine continuity on-chain [#777](https://github.com/input-output-hk/hydra/pull/777).\\n- Took part in a twitter space on [“Scaling Cardano”](https://twitter.com/thepizzaknight_/status/1647833904282320896).\\n- Joined a CBIA meeting to discuss Cardano network protocols & how to specify them.\\n- Discussed potential solutions of ensuring vote uniqueness in the voting project.\\n- Updated dependencies to match `cardano-node` master to prepare for upcoming releases and hard-forks\\n- Explored adding Hydra [support to kupo](https://github.com/CardanoSolutions/kupo/pull/117), a lightweight Cardano chain indexer - some more work required.\\n- Improved navigation of the API Reference with a sidebar, see [unstable API version](https://hydra.family/head-protocol/unstable/api-reference/).\\n- Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)\\n\\n## What are the goals of next week\\n\\n- Monthly review meeting (join via [Discord](https://discord.gg/inputoutput?event=1097863746216538194) or [AddEvent](https://www.addevent.com/event/ck16794110)) & report\\n- Dirt road fix for rollbacks [#784](https://github.com/input-output-hk/hydra/issues/784) properly covered by a test.\\n- Groom and ideally address user issue [#823](https://github.com/input-output-hk/hydra/issues/823).\\n- Put the spec into the repo [#693](https://github.com/input-output-hk/hydra/issues/693) and prepare release 0.10.0."},{"id":"2023-04-21-ledger","metadata":{"permalink":"/cardano-updates/2023-04-21-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-21-ledger.md","source":"@site/blog/2023-04-21-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-04-21T00:00:00.000Z","formattedDate":"April 21, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":0.905,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-04-21-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-21-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-04-20-mithril"}},"content":"## High level summary\\n\\nWe continued to make progress on CIP-1694 and the conway ledger era.\\nIn particular, the conway era now supports Plutus V3.\\nFinally, we made small improvements to the ledger API and now host\\nour Haskell code documentation (haddocks) on github pages.\\n\\n\\n## Low level summary\\n\\n### Conway ledger era\\n\\n* [[pull-3365]] - Support for Plutus V3.\\n* [[pull-3368]] - Conway genesis fix.\\n* [[pull-3369]] - Added some governance ledger state.\\n* [[pull-3372]] - Work on the conway delegation certificates.\\n* [[pull-3384]] - Rename.\\n\\n### Haddocks hosted on github pages\\n\\n* [[pull-3385]] \\n\\n### Small improvements to the API\\n\\n* [[pull-3366]]\\n\\n### Technical Debt\\n\\n* [[pull-3367]] Fix cost model json instances.\\n* [[pull-3371]] UMap cleanup.\\n* [[pull-3373]] Upgrade to ghc 9.2.7 and cabal 3.10.1.\\n* [[pull-3375]] Sadly, we had to revert the `TICKF` optimizations. There was a regression we do not yet understand.\\n* [[pull-3377]] Fix cabal warnings.\\n* [[pull-3383]] Fix multi-asset test.\\n\\n[pull-3365]: https://github.com/input-output-hk/cardano-ledger/pull/3365\\n[pull-3366]: https://github.com/input-output-hk/cardano-ledger/pull/3366\\n[pull-3367]: https://github.com/input-output-hk/cardano-ledger/pull/3367\\n[pull-3368]: https://github.com/input-output-hk/cardano-ledger/pull/3368\\n[pull-3369]: https://github.com/input-output-hk/cardano-ledger/pull/3369\\n[pull-3371]: https://github.com/input-output-hk/cardano-ledger/pull/3371\\n[pull-3372]: https://github.com/input-output-hk/cardano-ledger/pull/3372\\n[pull-3373]: https://github.com/input-output-hk/cardano-ledger/pull/3373\\n[pull-3375]: https://github.com/input-output-hk/cardano-ledger/pull/3375\\n[pull-3377]: https://github.com/input-output-hk/cardano-ledger/pull/3377\\n[pull-3383]: https://github.com/input-output-hk/cardano-ledger/pull/3383\\n[pull-3384]: https://github.com/input-output-hk/cardano-ledger/pull/3384\\n[pull-3385]: https://github.com/input-output-hk/cardano-ledger/pull/3385"},{"id":"2023-04-20-mithril","metadata":{"permalink":"/cardano-updates/2023-04-20-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-20-mithril.md","source":"@site/blog/2023-04-20-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-04-20T00:00:00.000Z","formattedDate":"April 20, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.245,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-04-20-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-04-21-ledger"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-04-20-node-cli-api"}},"content":"## High level overview\\nThe Mithril team released a new [`2315.0`](https://github.com/input-output-hk/mithril/releases/tag/2315.0) distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures.\\n\\nFinally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network.\\n\\n\\n## Low level overview\\n- Released the new distribution [`2315.0`](https://github.com/input-output-hk/mithril/releases/tag/2315.0)\\n- Completed the epic that implements a relational store in the aggregator [#779](https://github.com/input-output-hk/mithril/issues/779):\\n - Completed the migration/adaptation of the `signed_entity` table [#816](https://github.com/input-output-hk/mithril/issues/816)\\n - Completed the creation of the `signer` table [#814](https://github.com/input-output-hk/mithril/issues/814)\\n - Completed the migration/adaptation of the `single_signature` table [#829](https://github.com/input-output-hk/mithril/issues/829)\\n- Worked on the epic that designs and implement generic signing/verification of entity services [#780](https://github.com/input-output-hk/mithril/issues/780):\\n - Completed the definition of the interface of the generic entity service for signing [#847](https://github.com/input-output-hk/mithril/issues/847)\\n - Worked on the implementation of the `Certifier` service in the aggregator [#850](https://github.com/input-output-hk/mithril/issues/850)\\n - Completed the extension of the `SignedEntityType` type [#848](https://github.com/input-output-hk/mithril/issues/848)\\n - Completed the implementation of the `Tick` service in the aggregator [#849](https://github.com/input-output-hk/mithril/issues/849)\\n - Worked on implementing the signable builder for the `Mithril Stake Distribution` [#851](https://github.com/input-output-hk/mithril/issues/851)"},{"id":"2023-04-20-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-04-20-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-20-node-cli-api.md","source":"@site/blog/2023-04-20-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-04-20T00:00:00.000Z","formattedDate":"April 20, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":0.4,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-04-20-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-04-20-mithril"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-04-19-consensus"}},"content":"# 2023-04-20 - 2023-05-04\\n\\n## High level summary\\n- Various fixes and improvements\\n\\n### docs\\n\\n### CI & project maintenance\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Modify golden test functions to automatically create parent directories](https://github.com/input-output-hk/cardano-node/pull/5136) \\n- [SPO on-chain poll commands adjustments](https://github.com/input-output-hk/cardano-node/pull/5132) \\n- [New environment variable CARDANO_NODE_NETWORK_ID](https://github.com/input-output-hk/cardano-node/pull/5119) \\n\\n### cardano-api\\n- [`--out-file` option for governance commands](https://github.com/input-output-hk/cardano-node/pull/5172) \\n- [UTC Time to slots conversion function](https://github.com/input-output-hk/cardano-node/pull/5130) \\n\\n### cardano-node\\n- [Update CHaP to get latest ledger with performance fix](https://github.com/input-output-hk/cardano-node/pull/5157) \\n- [Integration with Peer Sharing](https://github.com/input-output-hk/cardano-node/pull/4854) \\n\\n### cardano-testnet"},{"id":"2023-04-19-consensus","metadata":{"permalink":"/cardano-updates/2023-04-19-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-19-consensus.md","source":"@site/blog/2023-04-19-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-04-19T00:00:00.000Z","formattedDate":"April 19, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.77,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-04-19-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-04-20-node-cli-api"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-04-19-performance-and-tracing"}},"content":"## High level summary\\n\\nThis week the consensus team continued working on the improved DB lock mechanism\\nfor UTxO-HD, and modifications to the mempool benchmarks that this prototype\\nrequires.\\n\\nOn the Genesis front we validated that the fragment size calculation in\\n`BlockFetch` is a major performance sink for ChainSync Jumping. By removing it\\nwe will get performance that is acceptably close to that of the baseline. We\\nalso started investigating a performance fix that does not alter the existing\\nbaseline behavior too much. In addition we reviewed our Genesis attack vector\\ncalculations.\\n\\nOn the support front we released Consensus 0.4, and we are working on improving\\nour release process, to support the Cardano-wide efforts in this area. We also\\nperformed an analysis on the number of file descriptors that consensus use. This\\ninformation can be used by the node operators to check if the number of file\\ndescriptors they want to support are enough."},{"id":"2023-04-19-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-04-19-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-19-performance-and-tracing.md","source":"@site/blog/2023-04-19-performance-and-tracing.md","title":"Performance & tracing update","description":"* Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.","date":"2023-04-19T00:00:00.000Z","formattedDate":"April 19, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.575,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-04-19-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-04-19-consensus"},"nextItem":{"title":"Incident Report","permalink":"/cardano-updates/2023-04-17-ledger"}},"content":"* Benchmarking: We performed a series of benchmarks aimed at the new `8.0` release branch and built a timeline from the `1.35` releases to that branch.\\n* New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois.\\n* Analysis pipeline: We\'re working on automatically obtaining a detailed manifest for each run.\\n* Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we\'ve laid the ground for including GHC profiling data into our workbench.\\n* Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.\\n \\n# Benchmarking\\n\\nWe have performed various cluster runs targeting the `8.0` release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile `epoch-transition` for local reproduction of what we observed on the benchmarking cluster. \\n\\nFurthermore, we bridged the gap between the run data from the `1.35.x` releases to the the new `8.0.x` release branch. This included walking the\\n`master` branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial\\nin locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of\\nbenchmarks.\\n\\n# Tracing\\n\\nIn-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still\\nongoing. \\n\\nIn coordination with Galois, who are developing a system assurance service by observing a number of `cardano-node`s, we\'re working with the implementation\\nof data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational\\nburden inside the node needs to be kept to an absolute minimum. We\'re currently in ideation about whether `cardano-tracer` could be extended with a richer\\nfeature set to that end.\\n\\n# Infrastructure & Analysis\\n\\n### Detailed manifest\\nA run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with.\\nThese dependencies come from different package sources, have different versioning policies, and an identical package version might provide different\\nperformance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated\\nby making all component bumps visible and accessible.\\n\\n### GHC profiling inside workbench\\nThe workbench has been equipped with a new `-profnix` profile flavour. This enforces a `-fprof-auto` build for all node-related packages. The type of\\nprofiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already\\nbeen merged to `master`.\\n\\n### Nomad backend\\nThe added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances.\\nThis results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing."},{"id":"2023-04-17-ledger","metadata":{"permalink":"/cardano-updates/2023-04-17-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-17-incident.md","source":"@site/blog/2023-04-17-incident.md","title":"Incident Report","description":"Incident reporting: Cardano block production temporary outage","date":"2023-04-17T00:00:00.000Z","formattedDate":"April 17, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.38,"hasTruncateMarker":false,"authors":[{"name":"Kevin Hammond","title":"Head of Software Engineering, Cardano Core","url":"https://github.com/kevinhammond","imageURL":"https://github.com/kevinhammond.png","key":"kevinhammond"}],"frontMatter":{"title":"Incident Report","slug":"2023-04-17-ledger","authors":"kevinhammond","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-04-19-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-04-14-goedel"}},"content":"## Incident reporting: Cardano block production temporary outage\\n\\nOn Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a \u2018critical\u2019 incident, thus warranting immediate response and investigation by IOG engineers.\\nThe investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue \u2013 a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite. \\nFollowing successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version.\\nWith the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue.\\n\\n### Further Details\\n\\nYou can read more details on the incident and how it was managed from SundaeSwap\u2019s Pi Lanningham [here](https://www.314pool.com/post/cardano-post-mortem-1). Thanks again to all the community for its support in identifying and fixing this bug."},{"id":"2023-04-14-goedel","metadata":{"permalink":"/cardano-updates/2023-04-14-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-14-goedel.md","source":"@site/blog/2023-04-14-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-04-14T00:00:00.000Z","formattedDate":"April 14, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.415,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-04-14-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Incident Report","permalink":"/cardano-updates/2023-04-17-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-14-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has submitted two papers for publication, carried\\nout consultancy with other teams and has an opening for an intern.\\n\\n## Details\\n\\n* Finalised and submitted two papers to ICE 2023\\n\\n* Studying Praos paper.\\n\\n* The team is hiring a performance engineering intern - https://apply.workable.com/io-global/j/BFEC5B0AFF/\\n\\n* Design exploration for congestion management."},{"id":"2023-04-14-hydra","metadata":{"permalink":"/cardano-updates/2023-04-14-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-14-hydra.md","source":"@site/blog/2023-04-14-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-04-14T00:00:00.000Z","formattedDate":"April 14, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.98,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-04-14-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-04-14-goedel"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-07-hydra"}},"content":"## High-level summary\\n\\nThis week, the Hydra team focused on improving the smoke test, fixing developer\\ntooling, and improving the API for voting use cases. They reviewed progress on\\nauction, payments, and voting projects and made worked on reproducing a bug with\\nhandling rollbacks. Moving forward, the team plans to update dependencies,\\nimplement a dirt road fix for the rollbacks bug, and explore adding Hydra\\nsupport to kupo.\\n\\n## What did the team achieve this week\\n\\n- Reviewed progress on auction, payments and voting projects\\n- Improved smoke tests so they can run on mainnet\\n- Fixed a regression in the development environment and updated cardano-node\\n used in tests\\n- Improved API with more configurability to unblock voting use case\\n - Exclude utxo in `SnapshotConfirmed` outputs [#808](https://github.com/input-output-hk/hydra/pull/808)\\n - Addressed a user request by only sending `Greetings` once [#813](https://github.com/input-output-hk/hydra/issues/813)\\n- Reproduced the rollback bug by improving our model-based test suite [#784](https://github.com/input-output-hk/hydra/issues/784)\\n\\n## What are the goals of next week\\n\\n- Update dependencies to match `cardano-node` master\\n- Dirt road fix for rollbacks [#784](https://github.com/input-output-hk/hydra/issues/784)\\n- Update Hydraw to maintain state locally\\n- Explore adding Hydra support to kupo\\n- Put disclaimer texts and closing mainnet compatibility feature [#713](https://github.com/input-output-hk/hydra/issues/713)"},{"id":"2023-04-07-hydra","metadata":{"permalink":"/cardano-updates/2023-04-07-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-07-hydra.md","source":"@site/blog/2023-04-07-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-04-07T00:00:00.000Z","formattedDate":"April 7, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.875,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-04-07-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-14-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-04-06-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team published the monthly report for March, created\\nseparate links for different versions of documentation, and clarified potential\\nsolutions for the Rollbacks bug. The team also discussed Query API requests for\\nthe Hydra Voting project and met with community members to answer questions\\nabout Hydra. Moving forward, the team plans to integrate the specification into\\nthe repository, implement a short-term fix for the Rollbacks issue, and draft a\\nQuery API ADR.\\n\\n## What did the team achieve this week\\n\\n- Published monthly reports on [website](https://hydra.family/head-protocol/monthly/2023-03)\\n- Separate last released and latest versions of docs (e.g. normal [released](https://hydra.family/head-protocol/core-concepts/behavior/#replay-of-past-server-outputs) vs. [/unstable](https://hydra.family/head-protocol/unstable/core-concepts/behavior/#replay-of-past-server-outputs))\\n- Discussed Query API concerns from Hydra Voting project ([link](https://github.com/input-output-hk/hydra/discussions/797))\\n- Clarified rollbacks bug and defined possible solutions (short and long term) [#784](https://github.com/input-output-hk/hydra/issues/784)\\n- Met with community members to answer questions about Hydra\\n\\n## What are the goals of next week\\n\\n- Finally get the docs integrated into the repository [#693](https://github.com/input-output-hk/hydra/issues/693)\\n- Dirt road fix for rollbacks [#784](https://github.com/input-output-hk/hydra/issues/784)\\n- Disclaimer text and detail known issues about mainnet compatibility\\n [#713](https://github.com/input-output-hk/hydra/issues/713)"},{"id":"2023-04-06-mithril","metadata":{"permalink":"/cardano-updates/2023-04-06-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-06-mithril.md","source":"@site/blog/2023-04-06-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-04-06T00:00:00.000Z","formattedDate":"April 6, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.075,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-04-06-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-04-07-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-04-05-consensus"}},"content":"## High level overview\\nThe Mithril team released a new [`2313.0`](https://github.com/input-output-hk/mithril/releases/tag/2313.0) distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages.\\n\\nFinally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to `1.35.6`.\\n\\n## Low level overview\\n- Released the new distribution [`2313.0`](https://github.com/input-output-hk/mithril/releases/tag/2313.0)\\n- Worked on the epic that implements a relational store in the aggregator [#779](https://github.com/input-output-hk/mithril/issues/779):\\n - Completed the migration/adaptation of the `epoch_settings` table [#813](https://github.com/input-output-hk/mithril/issues/813)\\n - Completed the migration/adaptation of the `signed-entity-type` table [#815](https://github.com/input-output-hk/mithril/issues/815)\\n - Completed the migration/adaptation of the `certificate` table [#817](https://github.com/input-output-hk/mithril/issues/817)\\n - Completed the migration/adaptation of the `open_message` table [#827](https://github.com/input-output-hk/mithril/issues/827)\\n - Completed the migration/adaptation of the `signer_registration` table [#828](https://github.com/input-output-hk/mithril/issues/828)\\n- Completed the refactoring of the dependency injection of the aggregator [#823](https://github.com/input-output-hk/mithril/issues/823)\\n- Completed the cleanup of the multi-signer of the aggregator [#824](https://github.com/input-output-hk/mithril/issues/824)\\n- Completed the upgrade of the Cardano node to `1.35.6` [#843](https://github.com/input-output-hk/mithril/issues/843)"},{"id":"2023-04-05-consensus","metadata":{"permalink":"/cardano-updates/2023-04-05-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-consensus.md","source":"@site/blog/2023-04-05-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-04-05T00:00:00.000Z","formattedDate":"April 5, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.66,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-04-05-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-04-06-mithril"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-04-05-node-cli-api"}},"content":"## High level summary\\n\\nThis week the consensus team finished the UTxO-HD prototype refactoring. We are\\nnow working on improving the DB lock mechanism to improve performance. We also\\nintroduced several improvements to the file system abstraction and simulation\\nlayer (`fs-sim`), which culminated in the release of `fs-sim-0.1.0.0` and\\n`fs-api-0.1.0.0` to `CHaP`.\\n\\nOn the Genesis front we distributed the updated Genesis design document,\\nsoliciting feedback from Networking Team and IOG Researchers. We also opened up\\na PR for the adversarial leader schedule `QuickCheck` generator, which is being\\nreviewed.\\n\\nOn the support front, we got a new Consensus version that can use different\\nfundamental VRF crypto primitives for Babbage and Conway eras.\\n\\nOn the tech debt front we fixed an bug in the followers logic, which was\\ndiscovered by our `QuickCheck` property tests."},{"id":"2023-04-05-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-04-05-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-node-cli-api.md","source":"@site/blog/2023-04-05-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-04-05T00:00:00.000Z","formattedDate":"April 5, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.315,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-04-05-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-04-05-consensus"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-04-05-performance-and-tracing"}},"content":"# 2023-04-05 - 2023-04-19\\n\\n## High level summary\\n- Introduce new governance commands create, answer and verify. This allows us to have onchain polls.\\n- Begin making changes in cardano-api to accomodate for CIP-1694\\n- Rename `TestEnableDevelopmentHardForkEras` to `ExperimentalHardForksEnabled` and `TestEnableDevelopmentNetworkProtocols` to `ExperimentalProtocolsEnabled`\\n- Various bug fixes and improvements \\n\\n### docs\\n\\n### CI & project maintenance\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Add new interim governance commands: {create, answer, verify}-poll](https://github.com/input-output-hk/cardano-node/pull/5112) \\n- [Remove --stake-address option from stake-address build](https://github.com/input-output-hk/cardano-node/pull/5061) \\n- [Frozen callstack for checkTextEnvelopeFormat function](https://github.com/input-output-hk/cardano-node/pull/5059) \\n- [#5052 Remove reading protocol parameters from Shelley genesis file](https://github.com/input-output-hk/cardano-node/pull/5053) \\n- [Move parsers to reusable location](https://github.com/input-output-hk/cardano-node/pull/5046) \\n- [New --socket-path cli option](https://github.com/input-output-hk/cardano-node/pull/4910) \\n\\n### cardano-api\\n- [CIP-1694 make space for DRep certificates](https://github.com/input-output-hk/cardano-node/pull/5108) \\n- [File type to track the content and direction of files](https://github.com/input-output-hk/cardano-node/pull/5105) \\n- [Fix import warning](https://github.com/input-output-hk/cardano-node/pull/5087) \\n- [Expose UsingRawBytes et al types](https://github.com/input-output-hk/cardano-node/pull/5086) \\n- [Expose SerialiseAsRawBytesError in Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/5085) \\n- [Introduce new AnyShelleyBasedEra type and simplify CDDL tests.](https://github.com/input-output-hk/cardano-node/pull/5072) \\n- [New genCardanoKeyWitness function](https://github.com/input-output-hk/cardano-node/pull/5071) \\n- [Replace roundtripCBOR with trippingCbor](https://github.com/input-output-hk/cardano-node/pull/5069) \\n- [Remove non-round-trippable value TxInsReferenceNone for babbage onwards in generator](https://github.com/input-output-hk/cardano-node/pull/5064) \\n- [Improve roundtrip functions to report annotations on callsite](https://github.com/input-output-hk/cardano-node/pull/5063) \\n- [Define Functor instance for FileError](https://github.com/input-output-hk/cardano-node/pull/5057) \\n- [Split serialisation from IO](https://github.com/input-output-hk/cardano-node/pull/5049) \\n\\n### cardano-node\\n- [Master build failure fixes](https://github.com/input-output-hk/cardano-node/pull/5115) \\n- [Allow renamed fields to exist if values the same](https://github.com/input-output-hk/cardano-node/pull/5106) \\n- [workbench: updates](https://github.com/input-output-hk/cardano-node/pull/5091) \\n- [Delete duplicate packages sort packages and imports](https://github.com/input-output-hk/cardano-node/pull/5084) \\n- [Rename TestEnableDevelopmentHardForkEras and TestEnableDevelopmentNetworkProtocols](https://github.com/input-output-hk/cardano-node/pull/4341) \\n\\n### cardano-testnet\\n- [Additional check for not-leader slots in LeadershipSchedule tests](https://github.com/input-output-hk/cardano-node/pull/5110) \\n- [Fix epochLength and securityParam to conform to the formula 10 * k / f](https://github.com/input-output-hk/cardano-node/pull/5099) \\n- [Ergonomic directory creation code in tests](https://github.com/input-output-hk/cardano-node/pull/5083) \\n- [Default Cardano.Testnet to NodeLoggingFormatAsJson](https://github.com/input-output-hk/cardano-node/pull/5036) \\n- [Integrate latest ledger dependencies](https://github.com/input-output-hk/cardano-node/pull/5013)"},{"id":"2023-04-05-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-04-05-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-performance-and-tracing.md","source":"@site/blog/2023-04-05-performance-and-tracing.md","title":"Performance & tracing update","description":"* Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.","date":"2023-04-05T00:00:00.000Z","formattedDate":"April 5, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.33,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-04-05-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-04-05-node-cli-api"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-03-31-crypto"}},"content":"* Benchmarking: We worked on adjusting our infrastructure to the new `8.0` release branch and performed a (very) early run.\\n* New tracing: We\'re profiling the new tracing system for minimizing its resource footprint and guarantee high throughput.\\n* Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged.\\n* Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added.\\n* Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.\\n \\n# Benchmarking\\n\\nWe have adapted our benchmarking cluster to the requirements of the `8.0` release branch. Testing runs of a very early feature branch for `8.0`\\nhelped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for `8.0` soon.\\n\\n# Tracing\\n\\nAnalysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very\\ndetailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing\\nthe highest possible throughput of data for forwarding to `cardano-tracer`. \\n\\nAdditionally, we\'ve worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions\\nfor tunneling trace forwarding from a node to `cardano-tracer` via an easy to manage system service, which will match the production setup of most users.\\n\\n# Infrastructure & Analysis\\n\\n### General\\nVariance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance\\nanalysis can be fed back and serve as an additional point of comparison.\\n\\nFurthermore, we\'ve created a profile family for the workbench that\'s specifically aimed at measuring and comparing tracing system configurations.\\n\\n### Plutus library\\nWe opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles.\\nThis will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile.\\nIt is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit.\\n\\n### Nomad backend\\nThe nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is\\nbeing improved to minimize any friction for the backend user."},{"id":"2023-03-31-crypto","metadata":{"permalink":"/cardano-updates/2023-03-31-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-crypto.md","source":"@site/blog/2023-03-31-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-03-31T00:00:00.000Z","formattedDate":"March 31, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.105,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-03-31-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-04-05-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-03-31-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Mithril: Started looking into full-node verifier\\n* cardano-base: BLS12-381\'s PR merged. Creating test-vectors for verifying basic pairing properties.\\n* KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent. \\n* Sidechains: Included BLS12-381 & JubJub to halo2curves\\n* MuSig2: Final modifs to C version.\\n## Low level summary\\n### Mithril\\n* Started designing how a full-node verifier would work. Issue comming in the next couple of weeks. \\n### cardano-base\\n* BLS12-381 branch merged [PR#266](https://github.com/input-output-hk/cardano-base/pull/266). \\n* Testing strategy for BLS bindings:\\n * Test-vectors for Groth16, and simple BLS signatures ready.\\n * Test-vectors with different library, and created by different engineer. \\n### KES agent\\n* Resolved issues of circular dependency\\n* Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same. \\n* Opened a PR for raw bearer branch in ouroboros network [PR4395](https://github.com/input-output-hk/ouroboros-network/pull/4395)\\n* Resolved a bug where the agent node did not properly closed connections\\n* Updated version of [IOSim](https://github.com/input-output-hk/io-sim/pull/70) allowed us to finish a first version of KES agent.\\n### Sidechains\\n* Included [BLS12-381](https://github.com/iquerejeta/halo2curves/commit/1ccf987b772dcfaa3c1e3439a4a28f23fcf07c7a) curve to our branch of halo2curves\\n* Included [JubJub](https://github.com/iquerejeta/halo2curves/commit/3f20edb2ed112733a0a0986b0a0386c1b9bc439f) to our branch of halo2curves \\n### MuSig2\\n* Minor reorg [PR#42](https://github.com/input-output-hk/musig2/pull/42)\\n* Started including fuzz testing for deserialisation [PR#](https://github.com/input-output-hk/musig2/pull/43)"},{"id":"2023-03-31-goedel","metadata":{"permalink":"/cardano-updates/2023-03-31-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-goedel.md","source":"@site/blog/2023-03-31-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-03-31T00:00:00.000Z","formattedDate":"March 31, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.455,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-03-31-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-03-31-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-31-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has been working on final drafts of two papers\\nfor internal review and planning next steps of analysis of consensus\\ndesign refiniments.\\n\\n## Details\\n\\n* Preparing final draft of DeltaQSD algebra paper for internal review\\n\\n* Preparing final draft of verifying design refinements for\\n distributed system design for internal review\\n\\n* Planning next phase of consensus design refinement analysis"},{"id":"2023-03-31-hydra","metadata":{"permalink":"/cardano-updates/2023-03-31-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-hydra.md","source":"@site/blog/2023-03-31-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-03-31T00:00:00.000Z","formattedDate":"March 31, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.82,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-03-31-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-03-31-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-03-31-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra continued work on finishing mainnet compatibility. The\\nsemi-automated smoke tests and some missing documentation is still preventing\\nfrom calling that fully done. They fixed smaller issues and made a step in the\\nHead protocol more robust. Besides development, they met with interested people\\nfrom the community who want to get started collaborating on communication and\\nmarketing materials.\\n\\n## What did the team achieve this week\\n\\n- Groomed and followed-up on `GetUTxO` user request discussion [#797](https://github.com/input-output-hk/hydra/discussions/797)\\n- Fixed `hydra-node` crashes after forks [#560](https://github.com/input-output-hk/hydra/issues/560)\\n- Made `collectCom` more robust and aligned with spec [#786](https://github.com/input-output-hk/hydra/pull/786)\\n- Completed configurable API feature [#380](https://github.com/input-output-hk/hydra/issues/380)\\n- Met potential contributors about Hydra communication and marketing materials\\n- Versioned documentation: we have a `unstable` bleeding edge version available as well now, seperate from the last released version\\n\\n## What are the goals of next week\\n\\n- Follow-up backlog and roadmap clean-up\\n- Complete mainnet compatibility feature [#713](https://github.com/input-output-hk/hydra/issues/713) (documentation updates)\\n- Integrate Hydra specification into repository [#693](https://github.com/input-output-hk/hydra/issues/693)"},{"id":"2023-03-31-ledger","metadata":{"permalink":"/cardano-updates/2023-03-31-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-ledger.md","source":"@site/blog/2023-03-31-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-03-31T00:00:00.000Z","formattedDate":"March 31, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.97,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-03-31-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-31-hydra"},"nextItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2023-03-27-system-test"}},"content":"## High level summary\\n\\nWe are still heavily involved in work related to preparing the next release.\\nThe other main thing we have worked on is experimentation about how we will\\nhandle the DRep stake distribution for CIP-1694 in the conway ledger era.\\nLastly, we merged a fix for\\n[node-4826](https://github.com/input-output-hk/cardano-node/issues/4826)\\ninto our main branch (there will be a post-mortem shortly).\\n\\n## Low level summary\\n\\n### Support for the next release\\n\\n* [pull-3363] - Fix problems relating to Arbitrary instances used by consensus.\\n* [pull-3361] - Remove the alonze genesis from the conway genesis.\\n* [pull-3360] - Translate bad pointer addresses to valid ones in conway.\\n* [pull-3357] - Fix a bug relating to zero valued ADA in the script context.\\n* [pull-3356] - Added needed instances (Arbitrary and Serialization) for conway integration.\\n* [pull-3345] - Added helper functions for the CLI.\\n* [pull-3342] - Fix a bug with a CLI helper function (having to do with deposit tracking).\\n\\n### Experiments for DRep stake distribution\\n\\nAdding another stake distribution to the ledger state presents some new challenges.\\nWe would like to be able to use the current stake distribution at the epoch boundary\\nfor DRep voting so that people can always vote themselves in time for any proposal.\\nTo this end, we have a prototype of an incremental computation based on the incremental\\nlambda calculus, together with tests and benchmarks (which are very promising).\\nSee [pull-3344].\\n\\nAdditionally, more of the ledger state is going to need to be rearranged to accomodate\\nthe new incremental computations.\\nWe have two draft PRs up for possibles solution.\\nSee [pull-3353] and [pull-3364].\\n\\n### Technical debt and bug fixes\\n\\n* [pull-3343] - A fix [node-4826](https://github.com/input-output-hk/cardano-node/issues/4826).\\n* [pull-3333] - Moving more code out of the shelley packages. \\n* [pull-3347] - Bug fix for the multi-asset generators.\\n* [pull-3341] - Removal of code duplication.\\n\\n### Documentation changes\\n\\n* [pull-3354] - Rename \\"optional datums\\" with \\"supplemental datums\\" in the alonzo spec.\\n* [pull-3352] - Add a section to the Shelly errata about the individual deposit tracking.\\n* [pull-3351] - Further clarify the details regarding the script integrity hash.\\n* [pull-3350] - Some cleanup of the Babbage spec.\\n\\n\\n[pull-3363]: https://github.com/input-output-hk/cardano-ledger/pull/3363\\n[pull-3361]: https://github.com/input-output-hk/cardano-ledger/pull/3361\\n[pull-3360]: https://github.com/input-output-hk/cardano-ledger/pull/3360\\n[pull-3357]: https://github.com/input-output-hk/cardano-ledger/pull/3357\\n[pull-3356]: https://github.com/input-output-hk/cardano-ledger/pull/3356\\n[pull-3345]: https://github.com/input-output-hk/cardano-ledger/pull/3345\\n[pull-3342]: https://github.com/input-output-hk/cardano-ledger/pull/3342\\n[pull-3344]: https://github.com/input-output-hk/cardano-ledger/pull/3344\\n[pull-3353]: https://github.com/input-output-hk/cardano-ledger/pull/3353\\n[pull-3364]: https://github.com/input-output-hk/cardano-ledger/pull/3364\\n[pull-3343]: https://github.com/input-output-hk/cardano-ledger/pull/3343\\n[pull-3333]: https://github.com/input-output-hk/cardano-ledger/pull/3333\\n[pull-3347]: https://github.com/input-output-hk/cardano-ledger/pull/3347\\n[pull-3341]: https://github.com/input-output-hk/cardano-ledger/pull/3341\\n[pull-3354]: https://github.com/input-output-hk/cardano-ledger/pull/3354\\n[pull-3352]: https://github.com/input-output-hk/cardano-ledger/pull/3352\\n[pull-3351]: https://github.com/input-output-hk/cardano-ledger/pull/3351\\n[pull-3350]: https://github.com/input-output-hk/cardano-ledger/pull/3350"},{"id":"2023-03-27-system-test","metadata":{"permalink":"/cardano-updates/2023-03-27-system-test","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-27-system-test.md","source":"@site/blog/2023-03-27-system-test.md","title":"System Test Team Update","description":"High level summary","date":"2023-03-27T00:00:00.000Z","formattedDate":"March 27, 2023","tags":[{"label":"system-test","permalink":"/cardano-updates/tags/system-test"}],"readingTime":0.785,"hasTruncateMarker":false,"authors":[{"name":"Martin Kourim","title":"System Test Engineer","url":"https://github.com/mkoura","imageURL":"https://github.com/mkoura.png","key":"mkoura"}],"frontMatter":{"title":"System Test Team Update","slug":"2023-03-27-system-test","authors":"mkoura","tags":["system-test"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-03-31-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-24-hydra"}},"content":"## High level summary\\nSince the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the _1.35.5_ and _1.35.6_ releases (and their predecessing release candidates) and ran tests on branch with the _UTxO-HD_ functionality.\\n\\n## Workstreams\\n\\n### Framework improvements:\\n- improvements in searching for unexpected error messages in log files during test run\\n- added support for UTxO-HD testing\\n- added support for the new P2P topology format\\n- added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)\\n- added preliminary support for the Conway era\\n- added support for running tests on the _Preview_ testnet\\n\\n[Full list of closed PRs](https://github.com/input-output-hk/cardano-node-tests/pulls?q=is%3Apr+is%3Aclosed+updated%3A2023-01-13..2023-03-26)\\n\\n### Node:\\n- ran tests on node branch with the UTxO-HD functionality\\n- tested the [1.35.5](https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_5.html) release\\n- tested the [1.35.6](https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_6.html) release\\n\\n### DB-Sync:\\n- improvements in db-sync sync tests\\n- improvements in db-sync functional tests"},{"id":"2023-03-24-hydra","metadata":{"permalink":"/cardano-updates/2023-03-24-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-24-hydra.md","source":"@site/blog/2023-03-24-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-03-24T00:00:00.000Z","formattedDate":"March 24, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.95,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-03-24-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2023-03-27-system-test"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-03-23-db-sync"}},"content":"## High-level summary\\n\\nThis week, the Hydra had a team workshop and conducted the monthly review\\nmeeting for March. They demonstrated a Hydra Head on mainnet, which was running\\nthe hydraw demo application. While this marks an important milestone, they also\\nemphasized that more features are still to be added as needed for applications\\nto run on Hydra. Besides this, the roadmap is getting cleaned up to encourage\\ndiscussions and provide more space for user requests.\\n\\n## What did the team achieve this week\\n\\n- Monthly review meeting [slides](https://docs.google.com/presentation/d/1yZ4AqUQ8OBMG9ARMYvj3IOjaIAqglf7kZei4vsLMrbs/edit#slide=id.g1f87a7454a5_0_1392)/[recording](https://drive.google.com/file/d/1krzM8VN-gpKTtpVdC2JQx-lGti-4gKQS/view?ts=641b3c1c), full report of March next week\\n - Opened a head on mainnet with hydraw demonstration\\n - Hydra pay updates\\n- Team workshop in Austria\\n - Hydra presentation at the Cardano Foundation in Zurich\\n - In-person grooming session, marked many items as candidates to be rather :idea: dicussions\\n - Improved head protocol [#786](https://github.com/input-output-hk/hydra/pull/786) and investigated a potential bug in rollback handling [#784](https://github.com/input-output-hk/hydra/issues/784)\\n - Team building and retrospective\\n\\n## What are the goals of next week\\n\\n- Follow-up on backlog and roadmap clean-up\\n- Complete mainnet compatibility feature (documentation updates)\\n- Make API more configurable [#380](https://github.com/input-output-hk/hydra/issues/380)\\n- Integrate Hydra specification into repository [#693](https://github.com/input-output-hk/hydra/issues/693)"},{"id":"2023-03-23-db-sync","metadata":{"permalink":"/cardano-updates/2023-03-23-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-23-db-sync.md","source":"@site/blog/2023-03-23-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-03-23T00:00:00.000Z","formattedDate":"March 23, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.755,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-03-23-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-24-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-03-23-mithril"}},"content":"## High level summary\\n\\nThe DBSync team worked in performance enhancements issues, on providing new db-sync options and on\\ntechnical debt and bug fixing. The DBSync team also on boarded a new member.\\n\\n## Low level summary\\n- Worked on an issue which causes `ada_pots` tables to include the values related not only to an\\nepoch, but also the first epoch of the last epoch.\\n[#1367](https://github.com/input-output-hk/cardano-db-sync/pull/1367)\\n- Fixed an issue where the `epoch` table didn\'t rollback and caused wrong values\\n[#1370](https://github.com/input-output-hk/cardano-db-sync/pull/1370)\\n- Fixed an issue were users with `disable-ledger` option had to provide the state dir option, even\\nthough it was never used. Also refactored the no ledger part of the codebase.\\n[#1378](https://github.com/input-output-hk/cardano-db-sync/pull/1378)\\n- Improved the perforance by using the cache more. Also provided many new options which enables or\\ndisables parts of db-sync. In addition a new `--turbo` mode is enables which allows db-sync to sync\\nmainnet in hours.\\n[#1379](https://github.com/input-output-hk/cardano-db-sync/pull/1379)"},{"id":"2023-03-23-mithril","metadata":{"permalink":"/cardano-updates/2023-03-23-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-23-mithril.md","source":"@site/blog/2023-03-23-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-03-23T00:00:00.000Z","formattedDate":"March 23, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.615,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-03-23-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-03-23-db-sync"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-03-22-consensus"}},"content":"## High level overview\\nThe Mithril team released a new [`2310.0`](https://github.com/input-output-hk/mithril/releases/tag/2310.0) distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images.\\n\\nFinally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano `mainnet` and they have fixed some bugs. \\n\\n## Low level overview\\n- Completed the epic that implements eras behavior switch [#707](https://github.com/input-output-hk/mithril/issues/707):\\n - Completed handling the API version switch at era transition [#727](https://github.com/input-output-hk/mithril/issues/727)\\n- Worked on the epic that implements a relational store in the aggregator [#779](https://github.com/input-output-hk/mithril/issues/779):\\n - Completed on the migration/adaptation of the `stake_pool` table [#787](https://github.com/input-output-hk/mithril/issues/787)\\n - Worked on the migration/adaptation of the `epoch_settings` table [#813](https://github.com/input-output-hk/mithril/issues/813)\\n - Worked on the migration/adaptation of the `signed-entity-type` table [#815](https://github.com/input-output-hk/mithril/issues/815)\\n - Completed the creation of a stake distribution service [#799](https://github.com/input-output-hk/mithril/issues/799)\\n- Completed the testing of Mithril with Cardano `mainnet` network [#777](https://github.com/input-output-hk/mithril/issues/777)\\n- Completed qualifying the computation of the stake distribution [#810](https://github.com/input-output-hk/mithril/issues/810)\\n- Completed the testing of the Docker client in the `Mithril Client multi-platform test` workflow [#794](https://github.com/input-output-hk/mithril/issues/794)\\n- Worked on bugs and optimizations:\\n - Fixed a bug that made computation of the stake distribution occur multiple times during an epoch [#804](https://github.com/input-output-hk/mithril/issues/804)\\n - Fixed a bug that created deadlocks on the SQLite connection [#807](https://github.com/input-output-hk/mithril/issues/807)\\n - Optimized the error message and the behavior of the signer node when KES keys have expired [#820](https://github.com/input-output-hk/mithril/issues/820)\\n - Upgraded the infrastructure of the `testing-preview` and `pre-release-preview` networks [#801](https://github.com/input-output-hk/mithril/issues/801)\\n - Re-genesis of the `testing-preview` network [#803](https://github.com/input-output-hk/mithril/issues/803)\\n - Re-genesis of the `pre-release-preview` network [#818](https://github.com/input-output-hk/mithril/issues/818)"},{"id":"2023-03-22-consensus","metadata":{"permalink":"/cardano-updates/2023-03-22-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-consensus.md","source":"@site/blog/2023-03-22-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-03-22T00:00:00.000Z","formattedDate":"March 22, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":0.63,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-03-22-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-03-23-mithril"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-03-22-node-cli-api"}},"content":"## High level summary\\n\\nThis week the consensus team continued working on the refactoring of the UTxO HD\\nprototype, and design and testing of Genesis. We also extracted the `fs-sim`\\npackage, which provides a file-system abstraction layer that can be used for\\ntesting and simulation. This makes the Consensus code base smaller, while\\nproviding a package that the community can reuse and contribute to. We also\\nfixed a failing property test related to iterators. We are also working on\\nmempool and VRF improvements.\\n\\n\\n## Low-level details\\n\\n- Extraction of `fs-sim` code from `ouroboros-network`:\\n - https://github.com/input-output-hk/ouroboros-network/pull/4425\\n - https://github.com/input-output-hk/fs-sim/pull/1\\n - https://github.com/input-output-hk/fs-sim/pull/2\\n - https://github.com/input-output-hk/ouroboros-network/pull/4460\\n- Smaller changes in `fs-sim` code (some required by `UTxO-HD`):\\n - https://github.com/input-output-hk/fs-sim/pull/5\\n - https://github.com/input-output-hk/fs-sim/pull/6\\n - https://github.com/input-output-hk/fs-sim/pull/7\\n - https://github.com/input-output-hk/fs-sim/pull/8\\n- Released cardano-lmdb-simple-0.6.0.0\\n - https://github.com/input-output-hk/lmdb-simple/pull/20\\n - https://github.com/input-output-hk/cardano-haskell-packages/pull/150"},{"id":"2023-03-22-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-03-22-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-node-cli-api.md","source":"@site/blog/2023-03-22-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-03-22T00:00:00.000Z","formattedDate":"March 22, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":0.645,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-03-22-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-03-22-consensus"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-03-22-performance-and-tracing"}},"content":"# 2023-03-22 - 2023-04-05\\n\\n## High level summary\\n\\n- Added new cardano-cli ping command which allows users to ping remote cardano-nodes.\\n- The `transaction build` command now can automatically balance multiassets\\n- New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.\\n\\n### docs\\n\\n### CI & project maintenance\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Remove unused error constructors](https://github.com/input-output-hk/cardano-node/pull/5041) \\n- [Fix qKesKesKeyExpiry to not always be null](https://github.com/input-output-hk/cardano-node/pull/4909) \\n- [New cardano-cli ping command.](https://github.com/input-output-hk/cardano-node/pull/4664) \\n\\n### cardano-api\\n- [Remove use of AcquireFailure type](https://github.com/input-output-hk/cardano-node/pull/5040) \\n- [Simplify implementation of executeQueryAnyMode](https://github.com/input-output-hk/cardano-node/pull/5038) \\n- [Script data serialisation](https://github.com/input-output-hk/cardano-node/pull/5002) \\n- [Guard against overflows in Shelley TxIns](https://github.com/input-output-hk/cardano-node/pull/4956) \\n- [Combinators for TxBodyContent and related types](https://github.com/input-output-hk/cardano-node/pull/4941) \\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450) \\n\\n### cardano-node\\n\\n### cardano-testnet\\n- [Use Haskell variables for passing values.](https://github.com/input-output-hk/cardano-node/pull/5011) \\n- [Re-enable kes-period-info test.](https://github.com/input-output-hk/cardano-node/pull/4879)"},{"id":"2023-03-22-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-03-22-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-performance-and-tracing.md","source":"@site/blog/2023-03-22-performance-and-tracing.md","title":"Performance & tracing update","description":"* Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.","date":"2023-03-22T00:00:00.000Z","formattedDate":"March 22, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.5,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-03-22-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-03-22-node-cli-api"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-03-21-network"}},"content":"* Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.\\n* New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we\'re currently improving documentation and creating setup guidelines for end users.\\n* Analysis pipeline: Our refined metrics PR has been merged. We\'re working on including variance analysis to our reporting machinery.\\n* Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we\'re laying the groundwork for enabling GHC 9.2 in our benchmarks.\\n* Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing.\\n* Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.\\n\\n# Performance\\n\\n### New tracing\\nThe new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe\\na slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use.\\n\\n### GHC RTS parametrization\\nWe\'re currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies\\non different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use.\\n\\n### Open Sourcing\\nOur API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we\'re refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases.\\n\\n# Tracing\\nFor the new tracing system we\'re currently undertaking an effort to multi-layered documentation: a condensed version, as well\\nas a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points\\nfor users of the new system, depending on their wants and needs. \\n\\n# Infrastructure & Analysis\\n\\n### General\\nHaving included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we\'re laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will\\nincrease confidence in specific metrics.\\n\\n### Nomad backend\\nWe have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis\\nis patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We\'re confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries."},{"id":"2023-03-21-network","metadata":{"permalink":"/cardano-updates/2023-03-21-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-21-network.md","source":"@site/blog/2023-03-21-network.md","title":"Network Team Update","description":"High level summary","date":"2023-03-21T00:00:00.000Z","formattedDate":"March 21, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.315,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-03-21-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-03-22-performance-and-tracing"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-03-17-crypto"}},"content":"## High level summary\\n\\nIn the last spring we released `cardano-node-1.35.6` with dynamic P2P\\nfunctionality.\\n\\nWe received reports from some SPOs who encountered problems with their non\\nP2P block producing nodes not being able to connect to their P2P relay. Karl\\nKnutsson (from Cardano Foundation) reproduced this issue between two nodes (a\\nnon P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed\\nit and found a bug in the legacy non p2p code. The bug is only possible to\\ntrigger with a P2P node which is binding its outbound connection port to\\na fixed IP address and port (default in p2p). A possible solution was found.\\nFor more information see [#4465].\\n\\nWe released `cardano-ping-0.1.0.0` package to `CHaP`. `cardano-ping` is no\\nlonger available as a standalone binary, but instead it will become part of\\n`cardano-cli` (see [#4664])\\n\\nWe are testing `cardano-node` with peer sharing functionality ([#4019]).\\n\\nWe are working on _eclipse evasion_. We added new class of peers: big ledger\\npeers to the outbound governor, implemented tests and fixed found issues\\n([#4462]). We also made the information if a given peer plays the role of\\na big ledger peer to the mini-protocols. This will allow to modify\\nmini-protocol applications for such peers. As part of this functionality we\\nrefactored some core types in the network code which simplifies exposed API.\\n\\nTogether with Moritz Angerman we started to update `io-sim` to `ghc-9.6.1` (see\\n[#73]).\\n\\nWe merged a fix of configuration of accepted connections limit in\\n`cardano-node` (see [#4902]).\\n\\n\\n[#4019]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[#4462]: https://github.com/input-output-hk/ouroboros-network/pull/4462\\n[#4465]: https://github.com/input-output-hk/ouroboros-network/issues/4465\\n[#4664]: https://github.com/input-output-hk/cardano-node/pull/4664\\n[#73]: https://github.com/input-output-hk/io-sim/pull/73\\n[#4902]: https://github.com/input-output-hk/cardano-node/pull/4902"},{"id":"2023-03-17-crypto","metadata":{"permalink":"/cardano-updates/2023-03-17-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-crypto.md","source":"@site/blog/2023-03-17-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-03-17T00:00:00.000Z","formattedDate":"March 17, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.255,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-03-17-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-03-21-network"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-17-hydra"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Mithril: RFP finished. Code ready for audit.\\n* cardano-base: BLS12-381\'s PR approved, only blocker is Windows\' CI. Preparing extensive testing strategy together with Plutus and Testing teams.\\n* KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing.\\n* Sidechains: Preparing proving system to use the curves needed for main-net PoC. \\n## Low level summary\\n### Mithril\\n* Merged [PR#783](https://github.com/input-output-hk/mithril/pull/783)\\n* RFP for crypto audit ready.\\n### cardano-base\\n* BLS12-381 branch approved [PR#266](https://github.com/input-output-hk/cardano-base/pull/266). Blocker is Windown\'s CI. Working on it\\n* Testing strategy for BLS bindings:\\n * Preparing test-vectors for Groth16, and simple BLS signatures\\n * Finding community projects to help write their use cases\\n * Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)\\n* Wrote [blogpost](https://github.com/input-output-hk/blogpost_breaking_ed25519_vrf/blob/main/blog.md) on how using the same key for ed25519 and VRF completely breaks the security of both systems \\n### KES agent\\n* Started integration of sockets interface used in consensus\\n* Use that for de/ser\\n* Resolving problems with block memory in IOSim. Can\'t use withForeignPtr in IOSim\\n* Results in having to parametrise for IOSim in KES and DSIGN for testing\\n### Sidechains\\n* Prepared an API for proof generation in sidechains, with it\'s C API for integration with JVM languages.\\n* Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS.\\n* EdDSA over JubJub ready"},{"id":"2023-03-17-hydra","metadata":{"permalink":"/cardano-updates/2023-03-17-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-hydra.md","source":"@site/blog/2023-03-17-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-03-17T00:00:00.000Z","formattedDate":"March 17, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.015,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-03-17-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-03-17-crypto"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-03-17-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team has continued work on the mainnet compatibility of the\\nhydra-node. They added a golden test suite for `hydra-plutus` scripts, added\\nsome detection of `hydra-node` misconfiguration, established a limit of 100 ADA\\nper commit and other smaller tasks to prepare for a mainnet beta release.\\n\\nNext week there will be a small team workshop to push for demonstrating a Hydra\\nHead on the Cardano mainnet, ideally just in time for the monthly review\\nmeeting. See the hydra channels on the IOG Technical Community discord server\\nfor details.\\n\\n## What did the team achieve this week\\n\\n- Implement a 100 ADA hard-coded commit limit in the hydra-node\\n [#763](https://github.com/input-output-hk/hydra/pull/763)\\n- Pay back funds to faucet after smoke-test run\\n [#773](https://github.com/input-output-hk/hydra/pull/773)\\n- Setup custom github runner for smoke-tests on mainnet\\n [#775](https://github.com/input-output-hk/hydra/pull/775)\\n- Created golden tests to assure the script hash stays the same between\\n changes [#772](https://github.com/input-output-hk/hydra/pull/772)\\n- Removed hardcoded error codes in plutus scripts\\n [#768](https://github.com/input-output-hk/hydra/pull/768)\\n- Detect misconfiguration of a hydra-node given persistent state\\n [#767](https://github.com/input-output-hk/hydra/pull/767)\\n- Met with potential users for hydra-pay\\n- Prepared hydra workshop\\n\\n## What are the goals of next week\\n\\n- Hydra monthly meeting\\n- Open a multi-party head on mainnet\\n- Complete mainnet compatibility feature"},{"id":"2023-03-17-ledger","metadata":{"permalink":"/cardano-updates/2023-03-17-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-ledger.md","source":"@site/blog/2023-03-17-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-03-17T00:00:00.000Z","formattedDate":"March 17, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.415,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-03-17-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-17-hydra"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-03-16-goedel"}},"content":"## High level summary\\n\\nWe made further progress on the conway ledger era.\\nIn particular, we expanded the ledger API significantly, including lots of governance features.\\nWe also made progress on the specification and corresponding work in the Haskell implementation.\\n\\nWe also continued to integrate the latest ledger packages into cardano node and addressed\\ntechnical debt.\\n\\n## Low level summary\\n\\n### Expanded ledger API\\n\\nThe ledger API was significantly expanded to include:\\n* a lot of protocol parameter support\\n* versioning support (type level ledger eras and protocol versions)\\n* auxiliary data support\\n* many new lenses\\n* support for witnesses\\n* support for conway governance\\n\\nSee [pull-3328].\\n\\n### Conway ledger rules\\n\\nWe have made progress on the formal ledger specification for the Conway era.\\nMoreover, the corresponding Haskell updates were also completed:\\n\\n* See [pull-3339]\\n* See [pull-3326]\\n* See [pull-3330]\\n\\n### Incremental SPO/DRep stake distribution computation\\n\\nWe have a working (and correct) proof of concept for how to use the incremental lambda calculus\\nto maintain several of the stake distributions incrementally.\\nFor the per-SPO distribution, this is a performance improvement.\\nFor the (conway) per-DRep distribution, this is will allow those who have delegated their votes\\nto a DRep to have time to react to any votes that they disapprove of.\\n(Sorry, no code to share just yet, more to come.)\\n\\n### Technical debt\\n\\n* Improved CBOR testing facilities [pull-3332]\\n* GitHub actions improvement [pull-3320]\\n* Move ToJSON orphans from cardano-node [pull-3323] [pull-3338]\\n* Minor OCert improvements [pull-3327]\\n* Remove duplication [pull-3341]\\n* Enforce unique elements in CBOR sets [pull-3331] \\n\\n[pull-3320]: https://github.com/input-output-hk/cardano-ledger/pull/3320\\n[pull-3323]: https://github.com/input-output-hk/cardano-ledger/pull/3323\\n[pull-3326]: https://github.com/input-output-hk/cardano-ledger/pull/3326\\n[pull-3327]: https://github.com/input-output-hk/cardano-ledger/pull/3327\\n[pull-3328]: https://github.com/input-output-hk/cardano-ledger/pull/3328\\n[pull-3330]: https://github.com/input-output-hk/cardano-ledger/pull/3330\\n[pull-3331]: https://github.com/input-output-hk/cardano-ledger/pull/3331\\n[pull-3332]: https://github.com/input-output-hk/cardano-ledger/pull/3332\\n[pull-3338]: https://github.com/input-output-hk/cardano-ledger/pull/3338\\n[pull-3339]: https://github.com/input-output-hk/cardano-ledger/pull/3339\\n[pull-3341]: https://github.com/input-output-hk/cardano-ledger/pull/3341"},{"id":"2023-03-16-goedel","metadata":{"permalink":"/cardano-updates/2023-03-16-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-16-goedel.md","source":"@site/blog/2023-03-16-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-03-16T00:00:00.000Z","formattedDate":"March 16, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.55,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-03-16-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-03-17-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-10-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has been working on drafts of two papers\\nimproving the deltaQ tutorial, consulting on performance design, and\\nthe final version of the Djed paper.\\n\\n## Details\\n\\n* Preparing draft of DeltaQSD algebra paper for ICE 2023\\n\\n* Successful outcome of Marlowe consultancy leading to substantial\\n improvement in performance\\n\\n* Preparing sections on the communication language and bisimulation\\n proofs for draft paper about verifying design refinements for\\n distributed system design\\n\\n* Camera ready version of Djed paper under preparation"},{"id":"2023-03-10-hydra","metadata":{"permalink":"/cardano-updates/2023-03-10-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-10-hydra.md","source":"@site/blog/2023-03-10-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-03-10T00:00:00.000Z","formattedDate":"March 10, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.825,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-03-10-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-03-16-goedel"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-03-09-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team addressed issues with committing complex UTxOs into a\\nHydra Head, prepared the `hydra-node` to be run on mainnet (soon) and improved\\nthe test suite of the `hydra-plutus` scripts. The specification is constantly\\ngetting improved upon reviewer feedback on overleaf - this week the graphical\\nnotation was refined to be more transaction-focused.\\n\\n## What did the team achieve this week\\n\\n- Clarified “bug” of committing UTxOs with reference scripts to a Hydra head [#737](https://github.com/input-output-hk/hydra/issues/737)\\n- Prepare usage of `hydra-node` on mainnet by updating command line options [#715](https://github.com/input-output-hk/hydra/pull/715)\\n- Improved our mutation test suite to all expected errors [#705](https://github.com/input-output-hk/hydra/issues/705)\\n- Re-opened our persistent hydraw demo head on `preprod` using version `0.9.0`\\n- Updated on-chain graphs to be more transaction-focused in the specification\\n\\n## What are the goals of next week\\n\\n- Complete mainnet compatibility feature\\n- Prepare the Hydra workshop\\n- Address all todo\u2019s in the Hydra specification\\n- Unblock the auctions project with “commit from script” a solution"},{"id":"2023-03-09-mithril","metadata":{"permalink":"/cardano-updates/2023-03-09-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-09-mithril.md","source":"@site/blog/2023-03-09-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-03-09T00:00:00.000Z","formattedDate":"March 9, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.42,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-03-09-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-10-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-03-08-consensus"}},"content":"## High level overview\\nThe Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano `mainnet` and computes the stake distribution with the optimized unreleased Cardano CLI command.\\n\\nFinally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup.\\n\\n## Low level overview\\n- Worked on the epic that implements eras behavior switch [#707](https://github.com/input-output-hk/mithril/issues/707):\\n - Completed the deployment of the era behavior switch to the test networks [#752](https://github.com/input-output-hk/mithril/issues/752)\\n - Completed the enhancement of datum generation for era markers [#786](https://github.com/input-output-hk/mithril/issues/786)\\n - Worked on handling the API version with an era switch [#727](https://github.com/input-output-hk/mithril/issues/727)\\n- Worked on the epic that implements a relational store in the aggregator [#779](https://github.com/input-output-hk/mithril/issues/779):\\n - Worked on the migration/adaptation of the `stake_pool` table [#787](https://github.com/input-output-hk/mithril/issues/787)\\n- Completed the refactoring of errors in the signer and aggregator state machines [#665](https://github.com/input-output-hk/mithril/issues/665)\\n- Worked on testing Mithril with a `mainnet` Cardano network [#777](https://github.com/input-output-hk/mithril/issues/777)\\n- Worked on fixing bugs with the Docker client image:\\n - Fixed a bug that made the Docker client container crash at startup [#769](https://github.com/input-output-hk/mithril/issues/769)\\n - Fixed a bug that prevented the restoration of a snapshot with a Docker client [#791](https://github.com/input-output-hk/mithril/issues/791)\\n - Worked on testing the Docker client in the `Mithril Client multi-platform test` workflow [#794](https://github.com/input-output-hk/mithril/issues/794)"},{"id":"2023-03-08-consensus","metadata":{"permalink":"/cardano-updates/2023-03-08-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-consensus.md","source":"@site/blog/2023-03-08-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-03-08T00:00:00.000Z","formattedDate":"March 8, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":2.46,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-03-08-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-03-09-mithril"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-03-08-node-cli-api"}},"content":"## High level summary\\n\\nThe Consensus team continued working on refactoring and improving the UTxO-HD\\nprototype, and introducing improvements to the `lmdb` related packages. In\\nparticular we identified an opportunity to gain performance by handling locks in\\na more optimal way.\\n\\nOn the Genesis front, we sketched a mitigation for an issue that `PNSol` and\\nResearchers caught. We also came op with a road map for not only testing the\\nGenesis prototypes, but also for enriching the tests we already have.\\n\\nRegarding technical debt, next to some minor improvements, we created\\ncomponent-level micro-benchmarks for adding transactions to the mempool. The\\nresults of these benchmarks will be published in the `ouroboros-consensus` [web\\npage][oc-web-page].\\n\\nWe also finished moving the Consensus documentation to the `ouroboros-consensus`\\nrepository, released `ouroboros-consensus` `0.3.0.0`, and reduced the time\\nGitHub actions take in `ouroboros-network`.\\n\\n## Workstreams\\n\\n### UTxO HD Prototype\\n\\nWe continued working on refactoring and improving the UTxO-HD prototype. As a\\nresult of the first round of sytem-level benchmarks, we identified an\\nopportunity to optimise the way we handle locks to improve performance\\n([#4393][issue-4393]).\\n\\nAlso, we introduced several improvements to the `lmdb` related packages:\\n- [New tests][pull-19] for read-only transaction handles.\\n- [New functions][pull-18] and [data types][pull-13].\\n- [Updates][pull-11] to support improved type safety and smaller constraints in\\n the UTxO HD prototype.\\n- Windows and MacOS [CI support][pull-8].\\n\\n### Genesis\\n\\nWe sketched out a mitigation of the issue that `PNSol` and Researchers caught in\\nthe Genesis design.\\n\\nWe came up with a road map for testing the Genesis prototypes, including early\\nmilestones that are applicable to today\'s master branch, ie tests that are\\nuseful before Genesis, and that will be nicely enriched when we do add Genesis.\\n\\nWe developed the aforementioned tests, specifically a `QuickCheck` generator for\\nthe Honest leader schedule and one as-aggressive-as-possible Adversarial\\nleader schedule that together satisfy the Praos properties that the Consensus\\ndesign takes as invariants.\\n\\nWe investigated why the improved `ChainDB` queueing implementation behaves\\ndifferently in the baseline compared to the prototype, and we are close to\\nhaving a full picture of how the Consensus components interact during bulk sync.\\n\\n### Technical debt\\n\\nWe [created][pull-4400] component-level micro-benchmarks for adding transactions\\nto the mempool. We plan on extending this to more mempool actions and different\\ntypes of blocks. We [store][pull-4422] the benchmark data to make it available\\nto the GitHub action that [publishes][pull-12] the benchmarks results.\\n\\nOther minor improvements include:\\n\\n- [Removal][pull-4429] of `Test.Util.Classify` in favour of `Test.StateMachine.Labelling`.\\n- [Addition][pull-4423] of `-Wunused-packages` to the default `ghc-options` for Consensus\\n packages.\\n\\n### Fostering collaboration\\n\\nWe finished moving the Consensus documentation [from][pull-4374]\\n`ouroboros-network` [to][pull-8] `ouroboros-consensus`, in preparation for\\nmigrating the code to the latter repository.\\n\\n### Support\\n\\nWe [released][pull-4412] ouroboros-consensus 0.3.0.0.\\n\\nWe [reduced][pull-4421] the load in the `ouroboros-network` GitHub actions,\\nthereby reducing the time CI jobs take.\\n\\n[issue-4393]: https://github.com/input-output-hk/ouroboros-network/issues/4393\\n[pull-19]: https://github.com/input-output-hk/lmdb-simple/pull/19\\n[pull-18]: https://github.com/input-output-hk/lmdb-simple/pull/18\\n[pull-13]: https://github.com/input-output-hk/lmdb-simple/pull/13\\n[pull-11]: https://github.com/input-output-hk/lmdb-simple/pull/11\\n[pull-8]: https://github.com/input-output-hk/haskell-lmdb/pull/8\\n[pull-4400]: https://github.com/input-output-hk/ouroboros-network/pull/4400\\n[pull-4422]: https://github.com/input-output-hk/ouroboros-network/pull/4422\\n[pull-12]: https://github.com/input-output-hk/ouroboros-consensus/pull/12\\n[pull-4429]: https://github.com/input-output-hk/ouroboros-network/pull/4429\\n[pull-4423]: https://github.com/input-output-hk/ouroboros-network/pull/4423\\n[pull-4374]: https://github.com/input-output-hk/ouroboros-network/pull/4374\\n[pull-8]: https://github.com/input-output-hk/ouroboros-consensus/pull/8\\n[pull-4412]: https://github.com/input-output-hk/ouroboros-network/pull/4412\\n[pull-4421]: https://github.com/input-output-hk/ouroboros-network/pull/4421\\n[oc-web-page]: https://input-output-hk.github.io/ouroboros-consensus/"},{"id":"2023-03-08-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-03-08-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-node-cli-api.md","source":"@site/blog/2023-03-08-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-03-08T00:00:00.000Z","formattedDate":"March 8, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":0.795,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-03-08-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-03-08-consensus"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-03-08-performance-and-tracing"}},"content":"# 2023-03-08 - 2023-03-21\\n\\n## High level summary\\n\\nGeneral bug fixes and some refactoring \\n## Completed\\n\\n### docs\\n\\n### CI & project maintenance\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Remove error calls in Cardano.CLI.Shelley.Run.Transaction](https://github.com/input-output-hk/cardano-node/pull/4958) \\n- [Detect invalid counter and certificate](https://github.com/input-output-hk/cardano-node/pull/4880) \\n\\n### cardano-api\\n- [Add missing imports](https://github.com/input-output-hk/cardano-node/pull/5003) \\n- [Add LedgerStateBabbage and LedgerStateConway pattern synonyms](https://github.com/input-output-hk/cardano-node/pull/5001) \\n- [Remove unnecessary functions](https://github.com/input-output-hk/cardano-node/pull/4967) \\n- [Remove duplicate scripts when building transaction body for Mary, Alonzo and Babbage](https://github.com/input-output-hk/cardano-node/pull/4953) \\n- [Reduce number of calls to toLedgerPParams](https://github.com/input-output-hk/cardano-node/pull/4903) \\n- [Remove simple script distinction](https://github.com/input-output-hk/cardano-node/pull/4763) \\n- [Add ToJSON/FromJSON instances for ChainPoint](https://github.com/input-output-hk/cardano-node/pull/4686) \\n- [Derive Eq instance for AcquiringFailure](https://github.com/input-output-hk/cardano-node/pull/4683) \\n- [Export `fromShelleyBasedScript` from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4682) \\n- [Remove unnecessary validation of Data](https://github.com/input-output-hk/cardano-node/pull/4344) \\n- [Remove hint of \\"string\\" support for ScriptData](https://github.com/input-output-hk/cardano-node/pull/3775) \\n\\n### cardano-node\\n- [Conway hard forks on prot-ver 9](https://github.com/input-output-hk/cardano-node/pull/4988) \\n- [Reinstate -Werror for cardano-node and fix errors](https://github.com/input-output-hk/cardano-node/pull/4968) \\n- [Take all dependencies from Hackage or CHaP](https://github.com/input-output-hk/cardano-node/pull/4921) \\n- [Less verbose node-to-client and node-to-node version logging](https://github.com/input-output-hk/cardano-node/pull/4911) \\n- [Get AcceptedConnectionsLimit from the configuration](https://github.com/input-output-hk/cardano-node/pull/4902) \\n\\n### cardano-testnet\\n- [fix cardano-testnet Babbage genesis.json](https://github.com/input-output-hk/cardano-node/pull/4729)"},{"id":"2023-03-08-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-03-08-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-performance-and-tracing.md","source":"@site/blog/2023-03-08-performance-and-tracing.md","title":"Performance & tracing update","description":"* Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.","date":"2023-03-08T00:00:00.000Z","formattedDate":"March 8, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.805,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-03-08-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-03-08-node-cli-api"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-03-03-crypto"}},"content":"* Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.\\n* New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users.\\n* Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination.\\n* Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation.\\n* Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.\\n\\n\\n# Performance\\n\\n### 1.35.6 release\\nBenchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health.\\n\\n### Analysis pipeline\\nOur analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better\\ndifferentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance.\\nAdditionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking\\ndata more easily accessible.\\n\\n### Open Sourcing\\nAs a prerequisite for going live with our benchmarking data, we\'re currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we\'ve begun working on a small visualization demo and interactive API documentation. Those will enable \\nthird parties to make use of that data much more easily, by having reliable guidelines and a working example.\\n\\n# Tracing\\nThe new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make\\nthe switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process.\\n\\n# Infrastructure\\n\\n### Nomad backend\\nThe Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented."},{"id":"2023-03-03-crypto","metadata":{"permalink":"/cardano-updates/2023-03-03-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-crypto.md","source":"@site/blog/2023-03-03-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-03-03T00:00:00.000Z","formattedDate":"March 3, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.155,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-03-03-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-03-08-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-03-03-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit.\\n* cardano-base: BLS branch is now ready for review. We are workign forward its merge. \\n* KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase.\\n* Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs\\n## Low level summary\\n### Mithril\\n* Bumped to version [0.2.0](https://crates.io/crates/kes-summed-ed25519/0.2.0) the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using `mlock`.\\n* Opened [PR#783](https://github.com/input-output-hk/mithril/pull/783) to update dependency\\n* Improved testing for batch opening of mtree, [PR#773](https://github.com/input-output-hk/mithril/pull/773)\\n* Improved testing for batch verification of STM sigs [PR#774](https://github.com/input-output-hk/mithril/pull/774)\\n* RFP for crypto audit almost ready.\\n### cardano-base\\n* BLS12-381 branch finally ready for review [PR#266](https://github.com/input-output-hk/cardano-base/pull/266)\\n### KES agent\\nTeam off for one week. Other progress:\\n- Learning about raw direct-bearer abstraction. An interface for sockets in consensus.\\n- use that for direct ser/deser\\n- written those syntaxes for ouroboros (coming PR)\\n- the kes agent will depend on that. \\t\\n### Sidechains\\nProgress with familiarisation of Halo2 library to write circuits."},{"id":"2023-03-03-goedel","metadata":{"permalink":"/cardano-updates/2023-03-03-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-goedel.md","source":"@site/blog/2023-03-03-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-03-03T00:00:00.000Z","formattedDate":"March 3, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.815,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-03-03-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-03-03-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-03-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has been working on drafts of two papers and one\\ntechnical report, improving the deltaQ tutorial, consulting on\\nperformance design, and the Djed paper has been accepted for\\npublication.\\n\\n## Details\\n\\n* Preparing draft of DeltaQSD algebra paper for FORTE 2023\\n\\n* Extending the technical report on which the above paper is based\\n\\n* Consulting with an external company on performance engineering of Plutus contracts\\n\\n* Planning improvements and collecting material for the deltaQ\\n tutorial based on experience with systems that manage risk at\\n multiple timescales\\n\\n* Preparing sections on the communication language and idempontency\\n laws for draft paper about verifying design refinements for\\n distributed system design\\n\\n* Studying Cardano chain sync protocol\\n\\n* \\"Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin\\n Protocol\\" has been accepted for publication at IEEE ICBC 2023"},{"id":"2023-03-03-hydra","metadata":{"permalink":"/cardano-updates/2023-03-03-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-hydra.md","source":"@site/blog/2023-03-03-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-03-03T00:00:00.000Z","formattedDate":"March 3, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.19,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-03-03-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-03-03-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-03-03-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team released version\\n[0.9.0](https://github.com/input-output-hk/hydra/releases/tag/0.9.0) - a version\\nof the `hydra-node` with fully specified behavior of on-chain scripts and\\noff-chain head-logic, decreased costs for opening/closing a Head and scalable\\ncontestation deadline semantics. Check out the full release notes for details.\\n\\nFurthermore, they published the [monthly\\nreport](https://hydra.family/head-protocol/monthly/2023-03) of the Hydra project\\nand conducted a review meeting with an increasingly wider audience. The team\\nplans to extend invitations through the new Hydra\\n[#announcements](https://discord.gg/Bwdy2jNdm2) discord channel for the next\\nmonths, stay tuned!\\n\\n## What did the team achieve this week\\n\\n- Monthly review meeting with report published [on website](https://hydra.family/head-protocol/monthly/2023-03)\\n- Fixed smoke tests [#726](https://github.com/input-output-hk/hydra/pull/726)\\n- Reduced the cost of opening/closing a Head (error codes [#748](https://github.com/input-output-hk/hydra/pull/748) + head reference script [#701](https://github.com/input-output-hk/hydra/pull/701))\\n- Released version [0.9.0](https://github.com/input-output-hk/hydra/releases/tag/0.9.0)\\n- Conducted a first experiment on mainnet compatibility [#713](https://github.com/input-output-hk/hydra/issues/713)\\n- New discord category with [#announcements](https://discord.gg/Bwdy2jNdm2) channel\\n- Received a demo about the Hydra for Voting project\\n- Lightning talk on mutation-based testing (to be shared)\\n- New [themes view](https://github.com/orgs/input-output-hk/projects/21/views/26) in on our roadmap and some rearranging as we align it with high-level objectives\\n- Clarified things with researchers, but mostly identified action items for them\\n\\n## What are the goals of next week\\n\\n- Redraw transaction graphs and address TODOs specification\\n- Run hydraw with 0.9.0 on preprod\\n- Make smoke tests on mainnet possible\\n- Groom the explorer item\\n- Unblock the auctions projecth with “commit from script” a solution"},{"id":"2023-03-03-ledger","metadata":{"permalink":"/cardano-updates/2023-03-03-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-ledger.md","source":"@site/blog/2023-03-03-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-03-03T00:00:00.000Z","formattedDate":"March 3, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.57,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-03-03-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-03-03-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-03-02-network"}},"content":"## High level summary\\n\\nWe have focused the last two weeks on CIP-1694, integration of the last several months of ledger\\nwork into consensus and node, and testing infrastrutcture that we will use in the conway ledger era.\\n\\n## Low level summary\\n\\n### Conway rules\\n\\nWe made a major update to the conway era so that the implementation is now in sync with the spec\\nwith respect to the ratification and enactment logic.\\n\\nSee the notes in [pull-3291] for more details.\\n\\n### Constraint based generators\\n\\nThis week we hit a major milestone in our efforts to build out better property based testing\\nsupport for the main ledger properties.\\nThe new constraint based generators can now generate full ledger states with what is probably\\nvery close to the real constraints (if anything, it is under constrained).\\nNext we will work on generating a transaction in the context of a ledger state, which would allow\\nus to actually start using these generators for real tests.\\n\\nSee [pull-3219].\\n\\n### Preparing a release, now with proper versioning\\n\\nAfter quite some time, we are ready to release a version of ledger that will work with a new\\nversion of consensus, using CHaPs.\\n\\nSee [pull-3308].\\n\\n### Technical debt\\n\\n* We cleaned up the redeemer serialization code (to prevent future mistakes). See [pull-3269].\\n* We added a note to the Alonzo spec, specifying that the transaction inputs are\\n lexicographically ordered in the Plutus script context. See [pull-3306].\\n* We fixed a problem with the address deserialiazation\\n (we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway).\\n See [pull-3307].\\n* We fixed a problem with our nix build. See [pull-3311].\\n* We fixed a problem with our `NoThunks` tests. See [pull-3310].\\n* We improved our nightly tests. See [pull-3316].\\n\\n[pull-3219]: https://github.com/input-output-hk/cardano-ledger/pull/3219\\n[pull-3269]: https://github.com/input-output-hk/cardano-ledger/pull/3269\\n[pull-3291]: https://github.com/input-output-hk/cardano-ledger/pull/3291\\n[pull-3306]: https://github.com/input-output-hk/cardano-ledger/pull/3306\\n[pull-3307]: https://github.com/input-output-hk/cardano-ledger/pull/3307\\n[pull-3308]: https://github.com/input-output-hk/cardano-ledger/pull/3308\\n[pull-3310]: https://github.com/input-output-hk/cardano-ledger/pull/3310\\n[pull-3311]: https://github.com/input-output-hk/cardano-ledger/pull/3311\\n[pull-3316]: https://github.com/input-output-hk/cardano-ledger/pull/3316"},{"id":"2023-03-02-network","metadata":{"permalink":"/cardano-updates/2023-03-02-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-02-network.md","source":"@site/blog/2023-03-02-network.md","title":"Network Team Update","description":"High level summary","date":"2023-03-02T00:00:00.000Z","formattedDate":"March 2, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.85,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-03-02-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-03-03-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-24-hydra"}},"content":"## High level summary\\n\\nIn the current sprint the networking team focused on fixing bugs and pushing\\nforward implementation of eclipse evasion. We also found a bug in our\\nsimulation testing setup (in integration of test node). We also overviewed the\\nwork on extending handshake protocol which is delivered by Galois Inc.\\n\\nWe published `ouroboros-network-0.4.0.1` and\\n`ouroboros-network-protocols-0.3.0.0` to [CHaP][PR #147].\\n\\nWe also fixed a bug in `cardano-node` which results in not being able to\\nconfigure inbound connection limits, see [PR #4902].\\n\\nTogether with Karl Knutsson (CF) we realised an issue in `cardano-cli`: it\'s\\nvalidation of DNS names, IP address & ports when registering a stake pool\\nshould be more strict to protect against common mistakes which we identified on\\nthe chain. See [issue #4929].\\n\\n## Detailed work log\\n\\nIn [PR #4385] we fixed two bugs in peer state actions. First one results in\\na busy loop if demotion from hot to warm times outs. This busy loop is\\neventually exited when mux exits (we reported this in our previous report).\\nThis fix made it to `1.35.6` release as well.\\n\\nIn addition the [PR #4385] also fixes another bug which results in `hot -> warm\\n-> hot` demotion / promotion busy loop.\\n\\nThe [PR #4385] also fixed a bug in a node only used in simulation which\\nresulted in not using `chain-sync` or `block-fetch` mini-protocols. In the\\nreview process, we realised that the header-body split in the simulated node\\nrequires further work (see [PR #4419], which is under review).\\n\\nThe [PR #4385] also extend our generators, which together with the above fix,\\ncover the `hot -> warm -> hot` demotion / promotion busy loop.\\n\\nIn [PR #4419] we introduce a `ChainDB` for our simulation node, which plays\\nsimilar role to `ChainDB` in the `ouroboros-consensus`: a persistent (across\\nsimulated restarts) store of blocks which does chain selection. This ensures\\nthat the simulated node is using `block-fetch` to download blocks announced by\\n`chain-sync` mini-protocol.\\n\\nWe also made progress with reviewing [PR #4019] - peer sharing.\\n\\nWe also fixed [issue #4370] - a connection manager test failure, see [PR #4384].\\n\\n[PR #147]: https://github.com/input-output-hk/cardano-haskell-packages/pull/147\\n[PR #4019]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[PR #4384]: https://github.com/input-output-hk/ouroboros-network/pull/4384\\n[PR #4385]: https://github.com/input-output-hk/ouroboros-network/pull/4385\\n[PR #4419]: https://github.com/input-output-hk/ouroboros-network/pull/4419\\n[PR #4902]: https://github.com/input-output-hk/cardano-node/pull/4902\\n[issue #4370]: https://github.com/input-output-hk/ouroboros-network/issues/4370\\n[issue #4929]: https://github.com/input-output-hk/cardano-node/issues/4929"},{"id":"2023-02-24-hydra","metadata":{"permalink":"/cardano-updates/2023-02-24-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-24-hydra.md","source":"@site/blog/2023-02-24-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-02-24T00:00:00.000Z","formattedDate":"February 24, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.93,"hasTruncateMarker":false,"authors":[{"name":"Franco Testagrossa","title":"Hydra Software Engineer","url":"https://github.com/ffakenz","imageURL":"https://github.com/ffakenz.png","key":"ffakenz"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-02-24-hydra","authors":"ffakenz","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-03-02-network"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-02-23-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team continue closing many gaps and aligning the\\nimplementation with the specification. More over, they have groomed a plan to\\nmake Hydra Mainnet compatible. Also, they continue moving forward with the\\ninternal auditing and have published some auditing guidelines to receive\\ncontributions from the community.\\n\\n## What did the team achieve this week\\n\\n- Completed [#452](https://github.com/input-output-hk/hydra/issues/452) (what is\\n remaining in there)\\n- Aligned the Head protocol logic implementation with the specification\\n- Completed full minting policy implementation and spec\\n [#720](https://github.com/input-output-hk/hydra/issues/720)\\n- Clarified message authentication with researchers\\n- Groomed what is left to do for Mainnet compatibility\\n [#713](https://github.com/input-output-hk/hydra/issues/713) and drafted a\\n 0.10.0 version\\n- Added a tutorial by [@perturbing](https://github.com/perturbing/) to the\\n website [LINK](https://hydra.family/head-protocol/docs/tutorial/)\\n- Published auditing guidelines\\n [LINK](https://hydra.family/head-protocol/audit-guidelines)\\n- Made hydra-node work for macos\\n [#746](https://github.com/input-output-hk/hydra/issues/746) and added support\\n for building on aarch64\\n [#673](https://github.com/input-output-hk/hydra/issues/673)\\n- Met with a potential customer of Hydra for Payments\\n\\n## What are the goals of next week\\n\\n- Have the monthly review meeting incl. the report\\n- Have smoke tests fixed and running regularly\\n- Release 0.9.0 with updated scripts\\n- Redraw transaction graphs for specification"},{"id":"2023-02-23-mithril","metadata":{"permalink":"/cardano-updates/2023-02-23-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-23-mithril.md","source":"@site/blog/2023-02-23-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-02-23T00:00:00.000Z","formattedDate":"February 23, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.47,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-02-23-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-24-hydra"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-02-23-performance-and-tracing"}},"content":"## High level overview\\nThe Mithril team released a new [`2306.0`](https://github.com/input-output-hk/mithril/releases/tag/2306.0) distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes\u2019 CLI that allows generating and signing an era marker\u2019s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI.\\n\\n## Low level overview\\n- Released the new distribution [`2306.0`](https://github.com/input-output-hk/mithril/releases/tag/2306.0)\\n- Completed the epic that implements signer versions deployment monitoring [#718](https://github.com/input-output-hk/mithril/issues/718):\\n - Completed the implementation an event producer/consumer via channel [#738](https://github.com/input-output-hk/mithril/issues/738)\\n - Completed the creation of a database and its configuration to save the events on the consumer side [#740](https://github.com/input-output-hk/mithril/issues/740)\\n - Completed the creation of events and sending them on the channel on the producer side [#741](https://github.com/input-output-hk/mithril/issues/741)\\n - Completed the creation of the signer registration event [#742](https://github.com/input-output-hk/mithril/issues/742)\\n - Completed the creation a query to extract the node versions stakes distribution [#743](https://github.com/input-output-hk/mithril/issues/743)\\n- Worked on the epic that implements eras behavior switch [#707](https://github.com/input-output-hk/mithril/issues/707):\\n - Completed the loading of era reader adapters from config in the signer and the aggregator [#732](https://github.com/input-output-hk/mithril/issues/732)\\n - Completed the implementation of an era cli command in the aggregator [#755](https://github.com/input-output-hk/mithril/issues/755)\\n - Completed the implementation of a dynamic matrix of cases in CI end to end tests [#760](https://github.com/input-output-hk/mithril/issues/760)\\n- Fixed some bugs:\\n - Fixed the unsupported `unixepoch()` function [#757](https://github.com/input-output-hk/mithril/issues/757)\\n - Fixed the problem that prevented some signers from signing on the `testing-preview` network [#730](https://github.com/input-output-hk/mithril/issues/730)\\n - Update SQLite version to `3.40` in aggregator infrastructure [#765](https://github.com/input-output-hk/mithril/issues/765)"},{"id":"2023-02-23-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-02-23-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-23-performance-and-tracing.md","source":"@site/blog/2023-02-23-performance-and-tracing.md","title":"Performance & tracing update","description":"* SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.","date":"2023-02-23T00:00:00.000Z","formattedDate":"February 23, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.245,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-02-23-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-02-23-mithril"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-02-22-consensus"}},"content":"* SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.\\n* Release benchmarking: we performed a round of benchmarks for the 1.35.6 release.\\n* UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup.\\n* New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities.\\n* Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure.\\n* Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.\\n\\n# Performance\\n\\n### SECP\\n1. For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead.\\n2. The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run.\\n3. The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking. \\n\\n### UTxO-HD\\n1. After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop.\\n2. We\'re currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.\\n\\n### 1.35.6 release\\nBenchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health.\\n\\n# Tracing\\nWork on the new tracing system\'s introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible.\\n\\n# Infrastructure\\n\\n### Nomad backend\\n1. Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients.\\n2. Locality assumptions were removed and job monitoring was refactored.\\n3. To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster.\\n4. We\'re currently evaluating different options for genesis distribution in said cluster.\\n\\n### NixOps backend\\nThe NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery."},{"id":"2023-02-22-consensus","metadata":{"permalink":"/cardano-updates/2023-02-22-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-22-consensus.md","source":"@site/blog/2023-02-22-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-02-22T00:00:00.000Z","formattedDate":"February 22, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":2.45,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-02-22-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-02-23-performance-and-tracing"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-02-22-node-cli-api"}},"content":"## High level summary\\n\\nDuring the past two weeks we got the results from the system level benchmarks\\nfor UTxO HD. They showed a substantial performance regression, so we spent some\\ntime analyzing the results. We found out the frequency at which ledger snapshots\\nwere taken was too high, so we requested the benchmarking team a new run with a\\nmore realistic snapshotting policy. We continued refactoring and improving the\\nprototype, and we released UTxO-HD related packages to CHaP.\\n\\nWe met with IOG researchers and networking specialists to discuss the Genesis\\ndesign, which was well received. We continued working on testing and\\nbenchmarking different Genesis prototypes.\\n\\nWe are also working on solving a test failure related to iterators. This work\\nderived in several improvements such as better documentation, a framework for\\nwriting unit (and regression) tests, and the possibility of debugging\\n`QuickCheck` counter examples in the REPL.\\n\\nFinally, we released `ouroboros-consensus` 0.2.0.0 and\\n`ouroboros-consensus-cardano` 0.3.0.0 to CHaP\\n\\n## Workstreams \\n\\n### UTxO HD Prototype \\n\\nWe got the results of the first system level benchmarks for UTxO HD. They seemed\\nto indicate a significant regression in performance. After looking into the\\nbenchmark logs we found that the benchmark runs took ledger state snapshots too\\noften, due to the default snapshotting policy depending on `k`, and `k` being so\\nsmall in the benchmark runs. Therefore, the next step is to re-run the\\nbenchmarks with a snapshotting policy that more closely resembles the one from\\nmainnet.\\n\\nAt the same time, we continued refactoring and cleaning up the prototype. \\n\\nAlso, we prepared the `anti-diff` packages (`fingertree-rm`, `diff-containers`,\\n`simple-semigroupoids`) and the `lmdb` related packages (`cardano-lmdb` and\\n`cardano-lmdb-simple`) to [CHaP][chap].\\n\\n### Genesis\\n\\nThe Genesis design was presented to the IOG researchers and Peter Thompson from\\nNSol. It was well received. They pointed out one blindspot, but we think it\'ll\\nbe relatively simple to mitigate.\\n\\nIn parallel, we continued developing test and benchmarks for the Genesis\\nprototypes. I particular we tested and implemented a potential fix for\\n[increased ChainDB dequeue timings][increased-dequeue-timings], which partly\\nbehaved as we expected, but still needs further investigation. Also we obtained\\n[new benchmarking data][new-bench-data] for the prototype.\\n\\n### Technical debt\\n\\nRelated to [#4183][pull-4183], we developed a [DSL][pull-4379] for specifying\\n`ChainDB` unit tests. This will allow us to better understand the\\ncounter-examples returned by QuickCheck tests, and to write [regression\\ntests][pull-4383] for them. Also, we [added a module][pull-4358] to enable\\nQuickCheck counter-examples to be run on the REPL, allowing for faster debugging\\nfeedback. Also, we improved the documentation related to followers\\n([#4372][pull-4372]).\\n\\nWe are also working on a design for optimizing the way we handle blocks from the\\nfuture.\\n\\n### Support\\n\\nWe released `ouroboros-consensus` 0.2.0.0 and `ouroboros-consensus-cardano`\\n0.3.0.0 to CHaP. Remember that we decided to split the packages related to\\nConsensus into two bundles, one with the core functionality, Cardano-agnostic\\ncode, and another bundle with instantiations specific to Cardano.\\n\\n[new-bench-data]: https://github.com/input-output-hk/ouroboros-network/issues/4037#issuecomment-1434745031\\n[increased-dequeue-timings]: https://github.com/input-output-hk/ouroboros-network/issues/4037#issuecomment-1439708022\\n[chap]: https://github.com/input-output-hk/cardano-haskell-packages\\n[pull-4358]: https://github.com/input-output-hk/ouroboros-network/pull/4358\\n[pull-4183]: https://github.com/input-output-hk/ouroboros-network/issues/4183\\n[pull-4372]: https://github.com/input-output-hk/ouroboros-network/pull/4372\\n[pull-4379]: https://github.com/input-output-hk/ouroboros-network/pull/4379\\n[pull-4383]: https://github.com/input-output-hk/ouroboros-network/pull/4383"},{"id":"2023-02-22-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-02-22-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-22-node-cli-api.md","source":"@site/blog/2023-02-22-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-02-22T00:00:00.000Z","formattedDate":"February 22, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.385,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-02-22-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-02-22-consensus"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-02-21-db-sync"}},"content":"# 2023-02-22 - 2023-03-07\\n\\n## High level summary\\n\\nGeneral bug fixes \\n\\n## Completed\\n\\n### docs\\n- [Fix some markdown links](https://github.com/input-output-hk/cardano-node/pull/4882)\\n- [Update changelog with PR4788 changes](https://github.com/input-output-hk/cardano-node/pull/4881)\\n\\n### CI & project maintenance\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Fix bug in hash computation in cardano-cli genesis create-cardano](https://github.com/input-output-hk/cardano-node/pull/4761)\\n- [Cleanup exports of cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/4636)\\n- [BUGFIX] - [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Handle pipes in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4625)\\n- [Export SubmitResult from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4753)\\n\\n### cardano-api\\n- [Remove pattern Tx](https://github.com/input-output-hk/cardano-node/pull/4901)\\n\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n\\n### cardano-testnet\\n\\n## In Progress\\n\\n## Documentation\\n- [Fix path to mkfiles.sh script in documentation](https://github.com/input-output-hk/cardano-node/pull/4949)\\n\\n## CI & project mainteance\\n- [New build complete job](https://github.com/input-output-hk/cardano-node/pull/4932)\\n- [Update ouroboros-network](https://github.com/input-output-hk/cardano-node/pull/4764)\\n\\n### cardano-cli\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n- [Render consistent plutus script failure output](https://github.com/input-output-hk/cardano-node/pull/4659)\\n- [Read network ID from environment](https://github.com/input-output-hk/cardano-node/pull/4666)\\n- [CLI option to append additional signatures to a transactions](https://github.com/input-output-hk/cardano-node/pull/4647)\\n- [Cardano ping](https://github.com/input-output-hk/cardano-node/pull/4664)\\n- [Better error message for query utxo on oops](https://github.com/input-output-hk/cardano-node/pull/4777)\\n- [New --node-socket-path cli option](https://github.com/input-output-hk/cardano-node/pull/4910)\\n- [Fix qKesKesKeyExpiry to not always be null](https://github.com/input-output-hk/cardano-node/pull/4909)\\n- [Detect invalid counter and certificate](https://github.com/input-output-hk/cardano-node/pull/4880)\\n- [Straight line code for tx commands](https://github.com/input-output-hk/cardano-node/pull/4823)\\n- [New cardano-cli ping command.](https://github.com/input-output-hk/cardano-node/pull/4664)\\n- [Move cardano-ping from ouroboros-network to cardano-node project](https://github.com/input-output-hk/cardano-node/pull/4655)\\n\\n### cardano-api\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n- [Remove simple script distinction](https://github.com/input-output-hk/cardano-node/pull/4763)\\n- [Combinators for TxBodyCon\u017btent and related types](https://github.com/input-output-hk/cardano-node/pull/4941)\\n- [Reduce number of calls to toLedgerPParams](https://github.com/input-output-hk/cardano-node/pull/4903)\\n- [Better error message for query utxo without oops 2](https://github.com/input-output-hk/cardano-node/pull/4825)\\n\\n### cardano-node\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)\\n- [Less verbose node-to-client and node-to-node version logging](https://github.com/input-output-hk/cardano-node/pull/4911)\\n\\n### cardano-testnet\\n- [Use Haskell variables for passing values](https://github.com/input-output-hk/cardano-node/pull/4845)\\n- [Re-enable kes-period-info test](https://github.com/input-output-hk/cardano-node/pull/4879)\\n- [Transaction debug script command](https://github.com/input-output-hk/cardano-node/pull/3783)"},{"id":"2023-02-21-db-sync","metadata":{"permalink":"/cardano-updates/2023-02-21-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-21-db-sync.md","source":"@site/blog/2023-02-21-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-02-21T00:00:00.000Z","formattedDate":"February 21, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.75,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-02-21-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-02-22-node-cli-api"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-02-17-crypto"}},"content":"## High level summary\\n\\nThe db-sync team created a new tag `13.1.0.2` which is ready to release.\\nWe also investigated and had the first working UTxO-HD integration which is one\\nof the potential future risks for db-sync.\\n\\n## Low level summary\\n\\n- Integrated the UTxO-HD feauture branch in `kderme/utxo-hd-1`. This doesn\'t\\nuse the full on disk storage but keeps things in memory and the plan is to keep\\nit this way for the first iteration. The integration still has some performance\\nissues which we investigate\\n- Created tag `13.1.0.2` which upgrades the dependencies of db-sync\\n- Fixed an issue related to errors appearing in SMASH\\n[#1353](https://github.com/input-output-hk/cardano-db-sync/pull/1353)\\n- Continued with ghc-9.2 integration\\n[#1339](https://github.com/input-output-hk/cardano-db-sync/pull/1339)\\n- Worked on an new fixing procedure for\\n[#1348](https://github.com/input-output-hk/cardano-db-sync/issues/1348).\\nWe try to make these procedures work also on older schema version, without the\\nneed to migrate to newer schema, which can be very useful for fixing existing\\nsnapshots."},{"id":"2023-02-17-crypto","metadata":{"permalink":"/cardano-updates/2023-02-17-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-crypto.md","source":"@site/blog/2023-02-17-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-02-17T00:00:00.000Z","formattedDate":"February 17, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.43,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-02-17-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-02-21-db-sync"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-02-17-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril\'s core library (decided to add audit of KES). Design proposal for viable registration.\\n* cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus.\\n* KES agent: using snockets and making things testable in IOSim\\n* MuSig2: started implementation in rust.\\n\\n## Low level summary\\n\\n### Mithril\\n* Transmute helpers merged [PR#722](https://github.com/input-output-hk/mithril/pull/722)\\n* We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope. \\n* We are working in a modification of KES to require caller to allocate the secret key buffer.\\n* Proposed a solution for signer registration of [Mithril](https://github.com/input-output-hk/mithril/wiki/Mithril-registration-procedure#cost).\\n### cardano-base\\n* Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 [proof](https://github.com/input-output-hk/plutus/tree/kwxm/BLS12_381/prototype/plutus-benchmark/bls-benchmarks).\\n\\t* Results are promising, with using only 23% of the execution budget to verify a realistic proof. \\n\\t* Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril.\\n* KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this.\\n* Conversion finally merged [PR#344](https://github.com/input-output-hk/cardano-base/pull/344).\\n\\n### KES agent\\n* Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation\\n* Figuring out how to go from fake file descriptor to write the raw bytes\\n\\n### MuSig2\\n* Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental."},{"id":"2023-02-17-goedel","metadata":{"permalink":"/cardano-updates/2023-02-17-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-goedel.md","source":"@site/blog/2023-02-17-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-02-17T00:00:00.000Z","formattedDate":"February 17, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.53,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-02-17-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-02-17-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-17-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has been working on drafts of two papers and one\\ntechnical report, distributivity properties of deltaQ, and consulting\\non performance design with the Marlowe team.\\n\\n## Details\\n\\n* Processing reviews on performance engineering paper and planning\\n paper revisions accordingly\\n\\n* Investigating distributivity properties of DeltaQ\\n\\n* Preparing sections on the thorn calculus and idempotency laws for\\n draft paper about verifying design refinements for distributed\\n system design\\n\\n* Consulting on performance design with Marlowe team"},{"id":"2023-02-17-hydra","metadata":{"permalink":"/cardano-updates/2023-02-17-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-hydra.md","source":"@site/blog/2023-02-17-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-02-17T00:00:00.000Z","formattedDate":"February 17, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.75,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-02-17-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-02-17-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-02-17-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team completed work on dealing differently with contests\\nduring the contestation period. These will now always push out the deadline and\\nhence contestation periods are easier to pick (depending on the network a Head\\nruns on). Furthermore, they added an important acceptance test and completed\\ninternal refactoring of the protocol logic making future changes easier.\\n\\n## What did the team achieve this week\\n\\n- Push contestation deadline on each contest [#716](https://github.com/input-output-hk/hydra/pull/716)\\n- Wrote an acceptance (property) test “can always close/fanout when collect is successful”\\n- Internal refactoring of our `HeadLogic`\\n- Groomed remaining things from [#452](https://github.com/input-output-hk/hydra/issues/452) into dedicated features\\n\\n## What are the goals of next week\\n\\n- Complete full minting policy [#720](https://github.com/input-output-hk/hydra/issues/720)\\n- Release 0.9.0 with updated scripts\\n- Plan mainnet milestone and a 0.10.0 version\\n- Redraw transaction graphs for specification (upon feedback)\\n- Have smoke tests fixed and running regularly"},{"id":"2023-02-17-ledger","metadata":{"permalink":"/cardano-updates/2023-02-17-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-ledger.md","source":"@site/blog/2023-02-17-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-02-17T00:00:00.000Z","formattedDate":"February 17, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.33,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-02-17-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-17-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-02-17-network"}},"content":"## High level summary\\n\\nThis past two weeks saw many months worth of ledger changes integrated with the `cardano-base`\\nand `ouroboros-network` repositories.\\nThe vast majority of the effort involved all the changes to the ledger serialization libraries\\n(and the interplay with `cardano-base`) which now support proper versioning.\\nSupporting the conway ledger era, and in particular allowing the ledger state to transition\\nto a whole new system of governance, also played a noticeable part in the integration.\\n\\nBesides the integration work, the team continues to address technical debt, improve the\\ndocumentation, make our testing infrastructure better (such as experimenting with better\\nnightly tests), and formally specifying more parts of CIP-1694.\\n\\n## Lower level summary\\n\\n### Integration work\\n\\nBelow is all the integration work completed, which will enable a release to node from\\nthe current ledger master. Many thanks to\\n[Alexey](https://github.com/lehins) for this colossal undertaking!\\n\\n* [pull-3303]\\n* [pull-3302]\\n* [pull-3300]\\n* [pull-3299]\\n* [pull-3298]\\n* [pull-3297]\\n* [pull-3292]\\n* [pull-3289]\\n* [pull-3288]\\n* [pull-3279]\\n* [pull-3282]\\n* [pull-4349]\\n\\n### Technical debt\\n\\nStarting in major protocol version 9, zero-valued multi-assets will no longer be permitted\\nin the CBOR specification. See [pull-3241].\\n\\nWe now have our `.cabal` files being checked for a consistent formatting given by\\n`cabal format` in our CI. See [pull-3286].\\n\\nWe are still experimenting with better nightly tests for our long running\\nproperty based tests. See [pull-3276] and [pull-3296].\\n\\n### Small documentation improvements\\n\\nThe hand proofs of the preservation ADA property have been added back to the\\nShelley ledger specification. See [pull-3295].\\n\\nWe have clarified how the script integrity hash is computed in the CDDL description.\\nSee [pull-3290].\\n\\n### Specifying CIP-1694\\n\\nOur new formal specifications backed by Agda have seen a lot of progress!\\nUpgrading to Agda 2.6.3 fixed our main build infrastructure problems,\\nand we no longer have to rely on our custom fork. See [pull-50].\\n\\nOur progress on formally specifying CIP-1694 can be followed here:\\n* in Agda: [pull-40]\\n* the corresponding Haskell: [pull-3291]\\n\\n### Constraint based testing\\n\\nWe are still actively working on our new constraint based property testing framework.\\nWe have nearly all of the constraints for an entire ledger state\\nhooked into generators, and tests that the generators do indeed obey the constraints.\\nThe variable count in the constraints is over 100!\\nThere is still much work to do on shrinking, making the generators faster,\\nand writing actual property tests for the ledger, but the approach still seems viable and\\nwe are hopeful that it could replace our trace generators.\\nThe WIP can be followed here: [pull-3219].\\n\\n[pull-3241]: https://github.com/input-output-hk/cardano-ledger/pull/3241\\n[pull-3295]: https://github.com/input-output-hk/cardano-ledger/pull/3295\\n[pull-3290]: https://github.com/input-output-hk/cardano-ledger/pull/3290\\n[pull-3286]: https://github.com/input-output-hk/cardano-ledger/pull/3286\\n\\n[pull-3303]: https://github.com/input-output-hk/cardano-ledger/pull/3303\\n[pull-3302]: https://github.com/input-output-hk/cardano-ledger/pull/3302\\n[pull-3300]: https://github.com/input-output-hk/cardano-ledger/pull/3300\\n[pull-3299]: https://github.com/input-output-hk/cardano-ledger/pull/3299\\n[pull-3298]: https://github.com/input-output-hk/cardano-ledger/pull/3298\\n[pull-3297]: https://github.com/input-output-hk/cardano-ledger/pull/3297\\n[pull-3292]: https://github.com/input-output-hk/cardano-ledger/pull/3292\\n[pull-3289]: https://github.com/input-output-hk/cardano-ledger/pull/3289\\n[pull-3288]: https://github.com/input-output-hk/cardano-ledger/pull/3288\\n[pull-3279]: https://github.com/input-output-hk/cardano-ledger/pull/3279\\n[pull-3282]: https://github.com/input-output-hk/cardano-ledger/pull/3282\\n[pull-3291]: https://github.com/input-output-hk/cardano-ledger/pull/3291\\n[pull-3276]: https://github.com/input-output-hk/cardano-ledger/pull/3276\\n[pull-3296]: https://github.com/input-output-hk/cardano-ledger/pull/3296\\n[pull-3219]: https://github.com/input-output-hk/cardano-ledger/pull/3219\\n\\n[pull-50]: https://github.com/input-output-hk/formal-ledger-specifications/pull/50\\n[pull-40]: https://github.com/input-output-hk/formal-ledger-specifications/pull/40\\n\\n[pull-4349]: https://github.com/input-output-hk/ouroboros-network/pull/4349"},{"id":"2023-02-17-network","metadata":{"permalink":"/cardano-updates/2023-02-17-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-network.md","source":"@site/blog/2023-02-17-network.md","title":"Network Team Update","description":"High level summary","date":"2023-02-17T00:00:00.000Z","formattedDate":"February 17, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":0.865,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-02-17-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-02-17-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-10-hydra"}},"content":"## High level summary\\n\\nRecently QA found a bug in P2P code, which results in busy loops. We added one\\nfix to `1.35.6` release, another one will likely be part of next release. The\\nfirst one is already included in `ouroboros-network-0.3.0.1` release. These\\nbugs could only affect nodes which are out of sync and thus should not impose\\nrisk on well maintained nodes on mainnet. We also advertise to deploy at most\\none of the relays as a P2P node, which shields from possible consequences.\\n\\nWe recently finished design phase of eclipse evasion and we started\\nimplementing it (see [issue #3886] for progress).\\n\\nGalois finished implementing Handshake extension which will allow to query\\nnetwork protocol versions (see [pr #4256]).\\n\\nWe also recently released a newer set of network packages to be integrated with\\n`cardano-node` `master` branch, this includes:\\n * monoidal-synchronisation-0.1.0.2\\n * cardano-client-0.1.0.2\\n * network-mux-0.3.0.0\\n * ouroboros-network-api-0.1.0.0\\n * ouroboros-network-protocols-0.2.0.0\\n * ouroboros-network-testing-0.2.0.1\\n * ouroboros-network-mock-0.1.0.0\\n * ouroboros-network-framework-0.3.0.0\\n * ouroboros-network-0.4.0.0 (it doesn\'t not yet include the fix we included\\n in `0.3.0.1`)\\n\\n[issue #3886]: https://github.com/orgs/input-output-hk/projects/19/views/16?pane=issue&itemId=19819205\\n[pr #4256]: https://github.com/input-output-hk/ouroboros-network/pull/4256"},{"id":"2023-02-10-hydra","metadata":{"permalink":"/cardano-updates/2023-02-10-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-10-hydra.md","source":"@site/blog/2023-02-10-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-02-10T00:00:00.000Z","formattedDate":"February 10, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.14,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-02-10-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-02-17-network"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-02-09-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team closed several gaps to align the Hydra scripts\\nimplementation further with the specification. This also resulted in a slight\\nimprovement on Hydra script size and costs. They consequently analysed the\\nasymptotic complexity of collect and fanout and how they relate. Also plutus-tx\\nprofiling toolchain was evaluated and set up for future improvements on Hydra\\non-chain performance. In discussions with researchers and internal auditors,\\nthey also uncovered next steps on further securing the Head protocl using a\\n\\"full\\" minting policy.\\n\\n## What did the team achieve this week\\n\\n- Closed several gaps to align script implementation with specification [#452](https://github.com/input-output-hk/hydra/issues/452)\\n - Allow contest only once [#680](https://github.com/input-output-hk/hydra/pull/680)\\n - Optimization through head output at index 0 [#700](https://github.com/input-output-hk/hydra/pull/700)\\n - Value is preserved [#702](https://github.com/input-output-hk/hydra/pull/702) + optimized exact value equality [#709](https://github.com/input-output-hk/hydra/pull/709)\\n- Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to [#721](https://github.com/input-output-hk/hydra/pull/721)\\n ![](https://user-images.githubusercontent.com/2621189/218124686-7a85b40d-12f7-4b00-ad16-128c99f5b707.png)\\n- Fixed our tooling around the Haskell language server\\n- Discussed full minting policy with researchers\\n- Started grooming \u201cwhat we need for mainnet\u201d on [this](https://github.com/input-output-hk/hydra/issues/713) idea ticket and [milestone](https://github.com/input-output-hk/hydra/milestone/8)\\n\\n## What are the goals of next week\\n\\n- Implement full minting policy\\n- All remaining protocol discrepancies are implemented or groomed as individual features\\n- Ideally release 0.9.0 with updated scripts\\n- Discuss what we need for mainnet (milestone planning)\\n- Redraw transaction graphs for specification (upon feedback)"},{"id":"2023-02-09-mithril","metadata":{"permalink":"/cardano-updates/2023-02-09-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-09-mithril.md","source":"@site/blog/2023-02-09-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-02-09T00:00:00.000Z","formattedDate":"February 9, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.01,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-02-09-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-10-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-02-08-consensus"}},"content":"## High level overview\\nThe Mithril team released a new [`2304.1`](https://github.com/input-output-hk/mithril/releases/tag/2304.1) distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store.\\n\\nFinally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version `1.35.5` on their `devnet` and infrastructure.\\n\\n## Low level overview\\n- Released the new distribution [`2304.1`](https://github.com/input-output-hk/mithril/releases/tag/2304.1)\\n- Fixed a bug that prevented some signers to sign with `2304.0-prerelease` [#716](https://github.com/input-output-hk/mithril/issues/716)\\n- Completed the implementation of an `EraChecker` that checks if an era is active [#708](https://github.com/input-output-hk/mithril/issues/708)\\n- Completed the implementation of an `EraReader` that gathers era activation data [#709](https://github.com/input-output-hk/mithril/issues/709)\\n- Completed the implementation of an `EraReader` adapter with on chain transaction as source [#710](https://github.com/input-output-hk/mithril/issues/710)\\n- Completed the relational design of the aggregator store [#476](https://github.com/input-output-hk/mithril/issues/476)\\n- Completed adding a new SPO on the `testing-preview` network [#729](https://github.com/input-output-hk/mithril/issues/729)\\n- Completed the upgrade of the Cardano node to `1.35.5` [#725](https://github.com/input-output-hk/mithril/issues/725)\\n- Fixed flakiness in the CI [#734](https://github.com/input-output-hk/mithril/issues/734)"},{"id":"2023-02-08-consensus","metadata":{"permalink":"/cardano-updates/2023-02-08-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-consensus.md","source":"@site/blog/2023-02-08-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-02-08T00:00:00.000Z","formattedDate":"February 8, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.5,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-02-08-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-02-09-mithril"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-02-08-node-cli-api"}},"content":"## High level summary\\n\\nWe continue refactoring the UTxO HD prototype while we wait for the system level\\nbenchmarks. We have created a new repository that contains the `anti-diff`\\npackages used in this prototype.\\n\\nOn the Genesis front, we are preparing another meeting with the researchers to\\naudit the implementation design, and we continued working on basic tests and\\nsimplifications.\\n\\nDuring the past two weeks we also introduced two new tools. One for dumping CBOR\\nencoded blocks to JSON, and another to serve a local immutable DB.\\n\\n## Workstreams \\n\\n### UTxO HD Prototype \\n\\nWe are in the process of refactoring the UTxO HD prototype, while we wait for\\nthe system level benchmarks to confirm if the performance of the prototype is\\nsatisfactory.\\n\\nWe also set up a repository for the [`anti-diff`][anti-diff] package, which\\nrequired us to refactor the code, write documentation, and prepare a release to\\n[CHaP][chap].\\n\\n### Genesis\\n\\nWe worked on [basic tests][issue-4347] for the _Limit on Eagerness_ property of\\nGenesis. We also introduced further robustness and simplifications in the\\nGenesis Density governor. Finally, we developed a presentation to engage again\\nwith the researchers on our Genesis implementation design.\\n\\n### Technical debt\\n\\n### Fostering collaboration \\n\\nWe are in the process of [polishing][pull-6] the `ouroboros-consensus`\\ndocumentation site, which we will use a the entry point for Consensus related\\ndocumentation. The first version will not be complete, but we plan on\\nsystematically improving it.\\n\\n### Support\\n\\nWe [added a tool][pull-4335] to `ouroboros-consensus-cardano-tools` which allows\\nto dump the Chain DB blocks or any given CBOR encoded blocks as JSON.\\n\\nWe also added [another tool][pull-4339] that serves an existing immutable DB via\\nBlockFetch and ChainSync. This tool can help in assisting our local benchmarking\\nefforts (for instance Genesis\' ChainSync jumping prototype).\\n\\n\\n[pull-6]: https://github.com/input-output-hk/ouroboros-consensus/pull/6\\n[pull-4335]: https://github.com/input-output-hk/ouroboros-network/pull/4335\\n[pull-4339]: https://github.com/input-output-hk/ouroboros-network/pull/4339 \\n[issue-4347]: https://github.com/input-output-hk/ouroboros-network/issues/4347\\n[anti-diff]: https://github.com/input-output-hk/anti-diffs\\n[chap]: https://github.com/input-output-hk/cardano-haskell-packages"},{"id":"2023-02-08-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-02-08-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-node-cli-api.md","source":"@site/blog/2023-02-08-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-02-08T00:00:00.000Z","formattedDate":"February 8, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.095,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-02-08-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-02-08-consensus"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-02-08-performance-and-tracing"}},"content":"# 2023-02-08 - 2023-02-21\\n\\n## High level summary\\nMore maintenance and resolving raised issues.\\n\\n## Completed\\n\\n### docs\\n\\n### CI & project maintenance\\n- [Remove use of multiline literals](https://github.com/input-output-hk/cardano-node/pull/4889)\\n- [Markdown links CI check](https://github.com/input-output-hk/cardano-node/pull/4775)\\n- [Date ranges for copyright](https://github.com/input-output-hk/cardano-node/pull/4755)\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Re-add support for decoding GenesisExtendedKey text envelope](https://github.com/input-output-hk/cardano-node/pull/4894)\\n- [Disallow empty cost model for create update proposal](https://github.com/input-output-hk/cardano-node/pull/4885)\\n- [Refactor code using onLeft and onNothing](https://github.com/input-output-hk/cardano-node/pull/4815)\\n\\n### cardano-api\\n- [Simplify SerialiseAsRawBytes type class](https://github.com/input-output-hk/cardano-node/pull/4876)\\n\\n### cardano-node\\n\\n### cardano-testnet\\n\\n## In Progress\\n\\n## CI & project mainteance\\n\\n### cardano-cli\\n- [Fix bug in hash computation in cardano-cli genesis create-cardano](https://github.com/input-output-hk/cardano-node/pull/4761)\\n- [Cleanup exports of cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/4636)\\n- [BUGFIX] - [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n- [Handle pipes in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4625)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n- [Render consistent plutus script failure output](https://github.com/input-output-hk/cardano-node/pull/4659)\\n- [Read network ID from environment](https://github.com/input-output-hk/cardano-node/pull/4666)\\n- [CLI option to append additional signatures to a transactions](https://github.com/input-output-hk/cardano-node/pull/4647)\\n- [Cardano ping](https://github.com/input-output-hk/cardano-node/pull/4664)\\n- [Better error message for query utxo on oops](https://github.com/input-output-hk/cardano-node/pull/4777)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n- [Remove simple script distinction](https://github.com/input-output-hk/cardano-node/pull/4763)\\n- [Export SubmitResult from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4753)\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)\\n\\n### cardano-testnet\\n- [Use Haskell variables for passing values](https://github.com/input-output-hk/cardano-node/pull/4845)"},{"id":"2023-02-08-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-02-08-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-performance-and-tracing.md","source":"@site/blog/2023-02-08-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-02-08T00:00:00.000Z","formattedDate":"February 8, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":2.445,"hasTruncateMarker":false,"authors":[{"name":"Serge Kosyrev","title":"Performance and Tracing Team Lead","url":"https://github.com/deepfire","imageURL":"https://github.com/deepfire.png","key":"deepfire"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-02-08-performance-and-tracing","authors":"deepfire","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-02-08-node-cli-api"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-02-03-crypto"}},"content":"## High level summary\\n\\n1. SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we\'re currently running what we consider the final benchmark, to validate the underlying assumptions.\\n2. Release benchmarking: we\'ve performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks.\\n3. New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node.\\n4. New tracing: before going live, we\'re performing the documentation update, as well as reworking the end user migration guide.\\n5. Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live.\\n6. Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on.\\n7. Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.\\n\\n## Performance\\n\\nWe are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:\\n\\n- we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,\\n- after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,\\n- finally, we\'re redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.\\n\\nIn addition, we started benchmarks of the 1.35.6 release.\\n\\n## Tracing\\n\\nA rework of the new tracing system\'s internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way.\\n\\nSpecifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting.\\n\\n## Infrastructure\\n\\nOn the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we\'ll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders.\\n\\nThe work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment.\\n\\nThe Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops."},{"id":"2023-02-03-crypto","metadata":{"permalink":"/cardano-updates/2023-02-03-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-crypto.md","source":"@site/blog/2023-02-03-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-02-03T00:00:00.000Z","formattedDate":"February 3, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":2.47,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-02-03-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-02-08-performance-and-tracing"},"nextItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-02-03-goedel"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril\'s core library. Exploring future paths of mithril. \\n* cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting. \\n* KES agent: using snockets and making things testable in IOSim \\n* MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.\\n\\n## Low level summary\\n\\n### Mithril\\n* Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing [PR#722](https://github.com/input-output-hk/mithril/pull/722)\\n* We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper.\\n* We are exploring possible paths of how mithril could be used \'as-a-service\'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.\\n### cardano-base\\n* There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it\'s trade-offs. Seems that the most interesting curve to have on main-net is still 381. \\n* The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner.\\n* The update VRF [PR#341](https://github.com/input-output-hk/cardano-base/pull/341) is finally merged, and we are ready to merge [PR#344](https://github.com/input-output-hk/cardano-base/pull/344), which implements conversion functions from the compatible types between Praos and PraosBatchCompat.\\n\\n### KES agent\\n* Use of snockets to send the data directly from the socket to secure memory. \\n* We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives\\n* Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.\\n\\n### MuSig2\\nThe GitHub Action [linelint](https://github.com/fernandrone/linelint) is used to check the files.\\n* A new job for linting is added to the file `/.github/workflows/ci.yml`. The rules are configured in the file `/.github/workflows/.linelint.yml`. Some files from the configuration of `libsecp` were failing, so in the rules in `.linelint.yml` the failing files are denoted to be ignored by the linter.\\n* Folders are reorganized. We created a folder to handle the example. This folder includes the `examplemusig2.c`, a distinct `config.h`, and `helper.c`. The example is enhanced by implementing the functions in the helper for the configuration given in `config.h`. The number of messages is different than the tests. The example is made more generic to run with a loop."},{"id":"2023-02-03-goedel","metadata":{"permalink":"/cardano-updates/2023-02-03-goedel","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-goedel.md","source":"@site/blog/2023-02-03-goedel.md","title":"Goedel Team Update","description":"The team works on applied research and consulting in formal methods","date":"2023-02-03T00:00:00.000Z","formattedDate":"February 3, 2023","tags":[{"label":"goedel","permalink":"/cardano-updates/tags/goedel"}],"readingTime":0.57,"hasTruncateMarker":false,"authors":[{"name":"James Chapman","title":"Head of Formal Methods","url":"https://github.com/jmchapman","imageURL":"https://github.com/jmchapman.png","key":"jmchapman"}],"frontMatter":{"title":"Goedel Team Update","slug":"2023-02-03-goedel","authors":"jmchapman","tags":["goedel"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-02-03-crypto"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-03-hydra"}},"content":"The team works on applied research and consulting in formal methods\\nthat is directly applicable to evidence based engineering in Core Tech\\nand beyond.\\n\\n## High level summary\\n\\nThis sprint the team has been preparing several papers for peer review\\nand knowledge sharing and consulting within IO and the community.\\n\\n## Details\\n\\n* R&D Seminar on experience participating in a member based organisation\\n* Full day tutorial on performance engineering presented at HiPEAC\\n 2023 conference\\n* Finished preparing and submitted a paper on performance engineering\\n to an ACM workshop\\n* Preparing a draft paper for future submission about verifying design\\n refinements for distributed system design\\n* Consulting on performance design of other IO projects"},{"id":"2023-02-03-hydra","metadata":{"permalink":"/cardano-updates/2023-02-03-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-hydra.md","source":"@site/blog/2023-02-03-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-02-03T00:00:00.000Z","formattedDate":"February 3, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.12,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-02-03-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Goedel Team Update","permalink":"/cardano-updates/2023-02-03-goedel"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-02-02-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team completed the Hydra specification with a section about\\nrollbacks and updated graphs\\n([#448](https://github.com/input-output-hk/hydra/issues/448)). In a next step,\\nthe specification will be made more approachable and an open standard. They\\nimproved their `hydra-cluster` tool to launch a local `--devnet` sandbox\\nenvironment and continued aligning the `hydra-plutus` scripts with the\\nspecification by hardening the checks on `close` and `contest` transactions.\\n\\n## What did the team achieve this week\\n\\n- Completed the specification with a section about rollbacks and updated graphs\\n [#448](https://github.com/input-output-hk/hydra/issues/448), with a follow-up on making it more approachable and an open standard.\\n- Continued spec review with internal auditor and incorporated changes.\\n- Talked to TxPipe about how Demeter and Hydra could work together\\n- The `hydra-cluster` executable can be used to launch a local `--devnet` sandbox environment.\\n- Reproduced the \u201chead being stuck on network outage\u201d bug\\n - relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed.\\n- Progressed with higher velocity by addressing more and more gaps [#677](https://github.com/input-output-hk/hydra/pull/677)\\n\\n## What are the goals of next week\\n\\n- Upstream our JSON instances to the ledger\\n- Close all transaction security related on-chain gaps\\n- Ideally release 0.9.0 with updated scripts\\n- Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap"},{"id":"2023-02-02-ledger","metadata":{"permalink":"/cardano-updates/2023-02-02-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-02-ledger.md","source":"@site/blog/2023-02-02-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-02-02T00:00:00.000Z","formattedDate":"February 2, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.23,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-02-02-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-02-03-hydra"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-01-27-hydra"}},"content":"## High level summary\\n\\nMuch of the work the past two weeks involved integration efforts,\\ncleaning up and debugging some serialization issues,\\nadding tests, and work on large projects that are still ongoing.\\nWe also released a CIP this week that aims to make the ledger\\na registered CIP category.\\n\\n## Lower level summary\\n\\n### Ledger evolution CIP\\n\\nWe published a\\n[CIP](https://github.com/cardano-foundation/CIPs/pull/456)\\nthat will make the Cardano ledger a registered category of the CIP process.\\n\\n### Serialization issues\\n\\nWe had previously thought that we had found a serialization problem with the redeemers,\\nbut it turned out to just be particularly confusing code.\\nWe have now clarified the issue for the future.\\n\\nSee [pull-3263], [pull-3269], and [pull-3268].\\n\\nStarting in protocol version 9, we will no longer accept duplicate keys in CBOR maps.\\n\\nSee [pull-3277].\\n\\n### New tests\\n\\nWe added a new property test suite for some of our custom containers.\\n\\nSee [pull-3270].\\n\\n### Progress on a better cost model serialization situation.\\n\\nWe are still working our way through [issue-2902].\\nTowards this end, we are now properly gating the new flexible encoders\\nuntil version 9.\\n\\nSee [pull-3274].\\n\\n### Nightly tests\\n\\nWe are still experimenting with moving more CI actions to GitHub actions.\\n\\nSee [pull-3276].\\n\\n### Constraint based generators\\n\\nWe continue to add to our proof of concept for constraint based generators.\\nSee the previous ledger update for more information about this project.\\n\\n[pull-3263]: https://github.com/input-output-hk/cardano-ledger/pull/3263\\n[pull-3268]: https://github.com/input-output-hk/cardano-ledger/pull/3268\\n[pull-3269]: https://github.com/input-output-hk/cardano-ledger/pull/3269\\n[pull-3270]: https://github.com/input-output-hk/cardano-ledger/pull/3270\\n[pull-3274]: https://github.com/input-output-hk/cardano-ledger/pull/3274\\n[pull-3277]: https://github.com/input-output-hk/cardano-ledger/pull/3277\\n[pull-3276]: https://github.com/input-output-hk/cardano-ledger/pull/3276\\n[issue-2902]: https://github.com/input-output-hk/cardano-ledger/issues/2902"},{"id":"2023-01-27-hydra","metadata":{"permalink":"/cardano-updates/2023-01-27-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-27-hydra.md","source":"@site/blog/2023-01-27-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-01-27T00:00:00.000Z","formattedDate":"January 27, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.945,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-01-27-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-02-02-ledger"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-01-26-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team had a monthly review meeting with their stakeholders,\\ncontributors and interested people from the community. The monthly repot for\\n[January 2023](https://hydra.family/head-protocol/monthly/2023-01) is a digest\\nof the things presented and also includes a summary of the meeting. The Hydra\\nspecification was getting discussed and the team is incorporating suggested\\nchanges of reviewers. Last but not least, they compute and publish script\\ninformation on every PR and also on the\\n[website](https://hydra.family/head-protocol/benchmarks/transaction-cost/#script-summary)\\nnow.\\n\\n## What did the team achieve this week\\n\\n- Had the monthly review meeting with a broader audience\\n- Published the monthly report for [January 2023](https://hydra.family/head-protocol/monthly/2023-01)\\n- Reviewed the spec and discussed individual aborts with researchers\\n- Compute and publish script information along benchmarks on every PR and [website](https://hydra.family/head-protocol/benchmarks/transaction-cost/#script-summary)\\n\\n## What are the goals of next week\\n\\n- Add rollback section to Hydra spec, update pictures and publish it as part of repository\\n- Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository.\\n- Groom & plan actions required for a maintainable Head explorer + break down “align gaps” feature."},{"id":"2023-01-26-mithril","metadata":{"permalink":"/cardano-updates/2023-01-26-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-26-mithril.md","source":"@site/blog/2023-01-26-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-01-26T00:00:00.000Z","formattedDate":"January 26, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.175,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-01-26-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-01-27-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-01-25-consensus"}},"content":"## High level overview\\nThe Mithril team released a new [`2302.0`](https://github.com/input-output-hk/mithril/releases/tag/2302.0) distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes.\\n\\nFinally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node.\\n\\n## Low level overview\\n- Released the new distribution [`2302.0`](https://github.com/input-output-hk/mithril/releases/tag/2302.0)\\n- Implemented a backward/forward compatibility mechanism for API messages [#688](https://github.com/input-output-hk/mithril/issues/688):\\n - Implement the mechanism for the signer registration [#689](https://github.com/input-output-hk/mithril/issues/689)\\n - Implement the mechanism for the signature registration [#693](https://github.com/input-output-hk/mithril/issues/693)\\n - Implement the mechanism for epoch settings [#695](https://github.com/input-output-hk/mithril/issues/695)\\n - Implement the mechanism for certificate pending [#696](https://github.com/input-output-hk/mithril/issues/696)\\n - Implement the mechanism for certificate [#697](https://github.com/input-output-hk/mithril/issues/697)\\n - Implement the mechanism for snapshots list [#698](https://github.com/input-output-hk/mithril/issues/698)\\n - Implement the mechanism for snapshot [#699](https://github.com/input-output-hk/mithril/issues/699)\\n - Update enforcement of API version with Semver [#705](https://github.com/input-output-hk/mithril/issues/705)\\n- Completed the PoC implementation of backward compatibility with `protobuf` [#677](https://github.com/input-output-hk/mithril/issues/677)\\n- Completed the PoC implementation of backward compatibility with `avro` [#678](https://github.com/input-output-hk/mithril/issues/678)\\n- Completed the PoC to Read/Write transaction on chain for Era activations [#672](https://github.com/input-output-hk/mithril/issues/672)\\n- Completed the upgrade Cardano devnet to 1.35.4 [#523](https://github.com/input-output-hk/mithril/issues/523)"},{"id":"2023-01-25-consensus","metadata":{"permalink":"/cardano-updates/2023-01-25-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-25-consensus.md","source":"@site/blog/2023-01-25-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-01-25T00:00:00.000Z","formattedDate":"January 25, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":2.27,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-01-25-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-01-26-mithril"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-01-25-node-cli-api"}},"content":"## High level summary\\n\\nDuring the past two weeks, the consensus team finished the testing activities\\naround the UTxO-HD prototype. This is a very important milestone which will\\nenable us to run system-level tests and benchmarks, as well as start refactoring\\nand cleaning the prototype. Regarding our Genesis workstream, we elaborated a\\nroadmap that gives an indication of the remaining work. We also continued our\\nwork on benchmarking chain-sync-jumping. We also continued working on improving\\nthe way we handle blocks from the future, and advancing the integration of the\\nnew VRF and KES crypto.\\n\\n## Workstreams \\n\\n### UTxO HD Prototype \\n\\nAs the prototype is nearing its completion, it was important to have enough\\nconfidence that we will be able to move additional parts of the ledger state\\nonto disk. We worked together with the Ledger team to [elaborate a\\nsketch][pull-4296] on how the UTxO-HD design would accommodate the migration of\\nadditional data from memory to disk. This gave us enough confidence that the\\ncurrent architecture will be extensible in the future.\\n\\nOn the testing front, we [added][pull-4274] property-based tests for the UTxO-HD\\ntype classes. \\n\\nWe also [enabled disabled components][pull-4289], and addressed several\\ntechnical debt issues:\\n\\n- Implement `splitSized` anti-diff split ([#4269][pull-4269]), and integrate it\\n into consensus ([#4273][pull-4273]).\\n- Renaming of `peekVal` to `peekMDBVal` ([#7][pull-7]).\\n\\nWe ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We\\nfound a race condition in the LMDB backing store, which [we fixed][pull-4283].\\nAfter the fix we were able to successfully run these benchmarks. The results\\nwere published by [this pull request][pull-4295].\\n\\nWe used our `db-analyser` tool to benchmark the cost of reading keys and\\nflushing values to disk. The following plot shows the duration of these disk\\noperation in relation to the main ledger operations, where we can see that the\\ncost of the former are comparatively low. The spike at the beginning of the\\ngraph is when, at the start of the Shelley era, the *entire* UTxO set is flushed\\nto disk.\\n\\n![UTxO-HD read and flush benchmarks](/images/consensus/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks.png)\\n\\nAfter months of hard work adding tests for the prototype, we are ready to run\\nend-to-end tests on the node, and system level benchmarks. This signals a very\\nimportant milestone for the UTxO-HD workstream :tada:.\\n\\n### Genesis \\n\\nWe elaborated a [high-level decomposition][genesis-roadmap] of the remaining\\nwork for Genesis. We also continued benchmarking the chain-sync-jumping\\nhappy-path.\\n\\n### Technical debt\\n\\nWe continued working on improving the way we handle blocks from the future.\\n\\n### Support \\n\\nWe completed the mapping of `Crypto` to `HeaderCrypto` and body `Crypto`.\\n`HeaderCrypto` is moved to `cardano-protocol-tpraos`. We created a draft [pull\\nrequest][pull-3262] to facilitate compiling consensus.\\n\\n[pull-4274]: https://github.com/input-output-hk/ouroboros-network/pull/4274\\n[pull-4296]: https://github.com/input-output-hk/ouroboros-network/pull/4296\\n[pull-4289]: https://github.com/input-output-hk/ouroboros-network/issues/4289\\n[pull-4295]: https://github.com/input-output-hk/ouroboros-network/pull/4295\\n[genesis-roadmap]: https://github.com/input-output-hk/ouroboros-network/blob/a626c84f6df585dd27d735eb7eec73904a1f570e/ouroboros-consensus/docs/2023-Jan-Genesis-roadmap.md\\n[pull-4269]: https://github.com/input-output-hk/ouroboros-network/pull/4269\\n[pull-4273]: https://github.com/input-output-hk/ouroboros-network/pull/4273\\n[pull-7]: https://github.com/input-output-hk/lmdb-simple/pull/7\\n[pull-4283]: https://github.com/input-output-hk/ouroboros-network/pull/4283\\n[pull-3262]: https://github.com/input-output-hk/cardano-ledger/pull/3262"},{"id":"2023-01-25-node-cli-api","metadata":{"permalink":"/cardano-updates/2023-01-25-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-25-node-cli-api.md","source":"@site/blog/2023-01-25-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2023-01-25T00:00:00.000Z","formattedDate":"January 25, 2023","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.585,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2023-01-25-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-01-25-consensus"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-01-20-crypto"}},"content":"# 2023-01-25 - 2023-02-07\\n\\n## High level summary\\nGeneral clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the `cardano-cli query stake-snapshot` command. \\n\\n## Completed\\n\\n### docs\\n\\n### CI & project maintenance\\n- [Fix how changed files are selected in stylish-haskell CI check](https://github.com/input-output-hk/cardano-node/pull/4853)\\n- [Copyright updates](https://github.com/input-output-hk/cardano-node/pull/4755)\\n- [Remove hlint from nix required CI](https://github.com/input-output-hk/cardano-node/pull/4848)\\n- [Remove reconfigure-hlint.sh script](https://github.com/input-output-hk/cardano-node/pull/4838)\\n- [Fix hlint warnings](https://github.com/input-output-hk/cardano-node/pull/4837)\\n- [Implement ADR-2: Restructure modules for generators](https://github.com/input-output-hk/cardano-node/pull/4833)\\n- [Stylish Haskell in CI](https://github.com/input-output-hk/cardano-node/pull/4803)\\n- [Revert skip doc in ci](https://github.com/input-output-hk/cardano-node/pull/4802)\\n- [Skip CI on doc only changes](https://github.com/input-output-hk/cardano-node/pull/4800)\\n- [Skip CI if only changes are documentation](https://github.com/input-output-hk/cardano-node/pull/4792)\\n- [Build all of cardano-node in CI](https://github.com/input-output-hk/cardano-node/pull/4776)\\n- [Check cabal files in CI](https://github.com/input-output-hk/cardano-node/pull/4766)\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Straight line error handling](https://github.com/input-output-hk/cardano-node/pull/4785)\\n- [Multiple pools support in query stake snapshot](https://github.com/input-output-hk/cardano-node/pull/4279)\\n\\n### cardano-api\\n- [New NodeToClientVersionOf typeclass](https://github.com/input-output-hk/cardano-node/pull/4787)\\n- [Remove NoImplicitPrelude from cardano-api](https://github.com/input-output-hk/cardano-node/pull/4832)\\n- [Add ReaderT of NodeToClientVersion to LocalStateQueryExpr](https://github.com/input-output-hk/cardano-node/pull/4809)\\n- [Use hoistMaybe](https://github.com/input-output-hk/cardano-node/pull/4808)\\n- [Better error message for query utxo without oops](https://github.com/input-output-hk/cardano-node/pull/4788)\\n\\n### cardano-node\\n\\n### cardano-testnet\\n- [New query stake-snapshot integration test](https://github.com/input-output-hk/cardano-node/pull/4805)\\n- [Make leadership-schedule test less flaky](https://github.com/input-output-hk/cardano-node/pull/4671)\\n\\n## In Progress\\n\\n## CI & project mainteance\\n\\n### cardano-cli\\n- [Fix bug in hash computation in cardano-cli genesis create-cardano](https://github.com/input-output-hk/cardano-node/pull/4761)\\n- [Cleanup exports of cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/4636)\\n- [BUGFIX] - [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n- [Handle pipes in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4625)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n- [Render consistent plutus script failure output](https://github.com/input-output-hk/cardano-node/pull/4659)\\n- [Read network ID from environment](https://github.com/input-output-hk/cardano-node/pull/4666)\\n- [CLI option to append additional signatures to a transactions](https://github.com/input-output-hk/cardano-node/pull/4647)\\n- [Cardano ping](https://github.com/input-output-hk/cardano-node/pull/4664)\\n- [Better error message for query utxo on oops](https://github.com/input-output-hk/cardano-node/pull/4777)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n- [Remove simple script distinction](https://github.com/input-output-hk/cardano-node/pull/4763)\\n- [Export SubmitResult from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4753)\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)\\n\\n### cardano-testnet\\n- [Use Haskell variables for passing values](https://github.com/input-output-hk/cardano-node/pull/4845)"},{"id":"2023-01-20-crypto","metadata":{"permalink":"/cardano-updates/2023-01-20-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-crypto.md","source":"@site/blog/2023-01-20-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-01-20T00:00:00.000Z","formattedDate":"January 20, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.65,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-01-20-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2023-01-25-node-cli-api"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-01-20-hydra"}},"content":"## High level summary\\nThe open fronts that the crypto team is working on are:\\n* Mithril: We explored whether some uses of `transmute` could be removed, but it resulted in considerable regression. \\n* cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision. \\n* KES agent: An inconsistency between `contra-tracer` available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the `contra-tracer` used by consensus. \\n\\n## Low level summary\\n\\n### Mithril\\n* We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average [PR#675](https://github.com/input-output-hk/mithril/pull/675). We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing. \\n* We are writing a RFP for the audit of the core library. \\n### cardano-base\\n* A problem with Nix is blocking merge of [PR#341](https://github.com/input-output-hk/cardano-base/pull/341)\\n* Plutus team ran [benchmarks](https://github.com/input-output-hk/plutus/blob/kwxm/BLS12_381/prototype/plutus-benchmark/bls-benchmarks/Main.hs) of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we\'ll be able to verify some proofs in a single script execution.\\n* Team is fully digesting the Plonk paper. \\n* There\'s been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used. \\n\\n### KES agent\\n* A little unforseen delay has been caused by a mismatch in the use of `contra-tracer`. The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are [doing the change](https://github.com/input-output-hk/cardano-base/pull/255/commits/39b2d9473aa296976825248360a73cf066065431), but still the CI is not happy.\\n* The [same](https://github.com/input-output-hk/cardano-base/pull/317/commits/39b2d9473aa296976825248360a73cf066065431) was needed for the KES agents prerequisites [PR#317](https://github.com/input-output-hk/cardano-base/pull/317).\\n* We\'ve started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency"},{"id":"2023-01-20-hydra","metadata":{"permalink":"/cardano-updates/2023-01-20-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-hydra.md","source":"@site/blog/2023-01-20-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-01-20T00:00:00.000Z","formattedDate":"January 20, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.13,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-01-20-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-01-20-crypto"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-01-20-network"}},"content":"## High-level summary\\n\\nThis week, the Hydra team has been focusing on the write-up of the Hydra HeadV1\\nspecification. Of which a first version has been aggregated and is currently\\nunder review. They aligned the on-chain scripts of reimbursing funds on abort\\nlike defined in the specification, improved the mutation test framework to have\\nmore control when testing plutus scripts. The added HeadId in the API and the\\nTUI example client make `hydra-node` easier to use and a first experiment of a\\nHydra Head explorer was showing the utility of this - see what Heads exist on\\nthe `preview` network [here](http://explorer.hydra.family).\\n\\n## What did the team achieve this week\\n\\n- HeadId to API and display in the TUI [#678](https://github.com/input-output-hk/hydra/pull/678)\\n- Experiment of creating a hydra explorer, first result hosted [here](http://explorer.hydra.family)\\n- Improved mutation framework allowing to fail for the right reason [#679](https://github.com/input-output-hk/hydra/pull/679)\\n- Correctly reimburse funds in abort (matching the spec) [#670](https://github.com/input-output-hk/hydra/pull/670)\\n- Finished a first write-up of the Hydra HeadV1 spec: [Read it on overleaf](https://www.overleaf.com/read/bbqzmptcxryj) ([Communication channels](https://github.com/input-output-hk/hydra/blob/master/SUPPORT.md) for feedback)\\n\\n## What are the goals of next week\\n\\n- Monthly review meeting with a broader audience\\n- Groom & plan actions required for a maintainable Head explorer\\n- Break \u201calign gaps\u201d feature into smaller chunks (at least on- /off-chain) and groom it\\n- Review the spec & discuss individual aborts with researchers (a bigger open question)"},{"id":"2023-01-20-network","metadata":{"permalink":"/cardano-updates/2023-01-20-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-network.md","source":"@site/blog/2023-01-20-network.md","title":"Network Team Update","description":"High level summary","date":"2023-01-20T00:00:00.000Z","formattedDate":"January 20, 2023","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"},{"label":"release","permalink":"/cardano-updates/tags/release"}],"readingTime":1.045,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2023-01-20-network","authors":"coot","tags":["network","release"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-01-20-hydra"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-01-20-sre"}},"content":"## High level summary\\n\\nWe have been working towards `cardano-node-1.35.5` release. QA & benchmarking\\nteams gave a green light for the release, and we made decent progress with some\\nCI problem which we encountered on the way ([PR #4612]). We are also working on\\npeer sharing, making improvements in our testing infrastructure, reducing\\ntechnical debt and making progress towards `io-sim-1.0.0.0`. Galois is making\\nprogress on Handshake improvements.\\n\\n## Low level summary\\n\\nOur diffusion simulation network now includes a mixed network of `initiator\\nonly` and `initiator and responder` nodes. [issue #4222]\\n\\nWe are now reviewing the [peer sharing pull request][PR #4019].\\n\\nWe are also reviewing pull request which introduces handshake query flag. [PR #4256]\\n\\nWe fixed a bug in our network simulator. The bug was triggered when a node\\ndied when performing a simultaneous TCP open (a corner case of a corner case!). [PR #4265]\\n\\nWe also refactored `Snocket` interface and removed the bearer construction from\\nits methods. [PR #4260]\\n\\nWe are working towards releasing `io-sim-1.0.0.0` on Hackage, which includes\\nreviewing two PRs: [PR #57] and [PR #60] as well as writing an announcement\\nblog post. \\n\\n[PR #4019]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[PR #4256]: https://github.com/input-output-hk/ouroboros-network/pull/4256\\n[PR #4260]: https://github.com/input-output-hk/ouroboros-network/pull/4260\\n[PR #4265]: https://github.com/input-output-hk/ouroboros-network/pull/4265\\n[PR #4612]: https://github.com/input-output-hk/cardano-node/pull/4612\\n[PR #57]: https://github.com/input-output-hk/io-sim/pull/57\\n[PR #60]: https://github.com/input-output-hk/io-sim/pull/60\\n[issue #4222]: https://github.com/input-output-hk/ouroboros-network/issues/4222"},{"id":"2023-01-20-sre","metadata":{"permalink":"/cardano-updates/2023-01-20-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-sre.md","source":"@site/blog/2023-01-20-sre.md","title":"SRE Team Update","description":"High level summary","date":"2023-01-20T00:00:00.000Z","formattedDate":"January 20, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":1.13,"hasTruncateMarker":false,"authors":[{"name":"Michael Fellinger","title":"SRE Team Lead","url":"https://github.com/manveru","imageURL":"https://github.com/manveru.png","key":"manveru"}],"frontMatter":{"title":"SRE Team Update","slug":"2023-01-20-sre","authors":"manveru","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2023-01-20-network"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-01-19-ledger"}},"content":"## High level summary\\n\\nThe SRE team continues work on Cicero, Tullia, and Bitte, as well as providing\\nsupport for cardano-world.\\n\\n## Lower level summary\\n\\n### Cicero\\n\\n- Fixed various race conditions around transformers.\\n- Brought our CI up to date.\\n- Migrated to the Nomad exec driver with Nix support for many actions.\\n- Moved Nix builds to the Nomad clients for much better cache locality.\\n- Ongoing work on vastly improving the action matching and evaluation speed.\\n- \\n\\n### Tullia\\n\\n- Made it easier to support cloning from a PR\'s fork\\n- Update to latest std\\n- Add workaround for cgroup issue: [nomad#12877](https://github.com/hashicorp/nomad/issues/12877)\\n- github preset: add `github.ci.remote` and `(read|get)Repository` functions\\n- Fix various issues around CUE handling\\n\\n### Bitte\\n\\n- Upgrade to NixOS 22.11\\n- Prototype usage of [Colmena](https://colmena.cli.rs) for deploys instead of [deploy-rs](https://github.com/serokell/deploy-rs)\\n- Finalized work on Equinix Metal support\\n- Prototype better secrets management with [ragenix](https://github.com/yaxitech/ragenix) instead of [sops-nix](https://github.com/Mic92/sops-nix)\\n- Improve CI and bring it up to date\\n\\n### cardano-world\\n\\n- Fixd various OOM issues on preview and preprod\\n- Rotated KES keys on preview and preprod\\n- Optimize mainnet db-sync to cope with higher load\\n- Fix an issue where PostgreSQL would fail after a reboot\\n\\n### bitte-world\\n\\n- Updated to NixOS 22.11\\n\\n### ci-world\\n\\n- Updated to NixOS 22.11\\n- Added Equnix cluster\\n- Improve caching of Nix builds"},{"id":"2023-01-19-ledger","metadata":{"permalink":"/cardano-updates/2023-01-19-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-19-ledger.md","source":"@site/blog/2023-01-19-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-01-19T00:00:00.000Z","formattedDate":"January 19, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.665,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-01-19-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2023-01-20-sre"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-01-14-db-sync"}},"content":"## High level summary\\n\\nThe ledger team completed some preliminary ground work in preparation for CIP-1694\\n(restructuring the ledger state),\\nfixed the PDF hosting problem (mostly the formal specs),\\nbuilt out more of the new user-friendly ledger API,\\nfinished a proof of concept for constraint-based generators for property tests\\n(with the hopes of being able to replace our trace generators one day),\\nand addressed technical debt.\\n\\n## Lower level summary\\n\\n### Restructuring the ledger state\\n\\nThe existing governance structures will be replace in the conway ledger era,\\nas described in CIP-1694.\\nIn particular, the ledger rules will be restructured as follows:\\n\\n\\n```\\n BBODY\\n |\\n |-------------------------------|\\n v v\\n TICK LEDGERS\\n | |\\n |---------| |\\n v v v\\n RUPD ~NEWEPOCH~ ~LEDGER~\\n | |\\n |----------| |--------|-------------------|-----------|\\n v v v v v\\n ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+\\n | | |\\n |---------|------------| v |\\n v v v DELPL v\\n SNAP POOLREAP -UPEC- | UTXO\\n |--------| |\\n v v v\\n POOL DELEG ~UTXOS~\\n\\n-..- Removed\\n+..+ Added\\n~..~ Modified\\n```\\n\\nMoreover, the ledger state will also be restructured in accordance with the new rules.\\nIn the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT.\\nWe have also adapted all the data structures in the ledger state.\\n\\nSee:\\n\\n* [pull-3216]\\n\\n### PDF hosting\\n\\nWe now build all of our PDFs using a GitHub action which is triggered by pushing a tag\\nwith a specific form, `cardano-ledger-spec-YYYY-MM-DD`.\\nThe action creates a GitHub release containing the PDFs.\\nThe links in the main ledger README now point to the PDFs in the latest release.\\n\\nSee:\\n\\n* [pull-3245]\\n* [pull-3260]\\n\\n### Powering the new ledger API\\n\\nWe have now removed all the `HasField` instances from the protocol parameter data types,\\nand replaced them with lenses.\\nThis is probably the last major restructuring that the ledger team will do on the code base\\nfor the API for a while\\n(the Plutus tools team will be working on it next, see [here](https://github.com/input-output-hk/cardano-ledger/projects/5)).\\nWe also added a new helpful function `ensureMinCoinTxOut`.\\n\\nSee:\\n\\n* [pull-3242]\\n* [pull-3248]\\n\\n### Constraint-based generators\\n\\nOur largest scale property tests generate an initial ledger state and a long sequence of valid blocks\\nwhich span several epochs, mimicking a real network.\\nThese tests are, in theory, excellent for checking properties.\\nThey are, however, very difficult to maintain and are not as random as we would like\\n(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).\\n\\nWe would like to switch to tests which instead generate a random ledger state representative\\nof not just an initial state, generate a single random valid block, and then test our properties.\\nThe hope is that these will be much more random and easier to maintain.\\n\\nWe have finished a proof of concept are encouraged that this approach could work!\\n\\nSee:\\n\\n* [pull-3219]\\n\\n### Technical debt\\n\\n* [pull-3244] massive CI speedup\\n* [pull-3249] better types for fees in the protocol parameters\\n* [pull-3264] move our annotator code to the `cardano-ledger-binary` package where it belongs\\n* [pull-3239] move the `Wdrls` type to the `Core` module.\\n\\n\\n[pull-3244]: https://github.com/input-output-hk/cardano-ledger/pull/3244\\n[pull-3245]: https://github.com/input-output-hk/cardano-ledger/pull/3245\\n[pull-3248]: https://github.com/input-output-hk/cardano-ledger/pull/3248\\n[pull-3249]: https://github.com/input-output-hk/cardano-ledger/pull/3249\\n[pull-3260]: https://github.com/input-output-hk/cardano-ledger/pull/3260\\n[pull-3264]: https://github.com/input-output-hk/cardano-ledger/pull/3264\\n[pull-3239]: https://github.com/input-output-hk/cardano-ledger/pull/3239\\n[pull-3242]: https://github.com/input-output-hk/cardano-ledger/pull/3242\\n[pull-3216]: https://github.com/input-output-hk/cardano-ledger/pull/3216\\n[pull-3219]: https://github.com/input-output-hk/cardano-ledger/pull/3219"},{"id":"2023-01-14-db-sync","metadata":{"permalink":"/cardano-updates/2023-01-14-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-14-db-sync.md","source":"@site/blog/2023-01-14-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2023-01-14T00:00:00.000Z","formattedDate":"January 14, 2023","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.36,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2023-01-14-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-01-19-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-01-13-hydra"}},"content":"## High level summary\\n\\nAfter spending the last months on improving DBSync and releasing `13.1.0.0` the DBSync team focused\\nthe last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the\\nnew leger core and ghc-9.2.4\\n\\n## Lower level summary\\n- Integrate CHaP\\n[#1331](https://github.com/input-output-hk/cardano-db-sync/pull/1331)\\n- Integrate new ledger core `0.1.1.1` and ghc-9.2\\n[#1332](https://github.com/input-output-hk/cardano-db-sync/pull/1332)\\n- Technical debt: Add code formatter fourmolu\\n[#1334](https://github.com/input-output-hk/cardano-db-sync/pull/1334)\\n- Preparing and tracking Conway and UTxO integration"},{"id":"2023-01-13-hydra","metadata":{"permalink":"/cardano-updates/2023-01-13-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-hydra.md","source":"@site/blog/2023-01-13-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2023-01-13T00:00:00.000Z","formattedDate":"January 13, 2023","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.56,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2023-01-13-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2023-01-14-db-sync"},"nextItem":{"title":"Node Release Team Update","permalink":"/cardano-updates/2023-01-13-release"}},"content":"## High-level summary\\n\\nSince last weekly update before christmas, the Hydra team worked on the\\ntechnical specification, closed gaps in `hydra-plutus` scripts, made the unique\\n`headId` available to Hydra clients through the API, allow the `hydra-node` to\\nexplicitly synchronize from genesis (if configured), and fixed smaller log and\\nbuild issues reported by new users.\\n\\nBesides this, a retrospective [blog\\npost](https://cardanofoundation.org/en/news/hydra-head-protocol-an-open-source-solution-for-scalability/)\\nwas published by Matthias Benkort (CF) on Hydra, summarizing our progress made\\nin 2022 also an outlook where Hydra is headed for in 2023. Also, the team had\\nsome first sessions on the voting project with Catalyst and the CF.\\n\\nA full digest monthly digest for December 2022 can be found on the [hydra\\nwebsite](https://hydra.family/head-protocol/monthly/2022-12).\\n\\n## What did the team achieve this week\\n\\n- Had some first sessions on the voting project with Catalyst and CF\\n- Published retrospective [blog\\n post](https://cardanofoundation.org/en/news/hydra-head-protocol-an-open-source-solution-for-scalability/)\\n by Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also\\n an outlook where Hydra is headed for in 2023.\\n- Worked on the LaTeX spec for HydraHeadV1, not final or published yet - [latest\\n version in this repository](https://github.com/ch1bo/hydra-spec).\\n- Add unique `headId` to API and hence make it available to clients.\\n- Allow `hydra-node` to explicitly synchronize from genesis using `--start-chain-from 0`.\\n- Closed gaps in `hydra-plutus` scripts\\n - bounded transaction validity ([ADR21](https://hydra.family/head-protocol/adr/21/))\\n - enforcing contract continuity via state token in output\\n- Fixed JSON for some logs and smaller build issues reported by new users.\\n\\n## What are the goals of next week\\n\\n- Reach out to have `hydra-tutorial` integrated.\\n- Plan the next couple of months.\\n- Complete checking reimbursing of commits in head validator.\\n- Align plutus scripts to spec and simplify them (identified some simplifications)\\n- Improve mutation framework to be sure we fail tests for the right reasons\\n- Complete the spec except the open points (<5) and also discuss them with researchers."},{"id":"2023-01-13-release","metadata":{"permalink":"/cardano-updates/2023-01-13-release","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-release.md","source":"@site/blog/2023-01-13-release.md","title":"Node Release Team Update","description":"Node Reelease Update","date":"2023-01-13T00:00:00.000Z","formattedDate":"January 13, 2023","tags":[{"label":"release","permalink":"/cardano-updates/tags/release"}],"readingTime":0.64,"hasTruncateMarker":false,"authors":[{"name":"Samuel Leathers","title":"Service Reliability Manager","url":"https://github.com/disassembler","imageURL":"https://github.com/disassembler.png","key":"disassembler"}],"frontMatter":{"title":"Node Release Team Update","slug":"2023-01-13-release","authors":"disassembler","tags":["release"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-01-13-hydra"},"nextItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2023-01-13-system-test"}},"content":"## Node Reelease Update\\n## 2022-11-02 - 2023-01-13\\n\\n### Executive Summary\\n\\nA 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on\\n`release/1.35` branch and does not bump cardano-ledger.\\n\\nThe team successfully integrated an interim release bump of ledger and consensus into cardano-node master.\\nThis work will not be released in a node version, but will be continued by the current dependency bump in progress.\\n\\nWe anticipate once this dependency bump is completed, regular 2 week releases will be feasible again.\\n\\nThe 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress.\\n\\n### Completed\\n\\n- [Release 1.35.4](https://github.com/input-output-hk/cardano-node/releases/tag/1.35.4)\\n\\n### In Progress\\n\\n- [Release 1.35.5](https://github.com/input-output-hk/cardano-node/commits/release/1.35)\\n\\n * [Test Status](https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.5_rc1/src_docs/source/test_results/node/tag_1_35_5_rc1.rst)"},{"id":"2023-01-13-system-test","metadata":{"permalink":"/cardano-updates/2023-01-13-system-test","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-system-test.md","source":"@site/blog/2023-01-13-system-test.md","title":"System Test Team Update","description":"High level summary","date":"2023-01-13T00:00:00.000Z","formattedDate":"January 13, 2023","tags":[{"label":"system-test","permalink":"/cardano-updates/tags/system-test"}],"readingTime":0.91,"hasTruncateMarker":false,"authors":[{"name":"Dorin Solomon","title":"System Test Team Lead","url":"https://github.com/dorin100","imageURL":"https://github.com/dorin100.png","key":"dorin100"}],"frontMatter":{"title":"System Test Team Update","slug":"2023-01-13-system-test","authors":"dorin100","tags":["system-test"],"hide_table_of_contents":false},"prevItem":{"title":"Node Release Team Update","permalink":"/cardano-updates/2023-01-13-release"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-01-12-mithril"}},"content":"## High level summary\\nDuring the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the _P2P Single\\nRelay_ functionality.\\n\\nWe also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level.\\n\\n## Workstreams\\n\\n### Framework improvements:\\n- extended the _cardano-node-tests_ with the ability for anybody to fork the repo and [run all our System Tests on GitHub Actions](https://input-output-hk.github.io/cardano-node-tests/readme.html)\\n- added 2 new nightly pipelines - nightly-mixed and nightly-p2p - [details here](https://input-output-hk.github.io/cardano-node-tests/test_results/nightly_system_tests.html)\\n- some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;\\n\\n` === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) ===\\n to\\n === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===`\\n\\n### Node:\\n- ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled\\n- started the preparations for testing the next tag - [details here](https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.5_rc1/src_docs/source/test_results/node/tag_1_35_5_rc1.rst)\\n\\n### DB-Sync:\\n- some improvements on db-sync sync tests"},{"id":"2023-01-12-mithril","metadata":{"permalink":"/cardano-updates/2023-01-12-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-12-mithril.md","source":"@site/blog/2023-01-12-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2023-01-12T00:00:00.000Z","formattedDate":"January 12, 2023","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.165,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2023-01-12-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2023-01-13-system-test"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-01-11-consensus"}},"content":"## High level overview\\nThe Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an [ADR](https://mithril.network/doc/adr/4). They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible.\\n\\nFinally, they have worked on upgrading the `devnet` and fixing some flakiness in the end to end tests of the CI.\\n\\n## Low level overview\\n- Implemented the redaction of an ADR for handling graceful updates of the Mithril Network [#671](https://github.com/input-output-hk/mithril/issues/671)\\n- Worked on a proof of concept to handle backward compatibilty of exchanged messages with `protobuf` [#677](https://github.com/input-output-hk/mithril/issues/677)\\n- Worked on a proof of concept to handle backward compatibilty of exchanged messages with `avro` [#678](https://github.com/input-output-hk/mithril/issues/678)\\n- Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction [#672](https://github.com/input-output-hk/mithril/issues/672)\\n- Worked on upgrading the Cardano node of the Mithril `devnet`, as well as fixing flakiness of the CI [#523](https://github.com/input-output-hk/mithril/issues/523)\\n- Prepared and tested the new `2302` distribution pre-release [2302.0-prerelease](https://github.com/input-output-hk/mithril/releases/tag/2302.0-prerelease)\\n- Updated the documentation for SPO to build a signer node in order to better reflect the new release process [#681](https://github.com/input-output-hk/mithril/issues/681)"},{"id":"2023-01-11-consensus","metadata":{"permalink":"/cardano-updates/2023-01-11-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-11-consensus.md","source":"@site/blog/2023-01-11-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2023-01-11T00:00:00.000Z","formattedDate":"January 11, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":2.35,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2023-01-11-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-01-12-mithril"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-01-11-performance-and-tracing"}},"content":"## High level summary\\n\\nThe consensus team is resuming its activities after the Christmas break. During\\nthese weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and\\ndiscussing with the Ledger team the changes that might be required for the next\\niterations. The pull request that adds the Conway era is waiting for a second\\nreview round and we hope to merge it soon. On the technical debt side we are\\nlooking into a property-test failure found in the iterators. We are\\ninvestigating if this is an error in the model or in the implementation. We also\\nimproved the documentation of our testing code.\\n\\n## Workstreams \\n\\n### UTxO HD Prototype \\n\\nWe worked with the Ledger team to start preparing the next versions of UTxO-HD.\\nThe Ledger team is concerned that for the remaining maps we might need the full\\nledger state on epoch boundaries. Since the main consumer of the ledger rules is\\nConsensus, the code that requires access to a full state could be moved from the\\nledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take\\nplace in such bridge, instead of querying the ledger for the values that are\\nrequired in the epoch-transition computations.\\n\\nWe [relocated][pull-4234] some UTxO-HD definitions, in preparation for merging\\nthe prototype into `master`.\\n\\nWe also completed updated local benchmarks comparing the replay time and memory\\nconsumption of:\\n\\n- the baseline node (`f2fc76ef45647275c98634da1718290b976ff364`) \\n- the UTxO-HD node with the in-memory backend \\n- the UTxO-HD node with the LMDB backend\\n\\nThe following plot shows the results: we can see that the LMDB node barely\\nreaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The\\nin-memory backend is about 30 minutes faster, but still slower than the baseline\\nversion. We are aware of this phenomenon and it is inherent to the problem of\\nmaintaining sequences of differences of the last `k` ledger states that allows\\nus to perform rollback and roll-forward. We are in the process of measuring\\nsyncing from scratch times.\\n\\n![](/images/consensus/2023-01-11-utxo-hd-replay-benchmarks.png)\\n\\nWe also [added `StaticEither` accessors][pull-4263] that helped us to simplify\\nthe UTxO-HD prototype.\\n\\n### New Conway era\\n\\nWe incorporated the feedback of the [pull request][pull-3971], and rebased this\\nbranch on top of `master`. The PR is pending a second review round and we hope\\nto merge this soon.\\n\\n### Technical debt \\n\\nWe are investigating a [property-testing failure][issue-4183] involving\\niterators. Solving this requires understanding the expected behavior of\\niterators in the counterexample found by `QuickCheck` to determine if the error\\nis in the model or in the implementation.\\n\\n### Fostering collaboration\\n\\nWe [moved][pull-4248] the contents of `docs/Testing.md` closer to the code, so that the\\nexplanations about the tests are easier to find in the relevant modules, and the\\ndocumentation is easier to keep up to date.\\n\\n[pull-4234]: https://github.com/input-output-hk/ouroboros-network/pull/4234\\n[issue-4183]: https://github.com/input-output-hk/ouroboros-network/issues/4183\\n[pull-4248]: https://github.com/input-output-hk/ouroboros-network/pull/4248\\n[pull-3971]: https://github.com/input-output-hk/ouroboros-network/pull/3971\\n[pull-4263]: https://github.com/input-output-hk/ouroboros-network/pull/4263"},{"id":"2023-01-11-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2023-01-11-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-11-performance-and-tracing.md","source":"@site/blog/2023-01-11-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2023-01-11T00:00:00.000Z","formattedDate":"January 11, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.865,"hasTruncateMarker":false,"authors":[{"name":"Serge Kosyrev","title":"Performance and Tracing Team Lead","url":"https://github.com/deepfire","imageURL":"https://github.com/deepfire.png","key":"deepfire"}],"frontMatter":{"title":"Performance & tracing update","slug":"2023-01-11-performance-and-tracing","authors":"deepfire","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-01-11-consensus"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-01-06-crypto"}},"content":"## High level summary\\n\\nSince our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:\\n\\n1. SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress.\\n2. The new tracing system: the improved API of the new tracing system was implemented, and we\'re now porting the tracing integration layer over.\\n3. Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks.\\n4. New benchmark deployment infrastructure: we\'ve made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs.\\n5. Legacy benchmarking: we\'ve started merging the legacy benchmark deployment infrastructure into the workbench.\\n6. Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.\\n\\n## Performance\\n\\nThe AWS cluster infrastructure necessary for SECP benchmarking is still being worked on.\\n\\n## Tracing\\n\\nThe improved tracing internals were implemented, and we\'re now into the phase of updating the tracing integration, which is also mostly done.\\n\\n## Infrastructure\\n\\nThanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components.\\n\\nOn the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters.\\nWe now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes.\\n\\nWe also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development.\\nOnce this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads."},{"id":"2023-01-06-crypto","metadata":{"permalink":"/cardano-updates/2023-01-06-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-06-crypto.md","source":"@site/blog/2023-01-06-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2023-01-06T00:00:00.000Z","formattedDate":"January 6, 2023","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.46,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2023-01-06-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2023-01-11-performance-and-tracing"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-01-05-ledger"}},"content":"## High level summary\\nThe four open fronts that the crypto team is working on are:\\n* MuSig2: The API features (error handling) has been merged. \\n* Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures.\\n* cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. \\n* KES agent: We keep progressing with KES secure forgetting implementation.\\n\\nWe also started working in the cryptography engineering handbook, which will be a cross team effort.\\n\\n## Low level summary\\n### MuSig2\\n* Merged the more granular error handling mechanism [PR#33](https://github.com/input-output-hk/musig2/pull/33)\\n\\n### Mithril\\n* Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in [Version 0.1.1](https://github.com/input-output-hk/kes/commit/9de00835ed354cbb8d37838f6cee57930ea9fd3d), which was published in [crates.io](https://crates.io/crates/kes-summed-ed25519). \\n* Updated new KES format to mithril library [PR 674](https://github.com/input-output-hk/mithril/pull/674)\\n* We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync [PR 531](https://github.com/input-output-hk/mithril/pull/531)\\n* We keep progressing on reducing the use of `transmute` in `mithril-stm`.\\n### cardano-base\\n* Nothing new to report. Still working in merging these PRs. We are only missing nix merge of [PR#520](https://github.com/input-output-hk/iohk-nix/pull/520) and the updates on VRF will be merged.\\n\\n### KES agent\\n* We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests [PR#255](https://github.com/input-output-hk/cardano-base/pull/255#issuecomment-1362601518).\\n\\n### Cryptography handbook\\nWe have made available the (temporary) cryptography handbook https://input-output-hk.github.io/cryptography_spec/, and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives."},{"id":"2023-01-05-ledger","metadata":{"permalink":"/cardano-updates/2023-01-05-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-05-ledger.md","source":"@site/blog/2023-01-05-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2023-01-05T00:00:00.000Z","formattedDate":"January 5, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":4.44,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-01-05-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2023-01-06-crypto"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-12-28-node-cli-api"}},"content":"## High level summary\\n\\nThe ledger team finished up the remaining work for tracking individual depots,\\nbuilt out the new Conway era transaction body (in line with CIP-1694),\\ngreatly reduce some problematically large calculations on the epoch boundary,\\nand addressed technical debt.\\n\\n## Lower level summary\\n\\n### Finishing the deposit tracking\\n\\nThe initial work on the individual deposit tracking project focused only on correctness.\\nAs this is a large data structure\\n(since its size is linear with respect to the number of registered stake credentials),\\nit is very important that we also reduce the memory overhead as much as possible.\\nFortunately, we were able to add very little overhead for the deposits by using existing\\nefficient data structures. The extra tracking now only incurs one word (8 bytes)\\nper registered stake credential.\\n\\nSee:\\n* [pull-3195]\\n* [pull-3202]\\n* [pull-3217]\\n\\n### New Conway era transaction\\n\\nWe implemented the Conway era transaction body, which is in line with CIP-1694.\\nNote that the Conway era implements, losing speaking, the parts of CIP-1694 that are not\\nrelated to the liquid democracy (the \\"DReps\\").\\nThe new transaction body adds the new governance actions and votes,\\nwhile also deprecating the old governance structures\\n(i.e. the old protocol parameter updates and MIR certificates).\\n\\nWe also now have the wire specification (CDDL file) and serialization code in place.\\nThe wire specification is still subject to change while we work on the Conway era,\\nbut it is now usable and has proper testing support\\n(so that, for example, the serialization round-trips, etc).\\n\\nSee:\\n* [pull-3176]\\n* [pull-3226]\\n\\n### Optimizing the `TICKF` transition\\n\\nEvery since the release of the Shelley era, we have been working to reduce the computational load\\nplaced on the node by the ledger at the epoch boundary.\\nWhile still not perfect, we believe that we have removed one of the final problematically long\\nepoch boundary computations that exacerbate situations like\\n[this](https://github.com/input-output-hk/cardano-node/issues/4421).\\nIn particular, the problem involved the way in which the consensus layer obtains a view of the\\nledger for the purposes of checking the leadership schedule in a new epoch.\\nWe implemented a stopgap measure which now only incurs a single multi-second cost once per epoch\\ninstead of potentially several multi-second costs while the networks waits for the first block\\nof a new epoch to be minted.\\n\\nSee:\\n* An [ADR](https://github.com/input-output-hk/cardano-ledger/blob/ea48d4815946c4f35239eb41815fe06cd6ffec2e/docs/adr/2022-12-12_007-optimize-ledger-view.md) about the decision.\\n* [pull-3209]\\n\\n### Technical debt\\n\\nWe closed the year out with a lot of reduction to the technical debt!\\n\\n#### Improved ledger event\\n\\n* [pull-3212] - The ledger events are not guaranteed to appear in any given order within a block.\\n For this reason, motivated by the use case in db-sync, the `TotalDeposits` event now\\n includes a transaction ID and emits the _change_ in deposits instead of the value.\\n\\n#### Improved type saftey\\n\\n* [pull-3208] - We replaced `NominalDiffTime` with a newtype wrapper. The problem was that our CBOR\\n encoders and decoders were using the wrong level of precision, having to due with with\\n the Shelley genesis file. We removed the potential problem with a newtype wrapper.\\n* [pull-3167] - We now use a GADT to ensure consistency of the Plutus language in the types\\n for `TransactionScriptFailure` and `PlutusDebug`.\\n\\n#### Code/Module organization\\n\\n* [pull-3175] - The Allegra and Mary eras had an unusual relationship in our codebase,\\n due to the uncertainly of release dates while we were implementing them.\\n In particular, they were coupled in way that is different from the rest of the code base.\\n With hindsight on our side, we split the combined `shelley-ma` Haskell package into two\\n separate ledger era packages, which is now consistent with the rest of the repository\\n and module structure.\\n* [pull-3184] - We created a core test sub-library, cleaning up a lot of our property test\\n generator code.\\n* [pull-3210] - We moved the `KeyPair` type to the test library. Outside of testing,\\n the ledger does not need to deal with signing keys, and since this is a topic that\\n deserves the utmost care, it is best to make it clear that our use of signing keys\\n is only for testing.\\n* [pull-3229] - We split the `Cardano.Ledger.Alonzo.Data` module, which is more consistent with the rest\\n of the codebase.\\n\\n#### Revert pointer address deprecation\\n\\nThanks to one of our excellent internal auditors,\\n[@jmhrpr](https://github.com/jmhrpr),\\nwe now have a better plan for deprecating pointer addresses.\\nThis meant that we had to revert the previous work to deprecate them.\\n\\nSee:\\n* [issue-3161]\\n* [pull-3215]\\n\\n#### Miscellaneous\\n\\n* [pull-3205] - We removed deprecated type synonyms.\\n* [pull-3218] - We cleaned up the address deserialization.\\n* [pull-3223] - We fixed faulty address deserialization tests.\\n* [pull-3222] - We switched to a general type family `TxOut` from concrete ones,\\n reducing many constraints.\\n* [pull-3224] - `ShelleyGenesis` is now parameterized by crypto instead of by era.\\n* [pull-3170] - We set the cabal-version to 3.0 in our projects.\\n* [pull-3172] - We removed the now useless `EncodeMint`/`DecodeMint` classes.\\n* [pull-3225] - We switch from [ormolu](https://hackage.haskell.org/package/ormolu) to \\n [fourmolu](https://hackage.haskell.org/package/fourmolu).\\n The reason was to be able to finally have more diff friendly code!\\n\\n[issue-3161]: https://github.com/input-output-hk/cardano-ledger/issues/3161\\n[pull-3175]: https://github.com/input-output-hk/cardano-ledger/pull/3175\\n[pull-3176]: https://github.com/input-output-hk/cardano-ledger/pull/3176\\n[pull-3184]: https://github.com/input-output-hk/cardano-ledger/pull/3184\\n[pull-3195]: https://github.com/input-output-hk/cardano-ledger/pull/3195\\n[pull-3202]: https://github.com/input-output-hk/cardano-ledger/pull/3202\\n[pull-3205]: https://github.com/input-output-hk/cardano-ledger/pull/3205\\n[pull-3208]: https://github.com/input-output-hk/cardano-ledger/pull/3208\\n[pull-3209]: https://github.com/input-output-hk/cardano-ledger/pull/3209\\n[pull-3210]: https://github.com/input-output-hk/cardano-ledger/pull/3210\\n[pull-3212]: https://github.com/input-output-hk/cardano-ledger/pull/3212\\n[pull-3214]: https://github.com/input-output-hk/cardano-ledger/pull/3214\\n[pull-3215]: https://github.com/input-output-hk/cardano-ledger/pull/3215\\n[pull-3217]: https://github.com/input-output-hk/cardano-ledger/pull/3217\\n[pull-3218]: https://github.com/input-output-hk/cardano-ledger/pull/3218\\n[pull-3222]: https://github.com/input-output-hk/cardano-ledger/pull/3222\\n[pull-3223]: https://github.com/input-output-hk/cardano-ledger/pull/3223\\n[pull-3224]: https://github.com/input-output-hk/cardano-ledger/pull/3224\\n[pull-3225]: https://github.com/input-output-hk/cardano-ledger/pull/3225\\n[pull-3226]: https://github.com/input-output-hk/cardano-ledger/pull/3226\\n[pull-3229]: https://github.com/input-output-hk/cardano-ledger/pull/3229\\n[pull-3167]: https://github.com/input-output-hk/cardano-ledger/pull/3167\\n[pull-3170]: https://github.com/input-output-hk/cardano-ledger/pull/3170\\n[pull-3172]: https://github.com/input-output-hk/cardano-ledger/pull/3172"},{"id":"2022-12-28-node-cli-api","metadata":{"permalink":"/cardano-updates/2022-12-28-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-28-node-cli-api.md","source":"@site/blog/2022-12-28-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2022-12-28T00:00:00.000Z","formattedDate":"December 28, 2022","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.325,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-12-28-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-01-05-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-12-16-hydra"}},"content":"# 2022-12-28 - 2023-01-10\\n\\n## High level summary\\n\\n## Completed\\n\\n### docs\\n\\n### CI & project maintenance\\n- [Fix hedgehog-extras sha hash](https://github.com/input-output-hk/cardano-node/pull/4762)\\n- [Update hegehog-extras bounds](https://github.com/input-output-hk/cardano-node/pull/4759)\\n- [GitHub token fix](https://github.com/input-output-hk/cardano-node/pull/4751)\\n- [Use setup-haskell action](https://github.com/input-output-hk/cardano-node/pull/4743)\\n- [Use Github Action to install libsecp256k1](https://github.com/input-output-hk/cardano-node/pull/4738)\\n- [Update index state and hedgehog-extras.](https://github.com/input-output-hk/cardano-node/pull/4714)\\n- [Cleaned cabal files](https://github.com/input-output-hk/cardano-node/pull/4710)\\n- [Add cache versioning](https://github.com/input-output-hk/cardano-node/pull/4737)\\n- [Delete obsolete scripts](https://github.com/input-output-hk/cardano-node/pull/4742)\\n- [Use SECURITY.md published in Cardano Engineering Handbook](https://github.com/input-output-hk/cardano-node/pull/4746)\\n\\n### Developer experience\\n\\n### cardano-cli\\n- [Infer protocol params in transaction build](https://github.com/input-output-hk/cardano-node/pull/4431)\\n- [Allow assembling transactions with no witnesses](https://github.com/input-output-hk/cardano-node/pull/4408)\\n- [Filter out duplicate collateral inputs in tx build cmds](https://github.com/input-output-hk/cardano-node/pull/4749)\\n- [Optimise query stake-snapshot command](https://github.com/input-output-hk/cardano-node/pull/4754)\\n\\n### cardano-api\\n\\n### cardano-node\\n\\n### cardano-testnet\\n\\n## In Progress\\n\\n## CI & project mainteance\\n- [Copyright updates](https://github.com/input-output-hk/cardano-node/pull/4755)\\n\\n### cardano-cli\\n- [Fix bug in hash computation in cardano-cli genesis create-cardano](https://github.com/input-output-hk/cardano-node/pull/4761)\\n- [Cleanup exports of cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/4636)\\n- [BUGFIX]- [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Multiple pools support in query stake snapshot](https://github.com/input-output-hk/cardano-node/pull/4279)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n- [Handle pipes in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4625)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n- [Render consistent plutus script failure output](https://github.com/input-output-hk/cardano-node/pull/4659)\\n- [Read network ID from environment](https://github.com/input-output-hk/cardano-node/pull/4666)\\n- [CLI option to append additional signatures to a transactions](https://github.com/input-output-hk/cardano-node/pull/4647)\\n- [Cardano ping](https://github.com/input-output-hk/cardano-node/pull/4664)\\n- [Better error message for query utxo on oops](https://github.com/input-output-hk/cardano-node/pull/4777)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n- [Remove simple script distinction](https://github.com/input-output-hk/cardano-node/pull/4763)\\n- [Export SubmitResult from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4753)\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)\\n\\n### cardano-testnet\\n- [Use Haskell variables for passing values](https://github.com/input-output-hk/cardano-node/pull/4845)"},{"id":"2022-12-16-hydra","metadata":{"permalink":"/cardano-updates/2022-12-16-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-16-hydra.md","source":"@site/blog/2022-12-16-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2022-12-16T00:00:00.000Z","formattedDate":"December 16, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.27,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-12-16-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-12-28-node-cli-api"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-12-15-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on [the website](https://hydra.family/head-protocol/benchmarks/transaction-cost/) and reduced the cost for commit transactions by ~30% with the help of reference scripts.\\n\\nThe year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023.\\n\\n## What did the team achieve this week\\n\\n- Kicked-off Hydra Voting project with Catalyst, CF, and IO Research.\\n- Reduce commit transaction costs by ~30% with reference scripts.\\n- Prepared an RFP for external audit of the Hydra Head solution.\\n- Fixed transaction cost benchmarks for abort tx [#631](https://github.com/input-output-hk/hydra/issues/631).\\n- Recorded decision to use model-based testing ([ADR22](https://hydra.family/head-protocol/adr/22/)) and improved Model [documentation](https://hydra.family/head-protocol/haddock/hydra-node/tests/Hydra-Model.html).\\n - Concluding the first increment on “Validate coordinated Head protocol” [#194](https://github.com/input-output-hk/hydra/issues/194).\\n - Formulated next step / follow-up on testing the Soundness property of our protocol [#656](https://github.com/input-output-hk/hydra/issues/656).\\n- Switched to using nix flakes for development setup and CI build [#646](https://github.com/input-output-hk/hydra/pull/646).\\n\\n## What are the goals of next week\\n\\n- Push [ADR21](https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md) & tx validity gap over the finish line (smoke tests missing).\\n- Integrate the `hydra-tutorial`.\\n- Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.\\n- Close & recap on the year with another monthly report (+ blog post)."},{"id":"2022-12-15-mithril","metadata":{"permalink":"/cardano-updates/2022-12-15-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-15-mithril.md","source":"@site/blog/2022-12-15-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2022-12-15T00:00:00.000Z","formattedDate":"December 15, 2022","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.11,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2022-12-15-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-12-16-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-12-14-consensus"}},"content":"## High level overview\\nThe Mithril team has released the new distribution [`2248.1`](https://github.com/input-output-hk/mithril/releases/tag/2248.1) of their nodes. They have published the first version of the Mithril cryptographic library on [`crates.io`](https://crates.io/crates/mithril-stm), the Rust community\u2019s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots.\\n\\nFinally, they have kept on simplifying the aggregator node\'s multi-signer by removing the signer registration and the certificate creation from its responsibilities.\\n\\n## Low level overview\\n- Implemented removing verification key and stake from single signatures [#619](https://github.com/input-output-hk/mithril/issues/619)\\n- Completed the extraction of the signer registration from the multi-signer [#642](https://github.com/input-output-hk/mithril/issues/642)\\n- Completed the extraction of the certificate creation from the multi-signer [#638](https://github.com/input-output-hk/mithril/issues/638)\\n- Implemented a workflow to test client binaries (Linux / MacOS / Windows) [#601](https://github.com/input-output-hk/mithril/issues/601)\\n- Completed the signature of the artifacts produced by the CI [#587](https://github.com/input-output-hk/mithril/issues/587)\\n- Fixed the protocol parameters transition [#627](https://github.com/input-output-hk/mithril/issues/627)\\n- Worked on optimizing the snapshot digest computation [#510](https://github.com/input-output-hk/mithril/issues/510)\\n- Worked on enforcing the API protocol versions in the client and signer [#633](https://github.com/input-output-hk/mithril/issues/633)\\n- Worked on deactivating the non certified signer registration mode [#621](https://github.com/input-output-hk/mithril/issues/621)\\n- Worked on the re-genesis of the test networks [#651](https://github.com/input-output-hk/mithril/issues/651)"},{"id":"2022-12-14-consensus","metadata":{"permalink":"/cardano-updates/2022-12-14-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-consensus.md","source":"@site/blog/2022-12-14-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2022-12-14T00:00:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":2.995,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-12-14-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-12-15-mithril"},"nextItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2022-12-14-db-sync"}},"content":"## High level summary\\n\\nDuring the past two weeks, the Consensus team finalized the QSM tests for the\\nbacking store and Mempool on the UTxO-HD branch with important discoveries\\nregarding parallel QSM testing. We also worked with the Ledger team to envisage\\nthe modifications that are required in Ledger and Consensus to accommodate the\\nchanges in the crypto VRF and KES. The `db-analyser` now supports bechmarking\\nthe ledger operations, which will allow us to identify, debug, and profile\\npotential performance problems. We drafted a document that defines how to manage\\nthe versions of Consensus-related packages. The top level documentation of\\n`ouroboros-network` now features a description of the consensus components and\\nprovides a hyperlinked map to the modules documentation.\\n\\n## Workstreams\\n\\n### UTxO HD prototype\\n\\nWhereas we had passing sequential state-machine tests for the mempool, the\\nparallel case proved to be more challenging than we thought. The operation of\\nadding a list of transactions to the mempool is not atomic and, as a result,\\nwhen adding a list of transactions, transactions from other processes can be\\nadded in between. The mempool implementation handles this correctly, however\\nthis required us to [redesign][pull-4076] the parallel model we had to take\\nthe lack of atomicity into account.\\n\\n#### Backing store property tests\\n\\nWe finished refactoring the backing store property tests. The second review\\nround is ongoing.\\n\\n### LSM tree implementation\\n\\nWe are working on benchmarking (in terms of time and number of IO operations)\\nfetching/looking up data from disk.\\n\\n### Genesis \\n\\nWe worked on the design of a mechanism to prevent a DoS attack on our Genesis\\ndesign related to rollbacks. This was arguably the biggest outstanding question.\\n\\nDuring the discussions around Genesis, we noticed a design boundary that nicely\\ndelineates a fundamental component. We almost have a full Haskell prototype of\\nit. It will be very nicely self-contained, perhaps even usable in the ultimate\\nimplementation!\\n\\n### New VRF and KES crypto integration\\n\\nWe collaborated with the Ledger team on preparing the ledger state and crypto\\ntypes to avoid huge allocation on the epoch boundary when changing aspects of\\nthe crypto that will only manifest in headers, not in the ledger states.\\n\\n### Technical debt\\n\\nWe merged the [pull-request][pull-4014] that adds a support to `db-analyser` for\\nbenchmarking ledger operations. This will allow us to identify, debug, and\\nprofile potential performance problems. The benchmark focus on the main 5 ledger\\noperations that are involved in chain syncing, block forging, and block\\nvalidation, namely:\\n\\n0. Forecast.\\n1. Header tick.\\n2. Header application.\\n3. Block tick.\\n4. Block application.\\n\\nThe following figure shows a plot of the benchmarking results for the first 65\\nmillion blocks (approximately) of the Cardano chain. The thin yellow lines under\\nthe x-axis show the epoch boundaries, whereas the thick yellow lines correspond\\nto the era transitions.\\n\\n![](/images/consensus/2022-12-14-ledger-ops-benchmark.png)\\n\\nAs we can see in this figure, era and epoch boundaries require more computation\\ntime. The ledger team are aware of this problem, and we are working to improve\\nthis situation.\\n\\n### Fostering collaboration\\n\\nWe [drafted a document][pull-4207] motivating and defining how Consensus (and\\npossibly other core teams) will/should manage our package versions. This\\npull-request garnered many great discussions from our team members and other\\nteams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et\\nal. We want to thank you all for your input, and we found this discussion very\\nenlightening!\\n\\nWe merged the [pull request][pull-4197] that adds an overview of consensus to\\nthe [top level\\ndocumentation](https://input-output-hk.github.io/ouroboros-network/) of\\nouroboros-network. This overview describes the consensus components and adds a\\nhyperlinked map to the modules documentation.\\n\\n[pull-4207]: https://github.com/input-output-hk/ouroboros-network/pull/4207\\n[pull-4014]: https://github.com/input-output-hk/ouroboros-network/pull/4014\\n[pull-4076]: https://github.com/input-output-hk/ouroboros-network/pull/4076\\n[pull-4197]: https://github.com/input-output-hk/ouroboros-network/pull/4197"},{"id":"2022-12-14-db-sync","metadata":{"permalink":"/cardano-updates/2022-12-14-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-db-sync.md","source":"@site/blog/2022-12-14-db-sync.md","title":"DB-sync Team Update","description":"High level summary","date":"2022-12-14T00:00:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.73,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB-sync Team Update","slug":"2022-12-14-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-12-14-consensus"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-12-14-node-cli-api"}},"content":"## High level summary\\n\\nThe DBSync team continued testing release `13.1.0.0`. The QA team has reported that no issues have\\nbeen found. The DBSync team also worked on cherry-picks back to master and on fixing bugs.\\n\\n## Lower level summary\\n\\n- Release is cherry-picked back to master, which uses the new rollback mechanism which uses\\nreverse indexes, same as the release\\n[#1320](https://github.com/input-output-hk/cardano-db-sync/pull/1320)\\nThis also fixes a bug number of issues on master.\\n- Depenencies upgrade and CHaP integration\\n[#1324](https://github.com/input-output-hk/cardano-db-sync/pull/1324)\\n- AdaPots fix [#1323](https://github.com/input-output-hk/cardano-db-sync/pull/1323). This\\nfixes an issue where the per epoch AdaPots didn\'t match the epoch boundary, but\\nthey also included changes from the first block of the epoch.\\n- Deposits Event fix [#3212](https://github.com/input-output-hk/cardano-ledger/pull/3212). This pr\\nadjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the\\nnumber of queries that db-sync does during syncing an make syncing faster."},{"id":"2022-12-14-node-cli-api","metadata":{"permalink":"/cardano-updates/2022-12-14-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-node-cli-api.md","source":"@site/blog/2022-12-14-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2022-12-14T00:00:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.46,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-12-14-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"DB-sync Team Update","permalink":"/cardano-updates/2022-12-14-db-sync"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2022-12-14-performance-and-tracing"}},"content":"# 2022-12-14 - 2022-12-27\\n\\n## High level summary\\n\\nPRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped. \\n\\n## Completed\\n\\n### docs\\n\\n- [Move style guide to wiki](https://github.com/input-output-hk/cardano-node/pull/4703)\\n\\n### CI & project maintenance\\n\\n- [Cache secp256k1](https://github.com/input-output-hk/cardano-node/pull/4734)\\n- [Use cabal-cache](https://github.com/input-output-hk/cardano-node/pull/4717)\\n- [build(deps): bump certifi from 2020.4.5.2 to 2022.12.7 in /doc/.sphinx](https://github.com/input-output-hk/cardano-node/pull/4699)\\n- [Update cabal.project](https://github.com/input-output-hk/cardano-node/pull/4724)\\n\\n### Developer experience\\n\\n- [Add aarch64-darwin to nix-shell](https://github.com/input-output-hk/cardano-node/pull/4125)\\n\\n### cardano-cli\\n- [Improved error message for failed asset name decode](https://github.com/input-output-hk/cardano-node/pull/4626)\\n- [Optimise query leadership schedule command](https://github.com/input-output-hk/cardano-node/pull/4250)\\n- [Remove cardano-cli address build-script](https://github.com/input-output-hk/cardano-node/pull/4700)\\n\\n### cardano-api\\n- [Move signing key reading to cardano-api](https://github.com/input-output-hk/cardano-node/pull/4698)\\n\\n### cardano-node\\n\\n### cardano-testnet\\n- [Only run chairman test on latest era](https://github.com/input-output-hk/cardano-node/pull/4712)\\n- [Add fix and test for `foldBlocks`](https://github.com/input-output-hk/cardano-node/pull/4679)\\n\\n## In Progress\\n\\n## CI & project mainteance\\n- [Copyright updates](https://github.com/input-output-hk/cardano-node/pull/4755)\\n\\n### cardano-cli\\n- [BUGFIX]- [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Infer protocol params in transaction build](https://github.com/input-output-hk/cardano-node/pull/4431)\\n- [Allow assembling transactions with no witnesses](https://github.com/input-output-hk/cardano-node/pull/4408)\\n- [Multiple pools support in query stake snapshot](https://github.com/input-output-hk/cardano-node/pull/4279)\\n- [Optimise query leadership schedule command](https://github.com/input-output-hk/cardano-node/pull/4250)\\n- [Optimise query stake snapshot command](https://github.com/input-output-hk/cardano-node/pull/4179)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n- [Handle pipes in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4625)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n- [Render consistent plutus script failure output](https://github.com/input-output-hk/cardano-node/pull/4659)\\n- [Read network ID from environment](https://github.com/input-output-hk/cardano-node/pull/4666)\\n- [CLI option to append additional signatures to a transactions](https://github.com/input-output-hk/cardano-node/pull/4647)\\n- [Cardano ping](https://github.com/input-output-hk/cardano-node/pull/4664)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)\\n\\n### cardano-testnet\\n- [Cleanup exports of cardano-testnet](https://github.com/input-output-hk/cardano-node/pull/4636)"},{"id":"2022-12-14-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2022-12-14-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-performance-and-tracing.md","source":"@site/blog/2022-12-14-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2022-12-14T00:00:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":3.095,"hasTruncateMarker":false,"authors":[{"name":"Serge Kosyrev","title":"Performance and Tracing Team Lead","url":"https://github.com/deepfire","imageURL":"https://github.com/deepfire.png","key":"deepfire"}],"frontMatter":{"title":"Performance & tracing update","slug":"2022-12-14-performance-and-tracing","authors":"deepfire","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-12-14-node-cli-api"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-12-12-network"}},"content":"## High level summary\\n\\n1. SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment.\\n2. A new workstream for Plutus cost modeling improvement: we\'ve planned and started implementing the smart contract call overhead measurement machinery.\\n3. The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we\'re continuing with the further performance-oriented rework of the internals.\\n4. Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started.\\n5. Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.\\n\\n## Performance\\n\\nThe SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we\'ll be running the model cluster workload.\\n\\nWe\'ve also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling.\\n\\n## Tracing\\n\\nAfter the initial model-scale performance data caused us to panic, among other things we\'ve done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical.\\n\\nTo understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:\\n\\n 1. We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that\'s also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration.\\n 2. The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it\'s the fair benchmark, because that\'s the way we expect SPO\'s to set up tracing. That, however also causes it to do more work.\\n\\nAll that said, since we\'ve established the performance of the new system to be adequate for the release, we won\'t be delaying it much further.\\n\\nIn addition, we\'re still pursuing our performance-enhancing rework of the new tracing internals.\\n\\n## Infrastructure\\n\\nAfter implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends.\\n\\nMoving to analysis, we\'ve also improved provenance of the raw data, by collecting more identification information and statistics about it.\\nThis means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis.\\nThis will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports.\\n\\nA new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches.\\nPreviously we only had automation for two aspects separately, so we only could either:\\n - compare individual runs (used for different node configurations / versions)\\n - collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version)\\nNaturally, combining these two capabilities was a long-desired feature of our analysis pipeline."},{"id":"2022-12-12-network","metadata":{"permalink":"/cardano-updates/2022-12-12-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-12-network.md","source":"@site/blog/2022-12-12-network.md","title":"Network Team Update","description":"High level summary","date":"2022-12-12T00:00:00.000Z","formattedDate":"December 12, 2022","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"},{"label":"release","permalink":"/cardano-updates/tags/release"}],"readingTime":0.43,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2022-12-12-network","authors":"coot","tags":["network","release"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2022-12-14-performance-and-tracing"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-12-09-crypto"}},"content":"## High level summary\\n\\nIn last sprint the team focused on preparations for the conference talk at\\n[OPODIS 2022]. We also worked on preparations to publish `io-sim` and related\\npackages on Hackage ([PR #57], [PR #60]).\\n\\nWe also started reviewing:\\n* `ouroboros-network`\\n* `cardano-node`\\n* `cardano-ledger`\\nrepositories for open-source readiness ([PR #4128]).\\n\\nWe prepared a PR which changes how `node-to-node` and `node-to-client` protocol\\nversiones are serialised in `cardano-node` log ([PR #4691]).\\n\\n[OPODIS 2022]: https://sites.uclouvain.be/OPODIS2022/\\n[PR #57]: https://github.com/input-output-hk/io-sim/pull/57\\n[PR #60]: https://github.com/input-output-hk/io-sim/pull/60\\n[PR #4128]: https://github.com/input-output-hk/ouroboros-network/pull/4218\\n[PR #4691]: https://github.com/input-output-hk/cardano-node/pull/4691"},{"id":"2022-12-09-crypto","metadata":{"permalink":"/cardano-updates/2022-12-09-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-crypto.md","source":"@site/blog/2022-12-09-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2022-12-09T00:00:00.000Z","formattedDate":"December 9, 2022","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.39,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2022-12-09-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-12-12-network"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-12-09-hydra"}},"content":"## High level summary\\nThe four open fronts that the crypto team is working on are:\\n* MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency. \\n* Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe. \\n* cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack. \\n* KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.\\n\\n## Low level summary\\n### MuSig2\\n* [Still in progress] We are introducing a more granular error handling mechanism [PR#33](https://github.com/input-output-hk/musig2/pull/33)\\n* We merged the API redesig [PR#35](https://github.com/input-output-hk/musig2/pull/35)\\n* We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We\'ll probably circle back to this in the future [PR#36](https://github.com/input-output-hk/musig2/pull/36)\\n\\n### Mithril\\n* We merged the individual signature [PR#620](https://github.com/input-output-hk/mithril/pull/620)\\n* We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser ([kes repo](https://github.com/input-output-hk/kes/commits/master)) \\n\\n### cardano-base\\n* Nothing new to report. Still working in merging these PRs. \\n* We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a [bug in GHC](https://gitlab.haskell.org/ghc/ghc/-/issues/22564)\\n\\n## KES agent\\n* We keep progressing in the secure forgetting PR and resolving some bugs on memory handling [PR#255](https://github.com/input-output-hk/cardano-base/pull/255)\\n* Fixed a \'use-after-free\' bug in the KES agent."},{"id":"2022-12-09-hydra","metadata":{"permalink":"/cardano-updates/2022-12-09-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-hydra.md","source":"@site/blog/2022-12-09-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2022-12-09T00:00:00.000Z","formattedDate":"December 9, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.62,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-12-09-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-12-09-crypto"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-12-09-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team has worked on completing to \\"Validate coordinated head protocol against formal model\\", this is a huge step to verify the implementation is secure. They also worked on implementing [ADR21](https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md) related to bounded tx validity which is now under review. [HydraPay](https://github.com/obsidiansystems/hydra-pay) project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of [issues](https://github.com/obsidiansystems/hydra-pay/issues?q=is%3Aissue) they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced.\\n\\n## What did the team achieve this week\\n\\n- Document model based testing [#194](https://github.com/input-output-hk/hydra/issues/194) & [#641](https://github.com/input-output-hk/hydra/issues/641)\\n- Got [ADR21](https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md), reducing gaps between implementation and specification, under review.\\n- Complete review on `hydra-tutorial`.\\n- Complete first round of review on `HydraPay` work [#634](https://github.com/input-output-hk/hydra/issues/634)\\n- Meeting with `Director of CyberSecurity` frio `IOG` to unblock \\"the RFP prepared for the external audit\\" [#606](https://github.com/input-output-hk/hydra/issues/606)\\n- Remove `vasil-dev` and `testnet` from `smoke-test` because they were not working [#630](https://github.com/input-output-hk/hydra/issues/630)\\n- Fix flaky `plutus-merkle-tree` test [#642](https://github.com/input-output-hk/hydra/issues/642)\\n- Refactor `NetworkSpec` to improve legilibility.\\n- Fix benchmark cost for `abortTx` [#631](https://github.com/input-output-hk/hydra/issues/631)\\n- Adapt `nix.conf` to the recent hydra-ci nix cache migration.\\n\\n## What are the goals of next week\\n\\n- Get [ADR21](https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md) accepted & close tx validity gap in our implementation.\\n- Integrate the `hydra-tutorial`.\\n- Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.\\n- Get Cicero (new CI) working.\\n- Use reference inputs to reduce the cost of the `commitTx`."},{"id":"2022-12-09-ledger","metadata":{"permalink":"/cardano-updates/2022-12-09-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-ledger.md","source":"@site/blog/2022-12-09-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2022-12-09T00:00:00.000Z","formattedDate":"December 9, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.87,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-12-09-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-12-09-hydra"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-12-02-hydra"}},"content":"## High level summary\\n\\nThe Plutus tools team at IOG has started helping the ledger team to build out a user friendly\\n`cardano-ledger-api` package!\\nA [GitHub project](https://github.com/input-output-hk/cardano-ledger/projects/5)\\nwill be filled out in the days ahead,\\npeople interested in the API can use it to follow along and join in on the conversations.\\n\\nThe ledger team has started using\\n[architectural decision records](https://github.com/input-output-hk/cardano-ledger/blob/6fc0e198560fb4169d435da882394930789a8af8/docs/adr/2022-12-01_001-record-architectural-decisions.md)\\nto leave a record of important decisions that the team makes.\\nWe will retroactively go back through past decisions and make ADRs for them.\\n\\nThe logic to track individual deposits is now nearly in place.\\nWe are prioritizing correctness with our first pull request, and will follow up with\\nperformance optimizations and general cleanup next.\\n\\nPointer addresses are being deprecated with the Cardano major protocol version 8.\\nSee [CPS-0002](https://github.com/cardano-foundation/CIPs/pull/374)\\nfor more context.\\n\\n## Lower level summary\\n\\n#### Cardano ledger API\\n\\nThe **Plutus tools team** has taken our minimal `cardano-ledger-api` package and started filling it\\nout and adding much needed documentation.\\nThey have also added doctests!\\nIn the days to come, the Plutus tools team will map out a lot more work for the API and record\\nit in this\\n[GitHub project](https://github.com/input-output-hk/cardano-ledger/projects/5).\\n\\nSee\\n\\n* [pull-3182]\\n* [pull-3188]\\n\\n#### Architectural Decision Records (ADRs)\\n\\nWe are now providing more context and leaving a record of important decisions that are made\\nin the ledger. The first ADR explains the very lightweight process.\\n\\nSee\\n\\n* [pull-3177] (rendered [here](https://github.com/input-output-hk/cardano-ledger/blob/6fc0e198560fb4169d435da882394930789a8af8/docs/adr/2022-12-01_001-record-architectural-decisions.md))\\n\\n#### Tracking individual deposits\\n\\nSee [ADR-3](https://github.com/input-output-hk/cardano-ledger/pull/3190/files)\\nfor background.\\nWe now have the logic in place to track individual deposits, and a host of property tests\\nto make sure that the logic is correct.\\nThe current implementation uses more memory than it needs to, and we will address that next,\\nwith our hope being to only use one word (8 bytes) per registered stake credential.\\nThere is a fair amount of other cleanup needed for general maintainability.\\n\\nSee\\n\\n* [pull-3127]\\n* [pull-3195]\\n* [pull-3202]\\n\\n#### Removing pointer addresses\\n\\nPointer addresses, which have never seen any real use\\n(there are something like eleven on mainnet), are being deprecated starting at Cardano major\\nversion 9.\\n[CPS-0002](https://github.com/cardano-foundation/CIPs/pull/374) gives the context.\\nWe are disabling them by first preventing transaction outputs containing them\\nfrom being serialized by the node at the moment we switch to version 9.\\nAt the hard fork after that, we will translate the existing few pointer addresses\\nto enterprise addresses.\\n\\nSee\\n\\n* [pull-3174]\\n\\n#### Technical debt\\n\\n* [pull-3162] - Sometimes we have to put safeguards in place for hard forks which may never\\n be exercised. After we have passed the given hardfork, we are able to clean up the code\\n and simplify our logic. We removed all of the ones that we are currently easily able to.\\n* [pull-3165] - We improved the type safety of our code while also discovering and fixing\\n a serialization bug.\\n* [pull-3172] - We removed dead code.\\n* [pull-3175] - The Allegra and the Mary code used to be coupled in a particular way the we grew to\\n dislike. We made these two ledger eras now uniform with the rest of our code base.\\n* [pull-3184] - We organized our property testing code.\\n* [pull-3200] - The Plutus tools teams fixed an outstanding bug in the translation from the\\n ledger state to the Plutus script context.\\n\\n\\n[pull-3127]: https://github.com/input-output-hk/cardano-ledger/pull/3127\\n[pull-3162]: https://github.com/input-output-hk/cardano-ledger/pull/3162\\n[pull-3165]: https://github.com/input-output-hk/cardano-ledger/pull/3165\\n[pull-3170]: https://github.com/input-output-hk/cardano-ledger/pull/3170\\n[pull-3172]: https://github.com/input-output-hk/cardano-ledger/pull/3172\\n[pull-3174]: https://github.com/input-output-hk/cardano-ledger/pull/3174\\n[pull-3175]: https://github.com/input-output-hk/cardano-ledger/pull/3175\\n[pull-3177]: https://github.com/input-output-hk/cardano-ledger/pull/3177\\n[pull-3182]: https://github.com/input-output-hk/cardano-ledger/pull/3182\\n[pull-3184]: https://github.com/input-output-hk/cardano-ledger/pull/3184\\n[pull-3188]: https://github.com/input-output-hk/cardano-ledger/pull/3188\\n[pull-3190]: https://github.com/input-output-hk/cardano-ledger/pull/3190\\n[pull-3195]: https://github.com/input-output-hk/cardano-ledger/pull/3195\\n[pull-3200]: https://github.com/input-output-hk/cardano-ledger/pull/3200\\n[pull-3202]: https://github.com/input-output-hk/cardano-ledger/pull/3202"},{"id":"2022-12-02-hydra","metadata":{"permalink":"/cardano-updates/2022-12-02-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-02-hydra.md","source":"@site/blog/2022-12-02-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2022-12-02T00:00:00.000Z","formattedDate":"December 2, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.965,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-12-02-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-12-09-ledger"},"nextItem":{"title":"DB sync Team Update","permalink":"/cardano-updates/2022-12-01-db-sync"}},"content":"## High-level summary\\n\\nThis week, the Hydra team has worked on cleaning up several things in progress\\nafter last week\'s summit. They have extended their model-based testing (MBT)\\napproach with transaction creation & observation\\n[#410](https://github.com/input-output-hk/hydra/issues/410), solved\\n`AcquirePointTooOld` problems of the `hydra-node` with by changing the wallet\\ninitialization [#439](https://github.com/input-output-hk/hydra/issues/439).\\nAlso, the Hydra researchers updated the security proofs of the Coordinated Hydra\\nHead, which are bound to be included in the Hydra HeadV1 specification.\\n\\n## What did the team achieve this week\\n\\n- Monthly review & report - will also be published on our website [#644](https://github.com/input-output-hk/hydra/pull/644)\\n- Extended the model-based testing (MBT) with transaction creation/observation [#410](https://github.com/input-output-hk/hydra/issues/410)\\n- Solve `AcquirePointTooOld` problems with new wallet initialization [#439](https://github.com/input-output-hk/hydra/issues/439)\\n- Fixed our hydraw deployments (EC2 instances)\\n- Created & discussed [ADR21](https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md) within tx validity work\\n- Received & discussed security proofs of Coordinated Hydra Head (requires more work)\\n\\n## What are the goals of next week\\n\\n- Get ADR21 accepted & close tx validity gap in our implementation\\n- Complete review & integrate the Hydra tutorial\\n- Review latest hydra-pay work\\n- Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec\\n- Get Cicero (new CI) working"},{"id":"2022-12-01-db-sync","metadata":{"permalink":"/cardano-updates/2022-12-01-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-db-sync.md","source":"@site/blog/2022-12-01-db-sync.md","title":"DB sync Team Update","description":"High level summary","date":"2022-12-01T00:00:00.000Z","formattedDate":"December 1, 2022","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.78,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB sync Team Update","slug":"2022-12-01-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-12-02-hydra"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-12-01-mithril"}},"content":"## High level summary\\n\\nThe DB Sync team prepared a release `13.1.0.0-rc2` which includes many improvements for db-sync,\\nit makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces\\nmigrations. This release finalises the objectives that were set for db-sync for the previous\\n3 months period and part of the syncing speed objective set for the next period\\n[Changelog](https://github.com/input-output-hk/cardano-db-sync/blob/3640e5aa00b8bada61e5d4b6eee063749866711b/cardano-db-sync/CHANGELOG.md#13100)\\n\\n## Lower level summary\\n- Branch [release/13.1.0.x](https://github.com/input-output-hk/cardano-db-sync/compare/release/13.0.x..3640e5aa00b8bada61e5d4b6eee063749866711b)\\nincludes all the improvements related to the release. The release is passing through the testing\\nphase and a number of bugs and issues have been fixed, like\\n[#1312](https://github.com/input-output-hk/cardano-db-sync/issues/1312)\\n[#1311](https://github.com/input-output-hk/cardano-db-sync/issues/1311).\\nAlso many new unit tests have been added.\\n\\n- Part of the release branch is cherry-picked back into master, in a way that it respects the new\\nrelease and development process, so that it takes into account migrations\\n[release process](https://github.com/input-output-hk/cardano-db-sync/issues/1305)\\n\\n- The DB Sync team has also tagged release `13.0.6` which better supports preview and preprod for\\ndocker."},{"id":"2022-12-01-mithril","metadata":{"permalink":"/cardano-updates/2022-12-01-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-mithril.md","source":"@site/blog/2022-12-01-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2022-12-01T00:00:00.000Z","formattedDate":"December 1, 2022","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.04,"hasTruncateMarker":false,"authors":[{"name":"Jean-Philippe Raynaud","title":"Mithril Tech Lead","url":"https://github.com/jpraynaud","imageURL":"https://github.com/jpraynaud.png","key":"jpraynaud"}],"frontMatter":{"title":"Mithril Team Update","slug":"2022-12-01-mithril","authors":"jpraynaud","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"DB sync Team Update","permalink":"/cardano-updates/2022-12-01-db-sync"},"nextItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2022-12-01-system-test"}},"content":"## High level overview\\nThe Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes. \\n\\nFinally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer.\\n\\n## Low level overview\\n- Implemented custom Mithril SPOs on testing/pre-release networks [#563](https://github.com/input-output-hk/mithril/issues/563)\\n- Deprecated Signer Declarative Pool Id registration mode [#585](https://github.com/input-output-hk/mithril/issues/585)\\n- Completed the second stage of the store automatic migration process [#600](https://github.com/input-output-hk/mithril/issues/600)\\n- Completed the deployment pipelines to crates.io registry [#588](https://github.com/input-output-hk/mithril/issues/588)\\n- Completed automatic generation of nodes/libraries versions manifest in releases notes [#599](https://github.com/input-output-hk/mithril/issues/599)\\n- Completed CI/CD handling of PR from forks [#597](https://github.com/input-output-hk/mithril/issues/597)\\n- Worked on the CIP design for Mithril piggybacked on the Cardano network layer [#586](https://github.com/input-output-hk/mithril/issues/586)\\n- Worked on signing the artifacts released in the distributions by the CI/CD [#587](https://github.com/input-output-hk/mithril/issues/587)\\n- Worked on multi-platforms end to end test [#601](https://github.com/input-output-hk/mithril/issues/601)\\n- Worked on the refactorizaton of the aggregator multi-signer engine [#398](https://github.com/input-output-hk/mithril/issues/398)"},{"id":"2022-12-01-system-test","metadata":{"permalink":"/cardano-updates/2022-12-01-system-test","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-system-test.md","source":"@site/blog/2022-12-01-system-test.md","title":"System Test Team Update","description":"High level summary","date":"2022-12-01T00:00:00.000Z","formattedDate":"December 1, 2022","tags":[{"label":"system-test","permalink":"/cardano-updates/tags/system-test"}],"readingTime":0.765,"hasTruncateMarker":false,"authors":[{"name":"Dorin Solomon","title":"System Test Team Lead","url":"https://github.com/dorin100","imageURL":"https://github.com/dorin100.png","key":"dorin100"}],"frontMatter":{"title":"System Test Team Update","slug":"2022-12-01-system-test","authors":"dorin100","tags":["system-test"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-12-01-mithril"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-11-30-consensus"}},"content":"## High level summary\\nDuring the last 2 weeks we did more improvements on our Test Framework, planned the testing of the _P2P Single \\nRelay_ functionality, and also tested some DB-Sync tags.\\n\\n## Workstreams\\n\\n### Framework improvements:\\n- moved the System Test CLI Pipelines from BuildKite to Github Actions\\n- improved the reporting tools to support the rerun of the failled tests and update of the reports \\n- added support for Github API in [report-aggregator](https://github.com/mkoura/report-aggregator), so reports will be generated from the GitHub nightly jobs from now on\\n- added support for mixed topology - P2P, legacy, mixed topologies\\n- planned the P2P Single Relay system test activities \\n- added support to start regression tests with PV8 + better selection of tests\\n\\n### DB-Sync:\\n- confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)\\n- tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2"},{"id":"2022-11-30-consensus","metadata":{"permalink":"/cardano-updates/2022-11-30-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-consensus.md","source":"@site/blog/2022-11-30-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2022-11-30T00:00:00.000Z","formattedDate":"November 30, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":2.4,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-11-30-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2022-12-01-system-test"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-11-30-node-cli-api"}},"content":"## High level summary\\n\\nDuring the past two weeks, the consensus team merged improvements to the monadic\\ncursor API that was needed to implement LMDB range reads, which is in turn\\nrequired for the implementation of the UTxO HD feature. We added tables to\\nseveral tests in for the UTxO HD feature, which increases our confidence in the\\ncorrectness of the prototype. The mempool property tests are close to being\\ncompleted. Also, we finished the LSM tree tuning algorithm.\\n\\nOn the Genesis front we started simplifying the BlockFetch logic with\\nCSJ-specific workloads in mind. \\n\\nWe are also documenting the Block Diffusion Pipelining feature, and added a\\nhigh-level overview of consensus to the top level documentation of\\n`ouroboros-network`.\\n\\n## Workstreams\\n\\n### UTxO HD prototype\\n\\nWe merged the implementation of a monadic cursor API ([#1][pull-1])) which was\\nneeded to solve a bug with LMDB range-reads. After this PR was merged, we focused on\\nbridging the gap between the `lmdb-simple` interface and consensus by facilitating\\nusing `lmdb-simple`\'s cursor API without `Serialise` constraints ([#3][pull-3]).\\n\\nWe refactored the backing store property tests to use `quickcheck-lockstep`\\n([#4081][pull-4081]).\\n\\nWe added tables to the mock ledger in the UTxO-HD feature branch\\n([#4184][pull-4184]). Every test that used to run with `SimpleBlocks` now uses\\ntables. This will enable us to exercise the UTxO HD mempool integration by\\nleveraging the existing mempool property-tests. The new state-machine\\nproperty-tests are still needed for testing the parallel behaviour of the\\nmempool.\\n\\nOur work on the mempool state-machine tests revealed the need for improvements\\nin the `quickcheck-state-machine` library. Parallel testing assumed that the\\nstate machine did not have access to mutable references. However, the mempool\\ntests require the use of such mutable references for mocking the ledger\\ninterface. As a result, our parallel tests were failing with rather obscure\\nmessages. @Jasagredo submitted a pull request ([#12][pull-12]) that allows for\\nnew mutable references to be created at each run of the state machine.\\n\\n#### Backing store property tests\\n\\n### LSM tree implementation\\n\\nWe finished the LSM Tree tuning algorithm. We are currently tidying up the code\\nand gathering results (i.e., plots and their interpretation).\\n\\n### CSJ prototype\\n\\nWe started simplifying the BlockFetch logic with CSJ-specific workloads in mind.\\n\\n### New VRF and KES crypto integration\\n\\nStarted working on supporting new version of `StandardCrypto` which uses compact\\nKES and batched VRF ([#4151][issue-4151]).\\n\\n### Technical debt\\n\\nWe reviewed the existing state of the Block Diffusion Pipelining document. We\\nare now working on the \\"Implementation\\" section ([#4020][issue-4020]).\\n \\n### Fostering collaboration\\n\\nWe cleared up our understanding of the error dynamics of forecasting\\n([#4146][pull-4146] and [#4174][pull-4174]).\\n\\nWe submitted a pull request that adds an overview of consensus to the [top level\\ndocumentation](https://input-output-hk.github.io/ouroboros-network/) of\\nouroboros-network ([#4197][pull-4197]). This overview describes the consensus components and adds a\\nhyperlinked map to the modules documentation.\\n\\nhttps://github.com/input-output-hk/ouroboros-network/pull/4197\\n\\n\\n[issue-4151]: https://github.com/input-output-hk/ouroboros-network/issues/4151\\n[pull-1]: https://github.com/input-output-hk/lmdb-simple/pull/1\\n[pull-3]: https://github.com/input-output-hk/lmdb-simple/pull/3\\n[pull-4081]: https://github.com/input-output-hk/ouroboros-network/pull/4081\\n[pull-4184]: https://github.com/input-output-hk/ouroboros-network/pull/4184\\n[pull-12]: https://github.com/stevana/quickcheck-state-machine/pull/12\\n[pull-4146]: https://github.com/input-output-hk/ouroboros-network/pull/4146\\n[pull-4174]: https://github.com/input-output-hk/ouroboros-network/pull/4174 \\n[issue-4020]: https://github.com/input-output-hk/ouroboros-network/issues/4020\\n[pull-4197]: https://github.com/input-output-hk/ouroboros-network/pull/4197"},{"id":"2022-11-30-node-cli-api","metadata":{"permalink":"/cardano-updates/2022-11-30-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-node-cli-api.md","source":"@site/blog/2022-11-30-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2022-11-30T00:00:00.000Z","formattedDate":"November 30, 2022","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.01,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-11-30-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-11-30-consensus"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2022-11-30-performance-and-tracing"}},"content":"# 2022-11-30 - 2022-12-13\\n\\n## High level summary\\n\\nPRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped. \\n## Completed\\n\\n### docs\\n\\n### cardano-cli\\n- [Append tx output in cli transaction build command](https://github.com/input-output-hk/cardano-node/pull/4675)\\n- [Update Error messages in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4592)\\n\\n### cardano-api\\n\\n### cardano-node\\n- [Replace Data.Map with Data.Map.Strict](https://github.com/input-output-hk/cardano-node/pull/4675)\\n- [Update Github actions](https://github.com/input-output-hk/cardano-node/pull/4708)\\n\\n### cardano-testnet\\n\\n## In Progress\\n\\n### cardano-cli\\n- [BUGFIX]- [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Infer protocol params in transaction build](https://github.com/input-output-hk/cardano-node/pull/4431)\\n- [Allow assembling transactions with no witnesses](https://github.com/input-output-hk/cardano-node/pull/4408)\\n- [Multiple pools support in query stake snapshot](https://github.com/input-output-hk/cardano-node/pull/4279)\\n- [Optimise query leadership schedule command](https://github.com/input-output-hk/cardano-node/pull/4250)\\n- [Optimise query stake snapshot command](https://github.com/input-output-hk/cardano-node/pull/4179)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n- [Handle pipes in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4625)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n- [Render consistent plutus script failure output](https://github.com/input-output-hk/cardano-node/pull/4659)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n- [Fully remove the cli intermediate TxBody format](https://github.com/input-output-hk/cardano-node/pull/4713)\\n\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)"},{"id":"2022-11-30-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2022-11-30-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-performance-and-tracing.md","source":"@site/blog/2022-11-30-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2022-11-30T00:00:00.000Z","formattedDate":"November 30, 2022","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.95,"hasTruncateMarker":false,"authors":[{"name":"Serge Kosyrev","title":"Performance and Tracing Team Lead","url":"https://github.com/deepfire","imageURL":"https://github.com/deepfire.png","key":"deepfire"}],"frontMatter":{"title":"Performance & tracing update","slug":"2022-11-30-performance-and-tracing","authors":"deepfire","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-11-30-node-cli-api"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-11-28-network"}},"content":"## High level summary\\n\\n1. Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release.\\n2. SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench.\\n3. The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks.\\n4. Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started.\\n5. Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.\\n\\n## Performance\\n\\nWe have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don\'t see any significant performance changes. The component bumps are therefore clear for release.\\n\\n## Tracing\\n\\nFor the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them.\\nThe idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time.\\n\\nTo support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics.\\n\\n## Infrastructure\\n\\nGeneration support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation.\\n\\nIn addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model.\\n\\nThe intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged.\\nWe are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration.\\n\\nWe continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability.\\n\\nWe are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP.\\n\\nAs usual, a number of smaller workbench, data analysis & reporting improvements have been made."},{"id":"2022-11-28-network","metadata":{"permalink":"/cardano-updates/2022-11-28-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-28-network.md","source":"@site/blog/2022-11-28-network.md","title":"Network Team Update","description":"Stake-Driven Data Diffusion Release for Relays","date":"2022-11-28T00:00:00.000Z","formattedDate":"November 28, 2022","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"},{"label":"release","permalink":"/cardano-updates/tags/release"}],"readingTime":3.675,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2022-11-28-network","authors":"coot","tags":["network","release"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2022-11-30-performance-and-tracing"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-11-25-crypto"}},"content":"## Stake-Driven Data Diffusion Release for Relays\\n\\nIOG networking team decided to release the _Stake-Driven Data Diffusion with\\nRobust Optimised Peer Selection_ also more commonly known as _P2P_. In the\\nlast update, we informed about a performance regression, but it turns out it\\nonly affects block producers, and thus we highly advise against running it on\\nsuch nodes. Further investigation is required to find the cause of it.\\n\\nOn IOG\'s benchmarking cluster we have seen quite a good performance improvement\\non block propagation itself. The cluster is running a static topology with\\nvalency 6 (each node is connected to 6 other nodes). In which every of the 50\\nnodes are block producers. The setup of this network is the same as mainnet.\\nWe\'ve seen 40-50% performance improvement on block propagation comparing to the\\nsame cluster deployed with the same topology but using non-P2P nodes. We think\\nthis performance improvement is caused by using full duplex connections. Quite\\nlikely the transaction traffic floating in both directions on the same TCP\\nconnection helps to keep the TCP window open. Note that in a cluster of 50\\nnodes with valency 6 the probability of having at least one duplex connection\\nis more than 50%. We don\'t expect the same improvement on mainnet because the\\nnetwork is much wider and the transaction traffic is not as large.\\n\\nJust before the release we squashed two small bugs:\\n\\n* [issue #4163] - top level integration bug in `keep-alive`;\\n* [issue #4177] - a bug in `outbound-governor`;\\n* [PR #4165] - a fix `cardano-ping` support of `NodeToNodeV_10`.\\n\\n\\n### Peer Sharing\\n\\nWe were carrying a review of [peer sharing PR][PR #4019].\\n\\n### DeltaQ\\n\\nNeil Davies was invited to give a guest lecture entitled `Avoiding System Catastrophes` at [UCLouvain].\\n\\n## What have we achieve last sprint\\n\\n* [issue #4163]: we found out that a control message is not passed to the\\n `keep-alive` mini-protocol, this results in every demotion executing demotion\\n timeout rather than a graceful termination. With the fix the node will no longer log:\\n ```json\\n { \\"kind\\": \\"PeerStatusChangeFailure\\"\\n , \\"peerStatusChangeType\\": \\"WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})\\"\\n , \\"reason\\": \\"TimeoutError\\"\\n }\\n ````\\n\\n* [issue #4177]: we fixed an assertion failure in the `outbound-governor`; now\\n we don\'t try demoted peers which are being demoted already.\\n\\n* [PR #4155]: we refactored `ouroboros-network` packages. There\'s a top level\\n `ouroboros-consensus-diffusion` package which integrates `network`\\n & `consensus` code. We also introduced:\\n\\n - `ouroboros-network-api` package which contains the API shared between\\n `network` & `conensus`;\\n - `ouroboros-network-mock` package which contains mock API used for testing\\n (e.g. a mock chain & chain producer, etc.)\\n - `ouroboros-network-protocols` package which contains implementation of all\\n (but `handshake`) mini-protocols, exposes a `testlib` and contains `test`\\n and `cddl` components.\\n\\n This made the dependency tree of `network` & `consensus` packages much\\n cleaner.\\n\\n* [PR #4169]: we described the usage of release branches in `CONTRIBUTING.md`\\n doc.\\n\\n* [PR #4165]: we fixed `cardano-ping` support of `NodeToNodeV_10` protocol.\\n\\n\\n### DeltaQ\\n\\nThe abstract of the talk:\\n\\n> An essential step to ensuring that distributed systems are fit for\\n> purpose.\\n>\\n> Distributed systems have become an integral part of our society and\\n> daily lives. We are, both implicitly and explicitly, individually as well as\\n> collectively, placing ever more trust in them.\\n>\\n> Are they worthy of this trust? Our need for them to be \u2018fit-for-purpose\u2019 goes\\n> well beyond notions of functional correctness (i.e. never getting the wrong\\n> answer). We need them to deliver the desired outcomes in a timely, robust,\\n> reliable, resilient fashion, at scale and in a sustainable way (both\\n> economically and environmentally).\\n>\\n> This all sounds like a worthy aspiration, but what would be a practical\\n> approach to capturing and reasoning about these issues? How can we ensure that\\n> systems can meet their fit-for-purpose objectives, not just in their design but\\n> as they are deployed, encounter the imperfect world, are scaled to become\\n> economic, and proceed into ongoing maintenance?\\n>\\n> This talk will illustrate how the notions of Outcomes and Quality Attenuation\\n> (as captured by \u2018\u2206Q\u2019) are being used to both frame the necessary notions and\\n> provide a basis for assuring the refinement and reification of such systems,\\n> from initial concept to operational infrastructure.\\n\\nYou can download the slides from [here](../static/pdf/network/2022-11-24-UCL.pdf).\\n\\n[issue #4163]: https://github.com/input-output-hk/ouroboros-network/issues/4163\\n[issue #4177]: https://github.com/input-output-hk/ouroboros-network/issues/4177\\n[PR #4155]: https://github.com/input-output-hk/ouroboros-network/pull/4155\\n[PR #4169]: https://github.com/input-output-hk/ouroboros-network/pull/4169\\n[PR #4165]: https://github.com/input-output-hk/ouroboros-network/pull/4165\\n[PR #4019]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[UCLouvain]: https://uclouvain.be/en/index.html"},{"id":"2022-11-25-crypto","metadata":{"permalink":"/cardano-updates/2022-11-25-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-25-crypto.md","source":"@site/blog/2022-11-25-crypto.md","title":"Crypto Team Update","description":"High level summary","date":"2022-11-25T00:00:00.000Z","formattedDate":"November 25, 2022","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.705,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2022-11-25-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-11-28-network"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-25-hydra"}},"content":"## High level summary\\nThe four open fronts that the crypto team is working on are:\\n* MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team. \\n* Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes\\n* cardano-base: The VRF and BLS branchs are still open and in progress\\n* KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent. \\n\\n## Low level summary\\n### MuSig2\\n* We redesigned the library so that MuSig2 lib users don\'t need to be aware of the underlying secp256k1 library [PR#31](https://github.com/input-output-hk/musig2/pull/31)\\n* We are introducing a more granular error handling mechanism [PR#33](https://github.com/input-output-hk/musig2/pull/33)\\n* We rethought the API and made it more consistent with the underlying secp256k1 library [PR#35](https://github.com/input-output-hk/musig2/pull/35)\\n\\n### Mithril\\n* The mithril crates in general will be published in crates.io, and we adapted the core library\'s README [PR#616](https://github.com/input-output-hk/mithril/pull/616) \\n* We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information [PR#620](https://github.com/input-output-hk/mithril/pull/620)\\n\\n### cardano-base\\n* We\'ve been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) [PR#341](https://github.com/input-output-hk/cardano-base/pull/341)\\n* SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions [PR#344](https://github.com/input-output-hk/cardano-base/pull/344)\\n* Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus [PR#266](https://github.com/input-output-hk/cardano-base/pull/266)\\n\\n## KES agent\\n* We keep progressing in the secure forgetting PR and resolving some bugs on memory handling [PR#255](https://github.com/input-output-hk/cardano-base/pull/255)\\n* Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation."},{"id":"2022-11-25-hydra","metadata":{"permalink":"/cardano-updates/2022-11-25-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-25-hydra.md","source":"@site/blog/2022-11-25-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2022-11-25T00:00:00.000Z","formattedDate":"November 25, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.73,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-11-25-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-11-25-crypto"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-11-23-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a [presentation](https://summit.cardano.org/agenda-day-2/cardano-ballot-speaker-winner-presentation-6/) about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas.\\n\\n## What did the team achieve this week\\n\\n- Attended the Cardano Summit in Lausanne. Hydra was topic of one talk: \\n- Had a team workshop / hackathon after the summit:\\n - Retrospective\\n - Impact mapping session\\n - Hacked on smaller things\\n- Got a PR for tullia/cicero things by @kdermetfan\\n\\n## What are the goals of next week\\n\\n- Monthly report & review meeting\\n- Tie up several loose ends / branches.\\n- Resolve Tx validity discussions & PRs.\\n- Review cicero PR & try it out."},{"id":"2022-11-23-ledger","metadata":{"permalink":"/cardano-updates/2022-11-23-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-23-ledger.md","source":"@site/blog/2022-11-23-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2022-11-23T00:00:00.000Z","formattedDate":"November 23, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.19,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-11-23-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-25-hydra"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-18-hydra"}},"content":"## High level summary\\n\\nWe released [CIP-1694],\\nour proposal for entering the [Voltaire phase](https://roadmap.cardano.org/en/voltaire/).\\n**Please come join the discussion**, this will be an incredibly exciting transition for\\nCardano and we want everyone to participate!\\n\\nWe now have a sensible way to version all of the serialization schemes used in the ledger.\\nThe draft pull request was polished, reviewed, and merged this week.\\nThis solves many problems that have vexed us since the beginning of the Shelley ledger era.\\n\\nEveryone working on the Cardano node is working together to improve our release process,\\nand the ledger team in particular dedicated one engineer to help with these efforts\\nfor the next release.\\n\\n## Lower level summary\\n\\n### The Conway ledger era\\n\\nThe current proposal in [CIP-1694] encompasses two new ledger eras.\\nThe first era will be called Conway, after the English mathematician John Horton Conway.\\nThe community facing aspects of the Conway ledger era will be very minimal,\\nbut it will pave the way for introducing liquid democracy.\\nThe details can be viewed [here](https://github.com/input-output-hk/cardano-ledger/projects/4).\\nWe do not yet have a formal specification for the Conway era.\\nOur plan is to debut the\\n[formal ledger model](https://github.com/input-output-hk/formal-ledger-specifications).\\nBriefly, the Conway ledger era will:\\n* introduce SPO voting for hard forks (in the spirit of the now abandoned [CIP-47])\\n* provide an on-chain mechanism for rotating the governance keys\\n* re-plumb the ledger rules involving governance to be in line with [CIP-1694]\\n\\n### Versioned CBOR\\n\\nWe now have the ability to easily tie our serialization schemes to the Cardano\\nmajor protocol version.\\nWe still aim to preserve backwards compatibility as much as possible, but we now have a principled\\nplan for resolving problems (see [CIP-ledger-cbor]).\\nIn particular, we can now address several long standing issues, such as\\n[issue-2444], [issue-2965], and [issue-3003]. \\n\\nThe final (and massive!) pull request which brought us the versioning is [pull-3138].\\n\\n### Deposit tracking\\n\\nThe draft pull request which was exploring how best to track individual deposits\\nis much closer now to being ready to take out of draft ([pull-3127]).\\nFor background on the issue, see [issue-3113].\\nThis is quite an invasive change which effects many of our tests, which we are now addressing.\\n\\n### Technical debt\\n\\nAs always, we keep working on technical debt.\\nWe have deduplicated a some things: [pull-3129], [pull-3162].\\nWe have memoized a problematic computation (though more due diligence is needed before we can\\nmerge): [pull-3141].\\n\\n### Node release\\n\\nWe have been helping with the node release efforts. See [pull-4608].\\n\\n[CIP-47]: https://github.com/cardano-foundation/CIPs/pull/318\\n[CIP-1694]: https://github.com/cardano-foundation/CIPs/pull/380\\n[CIP-ledger-cbor]: https://github.com/cardano-foundation/CIPs/pull/372\\n[issue-3003]: https://github.com/input-output-hk/cardano-ledger/issues/3003\\n[issue-2965]: https://github.com/input-output-hk/cardano-ledger/issues/2965\\n[issue-2444]: https://github.com/input-output-hk/cardano-ledger/issues/2444\\n[issue-3113]: https://github.com/input-output-hk/cardano-ledger/issues/3113\\n[pull-3129]: https://github.com/input-output-hk/cardano-ledger/pull/3129\\n[pull-3141]: https://github.com/input-output-hk/cardano-ledger/pull/3141\\n[pull-3127]: https://github.com/input-output-hk/cardano-ledger/pull/3127\\n[pull-3162]: https://github.com/input-output-hk/cardano-ledger/pull/3162\\n[pull-3138]: https://github.com/input-output-hk/cardano-ledger/pull/3138\\n[pull-4608]: https://github.com/input-output-hk/cardano-node/pull/4608"},{"id":"2022-11-18-hydra","metadata":{"permalink":"/cardano-updates/2022-11-18-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-18-hydra.md","source":"@site/blog/2022-11-18-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2022-11-18T00:00:00.000Z","formattedDate":"November 18, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.085,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-11-18-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-11-23-ledger"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-11-18-mithril"}},"content":"## High-level summary\\n\\nThis week, the Hydra team released version `0.8.1`, which includes several fixes and a user-wished extension of the persistence introduced by `0.8.0` of replaying server outputs to make clients like the `hydra-tui` be aware of the latest `hydra-node` state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from `hydra-poc` to [`hydra`](https://github.com/input-output-hk/hydra)!\\n\\n## What did the team achieve this week\\n\\n- Implemented replaying of server outputs to address [#580](https://github.com/input-output-hk/hydra-poc/issues/580)\\n- Released version 0.8.1 containing this and other fixes [Release notes](https://github.com/input-output-hk/hydra/releases/tag/0.8.1)\\n- Worked on the bounded tx validity as one of the on-chain script fixes, but couldn’t finish it just yet [#615](https://github.com/input-output-hk/hydra/pull/615)\\n- Collaborated with the education team on a Hydra tutorial.\\n- Discovered and discussed issues with the “seen ledger”.\\n- Renamed the Hydra repository `hydra-poc` -> `hydra`\\n\\n## What are the goals of next week\\n\\n- Create and discuss an ADR about handling tx validity correctly.\\n- Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: **\\"Developing Hydra\\" on Day 2, Nov 21st, 13:50 CET**\\n- Have a team workshop / hackathon after the summit:\\n - Retrospective\\n - Roadmapping session\\n - Hack on something complex or useful"},{"id":"2022-11-18-mithril","metadata":{"permalink":"/cardano-updates/2022-11-18-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-18-mithril.md","source":"@site/blog/2022-11-18-mithril.md","title":"Mithril Team Update","description":"High level overview","date":"2022-11-18T00:00:00.000Z","formattedDate":"November 18, 2022","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.35,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Mithril Team Update","slug":"2022-11-18-mithril","authors":"iquerejeta","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-18-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-11-16-consensus"}},"content":"## High level overview\\nThe Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks. \\n\\nFinally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer.\\n\\n## Low level overview\\n- Released a new Mithril distribution [2246.1](https://github.com/input-output-hk/mithril/releases/tag/2246.1)\\n- Completed the first stage of the store migrations process [#562](https://github.com/input-output-hk/mithril/issues/562)\\n- Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes [#565](https://github.com/input-output-hk/mithril/issues/565)\\n- Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage [#576](https://github.com/input-output-hk/mithril/issues/576)\\n- Prepared a Daedalus synchronization benchmark video with/without Mithril [#606](https://github.com/input-output-hk/mithril/issues/606)\\n- Upgraded the Cardano nodes of the testing Mithril networks to `1.35.4` [#594](https://github.com/input-output-hk/mithril/issues/594)\\n- Worked on implementing SPO tests nodes on testing Mithril networks [#563](https://github.com/input-output-hk/mithril/issues/563)\\n- Worked on the CIP design for Mithril piggybacked on the Cardano network layer [#588](https://github.com/input-output-hk/mithril/issues/588)\\n- Worked on the refactorizaton of the aggregator multi signer engine [#398](https://github.com/input-output-hk/mithril/issues/398)"},{"id":"2022-11-16-consensus","metadata":{"permalink":"/cardano-updates/2022-11-16-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-consensus.md","source":"@site/blog/2022-11-16-consensus.md","title":"Consensus Team Update","description":"High-level summary","date":"2022-11-16T00:00:00.000Z","formattedDate":"November 16, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":5.06,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-11-16-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-11-18-mithril"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-11-16-node-cli-api"}},"content":"## High-level summary\\n\\nDuring the past two weeks, the consensus team started documenting the\\nimplementation of the UTxO HD feature and continued developing tests for it. As\\npart of our work on UTxO HD, we improved the Haskell support for LMDB. We also\\nspent time working on the LSM tree prototype, and designed a parameter tuning\\nalgorithm for it. Regarding our work on Genesis, our investigation of the\\n\\"plateaus\\" pointed at the `TICKF` slowdown on era boundaries as culprit. This\\nled us to developing a caching strategy that will not only remove the\\naforementioned \\"plateaus\\", but can help alleviating the growing block production\\ndelay on epoch switch. We also helped reviewing the block forge credential\\nhotswap feature, which is intended for use in the adoption of P2P.\\n\\nWe also worked on paying technical debt and fostering collaboration. In\\nparticular, we improved the `io-sim` framework, which is crucial for testing and\\nsimulating Cardano components. We also removed thunks that appeared on era\\ntranslations, and improved our diffusion pipelining feature. We are working on a\\npresentation for explaining Praos and Genesis.\\n\\n## High-level status report\\n\\n- Finish the UTxO HD prototype: in progress.\\n - We added documentation for this feature.\\n - We developed the second version of the mempool tests.\\n - We fixed benchmarks that were inflating the speedup we observed in the\\n anti-diff implementation of sequences of differences. Speedups are now in the\\n range of [3.33, 4.75], which remain significant.\\n - We continued improving Haskell LMDB support.\\n - We finished implementing a \\"parameter tuning algorithm\\" for the LSM tree\\n prototype. This enables us to run experiments to check the correctness of\\n the algorithm.\\n- Genesis: in progress.\\n - Work investigating the \\"plateaus\\" in the `ChainSync` jumping prototype\\n pointed to the `TICKF` slowdown on era boundaries as culprit.\\n- Tech debt:\\n - We improved the capabilities of our `io-sim` library, which is crucial for\\n testing and simulating Cardano components.\\n - We removed thunks from epoch translations in the ledger.\\n - We added Linux CI support for `lmdb-simple`.\\n - We got pending diffusion pipelining improvements merged.\\n- Fostering collaboration:\\n - We are working on a explanation of Praos and Genesis protocols.\\n- Support:\\n - Investigation of CSJ \\"plateaus\\" led us to developing a caching strategy for\\n `TICKF` that will not only remove these \\"plateaus\\", but can help alleviating\\n the growing block production delay on epoch switch.\\n - We reviewed the block forge credential hotswapping feature which is intended\\n for use in the adoption of P2P.\\n\\n## Workstreams\\n\\n### Finish the UTxO HD prototype\\n\\nWe merged PR [#4060][pr-4060], which adds a report documenting the UTxO HD\\nfeature, and puts emphasis in explaining how the mempool works in combination\\nwith UTxO HD.\\n\\nWe opened a draft PR with the second iteration of the property tests for the\\nmempool ([#4076][pr-4076]).\\n\\nWe fixed the `Arbitrary` instances for keys and values in `DiffSeq` benchmarks\\n([#4143][pr-4143]). The problem was that we were testing with mostly small\\nvalues, which artificially boosted the performance gains we saw on benhcmarks.\\nSpeedups are now in the range of [3.33, 4.75] across the different\\nconfigurations.\\n\\n#### Backing store property tests\\n\\nWe focused on incorporating feedback on the monadic cursor API PR ([#1][pr-1]).\\nThis required us to make small tweaks to `quickcheck-lockstep` to test the new\\nAPI. We also updated the backing store property tests to use the new version of\\nthe monadic cursor API.\\n\\n### LSM tree implementation\\n\\nWe worked on the LSM tree prototype. In particular: finished implementing a\\n\\"parameter tuning algorithm\\" that adapts the LSM tree design based on factors\\nlike:\\n- workload\\n- machine specs, \\n- and characteristics of the data being stored. \\n\\nWe are now running experiments to gather results and cross-reference them with\\nexisting experimental results from the LSM tree paper to see if the algorithm is\\nworking correctly.\\n\\n### Benchmarking the CSJ prototype\\n\\nWe focused on investigating the \\"plateaus\\" in the `ChainSync` tip, which turned\\nout to be due to the `TICKF` bug which we previously were only aware of in the\\ncontext of the long forging times near epoch boundaries. For the most drastic\\npatch by @nfrisby to speed up `TICKF`, full sync is speeding up by 7%.\\n\\nThe following plot shows that by caching the `TICKF` the `ChainSync` tip and the\\n`VolatileDB` tip progress at the same rate.\\n\\n![](/images/consensus/2022-11-16-removed-stuttering.png)\\n\\nThe plot below shows the speedup observed by caching the `TICKF` rule wrt the\\nbaseline.\\n\\n![](/images/consensus/2022-11-16-comparing-TICKF-batch.png)\\n\\n### Technical debt\\n\\nAfter addressing the PR comments, we merged PR [#16][pr-16], which implements\\nthe `MonadCatch` instance for `STM`. This extends the capability of our `io-sim`\\nlibrary, which is crucial for testing and simulating Cardano components PR #16\\nclosed [#1461][issue-1461]. This new feature was published as version `0.4.0.0`\\nof `io-sim`.\\n\\nWe continued with our work fixing the `NoThunk` errors required for enabling\\nnightly tests, with the help of `TVarInvariant` checks in `strict-stm` and\\n`nothunks` libraries. We proposed fixes in `cardano-ledger` that took care of\\nthunks that appeared in era translations ([#3143][pr-3143]). The fixes will be\\nintegrated back into consensus when `cardano-ledger` approves and publish the\\nchanges introduced in `#3143`.\\n\\nWe added CI support for `lmdb-simple` ([#2][pr-2]). We currently test the build on\\na Linux environment only.\\n\\nWe got pending diffusion pipelining PRs ([#3857][pr-3857], [#3860][pr-3860],\\n[#3856][pr-3856]) merged, after rebasing and addressing feedback.\\n\\n### Fostering collaboration\\n\\n@nfrisby finished a visualisation tool and outlined scripts for the Praos and\\nGenesis explanation presentations. The idea is to produce a video that gives an\\noverview of these protocols.\\n\\n### Support \\n\\nWe started working on caching the computation of the `TICKF` rule\\n([#4054][issue-4054]), since this was blocking our benchmarking work for\\nGenesis. In addition, this issue has the Cardano community [quite\\nconcerned][issue-4421], so we are hoping the work done in caching the\\ncomputation of the `TICKF` rule can help alleviating the growing block\\nproduction delay on epoch switch.\\n\\nWe reviewed the block forge credential hotswapping PR [#3800][pr-3800] from the\\nnetworking team, which is intended for use in the adoption of P2P.\\n\\n[issue-4054]: https://github.com/input-output-hk/ouroboros-network/issues/4054\\n[issue-4421]: https://github.com/input-output-hk/cardano-node/issues/4421\\n[issue-1461]: https://github.com/input-output-hk/ouroboros-network/issues/1461\\n\\n[pr-3800]: https://github.com/input-output-hk/ouroboros-network/pull/3800\\n[pr-16]: https://github.com/input-output-hk/io-sim/pull/16\\n[pr-3143]: https://github.com/input-output-hk/cardano-ledger/pull/3143\\n[pr-4060]: https://github.com/input-output-hk/ouroboros-network/pull/4060\\n[pr-4076]: https://github.com/input-output-hk/ouroboros-network/pull/4076\\n[pr-1]: https://github.com/input-output-hk/lmdb-simple/pull/1\\n[pr-4143]: https://github.com/input-output-hk/ouroboros-network/pull/4143\\n[pr-2]: https://github.com/input-output-hk/lmdb-simple/pull/2\\n[pr-3857]: https://github.com/input-output-hk/ouroboros-network/pull/3857\\n[pr-3860]: https://github.com/input-output-hk/ouroboros-network/pull/3860\\n[pr-3856]: https://github.com/input-output-hk/ouroboros-network/pull/3856"},{"id":"2022-11-16-node-cli-api","metadata":{"permalink":"/cardano-updates/2022-11-16-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-node-cli-api.md","source":"@site/blog/2022-11-16-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2022-11-16T00:00:00.000Z","formattedDate":"November 16, 2022","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":0.68,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-11-16-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-11-16-consensus"},"nextItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2022-11-16-performance-and-tracing"}},"content":"# 2022-11-16 - 2022-11-29\\n\\n## High level summary\\n\\n## Completed\\n\\n### docs\\n- [Add a native tokens tutorial and exercises](https://github.com/input-output-hk/cardano-node/pull/4562)\\n\\n### cardano-cli\\n- [Update cardano-cli\'s help](https://github.com/input-output-hk/cardano-node/pull/4674)\\n- [Remove error calls in renderShelleyTxCmdError](https://github.com/input-output-hk/cardano-node/pull/4644)\\n\\n### cardano-api\\n- [Implement Cardano.Api.DeserialiseAnyOf](https://github.com/input-output-hk/cardano-node/pull/4639)\\n\\n### cardano-node\\n- [Fix windows CI](https://github.com/input-output-hk/cardano-node/pull/4650)\\n\\n### cardano-testnet\\n\\n## In Progress\\n\\n### cardano-cli\\n- [BUGFIX]- [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Infer protocol params in transaction build](https://github.com/input-output-hk/cardano-node/pull/4431)\\n- [Allow assembling transactions with no witnesses](https://github.com/input-output-hk/cardano-node/pull/4408)\\n- [Multiple pools support in query stake snapshot](https://github.com/input-output-hk/cardano-node/pull/4279)\\n- [Optimise query leadership schedule command](https://github.com/input-output-hk/cardano-node/pull/4250)\\n- [Optimise query stake snapshot command](https://github.com/input-output-hk/cardano-node/pull/4179)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n- [Handle pipes in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4625)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)"},{"id":"2022-11-16-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2022-11-16-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-performance-and-tracing.md","source":"@site/blog/2022-11-16-performance-and-tracing.md","title":"Performance & tracing update","description":"High level summary","date":"2022-11-16T00:00:00.000Z","formattedDate":"November 16, 2022","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.635,"hasTruncateMarker":false,"authors":[{"name":"Serge Kosyrev","title":"Performance and Tracing Team Lead","url":"https://github.com/deepfire","imageURL":"https://github.com/deepfire.png","key":"deepfire"}],"frontMatter":{"title":"Performance & tracing update","slug":"2022-11-16-performance-and-tracing","authors":"deepfire","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-11-16-node-cli-api"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-11-11-crypto"}},"content":"## High level summary\\n\\n1. P2P performance investigation is ongoing, in support of the networking team.\\n2. SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support.\\n3. Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing.\\n4. On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started.\\n5. We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.\\n\\n\\n## Performance\\n\\nWe are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes.\\n\\n## Tracing\\n\\nWe ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis.\\n\\n## Infrastructure\\n\\nThe first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends.\\n\\nWe designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing.\\n\\nA number of smaller workbench, data analysis & reporting improvements have been made."},{"id":"2022-11-11-crypto","metadata":{"permalink":"/cardano-updates/2022-11-11-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-crypto.md","source":"@site/blog/2022-11-11-crypto.md","title":"Crypto Team Update","description":"High level overview","date":"2022-11-11T00:00:00.000Z","formattedDate":"November 11, 2022","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.305,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2022-11-11-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & tracing update","permalink":"/cardano-updates/2022-11-16-performance-and-tracing"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-11-hydra"}},"content":"## High level overview\\n\\nThe SECP primitives AC has been met, and the test-vectors [PR](https://github.com/input-output-hk/cardano-base/pull/320) has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool [PR](https://github.com/input-output-hk/cardano-base/pull/336) has been merged, and we\'ve adapted the KES secure [PR](https://github.com/input-output-hk/cardano-base/pull/255) to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork ([PR#](https://github.com/input-output-hk/cardano-base/pull/341)). Finally, we\'ve \'cleaned\' our libsodium fork, and we directly fork upstream, rather than forking Algorand\'s fork. \\n\\n## Low level overview\\n* With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation. \\n* We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool. \\n* In parallel, we keep progressing on the [KES agent](https://github.com/input-output-hk/kes-agent)\\n* VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification. \\n* Our libsodium fork now links directly to upstream libsodium."},{"id":"2022-11-11-hydra","metadata":{"permalink":"/cardano-updates/2022-11-11-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-hydra.md","source":"@site/blog/2022-11-11-hydra.md","title":"Hydra Team Update","description":"High-level summary","date":"2022-11-11T00:00:00.000Z","formattedDate":"November 11, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.94,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-11-11-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-11-11-crypto"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-11-11-ledger"}},"content":"## High-level summary\\n\\nThis week, the Hydra team published together with Obsidian Systems a light paper\\non our \\"Hydra for Payments\\" project ([Link](https://iohk.io/en/blog/posts/2022/11/10/hydra-for-payments-introducing-developer-tooling-to-unlock-micropayments-on-cardano/)). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of `hydra-node` processes. \\n\\n## What did the team achieve this week\\n\\n- Published Hydra for Payments light paper ([Link](https://iohk.io/en/blog/posts/2022/11/10/hydra-for-payments-introducing-developer-tooling-to-unlock-micropayments-on-cardano/))\\n- Have a draft RFP ready for a first review internally\\n- Answered the internal auditor’s questions\\n- Fixed a bug with following the chain when starting with persistence ([#599](https://github.com/input-output-hk/hydra-poc/issues/599))\\n- Minor improvements to logging for better observability ([#598](https://github.com/input-output-hk/hydra-poc/issues/598), [#600](https://github.com/input-output-hk/hydra-poc/issues/600))\\n- Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look ([#590](https://github.com/input-output-hk/hydra-poc/issues/590))\\n\\n## What are the goals of next week\\n\\n- Implement event-sourced persistence [#580](https://github.com/input-output-hk/hydra-poc/issues/580)\\n- Close more gaps [#452](https://github.com/input-output-hk/hydra-poc/pull/452)\\n- Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: **\\"Developing Hydra\\" on Day 2, Nov 21st, 13:50 CET**"},{"id":"2022-11-11-ledger","metadata":{"permalink":"/cardano-updates/2022-11-11-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-ledger.md","source":"@site/blog/2022-11-11-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2022-11-11T00:00:00.000Z","formattedDate":"November 11, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.41,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-11-11-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-11-hydra"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-11-11-network"}},"content":"## High level summary\\n\\nI am extremely excited to say that we now have a pull request up which introduces our new versioned\\nCBOR serialization. This was an enormous effort, but it will solve a host of problems that we have\\nhad since the Shelley phase. It will take time to properly review it, and we will\\nneed to put in a lot of effort to integrate it with the downstream components, but this is a huge\\nmilestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction\\nserialization schemes.\\n\\nWe also have a draft pull request that reworks how deposits are tracked. Users of the system will\\nnot notice any difference, but it is a necessary change needed to prepare the way for\\ndecentralizing the governance of Cardano.\\n\\nFinally, we continued to address technical debt. In particular, we continued to make progress on\\nbringing coherency and consistency to the code base with a common naming convention, and\\nimproving some error messages.\\n\\n## Lower level summary\\n\\n- We have a pull request up for our new versioned CBOR serialization.\\n When we encounter a problem with our deserializers, it can be very difficult to implement a fix.\\n It is difficult because we can only fix such issues during a hard fork, and leading up to the\\n hard fork we must maintain two serializations for the same type in order to not cause unintended\\n network splitting (the problematic version must be used before the hard fork,\\n and the fixed version is used afterwards).\\n This can be especially tricky with the `FromCBOR` typeclass, since it is not always easy to\\n search for where all the problematic uses are located.\\n The new versioned CBOR serialization allows us to gracefully handle this transition.\\n See [[pull-3138]].\\n- We proposed a CIP for backwards compatibility of the transaction serialization schemes.\\n See [[pull-372]].\\n- We have draft for the new deposit tracking.\\n This draft is not as memory efficient as the final version will be,\\n but it is a sufficient proof of concept that we can write property tests against, ensuring\\n that we have not changed the semantics.\\n We will optimize after we are sure of the correctness.\\n See [[pull-3127]].\\n- We now provide better support for debugging failed Plutus scripts in an important helper\\n function, named `evaluateTransactionExecutionUnits`.\\n In particular, it now returns all the information needed to rerun the script with exactly the\\n same arguments. This feature will end up appearing in the CLI and other tools from the Plutus\\n tools team.\\n See [[pull-3135]].\\n- We did a lot more renaming to bring coherency and consistency to the code base.\\n See [[pull-3126]], [[pull-3120]], [[pull-3118]], and [[pull-3116]].\\n- We have added a few things to the ledger repository to make it conform to the\\n [Cardano Engineering Handbook](https://input-output-hk.github.io/cardano-engineering-handbook/)\\n See [[pull-3139]].\\n\\n\\n[pull-3138]: https://github.com/input-output-hk/cardano-ledger/pull/3138\\n[pull-3127]: https://github.com/input-output-hk/cardano-ledger/pull/3127\\n[pull-3135]: https://github.com/input-output-hk/cardano-ledger/pull/3135\\n[pull-3126]: https://github.com/input-output-hk/cardano-ledger/pull/3126\\n[pull-3120]: https://github.com/input-output-hk/cardano-ledger/pull/3120\\n[pull-3118]: https://github.com/input-output-hk/cardano-ledger/pull/3118\\n[pull-3116]: https://github.com/input-output-hk/cardano-ledger/pull/3116\\n[pull-3139]: https://github.com/input-output-hk/cardano-ledger/pull/3139\\n[pull-372]: https://github.com/cardano-foundation/CIPs/pull/372"},{"id":"2022-11-11-network","metadata":{"permalink":"/cardano-updates/2022-11-11-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-network.md","source":"@site/blog/2022-11-11-network.md","title":"Network Team Update","description":"High-level summary","date":"2022-11-11T00:00:00.000Z","formattedDate":"November 11, 2022","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":1.595,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2022-11-11-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-11-11-ledger"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-04-hydra"}},"content":"import NoticedHeaders from \'@site/static/images/network/2022-11-11-noticed-headers.png\';\\n\\n## High-level summary\\n\\nIn last sprint we got a performance report of P2P performance testing cluster\\n(which consists of 50 nodes). There is a performance regression in the header\\nnotification metric. The P2P cluster is constructed with the same\\ntopology as the non-p2p reference one this indicates some regression which\\nneeds to be further investigated. This poses a risk for releasing P2P.\\n\\nWe also continued to work on peer sharing: [pull #4019].\\n\\nWe continued working on dynamic block production which is required for P2P\\nrelease for BP nodes: [pull #3159].\\n\\nWe simplified the P2P topology format: [issue #4559], [pull #3888].\\n\\nWe added a new trace point for asynchronous demotions of local peers with\\n`Warning` severity. This trace is **important** for SPOs.\\n\\n## Detail description\\n\\n### Performance regression\\n\\nBelow we include a graph which shows the performance regression of the P2P code base vs non P2P.\\n\\n\\n\\nOn the `x` axis is time in seconds which measures the delay from the start of\\nthe slot to when a header was received. The `y` axis is the percentile of nodes\\nthat received a header. We are currently investigating possible causes of the\\nregression. \\n\\n### New P2P topology form\\n\\nThe new topology file format is described in this [issue #4559].\\n\\n### Tracing improvements\\n\\n* We improved a handshake error reporting, [pull #4136]\\n* We added `TraceDemoteLocalAsynchronous` rendered as `DemoteLocalAsynchronous`\\n in `json` format, [pull #4127]. Such demotions should be investigated by the\\n pool operator. They can indicate a problem in the deployed system, but also\\n they could indicate a remote problem in arranged connections with other SPOs.\\n\\n### Open Source Improvements\\n\\nWe improved documentation of `io-sim` and `typed-protocols` for open-source\\ncontributors and/or maintenance tasks: [pull #22], [pull #45], [pull #48]. \\n\\n[pull #4019]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[pull #3888]: https://github.com/input-output-hk/ouroboros-network/issues/3888\\n[pull #3159]: https://github.com/input-output-hk/ouroboros-network/issues/3159\\n[issue #4559]: https://github.com/input-output-hk/cardano-node/issues/4559\\n[pull #4136]: https://github.com/input-output-hk/ouroboros-network/pull/4136\\n[pull #4127]: https://github.com/input-output-hk/ouroboros-network/pull/4127\\n[pull #22]: https://github.com/input-output-hk/typed-protocols/pull/22\\n[pull #45]: https://github.com/input-output-hk/io-sim/pull/45\\n[pull #48]: https://github.com/input-output-hk/io-sim/pull/48"},{"id":"2022-11-04-hydra","metadata":{"permalink":"/cardano-updates/2022-11-04-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-hydra.md","source":"@site/blog/2022-11-04-hydra.md","title":"Hydra Team Update","description":"High level summary","date":"2022-11-04T00:00:00.000Z","formattedDate":"November 4, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.935,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-11-04-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-11-11-network"},"nextItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-11-04-mithril"}},"content":"## High level summary\\n\\nThis week, the hydra team first re-deployed the latest Hydra scripts to the re-spun `preview` network, see [0.8.0 release notes](https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0). They also completed implementation of [ADR18](https://hydra.family/head-protocol/adr/18/) and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates [#195](https://github.com/input-output-hk/hydra-poc/issues/195#issuecomment-1300503557) and alignment of the specification document with auditors.\\n\\n## What did the team achieve this week\\n\\n- Complete and merge ADR18 [#579](https://github.com/input-output-hk/hydra-poc/pull/579)\\n- Re-deploy hydra scripts to respun `preview` network, see [0.8.0 release notes](https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0) [#595](https://github.com/input-output-hk/hydra-poc/pull/595)\\n- Have first gap of [#452](https://github.com/input-output-hk/hydra-poc/pull/452) in review.\\n- Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot.\\n- Engineering meeting to discuss hard forks and protocol parameter updates [#195](https://github.com/input-output-hk/hydra-poc/issues/195#issuecomment-1300503557)\\n- Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions.\\n- Drafted project scope for an external audit RFP.\\n\\n## What are the goals of next week\\n\\n- Implement event-sourced persistence [#580](https://github.com/input-output-hk/hydra-poc/issues/580)\\n- Answer the internal auditor’s questions\\n- Have a draft RFP ready for a first review internally\\n- Close some gaps [#452](https://github.com/input-output-hk/hydra-poc/pull/452)"},{"id":"2022-11-04-mithril","metadata":{"permalink":"/cardano-updates/2022-11-04-mithril","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-mithril.md","source":"@site/blog/2022-11-04-mithril.md","title":"Mithril Team Update","description":"This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we\'ve implemented an efficiency improvement on the size of the mithril certificates.","date":"2022-11-04T00:00:00.000Z","formattedDate":"November 4, 2022","tags":[{"label":"mithril","permalink":"/cardano-updates/tags/mithril"}],"readingTime":1.015,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Mithril Team Update","slug":"2022-11-04-mithril","authors":"iquerejeta","tags":["mithril"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-11-04-hydra"},"nextItem":{"title":"Open-Source Team","permalink":"/cardano-updates/2022-10-31-open-source"}},"content":"This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we\'ve implemented an efficiency improvement on the size of the mithril certificates.\\n# Low level overview\\n- We have been moving forward on the implementation of the release process [#500](https://github.com/input-output-hk/mithril/issues/500):\\n - Setup of the new hosted environments for `testing-preview`, `pre-release-preview` and `release-preprod` with their terraform and GitHub environments [#542](https://github.com/input-output-hk/mithril/issues/542)\\n - Adapted the CI workflows to work with the new release process [#543](https://github.com/input-output-hk/mithril/issues/543)\\n - Publication of an [ADR3](https://mithril.network/doc/adr/3)\\n - Publication of a [dev blog post](https://mithril.network/doc/dev-blog/2022/10/28/updated-environments) about Mithril networks evolution \\n - Releasing our first Mithril distribution [2244.0](https://github.com/input-output-hk/mithril/releases/tag/2244.0)\\n- Worked on the API versioning mechanism [#565](https://github.com/input-output-hk/mithril/issues/565)\\n- Worked on the implementation of the stores migration process for the signer and aggregator nodes [#562](https://github.com/input-output-hk/mithril/issues/562)\\n- Prepared a Mithril `devnet` video demo [#526](https://github.com/input-output-hk/mithril/issues/526)\\n- Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably [#484](https://github.com/input-output-hk/mithril/pull/484)"},{"id":"2022-10-31-open-source","metadata":{"permalink":"/cardano-updates/2022-10-31-open-source","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-open-source.md","source":"@site/blog/2022-11-04-open-source.md","title":"Open-Source Team","description":"High Level Summary","date":"2022-11-04T00:00:00.000Z","formattedDate":"November 4, 2022","tags":[{"label":"open-source","permalink":"/cardano-updates/tags/open-source"}],"readingTime":1.465,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Open-Source Team","slug":"2022-10-31-open-source","authors":"coot","tags":["open-source"],"hide_table_of_contents":false},"prevItem":{"title":"Mithril Team Update","permalink":"/cardano-updates/2022-11-04-mithril"},"nextItem":{"title":"Embedding Quality Workstream","permalink":"/cardano-updates/2022-11-03-embedding-quality"}},"content":"## High Level Summary\\n\\n* We\'ve been working toward publishing _Cardano Backlog_, currently its in\\n review by the IOG communication team.\\n* We identified a number of libraries which can be published.\\n* We setup and enhanced [cardano-updates][cardano-updates].\\n\\n## Detailed description\\n\\nI am glad to announce that I was given the role of open-source advocate for\\ncardano project. In last few weeks we were making steps towards publishing our\\nbacklog. It\'s currently under review by the communication team, although most\\nof the issues are already visible across various repositories.\\n\\nThe open-source initiatives have their own\\n[project](https://github.com/orgs/input-output-hk/projects/60). It is set up\\nto help us track our major open-source activities. Right now there are two\\nwork streams:\\n\\n* the work on [_Cardano Engineering Handbook_][ceh];\\n* libraries to be release on [Hackage][Hackage] or [crates.io][crates.io].\\n\\nWe identifies a number of libraries across all the teams which contribute to\\n_Cardano_ which we would like publish to publish, see the following\\n[link][publish-on-hackage]. Arnauld Bailly recently published\\n[`quickcheck-dynamic`](https://hackage.haskell.org/package/quickcheck-dynamic)\\nlibrary on Hackage. The networking team is slowly progressing towards\\npublishing [io-sim][io-sim] and related packages, checkout the progress\\n[here](https://github.com/orgs/input-output-hk/projects/19/views/24).\\n\\nThanks to Arnaud Bailly our [Cardano Updates][cardano-updates] website has\\na new look & feel! It\'s using [docusaurus.io][docusaurus].\\n\\n\\nChristian Taylor carried recently a detailed analysis of our open-source\\nrepositories. He collected many interesting metrics, which allows us to see\\nwhere we need to improve as an open-source project to make the Cardano project\\nand many smaller related libraries which we maintain be more open and available\\nfor open-source contributors.\\n\\nThe graph below shows which documents the 55 most important Cardano\\nrepositories are missing the most:\\n![Documentation Adoption](../static/img/doc-adoption.png)\\nYou can expect we will improve in these metrics in the coming weeks.\\n\\n\\n[Hackage]: https://hackage.haskell.org/\\n[crates.io]: https://crates.io\\n[publish-on-hackage]: https://github.com/orgs/input-output-hk/projects/60/views/3\\n[io-sim]: https://github.com/input-output-hk/io-sim\\n[ceh]: https://input-output-hk.github.io/cardano-engineering-handbook/\\n[cardano-updates]: https://input-output-hk.github.io/cardano-updates\\n[docusaurus]: https://docusaurus.io"},{"id":"2022-11-03-embedding-quality","metadata":{"permalink":"/cardano-updates/2022-11-03-embedding-quality","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-03-embedding-quality.md","source":"@site/blog/2022-11-03-embedding-quality.md","title":"Embedding Quality Workstream","description":"High level summary","date":"2022-11-03T00:00:00.000Z","formattedDate":"November 3, 2022","tags":[{"label":"embedding-quality","permalink":"/cardano-updates/tags/embedding-quality"}],"readingTime":0.65,"hasTruncateMarker":false,"authors":[{"name":"Dorin Solomon","title":"System Test Team Lead","url":"https://github.com/dorin100","imageURL":"https://github.com/dorin100.png","key":"dorin100"}],"frontMatter":{"title":"Embedding Quality Workstream","slug":"2022-11-03-embedding-quality","authors":"dorin100","tags":["embedding-quality"],"hide_table_of_contents":false},"prevItem":{"title":"Open-Source Team","permalink":"/cardano-updates/2022-10-31-open-source"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-10-02-consensus"}},"content":"## High level summary\\n\\nWe made good progress on most of the Action Items we agreed on Lisbon, like:\\n* Cardano System Tests was fully open to public (tools, tests, results) \\n See [cardano-node-tests webpage](https://input-output-hk.github.io/cardano-node-tests).\\n* We defined an [user-facing-functionality template](https://github.com/input-output-hk/cardano-node/blob/master/.github/ISSUE_TEMPLATE/user-facing-feature.md) that is used with the cardano-cli team \\n * this includes acceptance criteria & user stories, and definition of done\\n* We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)\\n* We started to apply a _labelling convention_ on [cardano-node issues](https://github.com/input-output-hk/cardano-node/issues) that will be used to generate some visual dashboards with some metrics [TBD]\\n* Ziyand Liu started an _End-to-End Development and Testing Process for Plutus Features_"},{"id":"2022-10-02-consensus","metadata":{"permalink":"/cardano-updates/2022-10-02-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-consensus.md","source":"@site/blog/2022-11-02-consensus.md","title":"Consensus Team Update","description":"High-level summary","date":"2022-11-02T00:00:00.000Z","formattedDate":"November 2, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":3.53,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-10-02-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Embedding Quality Workstream","permalink":"/cardano-updates/2022-11-03-embedding-quality"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-11-02-ledger"}},"content":"## High-level summary\\n\\nDuring the past two weeks, the consensus team continued its work on testing the\\nUTxO HD prototype. We completed the era-transition and backing store tests, and\\nthe mempool tests are advancing at a steady pace. Regarding our work in the\\nGenesis design, we continued our collaboration with the research and networking\\nteams, and we continue investigating strategies for making the chain-sync\\njumping prototype faster.\\n\\n## High-level status report\\n\\n- Finish the UTxO HD prototype: on track.\\n - We worked on state-machine tests for the mempool, and spotted potential bugs\\n in the implementation. Investigation is ongoing.\\n - We have a set of property tests for the backing store. We still need to\\n incorporate the improvements to the LMDB cursor API that these tests\\n made possible.\\n - We merged the era-transition tests PR.\\n- Genesis: on track.\\n - Design work around Genesis continues in collaboration with researchers and\\n the networking team.\\n - We continued trying to improve the performance of the chain-sync jumping\\n prototype. We gained additional insight on which parameters to tweak next.\\n In spite of the baseline still being faster, the current prototype already\\n achieves a significant speedup when compared to the naive approach of simply\\n running full chain-sync with all peers.\\n- Tech debt: on track.\\n - We clarified a common source of confusion around VRF tie-breaking and\\n cross-era chain selection.\\n\\n## Workstreams\\n\\n### Finish the UTxO HD prototype\\n\\nWe continued working on property-tests for the UTxO HD prototype. In particular\\nwe merged the [era-transition tests\\nPR](https://github.com/input-output-hk/ouroboros-network/pull/4073).\\n\\n#### Backing store property tests\\n\\nThe [backing store property tests\\nPR](https://github.com/input-output-hk/ouroboros-network/pull/4081) has been\\nreviewed. The next steps are:\\n\\n- Improve error handling and command generation.\\n- Add coverage testing to check that we are not failing to cover interesting\\n test cases.\\n\\nThe [monadic cursor API](https://github.com/input-output-hk/lmdb-simple/pull/1)\\nwent through its first review round. The API is in a relatively stable state.\\nThis PR also unifies the `cborg` and `serialise`-based interfaces to LMDB\\noperations. The next steps are:\\n\\n- Write\\n [`quickcheck-dynamic`](https://hackage.haskell.org/package/quickcheck-dynamic)\\n state-machine tests for this API.\\n- Adapt the changes in the serialisation interface in the backing store property\\n tests. This will involve adding boilerplate code in consensus to make up for\\n the removal of the `cborg`-based interface.\\n\\n## LSM tree implementation\\n\\nWe worked on the [LSM tree\\nprototype](https://github.com/input-output-hk/ouroboros-network/issues/4121). In\\nparticular, we focused on tuning the LSM tree design to the different workloads\\nthat consensus has (eg syncing, normal node operation, etc).\\n\\n### Benchmarking the CSJ prototype\\n\\nWork on improving the chain-sync jumping performance is ongoing. In particular\\nwe compared the performance of different jump intervals, which, somewhat\\nsurprisingly, do not make a significant difference. In particular, we are seeing\\nperiodic \\"plateaus\\" where the chain-sync tip does not progress, but they are\\nmuch longer for the prototype. Our hypothesis is that this seem to be due to a\\ncombination of the garbage collector (GC) pauses, and the actual time it takes\\nthe non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo\\nfragment.\\n\\nIn the coming weeks we will try to shorten these plateaus via a combination of\\ntweaking GC options and less synchronisation in the CSJ governor.\\n\\nThe following plot shows the performance of the chain-sync jumping prototype\\nusing different jumping intervals. It compares the syncing progress by plotting\\nthe slots of adopted blocks against time. The baseline is still faster, however\\nit is worth noting that the current prototype already achieves a significant\\nspeedup when compared to the naive approach of simply running full chain-sync\\nwith all peers.\\n\\n![](/images/consensus/2022-11-02-csj-vs-baseline.svg)\\n\\nThe second plot shows the syncing progress sliced to a chosen ~5min interval,\\nand includes, in addition to the slots of adopted blocks, the slots of the tip\\nof the ChainSync fragment. This allows us to see how far ahead of the selected\\ntip the CS dynamo is, i.e. how much room we have for BlockFetch not to get\\nstalled. It shows periodic behaviour (due to the forecasting limit), and shows\\nthat the CS fragment tip is not progressing for significant periods\\n(\\"plateaus\\").\\n\\n![](/images/consensus/2022-11-02-csj-vs-baseline-sliced.svg)\\n\\n## Technical debt\\n\\nWe [clarified](https://github.com/input-output-hk/ouroboros-network/pull/4098) a\\ncommon source of confusion around VRF tie-breaking and cross-era chain\\nselection. This PR involved correcting potentially misleading names of\\nVRF-related functions, and providing context for a particular VRF value is\\nused for tie-breaking."},{"id":"2022-11-02-ledger","metadata":{"permalink":"/cardano-updates/2022-11-02-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-ledger.md","source":"@site/blog/2022-11-02-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2022-11-02T00:00:00.000Z","formattedDate":"November 2, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.275,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-11-02-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-10-02-consensus"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-11-02-node-cli-api"}},"content":"## High level summary\\nWe have made the decision to use the\\n[formal ledger repository](https://github.com/input-output-hk/formal-ledger-specifications)\\nin place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure\\nto the model. In particular, we now have a lot of support for axiomatic set theory.\\nWhile the next ledger era is still in the design phase, most of the team remains working\\non technical debt.\\nIn particular, we have moved a lot more code out of the Shelley specific modules and into\\na ledger core module, we have finished up our benchmarking around the problematic `TICKF`\\nledger transition (while improving the performance), made conveniences to the development\\nenvironment, cleaned up all the recent changes to the cost model, added a lot of documentation,\\nfixed some flaky tests, and deleted some dead code.\\n\\n## Lower level summary\\n\\n### Axiomatic Set Theory\\n\\nThe formal ledger model now has support for much of the set theory that we make use of in\\nthe formal ledger specifications. See [[pull-20]].\\n\\n### Completed Technical Debt\\n\\n- We have addressed issues with two of our most problematic and flaky tests.\\n See [[pull-3039]] and [[pull-3093]].\\n- We have added more documentation and tests to the Twiddler module. This is a module which\\n makes our CBOR serialization round-trip tests much more robust, and will also hopefully\\n help enforce the mandate for downstream libraries to never re-serialize data that needs\\n to be hashed. See [[pull-3073]] and [[pull-3095]]\\n (we cannot merge 3095 just yet, due to a preference for merging other features).\\n- We have finished our long analysis of the problematic `TICKF` transition.\\n We now have a lot of benchmarks surrounding this code, and have added performance improvements.\\n See [[pull-3068]] and [[issue-3035]].\\n- We have restored support for\\n [ghcid](https://hackage.haskell.org/package/ghcid)\\n in our repository. This is a tool for developing with Haskell that many of us find greatly\\n improves our productivity by providing us with constant feedback from the type checker.\\n See [[pull-3112]].\\n- After much activity on the cost model, we have done some final clean up of the code.\\n See [[pull-3075]] and [[pull-3101]].\\n- We moved a lot of the existing user facing documentation regarding native tokens into the\\n ledger repository, and cleaned it up\\n (most of the heavy lifting was done by our amazing technical writers).\\n See [[pull-3091]].\\n- We removed dead code. See [[pull-3089]].\\n- We moved a lot of code from the Shelley specific libraries to the ledger core library.\\n See [[pull-3109]] and [[pull-3110]].\\n- We\'ve removed more of the awkward legacy template Haskell names.\\n See [[pull-3108]].\\n\\n[issue-3035]: https://github.com/input-output-hk/cardano-ledger/issues/3035\\n\\n[pull-20]: https://github.com/input-output-hk/formal-ledger-specifications/pull/20\\n[pull-3039]: https://github.com/input-output-hk/cardano-ledger/pull/3039\\n[pull-3093]: https://github.com/input-output-hk/cardano-ledger/pull/3093\\n[pull-3073]: https://github.com/input-output-hk/cardano-ledger/pull/3073\\n[pull-3095]: https://github.com/input-output-hk/cardano-ledger/pull/3095\\n[pull-3068]: https://github.com/input-output-hk/cardano-ledger/pull/3068\\n[pull-3112]: https://github.com/input-output-hk/cardano-ledger/pull/3112\\n[pull-3075]: https://github.com/input-output-hk/cardano-ledger/pull/3075\\n[pull-3101]: https://github.com/input-output-hk/cardano-ledger/pull/3101\\n[pull-3091]: https://github.com/input-output-hk/cardano-ledger/pull/3091\\n[pull-3089]: https://github.com/input-output-hk/cardano-ledger/pull/3089\\n[pull-3109]: https://github.com/input-output-hk/cardano-ledger/pull/3109\\n[pull-3110]: https://github.com/input-output-hk/cardano-ledger/pull/3110\\n[pull-3108]: https://github.com/input-output-hk/cardano-ledger/pull/3108"},{"id":"2022-11-02-node-cli-api","metadata":{"permalink":"/cardano-updates/2022-11-02-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-node-cli-api.md","source":"@site/blog/2022-11-02-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2022-11-02T00:00:00.000Z","formattedDate":"November 2, 2022","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.265,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-11-02-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-11-02-ledger"},"nextItem":{"title":"Node Release Team Update","permalink":"/cardano-updates/2022-11-02-release"}},"content":"# 2022-11-02 - 2022-11-15\\n\\n## High level summary\\n- Documentation improvments\\n- Merged community contributions\\n- Exposing types from cardano-api requested by the community/other teamss\\n- Test output has been improved so diagnosing failures is now easier\\n- Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)\\n- Refactoring of cardano-testnet making it more useable as a library (ongoing)\\n- Release 1.35.4 was merged & released\\n\\n## Completed\\n\\n### cardano-cli\\n- [Community contributions - doc fixes and spelling errors](https://github.com/input-output-hk/cardano-node/pull/4567)\\n\\n### cardano-api\\n- [Reduce exposed modules in cardano-api](https://github.com/input-output-hk/cardano-node/pull/4546)\\n- [Add Ord instance for AddressInEra](https://github.com/input-output-hk/cardano-node/pull/4587)\\n- [Export TxTotalAndReturnCollateralSupportedInEra from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4496)\\n- [Expose TextEnvelopeCddl from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4635)\\n- [Expose txScriptValidityToScriptValidity in Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4628)\\n- [export RawBytesHexError](https://github.com/input-output-hk/cardano-node/pull/4599)\\n\\n### cardano-node\\n- [Add Plutus minting script doc](https://github.com/input-output-hk/cardano-node/pull/2883)\\n- [Improve test output](https://github.com/input-output-hk/cardano-node/pull/4575/files)\\n- [Enable stale bot](https://github.com/input-output-hk/cardano-node/pull/4586)\\n- [Add link to troubleshooting page in the wiki](https://github.com/input-output-hk/cardano-node/pull/4557)\\n- [Use environment files in Github Actions](https://github.com/input-output-hk/cardano-node/pull/4550)\\n\\n\\n### cardano-testnet\\n- [Add single entrypoint for starting testnets](https://github.com/input-output-hk/cardano-node/pull/4544)\\n- [Improve cardano-testnet test output](https://github.com/input-output-hk/cardano-node/pull/4575)\\n- [Reorder module hierarchy](https://github.com/input-output-hk/cardano-node/pull/4595)\\n\\n## In Progress\\n\\n### cardano-cli\\n- [BUGFIX]- [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Infer protocol params in transaction build](https://github.com/input-output-hk/cardano-node/pull/4431)\\n- [Allow assembling transactions with no witnesses](https://github.com/input-output-hk/cardano-node/pull/4408)\\n- [Multiple pools support in query stake snapshot](https://github.com/input-output-hk/cardano-node/pull/4279)\\n- [Optimise query leadership schedule command](https://github.com/input-output-hk/cardano-node/pull/4250)\\n- [Optimise query stake snapshot command](https://github.com/input-output-hk/cardano-node/pull/4179)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)"},{"id":"2022-11-02-release","metadata":{"permalink":"/cardano-updates/2022-11-02-release","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-release.md","source":"@site/blog/2022-11-02-release.md","title":"Node Release Team Update","description":"Node Reelease Update","date":"2022-11-02T00:00:00.000Z","formattedDate":"November 2, 2022","tags":[{"label":"release","permalink":"/cardano-updates/tags/release"}],"readingTime":0.445,"hasTruncateMarker":false,"authors":[{"name":"Samuel Leathers","title":"Service Reliability Manager","url":"https://github.com/disassembler","imageURL":"https://github.com/disassembler.png","key":"disassembler"}],"frontMatter":{"title":"Node Release Team Update","slug":"2022-11-02-release","authors":"disassembler","tags":["release"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-11-02-node-cli-api"},"nextItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2022-11-02-system-test"}},"content":"## Node Reelease Update\\n## 2022-10-19 - 2022-11-02\\n\\n### Executive Summary\\nThe team is formalizing the new release process and team structure. Both preview/preprod environments have been reset,\\na temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8.\\n\\n1.35.4 release candidates have been created and are being tested internally and externally.\\n\\n### Completed\\n\\n- [1.35.4-rc1 tag](https://github.com/input-output-hk/cardano-node/commits/1.35.4-rc1)\\n- [1.35.4-rc2 tag (config changes only for preview)](https://github.com/input-output-hk/cardano-node/commits/1.35.4-rc1)\\n- [CHaP Migration] (https://github.com/input-output-hk/cardano-node/pull/4540)\\n\\n### In Progress\\n\\n- [Release 1.35.4](https://github.com/input-output-hk/cardano-node/commits/release/1.35)\\n\\n * [Test Status](https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.4_rc1/src_docs/source/test_results/node/tag_1_35_4_rc1.rst)\\n\\n- [Cicero CI Migration](https://input-output-hk.github.io/cardano-updates/2022-08-12-sre)"},{"id":"2022-11-02-system-test","metadata":{"permalink":"/cardano-updates/2022-11-02-system-test","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-system-test.md","source":"@site/blog/2022-11-02-system-test.md","title":"System Test Team Update","description":"High level summary","date":"2022-11-02T00:00:00.000Z","formattedDate":"November 2, 2022","tags":[{"label":"system-test","permalink":"/cardano-updates/tags/system-test"}],"readingTime":0.4,"hasTruncateMarker":false,"authors":[{"name":"Dorin Solomon","title":"System Test Team Lead","url":"https://github.com/dorin100","imageURL":"https://github.com/dorin100.png","key":"dorin100"}],"frontMatter":{"title":"System Test Team Update","slug":"2022-11-02-system-test","authors":"dorin100","tags":["system-test"],"hide_table_of_contents":false},"prevItem":{"title":"Node Release Team Update","permalink":"/cardano-updates/2022-11-02-release"},"nextItem":{"title":"DB Sync Team Update","permalink":"/cardano-updates/2022-11-01-db-sync"}},"content":"## High level summary\\n\\nWe have been focused on:\\n* Fully opening our test results (on top of the existing tests & tools): \\n See [cardano-node-tests webpage](https://input-output-hk.github.io/cardano-node-tests/).\\n* Started to test and automate the new functionalities added in the `1.35.4-rc1` node tag \\n See [test results tracking page](https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.4_rc1/src_docs/source/test_results/node/tag_1_35_4_rc1.rst).\\n* Made some improvements to the automated db-sync sync tests \\n See [db-sync tests](https://github.com/input-output-hk/cardano-node-tests/tree/db_sync_tests/db_sync_tests).\\n* Multiple cleanups and updates to the cardano-node-tests framework\\n* Updated the nightly pipelines for the cardano-node-tests after the Babbage HF"},{"id":"2022-11-01-db-sync","metadata":{"permalink":"/cardano-updates/2022-11-01-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-01-db-sync.md","source":"@site/blog/2022-11-01-db-sync.md","title":"DB Sync Team Update","description":"High level summary","date":"2022-11-01T00:00:00.000Z","formattedDate":"November 1, 2022","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":0.86,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB Sync Team Update","slug":"2022-11-01-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"System Test Team Update","permalink":"/cardano-updates/2022-11-02-system-test"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-10-28-hydra"}},"content":"## High level summary\\n\\nThe DBSync team is preparing a release which introduces schema simplifications, removes indexes,\\nunique and foreign keys. It also provides a way to fix older values and migrates without the need to\\nresync from genesis.\\n\\n## Lower level summary\\n\\n### Schema simplifications\\n\\nIndexes, Unique and Foreign keys are removed in order to speedup syncing\\n[#1295](https://github.com/input-output-hk/cardano-db-sync/pull/1295)\\nThe same pr also introduces a different way to rollback, which doesn\'t rely on foreign keys and\\nindexes.\\n\\n### Performance\\n\\nThe DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A\\nconservative number of these will be included in the next release and the rest can be found in\\n[performance view](https://github.com/orgs/input-output-hk/projects/52/views/7).\\n\\n### Migrations and resyncing\\n\\nThe next release will be 13.1.0, it will enable a migration without the need to resync. It will also\\nintroduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases\\n[#1294](https://github.com/input-output-hk/cardano-db-sync/pull/1294)\\n\\n### Release\\n\\nThe release has been mostly cherry-picked from master\\n[#1294](https://github.com/input-output-hk/cardano-db-sync/pull/1294) and its scope can be seen\\n[release view](https://github.com/orgs/input-output-hk/projects/52/views/6)"},{"id":"2022-10-28-hydra","metadata":{"permalink":"/cardano-updates/2022-10-28-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-hydra.md","source":"@site/blog/2022-10-28-hydra.md","title":"Hydra Team Update","description":"High level summary","date":"2022-10-28T00:00:00.000Z","formattedDate":"October 28, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.795,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-10-28-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"DB Sync Team Update","permalink":"/cardano-updates/2022-11-01-db-sync"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-10-28-network"}},"content":"## High level summary\\n\\nThis week, the hydra team completed several user experience improvements to the\\n`hydra-tui` and `hydra-node`, and delivered a first version of persisted head\\nstates by publishing release version\\n[`0.8.0`](https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0).\\nBesides this, they met with researchers on topic of the HeadV1 specification and\\nkicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation.\\n\\n## What did the team achieve this week\\n\\n- Completed the UX improvements on the `hydra-tui`\\n- Released version [`0.8.0`](https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0), which delivers a first version of persisted head states\\n- Met with researchers on the HeadV1 specification\\n- Started work on the RFP for our external audit\\n\\n## What are the goals of next week\\n\\n- Complete ADR18 implementation and get it merged\\n- Start work on event-sourced persistence [#580](https://github.com/input-output-hk/hydra-poc/issues/580)\\n- Have a first plutus script gap closed [#452](https://github.com/input-output-hk/hydra-poc/issues/452)\\n- Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)"},{"id":"2022-10-28-network","metadata":{"permalink":"/cardano-updates/2022-10-28-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-network.md","source":"@site/blog/2022-10-28-network.md","title":"Network Team Update","description":"High-level summary","date":"2022-10-28T00:00:00.000Z","formattedDate":"October 28, 2022","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":2.665,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2022-10-28-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-10-28-hydra"},"nextItem":{"title":"Performance & Tracing Team Update","permalink":"/cardano-updates/2022-10-28-performance-and-tracing"}},"content":"## High-level summary\\n\\nThe team has focused on debuging & fixing bugs for the **P2P single relay release**, which included\\n\\n* diagnosing, fixing and writing tests for a bug in `peer-state-actions` which\\n fortunately hasn\'t been released;\\n* diagnosing & preventing misconfiguration of DNS\\n\\nWe also focused on developing **peer sharing**. We also held a session with\\nthe scientists on eclipse evasion.\\n\\n## Detailed description\\n\\n### P2P Network Stack\\n\\nDuring the past two weeks the team focused on p2p single relay release and peer\\nsharing. We found and fixed an important bug recently introduced in one of the\\ncomponents of p2p networking stack (fortunately never released). Together with\\na fix, we designed a unit test diffusion simulation as well as quickcheck\\nproperty test (both could reproduce it). We also changed the code in a way that\\nif such a bug is reintroduced in the future, it will be obvious to diagnose.\\nFor more see:\\n\\n* [ouroboros-network#4067](https://github.com/input-output-hk/ouroboros-network/pull/4067)\\n* [ouroboros-network#4086](https://github.com/input-output-hk/ouroboros-network/pull/4086)\\n\\nInitial benchmarking run of the P2P code was executed. The results where\\nunlike what we see on the mainnet. We found a possible misconfiguration of the\\ncluster (caused by 0 TTL on domain names), which could be the direct cause of\\nit. We wrote a PR which rules out such misconfiguration. We are awaiting on\\nthe next benchmarking results. See more at:\\n\\n[ouroboros-network#4106](https://github.com/input-output-hk/ouroboros-network/pull/4106)\\n\\nWe also started working on P2P single relay release. The PR\\n[ouroboros-network#4120](https://github.com/input-output-hk/ouroboros-network/pull/4120)\\nincludes _108_ patches cherry-picked from the `master` branch. We started\\nworking toward integration these changes against the release branch of\\n`cardano-node`. Early next week we ought to be able to have an early version\\nof `cardano-node` with _non experimental P2P support_!\\n\\nFor more detailed release plan please see [P2P - Single\\nRelay](https://github.com/input-output-hk/ouroboros-network/issues/3888)\\nissue.\\n\\n### Consensus\\n\\nWe identified and fixed missing error reporting in consensus\\ninitialisation phase. See more at\\n[ouroboros-network#4015](https://github.com/input-output-hk/ouroboros-network/pull/4015)\\n\\n### Cardano Node\\n\\nWe also made changes in `cardano-node` in order to give better experience for\\nnode operators. This includes updating severities of some of the traces as\\nwell as implementing new format of the p2p topology file. For more see:\\n\\n* [cardano-node#4563](https://github.com/input-output-hk/cardano-node/pull/4563).\\n* [cardano-node#4561](https://github.com/input-output-hk/cardano-node/pull/4561)\\n\\n### Peer Sharing\\n\\nWe continued working on implementation of peer sharing. We have an early\\nimplementation which will be reviewed and analysed in next weeks. We started\\nworking on `cardano-node` integration. We need\\n[PR #4392](https://github.com/input-output-hk/cardano-node/pull/4392) to be merged\\nbefore such integration will be able to land in `cardano-node`, although this\\nis _not blocking_ us currently. See more at:\\n\\n* [ouroboros-network#4019](https://github.com/input-output-hk/ouroboros-network/pull/4019)\\n\\n### Eclipse Evasion\\n\\nWe held a session which included Alexander Russel, Sandro Coretti-Drayton and\\nNick Frisby from the consensus team. We discussed high lever design of the\\neclipse evasion scheme, which is important for the design and implementation of\\n`ouroboros-genesis`. We got a positive feedback from the researchers.\\n\\n### IO-Sim\\n\\nIn this period we made little progress towards releasing `IO-Sim` on Hackage.\\nA single [PR](https://github.com/input-output-hk/io-sim/pull/32) which added\\na few missing instances of the `STM` monad.\\n\\n### Open Source\\n\\nWe made sure the CI runs for PRs which comes from forks (which is important to\\naccept contributions from 3rd parties).\\n\\n### Mithril Cardano Integration\\n\\nWe held initial discussions with Arnaud Bailly about possible path to integrate\\nmithril to `cardano-node` and take advantage of the `ouroboros-network`\\ndiffusion layer."},{"id":"2022-10-28-performance-and-tracing","metadata":{"permalink":"/cardano-updates/2022-10-28-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-performance-and-tracing.md","source":"@site/blog/2022-10-28-performance-and-tracing.md","title":"Performance & Tracing Team Update","description":"High level summary","date":"2022-10-28T00:00:00.000Z","formattedDate":"October 28, 2022","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing"}],"readingTime":1.155,"hasTruncateMarker":false,"authors":[{"name":"Serge Kosyrev","title":"Performance and Tracing Team Lead","url":"https://github.com/deepfire","imageURL":"https://github.com/deepfire.png","key":"deepfire"}],"frontMatter":{"title":"Performance & Tracing Team Update","slug":"2022-10-28-performance-and-tracing","authors":"deepfire","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-10-28-network"},"nextItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2022-08-12-sre"}},"content":"## High level summary\\n\\nOn the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline.\\n\\nOn the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario.\\n\\n## Executive summary\\n\\n- The new tracing system public release is getting closer, as we\'re resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale.\\n- The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment.\\n- The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE."},{"id":"2022-08-12-sre","metadata":{"permalink":"/cardano-updates/2022-08-12-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-sre.md","source":"@site/blog/2022-10-28-sre.md","title":"SRE Team Update","description":"High level summary","date":"2022-10-28T00:00:00.000Z","formattedDate":"October 28, 2022","tags":[{"label":"sre","permalink":"/cardano-updates/tags/sre"}],"readingTime":3.04,"hasTruncateMarker":false,"authors":[{"name":"Michael Fellinger","title":"SRE Team Lead","url":"https://github.com/manveru","imageURL":"https://github.com/manveru.png","key":"manveru"}],"frontMatter":{"title":"SRE Team Update","slug":"2022-08-12-sre","authors":"manveru","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & Tracing Team Update","permalink":"/cardano-updates/2022-10-28-performance-and-tracing"},"nextItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-10-27-crypto"}},"content":"## High level summary\\n\\nThe SRE team is heavily working on the Equinix Metal migration, replacing Hydra\\nwith Cicero, and a new version of Spongix.\\n\\n## Lower level summary\\n\\n### OpenZiti\\n\\n- Work is ongoing on our OpenZiti integration into Bitte in [[bitte-zt]].\\n- CI-World deployment of Darwin CI Ziti service in [[ci-world-commit-d40f4d]].\\n- Multiple issues filed, and a lot of discussion with the OpenZiti developers,\\n we\'re making pretty rapid progress thanks to them.\\n- Work on getting Equinix baremetal machines integrated into AWS World Bitte\\n clusters utilizing a Ziti ZTNA network overlay to bridge the networking of\\n the two environments and get IAM extension to Equinix machine for Nomad\\n client onboarding.\\n- A Nix Flake for most of our OpenZiti dependencies including the Console,\\n Controller, Edge Tunnel, and Router is now at [[openziti-bins]].\\n- The Flake also includes a WiP NixOS modules for these components.\\n- Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with\\n no issues seen so far\\n- Moved the console to traefik routing service (`zac.$DOMAIN`) and\\n controller/edge router stay at `zt.$DOMAIN`, but have registered consul\\n services\\n\\n### Cicero & Tullia Integrations\\n\\n- Added webhook for [[haskell.nix]].\\n- Finished Cicero CI action for [[cardano-addresses-pull-205]].\\n- Fixed cardano-prelude cicero action in [[cardano-prelude-pull-176]].\\n- Fixed the `abcird-stdlib/publish` action [[abcirdc-pull-104]]\\n- fix error on vm-bigdisk flake configs [[cicero-pull-66]].\\n- Helped with Cicero actions and answered questions for [[plutus]]\\n [[cardano-prelude]], and [[abcirdc]].\\n- Merged [[cardano-base-pull-323]] for Tullia on cardano-base.\\n- Merged Cicero action in [[cardano-ogmios-pull-5]].\\n- Opened [[cardano-explorer-app-pull-427]] to add Tullia and Cicero.\\n- Opened [[cardano-ledger-pull-3097]] to add Cicero CI action.\\n- Opened [[cardano-node-pull-4489]] to add Tullia and Cicero, including\\n OS-agnostic jobs.\\n- Opened [[ouroboros-network-pull-4108]] to add Cicero action.\\n- Reviewed [[plutus-pull-4918]] and helped test it.\\n- Update Tullia in [[abcirdc-pull-97]] to build if a tag is given.\\n\\n### Cicero & Tullia Features\\n\\n- Improvements to Tullia task aggregation to make [[cardano-addresses]] build\\n correctly.\\n- Better tullia CUE lib default for tags [[tullia-commit-4df3c5d]].\\n- Put `cache.nixos.org` back in `cache.iog.io`\'s upstreams. This is now\\n considered a public cache again, and without it some Cicero evaluations had\\n to build huge packages.\\n- Started working on a flake-parts module for Tullia.\\n- Started working on cutting down Tullia task build time by putting facts in\\n JSON files.\\n- Fixed running into kernel arg limit by reading tullia\'s DAG from a file\\n- Merged [[tullia-pull-9]] that fixes several issues related to error reporting.\\n and escaping.\\n- Added Mac builders in Cicero on CI-World.\\n- Started work on Tullia invocation caching.\\n\\n### Spongix\\n\\n- A lot of progress on an SQlite backed version of Spongix, it already supports\\n the full HTTP binary cache protocol but still lacks comprehensive testing and\\n some tuning, as well as recursive lookups.\\n- First steps in the implementation of the `nix-daemon` `ssh-ng` protocol so\\n Spongix can be used via SSH and we can get rid of basic auth.\\n\\n### Bugs\\n\\n- Discovered Cicero bug where Nomad reschedules cause the Github commit status\\n to get stuck in `pending`\\n- Discovered Cicero race condition bug around concurrent transactions for\\n codependent actions.\\n- Fixed tullia task order bug in [[cardano-addresses]]\\n- Diagnose Cicero action not triggered in [[abcirdc]]\\n- Fixed meta/description of the Tullia package in [[tullia-pull-7]]\\n- Add Vault token loop alerts in [[bitte-cells-pull-40]]\\n- Ongoing investigation on recurring Patroni and nomad-follower issues related\\n to token rotation.\\n\\n[abcirdc]: https://github.com/input-output-hk/abcirdc\\n[abcirdc-pull-104]: https://github.com/input-output-hk/abcirdc/pull/104\\n[abcirdc-pull-97]: https://github.com/input-output-hk/abcirdc/pull/97\\n[bitte-cells-pull-40]: https://github.com/input-output-hk/bitte-cells/pull/40\\n[bitte-zt]: https://github.com/input-output-hk/bitte/compare/zt\\n[cardano-addresses]: https://github.com/input-output-hk/cardano-addresses\\n[cardano-addresses-pull-205]: https://github.com/input-output-hk/cardano-addresses/pull/205\\n[cardano-base-pull-323]: https://github.com/input-output-hk/cardano-base/pull/323\\n[cardano-explorer-app-pull-427]: https://github.com/input-output-hk/cardano-explorer-app/pull/427\\n[cardano-ledger-pull-3097]: https://github.com/input-output-hk/cardano-ledger/pull/3097\\n[cardano-node-pull-4489]: https://github.com/input-output-hk/cardano-node/pull/4489\\n[cardano-ogmios-pull-5]: https://github.com/input-output-hk/cardano-ogmios/pull/5\\n[cardano-prelude]: https://github.com/input-output-hk/cardano-prelude\\n[cardano-prelude-pull-176]: https://github.com/input-output-hk/cardano-prelude/pull/176#issuecomment-1280947946\\n[cicero-pull-66]: https://github.com/input-output-hk/cicero/pull/66\\n[ci-world-commit-d40f4d]: https://github.com/input-output-hk/ci-world/commit/d40f4d19187a2128b6f0d63bde7e3f9a33071994\\n[haskell.nix]: https://github.com/input-output-hk/haskell.nix\\n[openziti-bins]: https://github.com/johnalotoski/openziti-bins\\n[ouroboros-network-pull-4108]: https://github.com/input-output-hk/ouroboros-network/pull/4108\\n[plutus]: https://github.com/input-output-hk/plutus\\n[plutus-pull-4918]: https://github.com/input-output-hk/plutus/pull/4918\\n[tullia-commit-4df3c5d]: https://github.com/input-output-hk/tullia/commit/4df3c5d956f1b062b950643da12768ae71acf245\\n[tullia-pull-7]: https://github.com/input-output-hk/tullia/pull/7\\n[tullia-pull-9]: https://github.com/input-output-hk/tullia/pull/9"},{"id":"2022-10-27-crypto","metadata":{"permalink":"/cardano-updates/2022-10-27-crypto","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-27-crypto.md","source":"@site/blog/2022-10-27-crypto.md","title":"Crypto Team Update","description":"High level overview","date":"2022-10-27T00:00:00.000Z","formattedDate":"October 27, 2022","tags":[{"label":"crypto","permalink":"/cardano-updates/tags/crypto"}],"readingTime":1.095,"hasTruncateMarker":false,"authors":[{"name":"I\xf1igo Querejeta Azurmendi","title":"Cardano Lead Cryptography Engineer","url":"https://github.com/iquerejeta","imageURL":"https://github.com/iquerejeta.png","key":"iquerejeta"}],"frontMatter":{"title":"Crypto Team Update","slug":"2022-10-27-crypto","authors":"iquerejeta","tags":["crypto"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Team Update","permalink":"/cardano-updates/2022-08-12-sre"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-10-21-hydra"}},"content":"## High level overview\\n\\nThe crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to\\nmeeting the [acceptance criteria](https://github.com/input-output-hk/cardano-base/issues/315) in cardano-base,\\nwhich lacks some editorial comments on the style of dQuandrant\'s PR, the inclusion of one additional test, and\\nwe are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution,\\nbut also progressing on the implementation.\\n\\n## Low level overview\\n### SECP built-ins\\n* (missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in [PR 313](https://github.com/input-output-hk/cardano-base/pull/313)\\n* CIP-0049 was addressed in the editors meeting, and [PR 250](https://github.com/cardano-foundation/CIPs/pull/250) was merged\\n* The unit-tests [PR 320](https://github.com/input-output-hk/cardano-base/pull/320) is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.\\n\\n### KES agent\\n* We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them.\\n* We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s)."},{"id":"2022-10-21-hydra","metadata":{"permalink":"/cardano-updates/2022-10-21-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-21-hydra.md","source":"@site/blog/2022-10-21-hydra.md","title":"Hydra Team Update","description":"High level summary","date":"2022-10-21T00:00:00.000Z","formattedDate":"October 21, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":0.97,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-10-21-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Crypto Team Update","permalink":"/cardano-updates/2022-10-27-crypto"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-10-19-node-cli-api"}},"content":"## High level summary\\n\\nThis week, the hydra team reviewed and addressed several open comments on the\\nnew HeadV1 specification, completing a list the of identified gaps between\\nspecification and implementation while doing so. In the wake of the recent\\ndemonstration of SundaeSwap running their DEX in a Hydra Head, they met with\\nthem to capture feature ideas & incorporate their feedback on the roadmap, as\\nwell as potential research avenues.\\n\\n### What did the team achieve this week\\n\\n- Had the monthly review meeting, a bit earlier than expected: \\n- Reviewed and addressed several open comments on HeadV1 specification.\\n- Completed the list of identified gaps between specification and implementation [#452](https://github.com/input-output-hk/hydra-poc/issues/452)\\n- Had two meetings with SundaeSwap to incorporate their feedback (on research and on the roadmap).\\n- Some small fixes on TUI and our docker images. [#538](https://github.com/input-output-hk/hydra-poc/issues/538) [#562](https://github.com/input-output-hk/hydra-poc/pull/562)\\n- Met with the internal audit team and clarified scope.\\n\\n### What are the goals of next week\\n\\n- Complete the last two items required for a version `0.8.0`.\\n- Cut the next release, version `0.8.0`\\n- Get backup/recovery [#187](https://github.com/input-output-hk/hydra-poc/issues/187) done with proper event sourcing (ADR18)\\n- Have the CI build macos artifacts"},{"id":"2022-10-19-node-cli-api","metadata":{"permalink":"/cardano-updates/2022-10-19-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-19-node-cli-api.md","source":"@site/blog/2022-10-19-node-cli-api.md","title":"Node API & CLI Team Update","description":"High level summary","date":"2022-10-19T00:00:00.000Z","formattedDate":"October 19, 2022","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":1.57,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-10-19-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-10-21-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-10-18-consensus"}},"content":"# 2022-10-19 - 2022-11-01\\n\\n## High level summary\\n\\nThis sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node\'s mempool for the following information:\\n- Ask the node about the current mempool\'s capacity and sizes\\n- Request the next transaction from the mempool\'s current list\\n- Query if a particular transaction exists in the mempool\\n\\nOutside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric `tx_submit_fail_count` has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:\\n- Documentation improvments\\n- Release 1.35.4 was merged & released\\n- Exported various types from cardano-api that were requested by community members\\n\\n## Completed\\n\\n- [Release 1.35.4](https://github.com/input-output-hk/cardano-node/pull/4508)\\n\\n### cardano-cli\\n- [Add tx-mempool command to CLI](https://github.com/input-output-hk/cardano-node/pull/4276)\\n- [BUGFIX] - [Fix query era mismatch bug in transaction build command](https://github.com/input-output-hk/cardano-node/pull/4538)\\n- [Serenity] - [Condense Read and Validation modules in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4516)\\n\\n### cardano-api\\n- [Return Lovelace for calculateMinimumUTxO](https://github.com/input-output-hk/cardano-node/pull/4482)\\n- [Export IsPlutusScriptLanguage from cardano-api](https://github.com/input-output-hk/cardano-node/pull/4554)\\n- [Reduce exposed modules in cardano-api](https://github.com/input-output-hk/cardano-node/pull/4546)\\n- [Add ToJSON and FromJSON instances for Address](https://github.com/input-output-hk/cardano-node/pull/4568)\\n- [Export TxIns type alias from Cardano.Api](https://github.com/input-output-hk/cardano-node/pull/4565)\\n- [Export more generators from cardano-api](https://github.com/input-output-hk/cardano-node/pull/4534)\\n\\n### cardano-submit-api\\n- [Add tx_submit_fail_count metric](https://github.com/input-output-hk/cardano-node/pull/4566)\\n\\n### cardano-node\\n- [Upgrade to cabal-3.8.1.0](https://github.com/input-output-hk/cardano-node/pull/4549)\\n- [Update building-the-node-using-nix.md](https://github.com/input-output-hk/cardano-node/pull/4613)\\n\\n### cardano-testnet\\n- None\\n\\n## In Progress\\n\\n### cardano-cli\\n- [BUGFIX]- [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Infer protocol params in transaction build](https://github.com/input-output-hk/cardano-node/pull/4431)\\n- [Allow assembling transactions with no witnesses](https://github.com/input-output-hk/cardano-node/pull/4408)\\n- [Multiple pools support in query stake snapshot](https://github.com/input-output-hk/cardano-node/pull/4279)\\n- [Optimise query leadership schedule command](https://github.com/input-output-hk/cardano-node/pull/4250)\\n- [Optimise query stake snapshot command](https://github.com/input-output-hk/cardano-node/pull/4179)\\n- [Debug output for transaction submit](https://github.com/input-output-hk/cardano-node/pull/3819)\\n\\n### cardano-api\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n\\n### cardano-node\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)"},{"id":"2022-10-18-consensus","metadata":{"permalink":"/cardano-updates/2022-10-18-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-18-consensus.md","source":"@site/blog/2022-10-18-consensus.md","title":"Consensus Team Update","description":"High-level summary","date":"2022-10-18T00:00:00.000Z","formattedDate":"October 18, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":3.225,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-10-18-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-10-19-node-cli-api"},"nextItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-10-14-hydra"}},"content":"## High-level summary\\n\\nDuring the past two weeks, the consensus team worked on adding property test for\\ndifferent aspects of the UTxO HD prototype: era transitions, mempool, and\\nbacking store. Thanks to these tests we were able to uncover a bug in the\\nprototype. On the Genesis front, we benchmarked a different version of the\\nChainSync jumping prototype to try to improve its performance, but this did not\\nresult in any noticeable speedup.\\n\\n## High-level status report\\n\\n- Finish the UTxO HD prototype: on track.\\n - We focused on increasing test coverage for the UTxO-HD prototype:\\n - We started implementing Cadano-eras transition property-tests.\\n - We started implementing state-machine property-tests for the mempool.\\n - We merged the mempool rewrite.\\n - We started working on state-machine tests for the backing store. This\\n uncovered a bug in the range-read implementation of the LMDB backing\\n store.\\n- Genesis: on track.\\n - We benchmarked a version of the Genesis ChainSync Jumping prototype that\\n spreads out the ChainSync updates over a longer period of time. This did not\\n result in any noticeable speedup.\\n - We investigated the overhead introduced by non-ChainSync components, but no\\n conclusions could be drawn from the benchmarks we ran.\\n\\n## Workstreams\\n\\n### Finish the UTxO HD prototype\\n\\nWe focused on increasing test coverage for the UTxO HD prototype. We also merged\\nthe [mempool\\nrewrite](https://github.com/input-output-hk/ouroboros-network/pull/4049).\\n\\n#### Era transition property tests\\n\\nWe started implementing [Cardano era transition property\\ntests](https://github.com/input-output-hk/ouroboros-network/issues/4043),\\nwhich are needed for making sure that the ledger tables get updated in the\\nright way when we move from one era to the next. There are at the moment two\\nimportant transitions.\\n- Byron to Shelley: where all the UTxO is transferred from in-memory Byron\\n state (which has no tables) to the ledger tables of the Shelley state.\\n- Shelley to Allegra: where the AVVM addresses must be deleted.\\n\\nWe have tests for the Byron to Shelley transitions. We are working on adding\\nthe remaining ones.\\n\\n#### Mempool state-machine tests\\n\\nWe started implementing [state-machine property tests for the\\nmempool](https://github.com/input-output-hk/ouroboros-network/issues/4044).\\nThe mempool is currently tested via pure property tests, and use a ledger\\nstate without tables. With the introduction of UTxO HD, testing the concurrent\\nbehavior of the mempool became of crucial importance (eg now we have to\\nacquire locks to flush the backing store). In addition, we need to test a\\nledger state with tables. These needs led to the creation of a new set of\\nproperty tests. In particular we aim to run parallel state-machine tests that\\nexercise the mempool in a way similar to how the node would make use of it.\\n\\n#### Backing store property tests\\n\\nWe started working on [state-machine tests for the backing\\nstore](https://github.com/input-output-hk/ouroboros-network/pull/4081) that UTxO\\nHD uses. The property tests uncovered errors in the range-reads implementation\\nof the LMDB backing store. To facilitate fixing this bug, we made\\n[changes](https://github.com/input-output-hk/lmdb-simple/pull/1) to the Haskell\\nLMDB bindings.\\n\\n### Benchmarking the CSJ prototype\\n\\nPrompted by previous benchmarks showing significant improvements in sync time by\\nusing more capabilities, we implemented a way to spread out the ChainSync\\nupdates over a larger period instead of firing them all at the same time. This\\ndidn\'t result in a noticeable speedup.\\n\\nWe also benchmarked the prototype with CSJ disabled (such that just the dynamo\\npeer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule\\nout/confirm overhead by non-ChainSync (mainly BlockFetch) related components.\\nThis results in era-specific behavior (speed is like the prototype in Byron, but\\nlike the baseline in Shelley). This deserves a closer look in the future.\\n\\nThis diagram shows the respective syncing progress, starting at Genesis and\\ncontinuing a good part into Shelley (with the dashed line indicating the\\nByron-to-Shelley transition).\\n\\n - Red: baseline\\n - Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps.\\n - Blue: like Green, jumps are spread out.\\n - Orange: variant with no jumping, to measure unrelated overhead.\\n\\n![](/images/happy-path-csj-prototype-bench-2.svg)"},{"id":"2022-10-14-hydra","metadata":{"permalink":"/cardano-updates/2022-10-14-hydra","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-14-hydra.md","source":"@site/blog/2022-10-14-hydra.md","title":"Hydra Team Update","description":"High level summary","date":"2022-10-14T00:00:00.000Z","formattedDate":"October 14, 2022","tags":[{"label":"hydra","permalink":"/cardano-updates/tags/hydra"}],"readingTime":1.26,"hasTruncateMarker":false,"authors":[{"name":"Sebastian Nagel","title":"Hydra Team Lead","url":"https://github.com/ch1bo","imageURL":"https://github.com/ch1bo.png","key":"ch1bo"}],"frontMatter":{"title":"Hydra Team Update","slug":"2022-10-14-hydra","authors":"ch1bo","tags":["hydra"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-10-18-consensus"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-10-14-ledger"}},"content":"## High level summary\\n\\nThis week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the `hydra-node` over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks \\"past the opening of a Head\\". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.\\n\\n## What did the team achieve this week\\n\\n- Last week we thought we were done with [ADR18](https://hydra.family/head-protocol/adr/18/), but were not ...\\n- ... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence.\\n- Implemented a first version for persistence [#187](https://github.com/input-output-hk/hydra-poc/issues/187) in response.\\n- Enhanced CI to publish test results [on our website](https://hydra.family/head-protocol/benchmarks/tests/hydra-node/hspec-results)\\n- Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!\\n- Pulled static executable feature [#200](https://github.com/input-output-hk/hydra-poc/issues/200) into scope, implemented it and merged it!\\n- Received and read through a project proposal by a vendor (building a Hydra platform).\\n\\n## What are the goals of next week\\n\\n- Get backup/recovery [#187](https://github.com/input-output-hk/hydra-poc/issues/187) done with proper event sourcing (ADR18)\\n- Cut the next release, version `0.8.0`\\n- Address open comments on specification document & complete the list of identified gaps between specification and implementation [#452](https://github.com/input-output-hk/hydra-poc/issues/452)\\n- Have the CI build macos artifacts"},{"id":"2022-10-14-ledger","metadata":{"permalink":"/cardano-updates/2022-10-14-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-14-ledger.md","source":"@site/blog/2022-10-14-ledger.md","title":"Ledger Team Update","description":"High level summary","date":"2022-10-14T00:00:00.000Z","formattedDate":"October 14, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.03,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-10-14-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Hydra Team Update","permalink":"/cardano-updates/2022-10-14-hydra"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-10-05-consensus"}},"content":"## High level summary\\n\\nThe ledger team is still primarily focused on addressing\\n[technical](https://github.com/input-output-hk/cardano-ledger/issues?q=is%3Aissue+is%3Aopen+label%3A%22%3Acredit_card%3A+technical-debt%22)\\n[debt](https://github.com/input-output-hk/cardano-ledger/projects/3).\\nWe now have the infrastructure for versioning our serialization schemes,\\nwhich we continue to put into action.\\nWe have made first steps towards getting proper support for the\\n[formal ledger repository](https://github.com/input-output-hk/formal-ledger-specifications)\\n(in particular, we\'ve added nix builds and\\ncontinuous integration support).\\nWe are wrapping up an investigation of the performance of a critical\\nfunction used by the consensus layer for leader checks.\\nFinally, we are improving the packaging and versioning of our code.\\n\\n## Lower level summary\\n\\n### Completed Technical Debt\\n\\n- Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of\\n our code lives in the `cardano-ledger-shelley` package, though with hindsight we can say that\\n much of it should live in `cardano-ledger-core`.\\n We continue to move things to `cardano-ledger-core`, and have much more to come. [[pull-3059]]\\n- We now have the infrastructure to support **versioned** serialization schemes.\\n The inability to do this has caused us a lot difficulties,\\n such as [[issue-3003]], [[issue-2965]] and [[issue-2444]].\\n We are still in the process of switching to the versioned serialization scheme\\n (such as [[pull-3078]]),\\n but the infrastructure was completed in [[pull-3063]].\\n- We now have proper nix and CI support for the formal ledger project. [[pull-19]]\\n- A separate team is helping bring support for\\n [CHaP](https://github.com/input-output-hk/cardano-haskell-packages)\\n to all the cardano-node repositories.\\n We have been helping out with this effort.\\n* A separate team continues working on upgrading all the\\n cardano-node repositories to work with ghc 9.2.4.\\n We have been helping out with this effort.\\n\\n### In-progress Technical Debt\\n\\nWe also have several fairly large pull-requests in review\\nthat we are working on.\\n\\n- In an on-going attempt to build out a more user-friendly API,\\n we continue to remove `HasField` instances in place of using micro-lenses.\\n The protocol parameters, in particular, are being worked on. [[pull-3045]]\\n- We are also renaming record fields to be consistent across the repository. [[pull-3062]]\\n- We are now cleaning up all the work we did to understand the performance\\n of the TICKF transition. We have some improvements to the computatation\\n as well. [[pull-3068]]\\n- We are adding more documentation, in particular to our `Twiddler` functionality. [[pull-3073]]\\n- The formal ledger is adding support for finite set theory. [[pull-20]]\\n\\n[issue-2444]: https://github.com/input-output-hk/cardano-ledger/issues/2444\\n[issue-2965]: https://github.com/input-output-hk/cardano-ledger/issues/2965\\n[issue-3003]: https://github.com/input-output-hk/cardano-ledger/issues/3003\\n\\n[pull-3059]: https://github.com/input-output-hk/cardano-ledger/pull/3059\\n[pull-3045]: https://github.com/input-output-hk/cardano-ledger/pull/3045\\n[pull-3062]: https://github.com/input-output-hk/cardano-ledger/pull/3062\\n[pull-3063]: https://github.com/input-output-hk/cardano-ledger/pull/3063\\n[pull-3068]: https://github.com/input-output-hk/cardano-ledger/pull/3068\\n[pull-3073]: https://github.com/input-output-hk/cardano-ledger/pull/3073\\n[pull-3078]: https://github.com/input-output-hk/cardano-ledger/pull/3078\\n[pull-19]: https://github.com/input-output-hk/formal-ledger-specifications/pull/19\\n[pull-20]: https://github.com/input-output-hk/formal-ledger-specifications/pull/20"},{"id":"2022-10-05-consensus","metadata":{"permalink":"/cardano-updates/2022-10-05-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-05-consensus.md","source":"@site/blog/2022-10-05-consensus.md","title":"Consensus Team Update","description":"High level summary","date":"2022-10-05T00:00:00.000Z","formattedDate":"October 5, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":1.825,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-10-05-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-10-14-ledger"},"nextItem":{"title":"DB Sync Team Update","permalink":"/cardano-updates/2022-10-04-db-sync"}},"content":"## High level summary\\n\\nDuring the past two weeks, the consensus team worked on improving the\\nperformance of the ChainSync jumping logic, which is needed for Genesis. We also\\nrewrote the implementation of the mempool in the UTxO HD prototype which solved\\nthe issues that prevented us from running system level benchmarks. Also on the\\nUTxO HD front, we have an improved implementation of the sequence-of-differences\\n(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for\\nthe UTxO HD feature.\\n\\n## Executive summary\\n\\n- With the latest implementation of ChainSync jumping we are closer to the\\n baseline performance. In particular, the prototype seems to benefit from the\\n extra concurrency provided by additional capabilities.\\n- We rewrote the implementation of the mempool in the UTxO HD prototype. This\\n rewrite was required due to performance problems we observed when running the\\n [workbench](https://github.com/input-output-hk/cardano-node/blob/master/Makefile#L51).\\n These performance problems prevented us from running system level benchmarks.\\n The rewrite solved these issues. After the [UTxO-HD: mempool\\n rewrite](https://github.com/input-output-hk/ouroboros-network/pull/4049) PR is\\n merged, we will contact the Benchmarking team so that they run the system\\n level benchmarks.\\n- The implementation of sequences of differences based on anti-diffs was\\n integrated into the UTxO HD prototype. It is pending\\n [review](https://github.com/input-output-hk/ouroboros-network/pull/4036) and\\n we also need to run replay and syncing benchmarks to confirm that this will\\n deliver a performance improvement, as observed in our micro-benchmarks.\\n- [The UTxO HD prototype\\n inspection](https://github.com/input-output-hk/ouroboros-network/issues/3944)\\n resulted in a [list of\\n tests](https://github.com/input-output-hk/ouroboros-network/issues/4045)\\n needed for consensus to consider the UTxO HD prototype as fully tested.\\n\\n## Additional information\\n\\n### Genesis\\n\\nBenchmarking setup: 50MBit/s, 50ms latency\\n\\n - Red: baseline\\n - Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.\\n\\nAs ChainSync Jumping involves many concurrent network operations at every jump,\\nwe tried to run the node with 6 instead of the default 2 capabilties.\\n\\n - Orange: baseline with 6 capabilities\\n - Blue: CSJ prototype with 6 capabilities\\n\\nThis diagram shows the respective syncing progress, starting at Genesis and\\ncontinuing a good part into Shelley (with the dashed line indicating the\\nByron-to-Shelley transition).\\n\\n![](/images/happy-path-csj-prototype-bench-1.svg)\\n\\nFurther work includes whether we can tune the prototype to better handle few\\ncapabilities, or to adapt the default number of capabilities (potentially just\\nwhile syncing)."},{"id":"2022-10-04-db-sync","metadata":{"permalink":"/cardano-updates/2022-10-04-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-04-db-sync.md","source":"@site/blog/2022-10-04-db-sync.md","title":"DB Sync Team Update","description":"DBSync Update","date":"2022-10-04T00:00:00.000Z","formattedDate":"October 4, 2022","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":1.65,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB Sync Team Update","slug":"2022-10-04-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-10-05-consensus"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-10-04-node-cli-api"}},"content":"## DBSync Update\\n\\n\\n### Fast restarts\\n We fixed a long overdue issue in db-sync which caused long delays on restarts\\n [1266](https://github.com/input-output-hk/cardano-db-sync/pull/1266). This has been\\n one of db-sync main objectives for this period. Restarts are now very fast,\\n because db-sync deletes almost nothing from the db, it just replays the ledger rules until it\\n reaches the tip of the db. The fix also improves reconnection speed, in cases where the node\\n restarts or the connection is temporarily lost. It also speeds up even more in cases where due to a\\n deployment mess up a very old snapshot or no snapshot at all is used.\\n\\n### Property based testing\\nWe added stateful property based testing, using `quickcheck-state-machine`\\n [1269](https://github.com/input-output-hk/cardano-db-sync/pull/1269). These tests use empty or\\n almost empty blocks to test the new behaviour of restarts and rollbacks.\\n\\n These tests generate arbitrarily a list of symbolic commands from these:\\n\\n```\\nRollForward Int\\nRollBack BlockNo\\nStopDBSync\\nStartDBSync\\nRestartNode\\nAssertBlockNo BlockNo\\n```\\n\\nThe commands are translated into real commands. For example `RollForward Int` will forge a new block\\nthat fits on the current chain. These real commands are executed against db-sync using the mock\\nchain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync\\nwhich looks like this:\\n\\n``` haskell\\n Model\\n { serverTip :: BlockNo\\n , dbSyncTip :: BlockNo\\n , dbSynsIsOn :: Bool\\n , dbSynsHasSynced :: Bool\\n }\\n```\\n\\nFinally a number of postconditions are checked, related to the eventual block number of db-sync.\\n\\n### Tech Debt\\n\\nWe handled a number of tech debt in\\n [1275](https://github.com/input-output-hk/cardano-db-sync/pull/1275)\\n This improves the code format of db-sync, deletes many queries that were never used and groups the\\n others. This tech debt resolution not only improves the experience of working in db-sync, but can\\n facilitate some of our other objectives, as it makes it very explicit which queries are used\\n during syncing and which indexes are necessary.\\n\\n### Smash\\n\\nWe worked on fixing an issue related to fetching pool metadata\\n [1276](https://github.com/input-output-hk/cardano-db-sync/pull/1276).\\n The issue which is described in\\n [1270](https://github.com/input-output-hk/cardano-db-sync/issues/1270)"},{"id":"2022-10-04-node-cli-api","metadata":{"permalink":"/cardano-updates/2022-10-04-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-04-node-cli-api.md","source":"@site/blog/2022-10-04-node-cli-api.md","title":"Node API & CLI Team Update","description":"Node-Api-Cli Update","date":"2022-10-04T00:00:00.000Z","formattedDate":"October 4, 2022","tags":[{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api"}],"readingTime":0.98,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-10-04-node-cli-api","authors":"Jimbo4350","tags":["cli-api"],"hide_table_of_contents":false},"prevItem":{"title":"DB Sync Team Update","permalink":"/cardano-updates/2022-10-04-db-sync"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-09-30-ledger"}},"content":"## Node-Api-Cli Update\\n## 2022-10-04 - 2022-10-18\\n\\n### Executive Summary\\nThe majority of the team\'s time was spent between getting `1.34.4` ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to `cardano-cli`.\\n\\n### Completed\\n\\n- [GHC 9.2.4 preparations](https://github.com/input-output-hk/cardano-node/pull/4504)\\n\\n#### cardano-cli\\n\\n- [Serenity] - [Separate IO from txBuild and txBuildRaw functions](https://github.com/input-output-hk/cardano-node/pull/4491)\\n\\n#### cardano-api\\n\\n- [BUGFIX] - [TxWitness text envelope format does not roundtrip in Shelley era](https://github.com/input-output-hk/cardano-node/pull/4501)\\n\\n#### cardano-node\\n\\n- [Fix MacOS GHA CI](https://github.com/input-output-hk/cardano-node/pull/4526)\\n\\n### In Progress\\n\\n- [Release 1.34.4](https://github.com/input-output-hk/cardano-node/pull/4508)\\n\\n#### cardano-cli\\n\\n- [BUGFIX] - [Fix query era mismatch bug in transaction build command](https://github.com/input-output-hk/cardano-node/pull/4538)\\n- [Serenity] - [Condense Read and Validation modules in cardano-cli](https://github.com/input-output-hk/cardano-node/pull/4516)\\n- [BUGFIX]- [Stop the cli from changing the bytes in user-supplied data](https://github.com/input-output-hk/cardano-node/pull/4537)\\n- [Infer protocol params in transaction build](https://github.com/input-output-hk/cardano-node/pull/4431)\\n- [Allow assembling transactions with no witnesses](https://github.com/input-output-hk/cardano-node/pull/4408)\\n- [Add tx-mempool command to CLI](https://github.com/input-output-hk/cardano-node/pull/4276)\\n\\n### cardano-api\\n\\n- [Return Lovelace for calculateMinimumUTxO](https://github.com/input-output-hk/cardano-node/pull/4482)\\n- [Make TxBodyContent an instance of Monoid](https://github.com/input-output-hk/cardano-node/pull/4458)\\n- [Auto-balance multiasset transactions](https://github.com/input-output-hk/cardano-node/pull/4450)\\n\\n### cardano-node\\n\\n- [Stop running CI when the only changes are to docs](https://github.com/input-output-hk/cardano-node/pull/4263)\\n- [Rename TestEnableDevelopmentHardForkEras](https://github.com/input-output-hk/cardano-node/pull/4341)"},{"id":"2022-09-30-ledger","metadata":{"permalink":"/cardano-updates/2022-09-30-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-30-ledger.md","source":"@site/blog/2022-09-30-ledger.md","title":"Ledger Team Update","description":"Ledger Update","date":"2022-09-30T00:00:00.000Z","formattedDate":"September 30, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":2.285,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-09-30-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/2022-10-04-node-cli-api"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-09-27-network"}},"content":"## Ledger Update\\n\\nWe have continued focusing nearly entirely on addressing technical debt.\\nA lot of design work has begun for the next ledger era,\\nbut we do not yet have anything concrete to share.\\n\\n### Technical debt issues completed\\n\\n* [[issue-1676]][[pull-2992]] We have finally removed the ledger dependency on the\\n `cardano-prelude` package. It was barely used in the ledger repository, and it added a dependency\\n that we did not want to maintain. It was a bit difficult to remove, and we had\\n to coordinate removing it from cardano-base.\\n A lot ended up going into [pull-2992][pull-2992], due to the coordination effort, and we ended\\n up updating Plutus as well.\\n This means that we\'ve now also made a lot of progress on the problematic cost model serialization\\n issues described in [issue-2902].\\n In particular, after we resolve [issue-3014], we will not have to wait an epoch before\\n releasing a cost model for a new version of Plutus, as we had to do for the Vasil HF.\\n* [[issue-3046]][[pull-3055]] We moved a module that is now only used in Byron to a Byron package.\\n* [[issue-3047]][[pull-3054]] We improved the interface to the `Value` (multi-asset) type.\\n* [[pull-3044]] We debugged and fixed a tricky compilation issue. Certain kinds of field updates\\n were adding approximately 20 minutes to our compile time!\\n* [[issue-2932]][[pull-3036]] As a part of our ongoing re-organization of the codebase, we\\n have added a `Cardano.Ledger.[Era].Core` module to each ledger era that has a TxBody class.\\n Most classes defined in the era should go in this new module.\\n We also re-export the `Cardno.Ledger.Core` module and the previous `Cardano.Ledger.[Era].Core`\\n modules from each era.\\n\\n### Technical debt in progress\\n\\n* [[issue-3034]][[issue-3035]][[node-issue-4421]] We are continuing to write benchmarks to understand exactly where\\n all the time is being spent on executing the `TICKF` transition.\\n The consolidation of the per-stake-credential stake distribution to the per-stake-pool\\n distribution does seem to account for a large amount of time (near a second as written, which we\\n have down to about half a second with some optimizations),\\n but this does not account for everything.\\n Applying the reward update may also be a big contributing factor.\\n* [[pull-3033]][[pull-3038]][[pull-3041]] A separate team is working on upgrading all the\\n cardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort.\\n* The nix scripts used to build our new\\n [formal ledger model](https://github.com/input-output-hk/formal-ledger-specifications)\\n do not work consistently for everyone, and we have been working on fixing these issues.\\n* [[issue-3014]] We are still working on adding a versioning scheme to all of the ledger\\n serializers.\\n\\n[issue-1676]: https://github.com/input-output-hk/cardano-ledger/issues/1676\\n[issue-2902]: https://github.com/input-output-hk/cardano-ledger/issues/2902\\n[issue-2932]: https://github.com/input-output-hk/cardano-ledger/issues/2932\\n[issue-3014]: https://github.com/input-output-hk/cardano-ledger/issues/3014\\n[issue-3034]: https://github.com/input-output-hk/cardano-ledger/issues/3034\\n[issue-3035]: https://github.com/input-output-hk/cardano-ledger/issues/3035\\n[issue-3046]: https://github.com/input-output-hk/cardano-ledger/issues/3046\\n[issue-3047]: https://github.com/input-output-hk/cardano-ledger/issues/3047\\n\\n[node-issue-4421]: https://github.com/input-output-hk/cardano-node/issues/4421\\n\\n[pull-2992]: https://github.com/input-output-hk/cardano-ledger/pull/2992\\n[pull-3033]: https://github.com/input-output-hk/cardano-ledger/pull/3033\\n[pull-3038]: https://github.com/input-output-hk/cardano-ledger/pull/3038\\n[pull-3036]: https://github.com/input-output-hk/cardano-ledger/pull/3036\\n[pull-3041]: https://github.com/input-output-hk/cardano-ledger/pull/3041\\n[pull-3044]: https://github.com/input-output-hk/cardano-ledger/pull/3044\\n[pull-3054]: https://github.com/input-output-hk/cardano-ledger/pull/3054\\n[pull-3055]: https://github.com/input-output-hk/cardano-ledger/pull/3055"},{"id":"2022-09-27-network","metadata":{"permalink":"/cardano-updates/2022-09-27-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-27-network.md","source":"@site/blog/2022-09-27-network.md","title":"Network Team Update","description":"Network Update","date":"2022-09-27T00:00:00.000Z","formattedDate":"September 27, 2022","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":2.24,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2022-09-27-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-09-30-ledger"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-09-20-consensus"}},"content":"```mdx-code-block\\nimport ReactPlayer from \'react-player\'\\n```\\n\\n## Network Update\\n\\n### Ouroboros Network\\n\\n* We finished high and low level _peer sharing_ design. See\\n [Peer Sharing Implementation Plan](https://github.com/input-output-hk/ouroboros-network/wiki/Peer-Sharing-Implementation-Plan)\\n* We started working on low-level design of _eclipse evasion_ (work in\\n progress).\\n* We decided to use **peer sharing** instead of overloaded and ambiguous _gossip_ term.\\n [PR input-output-hk/ouroboros-network#3980](https://github.com/input-output-hk/ouroboros-network/pull/3980)\\n* We fixed technical dept\\n [issue input-output-hk/cardano-node#3905](https://github.com/input-output-hk/ouroboros-network/issues/3905) in\\n the simulation testing of diffusion\\n [PR input-output-hk/cardano-node#4004](https://github.com/input-output-hk/ouroboros-network/pull/4004)\\n* We deployed all our nodes using our new nix based deployment architecture.\\n When deploying we found an issue in the\\n [`RTView`](https://github.com/input-output-hk/cardano-node/issues/3752).\\n\\n### Ouroboros Consensus\\n\\n* Recently we found out that the consensus does not log exceptions thrown during\\n intiialisation. This was fixed in\\n [PR input-output-hk/ouroboros-network#4015](https://github.com/input-output-hk/ouroboros-network/pull/4015)\\n As part of this pull request we also changed that all exceptions rethrown by\\n the connection handler thread are wrapped in `ExceptionInHandler`.\\n\\n#### Some older items, which were not announced\\n\\n* We identified and fixed an issue related to socket activation (socket options\\n where not set for sockets passed through socket activation).\\n [PR input-output-hk/cardano-node#3979](https://github.com/input-output-hk/ouroboros-network/pull/3979)\\n This fix will be released in the next `cardano-node` release.\\n\\n### Cardano Node\\n\\n* We extended the NixOs service module so that one can modify `socketPath`,\\n `runtimeDir`, `databasePath`, `traceSocketPathAccept`,\\n `traceSocketPathConnect` and `stateDir` options.\\n [PR input-output-hk/cardano-node#4196](https://github.com/input-output-hk/cardano-node/pull/4196)\\n\\n### IO-Sim\\n\\nWe resolved a number of issues before release of `io-sim` on hackage:\\n\\n* [issue input-output-hk/ouroboros-network#2797](https://github.com/input-output-hk/ouroboros-network/issues/2797)\\n* [issue input-output-hk/ouroboros-network#2650](https://github.com/input-output-hk/ouroboros-network/issues/2650)\\n* [issue input-output-hk/ouroboros-network#3436](https://github.com/input-output-hk/ouroboros-network/issues/3436)\\n* [issue input-output-hk/ouroboros-network#2588](https://github.com/input-output-hk/ouroboros-network/issues/2588)\\n* [issue input-output-hk/ouroboros-network#2587](https://github.com/input-output-hk/ouroboros-network/issues/2587)\\n* [issue input-output-hk/ouroboros-network#2586](https://github.com/input-output-hk/ouroboros-network/issues/2586)\\n\\nSee [PR #24](https://github.com/input-output-hk/io-sim/pull/24).\\n\\nWe also improved experience for contributors of `io-sim` and `typed-protocols` by adding issue templates:\\n* [PR input-output-hk/io-sim#25](https://github.com/input-output-hk/io-sim/pull/25)\\n\\n### Typed Protocols\\n\\n* We pushed a branch which identifies a GHC quirk:\\n [coot/typed-protocols-rewrite-StateToken-problem](https://github.com/input-output-hk/typed-protocols/tree/coot/typed-protocols-rewrite-StateToken-problem).\\n That\'s too be resolved in order to push forward review of the redesign in\\n [PR input-output-hk/typed-protocols#3](https://github.com/input-output-hk/typed-protocols/pull/3).\\n* As for `io-sim`, we wrote issue templates:\\n [PR input-output-hk/typed-protocols#11](https://github.com/input-output-hk/typed-protocols/pull/11)\\n\\n### Input Endorsers Simulation\\n\\nNew features include:\\n\\n* Histograms of block arrival frequency, for both network (inbound) and CPU\\n (block validation). This is interesting to check that we\'re not overloading\\n the CPU block validation capacity, or network link capacity. Or alternatively\\n to observe the behaviour in an overload situation if we set the block\\n generation rate high enough.\\n\\n* Pie chart of utilisation of TCP links. This shows how small a fraction of\\n links are being used at any one time, and shows that once the system \\"warms\\n up\\" and is operating stably, most block delivery is ballistic.\\n\\n* Showing off the new screen layout combinators, that let us put multiple\\n charts, titles etc on screen at once and scale them to whatever screen or\\n video resolution we like without having to tweak numbers (this example is\\n scaled to fit 1080HD video resolution).\\n\\n\\n```mdx-code-block\\n\\n```"},{"id":"2022-09-20-consensus","metadata":{"permalink":"/cardano-updates/2022-09-20-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-20-consensus.md","source":"@site/blog/2022-09-20-consensus.md","title":"Consensus Team Update","description":"- We proposed a fix for the performance degradation observed when running","date":"2022-09-20T00:00:00.000Z","formattedDate":"September 20, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":3.895,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-09-20-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-09-27-network"},"nextItem":{"title":"DB Sync Team Update","permalink":"/cardano-updates/2022-09-19-db-sync"}},"content":"- We proposed a fix for the performance degradation observed when running\\n distributed multi-node benchmarks in the UTxO HD feature branch. While this\\n fixed the problems observed when running local benchmarks, it broke the\\n `ThreadNet` tests due to concurrency issues. Therefore, we think it is wise to\\n start redesigning the UTxO HD mempool integration.\\n- We did several rounds of code review on the alternative implementation of\\n diff-sequences required by the UTxO HD feature based on the idea of\\n anti-diffs. This alternative implementation is close to being merged, and the\\n next step is to integrate this to the UTxO HD branch, so that we can run\\n ad-hoc replaying and syncing from scratch benchmarks and compare these with\\n the baseline. The micro-benchmarks we elaborated for the alternative\\n implementation show speedups of up to 4x, so we are optimistic about the\\n performance of replaying and syncing from scratch benchmarks, however it is\\n important to notice that *due to the nature of UTxO HD* we will still be\\n slower than the baseline.\\n- The final draft of the Genesis implementation specification is ready for\\n review.\\n- We implemented a prototype for the happy path of Genesis\' ChainSync Jumping\\n (CSJ). The prototype is slower than the baseline, however it is not the latest\\n version of the prototype and the jump interval is very small.\\n- Work on integrating Conway has [stopped][nicks-comment-conway] since\\n priorities have changed.\\n- We started work on benchmarking epoch-boundaries and epoch overhead\\n [pr-4014][pr-4014]. To this end, we made use of a modified version of our\\n `db-analyser` tool. We ran the new benchmarking setup using the Cardano\\n mainnet chain, and we can see that block tick and application take\\n substantially longer at epoch boundaries, although there are a couple of slots\\n during an epoch in which these computations take more than normal. We notified\\n the ledger team about these findings. We will use this modified version of\\n `db-analyser` to investigate the epoch overhead.\\n\\n\\n# Workstreams\\n\\n## UTxO HD\\n\\n - Spent quite some time investigating the root cause of the degradation in\\n performance observed in the benchmarks. We run the `make forge-stress`\\n benchmarks locally in order to debug this behavior.\\n\\n - Transaction batching doesn\'t make a notable difference in the outcome\\n (considering we are using the in-memory backend).\\n\\n - The mempool batching implementation required asynchronous transaction\\n validation which is a violation of the `LocalTxSubmission` protocol\\n contract and therefore if we continued on that route, the impact would\\n have been quite big.\\n\\n - The STM logic we implemented by using a `TMVar` for the mempool internal\\n state was buggy and under certain circumstances it seemed to lock.\\n Reverting the mempool internal state to be stored in a `TVar` seems to\\n solve this problem.\\n\\n - The results we get after this change look almost identical to the ones\\n from the baseline.\\n\\n - [The anti-diff prototype (PR\\n #3997)](https://github.com/input-output-hk/ouroboros-network/pull/3997) has\\n been reviewed and is close to being merged.\\n\\n - A follow-up issue ([issue\\n #4010](https://github.com/input-output-hk/ouroboros-network/issues/4010))\\n to integrate the anti-diff prototype in the various `consensus` packages\\n was created. A first version of the integration exists, and all tests\\n pass. A next step is to get some indication of the \\"real\\" performance gain\\n by profiling `db-analyser` (or `cardano-node`).\\n\\n## Genesis\\n\\n - Final draft of the Genesis implementation specification, now up for review.\\n\\n - Local benchmark setup for parameter tuning via the happy path ChainSync\\n Jumping (CSJ) prototype ([Issue 3987][issue-3987]).\\n\\n - Context: Our Genesis design requires us to check in with a large (~20)\\n number of servers periodically while syncing. These servers are offered\\n jump requests via the ChainSync protocol (hence the name), which they can\\n accept or decline. If a peer declines, the Genesis rule allows us to\\n determine whether a node actually has a better chain.\\n\\n - The \\"happy path\\" is when no peer declines a jump. We want this to have\\n close to no overhead compared to status quo, i.e. syncing without Genesis.\\n\\n - We implemented a prototype for this happy path, and are now starting to\\n test in various configurations (number of peers, latency, bandwidth) to\\n tune the performance of ChainSync jumping, i.e. how complicated our logic\\n of choosing when to jump needs to be.\\n\\n **Example:**\\n\\n - Simulated connection: 50 MBit/s, 50ms latency\\n\\n - Jump interval: 3000 slots (on the low end, could be increased to up to\\n `3k/f`)\\n\\n - Red: baseline (1.35.3), one peer in topology file\\n\\n - Blue: Preliminary version of our prototype, with 10 peers.\\n\\n ![](/images/happy-path-csj-prototype-prelim.svg)\\n\\n It is slower by about ~30%, but it is not the latest version of the\\n prototype, and the jump interval is very small, making CSJ more of a\\n bottleneck.\\n\\n## Technical debt\\n\\n- Fix flakiness in ChainDB QSM tests ([PR 3990](https://github.com/input-output-hk/ouroboros-network/pull/3990)).\\n\\n[issue-3987]: https://github.com/input-output-hk/ouroboros-network/issues/3987\\n[nicks-comment-conway]: https://github.com/input-output-hk/ouroboros-network/pull/3971#issuecomment-1252524031\\n[pr-4014]: https://github.com/input-output-hk/ouroboros-network/pull/4014"},{"id":"2022-09-19-db-sync","metadata":{"permalink":"/cardano-updates/2022-09-19-db-sync","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-19-db-sync.md","source":"@site/blog/2022-09-19-db-sync.md","title":"DB Sync Team Update","description":"DBSync Update","date":"2022-09-19T00:00:00.000Z","formattedDate":"September 19, 2022","tags":[{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync"}],"readingTime":1.525,"hasTruncateMarker":false,"authors":[{"name":"Kostas Dermentzis","title":"Cardano DB-Sync Software Engineer","url":"https://github.com/kderme","imageURL":"https://github.com/kderme.png","key":"kderme"}],"frontMatter":{"title":"DB Sync Team Update","slug":"2022-09-19-db-sync","authors":"kderme","tags":["db-sync"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-09-20-consensus"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-09-16-ledger"}},"content":"## DBSync Update\\n\\n### New Tag\\nWe created a new db-sync tag 13.0.5 which addresses shortcomings of the last\\nrelease 13.0.4. It is currently under testing.\\nThe Changelog is\\n [here](https://github.com/input-output-hk/cardano-db-sync/blob/8ad98d48e0068f3768d48e18fdcbe254037cba3b/cardano-db-sync/CHANGELOG.md#1305) and in more details:\\n\\n* We fixed fees for tx with phase 2 failure that didn\'t include a total collateral field.\\n [1248](https://github.com/input-output-hk/cardano-db-sync/pull/1248)\\n\\n* We fixed an issue that could cause db-sync to crash if a specific rollback occured.\\n [1247](https://github.com/input-output-hk/cardano-db-sync/pull/1247)\\n\\n* DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but\\n could result in the wrong CBOR encoding being inserted.\\n [1217](https://github.com/input-output-hk/cardano-db-sync/pull/1217)\\n\\n* All the fixes above come with unit tests which validates the fix.\\n\\n* Added support for preprod and preview from docker. DBSync no longer needs to include the configs\\n for different networks, these are directly fetched from the cardano world.\\n [1254](https://github.com/input-output-hk/cardano-db-sync/pull/1254)\\n\\n* We added better support from docker for the new disable options and the overall documentation.\\n [1260](https://github.com/input-output-hk/cardano-db-sync/pull/1260)\\n\\nAll the above were also backported to the master branch\\n\\n### Open source\\n\\nWe made the db-sync [board public](https://github.com/orgs/input-output-hk/projects/52/views/1), so\\n everyone can have access on the issues we prioritise.\\n We also added new tasks to the board, some of them could be approachable to newcomers or people who\\n want to contribute.\\n\\n### Progress on tech debt and new features\\n* [1223](https://github.com/input-output-hk/cardano-db-sync/pull/1223) was merged, which removes the\\n foreign keys from the db schema. This opens the road to a number of optimizations.\\n\\n* An additional fix on top of the previous work was added\\n [1250](https://github.com/input-output-hk/cardano-db-sync/pull/1250)\\n\\n* An initial version where DBSync does not rollback on restart is done here\\n [1266](https://github.com/input-output-hk/cardano-db-sync/pull/1266).\\nThis allows db-sync to restart much faster, without the need to delete data and reinsert them. In\\n the future it can also facilitate migrations in cases where the ledger snapshots have a breaking\\n change, without the need to resync everything from genesis."},{"id":"2022-09-16-ledger","metadata":{"permalink":"/cardano-updates/2022-09-16-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-16-ledger.md","source":"@site/blog/2022-09-16-ledger.md","title":"Ledger Team Update","description":"Ledger Update","date":"2022-09-16T00:00:00.000Z","formattedDate":"September 16, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.625,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-09-16-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"DB Sync Team Update","permalink":"/cardano-updates/2022-09-19-db-sync"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-09-01-ledger"}},"content":"## Ledger Update\\n\\nWe have been focused nearly entirely on addressing technical debt.\\n\\n* We introduced more consistent naming across eras, this time for the auxiliary data.\\n See [3032](https://github.com/input-output-hk/cardano-ledger/pull/3032).\\n* We made clear how the `consumed` functions differs between eras (which was a previous source of\\n confusion), and added some related support to the fledgling ledger API.\\n See [3016](https://github.com/input-output-hk/cardano-ledger/pull/3016).\\n* We added clarity and organizational consistency to the main ledger era type synonyms.\\n See [3017](https://github.com/input-output-hk/cardano-ledger/pull/3017).\\n* We removed code duplication related to the input data hashes.\\n See [3018](https://github.com/input-output-hk/cardano-ledger/pull/3018).\\n* We split up a large module into smaller components. The large module was actually causing our\\n CI to time out.\\n See [3020](https://github.com/input-output-hk/cardano-ledger/pull/3020).\\n* We cleaned up stale information in our cabal files, and upgraded cabal 3.8.\\n See [3023](https://github.com/input-output-hk/cardano-ledger/pull/3023),\\n [3031](https://github.com/input-output-hk/cardano-ledger/pull/3031),\\n and [3028](https://github.com/input-output-hk/cardano-ledger/pull/3028).\\n* We made consistent, standalone `TxOut` (transaction output) modules for every era.\\n See [3024](https://github.com/input-output-hk/cardano-ledger/pull/3024).\\n* We brought consistency to a maddening inconsistent use of type variables indicating the specific\\n choice of cryptographic primitives. In particular, all uses of `crypto` have been renamed to `c`.\\n See [3027](https://github.com/input-output-hk/cardano-ledger/pull/3027).\\n* We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric\\n types that will compose better in the future and which simplifies the constraints.\\n See [3029](https://github.com/input-output-hk/cardano-ledger/pull/3029).\\n* We consolidated some existing fragmented logic regarding how we gather the scripts needed for a\\n given transaction. This is a much needed cleanup to prevent future mistakes.\\n See [3019](https://github.com/input-output-hk/cardano-ledger/pull/3019).\\n* We fixed a problem with our generators that was causing a fair number of our property tests to\\n fail in CI.\\n See [3039](https://github.com/input-output-hk/cardano-ledger/pull/3039).\\n* We have started the work to update Plutus. This will bring support for SECP in the next major\\n protocol version, and also address a\\n [problem](https://github.com/input-output-hk/cardano-ledger/issues/2902)\\n that we current have evolving the cost models.\\n See [3030](https://github.com/input-output-hk/cardano-ledger/pull/3030).\\n* We addressed a small issue that came up when integrating the conway era downstream, namely\\n the lack of some serialization instances.\\n See [3022](https://github.com/input-output-hk/cardano-ledger/pull/3022)."},{"id":"2022-09-01-ledger","metadata":{"permalink":"/cardano-updates/2022-09-01-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-01-ledger.md","source":"@site/blog/2022-09-01-ledger.md","title":"Ledger Team Update","description":"Ledger Update","date":"2022-09-01T00:00:00.000Z","formattedDate":"September 1, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/tags/ledger"}],"readingTime":1.94,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-09-01-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-09-16-ledger"},"nextItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-08-31-consensus"}},"content":"## Ledger Update\\n\\nSince finishing up support for the Vasil Hardfork, the ledger team has been\\nfocused on two main things: a new ledger era and technical debt.\\n\\n### New minimal ledger era\\n\\nWe have implemented a new ledger era named `conway` which is nearly identical\\nto the `babbage` era. This has been the first time that we have been able to see\\nwhat a minimal ledger era looks like. We have finished this task, modulo any\\nintegration issues that might come up. The only thing that the `conway` era\\ndoes differently from the `babbage` era is provide support for rotating\\nthe master keys using the hardfork combinator\'s state translation.\\nWe may end up adding features to the `conway` era, but it is a nice exercise\\nseeing what it looks like to get a minimal ledger era supported in all the\\ndownstream components.\\n\\n### Addressing technical debt\\n\\nWe have been addressing technical debt, mostly in an effort to make the\\nrepository a more friendly code base to work in.\\n\\n- We have begun work on a ledger API, called `cardano-ledger-api`.\\n- We have done a big re-design of the major type classes used in the ledger.\\n With hindsight on our side, we now have something much more organized and\\n easier to use.\\n- We have done a lot of re-naming. The names across eras are now much more\\n uniform, avoid certain confusions that plagued us, and are clearer in where\\n they are from.\\n- We have reduced a lot of code duplication that could lead to bugs if you\\n do not have the whole code base in your head.\\n- We have added a handful of performance improvements.\\n- We added type safety in a number of locations. In particular, the type of\\n values that can be minted in a transaction no longer allow for Lovelace\\n in the type, and some functions which used to handle both timelock scripts\\n and plutus script now correctly enoforce at the type level that only one of\\n them can be used.\\n- We made our generators so that they now produce a much richer set of\\n valid serializations. There is room within CBOR to serialize the same\\n data structure in multiple ways, and it is helpful to have the generators\\n use a wide variety.\\n- We have begun re-organizing our test suites."},{"id":"2022-08-31-consensus","metadata":{"permalink":"/cardano-updates/2022-08-31-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-08-31-consensus.md","source":"@site/blog/2022-08-31-consensus.md","title":"Consensus Team Update","description":"Executive summary","date":"2022-08-31T00:00:00.000Z","formattedDate":"August 31, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/tags/consensus"}],"readingTime":8.925,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Team Update","slug":"2022-08-31-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/2022-09-01-ledger"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/2022-08-12-network"}},"content":"## Executive summary\\n\\n- We did most of the heavy lifting required to integrate the Conway era.\\n- We have property tests for the UTxO HD backing store API implementations. A\\n possible bug was identified. Work is ongoing to make sure the property-tests\\n cover all the relevant cases.\\n- We implemented and benchmarked the \\"anti-diff\\" prototype to speed up the UTxO\\n HD functionality. Results show a rough speedup of `4x` to `5.5x` across\\n several scenarios. Note that: [\\"Data reported by `tasty-bench` is only of\\n indicative and comparative significance.\\"](https://hackage.haskell.org/package/tasty-bench-0.3.2/docs/Test-Tasty-Bench.html).\\n We are investigating additional performance improvements. The \\"anti-diff\\"\\n prototype and benchmarks are still pending code review.\\n- We elaborated a draft specification for the Genesis implementation and\\n `ChainSync` jumping optimization.\\n\\n## Workstreams\\n\\n### Conway\\n\\n - Integration PR of the minimal Conway era ([Issue #3963][issue-3962], [PR\\n #3971][pull-3971]).\\n - Discussions with Ledger revealed possible sources of confusion about which\\n data should be changed in the Conway era. As a result, a new technical debt\\n issue was raised, which does not block the integration of the Conway era\\n ([Issue #3976][issue-3976]).\\n\\n### UTxO HD\\n\\n- [Issue #3954][issue-3954], [branch][branch-3954]: The functionality of a\\n backing store, which is the interface to the on-disk part of ledger state in\\n UTxO-HD, is tested at a high level through the `OnDisk` tests. However, some\\n functionalities remain untested, e.g., reads of ranges of keys. As such, we\\n have implemented `quickcheck-state-machine` tests that exercise backing stores\\n directly. The tests are reusable for different backing store implementations\\n because the tests are implementation-agnostic: Any backing store that conforms\\n to the backing store interface can be plugged into the tests. Work is still\\n ongoing to label/monitor the tests, such that we can verify that interesting\\n cases are being tested. Furthermore, a possible bug has been identified in the\\n LMDB backing store with respect to range reads, though the bug has not been\\n resolved yet.\\n- [Issue #3946][issue-3946], [branch][branch-4199], [PR #3882][pull-3882]: The\\n \\"anti-diff\\" prototype proposes an alternative approach to keeping track of\\n sequences (more specifically, `FingerTree`s) of diffs. These diff sequences\\n are a component of the in-memory parts of the ledger state in UTxO-HD. Since\\n the consensus code often requires the cumulative diff of a sequence of diffs,\\n the current implementation \\"caches\\" cumulative diffs of each subtree in the\\n diff sequence. This caching allows relatively fast reconstruction of the total\\n cumulative diff, but this caching proved to incur a non-negligible cost: when\\n we manipulate diff sequences through splits and appends, we force re-computing\\n a logarithmic number of caches. This is problematic, since we often split and\\n append in consensus: we split when we flush diffs to a backing store or when\\n we roll back blocks, and we append when pushing blocks. The new approach\\n should reduce the overhead of this caching.\\n\\n We implemented micro-benchmarks for the \\"anti-diff\\" prototype: we\\n first generate a sequence of commands (`Forward`, `Push`, `Flush`, or\\n `Rollback`) through a simulation, after which we measure the performance of\\n applying the commands to a diff sequence. In this context, `Forward` means\\n forwarding of values through a diff, whereas `Rollback` means switching to\\n a different fork by rolling back diffs/blocks and pushing new ones.\\n Moreover, we compare the performance for the two implementations: the\\n \\"legacy\\" approach, and the anti-diff approach.\\n\\n Some preliminary results were positive, but we needed to revisit the\\n benchmark\'s configuration to obtain more definitive results. After a\\n discussion with @dcoutts and the consensus team about this configuration\\n (e.g., number of commands generated, choice of the security parameter `k`),\\n the benchmarks should now be closer to the realistic setting. The following\\n configuration specifies the default configuration that is used in the\\n benchmarking code:\\n * Number of commands generated: `10_000`\\n * Security parameter `k`: `2160`\\n * Number of initial backing values: `100`\\n * Number of key-value pairs deleted by a push: `50`\\n * Number of key-value pairs inserted by a push: `50`\\n * Number of key-value pairs forwarded by a forward: `50`\\n * Probability of a large (in the range `[1000, 2000]`) rollback: `0.05`\\n * Probability of a small (in the range `[1, 10]`) rollback: `0.95`\\n * Order of commands:\\n * An equal number of forward and pushes.\\n * `1` flush every `10` pushes.\\n * `1` rollback every `100` pushes\\n\\n Moreover, we run four benchmark scenarios:\\n * Default configuration\\n * Without rollbacks\\n * With only small rollbacks\\n * Without rollbacks, larger flushes (`1` flush every `100` pushes)\\n\\n ### How to read results\\n\\n Note: this section uses documentation from the\\n [tasty-bench](https://hackage.haskell.org/package/tasty-bench) package to\\n explain how to read the results of running our benchmarks.\\n\\n Running a benchmark scenario gives us the following (curated) output:\\n ```text\\n ...\\n AntiDiff: OK (18.27s)\\n 2.527 s \xb1 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x\\n LegacyDiff: OK (32.73s)\\n 10.829 s \xb1 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory\\n ...\\n ```\\n\\n The output says that the first benchmark, which exercises the anti-diff\\n prototype, was repeatedly executed for `18.27` seconds (wall-clock time),\\n its predicted mean CPU time was `2.527` seconds and means of individual\\n samples do not often diverge from it further than `\xb1 47` milliseconds\\n (double standard deviation). We also configure the RTS to collect GC\\n statistics, which enables `tasty-bench` to estimate and report memory usage.\\n This data is reported as per `RTSStats` fields: `allocated_bytes`,\\n `copied_bytes` and `max_mem_in_use_bytes`. So, the output of the first\\n benchmark says that a total of `2.1 GB` of memory was allocated, that a\\n total of `544 MB` of memory were copied, and that the peak memory in usage\\n was `2.2 GB`. We read the output for the second benchmark in the same way.\\n\\n Furthermore, the benchmark compares the mean CPU times for\\n both the anti-diff and legacy approaches: In this case, the mean CPU time\\n for the anti-diff approach is `~0.23x` the mean CPU time for the legacy\\n approach. Conversely, the mean CPU time for the legacy approach is\\n `1 / 0.23 ~= 4.35x` the mean CPU time for the anti-diff approach. We will\\n call `0.23x` the *improvement factor*. We will call `4.35x` the *speedup*.\\n\\n Note that these improvement factors (and reported results) are subject to\\n noise, randomness, the specific configuration parameters, and the whims\\n of statistics. Data reported by `tasty-bench` is only of indicative and\\n comparative significance.\\n\\n ### Results\\n\\n For each of the 4 scenarios, we list the results of running the anti-diff and\\n legacy approaches 5 times. We run the benchmarks 5 times to get an indication\\n of whether the results are similar across multiple runs. Furthermore, we\\n calculate the accompanying *ranges* (if applicable) of improvement factors and\\n speedups.\\n\\n Note also the decrease in total bytes allocated and total bytes copied for\\n the anti-diff approach compared to the legacy approach.\\n\\n #### Default configuration\\n\\n |Name|Mean CPU time|2*Stdev (CPU time)|Total bytes allocated|Total bytes copied|Peak memory|\\n |-|-|-|-|-|-|\\n |Run 1: AntiDiff|2.533 s (0.23x)|4.7 ms|2.1 GB|557 MB|2.4 GB|\\n |Run 1: LegacyDiff|10.792 s|162 ms|6.8 GB|2.3 GB|2.4 GB|\\n |Run 2: AntiDiff|2.508 s (0.23x)|245 ms|2.1 GB|515 MB|2.2 GB|\\n |Run 2: LegacyDiff|10.850 s| 30 ms|6.9 GB|2.3 GB|2.2 GB|\\n |Run 3: AntiDiff|2.562 s (0.23x)|5.0 ms|2.1 GB|552 MB|2.2 GB|\\n |Run 3: LegacyDiff|10.993 s|149 ms|6.9 GB|2.3 GB|2.2 GB|\\n |Run 4: AntiDiff|2.168 s (0.22x)|5.3 ms|1.8 GB|434 MB|2.0 GB|\\n |Run 4: LegacyDiff|9.976 s| 39 ms|6.3 GB|2.0 GB|2.0 GB|\\n |Run 5: AntiDiff|2.527 s (0.23x)| 47 ms|2.1 GB|544 MB|2.2 GB|\\n |Run 5: LegacyDiff|10.829 s|148 ms|6.8 GB|2.3 GB|2.2 GB|\\n\\n * Improvement factor: `[0.22, 0.23]`\\n * Speedup : `[1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]`\\n\\n #### No rollbacks\\n\\n |Name|Mean CPU time|2*Stdev (CPU time)|Total bytes allocated|Total bytes copied|Peak memory|\\n |-|-|-|-|-|-|\\n |Run 1: AntiDiff|1.638 s (0.19x)| 36 ms|1.4 GB|181 MB|2.4 GB|\\n |Run 1: LegacyDiff|8.656 s|207 ms|5.7 GB|1.5 GB|2.4 GB|\\n |Run 2: AntiDiff|1.638 s (0.19x)| 75 ms|1.4 GB|181 MB|2.2 GB|\\n |Run 2: LegacyDiff|8.654 s|322 ms|5.7 GB|1.5 GB|2.2 GB|\\n |Run 3: AntiDiff|1.663 s (0.19x)| 74 ms|1.4 GB|181 MB|2.2 GB|\\n |Run 3: LegacyDiff|8.799 s|216 ms|5.7 GB|1.5 GB|2.2 GB|\\n |Run 4: AntiDiff|1.645 s (0.19x)| 51 ms|1.4 GB|181 MB|2.0 GB|\\n |Run 4: LegacyDiff|8.732 s|261 ms|5.7 GB|1.5 GB|2.0 GB|\\n |Run 5: AntiDiff|1.639 s (0.19x)| 19 ms|1.4 GB|181 MB|2.2 GB|\\n |Run 5: LegacyDiff|8.653 s|234 ms|5.7 GB|1.5 GB|2.2 GB|\\n\\n * Improvement factor: `0.19`\\n * Speedup : `1 / 0.19 ~= 5.25`\\n\\n\\n #### Only small rollbacks\\n\\n |Name|Mean CPU time|2*Stdev (CPU time)|Total bytes allocated|Total bytes copied|Peak memory|\\n |-|-|-|-|-|-|\\n |Run 1: AntiDiff|1.833 s (0.18x)| 36 ms|1.5 GB|185 MB|2.4 GB|\\n |Run 1: LegacyDiff|10.362 s|867 ms|5.8 GB|1.6 GB|2.4 GB|\\n |Run 2: AntiDiff|1.696 s (0.19x)| 30 ms|1.5 GB|185 MB|2.2 GB|\\n |Run 2: LegacyDiff|8.822 s|106 ms|5.8 GB|1.5 GB|2.2 GB|\\n |Run 3: AntiDiff|1.702 s (0.19x)| 44 ms|1.5 GB|186 MB|2.2 GB|\\n |Run 3: LegacyDiff|8.906 s|147 ms|5.8 GB|1.5 GB|2.2 GB|\\n |Run 4: AntiDiff|1.701 s (0.19x)| 47 ms|1.5 GB|185 MB|2.0 GB|\\n |Run 4: LegacyDiff|8.949 s|197 ms|5.8 GB|1.5 GB|2.0 GB|\\n |Run 5: AntiDiff|1.677 s (0.19x)| 55 ms|1.5 GB|186 MB|2.2 GB|\\n |Run 5: LegacyDiff|8.856 s|177 ms|5.8 GB|1.5 GB|2.2 GB|\\n\\n * Improvement factor: `[0.18, 0.19]`\\n * Speedup : `[1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]`\\n\\n #### No rollbacks, larger flushes (every 100 pushes)\\n\\n |Name|Mean CPU time|2*Stdev (CPU time)|Total bytes allocated|Total bytes copied|Peak memory|\\n |-|-|-|-|-|-|\\n |Run 1: AntiDiff|1.643 s (0.25x)| 21 ms|1.5 GB|196 MB|2.4 GB|\\n |Run 1: LegacyDiff|6.591 s|351 ms|4.0 GB|1.4 GB|2.4 GB|\\n |Run 2: AntiDiff|1.616 s (0.25x)| 47 ms|1.5 GB|196 MB|2.2 GB|\\n |Run 2: LegacyDiff|6.520 s|232 ms|4.0 GB|1.4 GB|2.2 GB|\\n |Run 3: AntiDiff|1.640 s (0.25x)| 34 ms|1.5 GB|196 MB|2.2 GB|\\n |Run 3: LegacyDiff|6.540 s|150 ms|4.0 GB|1.4 GB|2.2 GB|\\n |Run 4: AntiDiff|1.635 s (0.25x)| 76 ms|1.5 GB|196 MB|2.0 GB|\\n |Run 4: LegacyDiff|6.589 s|131 ms|4.0 GB|1.4 GB|2.0 GB|\\n |Run 5: AntiDiff|1.628 s (0.25x)| 19 ms|1.5 GB|196 MB|2.2 GB|\\n |Run 5: LegacyDiff|6.490 s|5.9 ms|4.0 GB|1.4 GB|2.2 GB|\\n\\n * Improvement factor: `0.25`\\n * Speedup : `1 / 0.25 ~= 4`\\n\\n### Genesis\\n\\n - We elaborated a draft of the specification of the Genesis implementation and\\n the ChainSync Jumping optimization. In particular, this includes a proof\\n sketch that the latter preserves liveness and safety in all cases ([Issue\\n 3964][issue-3964]).\\n - @nfrisby\'s main realization during this sprint was that he had been\\n focusing so far on the case where the selected chain is an extension of\\n the intersection of our peers\' ChainSync candidates.\\n - This is the main case, ie an \\"absorbing\\" state, but it\'s not the only\\n case.\\n - The new proof sketch begins by case splitting on that predicate, and\\n that made the sketch quite a bit easier to follow.\\n - We continued working on the \\"happy path\\" `ChainSync` Jumping prototype ([Issue\\n 3960][issue-3960]).\\n\\n### Technical debt\\n\\n - We started working on the issues required to re-enable nightly CI runs..\\n Nightly CI runs have far more lax time constraints, which gives the option to\\n run significantly more property tests than in our regular CI. To this end, we\\n merged a PR to easily adapt the number of tests globally ([PR\\n #3947][pull-3947]).\\n\\n[issue-3954]: https://github.com/input-output-hk/ouroboros-network/issues/3954\\n[branch-3954]: https://github.com/input-output-hk/ouroboros-network/tree/jdral/3954-backingstore-property-tests\\n[issue-3946]: https://github.com/input-output-hk/ouroboros-network/issues/3946\\n[branch-4199]: https://github.com/input-output-hk/ouroboros-network/tree/jdral/CAD-4199-prototype-anti-diffs\\n[pull-3882]: https://github.com/input-output-hk/ouroboros-network/pull/3882\\n[pull-3947]: https://github.com/input-output-hk/ouroboros-network/pull/3947\\n[issue-3960]: https://github.com/input-output-hk/ouroboros-network/issues/3960\\n[issue-3962]: https://github.com/input-output-hk/ouroboros-network/issues/3962\\n[issue-3964]: https://github.com/input-output-hk/ouroboros-network/issues/3964\\n[pull-3971]: https://github.com/input-output-hk/ouroboros-network/pull/3971\\n[issue-3976]: https://github.com/input-output-hk/ouroboros-network/issues/3976"},{"id":"2022-08-12-network","metadata":{"permalink":"/cardano-updates/2022-08-12-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-08-12-network.md","source":"@site/blog/2022-08-12-network.md","title":"Network Team Update","description":"The networking team took an active part in the project iteration (PI) planning","date":"2022-08-12T00:00:00.000Z","formattedDate":"August 12, 2022","tags":[{"label":"network","permalink":"/cardano-updates/tags/network"}],"readingTime":0.88,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2022-08-12-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Team Update","permalink":"/cardano-updates/2022-08-31-consensus"}},"content":"```mdx-code-block\\nimport ReactPlayer from \'react-player\'\\n```\\n\\n\\nThe networking team took an active part in the project iteration (PI) planning\\nsession, see cardano-node [backlog](https://github.com/orgs/input-output-hk/projects/39) for detailed\\noutcomes.\\n\\n\\n* We started working on a detailed design / implementation plan for gossip.\\n\\n* We merged [input-output-hk/ouroboros-network#3859](https://github.com/input-output-hk/ouroboros-network/pull/3859) which\\n sets the ouroboros-network repository for the single relay release.\\n\\n* We identified a bug in the network simulator, which is fixed in the\\n [input-output-hk/ouroboros-network#3852](https://github.com/input-output-hk/ouroboros-network/pull/3852).\\n The above PR was reviewed.\\n\\n* We set the tracing configuration for nodes which we deploy and fixed and\\n identified some deployment hiccups. We identified some bugs in the RT view\\n which were registered by the maintainers.\\n [input-output-hk/ouroboros-network-ops#4](https://github.com/input-output-hk/ouroboros-network-ops/pull/4)\\n\\n* We fixed typos in network-mux library:\\n [input-output-hk/ouroboros-network#3921](https://github.com/input-output-hk/ouroboros-network/pull/3921)\\n\\n* For easy of debugging we renamed a trace point:\\n [input-output-hk/ouroboros-network#3922](https://github.com/input-output-hk/ouroboros-network/pull/3922)\\n\\n* Duncan iterated on his simulation / visualisation. He also was able to\\n identify and fix a bug in the simulator. The simulation contains 50 nodes.\\n Dashed lines indicate and established connection, while solid lines indicate\\n a TCP connection with fully open TCP window.\\n\\n```mdx-code-block\\n\\n```"}]}')}}]); \ No newline at end of file diff --git a/assets/js/3ee2c73a.56f15864.js b/assets/js/3ee2c73a.56f15864.js new file mode 100644 index 00000000000..905d8732422 --- /dev/null +++ b/assets/js/3ee2c73a.56f15864.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[50506],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=a,h=s["".concat(u,".").concat(d)]||s[d]||m[d]||o;return r?n.createElement(h,l(l({ref:t},p),{},{components:r})):n.createElement(h,l({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"DB-sync Team Update",slug:"2023-05-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-01-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-01-db-sync.md",source:"@site/blog/2023-05-01-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-05-01T00:00:00.000Z",formattedDate:"May 1, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.515,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-05-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-03-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-04-28-crypto"}},u={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:c},s="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Prepared a schema change which is expected to speed up queries and help clients\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1389"},"#1389"),"."),(0,a.kt)("li",{parentName:"ul"},"Ran a big number of benchmarks on the above to evaluate if this change is reasonable."),(0,a.kt)("li",{parentName:"ul"},"Performance optimization related to rewards\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1382"},"#1382")),(0,a.kt)("li",{parentName:"ul"},"Using the cache in more places to reduce recourses usage\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1380"},"#1380")),(0,a.kt)("li",{parentName:"ul"},"Evaluated risks related to UTXO-HD integration"),(0,a.kt)("li",{parentName:"ul"},"Worked on a feauture request to split the ",(0,a.kt)("inlineCode",{parentName:"li"},"tx_out")," to an address table\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1396"},"#1396")),(0,a.kt)("li",{parentName:"ul"},"Worked on another feauture request to prune the consumed entries from the ",(0,a.kt)("inlineCode",{parentName:"li"},"tx_out")," table\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1398"},"#1398")),(0,a.kt)("li",{parentName:"ul"},"Prepared for CIP-1694 integration")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3f2108ba.00951b81.js b/assets/js/3f2108ba.00951b81.js new file mode 100644 index 00000000000..b7bb5114a86 --- /dev/null +++ b/assets/js/3f2108ba.00951b81.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[99610],{3905:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>d});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(i),c=a,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||n;return i?r.createElement(d,o(o({ref:t},u),{},{components:i})):r.createElement(d,o({ref:t},u))}));function d(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var s=2;s{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-08-10-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-08-10-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-10-mithril.md",source:"@site/blog/2023-08-10-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-08-10T00:00:00.000Z",formattedDate:"August 10, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-08-10-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-11-performance-and-tracing"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-09-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,r.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the ",(0,a.kt)("strong",{parentName:"p"},"Mithril protocol\u2019s mainnet beta")," launch: the ",(0,a.kt)("inlineCode",{parentName:"p"},"release-mainnet")," network is now consistently producing new certificates and snapshots! The team has released a new distribution ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2331.1"},(0,a.kt)("inlineCode",{parentName:"a"},"2331.1"))," which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the ",(0,a.kt)("inlineCode",{parentName:"p"},"mainnet")," infrastructure."),(0,a.kt)("p",null,"Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2331.1"},(0,a.kt)("inlineCode",{parentName:"a"},"2331.1"))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Release 'mainnet' Mithril network")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/918"},"#918")),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator - phase 1")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Post deployment 'mainnet' infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1091"},"#1091"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Create Production Infrastructure Runbook")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1085"},"#1085")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Ingest 'mainnet' metrics/logs in Grafana")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1122"},"#1122")))),(0,a.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add a 'clean' file to extracted database in client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1131"},"#1131")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Create explorer page with registered signers")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1097"},"#1097")))),(0,a.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor (de)serialization of crypto entities")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/668"},"#668")))),(0,a.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Client fails to unpack some snapshot archive")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1137"},"#1137")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"The 'release-preprod' network stopped producing certificates")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1114"},"#1114")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"The 'release-mainnet' network does not show up in the explorer")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1111"},"#1111")))),(0,a.kt)("li",{parentName:"ul"},"Worked on dependencies:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Upgrade Cardano node to '8.1.2'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1090"},"#1090")))),(0,a.kt)("li",{parentName:"ul"},"Worked on troubleshooting:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Signer can't sign with 'Invalid signature for party' error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1125"},"#1125"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3f64a4c5.7672a1fc.js b/assets/js/3f64a4c5.7672a1fc.js new file mode 100644 index 00000000000..12520e4fec1 --- /dev/null +++ b/assets/js/3f64a4c5.7672a1fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78397],{16233:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/53","page":53,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/52","nextPage":"/cardano-updates/page/54","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/3f9060c3.e4eac2b7.js b/assets/js/3f9060c3.e4eac2b7.js new file mode 100644 index 00000000000..58fbd97681b --- /dev/null +++ b/assets/js/3f9060c3.e4eac2b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36398],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=a,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-04-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-04-05-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-consensus.md",source:"@site/blog/2023-04-05-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-04-05T00:00:00.000Z",formattedDate:"April 5, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.66,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-04-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-06-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-05-node-cli-api"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This week the consensus team finished the UTxO-HD prototype refactoring. We are\nnow working on improving the DB lock mechanism to improve performance. We also\nintroduced several improvements to the file system abstraction and simulation\nlayer (",(0,a.kt)("inlineCode",{parentName:"p"},"fs-sim"),"), which culminated in the release of ",(0,a.kt)("inlineCode",{parentName:"p"},"fs-sim-0.1.0.0")," and\n",(0,a.kt)("inlineCode",{parentName:"p"},"fs-api-0.1.0.0")," to ",(0,a.kt)("inlineCode",{parentName:"p"},"CHaP"),"."),(0,a.kt)("p",null,"On the Genesis front we distributed the updated Genesis design document,\nsoliciting feedback from Networking Team and IOG Researchers. We also opened up\na PR for the adversarial leader schedule ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," generator, which is being\nreviewed."),(0,a.kt)("p",null,"On the support front, we got a new Consensus version that can use different\nfundamental VRF crypto primitives for Babbage and Conway eras."),(0,a.kt)("p",null,"On the tech debt front we fixed an bug in the followers logic, which was\ndiscovered by our ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," property tests."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/40367786.801454be.js b/assets/js/40367786.801454be.js new file mode 100644 index 00000000000..d7a6c2edeee --- /dev/null +++ b/assets/js/40367786.801454be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47406],{88444:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/40718b14.5ad5937f.js b/assets/js/40718b14.5ad5937f.js new file mode 100644 index 00000000000..291620e2a31 --- /dev/null +++ b/assets/js/40718b14.5ad5937f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43980],{71967:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/tags/sre","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/40a4cbba.c44c73f4.js b/assets/js/40a4cbba.c44c73f4.js new file mode 100644 index 00000000000..722b429377c --- /dev/null +++ b/assets/js/40a4cbba.c44c73f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[66458],{43602:a=>{a.exports=JSON.parse('{"label":"embedding-quality","permalink":"/cardano-updates/tags/embedding-quality","allTagsPath":"/cardano-updates/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/40e498fa.7e0d2b44.js b/assets/js/40e498fa.7e0d2b44.js new file mode 100644 index 00000000000..5e54327f447 --- /dev/null +++ b/assets/js/40e498fa.7e0d2b44.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23092],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},d=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},c="mdxType",s={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,p=t.parentName,d=i(t,["components","mdxType","originalType","parentName"]),c=u(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||o;return a?n.createElement(h,l(l({ref:e},d),{},{components:a})):n.createElement(h,l({ref:e},d))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[c]="string"==typeof t?t:r,l[1]=i;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-11-02-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-11-02-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-node-cli-api.md",source:"@site/blog/2022-11-02-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.265,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-11-02-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-02-ledger"},nextItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2022-11-02-release"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],d={toc:u},c="wrapper";function s(t){let{components:e,...a}=t;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-11-02---2022-11-15"},"2022-11-02 - 2022-11-15"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Documentation improvments"),(0,r.kt)("li",{parentName:"ul"},"Merged community contributions"),(0,r.kt)("li",{parentName:"ul"},"Exposing types from cardano-api requested by the community/other teamss"),(0,r.kt)("li",{parentName:"ul"},"Test output has been improved so diagnosing failures is now easier"),(0,r.kt)("li",{parentName:"ul"},"Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)"),(0,r.kt)("li",{parentName:"ul"},"Refactoring of cardano-testnet making it more useable as a library (ongoing)"),(0,r.kt)("li",{parentName:"ul"},"Release 1.35.4 was merged & released")),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4567"},"Community contributions - doc fixes and spelling errors"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4546"},"Reduce exposed modules in cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4587"},"Add Ord instance for AddressInEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4496"},"Export TxTotalAndReturnCollateralSupportedInEra from Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4635"},"Expose TextEnvelopeCddl from Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4628"},"Expose txScriptValidityToScriptValidity in Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4599"},"export RawBytesHexError"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/2883"},"Add Plutus minting script doc")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4575/files"},"Improve test output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4586"},"Enable stale bot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4557"},"Add link to troubleshooting page in the wiki")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4550"},"Use environment files in Github Actions"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4544"},"Add single entrypoint for starting testnets")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4575"},"Improve cardano-testnet test output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4595"},"Reorder module hierarchy"))),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/41244b80.81b0a059.js b/assets/js/41244b80.81b0a059.js new file mode 100644 index 00000000000..acedb1c1120 --- /dev/null +++ b/assets/js/41244b80.81b0a059.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22496],{43985:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/ledger","page":1,"postsPerPage":5,"totalPages":6,"totalCount":30,"nextPage":"/cardano-updates/tags/ledger/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/415f2cd9.064a1e9b.js b/assets/js/415f2cd9.064a1e9b.js new file mode 100644 index 00000000000..d529e1213cd --- /dev/null +++ b/assets/js/415f2cd9.064a1e9b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21198],{62989:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/42","page":42,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/41","nextPage":"/cardano-updates/page/43","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/41606842.90043f12.js b/assets/js/41606842.90043f12.js new file mode 100644 index 00000000000..d642fc50f06 --- /dev/null +++ b/assets/js/41606842.90043f12.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88101],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),s=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(d.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,d=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(a),c=n,m=p["".concat(d,".").concat(c)]||p[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-12-02-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-02-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-02-hydra.md",source:"@site/blog/2022-12-02-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-12-02T00:00:00.000Z",formattedDate:"December 2, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.965,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-12-02-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-12-09-ledger"},nextItem:{title:"DB sync Team Update",permalink:"/cardano-updates/2022-12-01-db-sync"}},d={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:s},p="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has worked on cleaning up several things in progress\nafter last week's summit. They have extended their model-based testing (MBT)\napproach with transaction creation & observation\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/410"},"#410"),", solved\n",(0,n.kt)("inlineCode",{parentName:"p"},"AcquirePointTooOld")," problems of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," with by changing the wallet\ninitialization ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/439"},"#439"),".\nAlso, the Hydra researchers updated the security proofs of the Coordinated Hydra\nHead, which are bound to be included in the Hydra HeadV1 specification."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review & report - will also be published on our website ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/644"},"#644")),(0,n.kt)("li",{parentName:"ul"},"Extended the model-based testing (MBT) with transaction creation/observation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/410"},"#410")),(0,n.kt)("li",{parentName:"ul"},"Solve ",(0,n.kt)("inlineCode",{parentName:"li"},"AcquirePointTooOld")," problems with new wallet initialization ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/439"},"#439")),(0,n.kt)("li",{parentName:"ul"},"Fixed our hydraw deployments (EC2 instances)"),(0,n.kt)("li",{parentName:"ul"},"Created & discussed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," within tx validity work"),(0,n.kt)("li",{parentName:"ul"},"Received & discussed security proofs of Coordinated Hydra Head (requires more work)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Get ADR21 accepted & close tx validity gap in our implementation"),(0,n.kt)("li",{parentName:"ul"},"Complete review & integrate the Hydra tutorial"),(0,n.kt)("li",{parentName:"ul"},"Review latest hydra-pay work"),(0,n.kt)("li",{parentName:"ul"},"Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec"),(0,n.kt)("li",{parentName:"ul"},"Get Cicero (new CI) working")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/417fc4b4.4f4a2695.js b/assets/js/417fc4b4.4f4a2695.js new file mode 100644 index 00000000000..63466ff6fe1 --- /dev/null +++ b/assets/js/417fc4b4.4f4a2695.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[57271],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),h=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=h(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),s=h(a),c=n,m=s["".concat(p,".").concat(c)]||s[c]||d[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var h=2;h{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-01-20-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-20-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-hydra.md",source:"@site/blog/2023-01-20-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.13,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-01-20-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-20-crypto"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-01-20-network"}},p={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:h},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1\nspecification. Of which a first version has been aggregated and is currently\nunder review. They aligned the on-chain scripts of reimbursing funds on abort\nlike defined in the specification, improved the mutation test framework to have\nmore control when testing plutus scripts. The added HeadId in the API and the\nTUI example client make ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," easier to use and a first experiment of a\nHydra Head explorer was showing the utility of this - see what Heads exist on\nthe ",(0,n.kt)("inlineCode",{parentName:"p"},"preview")," network ",(0,n.kt)("a",{parentName:"p",href:"http://explorer.hydra.family"},"here"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"HeadId to API and display in the TUI ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/678"},"#678")),(0,n.kt)("li",{parentName:"ul"},"Experiment of creating a hydra explorer, first result hosted ",(0,n.kt)("a",{parentName:"li",href:"http://explorer.hydra.family"},"here")),(0,n.kt)("li",{parentName:"ul"},"Improved mutation framework allowing to fail for the right reason ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/679"},"#679")),(0,n.kt)("li",{parentName:"ul"},"Correctly reimburse funds in abort (matching the spec) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/670"},"#670")),(0,n.kt)("li",{parentName:"ul"},"Finished a first write-up of the Hydra HeadV1 spec: ",(0,n.kt)("a",{parentName:"li",href:"https://www.overleaf.com/read/bbqzmptcxryj"},"Read it on overleaf")," (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/master/SUPPORT.md"},"Communication channels")," for feedback)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting with a broader audience"),(0,n.kt)("li",{parentName:"ul"},"Groom & plan actions required for a maintainable Head explorer"),(0,n.kt)("li",{parentName:"ul"},"Break \u201calign gaps\u201d feature into smaller chunks (at least on- /off-chain) and groom it"),(0,n.kt)("li",{parentName:"ul"},"Review the spec & discuss individual aborts with researchers (a bigger open question)")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/41d087d7.f106b6c0.js b/assets/js/41d087d7.f106b6c0.js new file mode 100644 index 00000000000..b9a93f68e2c --- /dev/null +++ b/assets/js/41d087d7.f106b6c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[71972],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-11-18-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-11-18-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-18-hydra.md",source:"@site/blog/2022-11-18-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-11-18T00:00:00.000Z",formattedDate:"November 18, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.085,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-18-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-23-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-18-mithril"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},u="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version ",(0,n.kt)("inlineCode",{parentName:"p"},"0.8.1"),", which includes several fixes and a user-wished extension of the persistence introduced by ",(0,n.kt)("inlineCode",{parentName:"p"},"0.8.0")," of replaying server outputs to make clients like the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-tui")," be aware of the latest ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-poc")," to ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra"},(0,n.kt)("inlineCode",{parentName:"a"},"hydra")),"!"),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implemented replaying of server outputs to address ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Released version 0.8.1 containing this and other fixes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.8.1"},"Release notes")),(0,n.kt)("li",{parentName:"ul"},"Worked on the bounded tx validity as one of the on-chain script fixes, but couldn","\u2019","t finish it just yet ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/615"},"#615")),(0,n.kt)("li",{parentName:"ul"},"Collaborated with the education team on a Hydra tutorial."),(0,n.kt)("li",{parentName:"ul"},"Discovered and discussed issues with the ","\u201c","seen ledger","\u201d","."),(0,n.kt)("li",{parentName:"ul"},"Renamed the Hydra repository ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-poc")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Create and discuss an ADR about handling tx validity correctly."),(0,n.kt)("li",{parentName:"ul"},"Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: ",(0,n.kt)("strong",{parentName:"li"},'"Developing Hydra" on Day 2, Nov 21st, 13:50 CET')),(0,n.kt)("li",{parentName:"ul"},"Have a team workshop / hackathon after the summit:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Retrospective"),(0,n.kt)("li",{parentName:"ul"},"Roadmapping session"),(0,n.kt)("li",{parentName:"ul"},"Hack on something complex or useful")))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/425dfc0f.51e517b1.js b/assets/js/425dfc0f.51e517b1.js new file mode 100644 index 00000000000..24b3ae67bb2 --- /dev/null +++ b/assets/js/425dfc0f.51e517b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85349],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=p(r),d=n,h=m["".concat(u,".").concat(d)]||m[d]||c[d]||i;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=d;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[m]="string"==typeof e?e:n,l[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-08-04-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-08-04-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-crypto.md",source:"@site/blog/2023-08-04-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.495,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-08-04-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-09-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-04-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"MuSig2",id:"musig2",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},m="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation"),(0,n.kt)("li",{parentName:"ul"},"mithril: Full node verifier"),(0,n.kt)("li",{parentName:"ul"},"musig2: Finalised the missing fuzz tests"),(0,n.kt)("li",{parentName:"ul"},"kes_agent: engineer on PTO. Work halted ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work on a mithril flaky test ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/1105"},"#1105")),(0,n.kt)("li",{parentName:"ul"},"Keep working on Full Node Verifier ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"),".\nShould be merged in the coming week.")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finalised the fuzz tests ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/43"},"#43"))),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/42ad0ca4.784088d6.js b/assets/js/42ad0ca4.784088d6.js new file mode 100644 index 00000000000..4cf43674e7d --- /dev/null +++ b/assets/js/42ad0ca4.784088d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80309],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(a),c=n,h=d["".concat(u,".").concat(c)]||d[c]||m[c]||o;return a?r.createElement(h,i(i({ref:t},p),{},{components:a})):r.createElement(h,i({ref:t},p))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-31-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-31-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-hydra.md",source:"@site/blog/2023-03-31-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.82,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-31-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-31-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-31-ledger"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},d="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra continued work on finishing mainnet compatibility. The\nsemi-automated smoke tests and some missing documentation is still preventing\nfrom calling that fully done. They fixed smaller issues and made a step in the\nHead protocol more robust. Besides development, they met with interested people\nfrom the community who want to get started collaborating on communication and\nmarketing materials."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Groomed and followed-up on ",(0,n.kt)("inlineCode",{parentName:"li"},"GetUTxO")," user request discussion ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/discussions/797"},"#797")),(0,n.kt)("li",{parentName:"ul"},"Fixed ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")," crashes after forks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/560"},"#560")),(0,n.kt)("li",{parentName:"ul"},"Made ",(0,n.kt)("inlineCode",{parentName:"li"},"collectCom")," more robust and aligned with spec ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/786"},"#786")),(0,n.kt)("li",{parentName:"ul"},"Completed configurable API feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/380"},"#380")),(0,n.kt)("li",{parentName:"ul"},"Met potential contributors about Hydra communication and marketing materials"),(0,n.kt)("li",{parentName:"ul"},"Versioned documentation: we have a ",(0,n.kt)("inlineCode",{parentName:"li"},"unstable")," bleeding edge version available as well now, seperate from the last released version")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Follow-up backlog and roadmap clean-up"),(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713")," (documentation updates)"),(0,n.kt)("li",{parentName:"ul"},"Integrate Hydra specification into repository ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43289e4d.c91734fc.js b/assets/js/43289e4d.c91734fc.js new file mode 100644 index 00000000000..68ccde06357 --- /dev/null +++ b/assets/js/43289e4d.c91734fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[458],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=d(a),h=n,m=p["".concat(s,".").concat(h)]||p[h]||u[h]||o;return a?r.createElement(m,i(i({ref:t},c),{},{components:a})):r.createElement(m,i({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,i[1]=l;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-18-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-18-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-hydra.md",source:"@site/blog/2023-08-18-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.13,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-18-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-18-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-18-ledger"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],c={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version 0.12.0, a significant update that\nbrings support for cardano-node 8.1.2, along with performance enhancements and\nvarious API improvements. Additionally, the team successfully onboarded a new\ncontributor who is now actively participating in operating a Hydra Head. They\ntook part in a meeting of the Intersect open source committee and prepared the\nHydra master-class for RareEvo, an educational initiative for the community."),(0,n.kt)("p",null,"If you happen to be at RareEvo, register for the Hydra master-class ",(0,n.kt)("a",{parentName:"p",href:"https://docs.google.com/forms/d/1Q9KIxwKeyZeNrKDBiYWceYjnbxIxaEwC8Eo5LWxSa2g/viewform?edit_requested=true"},"using this\nform"),".\nWe hope to make it possible to follow along on-line as well and will announce\ndetails on the Hydra announcements channel on the ",(0,n.kt)("a",{parentName:"p",href:"https://discord.gg/Qq5vNTg9PT"},"IOG discord\nserver"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released version 0.12.0 which adds support for cardano-node 8.1.2, performance\nand several API improvements. ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.12.0"},"Release notes")),(0,n.kt)("li",{parentName:"ul"},"Replaced commit via websocket with external draft + submit. ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/954"},"#954")),(0,n.kt)("li",{parentName:"ul"},"Onboarded new contributor to the point where he actively participates in operating a Head now."),(0,n.kt)("li",{parentName:"ul"},"Joined a first meeting of the Intersect open source committee"),(0,n.kt)("li",{parentName:"ul"},"Prepared the Hydra master-class for RareEvo.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting"),(0,n.kt)("li",{parentName:"ul"},"Run the Hydra master-class at RareEvo!"),(0,n.kt)("li",{parentName:"ul"},"Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff"),(0,n.kt)("li",{parentName:"ul"},"Clear out red bin items (technical debt)"),(0,n.kt)("li",{parentName:"ul"},"Groom network resilience and explorer features")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/435d8b4c.89bf5b70.js b/assets/js/435d8b4c.89bf5b70.js new file mode 100644 index 00000000000..886170fe5ca --- /dev/null +++ b/assets/js/435d8b4c.89bf5b70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88697],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=d(a),c=n,m=p["".concat(s,".").concat(c)]||p[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-04-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-04-27-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-27-hydra.md",source:"@site/blog/2023-04-27-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-27T00:00:00.000Z",formattedDate:"April 27, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.11,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-04-28-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-21-hydra"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:d},p="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team held their Monthly review meeting and drafted the\nreport which likely is published next week. They put the spec into the\nrepository and website, addressed a user issue and fixed the TUI peer list.\nFurthermore, they updated dependencies, conducted a Twitter space on Auctions\nuse cases, covered the rollback bug with tests and implemented a solution.\nLooking ahead, their goals for next week include releasing 0.10.0, implementing\ntimed transactions support, writing a Query API ADR, and grooming work items\nlike off-chain benchmarks."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Held the Monthly review meeting and drafted the report (to be published next week)"),(0,n.kt)("li",{parentName:"ul"},"Added the spec into the repository\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693")," and published on\n",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/core-concepts/specification"},"the\nwebsite")),(0,n.kt)("li",{parentName:"ul"},"Groom and addressed user issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/823"},"#823")),(0,n.kt)("li",{parentName:"ul"},"Covered the rollback bug with tests and implemented a solution (to be reviewed) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Fixed the TUI peer list"),(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to match ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node")," master"),(0,n.kt)("li",{parentName:"ul"},"Conducted a twitter space on Auctions use cases")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Release 0.10.0"),(0,n.kt)("li",{parentName:"ul"},"Support timed transactions solution drafted and validated API with users"),(0,n.kt)("li",{parentName:"ul"},"Write Query API ADR and groom a concrete step"),(0,n.kt)("li",{parentName:"ul"},"Groom and solve ",(0,n.kt)("inlineCode",{parentName:"li"},"PostTxOnChainFailed")," UX problem ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/832"},"#832")),(0,n.kt)("li",{parentName:"ul"},"Groom off-chain benchmarks idea ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186")," and turn it into a ","\u201c","feature","\u201d")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/437db4bf.f20821a1.js b/assets/js/437db4bf.f20821a1.js new file mode 100644 index 00000000000..09ad904ee0d --- /dev/null +++ b/assets/js/437db4bf.f20821a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[81587],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),u=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(r),m=n,d=p["".concat(s,".").concat(m)]||p[m]||h[m]||i;return r?a.createElement(d,o(o({ref:t},c),{},{components:r})):a.createElement(d,o({ref:t},c))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-02-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-03-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-crypto.md",source:"@site/blog/2023-02-03-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-02-03T00:00:00.000Z",formattedDate:"February 3, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:2.47,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-02-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-08-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-03-goedel"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"MuSig2",id:"musig2",level:3}],c={toc:u},p="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril. "),(0,n.kt)("li",{parentName:"ul"},"cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: using snockets and making things testable in IOSim "),(0,n.kt)("li",{parentName:"ul"},"MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/722"},"PR#722")),(0,n.kt)("li",{parentName:"ul"},"We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper."),(0,n.kt)("li",{parentName:"ul"},"We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381. "),(0,n.kt)("li",{parentName:"ul"},"The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner."),(0,n.kt)("li",{parentName:"ul"},"The update VRF ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#341")," is finally merged, and we are ready to merge ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/344"},"PR#344"),", which implements conversion functions from the compatible types between Praos and PraosBatchCompat.")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Use of snockets to send the data directly from the socket to secure memory. "),(0,n.kt)("li",{parentName:"ul"},"We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives"),(0,n.kt)("li",{parentName:"ul"},"Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("p",null,"The GitHub Action ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/fernandrone/linelint"},"linelint")," is used to check the files."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A new job for linting is added to the file ",(0,n.kt)("inlineCode",{parentName:"li"},"/.github/workflows/ci.yml"),". The rules are configured in the file ",(0,n.kt)("inlineCode",{parentName:"li"},"/.github/workflows/.linelint.yml"),". Some files from the configuration of ",(0,n.kt)("inlineCode",{parentName:"li"},"libsecp")," were failing, so in the rules in ",(0,n.kt)("inlineCode",{parentName:"li"},".linelint.yml")," the failing files are denoted to be ignored by the linter."),(0,n.kt)("li",{parentName:"ul"},"Folders are reorganized. We created a folder to handle the example. This folder includes the ",(0,n.kt)("inlineCode",{parentName:"li"},"examplemusig2.c"),", a distinct ",(0,n.kt)("inlineCode",{parentName:"li"},"config.h"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"helper.c"),". The example is enhanced by implementing the functions in the helper for the configuration given in ",(0,n.kt)("inlineCode",{parentName:"li"},"config.h"),". The number of messages is different than the tests. The example is made more generic to run with a loop.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/439b9a57.c4abecba.js b/assets/js/439b9a57.c4abecba.js new file mode 100644 index 00000000000..97732e717d1 --- /dev/null +++ b/assets/js/439b9a57.c4abecba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96121],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),p=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(r),m=n,h=c["".concat(s,".").concat(m)]||c[m]||d[m]||o;return r?a.createElement(h,l(l({ref:t},u),{},{components:r})):a.createElement(h,l({ref:t},u))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Node Release Team Update",slug:"2022-11-02-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-11-02-release",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-release.md",source:"@site/blog/2022-11-02-release.md",title:"Node Release Team Update",description:"Node Reelease Update",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:.445,hasTruncateMarker:!1,authors:[{name:"Samuel Leathers",title:"Service Reliability Manager",url:"https://github.com/disassembler",imageURL:"https://github.com/disassembler.png",key:"disassembler"}],frontMatter:{title:"Node Release Team Update",slug:"2022-11-02-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-02-node-cli-api"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-11-02-system-test"}},s={authorsImageUrls:[void 0]},p=[{value:"Node Reelease Update",id:"node-reelease-update",level:2},{value:"2022-10-19 - 2022-11-02",id:"2022-10-19---2022-11-02",level:2},{value:"Executive Summary",id:"executive-summary",level:3},{value:"Completed",id:"completed",level:3},{value:"In Progress",id:"in-progress",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"node-reelease-update"},"Node Reelease Update"),(0,n.kt)("h2",{id:"2022-10-19---2022-11-02"},"2022-10-19 - 2022-11-02"),(0,n.kt)("h3",{id:"executive-summary"},"Executive Summary"),(0,n.kt)("p",null,"The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset,\na temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8."),(0,n.kt)("p",null,"1.35.4 release candidates have been created and are being tested internally and externally."),(0,n.kt)("h3",{id:"completed"},"Completed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/commits/1.35.4-rc1"},"1.35.4-rc1 tag")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/commits/1.35.4-rc1"},"1.35.4-rc2 tag (config changes only for preview)")),(0,n.kt)("li",{parentName:"ul"},"[CHaP Migration]"," (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4540"},"https://github.com/input-output-hk/cardano-node/pull/4540"),")")),(0,n.kt)("h3",{id:"in-progress"},"In Progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/commits/release/1.35"},"Release 1.35.4")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.4_rc1/src_docs/source/test_results/node/tag_1_35_4_rc1.rst"},"Test Status")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-updates/2022-08-12-sre"},"Cicero CI Migration")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43aa4824.940228f0.js b/assets/js/43aa4824.940228f0.js new file mode 100644 index 00000000000..89b0e06e8e8 --- /dev/null +++ b/assets/js/43aa4824.940228f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98347],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(r),m=n,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||l;return r?a.createElement(h,o(o({ref:t},d),{},{components:r})):a.createElement(h,o({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,o[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-03-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-03-17-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-ledger.md",source:"@site/blog/2023-03-17-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-03-17T00:00:00.000Z",formattedDate:"March 17, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.415,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-03-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-17-hydra"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-16-goedel"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Expanded ledger API",id:"expanded-ledger-api",level:3},{value:"Conway ledger rules",id:"conway-ledger-rules",level:3},{value:"Incremental SPO/DRep stake distribution computation",id:"incremental-spodrep-stake-distribution-computation",level:3},{value:"Technical debt",id:"technical-debt",level:3}],d={toc:u},c="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We made further progress on the conway ledger era.\nIn particular, we expanded the ledger API significantly, including lots of governance features.\nWe also made progress on the specification and corresponding work in the Haskell implementation."),(0,n.kt)("p",null,"We also continued to integrate the latest ledger packages into cardano node and addressed\ntechnical debt."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"expanded-ledger-api"},"Expanded ledger API"),(0,n.kt)("p",null,"The ledger API was significantly expanded to include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a lot of protocol parameter support"),(0,n.kt)("li",{parentName:"ul"},"versioning support (type level ledger eras and protocol versions)"),(0,n.kt)("li",{parentName:"ul"},"auxiliary data support"),(0,n.kt)("li",{parentName:"ul"},"many new lenses"),(0,n.kt)("li",{parentName:"ul"},"support for witnesses"),(0,n.kt)("li",{parentName:"ul"},"support for conway governance")),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3328"},"pull-3328"),"."),(0,n.kt)("h3",{id:"conway-ledger-rules"},"Conway ledger rules"),(0,n.kt)("p",null,"We have made progress on the formal ledger specification for the Conway era.\nMoreover, the corresponding Haskell updates were also completed:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3339"},"pull-3339")),(0,n.kt)("li",{parentName:"ul"},"See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3326"},"pull-3326")),(0,n.kt)("li",{parentName:"ul"},"See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3330"},"pull-3330"))),(0,n.kt)("h3",{id:"incremental-spodrep-stake-distribution-computation"},"Incremental SPO/DRep stake distribution computation"),(0,n.kt)("p",null,"We have a working (and correct) proof of concept for how to use the incremental lambda calculus\nto maintain several of the stake distributions incrementally.\nFor the per-SPO distribution, this is a performance improvement.\nFor the (conway) per-DRep distribution, this is will allow those who have delegated their votes\nto a DRep to have time to react to any votes that they disapprove of.\n(Sorry, no code to share just yet, more to come.)"),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improved CBOR testing facilities ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3332"},"pull-3332")),(0,n.kt)("li",{parentName:"ul"},"GitHub actions improvement ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3320"},"pull-3320")),(0,n.kt)("li",{parentName:"ul"},"Move ToJSON orphans from cardano-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3338"},"pull-3323")),(0,n.kt)("li",{parentName:"ul"},"Minor OCert improvements ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3327"},"pull-3327")),(0,n.kt)("li",{parentName:"ul"},"Remove duplication ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3341"},"pull-3341")),(0,n.kt)("li",{parentName:"ul"},"Enforce unique elements in CBOR sets ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3331"},"pull-3331")," ")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43ab8474.0e965728.js b/assets/js/43ab8474.0e965728.js new file mode 100644 index 00000000000..2caadf14c8a --- /dev/null +++ b/assets/js/43ab8474.0e965728.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[5106],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function p(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),s=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=s(r),h=n,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||a;return r?o.createElement(m,p(p({ref:t},u),{},{components:r})):o.createElement(m,p({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,p=new Array(a);p[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:n,p[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>p,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var o=r(87462),n=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-10-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},p=void 0,i={permalink:"/cardano-updates/2023-10-15-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-15-network.md",source:"@site/blog/2023-10-15-network.md",title:"Network Team Update",description:"High-level overview of sprint 46",date:"2023-10-15T00:00:00.000Z",formattedDate:"October 15, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.59,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-10-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-18-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-13-hydra"}},l={authorsImageUrls:[void 0]},s=[{value:"High-level overview of sprint 46",id:"high-level-overview-of-sprint-46",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"Towards Typed Protocols 0.2.0.0",id:"towards-typed-protocols-0200",level:3},{value:"Peer Sharing",id:"peer-sharing",level:3},{value:"Tech Debt",id:"tech-debt",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-46"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+46%22"},"sprint 46")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We continued reviewing of bootstrap peers, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4555"},"ouroboros-network#4555"),"."),(0,n.kt)("h3",{id:"towards-typed-protocols-0200"},"Towards Typed Protocols 0.2.0.0"),(0,n.kt)("p",null,"We diagnosed the performance regression of the new design. The work on\n",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols")," will be postponed. For more details see the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/3"},"typed-protocols#3"),". As an outcome of the performance debugging we prepared\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4691"},"PR")," which updates the ",(0,n.kt)("inlineCode",{parentName:"p"},"demo-ping-pong")," and\n",(0,n.kt)("inlineCode",{parentName:"p"},"demo-chain-sync")," applications."),(0,n.kt)("h3",{id:"peer-sharing"},"Peer Sharing"),(0,n.kt)("p",null,"We made progress in review of ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4644"},"ouroboros-network#4644"),", which simplifies the\npeer sharing and fixes the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4642"},"ouroboros-network#4642")," issue."),(0,n.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,n.kt)("p",null,"We reviewed the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3836"},"ouroboros-network#3836")," PR which inspects all the uses of\n",(0,n.kt)("inlineCode",{parentName:"p"},"error")," in ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),". The PR was prepared by Galois."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43bbbae7.8ce14775.js b/assets/js/43bbbae7.8ce14775.js new file mode 100644 index 00000000000..fda01920319 --- /dev/null +++ b/assets/js/43bbbae7.8ce14775.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24310],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>h});var i=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=i.createContext({}),p=function(e){var t=i.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=p(e.components);return i.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=p(a),m=n,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||r;return a?i.createElement(h,l(l({ref:t},s),{},{components:a})):i.createElement(h,l({ref:t},s))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,l=new Array(r);l[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>p});var i=a(87462),n=(a(67294),a(3905));const r={title:"SRE Team Update",slug:"2022-08-12-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2022-08-12-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-sre.md",source:"@site/blog/2022-10-28-sre.md",title:"SRE Team Update",description:"High level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:3.04,hasTruncateMarker:!1,authors:[{name:"Michael Fellinger",title:"SRE Team Lead",url:"https://github.com/manveru",imageURL:"https://github.com/manveru.png",key:"manveru"}],frontMatter:{title:"SRE Team Update",slug:"2022-08-12-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Team Update",permalink:"/cardano-updates/2022-10-28-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-10-27-crypto"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"OpenZiti",id:"openziti",level:3},{value:"Cicero & Tullia Integrations",id:"cicero--tullia-integrations",level:3},{value:"Cicero & Tullia Features",id:"cicero--tullia-features",level:3},{value:"Spongix",id:"spongix",level:3},{value:"Bugs",id:"bugs",level:3}],s={toc:p},c="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,i.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team is heavily working on the Equinix Metal migration, replacing Hydra\nwith Cicero, and a new version of Spongix."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"openziti"},"OpenZiti"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work is ongoing on our OpenZiti integration into Bitte in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte/compare/zt"},"bitte-zt"),"]."),(0,n.kt)("li",{parentName:"ul"},"CI-World deployment of Darwin CI Ziti service in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/commit/d40f4d19187a2128b6f0d63bde7e3f9a33071994"},"ci-world-commit-d40f4d"),"]."),(0,n.kt)("li",{parentName:"ul"},"Multiple issues filed, and a lot of discussion with the OpenZiti developers,\nwe're making pretty rapid progress thanks to them."),(0,n.kt)("li",{parentName:"ul"},"Work on getting Equinix baremetal machines integrated into AWS World Bitte\nclusters utilizing a Ziti ZTNA network overlay to bridge the networking of\nthe two environments and get IAM extension to Equinix machine for Nomad\nclient onboarding."),(0,n.kt)("li",{parentName:"ul"},"A Nix Flake for most of our OpenZiti dependencies including the Console,\nController, Edge Tunnel, and Router is now at [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/johnalotoski/openziti-bins"},"openziti-bins"),"]."),(0,n.kt)("li",{parentName:"ul"},"The Flake also includes a WiP NixOS modules for these components."),(0,n.kt)("li",{parentName:"ul"},"Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with\nno issues seen so far"),(0,n.kt)("li",{parentName:"ul"},"Moved the console to traefik routing service (",(0,n.kt)("inlineCode",{parentName:"li"},"zac.$DOMAIN"),") and\ncontroller/edge router stay at ",(0,n.kt)("inlineCode",{parentName:"li"},"zt.$DOMAIN"),", but have registered consul\nservices")),(0,n.kt)("h3",{id:"cicero--tullia-integrations"},"Cicero & Tullia Integrations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added webhook for [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/haskell.nix"},"haskell.nix"),"]."),(0,n.kt)("li",{parentName:"ul"},"Finished Cicero CI action for [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-addresses/pull/205"},"cardano-addresses-pull-205"),"]."),(0,n.kt)("li",{parentName:"ul"},"Fixed cardano-prelude cicero action in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-prelude/pull/176#issuecomment-1280947946"},"cardano-prelude-pull-176"),"]."),(0,n.kt)("li",{parentName:"ul"},"Fixed the ",(0,n.kt)("inlineCode",{parentName:"li"},"abcird-stdlib/publish")," action [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc/pull/104"},"abcirdc-pull-104"),"]"),(0,n.kt)("li",{parentName:"ul"},"fix error on vm-bigdisk flake configs [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cicero/pull/66"},"cicero-pull-66"),"]."),(0,n.kt)("li",{parentName:"ul"},"Helped with Cicero actions and answered questions for [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus"},"plutus"),"]\n[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-prelude"},"cardano-prelude"),"], and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc"},"abcirdc"),"]."),(0,n.kt)("li",{parentName:"ul"},"Merged [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/323"},"cardano-base-pull-323"),"] for Tullia on cardano-base."),(0,n.kt)("li",{parentName:"ul"},"Merged Cicero action in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ogmios/pull/5"},"cardano-ogmios-pull-5"),"]."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-explorer-app/pull/427"},"cardano-explorer-app-pull-427"),"] to add Tullia and Cicero."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3097"},"cardano-ledger-pull-3097"),"] to add Cicero CI action."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4489"},"cardano-node-pull-4489"),"] to add Tullia and Cicero, including\nOS-agnostic jobs."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4108"},"ouroboros-network-pull-4108"),"] to add Cicero action."),(0,n.kt)("li",{parentName:"ul"},"Reviewed [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus/pull/4918"},"plutus-pull-4918"),"] and helped test it."),(0,n.kt)("li",{parentName:"ul"},"Update Tullia in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc/pull/97"},"abcirdc-pull-97"),"] to build if a tag is given.")),(0,n.kt)("h3",{id:"cicero--tullia-features"},"Cicero & Tullia Features"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improvements to Tullia task aggregation to make [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-addresses"},"cardano-addresses"),"] build\ncorrectly."),(0,n.kt)("li",{parentName:"ul"},"Better tullia CUE lib default for tags [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/tullia/commit/4df3c5d956f1b062b950643da12768ae71acf245"},"tullia-commit-4df3c5d"),"]."),(0,n.kt)("li",{parentName:"ul"},"Put ",(0,n.kt)("inlineCode",{parentName:"li"},"cache.nixos.org")," back in ",(0,n.kt)("inlineCode",{parentName:"li"},"cache.iog.io"),"'s upstreams. This is now\nconsidered a public cache again, and without it some Cicero evaluations had\nto build huge packages."),(0,n.kt)("li",{parentName:"ul"},"Started working on a flake-parts module for Tullia."),(0,n.kt)("li",{parentName:"ul"},"Started working on cutting down Tullia task build time by putting facts in\nJSON files."),(0,n.kt)("li",{parentName:"ul"},"Fixed running into kernel arg limit by reading tullia's DAG from a file"),(0,n.kt)("li",{parentName:"ul"},"Merged [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/tullia/pull/9"},"tullia-pull-9"),"] that fixes several issues related to error reporting.\nand escaping."),(0,n.kt)("li",{parentName:"ul"},"Added Mac builders in Cicero on CI-World."),(0,n.kt)("li",{parentName:"ul"},"Started work on Tullia invocation caching.")),(0,n.kt)("h3",{id:"spongix"},"Spongix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A lot of progress on an SQlite backed version of Spongix, it already supports\nthe full HTTP binary cache protocol but still lacks comprehensive testing and\nsome tuning, as well as recursive lookups."),(0,n.kt)("li",{parentName:"ul"},"First steps in the implementation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"nix-daemon")," ",(0,n.kt)("inlineCode",{parentName:"li"},"ssh-ng")," protocol so\nSpongix can be used via SSH and we can get rid of basic auth.")),(0,n.kt)("h3",{id:"bugs"},"Bugs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Discovered Cicero bug where Nomad reschedules cause the Github commit status\nto get stuck in ",(0,n.kt)("inlineCode",{parentName:"li"},"pending")),(0,n.kt)("li",{parentName:"ul"},"Discovered Cicero race condition bug around concurrent transactions for\ncodependent actions."),(0,n.kt)("li",{parentName:"ul"},"Fixed tullia task order bug in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-addresses"},"cardano-addresses"),"]"),(0,n.kt)("li",{parentName:"ul"},"Diagnose Cicero action not triggered in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc"},"abcirdc"),"]"),(0,n.kt)("li",{parentName:"ul"},"Fixed meta/description of the Tullia package in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/tullia/pull/7"},"tullia-pull-7"),"]"),(0,n.kt)("li",{parentName:"ul"},"Add Vault token loop alerts in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte-cells/pull/40"},"bitte-cells-pull-40"),"]"),(0,n.kt)("li",{parentName:"ul"},"Ongoing investigation on recurring Patroni and nomad-follower issues related\nto token rotation.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/444dad87.29aa76a0.js b/assets/js/444dad87.29aa76a0.js new file mode 100644 index 00000000000..f003c8d9dcd --- /dev/null +++ b/assets/js/444dad87.29aa76a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33815],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var l=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,l)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var u=l.createContext({}),p=function(e){var t=l.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=p(e.components);return l.createElement(u.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},c=l.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,u=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(a),c=r,h=d["".concat(u,".").concat(c)]||d[c]||s[c]||n;return a?l.createElement(h,i(i({ref:t},m),{},{components:a})):l.createElement(h,i({ref:t},m))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,i=new Array(n);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>s,frontMatter:()=>n,metadata:()=>o,toc:()=>p});var l=a(87462),r=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-08-04-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-08-04-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-ledger.md",source:"@site/blog/2023-08-04-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.915,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-08-04-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-04-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-04-network"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway progress",id:"conway-progress",level:3},{value:"Testing",id:"testing",level:3},{value:"Bugfixes",id:"bugfixes",level:3},{value:"Plutus integration",id:"plutus-integration",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],m={toc:p},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,l.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The ledger team was working almost exclusively on the Conway era implementation. In\nparticular, the main focus was directed towards solidifying transaction related types and\ntheir binary representation. We also directed some effort into unblocking Plutus team with\nrespect to PlutusV3 integration."),(0,r.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,r.kt)("h3",{id:"conway-progress"},"Conway progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3552"},"pull-3552")," - Allow Constitutional Committee Hot Key to be ScriptHash"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3581"},"pull-3581")," - Make Constitutional Committee Cold Key to be ScriptHash"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3571"},"pull-3571")," - Implement a portion of the TICKF rule."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3556"},"pull-3556")," - Add Script to Constitution"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3576"},"pull-3576")," - Add optional Anchor to ConwayRegDRep certificate"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3495"},"pull-3495")," - Implement refund logic for Proposal deposits"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3579"},"pull-3579")," - Change voting procedure in the transaction to a nested Map"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3585"},"pull-3585")," - Rename ",(0,r.kt)("inlineCode",{parentName:"li"},"CommitteeCert")," into a ",(0,r.kt)("inlineCode",{parentName:"li"},"GovCert")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3587"},"pull-3587")," - Remove ",(0,r.kt)("inlineCode",{parentName:"li"},"DelegStakeTxCert")," from the ",(0,r.kt)("inlineCode",{parentName:"li"},"COMPLETE")," pragma for ",(0,r.kt)("inlineCode",{parentName:"li"},"TxCert")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3586"},"pull-3586")," - Add ",(0,r.kt)("inlineCode",{parentName:"li"},"CurrentTreasuryValue")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"TxBody")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3588"},"pull-3588")," - Rename key roles"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3557"},"pull-3557")," - Update ",(0,r.kt)("inlineCode",{parentName:"li"},"NewCommittee")," action to use ",(0,r.kt)("inlineCode",{parentName:"li"},"RewardAcnt")," and add more info"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3595"},"pull-3595")," - Add ",(0,r.kt)("inlineCode",{parentName:"li"},"ConwayUpdateDRep")," constructor to ConwayTxCertGov type"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3600"},"pull-3600")," - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3597"},"pull-3597")," - Update ",(0,r.kt)("inlineCode",{parentName:"li"},"ProposalProcedure")," return address to be a ",(0,r.kt)("inlineCode",{parentName:"li"},"RewardAcnt"))),(0,r.kt)("h3",{id:"testing"},"Testing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3374"},"pull-3374")," - New features for generation subject to constraints"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3519"},"pull-3519")," - Basic Conway features test")),(0,r.kt)("h3",{id:"bugfixes"},"Bugfixes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3566"},"pull-3566")," - Mint field translation bugfix.")),(0,r.kt)("h3",{id:"plutus-integration"},"Plutus integration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3538"},"issue-3538")," - A fairly complete specification was created for the PlutusV3 context"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3593"},"pull-3593")," - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality")),(0,r.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3574"},"pull-3574")," - Improve clarity and performance of collateral Non-ADA validation:"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3573"},"pull-3573")," - Update top-level ",(0,r.kt)("inlineCode",{parentName:"li"},"CHANGELOG.md")," with cardano-node relevant changes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3555"},"pull-3555")," - Bump pygments from 2.12.0 to 2.15.0 in /doc"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3575"},"pull-3575")," - Bump certifi from 2022.12.7 to 2023.7.22 in /doc"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3567"},"pull-3567")," - Backport mint field translation bugfix"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3568"},"pull-3568")," - Fixed typo in byron ledger spec"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3572"},"pull-3572")," - Release/backport tickf bugfix")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44642b2f.9ca08045.js b/assets/js/44642b2f.9ca08045.js new file mode 100644 index 00000000000..1c64432df82 --- /dev/null +++ b/assets/js/44642b2f.9ca08045.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43108],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=p(a),m=n,d=h["".concat(u,".").concat(m)]||h[m]||c[m]||i;return a?r.createElement(d,o(o({ref:t},s),{},{components:a})):r.createElement(d,o({ref:t},s))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-02-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-10-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-10-hydra.md",source:"@site/blog/2023-02-10-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-10T00:00:00.000Z",formattedDate:"February 10, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.14,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-02-17-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-09-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team closed several gaps to align the Hydra scripts\nimplementation further with the specification. This also resulted in a slight\nimprovement on Hydra script size and costs. They consequently analysed the\nasymptotic complexity of collect and fanout and how they relate. Also plutus-tx\nprofiling toolchain was evaluated and set up for future improvements on Hydra\non-chain performance. In discussions with researchers and internal auditors,\nthey also uncovered next steps on further securing the Head protocl using a\n"full" minting policy.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Closed several gaps to align script implementation with specification ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/452"},"#452"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Allow contest only once ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/680"},"#680")),(0,n.kt)("li",{parentName:"ul"},"Optimization through head output at index 0 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/700"},"#700")),(0,n.kt)("li",{parentName:"ul"},"Value is preserved ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/702"},"#702")," + optimized exact value equality ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/709"},"#709")))),(0,n.kt)("li",{parentName:"ul"},"Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/721"},"#721"),(0,n.kt)("img",{parentName:"li",src:"https://user-images.githubusercontent.com/2621189/218124686-7a85b40d-12f7-4b00-ad16-128c99f5b707.png",alt:null})),(0,n.kt)("li",{parentName:"ul"},"Fixed our tooling around the Haskell language server"),(0,n.kt)("li",{parentName:"ul"},"Discussed full minting policy with researchers"),(0,n.kt)("li",{parentName:"ul"},"Started grooming \u201cwhat we need for mainnet\u201d on ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"this")," idea ticket and ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/milestone/8"},"milestone"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement full minting policy"),(0,n.kt)("li",{parentName:"ul"},"All remaining protocol discrepancies are implemented or groomed as individual features"),(0,n.kt)("li",{parentName:"ul"},"Ideally release 0.9.0 with updated scripts"),(0,n.kt)("li",{parentName:"ul"},"Discuss what we need for mainnet (milestone planning)"),(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs for specification (upon feedback)")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44e33f80.842bca3f.js b/assets/js/44e33f80.842bca3f.js new file mode 100644 index 00000000000..9a8edcb6f99 --- /dev/null +++ b/assets/js/44e33f80.842bca3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31636],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(r),m=i,d=c["".concat(s,".").concat(m)]||c[m]||h[m]||a;return r?n.createElement(d,o(o({ref:t},u),{},{components:r})):n.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var n=r(87462),i=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-11-08-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-08-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-08-mithril.md",source:"@site/blog/2023-11-08-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-08T00:00:00.000Z",formattedDate:"November 8, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.805,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-08-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-08-ledger"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-01-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},c="wrapper";function h(e){let{components:t,...r}=e;return(0,i.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files."),(0,i.kt)("p",null,"Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Prototype a P2P relay with ",(0,i.kt)("inlineCode",{parentName:"strong"},"libp2p"))," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,i.kt)("inlineCode",{parentName:"strong"},"mithril-client")," library")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1311"},"#1311")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Client Docker package is incorrect")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1322"},"#1322"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/459dd1ef.7604d487.js b/assets/js/459dd1ef.7604d487.js new file mode 100644 index 00000000000..61792a86f7a --- /dev/null +++ b/assets/js/459dd1ef.7604d487.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67825],{41867:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/tags/consensus","allTagsPath":"/cardano-updates/tags","count":32}')}}]); \ No newline at end of file diff --git a/assets/js/45a10ae8.de178977.js b/assets/js/45a10ae8.de178977.js new file mode 100644 index 00000000000..8a24165e21b --- /dev/null +++ b/assets/js/45a10ae8.de178977.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22206],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},d=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(r),m=n,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||o;return r?a.createElement(h,l(l({ref:t},d),{},{components:r})):a.createElement(h,l({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"SRE Team Update",slug:"2023-07-07-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-07-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-sre.md",source:"@site/blog/2023-07-07-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.815,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-07-07-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-07-hydra"},nextItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-07-06-developer-experience"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ogmios",id:"cardano-ogmios",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-rosetta",id:"cardano-rosetta",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Spongix",id:"spongix",level:3}],d={toc:u},c="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment"),(0,n.kt)("li",{parentName:"ul"},"Explorer component updates"),(0,n.kt)("li",{parentName:"ul"},"Spongix caching server rewrite for R2 Cloudflare support and various performance improvements")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Nixos service update to enable non-systemd socket activation multi-node relays: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5360"},"cardano-node-pull-5360"))),(0,n.kt)("h3",{id:"cardano-ogmios"},"Cardano-ogmios"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano ogmios bump to 5.6.0 for nixos service: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ogmios/pull/6"},"cardano-ogmios-pull-6"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/88a17c9...dfde751"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-rosetta"},"Cardano-rosetta"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-rosetta nixos modifications for rosetta 2.1.0 service: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/cardano-rosetta/pull/532"},"cardano-rosetta-pull-532"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-node entrypoint improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/99"},"cardano-world-pull-99")),(0,n.kt)("li",{parentName:"ul"},"Further automate pool performance SQL query: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/100"},"cardano-world-pull-100")),(0,n.kt)("li",{parentName:"ul"},"Performance and benchmark job related tweaks: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/02f1ba424d3e36bd114df6f53b769d2cd25301c3"},"cardano-world-commit")),(0,n.kt)("li",{parentName:"ul"},"Explorer related component version bumps and traefik definition handline: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/101"},"cardano-world-pull-101"))),(0,n.kt)("h3",{id:"spongix"},"Spongix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/spongix/compare/afd77728f5823d61732425df52a363949096e163...4890ff93308f45584bea8443cc13fbc16c8ce911"},"spongix-simple-branch"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/469935bd.daaef810.js b/assets/js/469935bd.daaef810.js new file mode 100644 index 00000000000..c46a0916139 --- /dev/null +++ b/assets/js/469935bd.daaef810.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47605],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(n),c=o,m=d["".concat(l,".").concat(c)]||d[c]||h[c]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:o,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var r=n(87462),o=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-09-01-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-09-01-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-network.md",source:"@site/blog/2023-09-01-network.md",title:"Network Team Update",description:"High-level overview of sprint 43",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.765,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-09-01-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-01-ledger"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-01-sre"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level overview of sprint 43",id:"high-level-overview-of-sprint-43",level:2},{value:"Progress on P2P addoption",id:"progress-on-p2p-addoption",level:3},{value:"SPO relays",id:"spo-relays",level:4},{value:"IOG relays",id:"iog-relays",level:4},{value:"Detailed description",id:"detailed-description",level:2},{value:"Peer Sharing",id:"peer-sharing",level:2},{value:"Async Demotion Test Fix",id:"async-demotion-test-fix",level:2}],u={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,o.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-overview-of-sprint-43"},"High-level overview of ",(0,o.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+43%22"},"sprint 43")),(0,o.kt)("p",null,"In this sprint, we received contributions from ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF")," & ",(0,o.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois"),". Karl Knutsson\n(",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF"),") has addressed various issues regarding peer churning in P2P, timeouts\nand our ",(0,o.kt)("inlineCode",{parentName:"p"},"WireShark")," dissector. While the ",(0,o.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois")," developers focused on\naddressing issues from their review last year. See below for more details."),(0,o.kt)("p",null,"We continued working on bootstrap peers ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661"),"."),(0,o.kt)("p",null,"We refactored our test suites: they are split into ",(0,o.kt)("inlineCode",{parentName:"p"},"io-tests")," which require to\nbe run natively on all platforms (these tests mostly contain tests that\nrequire ",(0,o.kt)("inlineCode",{parentName:"p"},"IO")," system calls) and ",(0,o.kt)("inlineCode",{parentName:"p"},"sim-tests")," which are platform independent. We\nrun ",(0,o.kt)("inlineCode",{parentName:"p"},"io-tests")," on all supported platforms (e.g. ",(0,o.kt)("inlineCode",{parentName:"p"},"x86_64-linux"),",\n",(0,o.kt)("inlineCode",{parentName:"p"},"x86-64-darwin"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"aarch64-darwin")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"x86_64-w64-mingw32")," (Windows)) natively.\nThe ",(0,o.kt)("inlineCode",{parentName:"p"},"sim-tests")," are not executed on ",(0,o.kt)("inlineCode",{parentName:"p"},"Windows")," due to memory limitations on\nGitHub Actions runners. ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4653"},"ouroboros-network-#4653")),(0,o.kt)("p",null,"We also started rebasing ",(0,o.kt)("inlineCode",{parentName:"p"},"typed-protocols")," refactoring branches."),(0,o.kt)("p",null,"Marcin was appointed as the ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," release engineer for the ",(0,o.kt)("inlineCode",{parentName:"p"},"8.4.0-pre"),"\nversion. So far he integrated ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger-conway-1.8")," and\n",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.9.1.0")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli")," and\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-api"),". Once we will have an integration branch for ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node"),",\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger-conway-1.8")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," packages can be released\nto ",(0,o.kt)("inlineCode",{parentName:"p"},"CHaP")," and PRs can be merged once they go through review & CI."),(0,o.kt)("p",null,"We also fixed some smaller issues regarding peer sharing (both were discovered\nby Karl from ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF"),"). More details are included below."),(0,o.kt)("h3",{id:"progress-on-p2p-addoption"},"Progress on P2P addoption"),(0,o.kt)("h4",{id:"spo-relays"},"SPO relays"),(0,o.kt)("p",null,"There are currently ~2000 relays running P2P\nenabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On\n16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil\nAda."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"P2P relays",src:n(86597).Z,width:"2034",height:"1588"})),(0,o.kt)("p",null,"The following graphs show several different versions of relays running on the mainnet. The\ngreen line ",(0,o.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionV10.True")," denotes P2P relays, which slowly\nincrease over time. The ",(0,o.kt)("inlineCode",{parentName:"p"},"V9")," and earlier versions of the ",(0,o.kt)("inlineCode",{parentName:"p"},"node-to-node"),"\nthe protocol indicates nodes version ",(0,o.kt)("inlineCode",{parentName:"p"},"1.35.x")," or earlier.\n",(0,o.kt)("img",{alt:"node versions",src:n(31567).Z,width:"2038",height:"1594"})),(0,o.kt)("p",null,"Data has been kindly provided by ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF")," and their mainnet monitoring\ninfrastructure."),(0,o.kt)("h4",{id:"iog-relays"},"IOG relays"),(0,o.kt)("p",null,"As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all\nIOG relays will be running P2P."),(0,o.kt)("h2",{id:"detailed-description"},"Detailed description"),(0,o.kt)("p",null,"In this sprint, we got a few contributions from ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF"),":"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Karl made peer churning mechanism less aggressive ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4656"},"ouroboros-network-#4656"),"; and"),(0,o.kt)("li",{parentName:"ul"},"he added timeouts for idle states in ",(0,o.kt)("inlineCode",{parentName:"li"},"ChainSync")," & ",(0,o.kt)("inlineCode",{parentName:"li"},"KeepAlive"),"\nminiprotocols. These timeouts help a node remove idle connections from the\nresponder (server) side ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4648"},"ouroboros-network-#4648"),"."),(0,o.kt)("li",{parentName:"ul"},"he improved the ",(0,o.kt)("inlineCode",{parentName:"li"},"WireShark")," dissector by adding support for the ",(0,o.kt)("inlineCode",{parentName:"li"},"peer-sharing")," mini-protocol ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4656"},"ouroboros-network-#4656"),".")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois")," has been making progress in addressing some of the issues they raised in their review (last year):"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Mark Tullsen (",(0,o.kt)("a",{parentName:"li",href:"https://galois.com/"},"Galois"),") has been working on refactoring the main entry function of P2P ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661")," (in review);"),(0,o.kt)("li",{parentName:"ul"},"Sam Cowger (",(0,o.kt)("a",{parentName:"li",href:"https://galois.com/"},"Galois"),") has been reviewing all use cases of ",(0,o.kt)("inlineCode",{parentName:"li"},"error")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"unsafe")," calls\n",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661")," (in review).")),(0,o.kt)("h2",{id:"peer-sharing"},"Peer Sharing"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Light peer sharing is only enabled when peer sharing is turned on ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4652"},"ouroboros-network-#4652"),";"),(0,o.kt)("li",{parentName:"ul"},"Handshake incorrectly reports peer sharing value. It's supposed to relay the\nremote value, but instead, it returns the local value. ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4642"},"ouroboros-network-#4642")," (in review).")),(0,o.kt)("h2",{id:"async-demotion-test-fix"},"Async Demotion Test Fix"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We fixed an async demotion test failure which turned out to be a weakness of\nthe test itself rather than a bug in the connection manager. ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4655"},"ouroboros-network-#4655"))))}h.isMDXComponent=!0},86597:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/2023-08-31-p2p-relays-8e5be189ad8437375c5067026c003556.png"},31567:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/2023-08-31-relay-versions-0a8d445e1b0f3a793ccdd94f4aacd421.png"}}]); \ No newline at end of file diff --git a/assets/js/46c51ef6.7652a0cc.js b/assets/js/46c51ef6.7652a0cc.js new file mode 100644 index 00000000000..2dadcc43dca --- /dev/null +++ b/assets/js/46c51ef6.7652a0cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[28298],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(n),c=a,h=m["".concat(s,".").concat(c)]||m[c]||d[c]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"Network Team Update",slug:"2022-11-09-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2022-11-09-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-09-network.md",source:"@site/quarterly/2022-11-09-network.md",title:"Network Team Update",description:"Network Quarterly Update",date:"2022-11-09T00:00:00.000Z",formattedDate:"November 9, 2022",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:3.87,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-11-09-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2022-11-15-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2022-11-07-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"Network Quarterly Update",id:"network-quarterly-update",level:2},{value:"2022-09 - 2022-11",id:"2022-09---2022-11",level:2},{value:"Summary of most important improvements",id:"summary-of-most-important-improvements",level:3},{value:"Detailed log",id:"detailed-log",level:3},{value:"Next quarter",id:"next-quarter",level:2}],u={toc:p},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"network-quarterly-update"},"Network Quarterly Update"),(0,a.kt)("h2",{id:"2022-09---2022-11"},"2022-09 - 2022-11"),(0,a.kt)("h3",{id:"summary-of-most-important-improvements"},"Summary of most important improvements"),(0,a.kt)("p",null,"During this quarter the networking team delivered low level specification of\npeer sharing & eclipse evasion. We held a session with the consensus & the\nscientists; we got a positive feedback on the design."),(0,a.kt)("p",null,"Further we focused on implementation of peer sharing. We produced a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/wiki/Peer-Sharing-Implementation-Plan"},"detail\ndesign")," and an ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"early implementation"),"."),(0,a.kt)("p",null,"We prepared the ",(0,a.kt)("em",{parentName:"p"},"P2P Single Relay Release")," (",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node-1.35.5"),"). It\nincludes over ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4120"},"130 patches")," of network stack improvements over the\nprevious version ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.4"),", which were accomplished over a longer period of\ntime. Among them are both bug fixes and UX improvements for stake pool\noperators like simplified format of the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4563"},"topology file"),", or\nimprovements in the logged messages:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4015"},"tracing of early consensus exceptions")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4127"},"tracing of demotion of local root peers")," (traced with\n",(0,a.kt)("inlineCode",{parentName:"li"},"Warning")," severity), the trace is called ",(0,a.kt)("inlineCode",{parentName:"li"},"TraceDemoteLocalAsynchronous"),", in\n",(0,a.kt)("inlineCode",{parentName:"li"},"json")," format it is encoded as ",(0,a.kt)("inlineCode",{parentName:"li"},"DemoteLocalAsynchronous"),". For an SPO\ntracking these demotion is vital (such demotion could indicate that a block\nproducer is no longer connected to its relays or vice versa)")),(0,a.kt)("p",null,"We also provide better integration with ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3979"},"systemd")," (socket\nactivation improvements) or improvements in the networking stack:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3785"},"exit policies"),","),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3915"},"peer metrics improvements"),","),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4106"},"DNS TTL")," improvements (which make it harder to misconfigure the\nsystem, an issue discovered by the performance & monitoring team),"),(0,a.kt)("li",{parentName:"ul"},"do not trigger inbound idle timeout for ",(0,a.kt)("inlineCode",{parentName:"li"},"node-to-client")," connections (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3844"},"pr\n#3844"),"), an issue reported to us by Matthias Benkort from\nCardano Foundation.")),(0,a.kt)("p",null,"Duncan has been making progress with the input endorsers demo. His simulation\nprovides a useful animated visualisation and live quantification of behaviour\nof the modeled design."),(0,a.kt)("p",null,"We also improved our e2e diffusion simulation by implementing header-body\nsplit, similar to what the real implementation does."),(0,a.kt)("p",null,"We also made some advances towards our future goals of P2P release for block\nproducer nodes (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3800"},"pr #3800")," - in review) & for Daedalus users\n(",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3968"},"pr #3690")," - merged)."),(0,a.kt)("h3",{id:"detailed-log"},"Detailed log"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We expanded diffusion simulation with block-fetch protocol bringing it closer\nto the production system.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We addressed some additional technical depth in diffusion simulation")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We slightly improved documentation & CI of io-sim and typed-protocols\nrepositories for open-source contributors.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We closed a number of issues towards publishing io-sim on Hackage (only two\nessential issues are left open).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We pushed a branch of typed-protocols which captures one of the developer UX\nproblems in the API which we need to solve.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified and fixed an issue related to systemd sockets.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified and fixed an issue in consensus initialisation not giving\nfeedback on early errors.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We deployed RT View, identified a number of issues which were communicated to\nthe performance & monitoring team.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We finished high level & detailed design of peer sharing, very early\nimplementation of peer sharing is done (note that peer sharing cannot be\nsafely deployed without eclipse evasion & genesis).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We finished high level design of eclipse evasion, and started working on\na detailed design.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We were assigned the role of release engineer for 1.35.5 release (the P2P\nsingle relay release); we prepared a cardano-node for 1.35.5 release which\ncontains more than 130 patches of just network stack improvements done over\nlast few months.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We diagnosed and fixed an tricky bug in the peer state actions (a component\nwhich sits between outbound governor and connection manager). That bug was\nintroduced earlier this year and never released. It was caught by the QA\ntesting framework. We expanded our diffusion simulation to cover such case and\nalso mitigated a chance for reintroducing such a bug in future.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified and quite likely mitigated a misconfiguration in the\nbenchmarking cluster (next benchmarking run will confirm our hypothesis).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We simplified the format of p2p topology file, we got positive feedback from\nSPOs.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We raised severities of some of the logging messages, which is an important\nimprovement for SPOs, exchanges and other users of the system.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We worked on input endorsers simulation which gives both animated and\nquantified live feedback on network operation, using a simplified model of\na TCP/IP network. "))),(0,a.kt)("h2",{id:"next-quarter"},"Next quarter"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Release the Single Relay P2P Release ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.5"),".")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Carry on with Peer Sharing (review, testing).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Deliver a talk at ",(0,a.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/"},"Conference on Principles of Distributed Systems 2022")," in Brussels, Belgium.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Present Detailed Design of Eclipse Evasion and start implementation phase.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Work on P2P Block Producer release.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Carry on with publishing of ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," on ",(0,a.kt)("inlineCode",{parentName:"p"},"Hackage"),"."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/46d9aab0.40f77729.js b/assets/js/46d9aab0.40f77729.js new file mode 100644 index 00000000000..fb115a51274 --- /dev/null +++ b/assets/js/46d9aab0.40f77729.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40373],{25545:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/4735cd81.21fed183.js b/assets/js/4735cd81.21fed183.js new file mode 100644 index 00000000000..5cf992280f1 --- /dev/null +++ b/assets/js/4735cd81.21fed183.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15529],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(h,i(i({ref:t},s),{},{components:r})):n.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"Network Team Update",slug:"2023-01-20-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-01-20-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-network.md",source:"@site/blog/2023-01-20-network.md",title:"Network Team Update",description:"High level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"},{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:1.045,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-01-20-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-20-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-01-20-sre"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have been working towards ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node-1.35.5")," release. QA & benchmarking\nteams gave a green light for the release, and we made decent progress with some\nCI problem which we encountered on the way (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4612"},"PR #4612"),"). We are also working on\npeer sharing, making improvements in our testing infrastructure, reducing\ntechnical debt and making progress towards ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim-1.0.0.0"),". Galois is making\nprogress on Handshake improvements."),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("p",null,"Our diffusion simulation network now includes a mixed network of ",(0,a.kt)("inlineCode",{parentName:"p"},"initiator\nonly")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"initiator and responder")," nodes. ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4222"},"issue #4222")),(0,a.kt)("p",null,"We are now reviewing the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"peer sharing pull request"),"."),(0,a.kt)("p",null,"We are also reviewing pull request which introduces handshake query flag. ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"PR #4256")),(0,a.kt)("p",null,"We fixed a bug in our network simulator. The bug was triggered when a node\ndied when performing a simultaneous TCP open (a corner case of a corner case!). ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4265"},"PR #4265")),(0,a.kt)("p",null,"We also refactored ",(0,a.kt)("inlineCode",{parentName:"p"},"Snocket")," interface and removed the bearer construction from\nits methods. ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4260"},"PR #4260")),(0,a.kt)("p",null,"We are working towards releasing ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim-1.0.0.0")," on Hackage, which includes\nreviewing two PRs: ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"PR #57")," and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/60"},"PR #60")," as well as writing an announcement\nblog post. "))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/47658b82.e1d6cb38.js b/assets/js/47658b82.e1d6cb38.js new file mode 100644 index 00000000000..e32e0440bc8 --- /dev/null +++ b/assets/js/47658b82.e1d6cb38.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60263],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(s,".").concat(m)]||p[m]||d[m]||i;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:a,o[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-04-05-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-04-05-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-performance-and-tracing.md",source:"@site/blog/2023-04-05-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.",date:"2023-04-05T00:00:00.000Z",formattedDate:"April 5, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.33,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-04-05-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-05-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-31-crypto"}},s={authorsImageUrls:[void 0]},c=[{value:"General",id:"general",level:3},{value:"Plutus library",id:"plutus-library",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We worked on adjusting our infrastructure to the new ",(0,a.kt)("inlineCode",{parentName:"li"},"8.0")," release branch and performed a (very) early run."),(0,a.kt)("li",{parentName:"ul"},"New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.")),(0,a.kt)("h1",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"We have adapted our benchmarking cluster to the requirements of the ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0")," release branch. Testing runs of a very early feature branch for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0"),"\nhelped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0")," soon."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very\ndetailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing\nthe highest possible throughput of data for forwarding to ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer"),". "),(0,a.kt)("p",null,"Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions\nfor tunneling trace forwarding from a node to ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," via an easy to manage system service, which will match the production setup of most users."),(0,a.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,a.kt)("h3",{id:"general"},"General"),(0,a.kt)("p",null,"Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance\nanalysis can be fed back and serve as an additional point of comparison."),(0,a.kt)("p",null,"Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations."),(0,a.kt)("h3",{id:"plutus-library"},"Plutus library"),(0,a.kt)("p",null,"We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles.\nThis will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile.\nIt is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is\nbeing improved to minimize any friction for the backend user."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/47cae651.5e63cd4e.js b/assets/js/47cae651.5e63cd4e.js new file mode 100644 index 00000000000..3b35033c3a3 --- /dev/null +++ b/assets/js/47cae651.5e63cd4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68352],{81765:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/2","page":2,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/","nextPage":"/cardano-updates/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/47da279e.0dc7a732.js b/assets/js/47da279e.0dc7a732.js new file mode 100644 index 00000000000..172dc8cc27d --- /dev/null +++ b/assets/js/47da279e.0dc7a732.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6236],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(r),m=n,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||o;return r?a.createElement(h,i(i({ref:t},d),{},{components:r})):a.createElement(h,i({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"SRE Team Update",slug:"2023-06-23-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-23-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-sre.md",source:"@site/blog/2023-06-23-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.98,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-06-23-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-23-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-16-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Ci-ops",id:"ci-ops",level:3},{value:"Ci-world",id:"ci-world",level:3},{value:"Devx-ci",id:"devx-ci",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3}],d={toc:u},c="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality"),(0,n.kt)("li",{parentName:"ul"},"Cardano Sanchonet environment was stood up to test Conway era functionality"),(0,n.kt)("li",{parentName:"ul"},"Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case"),(0,n.kt)("li",{parentName:"ul"},"Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5318"},"cardano-node-pull-5318"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates required for node 8.1.1 nixos service: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/pull/414"},"cardano-ops-pull-414")),(0,n.kt)("li",{parentName:"ul"},"Work in progress continues on mixed legacy and p2p topology clusters in cardano-ops: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/tree/ops-local"},"cardano-ops-ops-local"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/tree/mn-mixed-p2p"},"cardano-ops-mn-mixed-p2p"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add Sanchonet environment: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/96"},"cardano-world-pull-96"))),(0,n.kt)("h3",{id:"ci-ops"},"Ci-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add devx-ci cluster integration for legacy darwin ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-ops/compare/b158b17...ed875b9"},"ci-ops-compare"))),(0,n.kt)("h3",{id:"ci-world"},"Ci-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/compare/840cdb6...b08c250"},"ci-world-compare"))),(0,n.kt)("h3",{id:"devx-ci"},"Devx-ci"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/devx-ci"},"devx-ci-repo"))),(0,n.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add Sanchonet environment: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/545"},"iohk-nix-pull-545"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/48292e37.4e1a58d5.js b/assets/js/48292e37.4e1a58d5.js new file mode 100644 index 00000000000..31f71b517cf --- /dev/null +++ b/assets/js/48292e37.4e1a58d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18367],{8448:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/ledger/page/5","page":5,"postsPerPage":5,"totalPages":6,"totalCount":30,"previousPage":"/cardano-updates/tags/ledger/page/4","nextPage":"/cardano-updates/tags/ledger/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/485c7377.08d81db4.js b/assets/js/485c7377.08d81db4.js new file mode 100644 index 00000000000..9ef89500153 --- /dev/null +++ b/assets/js/485c7377.08d81db4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7322],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),l=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(r),m=n,d=c["".concat(p,".").concat(m)]||c[m]||h[m]||o;return r?a.createElement(d,i(i({ref:t},u),{},{components:r})):a.createElement(d,i({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:n,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=r(87462),n=(r(67294),r(3905));const o={title:"Open-Source Team",slug:"2022-10-31-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-10-31-open-source",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-open-source.md",source:"@site/blog/2022-11-04-open-source.md",title:"Open-Source Team",description:"High Level Summary",date:"2022-11-04T00:00:00.000Z",formattedDate:"November 4, 2022",tags:[{label:"open-source",permalink:"/cardano-updates/tags/open-source"}],readingTime:1.465,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Open-Source Team",slug:"2022-10-31-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-04-mithril"},nextItem:{title:"Embedding Quality Workstream",permalink:"/cardano-updates/2022-11-03-embedding-quality"}},p={authorsImageUrls:[void 0]},l=[{value:"High Level Summary",id:"high-level-summary",level:2},{value:"Detailed description",id:"detailed-description",level:2}],u={toc:l},c="wrapper";function h(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High Level Summary"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We've been working toward publishing ",(0,n.kt)("em",{parentName:"li"},"Cardano Backlog"),", currently its in\nreview by the IOG communication team."),(0,n.kt)("li",{parentName:"ul"},"We identified a number of libraries which can be published."),(0,n.kt)("li",{parentName:"ul"},"We setup and enhanced ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-updates"},"cardano-updates"),".")),(0,n.kt)("h2",{id:"detailed-description"},"Detailed description"),(0,n.kt)("p",null,"I am glad to announce that I was given the role of open-source advocate for\ncardano project. In last few weeks we were making steps towards publishing our\nbacklog. It's currently under review by the communication team, although most\nof the issues are already visible across various repositories."),(0,n.kt)("p",null,"The open-source initiatives have their own\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/60"},"project"),". It is set up\nto help us track our major open-source activities. Right now there are two\nwork streams:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"the work on ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},(0,n.kt)("em",{parentName:"a"},"Cardano Engineering Handbook")),";"),(0,n.kt)("li",{parentName:"ul"},"libraries to be release on ",(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/"},"Hackage")," or ",(0,n.kt)("a",{parentName:"li",href:"https://crates.io"},"crates.io"),".")),(0,n.kt)("p",null,"We identifies a number of libraries across all the teams which contribute to\n",(0,n.kt)("em",{parentName:"p"},"Cardano")," which we would like publish to publish, see the following\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/60/views/3"},"link"),". Arnauld Bailly recently published\n",(0,n.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/quickcheck-dynamic"},(0,n.kt)("inlineCode",{parentName:"a"},"quickcheck-dynamic")),"\nlibrary on Hackage. The networking team is slowly progressing towards\npublishing ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim"},"io-sim")," and related packages, checkout the progress\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/19/views/24"},"here"),"."),(0,n.kt)("p",null,"Thanks to Arnaud Bailly our ",(0,n.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-updates"},"Cardano Updates")," website has\na new look & feel! It's using ",(0,n.kt)("a",{parentName:"p",href:"https://docusaurus.io"},"docusaurus.io"),"."),(0,n.kt)("p",null,"Christian Taylor carried recently a detailed analysis of our open-source\nrepositories. He collected many interesting metrics, which allows us to see\nwhere we need to improve as an open-source project to make the Cardano project\nand many smaller related libraries which we maintain be more open and available\nfor open-source contributors."),(0,n.kt)("p",null,"The graph below shows which documents the 55 most important Cardano\nrepositories are missing the most:\n",(0,n.kt)("img",{alt:"Documentation Adoption",src:r(59380).Z,width:"1493",height:"716"}),"\nYou can expect we will improve in these metrics in the coming weeks."))}h.isMDXComponent=!0},59380:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/doc-adoption-cd944582f02809777c58be53e13453c5.png"}}]); \ No newline at end of file diff --git a/assets/js/4883d618.0d6007b2.js b/assets/js/4883d618.0d6007b2.js new file mode 100644 index 00000000000..27efc08d0a4 --- /dev/null +++ b/assets/js/4883d618.0d6007b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[5337],{3757:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/db-sync/page/3","page":3,"postsPerPage":5,"totalPages":3,"totalCount":14,"previousPage":"/cardano-updates/tags/db-sync/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/4906b8e6.48c4df9c.js b/assets/js/4906b8e6.48c4df9c.js new file mode 100644 index 00000000000..941ac12384d --- /dev/null +++ b/assets/js/4906b8e6.48c4df9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[34070],{77544:a=>{a.exports=JSON.parse('{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api","allTagsPath":"/cardano-updates/tags","count":27}')}}]); \ No newline at end of file diff --git a/assets/js/492dc159.444114ca.js b/assets/js/492dc159.444114ca.js new file mode 100644 index 00000000000..8ebc61fa18c --- /dev/null +++ b/assets/js/492dc159.444114ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75748],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=u(r),m=a,h=d["".concat(p,".").concat(m)]||d[m]||c[m]||o;return r?n.createElement(h,i(i({ref:t},s),{},{components:r})):n.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"Developer Experience Update",slug:"2023-07-06-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-06-developer-experience",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-06-developer-experience.md",source:"@site/blog/2023-07-06-developer-experience.md",title:"Developer Experience Update",description:"High level summary",date:"2023-07-06T00:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"devx",permalink:"/cardano-updates/tags/devx"}],readingTime:1.145,hasTruncateMarker:!1,authors:[{name:"Moritz Angermann",title:"Head of Developer Experience",url:"https://github.com/angerman",imageURL:"https://github.com/angerman.png",key:"angerman"}],frontMatter:{title:"Developer Experience Update",slug:"2023-07-06-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-07-sre"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-07-04-db-sync"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"build support & maintainance",id:"build-support--maintainance",level:3},{value:"compiler upgrades",id:"compiler-upgrades",level:3},{value:"Hydra Tools",id:"hydra-tools",level:3},{value:"haskell.nix",id:"haskellnix",level:3},{value:"devx",id:"devx",level:3},{value:"upstream tooling",id:"upstream-tooling",level:3}],s={toc:u},d="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("h3",{id:"build-support--maintainance"},"build support & maintainance"),(0,a.kt)("p",null,"The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions."),(0,a.kt)("h3",{id:"compiler-upgrades"},"compiler upgrades"),(0,a.kt)("p",null,"Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests."),(0,a.kt)("h3",{id:"hydra-tools"},"Hydra Tools"),(0,a.kt)("p",null,"Our repository, ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-tools"},"input-output-hk/actions"),", has seen quite some improvements to facility the hydra <-> github integration."),(0,a.kt)("h3",{id:"haskellnix"},"haskell.nix"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/haskell.nix"},"Haskell.nix")," has been maintained and updated with the addition of preliminary GHC 9.8 support."),(0,a.kt)("h3",{id:"devx"},"devx"),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/devx"},"devx")," repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/actions"},"actions/devx")," GitHub Actions, we have a consistent set of tooling for"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"nix develop shells"),(0,a.kt)("li",{parentName:"ul"},"GitHub CodeSpaces integration"),(0,a.kt)("li",{parentName:"ul"},"VSCode DevContainer support"),(0,a.kt)("li",{parentName:"ul"},"GitHub Actions integration")),(0,a.kt)("h3",{id:"upstream-tooling"},"upstream tooling"),(0,a.kt)("p",null,"Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/496cb9ef.aaee1128.js b/assets/js/496cb9ef.aaee1128.js new file mode 100644 index 00000000000..f50a56f7394 --- /dev/null +++ b/assets/js/496cb9ef.aaee1128.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60852],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(n),m=a,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-04-19-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-04-19-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-19-consensus.md",source:"@site/blog/2023-04-19-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-04-19T00:00:00.000Z",formattedDate:"April 19, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.77,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-04-19-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-20-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-19-performance-and-tracing"}},c={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This week the consensus team continued working on the improved DB lock mechanism\nfor UTxO-HD, and modifications to the mempool benchmarks that this prototype\nrequires."),(0,a.kt)("p",null,"On the Genesis front we validated that the fragment size calculation in\n",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch")," is a major performance sink for ChainSync Jumping. By removing it\nwe will get performance that is acceptably close to that of the baseline. We\nalso started investigating a performance fix that does not alter the existing\nbaseline behavior too much. In addition we reviewed our Genesis attack vector\ncalculations."),(0,a.kt)("p",null,"On the support front we released Consensus 0.4, and we are working on improving\nour release process, to support the Cardano-wide efforts in this area. We also\nperformed an analysis on the number of file descriptors that consensus use. This\ninformation can be used by the node operators to check if the number of file\ndescriptors they want to support are enough."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4972.a20ea76a.js b/assets/js/4972.a20ea76a.js new file mode 100644 index 00000000000..ee4342630e2 --- /dev/null +++ b/assets/js/4972.a20ea76a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4972],{4972:(e,t,a)=>{a.r(t),a.d(t,{default:()=>c});var n=a(67294),l=a(95999),o=a(1944),r=a(93285);function c(){return n.createElement(n.Fragment,null,n.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),n.createElement(r.Z,null,n.createElement("main",{className:"container margin-vert--xl"},n.createElement("div",{className:"row"},n.createElement("div",{className:"col col--6 col--offset-3"},n.createElement("h1",{className:"hero__title"},n.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),n.createElement("p",null,n.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),n.createElement("p",null,n.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/49d642c9.3891d7a8.js b/assets/js/49d642c9.3891d7a8.js new file mode 100644 index 00000000000..696af30bbfc --- /dev/null +++ b/assets/js/49d642c9.3891d7a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80575],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),h=a,m=p["".concat(l,".").concat(h)]||p[h]||d[h]||o;return n?r.createElement(m,s(s({ref:t},u),{},{components:n})):r.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-11-15-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-15-consensus.md",source:"@site/blog/2023-11-15-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-11-15T00:00:00.000Z",formattedDate:"November 15, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.34,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-11-16-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-15-mithril"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"Over the last two weeks, we managed to run a UTxO-HD capable node in ",(0,a.kt)("em",{parentName:"p"},"legacy mode"),", which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does).\nThis ",(0,a.kt)("em",{parentName:"p"},"legacy mode")," could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not.\nHowever, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter.\nOn the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node.\nTherefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend."),(0,a.kt)("p",null,"On the Genesis front, we reviewed the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/434"},"peer simulator")," for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team."),(0,a.kt)("p",null,"We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos."),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/jasagredo"},"Javier Sagredo")," continues his cycle as release engineer, and he is working on version 8.7 of Cardano node."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/49d88be4.57145c14.js b/assets/js/49d88be4.57145c14.js new file mode 100644 index 00000000000..290547c271f --- /dev/null +++ b/assets/js/49d88be4.57145c14.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73343],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=p(r),h=n,m=d["".concat(u,".").concat(h)]||d[h]||c[h]||o;return r?a.createElement(m,i(i({ref:t},s),{},{components:r})):a.createElement(m,i({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Hydra Team Update",slug:"2023-10-13-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-10-13-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-hydra.md",source:"@site/blog/2023-10-13-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-13T00:00:00.000Z",formattedDate:"October 13, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.745,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-13-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-15-network"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-10-13-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity."),(0,n.kt)("p",null,"They also completed the exploration of potentially moving the Plutus validator scripts to Aiken."),(0,n.kt)("p",null,"Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Network Resilience Persistence (#1101)","[https://github.com/input-output-hk/hydra/pull/1101]","."),(0,n.kt)("li",{parentName:"ul"},"Upgrade brick on TUI (#1103)","[https://github.com/input-output-hk/hydra/pull/1103]","."),(0,n.kt)("li",{parentName:"ul"},"Aiken commit validator translation (#1072)","[https://github.com/input-output-hk/hydra/pull/1072]","."),(0,n.kt)("li",{parentName:"ul"},"Fixed some bugs in our TUI client.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Prepare presentation and workshop for Cardano Summit."),(0,n.kt)("li",{parentName:"ul"},"Work on hydra-poll dApp for Cardano summit."),(0,n.kt)("li",{parentName:"ul"},"Start the work on packaging hydra-node and related services.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/49db7061.7d2045e9.js b/assets/js/49db7061.7d2045e9.js new file mode 100644 index 00000000000..bce5ddd91ad --- /dev/null +++ b/assets/js/49db7061.7d2045e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60183],{853:a=>{a.exports=JSON.parse('{"label":"ledger","permalink":"/cardano-updates/tags/ledger","allTagsPath":"/cardano-updates/tags","count":30}')}}]); \ No newline at end of file diff --git a/assets/js/4aaac366.4801cea2.js b/assets/js/4aaac366.4801cea2.js new file mode 100644 index 00000000000..3a4419fefac --- /dev/null +++ b/assets/js/4aaac366.4801cea2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97535],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),d=a,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2022-11-30-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-30-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-performance-and-tracing.md",source:"@site/blog/2022-11-30-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2022-11-30T00:00:00.000Z",formattedDate:"November 30, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.95,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2022-11-30-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-30-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-28-network"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release."),(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them.\nThe idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time."),(0,a.kt)("p",null,"To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation."),(0,a.kt)("p",null,"In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model."),(0,a.kt)("p",null,"The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged.\nWe are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration."),(0,a.kt)("p",null,"We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability."),(0,a.kt)("p",null,"We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP."),(0,a.kt)("p",null,"As usual, a number of smaller workbench, data analysis & reporting improvements have been made."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4ab012ff.891d7eda.js b/assets/js/4ab012ff.891d7eda.js new file mode 100644 index 00000000000..01fbe0dbe8e --- /dev/null +++ b/assets/js/4ab012ff.891d7eda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7555],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(l,".").concat(d)]||p[d]||m[d]||o;return n?a.createElement(h,s(s({ref:t},u),{},{components:n})):a.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:r,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-06-28-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-06-28-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-28-consensus.md",source:"@site/blog/2023-06-28-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-06-28T00:00:00.000Z",formattedDate:"June 28, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.85,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-06-28-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-29-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-28-performance-and-tracing"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:3},{value:"UTxO-HD",id:"utxo-hd",level:3}],u={toc:c},p="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team. "),(0,r.kt)("p",null,"The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components."),(0,r.kt)("p",null,"Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node. "),(0,r.kt)("h3",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/101#issuecomment-1607767722"},"decided on an approach")," of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team."))),(0,r.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We merged the last of the PRs that were part of UTxO-HD improvements for version ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/149"},"0.1"),": expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size."),(0,r.kt)("li",{parentName:"ul"},"We ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/87"},"added"),' a new "legacy" cardano block in a new ',(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus-cardano-legacy-block")," package that should ease the transition for some downstream packages to UTxO-HD, like ",(0,r.kt)("inlineCode",{parentName:"li"},"db-sync"),". This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block."),(0,r.kt)("li",{parentName:"ul"},"We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4b62dc40.f3efb060.js b/assets/js/4b62dc40.f3efb060.js new file mode 100644 index 00000000000..2980e12fa74 --- /dev/null +++ b/assets/js/4b62dc40.f3efb060.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[10335],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-02-21-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-02-21-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-21-db-sync.md",source:"@site/blog/2023-02-21-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-02-21T00:00:00.000Z",formattedDate:"February 21, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.75,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-02-21-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-22-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-17-crypto"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The db-sync team created a new tag ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.2")," which is ready to release.\nWe also investigated and had the first working UTxO-HD integration which is one\nof the potential future risks for db-sync."),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Integrated the UTxO-HD feauture branch in ",(0,a.kt)("inlineCode",{parentName:"li"},"kderme/utxo-hd-1"),". This doesn't\nuse the full on disk storage but keeps things in memory and the plan is to keep\nit this way for the first iteration. The integration still has some performance\nissues which we investigate"),(0,a.kt)("li",{parentName:"ul"},"Created tag ",(0,a.kt)("inlineCode",{parentName:"li"},"13.1.0.2")," which upgrades the dependencies of db-sync"),(0,a.kt)("li",{parentName:"ul"},"Fixed an issue related to errors appearing in SMASH\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1353"},"#1353")),(0,a.kt)("li",{parentName:"ul"},"Continued with ghc-9.2 integration\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1339"},"#1339")),(0,a.kt)("li",{parentName:"ul"},"Worked on an new fixing procedure for\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1348"},"#1348"),".\nWe try to make these procedures work also on older schema version, without the\nneed to migrate to newer schema, which can be very useful for fixing existing\nsnapshots.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4b90674f.c49340db.js b/assets/js/4b90674f.c49340db.js new file mode 100644 index 00000000000..7956bf38457 --- /dev/null +++ b/assets/js/4b90674f.c49340db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92308],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=s(n),u=a,f=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-09-01-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-01-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-goedel.md",source:"@site/blog/2023-09-01-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.43,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-09-01-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-06-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-01-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"finalising a presenting performance analysis internship work to the\nformal methods team")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"developed a new Isabelle mini-protocol framework and examples")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"planning an extended version of the ICE DeltaQ paper")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"working on algebraic rules for properisation of any-to-finish"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4b996e44.f9c2f0cd.js b/assets/js/4b996e44.f9c2f0cd.js new file mode 100644 index 00000000000..f97d4bfee09 --- /dev/null +++ b/assets/js/4b996e44.f9c2f0cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7897],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),s=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(n),m=r,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:r,i[1]=p;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-06-23-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-06-23-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-network.md",source:"@site/blog/2023-06-23-network.md",title:"Network Team Update",description:"Network Update",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-06-23-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-23-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-23-sre"}},l={authorsImageUrls:[void 0]},s=[{value:"Network Update",id:"network-update",level:2},{value:"Key contributions",id:"key-contributions",level:3},{value:"Other smaller changes",id:"other-smaller-changes",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"network-update"},"Network Update"),(0,r.kt)("h3",{id:"key-contributions"},"Key contributions"),(0,r.kt)("p",null,"We held a series of session to review the implementation of big ledger peers\n(eclipse evasion). See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"#4462"),"."),(0,r.kt)("p",null,"We get a request from a 3rd party to clarify an inconsistency between CDDL spec\nand protocol implementation. We worked out a nice solution which takes\nadvantage of the ",(0,r.kt)("inlineCode",{parentName:"p"},"any")," notion available in ",(0,r.kt)("inlineCode",{parentName:"p"},"CDDL"),". On the Haskell side we\nprovide ",(0,r.kt)("inlineCode",{parentName:"p"},"Any")," type which gen generate almost any CBOR term (some are excluded\nonly because they are not decoded back to the same form, and we relay on that\nproperty). See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4580"},"#4580"),"."),(0,r.kt)("p",null,"We fixed a bunch of problems of the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," command. It also now has\na limited support of ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," mini-protocol (the ",(0,r.kt)("inlineCode",{parentName:"p"},"-c")," option is\nignored, as it cannot be supported by ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol). Note that\nthe format of messages has changed, timestamps are printed in ISO8601 format.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4601"},"#4601"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5326"},"#5326"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"#5313"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30"},"#30")),(0,r.kt)("p",null,"In order to provide a new flag in the topology file which enables ledger peers\nwhen the chain is close to the tip, we continued to work on ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"#4530"),". This is\ncurrently in review, the consensus team will need to provide us with the new\napi. This feature is useful for two reasons: makes it easier to maintain\na topology file, it will also limit the traffic on public roots generated by\nfor example full node wallets and distribute it to ledger peers."),(0,r.kt)("p",null,"We also continued to work on a blog post which describes the journey of design\n& implementation of the dynamic P2P network layer. Too be announced soon :). "),(0,r.kt)("h3",{id:"other-smaller-changes"},"Other smaller changes"),(0,r.kt)("p",null,"We limit the concurrency of resolving dns names. Up to 8 root peers or ledger\npeers DNS names are resolved concurrently, and at most 2 local root peer DNS\nnames. See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4596"},"#4596"),"."),(0,r.kt)("p",null,"We fixed handshake query timeout in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4603"},"#4603"),"."),(0,r.kt)("p",null,"We renamed one of the block-fetch decision constructors as requested by the\nconsensus team, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4608"},"#4608"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4be9a3a6.9e933a24.js b/assets/js/4be9a3a6.9e933a24.js new file mode 100644 index 00000000000..01121ddcced --- /dev/null +++ b/assets/js/4be9a3a6.9e933a24.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25480],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=p(r),h=n,m=d["".concat(u,".").concat(h)]||d[h]||c[h]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=h;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-03-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-03-03-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-ledger.md",source:"@site/blog/2023-03-03-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.57,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-03-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-03-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-02-network"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway rules",id:"conway-rules",level:3},{value:"Constraint based generators",id:"constraint-based-generators",level:3},{value:"Preparing a release, now with proper versioning",id:"preparing-a-release-now-with-proper-versioning",level:3},{value:"Technical debt",id:"technical-debt",level:3}],s={toc:p},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We have focused the last two weeks on CIP-1694, integration of the last several months of ledger\nwork into consensus and node, and testing infrastrutcture that we will use in the conway ledger era."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-rules"},"Conway rules"),(0,n.kt)("p",null,"We made a major update to the conway era so that the implementation is now in sync with the spec\nwith respect to the ratification and enactment logic."),(0,n.kt)("p",null,"See the notes in ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3291"},"pull-3291")," for more details."),(0,n.kt)("h3",{id:"constraint-based-generators"},"Constraint based generators"),(0,n.kt)("p",null,"This week we hit a major milestone in our efforts to build out better property based testing\nsupport for the main ledger properties.\nThe new constraint based generators can now generate full ledger states with what is probably\nvery close to the real constraints (if anything, it is under constrained).\nNext we will work on generating a transaction in the context of a ledger state, which would allow\nus to actually start using these generators for real tests."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"),"."),(0,n.kt)("h3",{id:"preparing-a-release-now-with-proper-versioning"},"Preparing a release, now with proper versioning"),(0,n.kt)("p",null,"After quite some time, we are ready to release a version of ledger that will work with a new\nversion of consensus, using CHaPs."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3308"},"pull-3308"),"."),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We cleaned up the redeemer serialization code (to prevent future mistakes). See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3269"},"pull-3269"),"."),(0,n.kt)("li",{parentName:"ul"},"We added a note to the Alonzo spec, specifying that the transaction inputs are\nlexicographically ordered in the Plutus script context. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3306"},"pull-3306"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with the address deserialiazation\n(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway).\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3307"},"pull-3307"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with our nix build. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3311"},"pull-3311"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with our ",(0,n.kt)("inlineCode",{parentName:"li"},"NoThunks")," tests. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3310"},"pull-3310"),"."),(0,n.kt)("li",{parentName:"ul"},"We improved our nightly tests. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3316"},"pull-3316"),".")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4bed0e48.0ec05e19.js b/assets/js/4bed0e48.0ec05e19.js new file mode 100644 index 00000000000..8653867457b --- /dev/null +++ b/assets/js/4bed0e48.0ec05e19.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[34631],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(r),d=i,g=c["".concat(u,".").concat(d)]||c[d]||m[d]||n;return r?a.createElement(g,o(o({ref:t},p),{},{components:r})):a.createElement(g,o({ref:t},p))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Crypto Team Update",slug:"2023-02-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-17-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-crypto.md",source:"@site/blog/2023-02-17-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.43,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-02-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-02-21-db-sync"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-17-goedel"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"MuSig2",id:"musig2",level:3}],p={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,i.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration."),(0,i.kt)("li",{parentName:"ul"},"cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus."),(0,i.kt)("li",{parentName:"ul"},"KES agent: using snockets and making things testable in IOSim"),(0,i.kt)("li",{parentName:"ul"},"MuSig2: started implementation in rust.")),(0,i.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,i.kt)("h3",{id:"mithril"},"Mithril"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Transmute helpers merged ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/722"},"PR#722")),(0,i.kt)("li",{parentName:"ul"},"We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope. "),(0,i.kt)("li",{parentName:"ul"},"We are working in a modification of KES to require caller to allocate the secret key buffer."),(0,i.kt)("li",{parentName:"ul"},"Proposed a solution for signer registration of ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/wiki/Mithril-registration-procedure#cost"},"Mithril"),".")),(0,i.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus/tree/kwxm/BLS12_381/prototype/plutus-benchmark/bls-benchmarks"},"proof"),".",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Results are promising, with using only 23% of the execution budget to verify a realistic proof. "),(0,i.kt)("li",{parentName:"ul"},"Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril."))),(0,i.kt)("li",{parentName:"ul"},"KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this."),(0,i.kt)("li",{parentName:"ul"},"Conversion finally merged ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/344"},"PR#344"),".")),(0,i.kt)("h3",{id:"kes-agent"},"KES agent"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation"),(0,i.kt)("li",{parentName:"ul"},"Figuring out how to go from fake file descriptor to write the raw bytes")),(0,i.kt)("h3",{id:"musig2"},"MuSig2"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4c4f8ee1.35fd4774.js b/assets/js/4c4f8ee1.35fd4774.js new file mode 100644 index 00000000000..9076cfeb398 --- /dev/null +++ b/assets/js/4c4f8ee1.35fd4774.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80113],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(a),s=r,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},d),{},{components:a})):n.createElement(h,i({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-10-04-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-04-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-04-node-cli-api.md",source:"@site/blog/2022-10-04-node-cli-api.md",title:"Node API & CLI Team Update",description:"Node-Api-Cli Update",date:"2022-10-04T00:00:00.000Z",formattedDate:"October 4, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.98,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-10-04-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-10-04-db-sync"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-30-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"Node-Api-Cli Update",id:"node-api-cli-update",level:2},{value:"2022-10-04 - 2022-10-18",id:"2022-10-04---2022-10-18",level:2},{value:"Executive Summary",id:"executive-summary",level:3},{value:"Completed",id:"completed",level:3},{value:"cardano-cli",id:"cardano-cli",level:4},{value:"cardano-api",id:"cardano-api",level:4},{value:"cardano-node",id:"cardano-node",level:4},{value:"In Progress",id:"in-progress",level:3},{value:"cardano-cli",id:"cardano-cli-1",level:4},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"node-api-cli-update"},"Node-Api-Cli Update"),(0,r.kt)("h2",{id:"2022-10-04---2022-10-18"},"2022-10-04 - 2022-10-18"),(0,r.kt)("h3",{id:"executive-summary"},"Executive Summary"),(0,r.kt)("p",null,"The majority of the team's time was spent between getting ",(0,r.kt)("inlineCode",{parentName:"p"},"1.34.4")," ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli"),"."),(0,r.kt)("h3",{id:"completed"},"Completed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4504"},"GHC 9.2.4 preparations"))),(0,r.kt)("h4",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[Serenity]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4491"},"Separate IO from txBuild and txBuildRaw functions"))),(0,r.kt)("h4",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4501"},"TxWitness text envelope format does not roundtrip in Shelley era"))),(0,r.kt)("h4",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4526"},"Fix MacOS GHA CI"))),(0,r.kt)("h3",{id:"in-progress"},"In Progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4508"},"Release 1.34.4"))),(0,r.kt)("h4",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4538"},"Fix query era mismatch bug in transaction build command")),(0,r.kt)("li",{parentName:"ul"},"[Serenity]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4516"},"Condense Read and Validation modules in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4276"},"Add tx-mempool command to CLI"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4482"},"Return Lovelace for calculateMinimumUTxO")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4c7d0c08.57bb3429.js b/assets/js/4c7d0c08.57bb3429.js new file mode 100644 index 00000000000..c9204f72b60 --- /dev/null +++ b/assets/js/4c7d0c08.57bb3429.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40682],{52595:a=>{a.exports=JSON.parse('{"label":"security","permalink":"/cardano-updates/tags/security","allTagsPath":"/cardano-updates/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/4c91b9ee.800884f9.js b/assets/js/4c91b9ee.800884f9.js new file mode 100644 index 00000000000..9cc43562577 --- /dev/null +++ b/assets/js/4c91b9ee.800884f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76705],{5324:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/6","page":6,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/5","nextPage":"/cardano-updates/page/7","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/4ce06e64.8c5577b4.js b/assets/js/4ce06e64.8c5577b4.js new file mode 100644 index 00000000000..c388899e027 --- /dev/null +++ b/assets/js/4ce06e64.8c5577b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46318],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),c=p(a),u=n,m=c["".concat(s,".").concat(u)]||c[u]||d[u]||o;return a?r.createElement(m,i(i({ref:t},h),{},{components:a})):r.createElement(m,i({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-01-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-01-27-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-27-hydra.md",source:"@site/blog/2023-01-27-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-01-27T00:00:00.000Z",formattedDate:"January 27, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.945,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-01-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-02-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-26-mithril"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},c="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team had a monthly review meeting with their stakeholders,\ncontributors and interested people from the community. The monthly repot for\n",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2023-01"},"January 2023")," is a digest\nof the things presented and also includes a summary of the meeting. The Hydra\nspecification was getting discussed and the team is incorporating suggested\nchanges of reviewers. Last but not least, they compute and publish script\ninformation on every PR and also on the\n",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/benchmarks/transaction-cost/#script-summary"},"website"),"\nnow."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Had the monthly review meeting with a broader audience"),(0,n.kt)("li",{parentName:"ul"},"Published the monthly report for ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-01"},"January 2023")),(0,n.kt)("li",{parentName:"ul"},"Reviewed the spec and discussed individual aborts with researchers"),(0,n.kt)("li",{parentName:"ul"},"Compute and publish script information along benchmarks on every PR and ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/benchmarks/transaction-cost/#script-summary"},"website"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add rollback section to Hydra spec, update pictures and publish it as part of repository"),(0,n.kt)("li",{parentName:"ul"},"Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository."),(0,n.kt)("li",{parentName:"ul"},"Groom & plan actions required for a maintainable Head explorer + break down ","\u201c","align gaps","\u201d"," feature.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4cecd320.50a66533.js b/assets/js/4cecd320.50a66533.js new file mode 100644 index 00000000000..1977e39fe74 --- /dev/null +++ b/assets/js/4cecd320.50a66533.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72311],{77048:a=>{a.exports=JSON.parse('{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api","allTagsPath":"/cardano-updates/tags","count":27}')}}]); \ No newline at end of file diff --git a/assets/js/4d3eb7e7.deb360a8.js b/assets/js/4d3eb7e7.deb360a8.js new file mode 100644 index 00000000000..039f6d50676 --- /dev/null +++ b/assets/js/4d3eb7e7.deb360a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64827],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return n?a.createElement(f,i(i({ref:t},s),{},{components:n})):a.createElement(f,i({ref:t},s))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-07-07-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-07-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-goedel.md",source:"@site/blog/2023-07-07-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.42,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-07-07-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-07-07-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-07-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint the teams have been working on finalising their ICE papers\nfor publication in EPTCS, formalising concensus, and investigating chain\nsync."),(0,r.kt)("h2",{id:"details"},"Details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing final versions of ICE papers")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Reviewing the chain sync design and documentation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Refactoring the thorn calculus")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"First draft of Praos specification")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Developing bounding factors on timeouts"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4d7c8e78.a7f8c06f.js b/assets/js/4d7c8e78.a7f8c06f.js new file mode 100644 index 00000000000..433245b6426 --- /dev/null +++ b/assets/js/4d7c8e78.a7f8c06f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45389],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-03-24-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-24-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-24-hydra.md",source:"@site/blog/2023-03-24-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-24T00:00:00.000Z",formattedDate:"March 24, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.95,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-24-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-03-27-system-test"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-03-23-db-sync"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},u="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra had a team workshop and conducted the monthly review\nmeeting for March. They demonstrated a Hydra Head on mainnet, which was running\nthe hydraw demo application. While this marks an important milestone, they also\nemphasized that more features are still to be added as needed for applications\nto run on Hydra. Besides this, the roadmap is getting cleaned up to encourage\ndiscussions and provide more space for user requests."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting ",(0,n.kt)("a",{parentName:"li",href:"https://docs.google.com/presentation/d/1yZ4AqUQ8OBMG9ARMYvj3IOjaIAqglf7kZei4vsLMrbs/edit#slide=id.g1f87a7454a5_0_1392"},"slides"),"/",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/1krzM8VN-gpKTtpVdC2JQx-lGti-4gKQS/view?ts=641b3c1c"},"recording"),", full report of March next week",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Opened a head on mainnet with hydraw demonstration"),(0,n.kt)("li",{parentName:"ul"},"Hydra pay updates"))),(0,n.kt)("li",{parentName:"ul"},"Team workshop in Austria",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Hydra presentation at the Cardano Foundation in Zurich"),(0,n.kt)("li",{parentName:"ul"},"In-person grooming session, marked many items as candidates to be rather :idea: dicussions"),(0,n.kt)("li",{parentName:"ul"},"Improved head protocol ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/786"},"#786")," and investigated a potential bug in rollback handling ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Team building and retrospective")))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Follow-up on backlog and roadmap clean-up"),(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature (documentation updates)"),(0,n.kt)("li",{parentName:"ul"},"Make API more configurable ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/380"},"#380")),(0,n.kt)("li",{parentName:"ul"},"Integrate Hydra specification into repository ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4da01d42.55b2a465.js b/assets/js/4da01d42.55b2a465.js new file mode 100644 index 00000000000..155da2f06ca --- /dev/null +++ b/assets/js/4da01d42.55b2a465.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17903],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=a.createContext({}),u=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=u(n),d=o,h=m["".concat(p,".").concat(d)]||m[d]||c[d]||r;return n?a.createElement(h,i(i({ref:t},s),{},{components:n})):a.createElement(h,i({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:o,i[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var a=n(87462),o=(n(67294),n(3905));const r={title:"Network Q1 2023 Update",slug:"2023-04-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2023-04-04-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-04-network.md",source:"@site/quarterly/2023-04-04-network.md",title:"Network Q1 2023 Update",description:"2023-01 - 2023-03",date:"2023-04-04T00:00:00.000Z",formattedDate:"April 4, 2023",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:2.62,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Q1 2023 Update",slug:"2023-04-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-04-25-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2023-04-03-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"2023-01 - 2023-03",id:"2023-01---2023-03",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Gradual dynamic P2P release on mainnet",id:"gradual-dynamic-p2p-release-on-mainnet",level:4},{value:"Peer Sharing",id:"peer-sharing",level:4},{value:"Eclipse Evasion",id:"eclipse-evasion",level:4},{value:"Cardano Network Service Assurance",id:"cardano-network-service-assurance",level:4},{value:"Cardano-Node",id:"cardano-node",level:4},{value:"Testing improvements",id:"testing-improvements",level:4},{value:"Technical Debt",id:"technical-debt",level:4},{value:"Documentation",id:"documentation",level:4},{value:"IO-Sim",id:"io-sim",level:4},{value:"NoThunks",id:"nothunks",level:4},{value:"Next steps",id:"next-steps",level:3}],s={toc:u},m="wrapper";function c(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"2023-01---2023-03"},"2023-01 - 2023-03"),(0,o.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,o.kt)("h4",{id:"gradual-dynamic-p2p-release-on-mainnet"},"Gradual dynamic P2P release on mainnet"),(0,o.kt)("p",null,"We released two version of ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," with dynamic P2P capabilities:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/1.35.6"},(0,o.kt)("inlineCode",{parentName:"a"},"1.35.6")),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"we found and fixed a bug in exception handling in ",(0,o.kt)("inlineCode",{parentName:"li"},"peer-state-actions"),(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4357"},"pull-4357")),(0,o.kt)("li",{parentName:"ul"},"we found and fixed a busy loop when demoting a peer from hot to warm ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"pull-4385")," "))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/1.35.7"},(0,o.kt)("inlineCode",{parentName:"a"},"1.35.7")),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"includes interoperability in the legacy non-p2p network stack ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/outoboros-network/pull/4467"},"pull-4467")))),(0,o.kt)("li",{parentName:"ul"},"we fixed a busy loop of demotion & promotions: ",(0,o.kt)("inlineCode",{parentName:"li"},"warm -> hot -> warm"),"[pull-4485]"," /it will be included in ",(0,o.kt)("inlineCode",{parentName:"li"},"cardano-node-8.0.0")," release/.")),(0,o.kt)("p",null,"Currently there are more than 200 P2P relays on mainnet."),(0,o.kt)("h4",{id:"peer-sharing"},"Peer Sharing"),(0,o.kt)("p",null,"We implemented /peer sharing/ ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"pull-4019")," which will be available as an\nexperimental feature in one of the future ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," releases."),(0,o.kt)("p",null,"We implemented /light peer sharing/, e.g. adding inbound connections to the set\nof known peers of the outbound governor, which allows to bootstrap relays not\nregistered on chain. This complements peer sharing. The ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4277"},"pull-4277")," is in\nlate review stages."),(0,o.kt)("h4",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,o.kt)("p",null,"We finalised design of eclipse evasion and we started implementing it. We\nhave an initial implementation (not merged). We are in the process of extending\nour test suite to cover new implementation details: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"issue-3886"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/outoboros-network/pull/4462"},"pull-4462"),"."),(0,o.kt)("h4",{id:"cardano-network-service-assurance"},"Cardano Network Service Assurance"),(0,o.kt)("p",null,"Galois has been making progress on ",(0,o.kt)("em",{parentName:"p"},"Cardano Network Service Assurance")," project."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"In cardano-node, they have developed a ",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint")," abstraction that creates\na queue of (existing) log events, they now have two such ",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint"),"s (of log\nevents) implemented.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"They have developed a ",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint"),' client executable that can connect to a node\nwhich serves the "new tracing".')),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"They have been exploring approaches for the consolidation and analysis of\n",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint")," data to extract actionable network health status."))),(0,o.kt)("h4",{id:"cardano-node"},"Cardano-Node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We made it possible to configure accepted connections limit ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"pull-4902"),".")),(0,o.kt)("h4",{id:"testing-improvements"},"Testing improvements"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We fixed a bug in network simulation implementation of TCP simultaneous open ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4265"},"pull-4265"),".")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We introduced header-body split in the diffusion simulation ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/outoboros-network/pull/4419"},"pull-4419")," (in review).")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We introduced initiator only nodes in the diffusion simulation ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4280"},"pull-4280"),".")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We fixed a connection-manager test failure ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4370"},"issue-4370"),"."))),(0,o.kt)("h4",{id:"technical-debt"},"Technical Debt"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We refactored ",(0,o.kt)("inlineCode",{parentName:"p"},"Snocket")," interface decoupling it from the multiplexer\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4260"},"pull-4260"),". This simplified some aspects of the KES agent implementation.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We introduces a record for CBOR codecs which are used for various data\nstructures by mini-protocol codecs ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/outoboros-network/pull/4430"},"pull-4430"),"."))),(0,o.kt)("h4",{id:"documentation"},"Documentation"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We explained some limitations of CDDL in our technical report ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4351"},"pull-4351"),".")),(0,o.kt)("h4",{id:"io-sim"},"IO-Sim"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We fixed implementation of ",(0,o.kt)("inlineCode",{parentName:"li"},"MVar"),"'s ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/70"},"pull-70"),".")),(0,o.kt)("h4",{id:"nothunks"},"NoThunks"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We published a new version of ",(0,o.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/nothunks"},(0,o.kt)("inlineCode",{parentName:"a"},"nothunks"))," library to Hackage.")),(0,o.kt)("h3",{id:"next-steps"},"Next steps"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Finish implementation & testing of eclipse evasion ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"issue-3886"),"."),(0,o.kt)("li",{parentName:"ul"},"Optimise connectivity to peers behind firewall ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4381"},"issue-4381"),"."),(0,o.kt)("li",{parentName:"ul"},"Finish the work on enabling block production dynamically to allow using P2P\non block producers ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"issue-3159"),"."),(0,o.kt)("li",{parentName:"ul"},"If time permits we would like also to reserve some time for finishing\npublication of ",(0,o.kt)("inlineCode",{parentName:"li"},"io-sim")," to Hackage.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4dc3be72.1b8e67d2.js b/assets/js/4dc3be72.1b8e67d2.js new file mode 100644 index 00000000000..4442bc11341 --- /dev/null +++ b/assets/js/4dc3be72.1b8e67d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76074],{3905:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>d});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(i),c=r,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||n;return i?a.createElement(d,o(o({ref:t},u),{},{components:i})):a.createElement(d,o({ref:t},u))}));function d(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var s=2;s{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-01-26-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-26-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-26-mithril.md",source:"@site/blog/2023-01-26-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-01-26T00:00:00.000Z",formattedDate:"January 26, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.175,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-01-26-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-27-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-25-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team released a new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2302.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2302.0"))," distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes."),(0,r.kt)("p",null,"Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2302.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2302.0"))),(0,r.kt)("li",{parentName:"ul"},"Implemented a backward/forward compatibility mechanism for API messages ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/688"},"#688"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for the signer registration ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/689"},"#689")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for the signature registration ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/693"},"#693")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for epoch settings ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/695"},"#695")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for certificate pending ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/696"},"#696")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for certificate ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/697"},"#697")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for snapshots list ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/698"},"#698")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for snapshot ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/699"},"#699")),(0,r.kt)("li",{parentName:"ul"},"Update enforcement of API version with Semver ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/705"},"#705")))),(0,r.kt)("li",{parentName:"ul"},"Completed the PoC implementation of backward compatibility with ",(0,r.kt)("inlineCode",{parentName:"li"},"protobuf")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/677"},"#677")),(0,r.kt)("li",{parentName:"ul"},"Completed the PoC implementation of backward compatibility with ",(0,r.kt)("inlineCode",{parentName:"li"},"avro")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/678"},"#678")),(0,r.kt)("li",{parentName:"ul"},"Completed the PoC to Read/Write transaction on chain for Era activations ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/672"},"#672")),(0,r.kt)("li",{parentName:"ul"},"Completed the upgrade Cardano devnet to 1.35.4 ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/523"},"#523"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4de4e659.cb788841.js b/assets/js/4de4e659.cb788841.js new file mode 100644 index 00000000000..07d53ff8bbf --- /dev/null +++ b/assets/js/4de4e659.cb788841.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53662],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),h=p(r),c=a,d=h["".concat(s,".").concat(c)]||h[c]||m[c]||n;return r?i.createElement(d,l(l({ref:t},u),{},{components:r})):i.createElement(d,l({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,l=new Array(n);l[0]=c;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[h]="string"==typeof e?e:a,l[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>n,metadata:()=>o,toc:()=>p});var i=r(87462),a=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-11-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-11-29-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-29-mithril.md",source:"@site/blog/2023-11-29-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-29T00:00:00.000Z",formattedDate:"November 29, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.415,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-29-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-24-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"This week, the Mithril team released the initial version of the ",(0,a.kt)("a",{parentName:"p",href:"https://crates.io/crates/mithril-client"},"Mithril client library"),", enabling developers to integrate core Mithril features into their applications. They also released a new distribution, ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2347.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2347.0")),", which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements."),(0,a.kt)("p",null,"The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance. "),(0,a.kt)("p",null,"Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Release of the ",(0,a.kt)("a",{parentName:"li",href:"https://crates.io/crates/mithril-client"},(0,a.kt)("inlineCode",{parentName:"a"},"mithril-client"))," library crate"),(0,a.kt)("li",{parentName:"ul"},"Publication of a ",(0,a.kt)("a",{parentName:"li",href:"https://mithril.network/doc/dev-blog/2023/11/27/mithril-client-library-released"},"dev blog post")," about the released Mithril library"),(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2347.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2347.0"))),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,a.kt)("inlineCode",{parentName:"strong"},"mithril-client")," WASM library")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1336"},"#1336")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Enhance Mithril/Cardano node communication")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1315"},"#1315")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"P2P threat modeling and risk analysis")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1350"},"#1350")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Support P2P relay in infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1361"},"#1361")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Make Cardano node version custom in CI/CD")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1355"},"#1355")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Manually deploy a test Mithril network")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1356"},"#1356")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"mithril-client verbosity not following usage menu")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1325"},"#1325")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Error message for mithril-client snapshot download")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1375"},"#1375"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4df30499.579d0d55.js b/assets/js/4df30499.579d0d55.js new file mode 100644 index 00000000000..bfe5cd5f0a3 --- /dev/null +++ b/assets/js/4df30499.579d0d55.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51951],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=s(n),d=a,h=m["".concat(l,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(h,i(i({ref:t},p),{},{components:n})):r.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:a,i[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-01-11-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-01-11-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-11-performance-and-tracing.md",source:"@site/blog/2023-01-11-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-01-11T00:00:00.000Z",formattedDate:"January 11, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.865,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2023-01-11-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-11-consensus"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-06-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks."),(0,a.kt)("li",{parentName:"ol"},"New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs."),(0,a.kt)("li",{parentName:"ol"},"Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components."),(0,a.kt)("p",null,"On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters.\nWe now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes."),(0,a.kt)("p",null,"We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development.\nOnce this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4e45b006.d8b869ce.js b/assets/js/4e45b006.d8b869ce.js new file mode 100644 index 00000000000..8d2ccd5a183 --- /dev/null +++ b/assets/js/4e45b006.d8b869ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[63089],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=p(a),c=n,h=m["".concat(u,".").concat(c)]||m[c]||d[c]||l;return a?r.createElement(h,i(i({ref:t},s),{},{components:a})):r.createElement(h,i({ref:t},s))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[m]="string"==typeof e?e:n,i[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-09-15-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-09-15-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-ledger.md",source:"@site/blog/2023-09-15-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.645,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-09-15-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-15-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-15-network"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3},{value:"Testing",id:"testing",level:3}],s={toc:p},m="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The Ledger team's focus is still mainly on the Conway era implementation."),(0,n.kt)("p",null,"We were able to add ability to specify initial Constitutional Comittee and the initial\nversion of Constitution. Priority in which Governance Action are now enacted matches the\nspecification. DRep's deposits are now properly accounted for. Governance actions that are\nnot allowed to be voted on by Stake Pool operators and Constitutional Committee members\nare prevented by transaction submission failure, rather than simply being ignored. There\nwas a few important CDDL fixes as well as a lot of new round trip serialization\ntests. Constraint based testing framework has also received a lot of improvements."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-era"},"Conway era"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3681"},"pull-3681")," - Conway Genesis additions"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3690"},"pull-3690")," - Preserve the order of ProposalProcedures"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3705"},"pull-3705")," - Removed ProtVer from EnactState"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3700"},"pull-3700")," - Add conway-specific certs to deposit/refunds"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3704"},"pull-3704")," - Add comments on deprecating certs to Conway CDDL"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3698"},"pull-3698")," - Reordering of governance actions"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3712"},"pull-3712")," - Disallow empty fields in ConwayTxBodyRaw"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3716"},"pull-3716")," - Abstract threshold calculation"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3725"},"pull-3725")," - Fix mistaken use of dollar sign in cddl files"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3718"},"pull-3718")," - Predicate failure for mismatched Voter GovAction"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3721"},"pull-3721")," - Committee expiration, validation and modification")),(0,n.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3629"},"pull-3629")," - Add rule-transition diagrams in dot syntax"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3680"},"pull-3680")," - Bump Plutus deps to 1.11"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3708"},"pull-3708")," - Post release changes")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3730"},"pull-3730")," - Implement ",(0,n.kt)("inlineCode",{parentName:"li"},"Show")," instance for ",(0,n.kt)("inlineCode",{parentName:"li"},"Rep")," using ",(0,n.kt)("inlineCode",{parentName:"li"},"IsTypeable")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3697"},"pull-3697")," - Rewrite testEql using Typeable to make it impossible to forget cases"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3709"},"pull-3709")," - Add many new features to the Constrained modues in cardano-ledger-test"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3726"},"pull-3726")," - Conway and other eras serialization roundtrip tests"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3713"},"pull-3713")," - Improve CI resiliency against GitHub issues")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4ed83391.31eb1d59.js b/assets/js/4ed83391.31eb1d59.js new file mode 100644 index 00000000000..be80c4cc41e --- /dev/null +++ b/assets/js/4ed83391.31eb1d59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22838],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=s(n),p=a,h=d["".concat(c,".").concat(p)]||d[p]||m[p]||i;return n?r.createElement(h,o(o({ref:t},u),{},{components:n})):r.createElement(h,o({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-09-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-22-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-22-performance-and-tracing.md",source:"@site/blog/2023-09-22-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-09-22T00:00:00.000Z",formattedDate:"September 22, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.445,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-09-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-22-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-20-consensus"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"New team member",id:"new-team-member",level:3}],u={toc:s},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Work on machine-readable tracing of tracer configuration is ongoing."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster."),(0,a.kt)("li",{parentName:"ul"},"Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Bl\xf6ndal!")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking\nbackend with means to measure and document network latency for each run. Furthermore we've implemented means to\ncapture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences\nin the behaviour of the underlying networking stack at OS level. "),(0,a.kt)("p",null,"Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided\nto compare standard deviations instead to validate the measurements from nomad."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline\nhave been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis. "),(0,a.kt)("p",null,"Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for ",(0,a.kt)("inlineCode",{parentName:"p"},"trace-dispatcher")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"tx-generator")," we were able to address those issues."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"After various steps in constructing a configuration upon node startup, it is vital to document\nwhich runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML\ntrace message for that purpose. "),(0,a.kt)("p",null,"This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node. "),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it\nproduces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an\nimpact on our measurements, as we'd be basically using two different instruments to take them. "),(0,a.kt)("p",null,"Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service\nor the slightly different system architecture of the new cluster."),(0,a.kt)("h3",{id:"new-team-member"},"New team member"),(0,a.kt)("p",null,"Baldur Bl\xf6ndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team.\nSo I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer"),", the component receiving, processing and making available node traces and metrics."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4ef71b5f.e4f1978f.js b/assets/js/4ef71b5f.e4f1978f.js new file mode 100644 index 00000000000..c8890bb795d --- /dev/null +++ b/assets/js/4ef71b5f.e4f1978f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59749],{28331:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/page/2","page":2,"postsPerPage":10,"totalPages":2,"totalCount":15,"previousPage":"/cardano-updates/quarterly","blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4fb1471a.876221eb.js b/assets/js/4fb1471a.876221eb.js new file mode 100644 index 00000000000..7c04df559c6 --- /dev/null +++ b/assets/js/4fb1471a.876221eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42347],{16186:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/tags/consensus","allTagsPath":"/cardano-updates/tags","count":32}')}}]); \ No newline at end of file diff --git a/assets/js/4fd8c72a.6da59da0.js b/assets/js/4fd8c72a.6da59da0.js new file mode 100644 index 00000000000..a0a79dac26b --- /dev/null +++ b/assets/js/4fd8c72a.6da59da0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76294],{8513:a=>{a.exports=JSON.parse('{"label":"network","permalink":"/cardano-updates/tags/network","allTagsPath":"/cardano-updates/tags","count":24}')}}]); \ No newline at end of file diff --git a/assets/js/4fe12b4b.941e6176.js b/assets/js/4fe12b4b.941e6176.js new file mode 100644 index 00000000000..61e9bb8d3c4 --- /dev/null +++ b/assets/js/4fe12b4b.941e6176.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48837],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),u=a,f=d["".concat(p,".").concat(u)]||d[u]||m[u]||o;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-03-31-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-31-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-goedel.md",source:"@site/blog/2023-03-31-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.455,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-03-31-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-31-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-31-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This sprint the team has been working on final drafts of two papers\nfor internal review and planning next steps of analysis of consensus\ndesign refiniments."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Preparing final draft of DeltaQSD algebra paper for internal review")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Preparing final draft of verifying design refinements for\ndistributed system design for internal review")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Planning next phase of consensus design refinement analysis"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4fe88e48.fa1e775a.js b/assets/js/4fe88e48.fa1e775a.js new file mode 100644 index 00000000000..56eb7d4d48d --- /dev/null +++ b/assets/js/4fe88e48.fa1e775a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[82214],{17849:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/db-sync","page":1,"postsPerPage":5,"totalPages":3,"totalCount":14,"nextPage":"/cardano-updates/tags/db-sync/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/4febca42.f94e02ae.js b/assets/js/4febca42.f94e02ae.js new file mode 100644 index 00000000000..1e7fc36041a --- /dev/null +++ b/assets/js/4febca42.f94e02ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16349],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(a),s=r,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||i;return a?n.createElement(h,o(o({ref:t},d),{},{components:a})):n.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-05-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-05-05-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-05-node-cli-api.md",source:"@site/blog/2023-05-05-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-05-05T00:00:00.000Z",formattedDate:"May 5, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.81,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-05-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-05-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-04-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-05-05---2023-05-23"},"2023-05-05 - 2023-05-23"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Golden tests for cardano-cli command help output were added."),(0,r.kt)("li",{parentName:"ul"},"Documentation was updated with new libsodium installation instructions."),(0,r.kt)("li",{parentName:"ul"},"There were several updates for the cardano-cli:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Deletion of the deprecated shelley command group."),(0,r.kt)("li",{parentName:"ul"},"Addition of golden tests for CLI help."),(0,r.kt)("li",{parentName:"ul"},"An improvement to avoid bare IO in tests, allowing better error reporting in failed tests."),(0,r.kt)("li",{parentName:"ul"},"Generation of UTCTime test values without leap seconds (avoids erroneous test failures)"),(0,r.kt)("li",{parentName:"ul"},"Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32."))),(0,r.kt)("li",{parentName:"ul"},"The cardano-api underwent multiple refinements:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Implementing deposit handling when balancing transactions (necessary for Conway)"),(0,r.kt)("li",{parentName:"ul"},"Cleaning up socket file path code."))),(0,r.kt)("li",{parentName:"ul"},"Several changes were made to the cardano-testnet:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Adding golden tests for cardano-testnet help."),(0,r.kt)("li",{parentName:"ul"},"Removing all hardcoded yaml files in cardano-testnet"),(0,r.kt)("li",{parentName:"ul"},"Improving cardano-testnet help output."),(0,r.kt)("li",{parentName:"ul"},"Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.")))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5181"},"Update libsodium installation instructions")," ")),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5264"},"Delete deprecated ",(0,r.kt)("inlineCode",{parentName:"a"},"shelley")," command group")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5206"},"Add golden tests for CLI help")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5201"},"Avoid bare IO in tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5200"},"Split ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli")," test files into separate directories")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5198"},"Make UTCTime test generator generate values without leap seconds")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5189"},"Add support with signing transactions with ",(0,r.kt)("inlineCode",{parentName:"a"},"GenesisDelegateSigningKey_ed25519_bip32"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5184"},"Rename --signed-tx-file argument to --tx-file argument in verify-poll command")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5120"},"Simplify socket path code")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5221"},"refactor: make renderScriptWitnessIndex output more explicit")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5218"},"Implement deposit handling when balancing transactions")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5217"},"Replace remaining ",(0,r.kt)("inlineCode",{parentName:"a"},"FilePath")," use in ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5215"},"Cleanup socket file path code")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5207"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"readEnvSocketPath")," function")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5194"},"IO functions for reading. Remove PoolMetadataFile type")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5191"},"Expose config reader")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5188"},"Golden tests for ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api")," errors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5175"},"Fix ",(0,r.kt)("inlineCode",{parentName:"a"},"toEraInMode")," for conway")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5168"},"Use machine readable output for ToJSON ScriptWitnessIndex")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5096"},"Expose LocalTxSubmissionClient data constructor")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5047"},"Use cardano-api from separate repository")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4684"},"[cardano-api] Export fromConsensusPointHF")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5022"},"Provide orphan ",(0,r.kt)("inlineCode",{parentName:"a"},"ToJSON")," instances for ",(0,r.kt)("inlineCode",{parentName:"a"},"HardForkNodeToClientVersion")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"HardForkNodeToNodeVersion"))," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5254"},"Add golden test for ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-testnet")," help")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5242"},"Remove all hardcoded yaml files from cardano-testnet")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5234"},"Fix cardano-testnet help")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5211"},"Parameterize default yaml configuration value in cardano-testnet")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5165"},"Freeze callstack in integration and integrationRetryWorkspace functions")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5128"},"Create defaultYamlValue for cardano-testnet"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/50135b75.e3faee2b.js b/assets/js/50135b75.e3faee2b.js new file mode 100644 index 00000000000..559e9822bc9 --- /dev/null +++ b/assets/js/50135b75.e3faee2b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54176],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var n=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function l(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=n.createContext({}),u=function(e){var t=n.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):l(l({},t),e)),i},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var i=e.components,a=e.mdxType,r=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=u(i),d=a,c=m["".concat(p,".").concat(d)]||m[d]||h[d]||r;return i?n.createElement(c,l(l({ref:t},s),{},{components:i})):n.createElement(c,l({ref:t},s))}));function c(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=i.length,l=new Array(r);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:a,l[1]=o;for(var u=2;u{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var n=i(87462),a=(i(67294),i(3905));const r={title:"Mithril Team Update",slug:"2023-06-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-06-15-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-15-mithril.md",source:"@site/blog/2023-06-15-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-06-15T00:00:00.000Z",formattedDate:"June 15, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.795,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-06-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-16-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-14-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},m="wrapper";function h(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,n.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client\u2019s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet."),(0,a.kt)("p",null,"Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Completed on the epic that designs and implements generic signing/verification of entity services ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Create the sub-command for 'Mithril Stake Distribution' in client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/896"},"#896")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Adapt end to end tests to handle new types of data")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/899"},"#899")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update client documentation")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/897"},"#897")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update architecture documentations for new types of data")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/898"},"#898")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactoring client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/960"},"#960")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,a.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Enhance terraform infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/930"},"#930")))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic that implements the computation of the stake distribution for ",(0,a.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/880"},"#880"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Check performance impact of new stake distribution command on the 'mainnet'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/962"},"#962")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Prepare Mithril Signer deployment model for SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/862"},"#862"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/961"},"#961")))),(0,a.kt)("li",{parentName:"ul"},"Worked on bugs and optimizations:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Aggregator does not always detect new immutable file")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/953"},"#953")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"CI tests fail with Rust '1.70.0'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/958"},"#958")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"End to end tests are flaky")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/954"},"#954")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Certificate dates in metadata are not on the same timezone")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/946"},"#946")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor 'MithrilStakeDistribution' entity")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/967"},"#967")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Fix 'Mithril Client multi-platform test' with new client interface")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/956"},"#956")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Enhance 'ImmutableDigesterError::NotEnoughImmutable' error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/969"},"#969")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Client 'snapshot download' command fails with option '--download-dir'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/979"},"#979"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/50d0e663.0674ac23.js b/assets/js/50d0e663.0674ac23.js new file mode 100644 index 00000000000..1c8bd5c564f --- /dev/null +++ b/assets/js/50d0e663.0674ac23.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30670],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),u=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=u(r),d=n,h=c["".concat(s,".").concat(d)]||c[d]||m[d]||i;return r?a.createElement(h,o(o({ref:t},p),{},{components:r})):a.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-03-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-17-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-crypto.md",source:"@site/blog/2023-03-17-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-03-17T00:00:00.000Z",formattedDate:"March 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.255,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-03-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-21-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-17-hydra"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3}],p={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: RFP finished. Code ready for audit."),(0,n.kt)("li",{parentName:"ul"},"cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams."),(0,n.kt)("li",{parentName:"ul"},"KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing."),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Preparing proving system to use the curves needed for main-net PoC. ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/783"},"PR#783")),(0,n.kt)("li",{parentName:"ul"},"RFP for crypto audit ready.")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"BLS12-381 branch approved ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"),". Blocker is Windown's CI. Working on it"),(0,n.kt)("li",{parentName:"ul"},"Testing strategy for BLS bindings:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Preparing test-vectors for Groth16, and simple BLS signatures"),(0,n.kt)("li",{parentName:"ul"},"Finding community projects to help write their use cases"),(0,n.kt)("li",{parentName:"ul"},"Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)"))),(0,n.kt)("li",{parentName:"ul"},"Wrote ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/blogpost_breaking_ed25519_vrf/blob/main/blog.md"},"blogpost")," on how using the same key for ed25519 and VRF completely breaks the security of both systems ")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started integration of sockets interface used in consensus"),(0,n.kt)("li",{parentName:"ul"},"Use that for de/ser"),(0,n.kt)("li",{parentName:"ul"},"Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim"),(0,n.kt)("li",{parentName:"ul"},"Results in having to parametrise for IOSim in KES and DSIGN for testing")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages."),(0,n.kt)("li",{parentName:"ul"},"Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS."),(0,n.kt)("li",{parentName:"ul"},"EdDSA over JubJub ready")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/51068.b4d6108e.js b/assets/js/51068.b4d6108e.js new file mode 100644 index 00000000000..5f4f5e04246 --- /dev/null +++ b/assets/js/51068.b4d6108e.js @@ -0,0 +1 @@ +(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51068],{3905:(e,t,r)=>{"use strict";r.d(t,{Zo:()=>s,kt:()=>d});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},f="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),f=c(r),y=o,d=f["".concat(l,".").concat(y)]||f[y]||p[y]||a;return r?n.createElement(d,i(i({ref:t},s),{},{components:r})):n.createElement(d,i({ref:t},s))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=y;var u={};for(var l in t)hasOwnProperty.call(t,l)&&(u[l]=t[l]);u.originalType=e,u[f]="string"==typeof e?e:o,i[1]=u;for(var c=2;c{"use strict";var t=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===r}(e)}(e)};var r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?l((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){return e.concat(t).map((function(e){return n(e,r)}))}function a(e){return Object.keys(e).concat(function(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter((function(t){return Object.propertyIsEnumerable.call(e,t)})):[]}(e))}function i(e,t){try{return t in e}catch(r){return!1}}function u(e,t,r){var o={};return r.isMergeableObject(e)&&a(e).forEach((function(t){o[t]=n(e[t],r)})),a(t).forEach((function(a){(function(e,t){return i(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))})(e,a)||(i(e,a)&&r.isMergeableObject(t[a])?o[a]=function(e,t){if(!t.customMerge)return l;var r=t.customMerge(e);return"function"==typeof r?r:l}(a,r)(e[a],t[a],r):o[a]=n(t[a],r))})),o}function l(e,r,a){(a=a||{}).arrayMerge=a.arrayMerge||o,a.isMergeableObject=a.isMergeableObject||t,a.cloneUnlessOtherwiseSpecified=n;var i=Array.isArray(r);return i===Array.isArray(e)?i?a.arrayMerge(e,r,a):u(e,r,a):n(r,a)}l.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,r){return l(e,r,t)}),{})};var c=l;e.exports=c},49090:e=>{function t(e,t){e.onload=function(){this.onerror=this.onload=null,t(null,e)},e.onerror=function(){this.onerror=this.onload=null,t(new Error("Failed to load "+this.src),e)}}function r(e,t){e.onreadystatechange=function(){"complete"!=this.readyState&&"loaded"!=this.readyState||(this.onreadystatechange=null,t(null,e))}}e.exports=function(e,n,o){var a=document.head||document.getElementsByTagName("head")[0],i=document.createElement("script");"function"==typeof n&&(o=n,n={}),n=n||{},o=o||function(){},i.type=n.type||"text/javascript",i.charset=n.charset||"utf8",i.async=!("async"in n)||!!n.async,i.src=e,n.attrs&&function(e,t){for(var r in t)e.setAttribute(r,t[r])}(i,n.attrs),n.text&&(i.text=""+n.text),("onload"in i?t:r)(i,o),i.onload||t(i,o),a.appendChild(i)}},30845:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>a});var n=Number.isNaN||function(e){return"number"==typeof e&&e!=e};function o(e,t){if(e.length!==t.length)return!1;for(var r=0;r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o,a=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=c();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),i=(o=r(69590))&&o.__esModule?o:{default:o},u=r(85741),l=r(38045);function c(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return c=function(){return e},e}function s(){return s=Object.assign||function(e){for(var t=1;t0&&e<1){var n=this.player.getDuration();return n?void this.player.seekTo(n*e):void console.warn("ReactPlayer: could not seek using fraction \u2013\xa0duration not yet available")}this.player.seekTo(e)}else 0!==e&&(this.seekOnPlay=e,setTimeout((function(){r.seekOnPlay=null}),5e3))}},{key:"render",value:function(){var e=this.props.activePlayer;return e?a.default.createElement(e,s({},this.props,{onMount:this.handlePlayerMount,onReady:this.handleReady,onPlay:this.handlePlay,onPause:this.handlePause,onEnded:this.handleEnded,onLoaded:this.handleLoaded,onError:this.handleError})):null}}],r&&f(t.prototype,r),n&&f(t,n),u}(a.Component);t.default=v,b(v,"displayName","Player"),b(v,"propTypes",u.propTypes),b(v,"defaultProps",u.defaultProps)},83855:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=a();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var u=o?Object.getOwnPropertyDescriptor(e,i):null;u&&(u.get||u.set)?Object.defineProperty(r,i,u):r[i]=e[i]}r.default=e,t&&t.set(e,r);return r}(r(67294));function a(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return a=function(){return e},e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createReactPlayer=void 0;var n=k(r(67294)),o=s(r(9996)),a=s(r(30845)),i=s(r(69590)),u=r(85741),l=r(38045),c=s(r(60722));function s(e){return e&&e.__esModule?e:{default:e}}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function y(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&void 0!==arguments[0]?arguments[0]:"player";return r.player?r.player.getInternalPlayer(e):null})),w(g(r),"seekTo",(function(e,t){if(!r.player)return null;r.player.seekTo(e,t)})),w(g(r),"handleReady",(function(){r.props.onReady(g(r))})),w(g(r),"getActivePlayer",(0,a.default)((function(r){for(var n=0,o=[].concat(T,h(e));n{"use strict";t.Z=void 0;var n,o=(n=r(86497))&&n.__esModule?n:{default:n},a=r(70390);var i=o.default[o.default.length-1],u=(0,a.createReactPlayer)(o.default,i);t.Z=u},71776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.canPlay=t.FLV_EXTENSIONS=t.DASH_EXTENSIONS=t.HLS_EXTENSIONS=t.VIDEO_EXTENSIONS=t.AUDIO_EXTENSIONS=t.MATCH_URL_KALTURA=t.MATCH_URL_VIDYARD=t.MATCH_URL_MIXCLOUD=t.MATCH_URL_DAILYMOTION=t.MATCH_URL_TWITCH_CHANNEL=t.MATCH_URL_TWITCH_VIDEO=t.MATCH_URL_WISTIA=t.MATCH_URL_STREAMABLE=t.MATCH_URL_FACEBOOK_WATCH=t.MATCH_URL_FACEBOOK=t.MATCH_URL_VIMEO=t.MATCH_URL_SOUNDCLOUD=t.MATCH_URL_YOUTUBE=void 0;var n=r(38045);function o(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return a(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,l=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return u=e.done,e},e:function(e){l=!0,i=e},f:function(){try{u||null==r.return||r.return()}finally{if(l)throw i}}}}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(){return l=Object.assign||function(e){for(var t=1;t{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(){return l=Object.assign||function(e){for(var t=1;t1,v=h&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||b)&&!window.MSStream,m=h&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent)&&!window.MSStream,P=/www\.dropbox\.com\/.+/,g=/https:\/\/watch\.cloudflarestream\.com\/([a-z0-9]+)/,O=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(y,e);var t,r,n,u=f(y);function y(){var e;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,y);for(var t=arguments.length,r=new Array(t),n=0;n0?r.end(r.length-1):t}},{key:"getCurrentTime",value:function(){return this.player?this.player.currentTime:null}},{key:"getSecondsLoaded",value:function(){if(!this.player)return null;var e=this.player.buffered;if(0===e.length)return 0;var t=e.end(e.length-1),r=this.getDuration();return t>r?r:t}},{key:"getSource",value:function(e){var t=this.shouldUseHLS(e),r=this.shouldUseDASH(e),n=this.shouldUseFLV(e);if(!(e instanceof Array||(0,a.isMediaStream)(e)||t||r||n))return P.test(e)?e.replace("www.dropbox.com","dl.dropboxusercontent.com"):e}},{key:"render",value:function(){var e=this.props,t=e.url,r=e.playing,n=e.loop,a=e.controls,i=e.muted,u=e.config,c=e.width,s=e.height,f=this.shouldUseAudio(this.props)?"audio":"video",p={width:"auto"===c?c:"100%",height:"auto"===s?s:"100%"};return o.default.createElement(f,l({ref:this.ref,src:this.getSource(t),style:p,preload:"auto",autoPlay:r||void 0,controls:a,muted:i,loop:n},u.attributes),t instanceof Array&&t.map(this.renderSourceElement),u.tracks.map(this.renderTrack))}}])&&c(t.prototype,r),n&&c(t,n),y}(o.Component);t.default=O,d(O,"displayName","FilePlayer"),d(O,"canPlay",i.canPlay.file)},73911:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){for(var r=0;r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){for(var r=0;r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e,t){for(var r=0;r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e,t){for(var r=0;r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e,t){for(var r=0;r{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,t&&t.set(e,r);return r}(r(67294)),a=r(38045),i=r(71776);function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=r(67294),o=r(38045),a=r(71776);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function u(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return u=function(){return e},e}function l(e){if(e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var t=u();if(t&&t.has(e))return t.get(e);var r={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var a=n?Object.getOwnPropertyDescriptor(e,o):null;a&&(a.get||a.set)?Object.defineProperty(r,o,a):r[o]=e[o]}return r.default=e,t&&t.set(e,r),r}var c=[{key:"youtube",name:"YouTube",canPlay:a.canPlay.youtube,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(60356))}))}))},{key:"soundcloud",name:"SoundCloud",canPlay:a.canPlay.soundcloud,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(72648))}))}))},{key:"vimeo",name:"Vimeo",canPlay:a.canPlay.vimeo,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(80868))}))}))},{key:"facebook",name:"Facebook",canPlay:a.canPlay.facebook,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(31972))}))}))},{key:"streamable",name:"Streamable",canPlay:a.canPlay.streamable,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(50993))}))}))},{key:"wistia",name:"Wistia",canPlay:a.canPlay.wistia,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(8018))}))}))},{key:"twitch",name:"Twitch",canPlay:a.canPlay.twitch,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(29482))}))}))},{key:"dailymotion",name:"DailyMotion",canPlay:a.canPlay.dailymotion,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(36807))}))}))},{key:"mixcloud",name:"Mixcloud",canPlay:a.canPlay.mixcloud,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(50143))}))}))},{key:"vidyard",name:"Vidyard",canPlay:a.canPlay.vidyard,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(36596))}))}))},{key:"kaltura",name:"Kaltura",canPlay:a.canPlay.kaltura,lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(73911))}))}))},{key:"file",name:"FilePlayer",canPlay:a.canPlay.file,canEnablePIP:function(e){return a.canPlay.file(e)&&(document.pictureInPictureEnabled||(0,o.supportsWebKitPresentationMode)())&&!a.AUDIO_EXTENSIONS.test(e)},lazyPlayer:(0,n.lazy)((function(){return Promise.resolve().then((function(){return l(r(14926))}))}))}];t.default=c},85741:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultProps=t.propTypes=void 0;var n,o=(n=r(45697))&&n.__esModule?n:{default:n};var a=o.default.string,i=o.default.bool,u=o.default.number,l=o.default.array,c=o.default.oneOfType,s=o.default.shape,f=o.default.object,p=o.default.func,y=o.default.node,d={url:c([a,l,f]),playing:i,loop:i,controls:i,volume:u,muted:i,playbackRate:u,width:c([a,u]),height:c([a,u]),style:f,progressInterval:u,playsinline:i,pip:i,stopOnUnmount:i,light:c([i,a,f]),playIcon:y,previewTabIndex:u,fallback:y,oEmbedUrl:a,wrapper:c([a,p,s({render:p.isRequired})]),config:s({soundcloud:s({options:f}),youtube:s({playerVars:f,embedOptions:f,onUnstarted:p}),facebook:s({appId:a,version:a,playerId:a,attributes:f}),dailymotion:s({params:f}),vimeo:s({playerOptions:f,title:a}),file:s({attributes:f,tracks:l,forceVideo:i,forceAudio:i,forceHLS:i,forceSafariHLS:i,forceDASH:i,forceFLV:i,hlsOptions:f,hlsVersion:a,dashVersion:a,flvVersion:a}),wistia:s({options:f,playerId:a,customControls:l}),mixcloud:s({options:f}),twitch:s({options:f,playerId:a}),vidyard:s({options:f})}),onReady:p,onStart:p,onPlay:p,onPause:p,onBuffer:p,onBufferEnd:p,onEnded:p,onError:p,onDuration:p,onSeek:p,onPlaybackRateChange:p,onProgress:p,onClickPreview:p,onEnablePIP:p,onDisablePIP:p};t.propTypes=d;var h=function(){},b={playing:!1,loop:!1,controls:!1,volume:null,muted:!1,playbackRate:1,width:"640px",height:"360px",style:{},progressInterval:1e3,playsinline:!1,pip:!1,stopOnUnmount:!0,light:!1,fallback:null,wrapper:"div",previewTabIndex:0,oEmbedUrl:"https://noembed.com/embed?url={url}",config:{soundcloud:{options:{visual:!0,buying:!1,liking:!1,download:!1,sharing:!1,show_comments:!1,show_playcount:!1}},youtube:{playerVars:{playsinline:1,showinfo:0,rel:0,iv_load_policy:3,modestbranding:1},embedOptions:{},onUnstarted:h},facebook:{appId:"1309697205772819",version:"v3.3",playerId:null,attributes:{}},dailymotion:{params:{api:1,"endscreen-enable":!1}},vimeo:{playerOptions:{autopause:!1,byline:!1,portrait:!1,title:!1},title:null},file:{attributes:{},tracks:[],forceVideo:!1,forceAudio:!1,forceHLS:!1,forceDASH:!1,forceFLV:!1,hlsOptions:{},hlsVersion:"1.1.4",dashVersion:"3.1.3",flvVersion:"1.5.0"},wistia:{options:{},playerId:null,customControls:null},mixcloud:{options:{hide_cover:1}},twitch:{options:{},playerId:null},vidyard:{options:{}}},onReady:h,onStart:h,onPlay:h,onPause:h,onBuffer:h,onBufferEnd:h,onEnded:h,onError:h,onDuration:h,onSeek:h,onPlaybackRateChange:h,onProgress:h,onClickPreview:h,onEnablePIP:h,onDisablePIP:h};t.defaultProps=b},38045:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.parseStartTime=function(e){return p(e,l)},t.parseEndTime=function(e){return p(e,c)},t.randomString=function(){return Math.random().toString(36).substr(2,5)},t.queryString=function(e){return Object.keys(e).map((function(t){return"".concat(t,"=").concat(e[t])})).join("&")},t.getSDK=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){return!0},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:n.default,i=y(t);if(i&&o(i))return Promise.resolve(i);return new Promise((function(n,o){if(d[e])d[e].push({resolve:n,reject:o});else{d[e]=[{resolve:n,reject:o}];var i=function(t){d[e].forEach((function(e){return e.resolve(t)}))};if(r){var u=window[r];window[r]=function(){u&&u(),i(y(t))}}a(e,(function(n){n?(d[e].forEach((function(e){return e.reject(n)})),d[e]=null):r||i(y(t))}))}}))},t.getConfig=function(e,t){return(0,o.default)(t.config,e.config)},t.omit=function(e){for(var t,r=arguments.length,n=new Array(r>1?r-1:0),o=1;o1?n-1:0),a=1;a0&&void 0!==arguments[0]?arguments[0]:document.createElement("video"),t=!1===/iPhone|iPod/.test(navigator.userAgent);return e.webkitSupportsPresentationMode&&"function"==typeof e.webkitSetPresentationMode&&t};var n=a(r(49090)),o=a(r(9996));function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var r=[],n=!0,o=!1,a=void 0;try{for(var i,u=e[Symbol.iterator]();!(n=(i=u.next()).done)&&(r.push(i.value),!t||r.length!==t);n=!0);}catch(l){o=!0,a=l}finally{try{n||null==u.return||u.return()}finally{if(o)throw a}}return r}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/5","page":5,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/4","nextPage":"/cardano-updates/tags/hydra/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/51bf60d9.2a2866d6.js b/assets/js/51bf60d9.2a2866d6.js new file mode 100644 index 00000000000..901ababee7c --- /dev/null +++ b/assets/js/51bf60d9.2a2866d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62901],{3905:(e,t,o)=>{o.d(t,{Zo:()=>l,kt:()=>h});var r=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function i(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},l=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),c=p(o),m=n,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||a;return o?r.createElement(h,i(i({ref:t},l),{},{components:o})):r.createElement(h,i({ref:t},l))}));function h(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=m;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[c]="string"==typeof e?e:n,i[1]=s;for(var p=2;p{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var r=o(87462),n=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-05-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-05-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-network.md",source:"@site/blog/2023-05-12-network.md",title:"Network Team Update",description:"High level summary",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.79,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-05-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-12-hydra"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-05-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed summary",id:"detailed-summary",level:2}],l={toc:p},c="wrapper";function d(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,r.Z)({},l,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We started working on a new way to switch between root & ledger peers (see\nbelow). We continued to work on ",(0,n.kt)("inlineCode",{parentName:"p"},"eclipse-evasion"),". We merged changes to\nHandshake contributed by Galois Inc. We made improvements to our tests (fixed\na flaky test, added cddl specs for ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionData")," and\n",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToClientVersionData"),"). We improved our CI and automated the process of\nreleasing new package version to ",(0,n.kt)("inlineCode",{parentName:"p"},"CHaP"),"."),(0,n.kt)("h2",{id:"detailed-summary"},"Detailed summary"),(0,n.kt)("p",null,"We continued to work on testing ",(0,n.kt)("inlineCode",{parentName:"p"},"eclipse-evasion"),"."),(0,n.kt)("p",null,"We came up with an idea to limit how full node wallets relay on root peers\n(currently operated by IOG, in future also CF and Emurgo). We designed\na switch to use ledger peers if the node tip is close enough to the current\ntime. For more details see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"#4530"),"."),(0,n.kt)("p",null,"We merged changes to the handshake mini-protocol which allow one to query\nserver's ",(0,n.kt)("inlineCode",{parentName:"p"},"node-to-node")," / ",(0,n.kt)("inlineCode",{parentName:"p"},"node-to-client")," parameters. We are grateful to\nGalois Inc. for implementing it, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4256"},"#4256")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4538"},"#4538"),". We published new version\nof packages to CHaP ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/253"},"chap-#253"),"."),(0,n.kt)("p",null,"We added ",(0,n.kt)("inlineCode",{parentName:"p"},"DiffusionError")," wrapper. Thanks to it, ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," will\nnot duplicate diffusion errors messages in the log, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4537"},"#4537"),"."),(0,n.kt)("p",null,"We fixed an issue which caused one of our tests to be flaky, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4515"},"#4515"),"."),(0,n.kt)("p",null,"We added cddl tests for ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionData")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToClientVersionData"),":\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4540"},"#4540"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4544"},"#4544")," (in review)."),(0,n.kt)("p",null,"We wrote scripts which will help us release packages as well as verify that we\nreleased all the package necessary to build the newest set of packages,\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4542"},"#4542"),"."),(0,n.kt)("p",null,"We renamed the consensus startup tracer and make sure it doesn't log\n",(0,n.kt)("inlineCode",{parentName:"p"},"ExitSuccess")," exceptions, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pulls/71"},"consensus-#71"),"."),(0,n.kt)("p",null,"We reviewed PR which adds ",(0,n.kt)("inlineCode",{parentName:"p"},"RawBearer")," API, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4395"},"#4395"),"."),(0,n.kt)("p",null,"We made series of improvements to our CI:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4539"},"#4539"),": we don't need to install cryptographic libraries in CI;"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4545"},"#4545"),": Javier Sagredo (consensus) cleaned up CI after ",(0,n.kt)("inlineCode",{parentName:"li"},"consensus")," moved\nto a new repo;"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4546"},"#4546"),": we switched to use ",(0,n.kt)("a",{parentName:"li",href:"https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue"},"GitHub merge queues"),";"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4549"},"#4549"),": we made it possible to trigger building haddocks manually;"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4553"},"#4553"),": we fixed and enhanced caching of building dependencies.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/51cf8946.e4f02867.js b/assets/js/51cf8946.e4f02867.js new file mode 100644 index 00000000000..5a51ea26a49 --- /dev/null +++ b/assets/js/51cf8946.e4f02867.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6324],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=d(a),m=n,h=c["".concat(s,".").concat(m)]||c[m]||u[m]||o;return a?r.createElement(h,i(i({ref:t},p),{},{components:a})):r.createElement(h,i({ref:t},p))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-11-25-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-25-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-25-hydra.md",source:"@site/blog/2022-11-25-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-11-25T00:00:00.000Z",formattedDate:"November 25, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.73,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-25-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-25-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-23-ledger"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:d},c="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a ",(0,n.kt)("a",{parentName:"p",href:"https://summit.cardano.org/agenda-day-2/cardano-ballot-speaker-winner-presentation-6/"},"presentation")," about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Attended the Cardano Summit in Lausanne. Hydra was topic of one talk: ",(0,n.kt)("a",{parentName:"li",href:"https://summit.cardano.org/agenda-day-2/cardano-ballot-speaker-winner-presentation-6/"},"https://summit.cardano.org/agenda-day-2/cardano-ballot-speaker-winner-presentation-6/")),(0,n.kt)("li",{parentName:"ul"},"Had a team workshop / hackathon after the summit:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Retrospective"),(0,n.kt)("li",{parentName:"ul"},"Impact mapping session"),(0,n.kt)("li",{parentName:"ul"},"Hacked on smaller things"))),(0,n.kt)("li",{parentName:"ul"},"Got a PR for tullia/cicero things by @kdermetfan")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting"),(0,n.kt)("li",{parentName:"ul"},"Tie up several loose ends / branches."),(0,n.kt)("li",{parentName:"ul"},"Resolve Tx validity discussions & PRs."),(0,n.kt)("li",{parentName:"ul"},"Review cicero PR & try it out.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5226ad4f.b1d14706.js b/assets/js/5226ad4f.b1d14706.js new file mode 100644 index 00000000000..fdfe3fa0cb1 --- /dev/null +++ b/assets/js/5226ad4f.b1d14706.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17214],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=u(a),h=n,c=m["".concat(p,".").concat(h)]||m[h]||d[h]||l;return a?r.createElement(c,i(i({ref:t},s),{},{components:a})):r.createElement(c,i({ref:t},s))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=h;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:n,i[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-08-18-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-08-18-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-ledger.md",source:"@site/blog/2023-08-18-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-08-18-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-18-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-18-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway progress",id:"conway-progress",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],s={toc:u},m="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The ledger team made great progress in advancing Conway era forward. In particular, voting\nfor DRep and Stake Pool Operators is now at the state that can be used by downstream\ncomponents. Addition of new ledger state queries makes it possible to verify changes to\nthe governance state, such as placement of votes, submission of governance proposals,\ninspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the\nability to enact all of the governance actions, except for the hard fork initiation."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-progress"},"Conway progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3577"},"pull-3577")," - Move ",(0,n.kt)("inlineCode",{parentName:"li"},"PParams")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"GovState")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3609"},"pull-3609")," - Adjust thresholds for sanchonet"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3604"},"pull-3604")," - README: update CIP-1694 link"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3616"},"pull-3616")," - Switch ",(0,n.kt)("inlineCode",{parentName:"li"},"TreasuryWithdrawals")," to use ",(0,n.kt)("inlineCode",{parentName:"li"},"RewardAcnt")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3599"},"pull-3599")," - Add governance action well-formedness check"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3607"},"pull-3607")," - Rename governance to gov"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3601"},"pull-3601")," - Added ",(0,n.kt)("inlineCode",{parentName:"li"},"DRep")," anchors"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3615"},"pull-3615")," - Add optional previous ",(0,n.kt)("inlineCode",{parentName:"li"},"GovActionId")," in some ",(0,n.kt)("inlineCode",{parentName:"li"},"ProposalProcedures")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3596"},"pull-3596")," - Upgradeable families"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3625"},"pull-3625")," - Change constitution to use ",(0,n.kt)("inlineCode",{parentName:"li"},"Anchor")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3592"},"pull-3592")," - Added pulsing incremental computation of the DRep distribution"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3523"},"pull-3523")," - Treasury donations"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3633"},"pull-3633")," - Prevent state changes on phase2 failure"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3634"},"pull-3634")," - Disable serialization of protocolVersion param update"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3630"},"pull-3630")," - Implemented DRep refreshing"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3640"},"pull-3640")," - Remove crypto parameterization from ",(0,n.kt)("inlineCode",{parentName:"li"},"AnchorData")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3636"},"pull-3636"),' - Implement DRep ratification with an "always passing"; threshold'),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3648"},"pull-3648")," - Governance queries"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3650"},"pull-3650")," - Change environment for ",(0,n.kt)("inlineCode",{parentName:"li"},"ShelleyPOOLREAP")," rule"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3658"},"pull-3658")," - Set ",(0,n.kt)("inlineCode",{parentName:"li"},"DRep")," ratify threshold to 51%"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3628"},"pull-3628")," - ",(0,n.kt)("inlineCode",{parentName:"li"},"DELEG"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"POOL"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"GOVCERT")," conformance with Spec v0.8")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3619"},"pull-3619")," - Disabled a broken test")),(0,n.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3660"},"pull-3660")," - Fix bounds and versions"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3661"},"pull-3661")," - Adjust versions, bounds and CHANGELOGs to account for the latest release")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5296f864.dabe31b3.js b/assets/js/5296f864.dabe31b3.js new file mode 100644 index 00000000000..57b6f9772b1 --- /dev/null +++ b/assets/js/5296f864.dabe31b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6255],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},c),{},{components:n})):r.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"SRE Q2 2023 Update",slug:"2023-Q2-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2023-Q2-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-sre.md",source:"@site/quarterly/2023-Q2-sre.md",title:"SRE Q2 2023 Update",description:"2023-04 - 2023-06",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"sre",permalink:"/cardano-updates/quarterly/tags/sre"}],readingTime:.68,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Q2 2023 Update",slug:"2023-Q2-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-network"},nextItem:{title:"Performance & Tracing Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"2023-04 - 2023-06",id:"2023-04---2023-06",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Next steps",id:"next-steps",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"2023-04---2023-06"},"2023-04 - 2023-06"),(0,a.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,a.kt)("p",null,"In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Expanding the darwin CI cluster and adding aarch64 builder support"),(0,a.kt)("li",{parentName:"ul"},"Adding bare metal capability to bitte clusters"),(0,a.kt)("li",{parentName:"ul"},"Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality"),(0,a.kt)("li",{parentName:"ul"},"Creation of pool performance analysis queries and scripting"),(0,a.kt)("li",{parentName:"ul"},"Migration of testnet metadata server to cardano-world"),(0,a.kt)("li",{parentName:"ul"},"Cardano shelley qa migration to cardano-world"),(0,a.kt)("li",{parentName:"ul"},"Cardano sanchonet environment spin up to test Conway era functionality"),(0,a.kt)("li",{parentName:"ul"},"Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature")),(0,a.kt)("h3",{id:"next-steps"},"Next steps"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Continue with the conversion of mainnet to using p2p topology")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/52b8fa8a.b3e53016.js b/assets/js/52b8fa8a.b3e53016.js new file mode 100644 index 00000000000..c1acf0af0a9 --- /dev/null +++ b/assets/js/52b8fa8a.b3e53016.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[19516],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(a),h=n,m=d["".concat(u,".").concat(h)]||d[h]||c[h]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-25-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-25-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-25-hydra.md",source:"@site/blog/2023-08-25-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-25T00:00:00.000Z",formattedDate:"August 25, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.875,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-25-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-28-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-24-performance-and-tracing"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},d="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team conducted the monthly review meeting for Agust,which\ncontinously ensures transparent communication and project evaluation."),(0,n.kt)("p",null,"In terms of community engagement, the Hydra team gave a Hydra master-class at\nRareEvo workshop as an educational initiative for the community.\nAdditionally, the team updated the Hydra demo and tutorial to include Mithril\nand latest release changes."),(0,n.kt)("p",null,"They also focused on exploring the Hydra network resiliance in order to improve\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," availability, as it becomes stuck very easily and that leads to a\nbad user experience."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hydra master-class at RareEvo workshop!"),(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting"),(0,n.kt)("li",{parentName:"ul"},"Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff"),(0,n.kt)("li",{parentName:"ul"},"Groomed network resilience and explorer features ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"New ADR for \u201cResourced based API\u201d ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1028"},"#1028"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Have a poc on network resilience working ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"Fix issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/931"},"#931"),": \u201cChain state in head state not updated on replayed observation\u201d"),(0,n.kt)("li",{parentName:"ul"},"Fix issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1039"},"#1039"),': "Close transaction dropped from cardano-node"')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/533a09ca.3d88b763.js b/assets/js/533a09ca.3d88b763.js new file mode 100644 index 00000000000..7fb2a6fd89a --- /dev/null +++ b/assets/js/533a09ca.3d88b763.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54607],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function s(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),c=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},b=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),b=n,d=p["".concat(l,".").concat(b)]||p[b]||g[b]||o;return r?a.createElement(d,s(s({ref:t},u),{},{components:r})):a.createElement(d,s({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,s=new Array(o);s[0]=b;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:n,s[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>g,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={sidebar_position:3},s="Create a Blog Post",i={unversionedId:"tutorial-basics/create-a-blog-post",id:"tutorial-basics/create-a-blog-post",title:"Create a Blog Post",description:"Docusaurus creates a page for each blog post, but also a blog index page, a tag system, an RSS feed...",source:"@site/docs/tutorial-basics/create-a-blog-post.md",sourceDirName:"tutorial-basics",slug:"/tutorial-basics/create-a-blog-post",permalink:"/cardano-updates/docs/tutorial-basics/create-a-blog-post",draft:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"defaultSidebar",previous:{title:"Create a Document",permalink:"/cardano-updates/docs/tutorial-basics/create-a-document"},next:{title:"Markdown Features",permalink:"/cardano-updates/docs/tutorial-basics/markdown-features"}},l={},c=[{value:"Create your first Post",id:"create-your-first-post",level:2}],u={toc:c},p="wrapper";function g(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"create-a-blog-post"},"Create a Blog Post"),(0,n.kt)("p",null,"Docusaurus creates a ",(0,n.kt)("strong",{parentName:"p"},"page for each blog post"),", but also a ",(0,n.kt)("strong",{parentName:"p"},"blog index page"),", a ",(0,n.kt)("strong",{parentName:"p"},"tag system"),", an ",(0,n.kt)("strong",{parentName:"p"},"RSS")," feed..."),(0,n.kt)("h2",{id:"create-your-first-post"},"Create your first Post"),(0,n.kt)("p",null,"Create a file at ",(0,n.kt)("inlineCode",{parentName:"p"},"blog/2021-02-28-greetings.md"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-md",metastring:'title="blog/2021-02-28-greetings.md"',title:'"blog/2021-02-28-greetings.md"'},"---\nslug: greetings\ntitle: Greetings!\nauthors:\n - name: Joel Marcey\n title: Co-creator of Docusaurus 1\n url: https://github.com/JoelMarcey\n image_url: https://github.com/JoelMarcey.png\n - name: S\xe9bastien Lorber\n title: Docusaurus maintainer\n url: https://sebastienlorber.com\n image_url: https://github.com/slorber.png\ntags: [greetings]\n---\n\nCongratulations, you have made your first post!\n\nFeel free to play around and edit this post as much you like.\n")),(0,n.kt)("p",null,"A new blog post is now available at ",(0,n.kt)("a",{parentName:"p",href:"http://localhost:3000/blog/greetings"},"http://localhost:3000/blog/greetings"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/533bb9dc.b96dad64.js b/assets/js/533bb9dc.b96dad64.js new file mode 100644 index 00000000000..1d3b795ca13 --- /dev/null +++ b/assets/js/533bb9dc.b96dad64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70022],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(n),m=o,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||r;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=n(87462),o=(n(67294),n(3905));const r={title:"Network Team Update",slug:"2022-11-28-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-11-28-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-28-network.md",source:"@site/blog/2022-11-28-network.md",title:"Network Team Update",description:"Stake-Driven Data Diffusion Release for Relays",date:"2022-11-28T00:00:00.000Z",formattedDate:"November 28, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"},{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:3.675,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-11-28-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-30-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-25-crypto"}},l={authorsImageUrls:[void 0]},p=[{value:"Stake-Driven Data Diffusion Release for Relays",id:"stake-driven-data-diffusion-release-for-relays",level:2},{value:"Peer Sharing",id:"peer-sharing",level:3},{value:"DeltaQ",id:"deltaq",level:3},{value:"What have we achieve last sprint",id:"what-have-we-achieve-last-sprint",level:2},{value:"DeltaQ",id:"deltaq-1",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"stake-driven-data-diffusion-release-for-relays"},"Stake-Driven Data Diffusion Release for Relays"),(0,o.kt)("p",null,"IOG networking team decided to release the ",(0,o.kt)("em",{parentName:"p"},"Stake-Driven Data Diffusion with\nRobust Optimised Peer Selection")," also more commonly known as ",(0,o.kt)("em",{parentName:"p"},"P2P"),". In the\nlast update, we informed about a performance regression, but it turns out it\nonly affects block producers, and thus we highly advise against running it on\nsuch nodes. Further investigation is required to find the cause of it."),(0,o.kt)("p",null,"On IOG's benchmarking cluster we have seen quite a good performance improvement\non block propagation itself. The cluster is running a static topology with\nvalency 6 (each node is connected to 6 other nodes). In which every of the 50\nnodes are block producers. The setup of this network is the same as mainnet.\nWe've seen 40-50% performance improvement on block propagation comparing to the\nsame cluster deployed with the same topology but using non-P2P nodes. We think\nthis performance improvement is caused by using full duplex connections. Quite\nlikely the transaction traffic floating in both directions on the same TCP\nconnection helps to keep the TCP window open. Note that in a cluster of 50\nnodes with valency 6 the probability of having at least one duplex connection\nis more than 50%. We don't expect the same improvement on mainnet because the\nnetwork is much wider and the transaction traffic is not as large."),(0,o.kt)("p",null,"Just before the release we squashed two small bugs:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4163"},"issue #4163")," - top level integration bug in ",(0,o.kt)("inlineCode",{parentName:"li"},"keep-alive"),";"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177")," - a bug in ",(0,o.kt)("inlineCode",{parentName:"li"},"outbound-governor"),";"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4165"},"PR #4165")," - a fix ",(0,o.kt)("inlineCode",{parentName:"li"},"cardano-ping")," support of ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToNodeV_10"),".")),(0,o.kt)("h3",{id:"peer-sharing"},"Peer Sharing"),(0,o.kt)("p",null,"We were carrying a review of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"peer sharing PR"),"."),(0,o.kt)("h3",{id:"deltaq"},"DeltaQ"),(0,o.kt)("p",null,"Neil Davies was invited to give a guest lecture entitled ",(0,o.kt)("inlineCode",{parentName:"p"},"Avoiding System Catastrophes")," at ",(0,o.kt)("a",{parentName:"p",href:"https://uclouvain.be/en/index.html"},"UCLouvain"),"."),(0,o.kt)("h2",{id:"what-have-we-achieve-last-sprint"},"What have we achieve last sprint"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4163"},"issue #4163"),": we found out that a control message is not passed to the\n",(0,o.kt)("inlineCode",{parentName:"p"},"keep-alive")," mini-protocol, this results in every demotion executing demotion\ntimeout rather than a graceful termination. With the fix the node will no longer log:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-json"},'{ "kind": "PeerStatusChangeFailure"\n, "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"\n, "reason": "TimeoutError"\n}\n'))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177"),": we fixed an assertion failure in the ",(0,o.kt)("inlineCode",{parentName:"p"},"outbound-governor"),"; now\nwe don't try demoted peers which are being demoted already.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4155"},"PR #4155"),": we refactored ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," packages. There's a top level\n",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-diffusion")," package which integrates ",(0,o.kt)("inlineCode",{parentName:"p"},"network"),"\n& ",(0,o.kt)("inlineCode",{parentName:"p"},"consensus")," code. We also introduced:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ouroboros-network-api")," package which contains the API shared between\n",(0,o.kt)("inlineCode",{parentName:"li"},"network")," & ",(0,o.kt)("inlineCode",{parentName:"li"},"conensus"),";"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ouroboros-network-mock")," package which contains mock API used for testing\n(e.g. a mock chain & chain producer, etc.)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ouroboros-network-protocols")," package which contains implementation of all\n(but ",(0,o.kt)("inlineCode",{parentName:"li"},"handshake"),") mini-protocols, exposes a ",(0,o.kt)("inlineCode",{parentName:"li"},"testlib")," and contains ",(0,o.kt)("inlineCode",{parentName:"li"},"test"),"\nand ",(0,o.kt)("inlineCode",{parentName:"li"},"cddl")," components.")),(0,o.kt)("p",{parentName:"li"},"This made the dependency tree of ",(0,o.kt)("inlineCode",{parentName:"p"},"network")," & ",(0,o.kt)("inlineCode",{parentName:"p"},"consensus")," packages much\ncleaner.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4169"},"PR #4169"),": we described the usage of release branches in ",(0,o.kt)("inlineCode",{parentName:"p"},"CONTRIBUTING.md"),"\ndoc.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4165"},"PR #4165"),": we fixed ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ping")," support of ",(0,o.kt)("inlineCode",{parentName:"p"},"NodeToNodeV_10")," protocol."))),(0,o.kt)("h3",{id:"deltaq-1"},"DeltaQ"),(0,o.kt)("p",null,"The abstract of the talk:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"An essential step to ensuring that distributed systems are fit for\npurpose."),(0,o.kt)("p",{parentName:"blockquote"},"Distributed systems have become an integral part of our society and\ndaily lives. We are, both implicitly and explicitly, individually as well as\ncollectively, placing ever more trust in them."),(0,o.kt)("p",{parentName:"blockquote"},"Are they worthy of this trust? Our need for them to be \u2018fit-for-purpose\u2019 goes\nwell beyond notions of functional correctness (i.e. never getting the wrong\nanswer). We need them to deliver the desired outcomes in a timely, robust,\nreliable, resilient fashion, at scale and in a sustainable way (both\neconomically and environmentally)."),(0,o.kt)("p",{parentName:"blockquote"},"This all sounds like a worthy aspiration, but what would be a practical\napproach to capturing and reasoning about these issues? How can we ensure that\nsystems can meet their fit-for-purpose objectives, not just in their design but\nas they are deployed, encounter the imperfect world, are scaled to become\neconomic, and proceed into ongoing maintenance?"),(0,o.kt)("p",{parentName:"blockquote"},"This talk will illustrate how the notions of Outcomes and Quality Attenuation\n(as captured by \u2018\u2206Q\u2019) are being used to both frame the necessary notions and\nprovide a basis for assuring the refinement and reification of such systems,\nfrom initial concept to operational infrastructure.")),(0,o.kt)("p",null,"You can download the slides from ",(0,o.kt)("a",{target:"_blank",href:n(98946).Z},"here"),"."))}d.isMDXComponent=!0},98946:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/files/2022-11-24-UCL-60c46564c5dee25b0060304c060ab1cf.pdf"}}]); \ No newline at end of file diff --git a/assets/js/53f26dca.4f1881f6.js b/assets/js/53f26dca.4f1881f6.js new file mode 100644 index 00000000000..44557d0b4f4 --- /dev/null +++ b/assets/js/53f26dca.4f1881f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4775],{92006:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/44","page":44,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/43","nextPage":"/cardano-updates/page/45","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/54597942.94ae773b.js b/assets/js/54597942.94ae773b.js new file mode 100644 index 00000000000..68d6880d639 --- /dev/null +++ b/assets/js/54597942.94ae773b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33596],{64660:a=>{a.exports=JSON.parse('{"label":"network","permalink":"/cardano-updates/tags/network","allTagsPath":"/cardano-updates/tags","count":24}')}}]); \ No newline at end of file diff --git a/assets/js/548ef7ca.87502d26.js b/assets/js/548ef7ca.87502d26.js new file mode 100644 index 00000000000..38bb57d12dc --- /dev/null +++ b/assets/js/548ef7ca.87502d26.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25578],{8960:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/21","page":21,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/20","nextPage":"/cardano-updates/page/22","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/54a7c81e.d059c59c.js b/assets/js/54a7c81e.d059c59c.js new file mode 100644 index 00000000000..0d9dac7ac8d --- /dev/null +++ b/assets/js/54a7c81e.d059c59c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16878],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,c=o(t,["components","mdxType","originalType","parentName"]),d=u(a),h=r,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||i;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[d]="string"==typeof t?t:r,l[1]=o;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-10-24-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-10-24-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-24-node-cli-api.md",source:"@site/blog/2023-10-24-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-10-24T00:00:00.000Z",formattedDate:"October 24, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.68,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-10-24-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-25-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-20-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},d="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-10-11---2023-10-24"},"2023-10-11 - 2023-10-24"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CARDANO-CLI"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"stake-address-info")," now shows deposits balance."),(0,r.kt)("li",{parentName:"ul"},"Added ",(0,r.kt)("inlineCode",{parentName:"li"},"conway governance action view")," to allow to inspect governance action files before submitting them on a transaction."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"build-raw")," support for ",(0,r.kt)("inlineCode",{parentName:"li"},"--vote-file")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"--proposal-file"))),(0,r.kt)("p",null,"CARDANO-API"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Support DRep extended keys"),(0,r.kt)("li",{parentName:"ul"},"Support Plutus V1 in Conway")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/394"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.28.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/393"},"Simplify ",(0,r.kt)("inlineCode",{parentName:"a"},"toTxOutInAnyEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/390"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.27.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/389"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.26.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/380"},"Check that poll answer index is not negative, to avoid a Prelude.!! error")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/379"},"drep registration-certificate: add a golden test")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/378"},"Disambiguate treasury withdrawal flags")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/375"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"stake-address-info")," query also return deposit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/374"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"conway governance action view"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/372"},"Ch/clearer anchor flags")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/371"},"Command argument types for ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/370"},"Remove eras' constitution-hash")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/368"},"Shelley to Alonzo: add create-genesis-key-delegation-certificate to governance")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/367"},"Enable reading of Conway ",(0,r.kt)("inlineCode",{parentName:"a"},"TxWitness"),"es")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/366"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"governance action create-protocol-parameters-update")," Conway onwards only")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/365"},(0,r.kt)("inlineCode",{parentName:"a"},"transaction build-raw")," support for ",(0,r.kt)("inlineCode",{parentName:"a"},"--vote-file")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"--proposal-file"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/364"},"Command argument types for governance key commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/363"},"Add test of voting using a cc hot key"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/338"},"Add Show instance for FoldBlocksError")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/336"},"Upgrade typed-protocols to 1.1.1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/332"},"Improved validity range handling")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/331"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.28.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/330"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"AlonzoEraOnly"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/329"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyToAlonzoEraToShelleyToBabbageEra")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/327"},"DRep extended key: add CastVerificationKeyRole")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/326"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardadno-api-8.27.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/325"},"Delete unnecessary calls to ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraints"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/324"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardadno-api-8.27.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/323"},"Support Plutus V1 in Conway")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/322"},"Parameterize GovernanceAction on era ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/320"},"Support DRep extended keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/317"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.26.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/314"},"Haddock document the case functions, so that their behavior is easier to understand when calling them")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/313"},"Avoid ",(0,r.kt)("inlineCode",{parentName:"a"},"IsShelleyBasedEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"IsCardanoEra")," where possible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/312"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"MaryEraOnly")," eon. Disjoint functions"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5515"},"Factor out file creation for SPO"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5504"},"Tracer documentation generation enhacements "))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/550cdc1d.5c224350.js b/assets/js/550cdc1d.5c224350.js new file mode 100644 index 00000000000..029a3a47c84 --- /dev/null +++ b/assets/js/550cdc1d.5c224350.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75730],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(r),m=a,g=d["".concat(p,".").concat(m)]||d[m]||u[m]||o;return r?n.createElement(g,i(i({ref:t},c),{},{components:r})):n.createElement(g,i({ref:t},c))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-02-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-03-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-goedel.md",source:"@site/blog/2023-02-03-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-02-03T00:00:00.000Z",formattedDate:"February 3, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.57,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-02-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-03-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-03-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This sprint the team has been preparing several papers for peer review\nand knowledge sharing and consulting within IO and the community."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"R&D Seminar on experience participating in a member based organisation"),(0,a.kt)("li",{parentName:"ul"},"Full day tutorial on performance engineering presented at HiPEAC\n2023 conference"),(0,a.kt)("li",{parentName:"ul"},"Finished preparing and submitted a paper on performance engineering\nto an ACM workshop"),(0,a.kt)("li",{parentName:"ul"},"Preparing a draft paper for future submission about verifying design\nrefinements for distributed system design"),(0,a.kt)("li",{parentName:"ul"},"Consulting on performance design of other IO projects")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/551db1ac.ee42f66f.js b/assets/js/551db1ac.ee42f66f.js new file mode 100644 index 00000000000..53e1fab62a7 --- /dev/null +++ b/assets/js/551db1ac.ee42f66f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86074],{62085:a=>{a.exports=JSON.parse('{"label":"mithril","permalink":"/cardano-updates/tags/mithril","allTagsPath":"/cardano-updates/tags","count":34}')}}]); \ No newline at end of file diff --git a/assets/js/55b9667a.9fc9a6eb.js b/assets/js/55b9667a.9fc9a6eb.js new file mode 100644 index 00000000000..aa2806547cb --- /dev/null +++ b/assets/js/55b9667a.9fc9a6eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75506],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>m});var n=o(67294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),l=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),h=l(o),d=r,m=h["".concat(s,".").concat(d)]||h[d]||c[d]||a;return o?n.createElement(m,i(i({ref:t},u),{},{components:o})):n.createElement(m,i({ref:t},u))}));function m(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[h]="string"==typeof e?e:r,i[1]=p;for(var l=2;l{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>p,toc:()=>l});var n=o(87462),r=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-03-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-03-02-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-02-network.md",source:"@site/blog/2023-03-02-network.md",title:"Network Team Update",description:"High level summary",date:"2023-03-02T00:00:00.000Z",formattedDate:"March 2, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.85,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-03-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-03-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-24-hydra"}},s={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed work log",id:"detailed-work-log",level:2}],u={toc:l},h="wrapper";function c(e){let{components:t,...o}=e;return(0,r.kt)(h,(0,n.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"In the current sprint the networking team focused on fixing bugs and pushing\nforward implementation of eclipse evasion. We also found a bug in our\nsimulation testing setup (in integration of test node). We also overviewed the\nwork on extending handshake protocol which is delivered by Galois Inc."),(0,r.kt)("p",null,"We published ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.4.0.1")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network-protocols-0.3.0.0")," to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/147"},"CHaP"),"."),(0,r.kt)("p",null,"We also fixed a bug in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," which results in not being able to\nconfigure inbound connection limits, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"PR #4902"),"."),(0,r.kt)("p",null,"Together with Karl Knutsson (CF) we realised an issue in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli"),": it's\nvalidation of DNS names, IP address & ports when registering a stake pool\nshould be more strict to protect against common mistakes which we identified on\nthe chain. See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4929"},"issue #4929"),"."),(0,r.kt)("h2",{id:"detailed-work-log"},"Detailed work log"),(0,r.kt)("p",null,"In ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," we fixed two bugs in peer state actions. First one results in\na busy loop if demotion from hot to warm times outs. This busy loop is\neventually exited when mux exits (we reported this in our previous report).\nThis fix made it to ",(0,r.kt)("inlineCode",{parentName:"p"},"1.35.6")," release as well."),(0,r.kt)("p",null,"In addition the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," also fixes another bug which results in ",(0,r.kt)("inlineCode",{parentName:"p"},"hot -> warm\n-> hot")," demotion / promotion busy loop."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," also fixed a bug in a node only used in simulation which\nresulted in not using ",(0,r.kt)("inlineCode",{parentName:"p"},"chain-sync")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"block-fetch")," mini-protocols. In the\nreview process, we realised that the header-body split in the simulated node\nrequires further work (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4419"},"PR #4419"),", which is under review)."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," also extend our generators, which together with the above fix,\ncover the ",(0,r.kt)("inlineCode",{parentName:"p"},"hot -> warm -> hot")," demotion / promotion busy loop."),(0,r.kt)("p",null,"In ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4419"},"PR #4419")," we introduce a ",(0,r.kt)("inlineCode",{parentName:"p"},"ChainDB")," for our simulation node, which plays\nsimilar role to ",(0,r.kt)("inlineCode",{parentName:"p"},"ChainDB")," in the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),": a persistent (across\nsimulated restarts) store of blocks which does chain selection. This ensures\nthat the simulated node is using ",(0,r.kt)("inlineCode",{parentName:"p"},"block-fetch")," to download blocks announced by\n",(0,r.kt)("inlineCode",{parentName:"p"},"chain-sync")," mini-protocol."),(0,r.kt)("p",null,"We also made progress with reviewing ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"PR #4019")," - peer sharing."),(0,r.kt)("p",null,"We also fixed ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4370"},"issue #4370")," - a connection manager test failure, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4384"},"PR #4384"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/55e35eab.f696c438.js b/assets/js/55e35eab.f696c438.js new file mode 100644 index 00000000000..ff5fc5f71ad --- /dev/null +++ b/assets/js/55e35eab.f696c438.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6249],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),c=n,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-12-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-12-06-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-06-mithril.md",source:"@site/blog/2023-12-06-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-12-06T00:00:00.000Z",formattedDate:"December 6, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.01,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-12-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-12-06-ledger"},nextItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-12-04-performance-and-tracing"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking."),(0,n.kt)("p",null,"Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," WASM library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1336"},"#1336")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P threat modeling and risk analysis")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1350"},"#1350")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Create a test network on ",(0,n.kt)("inlineCode",{parentName:"strong"},"Sanchonet"))," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1173"},"#1173")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Upgrade breaking changes crates")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1357"},"#1357")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Enhance Mithril/Cardano node communication")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1315"},"#1315")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," examples full crates")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1385"},"#1385")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Manual publication to crates.io with GitHub action")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1380"},"#1380")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Remove ",(0,n.kt)("inlineCode",{parentName:"strong"},"sqlite")," dependency from ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1390"},"#1390"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/563fcf2e.dc6fb4c7.js b/assets/js/563fcf2e.dc6fb4c7.js new file mode 100644 index 00000000000..67039a6fc42 --- /dev/null +++ b/assets/js/563fcf2e.dc6fb4c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94560],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=u(a),c=r,m=d["".concat(p,".").concat(c)]||d[c]||h[c]||l;return a?n.createElement(m,i(i({ref:t},s),{},{components:a})):n.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-01-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-01-05-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-05-ledger.md",source:"@site/blog/2023-01-05-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-01-05T00:00:00.000Z",formattedDate:"January 5, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:4.44,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-01-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-06-crypto"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-28-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Finishing the deposit tracking",id:"finishing-the-deposit-tracking",level:3},{value:"New Conway era transaction",id:"new-conway-era-transaction",level:3},{value:"Optimizing the TICKF transition",id:"optimizing-the-tickf-transition",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Improved ledger event",id:"improved-ledger-event",level:4},{value:"Improved type saftey",id:"improved-type-saftey",level:4},{value:"Code/Module organization",id:"codemodule-organization",level:4},{value:"Revert pointer address deprecation",id:"revert-pointer-address-deprecation",level:4},{value:"Miscellaneous",id:"miscellaneous",level:4}],s={toc:u},d="wrapper";function h(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The ledger team finished up the remaining work for tracking individual depots,\nbuilt out the new Conway era transaction body (in line with CIP-1694),\ngreatly reduce some problematically large calculations on the epoch boundary,\nand addressed technical debt."),(0,r.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,r.kt)("h3",{id:"finishing-the-deposit-tracking"},"Finishing the deposit tracking"),(0,r.kt)("p",null,"The initial work on the individual deposit tracking project focused only on correctness.\nAs this is a large data structure\n(since its size is linear with respect to the number of registered stake credentials),\nit is very important that we also reduce the memory overhead as much as possible.\nFortunately, we were able to add very little overhead for the deposits by using existing\nefficient data structures. The extra tracking now only incurs one word (8 bytes)\nper registered stake credential."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3195"},"pull-3195")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3202"},"pull-3202")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3217"},"pull-3217"))),(0,r.kt)("h3",{id:"new-conway-era-transaction"},"New Conway era transaction"),(0,r.kt)("p",null,'We implemented the Conway era transaction body, which is in line with CIP-1694.\nNote that the Conway era implements, losing speaking, the parts of CIP-1694 that are not\nrelated to the liquid democracy (the "DReps").\nThe new transaction body adds the new governance actions and votes,\nwhile also deprecating the old governance structures\n(i.e. the old protocol parameter updates and MIR certificates).'),(0,r.kt)("p",null,"We also now have the wire specification (CDDL file) and serialization code in place.\nThe wire specification is still subject to change while we work on the Conway era,\nbut it is now usable and has proper testing support\n(so that, for example, the serialization round-trips, etc)."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3176"},"pull-3176")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3226"},"pull-3226"))),(0,r.kt)("h3",{id:"optimizing-the-tickf-transition"},"Optimizing the ",(0,r.kt)("inlineCode",{parentName:"h3"},"TICKF")," transition"),(0,r.kt)("p",null,"Every since the release of the Shelley era, we have been working to reduce the computational load\nplaced on the node by the ledger at the epoch boundary.\nWhile still not perfect, we believe that we have removed one of the final problematically long\nepoch boundary computations that exacerbate situations like\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4421"},"this"),".\nIn particular, the problem involved the way in which the consensus layer obtains a view of the\nledger for the purposes of checking the leadership schedule in a new epoch.\nWe implemented a stopgap measure which now only incurs a single multi-second cost once per epoch\ninstead of potentially several multi-second costs while the networks waits for the first block\nof a new epoch to be minted."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"An ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/blob/ea48d4815946c4f35239eb41815fe06cd6ffec2e/docs/adr/2022-12-12_007-optimize-ledger-view.md"},"ADR")," about the decision."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3209"},"pull-3209"))),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"We closed the year out with a lot of reduction to the technical debt!"),(0,r.kt)("h4",{id:"improved-ledger-event"},"Improved ledger event"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3212"},"pull-3212")," - The ledger events are not guaranteed to appear in any given order within a block.\nFor this reason, motivated by the use case in db-sync, the ",(0,r.kt)("inlineCode",{parentName:"li"},"TotalDeposits")," event now\nincludes a transaction ID and emits the ",(0,r.kt)("em",{parentName:"li"},"change")," in deposits instead of the value.")),(0,r.kt)("h4",{id:"improved-type-saftey"},"Improved type saftey"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3208"},"pull-3208")," - We replaced ",(0,r.kt)("inlineCode",{parentName:"li"},"NominalDiffTime")," with a newtype wrapper. The problem was that our CBOR\nencoders and decoders were using the wrong level of precision, having to due with with\nthe Shelley genesis file. We removed the potential problem with a newtype wrapper."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3167"},"pull-3167")," - We now use a GADT to ensure consistency of the Plutus language in the types\nfor ",(0,r.kt)("inlineCode",{parentName:"li"},"TransactionScriptFailure")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"PlutusDebug"),".")),(0,r.kt)("h4",{id:"codemodule-organization"},"Code/Module organization"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3175"},"pull-3175")," - The Allegra and Mary eras had an unusual relationship in our codebase,\ndue to the uncertainly of release dates while we were implementing them.\nIn particular, they were coupled in way that is different from the rest of the code base.\nWith hindsight on our side, we split the combined ",(0,r.kt)("inlineCode",{parentName:"li"},"shelley-ma")," Haskell package into two\nseparate ledger era packages, which is now consistent with the rest of the repository\nand module structure."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3184"},"pull-3184")," - We created a core test sub-library, cleaning up a lot of our property test\ngenerator code."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3210"},"pull-3210")," - We moved the ",(0,r.kt)("inlineCode",{parentName:"li"},"KeyPair")," type to the test library. Outside of testing,\nthe ledger does not need to deal with signing keys, and since this is a topic that\ndeserves the utmost care, it is best to make it clear that our use of signing keys\nis only for testing."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3229"},"pull-3229")," - We split the ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardano.Ledger.Alonzo.Data")," module, which is more consistent with the rest\nof the codebase.")),(0,r.kt)("h4",{id:"revert-pointer-address-deprecation"},"Revert pointer address deprecation"),(0,r.kt)("p",null,"Thanks to one of our excellent internal auditors,\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/jmhrpr"},"@jmhrpr"),",\nwe now have a better plan for deprecating pointer addresses.\nThis meant that we had to revert the previous work to deprecate them."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3161"},"issue-3161")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3215"},"pull-3215"))),(0,r.kt)("h4",{id:"miscellaneous"},"Miscellaneous"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3205"},"pull-3205")," - We removed deprecated type synonyms."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3218"},"pull-3218")," - We cleaned up the address deserialization."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3223"},"pull-3223")," - We fixed faulty address deserialization tests."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3222"},"pull-3222")," - We switched to a general type family ",(0,r.kt)("inlineCode",{parentName:"li"},"TxOut")," from concrete ones,\nreducing many constraints."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3224"},"pull-3224")," - ",(0,r.kt)("inlineCode",{parentName:"li"},"ShelleyGenesis")," is now parameterized by crypto instead of by era."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3170"},"pull-3170")," - We set the cabal-version to 3.0 in our projects."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3172"},"pull-3172")," - We removed the now useless ",(0,r.kt)("inlineCode",{parentName:"li"},"EncodeMint"),"/",(0,r.kt)("inlineCode",{parentName:"li"},"DecodeMint")," classes."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3225"},"pull-3225")," - We switch from ",(0,r.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/ormolu"},"ormolu")," to\n",(0,r.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/fourmolu"},"fourmolu"),".\nThe reason was to be able to finally have more diff friendly code!")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/565f686e.5a6ec3a7.js b/assets/js/565f686e.5a6ec3a7.js new file mode 100644 index 00000000000..dd298032c24 --- /dev/null +++ b/assets/js/565f686e.5a6ec3a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3445],{18618:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/quarterly/tags/consensus","allTagsPath":"/cardano-updates/quarterly/tags","count":4}')}}]); \ No newline at end of file diff --git a/assets/js/5668eccd.20b5304f.js b/assets/js/5668eccd.20b5304f.js new file mode 100644 index 00000000000..cd599773496 --- /dev/null +++ b/assets/js/5668eccd.20b5304f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3918],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),d=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),s=d(a),c=n,m=s["".concat(u,".").concat(c)]||s[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var d=2;d{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-12-09-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-09-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-hydra.md",source:"@site/blog/2022-12-09-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-12-09T00:00:00.000Z",formattedDate:"December 9, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.62,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-12-09-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-12-09-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-12-09-ledger"}},u={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:d},s="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team has worked on completing to "Validate coordinated head protocol against formal model", this is a huge step to verify the implementation is secure. They also worked on implementing ',(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," related to bounded tx validity which is now under review. ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/obsidiansystems/hydra-pay"},"HydraPay")," project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/obsidiansystems/hydra-pay/issues?q=is%3Aissue"},"issues")," they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Document model based testing ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/194"},"#194")," & ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/641"},"#641")),(0,n.kt)("li",{parentName:"ul"},"Got ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21"),", reducing gaps between implementation and specification, under review."),(0,n.kt)("li",{parentName:"ul"},"Complete review on ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete first round of review on ",(0,n.kt)("inlineCode",{parentName:"li"},"HydraPay")," work ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/634"},"#634")),(0,n.kt)("li",{parentName:"ul"},"Meeting with ",(0,n.kt)("inlineCode",{parentName:"li"},"Director of CyberSecurity")," frio ",(0,n.kt)("inlineCode",{parentName:"li"},"IOG"),' to unblock "the RFP prepared for the external audit" ',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/606"},"#606")),(0,n.kt)("li",{parentName:"ul"},"Remove ",(0,n.kt)("inlineCode",{parentName:"li"},"vasil-dev")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"testnet")," from ",(0,n.kt)("inlineCode",{parentName:"li"},"smoke-test")," because they were not working ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/630"},"#630")),(0,n.kt)("li",{parentName:"ul"},"Fix flaky ",(0,n.kt)("inlineCode",{parentName:"li"},"plutus-merkle-tree")," test ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/642"},"#642")),(0,n.kt)("li",{parentName:"ul"},"Refactor ",(0,n.kt)("inlineCode",{parentName:"li"},"NetworkSpec")," to improve legilibility."),(0,n.kt)("li",{parentName:"ul"},"Fix benchmark cost for ",(0,n.kt)("inlineCode",{parentName:"li"},"abortTx")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/631"},"#631")),(0,n.kt)("li",{parentName:"ul"},"Adapt ",(0,n.kt)("inlineCode",{parentName:"li"},"nix.conf")," to the recent hydra-ci nix cache migration.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Get ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," accepted & close tx validity gap in our implementation."),(0,n.kt)("li",{parentName:"ul"},"Integrate the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial"),"."),(0,n.kt)("li",{parentName:"ul"},"Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec."),(0,n.kt)("li",{parentName:"ul"},"Get Cicero (new CI) working."),(0,n.kt)("li",{parentName:"ul"},"Use reference inputs to reduce the cost of the ",(0,n.kt)("inlineCode",{parentName:"li"},"commitTx"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5674f153.b4eb130b.js b/assets/js/5674f153.b4eb130b.js new file mode 100644 index 00000000000..64957b90440 --- /dev/null +++ b/assets/js/5674f153.b4eb130b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[14392],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),u=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(i.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),s=u(a),m=n,h=s["".concat(i,".").concat(m)]||s[m]||c[m]||o;return a?r.createElement(h,l(l({ref:t},d),{},{components:a})):r.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[s]="string"==typeof e?e:n,l[1]=p;for(var u=2;u{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-09-15-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-09-15-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-sre.md",source:"@site/blog/2023-09-15-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.055,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-09-15-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-15-network"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-09-14-db-sync"}},i={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3}],d={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet environment was updated to 8.3.0-pre."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"Cardano-parts")," now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/blob/main/flake/colmena.nix#L89-L108"},"here"),".")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/f3dcffb...c2c7680"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Adjust mainnet p2p relays to ~100%, with a legacy canary: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/commit/d3cce2585fae6a52ff5833373137af3cddbc6710"},"cardano-ops-commit"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Utilize content addressed binaries to significantly improve eval, build and devShell performance: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/8"},"cardano-parts-pull-8")),(0,n.kt)("li",{parentName:"ul"},"Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/10"},"cardano-parts-pull-10")),(0,n.kt)("li",{parentName:"ul"},"Fix warns thrown during some builds and devShell usage: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/11"},"cardano-parts-pull-11")),(0,n.kt)("li",{parentName:"ul"},"Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/12"},"cardano-parts-pull-12")),(0,n.kt)("li",{parentName:"ul"},"Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/13"},"cardano-parts-pull-13"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf/compare/9f9917c...7fc1b4c"},"cardano-perf-compare"))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Define preliminary cardano-world networks on cardano-playground: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/1"},"cardano-playground"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Rotate KES on preview and preprod, purge unused subnets, adjust explorer rate limits: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/compare/306ef6c...e9b2ed2"},"cardano-world-compare")),(0,n.kt)("li",{parentName:"ul"},"Update sanchonet network to 8.3.0: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/compare/master...sanchonet-updated"},"cardano-world-compare"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/56b3fab8.8ae61492.js b/assets/js/56b3fab8.8ae61492.js new file mode 100644 index 00000000000..34ed504f2e7 --- /dev/null +++ b/assets/js/56b3fab8.8ae61492.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36434],{71645:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/goedel/page/3","page":3,"postsPerPage":5,"totalPages":4,"totalCount":18,"previousPage":"/cardano-updates/tags/goedel/page/2","nextPage":"/cardano-updates/tags/goedel/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/56f35d85.c3eab92c.js b/assets/js/56f35d85.c3eab92c.js new file mode 100644 index 00000000000..30c216f51a7 --- /dev/null +++ b/assets/js/56f35d85.c3eab92c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[5485],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=p(r),h=n,m=d["".concat(u,".").concat(h)]||d[h]||c[h]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=h;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-03-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-03-03-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-ledger.md",source:"@site/blog/2023-03-03-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.57,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-03-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-03-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-02-network"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway rules",id:"conway-rules",level:3},{value:"Constraint based generators",id:"constraint-based-generators",level:3},{value:"Preparing a release, now with proper versioning",id:"preparing-a-release-now-with-proper-versioning",level:3},{value:"Technical debt",id:"technical-debt",level:3}],s={toc:p},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We have focused the last two weeks on CIP-1694, integration of the last several months of ledger\nwork into consensus and node, and testing infrastrutcture that we will use in the conway ledger era."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-rules"},"Conway rules"),(0,n.kt)("p",null,"We made a major update to the conway era so that the implementation is now in sync with the spec\nwith respect to the ratification and enactment logic."),(0,n.kt)("p",null,"See the notes in ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3291"},"pull-3291")," for more details."),(0,n.kt)("h3",{id:"constraint-based-generators"},"Constraint based generators"),(0,n.kt)("p",null,"This week we hit a major milestone in our efforts to build out better property based testing\nsupport for the main ledger properties.\nThe new constraint based generators can now generate full ledger states with what is probably\nvery close to the real constraints (if anything, it is under constrained).\nNext we will work on generating a transaction in the context of a ledger state, which would allow\nus to actually start using these generators for real tests."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"),"."),(0,n.kt)("h3",{id:"preparing-a-release-now-with-proper-versioning"},"Preparing a release, now with proper versioning"),(0,n.kt)("p",null,"After quite some time, we are ready to release a version of ledger that will work with a new\nversion of consensus, using CHaPs."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3308"},"pull-3308"),"."),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We cleaned up the redeemer serialization code (to prevent future mistakes). See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3269"},"pull-3269"),"."),(0,n.kt)("li",{parentName:"ul"},"We added a note to the Alonzo spec, specifying that the transaction inputs are\nlexicographically ordered in the Plutus script context. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3306"},"pull-3306"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with the address deserialiazation\n(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway).\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3307"},"pull-3307"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with our nix build. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3311"},"pull-3311"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with our ",(0,n.kt)("inlineCode",{parentName:"li"},"NoThunks")," tests. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3310"},"pull-3310"),"."),(0,n.kt)("li",{parentName:"ul"},"We improved our nightly tests. See ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3316"},"pull-3316"),".")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/57008883.11bb08cb.js b/assets/js/57008883.11bb08cb.js new file mode 100644 index 00000000000..501b7a8280e --- /dev/null +++ b/assets/js/57008883.11bb08cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33399],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>f});var r=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,o=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=p(a),m=o,f=u["".concat(s,".").concat(m)]||u[m]||c[m]||n;return a?r.createElement(f,l(l({ref:t},d),{},{components:a})):r.createElement(f,l({ref:t},d))}));function f(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=a.length,l=new Array(n);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,l[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var r=a(87462),o=(a(67294),a(3905));const n={title:"SRE Team Update",slug:"2023-11-24-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-11-24-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-24-sre.md",source:"@site/blog/2023-11-24-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-11-24T00:00:00.000Z",formattedDate:"November 24, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:3.115,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-11-24-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-24-hydra"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-22-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Offchain-metadata-tools",id:"offchain-metadata-tools",level:3}],d={toc:p},u="wrapper";function c(e){let{components:t,...a}=e;return(0,o.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,o.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The cardano-node nixos service now supports SIGHUP p2p topology reloading when the ",(0,o.kt)("inlineCode",{parentName:"li"},"useSystemdReload")," option is enabled")),(0,o.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,o.kt)("h3",{id:"capkgs"},"Capkgs"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Update cardano-db-sync and offchain-metadata-tools package paths and/or references: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/994696f...3ce364f"},"capkgs-compare"))),(0,o.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5537"},"cardano-node-pull-5537"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Creates a useSystemdReload bool option for the cardano-node nixos service"),(0,o.kt)("li",{parentName:"ul"},"This will move the topology file(s) to ",(0,o.kt)("inlineCode",{parentName:"li"},"/etc/cardano-node/topology-$i.yaml")," and inject systemd reload hooks for p2p configured cardano-node instances"),(0,o.kt)("li",{parentName:"ul"},"Moving topology files to ",(0,o.kt)("inlineCode",{parentName:"li"},"/etc")," also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired")))),(0,o.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Adds a metadata server profile and a number of other features and improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/20"},"cardano-parts-pull-20"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Adds a new metadata-service profile"),(0,o.kt)("li",{parentName:"ul"},"Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile"),(0,o.kt)("li",{parentName:"ul"},"Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish"),(0,o.kt)("li",{parentName:"ul"},"Adds extra node list producers and public producers for cardano-node-topology profile"),(0,o.kt)("li",{parentName:"ul"},"Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch"),(0,o.kt)("li",{parentName:"ul"},"Adds select systemd metrics reporting to grafana-agent profile"),(0,o.kt)("li",{parentName:"ul"},"Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS"),(0,o.kt)("li",{parentName:"ul"},"Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it"),(0,o.kt)("li",{parentName:"ul"},"Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo"),(0,o.kt)("li",{parentName:"ul"},"Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation"),(0,o.kt)("li",{parentName:"ul"},"Adds support for grafana recording rules in the template files"),(0,o.kt)("li",{parentName:"ul"},"Improves cardano-group profile handling of producers with respect to multiple instance nodes"),(0,o.kt)("li",{parentName:"ul"},"Improves grafana-agent profile metrics handling for multi-instance cardano-node servers"),(0,o.kt)("li",{parentName:"ul"},"Improves smash service preStart handling while waiting for a node socket"),(0,o.kt)("li",{parentName:"ul"},"Updates Justfile for ERA_CMD demo support"),(0,o.kt)("li",{parentName:"ul"},"Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates"),(0,o.kt)("li",{parentName:"ul"},"Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile"),(0,o.kt)("li",{parentName:"ul"},"Defaults cardano-postgres profile psqlrc use to false")))),(0,o.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Adds a new testnet metadata server, cluster webserver, and other improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/6"},"cardano-playground-pull-6"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Adds a new metadata server"),(0,o.kt)("li",{parentName:"ul"},"Adds a new webserver for the cluster's static virtualhost needs"),(0,o.kt)("li",{parentName:"ul"},"Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo"),(0,o.kt)("li",{parentName:"ul"},"Adds systemd metrics monitoring to the cluster"),(0,o.kt)("li",{parentName:"ul"},"Resizes sanchonet machines to support the growing chain"),(0,o.kt)("li",{parentName:"ul"},"Completes migration of preprod from world"),(0,o.kt)("li",{parentName:"ul"},"Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes"),(0,o.kt)("li",{parentName:"ul"},"Updates Justfile for ERA_CMD demo support"),(0,o.kt)("li",{parentName:"ul"},"Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile"),(0,o.kt)("li",{parentName:"ul"},"Migrates book static code to playground from world, with refactor, cleanup and updates"),(0,o.kt)("li",{parentName:"ul"},"Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules")))),(0,o.kt)("h3",{id:"offchain-metadata-tools"},"Offchain-metadata-tools"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Adds db password option with obfuscation plus misc improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/offchain-metadata-tools/pull/61"},"offchain-metadata-tools-pull-61"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services"),(0,o.kt)("li",{parentName:"ul"},"Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile"),(0,o.kt)("li",{parentName:"ul"},"Moves from std use in the nix flake to standard flake schema"),(0,o.kt)("li",{parentName:"ul"},"Fixes hydra CI failures"),(0,o.kt)("li",{parentName:"ul"},"Builds update-docs in hydra to avoid long local build times"),(0,o.kt)("li",{parentName:"ul"},"Removes deprecated tullia"),(0,o.kt)("li",{parentName:"ul"},"Removes deprecated check-hydra from pkgs"),(0,o.kt)("li",{parentName:"ul"},"Removes deprecated bors files and references")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5733c82d.3d490188.js b/assets/js/5733c82d.3d490188.js new file mode 100644 index 00000000000..b33267fc0aa --- /dev/null +++ b/assets/js/5733c82d.3d490188.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94184],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(a),m=n,h=c["".concat(u,".").concat(m)]||c[m]||s[m]||o;return a?r.createElement(h,l(l({ref:t},d),{},{components:a})):r.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-09-16-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-09-16-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-16-ledger.md",source:"@site/blog/2022-09-16-ledger.md",title:"Ledger Team Update",description:"Ledger Update",date:"2022-09-16T00:00:00.000Z",formattedDate:"September 16, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.625,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-09-16-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-09-19-db-sync"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-01-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"Ledger Update",id:"ledger-update",level:2}],d={toc:p},c="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"ledger-update"},"Ledger Update"),(0,n.kt)("p",null,"We have been focused nearly entirely on addressing technical debt."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We introduced more consistent naming across eras, this time for the auxiliary data.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3032"},"3032"),"."),(0,n.kt)("li",{parentName:"ul"},"We made clear how the ",(0,n.kt)("inlineCode",{parentName:"li"},"consumed")," functions differs between eras (which was a previous source of\nconfusion), and added some related support to the fledgling ledger API.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3016"},"3016"),"."),(0,n.kt)("li",{parentName:"ul"},"We added clarity and organizational consistency to the main ledger era type synonyms.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3017"},"3017"),"."),(0,n.kt)("li",{parentName:"ul"},"We removed code duplication related to the input data hashes.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3018"},"3018"),"."),(0,n.kt)("li",{parentName:"ul"},"We split up a large module into smaller components. The large module was actually causing our\nCI to time out.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3020"},"3020"),"."),(0,n.kt)("li",{parentName:"ul"},"We cleaned up stale information in our cabal files, and upgraded cabal 3.8.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3023"},"3023"),",\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3031"},"3031"),",\nand ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3028"},"3028"),"."),(0,n.kt)("li",{parentName:"ul"},"We made consistent, standalone ",(0,n.kt)("inlineCode",{parentName:"li"},"TxOut")," (transaction output) modules for every era.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3024"},"3024"),"."),(0,n.kt)("li",{parentName:"ul"},"We brought consistency to a maddening inconsistent use of type variables indicating the specific\nchoice of cryptographic primitives. In particular, all uses of ",(0,n.kt)("inlineCode",{parentName:"li"},"crypto")," have been renamed to ",(0,n.kt)("inlineCode",{parentName:"li"},"c"),".\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3027"},"3027"),"."),(0,n.kt)("li",{parentName:"ul"},"We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric\ntypes that will compose better in the future and which simplifies the constraints.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3029"},"3029"),"."),(0,n.kt)("li",{parentName:"ul"},"We consolidated some existing fragmented logic regarding how we gather the scripts needed for a\ngiven transaction. This is a much needed cleanup to prevent future mistakes.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3019"},"3019"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with our generators that was causing a fair number of our property tests to\nfail in CI.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3039"},"3039"),"."),(0,n.kt)("li",{parentName:"ul"},"We have started the work to update Plutus. This will bring support for SECP in the next major\nprotocol version, and also address a\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2902"},"problem"),"\nthat we current have evolving the cost models.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3030"},"3030"),"."),(0,n.kt)("li",{parentName:"ul"},"We addressed a small issue that came up when integrating the conway era downstream, namely\nthe lack of some serialization instances.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3022"},"3022"),".")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/57700755.3e57e6d9.js b/assets/js/57700755.3e57e6d9.js new file mode 100644 index 00000000000..fb68e3d22e2 --- /dev/null +++ b/assets/js/57700755.3e57e6d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[13276],{15745:a=>{a.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/5778ca6b.8bc37115.js b/assets/js/5778ca6b.8bc37115.js new file mode 100644 index 00000000000..1666b8bc014 --- /dev/null +++ b/assets/js/5778ca6b.8bc37115.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51727],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=p(a),m=n,f=s["".concat(u,".").concat(m)]||s[m]||d[m]||i;return a?r.createElement(f,o(o({ref:t},c),{},{components:a})):r.createElement(f,o({ref:t},c))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2022-10-07-node-cli-api",authors:"Jimbo4350",tags:["cli-api-quarterly"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/quarterly/2022-10-07-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-07-nod-api-cli.md",source:"@site/quarterly/2022-11-07-nod-api-cli.md",title:"Node API & CLI Team Update",description:"Node-Api-Cli Quarterly Update",date:"2022-11-07T00:00:00.000Z",formattedDate:"November 7, 2022",tags:[{label:"cli-api-quarterly",permalink:"/cardano-updates/quarterly/tags/cli-api-quarterly"}],readingTime:1.355,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-10-07-node-cli-api",authors:"Jimbo4350",tags:["cli-api-quarterly"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2022-11-07-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"Node-Api-Cli Quarterly Update",id:"node-api-cli-quarterly-update",level:2},{value:"2022-09 - 2022-11-04",id:"2022-09---2022-11-04",level:2}],c={toc:p},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"node-api-cli-quarterly-update"},"Node-Api-Cli Quarterly Update"),(0,n.kt)("h2",{id:"2022-09---2022-11-04"},"2022-09 - 2022-11-04"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0"),(0,n.kt)("li",{parentName:"ul"},"Major clean up of stale iusses + PRs."),(0,n.kt)("li",{parentName:"ul"},"Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs"),(0,n.kt)("li",{parentName:"ul"},"cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node."),(0,n.kt)("li",{parentName:"ul"},"cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation."),(0,n.kt)("li",{parentName:"ul"},"General documentation updates and improvements"),(0,n.kt)("li",{parentName:"ul"},"Addition of tx-mempool command which allows users to:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Query the node about the current mempool's capacity and sizes"),(0,n.kt)("li",{parentName:"ul"},"Request the next transaction from the mempool's current list"),(0,n.kt)("li",{parentName:"ul"},"Query if a particular transaction exists in the mempool"))),(0,n.kt)("li",{parentName:"ul"},"Initial refactoring of cardano-testnet")),(0,n.kt)("p",null,"Next quarter"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-api",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately."))),(0,n.kt)("li",{parentName:"ul"},"cardano-testnet",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Working with Marc Fontaine to create an easy to use executable to deploy testnets locally - ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/4598"},"https://github.com/input-output-hk/cardano-node/issues/4598")))),(0,n.kt)("li",{parentName:"ul"},"Serenity",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above."))),(0,n.kt)("li",{parentName:"ul"},"General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/578d3f15.ece3e377.js b/assets/js/578d3f15.ece3e377.js new file mode 100644 index 00000000000..1e96fe86d8b --- /dev/null +++ b/assets/js/578d3f15.ece3e377.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26614],{7571:a=>{a.exports=JSON.parse('{"label":"goedel","permalink":"/cardano-updates/tags/goedel","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/57e0ab98.71940d4e.js b/assets/js/57e0ab98.71940d4e.js new file mode 100644 index 00000000000..620cf3b07ce --- /dev/null +++ b/assets/js/57e0ab98.71940d4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20779],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>k});var n=o(67294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),l=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=l(o),c=r,k=m["".concat(s,".").concat(c)]||m[c]||h[c]||a;return o?n.createElement(k,i(i({ref:t},u),{},{components:o})):n.createElement(k,i({ref:t},u))}));function k(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=c;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[m]="string"==typeof e?e:r,i[1]=p;for(var l=2;l{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>p,toc:()=>l});var n=o(87462),r=(o(67294),o(3905));const a={title:"Network Q2 2023 Update",slug:"2023-Q2-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/quarterly/2023-Q2-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-network.md",source:"@site/quarterly/2023-Q2-network.md",title:"Network Q2 2023 Update",description:"2023-04 - 2023-06",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:5.145,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Q2 2023 Update",slug:"2023-Q2-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-consensus"},nextItem:{title:"SRE Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-sre"}},s={authorsImageUrls:[void 0]},l=[{value:"2023-04 - 2023-06",id:"2023-04---2023-06",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Eclipse Evasion",id:"eclipse-evasion",level:4},{value:"Ecosystem P2P Deployment Progress",id:"ecosystem-p2p-deployment-progress",level:4},{value:"Peer Sharing",id:"peer-sharing",level:4},{value:"Diffusion (P2P)",id:"diffusion-p2p",level:4},{value:"Other Improvements & Developments",id:"other-improvements--developments",level:3},{value:"CDDL",id:"cddl",level:4},{value:"Cardano Ping",id:"cardano-ping",level:4},{value:"IOSim",id:"iosim",level:4},{value:"Typed Protocols",id:"typed-protocols",level:4},{value:"Cardano Client",id:"cardano-client",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"CI improvements",id:"ci-improvements",level:4},{value:"GHC 9.4 & 9.6",id:"ghc-94--96",level:4},{value:"Next steps",id:"next-steps",level:3}],u={toc:l},m="wrapper";function h(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-04---2023-06"},"2023-04 - 2023-06"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,r.kt)("p",null,"We finalised the design of eclipse evasion and implemented its mechanism which\nrelays on connectivity to ",(0,r.kt)("em",{parentName:"p"},"big ledger peers"),". ",(0,r.kt)("em",{parentName:"p"},"Big ledger peers")," are the\nlargest ledger peers which accumulate 90% of stake (currently there are less\nthan 1000 of them). The outbound governor has new targets for ",(0,r.kt)("em",{parentName:"p"},"known"),",\n",(0,r.kt)("em",{parentName:"p"},"established")," and ",(0,r.kt)("em",{parentName:"p"},"active")," big ledger peers which work in a similar way that\nsuch targets work for ledger peers. The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4662"},"ouroboros-network#4662")," PR is\ncurrently in review."),(0,r.kt)("p",null,"As part of this work we also identified a bug which would prevent a node to\nconnect to itself. Such connections are not easily detectable and are expected\nto be dropped by the churn mechanism, nonetheless they should not be buggy.\nThe failure was discovered thanks to our e2e simulation of diffusion using\n",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim")," & property based testing."),(0,r.kt)("p",null,"The PR also refactors the heart of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," interface reducing\ntechnical debt that would otherwise accumulate."),(0,r.kt)("p",null,"We also identified a possible improvement in the churn mechanism, which will be\nimplemented in Q3. Churn needs to await for peers to terminate, we can\nimprove the synchronisation. ","[ouroboros-network#4617]"),(0,r.kt)("h4",{id:"ecosystem-p2p-deployment-progress"},"Ecosystem P2P Deployment Progress"),(0,r.kt)("p",null,"We reached ",(0,r.kt)("strong",{parentName:"p"},"50% of stake in hands of SPOs who run at least on P2P relay"),". Now\nalso Emurgo and CF are running some P2P relays. Also 20% of IOG relays are\nrunning in P2P mode."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"P2P Progress",src:o(62597).Z,width:"1024",height:"768"})),(0,r.kt)("h4",{id:"peer-sharing"},"Peer Sharing"),(0,r.kt)("p",null,"We implemented ",(0,r.kt)("em",{parentName:"p"},"bootstrapping for peer sharing")," (also known as light peer\nsharing). New downstream (inbound) peers are now added to the ",(0,r.kt)("em",{parentName:"p"},"known peers")," of\nthe ",(0,r.kt)("em",{parentName:"p"},"outbound governor"),". Together with peer sharing this allows for non\nregistered relays to propagate through the network. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3596"},"ouroboros-network#3596")),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Please note that peer sharing is disabled by default and is not considered safe\nuntil Bootstrap Peers (see below) or Genesis is implemented.")),(0,r.kt)("h4",{id:"diffusion-p2p"},"Diffusion (P2P)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We designed a feature which will reduce the load on IOG relays (in future\nalso run by CF & Emurgo). The feature consists of two parts. A new source\nof peers called ",(0,r.kt)("em",{parentName:"p"},"bootstrap peers")," (obtained from via an https request), the\nability to switch from bootstrap peers to ledger peers if the node is synced\n(we are collaborating with the consensus team on the interface ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/blob/fbb8c8ee97517809dec0d0c8ae3fae9b8d272caf/docs/website/docs/bootstrap-peers-IER.md"},"Bootstrap\nPeers IER"),"). This feature will be completed in Q3.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"ouroboros-network#4530"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We published a blog post about ",(0,r.kt)("a",{parentName:"p",href:"https://engineering.iog.io/2023-06-28-p2p"},"P2P design & implementation"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4559"},"ouroboros-network#4559"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We merged changes which allow the consensus layer to start / stop block\nforging thread. This will allow to deploy P2P block producing nodes which\nserve as a live backup node. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/140"},"ouroboros-consensus#140"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed a few bugs in local root peers DNS resolution service:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4583"},"ouroboros-network#4583"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4571"},"ouroboros-network#4571"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We limited concurrency of DNS name resolutions: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4596"},"ouroboros-network#4596"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Galois Inc implemented query option for Handshake: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"ouroboros-network#4256"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed handshake query timeout: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4608"},"ouroboros-network#4608"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented warm valency for local root peers. This can help when using\nDNS names in local root peers which resolve to many IP addresses. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4575"},"ouroboros-network#4575"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We merged handshake changes which allow query protocol versions. Thanks to\nJames Parker from Galois Inc.: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"ouroboros-network#4256"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30/"},"cardano-cli#30"),"."))),(0,r.kt)("h3",{id:"other-improvements--developments"},"Other Improvements & Developments"),(0,r.kt)("h4",{id:"cddl"},"CDDL"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We added ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-node")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," CDDL specs / tests for encoding\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionData")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToClientVersionData"),". ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We clarified an inconsistency between CDDL spec and implementation which is\nhighly polymorphic. We designed and implemented a fix for ",(0,r.kt)("inlineCode",{parentName:"p"},"tx-submission"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"local-tx-submission")," mini-protocols. Specs for other mini-protocols will\nbe improved at a later stage. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4580"},"ouroboros-network#4580")))),(0,r.kt)("h4",{id:"cardano-ping"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/ouroboros-network/blob/master/cardano-ping"},"Cardano Ping")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"cardano-ping")," command was deprecated in favour of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," (the\ntransition was done by the ",(0,r.kt)("inlineCode",{parentName:"p"},"node")," team).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Support for ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol using Unix sockets.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4601"},"ouroboros-network#4601"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Support for ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToNodeV_11")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToClientV_16"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4587"},"ouroboros-network#4587"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," is now using ",(0,r.kt)("em",{parentName:"p"},"ISO8601")," format for timestamps. Formatting of\nmessages was improved. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4593"},"ouroboros-network#4593"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," has a new ",(0,r.kt)("inlineCode",{parentName:"p"},"--query-versions")," flag which allows to query\nsupported versions by the remote node. This is supported by\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-8.1.0"),". ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4589"},"ouroboros-network#4589"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"cardano-node#5313"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30/"},"cardano-cli#30")))),(0,r.kt)("h4",{id:"iosim"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/io-sim"},"IOSim")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed timeouts & delays in ",(0,r.kt)("inlineCode",{parentName:"p"},"io-classes")," in a series of PRs: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/81"},"io-sim#81"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/82"},"io-sim#82"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/86"},"io-sim#86"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/87"},"io-sim#87"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We released ",(0,r.kt)("inlineCode",{parentName:"p"},"strict-stm-1.1.0.1")," on Hackage which fixed a bug in package\ndescription file: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/101"},"io-sim#101"),"."))),(0,r.kt)("h4",{id:"typed-protocols"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/typed-protocols"},"Typed Protocols")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We published haddocks of ",(0,r.kt)("inlineCode",{parentName:"li"},"typed-protocols")," at\n",(0,r.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/typed-protocols"},"https://input-output-hk.github.io/typed-protocols"))),(0,r.kt)("h4",{id:"cardano-client"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/ouroboros-network/blob/master/cardano-client"},"Cardano Client")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We fixed a bug in ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-client-0.1.0.2")," release which results in clients\n(e.g. ",(0,r.kt)("inlineCode",{parentName:"li"},"db-sync"),") negotiate an experimental protocol version.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"After the split between consensus & network, we made ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-client"),"\nindependent of ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-diffusion"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4526"},"ouroboros-network#4526"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We wrap all exceptions in ",(0,r.kt)("inlineCode",{parentName:"p"},"DiffusionError"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4537"},"ouroboros-network#4537"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5356"},"cardano-node#5356"),"."))),(0,r.kt)("h4",{id:"ci-improvements"},"CI improvements"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We switched to use GitHub merge queues in ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols")," repositories; ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/30"},"typed-protocols#30"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4546"},"ouroboros-network#4546"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We cleaned & updated scripts which run on CI.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented a script to verify & release packages on CHaP; ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4542"},"ouroboros-network#4542"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4573"},"ouroboros-network#4573"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented a new CI script and cleaned existing ones:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4572"},"ouroboros-network#4572"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We don't install cryptographic libraries on CI anymore as none of our\npackages requires them; ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4539"},"ouroboros-network#4539"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Improved caching of dependencies: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4553"},"ouroboros-network#4553"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We made it possible to trigger building haddock manually:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4549"},"ouroboros-network#4549"),"."))),(0,r.kt)("h4",{id:"ghc-94--96"},"GHC 9.4 & 9.6"),(0,r.kt)("p",null,"We made all repositories under our control compile with ",(0,r.kt)("inlineCode",{parentName:"p"},"ghc-9.4")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"ghc-9.6"),"\nwhich includes ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"Win32-network"),"."),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("p",null,"We will continue towards our ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/39/views/30"},"aspirational roadmap"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We will continue reviewing eclipse evasion."),(0,r.kt)("li",{parentName:"ul"},"As ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/140"},"ouroboros-consensus#140")," was merged, we are making progress towards\nreleasing P2P on block production nodes. We hope to analyse performance\nregression on such nodes observed on the benchmarking cluster. ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/orgs/input-output-hk/projects/39/views/30?pane=issue&itemId=6875505"},"roadmap-3887")),(0,r.kt)("li",{parentName:"ul"},"We are also focused on ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/orgs/input-output-hk/projects/39/views/30?pane=issue&itemId=8920085"},"roadmap-3969"),". Note that it was expanded in Q2.")))}h.isMDXComponent=!0},62597:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/2023-07-06-p2p-progress-194a909569eebb016b1f24fb8941e2cc.png"}}]); \ No newline at end of file diff --git a/assets/js/5889a844.62933b70.js b/assets/js/5889a844.62933b70.js new file mode 100644 index 00000000000..0638f787a9d --- /dev/null +++ b/assets/js/5889a844.62933b70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68184],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=p(a),h=n,m=c["".concat(s,".").concat(h)]||c[h]||u[h]||o;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-10-28-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-28-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-hydra.md",source:"@site/blog/2022-10-28-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.795,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-10-28-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-11-01-db-sync"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-10-28-network"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team completed several user experience improvements to the\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-tui")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node"),", and delivered a first version of persisted head\nstates by publishing release version\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},(0,n.kt)("inlineCode",{parentName:"a"},"0.8.0")),".\nBesides this, they met with researchers on topic of the HeadV1 specification and\nkicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the UX improvements on the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tui")),(0,n.kt)("li",{parentName:"ul"},"Released version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},(0,n.kt)("inlineCode",{parentName:"a"},"0.8.0")),", which delivers a first version of persisted head states"),(0,n.kt)("li",{parentName:"ul"},"Met with researchers on the HeadV1 specification"),(0,n.kt)("li",{parentName:"ul"},"Started work on the RFP for our external audit")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete ADR18 implementation and get it merged"),(0,n.kt)("li",{parentName:"ul"},"Start work on event-sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Have a first plutus script gap closed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/588e4efd.70f41653.js b/assets/js/588e4efd.70f41653.js new file mode 100644 index 00000000000..cc4fd8e10e9 --- /dev/null +++ b/assets/js/588e4efd.70f41653.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[50097],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>k});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=u(r),d=o,k=c["".concat(p,".").concat(d)]||c[d]||m[d]||a;return r?n.createElement(k,l(l({ref:t},s),{},{components:r})):n.createElement(k,l({ref:t},s))}));function k(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:o,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var n=r(87462),o=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-05-26-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-26-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-network.md",source:"@site/blog/2023-05-26-network.md",title:"Network Team Update",description:"High level summary",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.515,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-05-26-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-26-ledger"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-24-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed summary",id:"detailed-summary",level:2}],s={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"We continued working on ",(0,o.kt)("inlineCode",{parentName:"p"},"eclipse-evasion"),". We also analysed and fixed a bug\nwhen using DNS names in local root peers. We continued working on engineering\nblog post about P2P. We released a new version of packages for\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node-8.1.0")," release."),(0,o.kt)("p",null,"We improved our CI, removed obsolete scripts add extra validation which checks\nif ",(0,o.kt)("inlineCode",{parentName:"p"},"CHANGELOG.md")," files were updated."),(0,o.kt)("p",null,"We also improved release scripts."),(0,o.kt)("h2",{id:"detailed-summary"},"Detailed summary"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Eclipse evasion: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"#4462")),(0,o.kt)("li",{parentName:"ul"},"Local root peers bug fix: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4559"},"#4559")),(0,o.kt)("li",{parentName:"ul"},"Release to CHaP: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4573"},"#4573")),(0,o.kt)("li",{parentName:"ul"},"CI improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4572"},"#4572")),(0,o.kt)("li",{parentName:"ul"},"Release script improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4573"},"#4573"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/59a262d5.9dd70cc0.js b/assets/js/59a262d5.9dd70cc0.js new file mode 100644 index 00000000000..0e874f8a434 --- /dev/null +++ b/assets/js/59a262d5.9dd70cc0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42198],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},c),{},{components:n})):r.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-05-17-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-05-17-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-consensus.md",source:"@site/blog/2023-05-17-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-05-17T00:00:00.000Z",formattedDate:"May 17, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.285,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-05-17-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-19-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-17-mithril"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the ","[Genesis][#genesis]"," section for more details."),(0,a.kt)("p",null,"Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our ",(0,a.kt)("inlineCode",{parentName:"p"},"main")," branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain."),(0,a.kt)("p",null,"We improved our tooling by releasing an ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/68"},"immutable DB server"),", which can be used for testing and benchmarking purposes, and a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/70"},(0,a.kt)("inlineCode",{parentName:"a"},"db-truncater"))," program, which can be used in disaster recovery and benchmarking scenarios."),(0,a.kt)("h2",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"The consensus team working on Genesis:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Improved the genesis selection rule as a result of our interaction with IO Research."),(0,a.kt)("li",{parentName:"ul"},"Studied how the hard-fork combinator handles forecasting at era transitions, and ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/89"},"improved our documentation"),"."),(0,a.kt)("li",{parentName:"ul"},"Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP."),(0,a.kt)("li",{parentName:"ul"},"Elaborated concrete proposal for the Genesis State Machine."),(0,a.kt)("li",{parentName:"ul"},"Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).")),(0,a.kt)("p",null,"The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5a843cd2.63c9493e.js b/assets/js/5a843cd2.63c9493e.js new file mode 100644 index 00000000000..6862b0b25d6 --- /dev/null +++ b/assets/js/5a843cd2.63c9493e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[37221],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>d});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),u=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(i),c=r,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||n;return i?a.createElement(d,o(o({ref:t},s),{},{components:i})):a.createElement(d,o({ref:t},s))}));function d(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-07-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-07-27-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-27-mithril.md",source:"@site/blog/2023-07-27-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-07-27T00:00:00.000Z",formattedDate:"July 27, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.715,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-07-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-28-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-26-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team launched ",(0,r.kt)("strong",{parentName:"p"},"Mithril protocol\u2019s mainnet beta"),": the ",(0,r.kt)("inlineCode",{parentName:"p"},"release-mainnet")," network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch. "),(0,r.kt)("p",null,"They have released a new distribution ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2329.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2329.0")),", which is running on the ",(0,r.kt)("inlineCode",{parentName:"p"},"release-mainnet")," network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator."),(0,r.kt)("p",null,"Finally, they have worked on enhancing the documentation for ",(0,r.kt)("a",{parentName:"p",href:"https://mithril.network/doc/manual/getting-started/SPO-on-boarding-guide"},"onboarding SPOs")," and setting up a ",(0,r.kt)("a",{parentName:"p",href:"https://mithril.network/doc/manual/getting-started/run-signer-node"},"Mithril signer"),", and fixing installation bugs of the binary artifacts produced in the CI."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Created the dev blog post ",(0,r.kt)("a",{parentName:"li",href:"https://mithril.network/doc/dev-blog/2023/07/21/mainnet-beta-launch"},"Mithril Protocol\u2019s Mainnet Beta Launch")),(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2329.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2329.0"))),(0,r.kt)("li",{parentName:"ul"},"Closed the epic that prepares the Mithril infrastructure for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Deploy 'mainnet' infrastructure")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/988"},"#988")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Handle Secrets management")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/989"},"#989")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,r.kt)("inlineCode",{parentName:"li"},"Release 'mainnet' Mithril network")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/918"},"#918"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Prepare SPO on-boarding guide")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1049"},"#1049")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,r.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,r.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance the configuration of Mithril relay")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1080"},"#1080")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Remove legacy store adapters from aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1053"},"#1053")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add a 'sign' sub-command to 'genesis' command in aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1081"},"#1081")))),(0,r.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Refactor (de)serialization of crypto entities")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/668"},"#668")))),(0,r.kt)("li",{parentName:"ul"},"Worked on documentation:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance 'Run a Mithril Signer node (SPO)' guide")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1055"},"#1055")))),(0,r.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Shared library error in CI binaries")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1073"},"#1073")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Debian package does not install cleanly on older ubuntu versions")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/834"},"#834")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Aggregator panics with new (de)serialization of 'ProtocolVerificationKey'")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1083"},"#1083"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5af0f4f9.98e85c8f.js b/assets/js/5af0f4f9.98e85c8f.js new file mode 100644 index 00000000000..8f03976b7c1 --- /dev/null +++ b/assets/js/5af0f4f9.98e85c8f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16165],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),s=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,h=d["".concat(i,".").concat(m)]||d[m]||c[m]||o;return a?r.createElement(h,l(l({ref:t},u),{},{components:a})):r.createElement(h,l({ref:t},u))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[d]="string"==typeof e?e:n,l[1]=p;for(var s=2;s{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-09-01-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-09-01-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-sre.md",source:"@site/blog/2023-09-01-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.075,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-09-01-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-01-network"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-29-node-cli-api"}},i={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Sanchonet-demo",id:"sanchonet-demo",level:3}],u={toc:s},d="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes"),(0,n.kt)("li",{parentName:"ul"},"Work on a new ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs"},"capkgs"),' repository started -- "Content Addressed Packages"',(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output"),(0,n.kt)("li",{parentName:"ul"},"These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do"),(0,n.kt)("li",{parentName:"ul"},"Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers")))),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Content addressed packages -- new repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs"},"capkgs"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/5a0eabe...03e8e42"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Flake devShell module improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/4"},"cardano-parts-pull-4")),(0,n.kt)("li",{parentName:"ul"},"Cardano-world entrypoints migrated to flake parts module: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/5"},"cardano-parts-pull-5")),(0,n.kt)("li",{parentName:"ul"},"Cardano-world jobs migrated to flake parts module: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/6"},"cardano-parts-pull-6")),(0,n.kt)("li",{parentName:"ul"},"Drep delegation fixups: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/7"},"cardano-parts-pull-7")),(0,n.kt)("li",{parentName:"ul"},"Utilize content addressed binaries, WIP: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/8"},"cardano-parts-pull-8")),(0,n.kt)("li",{parentName:"ul"},"Cardano-node module preparation branch, WIP: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/compare/capkgs...node-module"},"cardano-parts-compare"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Availability zone pinning and explorer mods: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf/compare/d3a8644...9f9917c"},"cardano-perf-compare"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Remove performance nodes for migration to cardano-perf: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/306ef6c6dd6c09d9b90b9768f2b84a1d05cded26"},"cardano-world-commit"))),(0,n.kt)("h3",{id:"sanchonet-demo"},"Sanchonet-demo"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet demonstration repository: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo"},"sanchonet-demo"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5c5c653f.17cac15c.js b/assets/js/5c5c653f.17cac15c.js new file mode 100644 index 00000000000..a99b973a401 --- /dev/null +++ b/assets/js/5c5c653f.17cac15c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[34828],{53028:a=>{a.exports=JSON.parse('{"label":"sre","permalink":"/cardano-updates/tags/sre","allTagsPath":"/cardano-updates/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/5c868d36.01487d90.js b/assets/js/5c868d36.01487d90.js new file mode 100644 index 00000000000..ea6c0979956 --- /dev/null +++ b/assets/js/5c868d36.01487d90.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15589],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),c=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=c(a),m=n,g=u["".concat(l,".").concat(m)]||u[m]||d[m]||o;return a?r.createElement(g,i(i({ref:t},s),{},{components:a})):r.createElement(g,i({ref:t},s))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[u]="string"==typeof e?e:n,i[1]=p;for(var c=2;c{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={sidebar_position:1},i="Create a Page",p={unversionedId:"tutorial-basics/create-a-page",id:"tutorial-basics/create-a-page",title:"Create a Page",description:"Add Markdown or React files to src/pages to create a standalone page:",source:"@site/docs/tutorial-basics/create-a-page.md",sourceDirName:"tutorial-basics",slug:"/tutorial-basics/create-a-page",permalink:"/cardano-updates/docs/tutorial-basics/create-a-page",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"defaultSidebar",previous:{title:"Tutorial - Basics",permalink:"/cardano-updates/docs/category/tutorial---basics"},next:{title:"Create a Document",permalink:"/cardano-updates/docs/tutorial-basics/create-a-document"}},l={},c=[{value:"Create your first React Page",id:"create-your-first-react-page",level:2},{value:"Create your first Markdown Page",id:"create-your-first-markdown-page",level:2}],s={toc:c},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"create-a-page"},"Create a Page"),(0,n.kt)("p",null,"Add ",(0,n.kt)("strong",{parentName:"p"},"Markdown or React")," files to ",(0,n.kt)("inlineCode",{parentName:"p"},"src/pages")," to create a ",(0,n.kt)("strong",{parentName:"p"},"standalone page"),":"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"src/pages/index.js")," \u2192 ",(0,n.kt)("inlineCode",{parentName:"li"},"localhost:3000/")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"src/pages/foo.md")," \u2192 ",(0,n.kt)("inlineCode",{parentName:"li"},"localhost:3000/foo")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"src/pages/foo/bar.js")," \u2192 ",(0,n.kt)("inlineCode",{parentName:"li"},"localhost:3000/foo/bar"))),(0,n.kt)("h2",{id:"create-your-first-react-page"},"Create your first React Page"),(0,n.kt)("p",null,"Create a file at ",(0,n.kt)("inlineCode",{parentName:"p"},"src/pages/my-react-page.js"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-jsx",metastring:'title="src/pages/my-react-page.js"',title:'"src/pages/my-react-page.js"'},"import React from 'react';\nimport Layout from '@theme/Layout';\n\nexport default function MyReactPage() {\n return (\n \n

My React page

\n

This is a React page

\n
\n );\n}\n")),(0,n.kt)("p",null,"A new page is now available at ",(0,n.kt)("a",{parentName:"p",href:"http://localhost:3000/my-react-page"},"http://localhost:3000/my-react-page"),"."),(0,n.kt)("h2",{id:"create-your-first-markdown-page"},"Create your first Markdown Page"),(0,n.kt)("p",null,"Create a file at ",(0,n.kt)("inlineCode",{parentName:"p"},"src/pages/my-markdown-page.md"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-mdx",metastring:'title="src/pages/my-markdown-page.md"',title:'"src/pages/my-markdown-page.md"'},"# My Markdown page\n\nThis is a Markdown page\n")),(0,n.kt)("p",null,"A new page is now available at ",(0,n.kt)("a",{parentName:"p",href:"http://localhost:3000/my-markdown-page"},"http://localhost:3000/my-markdown-page"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5c8fca76.d1a16dc0.js b/assets/js/5c8fca76.d1a16dc0.js new file mode 100644 index 00000000000..fcea63134dd --- /dev/null +++ b/assets/js/5c8fca76.d1a16dc0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[44003],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=s(a),d=n,g=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return a?r.createElement(g,l(l({ref:t},u),{},{components:a})):r.createElement(g,l({ref:t},u))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-10-27-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-10-27-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-sre.md",source:"@site/blog/2023-10-27-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-10-27T00:00:00.000Z",formattedDate:"October 27, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.405,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-10-27-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-27-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-25-mithril"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3}],u={toc:s},c="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground")," stack")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Adds offchain-metadata-tools, dbsync sanchonet updates: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/b197e22...b1f1cbd"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"General package updates, modules improvements and template recipes to support network migration from world to playground ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/17"},"cardano-parts-pull-17"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Bumps cardano-db-sync-ng to sancho-2-0-0 tag"),(0,n.kt)("li",{parentName:"ul"},"Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play"),(0,n.kt)("li",{parentName:"ul"},"Adds more machine system bins and devShell bins for scripting and debug purposes"),(0,n.kt)("li",{parentName:"ul"},"Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module"),(0,n.kt)("li",{parentName:"ul"},"Adds profile-cardano-node-topology module for a simplified interface to most common topology needs"),(0,n.kt)("li",{parentName:"ul"},"Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs"),(0,n.kt)("li",{parentName:"ul"},"Adds a topology function to filter self from group machines with an allowList for matching infixes"),(0,n.kt)("li",{parentName:"ul"},"Adds metadata-server and related offchain-metadata-tools bins from capkgs"),(0,n.kt)("li",{parentName:"ul"},"Updates justfile template with:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"a new query-all recipe for getting status of multiple concurrent running environments"),(0,n.kt)("li",{parentName:"ul"},"a new set-default-cardano-env recipe for fast switching between environments"),(0,n.kt)("li",{parentName:"ul"},"a new start-demo recipe for forking a custom env into conway"),(0,n.kt)("li",{parentName:"ul"},"a new start-node recipe for generic environment start"),(0,n.kt)("li",{parentName:"ul"},"a new stop-node recipe for generic environment stop"),(0,n.kt)("li",{parentName:"ul"},"updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions"),(0,n.kt)("li",{parentName:"ul"},"updated query-tip recipe to a generic query tip compatible with each environment")))))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migrates sanchonet from world, prepares further migration and support automation: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/4"},"cardano-playground-pull-4"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5cc32405.fd1def08.js b/assets/js/5cc32405.fd1def08.js new file mode 100644 index 00000000000..defde2dd8fe --- /dev/null +++ b/assets/js/5cc32405.fd1def08.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65562],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=p(r),h=n,m=d["".concat(u,".").concat(h)]||d[h]||c[h]||o;return r?a.createElement(m,i(i({ref:t},s),{},{components:r})):a.createElement(m,i({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Hydra Team Update",slug:"2023-10-13-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-10-13-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-hydra.md",source:"@site/blog/2023-10-13-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-13T00:00:00.000Z",formattedDate:"October 13, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.745,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-13-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-15-network"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-10-13-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity."),(0,n.kt)("p",null,"They also completed the exploration of potentially moving the Plutus validator scripts to Aiken."),(0,n.kt)("p",null,"Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Network Resilience Persistence (#1101)","[https://github.com/input-output-hk/hydra/pull/1101]","."),(0,n.kt)("li",{parentName:"ul"},"Upgrade brick on TUI (#1103)","[https://github.com/input-output-hk/hydra/pull/1103]","."),(0,n.kt)("li",{parentName:"ul"},"Aiken commit validator translation (#1072)","[https://github.com/input-output-hk/hydra/pull/1072]","."),(0,n.kt)("li",{parentName:"ul"},"Fixed some bugs in our TUI client.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Prepare presentation and workshop for Cardano Summit."),(0,n.kt)("li",{parentName:"ul"},"Work on hydra-poll dApp for Cardano summit."),(0,n.kt)("li",{parentName:"ul"},"Start the work on packaging hydra-node and related services.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5cf7c214.36586195.js b/assets/js/5cf7c214.36586195.js new file mode 100644 index 00000000000..6578ef2b408 --- /dev/null +++ b/assets/js/5cf7c214.36586195.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20681],{57654:a=>{a.exports=JSON.parse('{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync","allTagsPath":"/cardano-updates/tags","count":14}')}}]); \ No newline at end of file diff --git a/assets/js/5d0266be.e028d3f3.js b/assets/js/5d0266be.e028d3f3.js new file mode 100644 index 00000000000..144dca1a20c --- /dev/null +++ b/assets/js/5d0266be.e028d3f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33671],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,g=d["".concat(u,".").concat(c)]||d[c]||m[c]||l;return a?r.createElement(g,i(i({ref:t},s),{},{components:a})):r.createElement(g,i({ref:t},s))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,i[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-10-13-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-10-13-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-ledger.md",source:"@site/blog/2023-10-13-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-10-13T00:00:00.000Z",formattedDate:"October 13, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:.965,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-10-13-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-13-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-13-sre"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Integration and releasing",id:"integration-and-releasing",level:3},{value:"Testing",id:"testing",level:3}],s={toc:p},d="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The Ledger team has been shifting focus from implementing Conway related features to\ntesting. For this reason there is a very little amount features that are reported this\ntime aorund. Notable Conway related changes are a specialized ledger query for getting\nConstitutional Committee state and prevention of submitting proposal procedures that have\nno valid path to enactment."),(0,n.kt)("p",null,"Testing related work was mainly on a constraint base system as well as on roundtrip\nserialization. As a result of this extra testing a bug in Conway Genesis serialization\nwas eliminated."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-era"},"Conway era"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3768"},"pull-3768")," - Fail proposal on invalid prevGovActionId"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3781"},"pull-3781")," - CommitteeState query")),(0,n.kt)("h3",{id:"integration-and-releasing"},"Integration and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3774"},"pull-3774")," - Bump urllib3 from 1.26.10 to 1.26.17 in /doc"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3770"},"pull-3770")," - cabal.project: Bump index states"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3778"},"pull-3778")," - Bump plutus to 1.14")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3769"},"pull-3769")," - Add roundtrip testing by validating FlatTerm"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3783"},"pull-3783")," - Update TranslationInstance.hs"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3775"},"pull-3775")," - Refactor and improve constraint based STS tests"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3793"},"pull-3793")," - Fix sums with negative RHS.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5d5964ec.d720c839.js b/assets/js/5d5964ec.d720c839.js new file mode 100644 index 00000000000..1599059ce6b --- /dev/null +++ b/assets/js/5d5964ec.d720c839.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53931],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=a,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-04-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-04-05-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-consensus.md",source:"@site/blog/2023-04-05-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-04-05T00:00:00.000Z",formattedDate:"April 5, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.66,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-04-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-06-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-05-node-cli-api"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This week the consensus team finished the UTxO-HD prototype refactoring. We are\nnow working on improving the DB lock mechanism to improve performance. We also\nintroduced several improvements to the file system abstraction and simulation\nlayer (",(0,a.kt)("inlineCode",{parentName:"p"},"fs-sim"),"), which culminated in the release of ",(0,a.kt)("inlineCode",{parentName:"p"},"fs-sim-0.1.0.0")," and\n",(0,a.kt)("inlineCode",{parentName:"p"},"fs-api-0.1.0.0")," to ",(0,a.kt)("inlineCode",{parentName:"p"},"CHaP"),"."),(0,a.kt)("p",null,"On the Genesis front we distributed the updated Genesis design document,\nsoliciting feedback from Networking Team and IOG Researchers. We also opened up\na PR for the adversarial leader schedule ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," generator, which is being\nreviewed."),(0,a.kt)("p",null,"On the support front, we got a new Consensus version that can use different\nfundamental VRF crypto primitives for Babbage and Conway eras."),(0,a.kt)("p",null,"On the tech debt front we fixed an bug in the followers logic, which was\ndiscovered by our ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," property tests."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5df8a536.f44554bd.js b/assets/js/5df8a536.f44554bd.js new file mode 100644 index 00000000000..815681d873a --- /dev/null +++ b/assets/js/5df8a536.f44554bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30374],{92817:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/release","page":1,"postsPerPage":5,"totalPages":1,"totalCount":5,"blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/5e3dc99b.c7aa10e4.js b/assets/js/5e3dc99b.c7aa10e4.js new file mode 100644 index 00000000000..2b2319b0d8d --- /dev/null +++ b/assets/js/5e3dc99b.c7aa10e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67272],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),s=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(d.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=s(a),u=n,m=h["".concat(d,".").concat(u)]||h[u]||c[u]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[h]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-12-16-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-12-16-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-16-hydra.md",source:"@site/blog/2022-12-16-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-12-16T00:00:00.000Z",formattedDate:"December 16, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.27,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-12-16-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-28-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-15-mithril"}},d={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/benchmarks/transaction-cost/"},"the website")," and reduced the cost for commit transactions by ~30% with the help of reference scripts."),(0,n.kt)("p",null,"The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Kicked-off Hydra Voting project with Catalyst, CF, and IO Research."),(0,n.kt)("li",{parentName:"ul"},"Reduce commit transaction costs by ~30% with reference scripts."),(0,n.kt)("li",{parentName:"ul"},"Prepared an RFP for external audit of the Hydra Head solution."),(0,n.kt)("li",{parentName:"ul"},"Fixed transaction cost benchmarks for abort tx ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/631"},"#631"),"."),(0,n.kt)("li",{parentName:"ul"},"Recorded decision to use model-based testing (",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/adr/22/"},"ADR22"),") and improved Model ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/haddock/hydra-node/tests/Hydra-Model.html"},"documentation"),".",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Concluding the first increment on ","\u201c","Validate coordinated Head protocol","\u201d"," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/194"},"#194"),"."),(0,n.kt)("li",{parentName:"ul"},"Formulated next step / follow-up on testing the Soundness property of our protocol ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/656"},"#656"),"."))),(0,n.kt)("li",{parentName:"ul"},"Switched to using nix flakes for development setup and CI build ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/646"},"#646"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Push ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," & tx validity gap over the finish line (smoke tests missing)."),(0,n.kt)("li",{parentName:"ul"},"Integrate the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial"),"."),(0,n.kt)("li",{parentName:"ul"},"Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec."),(0,n.kt)("li",{parentName:"ul"},"Close & recap on the year with another monthly report (+ blog post).")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5e730d4f.bf3e3989.js b/assets/js/5e730d4f.bf3e3989.js new file mode 100644 index 00000000000..0cfa2758855 --- /dev/null +++ b/assets/js/5e730d4f.bf3e3989.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76762],{3905:(e,t,o)=>{o.d(t,{Zo:()=>l,kt:()=>h});var r=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function i(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},l=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),c=p(o),m=n,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||a;return o?r.createElement(h,i(i({ref:t},l),{},{components:o})):r.createElement(h,i({ref:t},l))}));function h(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=m;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[c]="string"==typeof e?e:n,i[1]=s;for(var p=2;p{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var r=o(87462),n=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-05-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-05-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-network.md",source:"@site/blog/2023-05-12-network.md",title:"Network Team Update",description:"High level summary",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.79,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-05-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-12-hydra"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-05-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed summary",id:"detailed-summary",level:2}],l={toc:p},c="wrapper";function d(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,r.Z)({},l,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We started working on a new way to switch between root & ledger peers (see\nbelow). We continued to work on ",(0,n.kt)("inlineCode",{parentName:"p"},"eclipse-evasion"),". We merged changes to\nHandshake contributed by Galois Inc. We made improvements to our tests (fixed\na flaky test, added cddl specs for ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionData")," and\n",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToClientVersionData"),"). We improved our CI and automated the process of\nreleasing new package version to ",(0,n.kt)("inlineCode",{parentName:"p"},"CHaP"),"."),(0,n.kt)("h2",{id:"detailed-summary"},"Detailed summary"),(0,n.kt)("p",null,"We continued to work on testing ",(0,n.kt)("inlineCode",{parentName:"p"},"eclipse-evasion"),"."),(0,n.kt)("p",null,"We came up with an idea to limit how full node wallets relay on root peers\n(currently operated by IOG, in future also CF and Emurgo). We designed\na switch to use ledger peers if the node tip is close enough to the current\ntime. For more details see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"#4530"),"."),(0,n.kt)("p",null,"We merged changes to the handshake mini-protocol which allow one to query\nserver's ",(0,n.kt)("inlineCode",{parentName:"p"},"node-to-node")," / ",(0,n.kt)("inlineCode",{parentName:"p"},"node-to-client")," parameters. We are grateful to\nGalois Inc. for implementing it, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4256"},"#4256")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4538"},"#4538"),". We published new version\nof packages to CHaP ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/253"},"chap-#253"),"."),(0,n.kt)("p",null,"We added ",(0,n.kt)("inlineCode",{parentName:"p"},"DiffusionError")," wrapper. Thanks to it, ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," will\nnot duplicate diffusion errors messages in the log, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4537"},"#4537"),"."),(0,n.kt)("p",null,"We fixed an issue which caused one of our tests to be flaky, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4515"},"#4515"),"."),(0,n.kt)("p",null,"We added cddl tests for ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionData")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToClientVersionData"),":\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4540"},"#4540"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4544"},"#4544")," (in review)."),(0,n.kt)("p",null,"We wrote scripts which will help us release packages as well as verify that we\nreleased all the package necessary to build the newest set of packages,\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4542"},"#4542"),"."),(0,n.kt)("p",null,"We renamed the consensus startup tracer and make sure it doesn't log\n",(0,n.kt)("inlineCode",{parentName:"p"},"ExitSuccess")," exceptions, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pulls/71"},"consensus-#71"),"."),(0,n.kt)("p",null,"We reviewed PR which adds ",(0,n.kt)("inlineCode",{parentName:"p"},"RawBearer")," API, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4395"},"#4395"),"."),(0,n.kt)("p",null,"We made series of improvements to our CI:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4539"},"#4539"),": we don't need to install cryptographic libraries in CI;"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4545"},"#4545"),": Javier Sagredo (consensus) cleaned up CI after ",(0,n.kt)("inlineCode",{parentName:"li"},"consensus")," moved\nto a new repo;"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4546"},"#4546"),": we switched to use ",(0,n.kt)("a",{parentName:"li",href:"https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue"},"GitHub merge queues"),";"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4549"},"#4549"),": we made it possible to trigger building haddocks manually;"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4553"},"#4553"),": we fixed and enhanced caching of building dependencies.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5e9a4be9.9e7aea0b.js b/assets/js/5e9a4be9.9e7aea0b.js new file mode 100644 index 00000000000..2c5f6676884 --- /dev/null +++ b/assets/js/5e9a4be9.9e7aea0b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[11748],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=u(a),c=l,h=d["".concat(p,".").concat(c)]||d[c]||m[c]||n;return a?r.createElement(h,o(o({ref:t},s),{},{components:a})):r.createElement(h,o({ref:t},s))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:l,o[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-11-22-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-11-22-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-22-ledger.md",source:"@site/blog/2023-11-22-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-11-22T00:00:00.000Z",formattedDate:"November 22, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.705,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-11-22-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-24-sre"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-22-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway",id:"conway",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],s={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of\nCDDL specification. Important bugfixes include:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Fix deserialization of ",(0,l.kt)("inlineCode",{parentName:"li"},"ValueNotConservedUTxO")," predicate failure that could not\npreviously report zero ADA."),(0,l.kt)("li",{parentName:"ul"},"Fix deserialization of ",(0,l.kt)("inlineCode",{parentName:"li"},"CostModels")," in the ",(0,l.kt)("inlineCode",{parentName:"li"},"PParamsUpdate"),". Invalid ",(0,l.kt)("inlineCode",{parentName:"li"},"CostModels")," are no\nlonger allowed, only ",(0,l.kt)("inlineCode",{parentName:"li"},"CostModels")," for unrecognized Plutus versions are allowed starting\nwith Conway"),(0,l.kt)("li",{parentName:"ul"},"Fix returning of Deposits for ProposalProcedures")),(0,l.kt)("p",null,"Testing tooling has been improved and new tests have been implemented for Conway era."),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway"},"Conway"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3858"},"pull-3858")," - Restructure computing Refunds and Deposits in a TxBody across all eras"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3860"},"pull-3860")," - Removed ",(0,l.kt)("inlineCode",{parentName:"li"},"mock/crypto.cddl"),", added optional tag to sets"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3864"},"pull-3864")," - Fix Proposal deposits and add deposit tests to imp tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3859"},"pull-3859")," - Rename ProposalsSnapshot to Proposals"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3867"},"pull-3867")," - ",(0,l.kt)("inlineCode",{parentName:"li"},"MaryValue")," fixes"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3869"},"pull-3869")," - Indicate that tag 258 is optional for OSet. Fix rational CDDL"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3863"},"pull-3863")," - Improve deposits refunds re-usability"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3861"},"pull-3861")," - Fail PParamsUpdate deserialization for invalid costmodels in Conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3875"},"pull-3875")," - Fix cddl spec for CostModels in Conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3876"},"pull-3876")," - Change 4 PParam fields from EpochNo to EpochInterval"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3884"},"pull-3884")," - Relax requirement on the Set tag 258 to be enforced in the next era")),(0,l.kt)("h3",{id:"testing"},"Testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3868"},"pull-3868")," - Improvements to support property tests on Traces with simple Tx with DRep related Certs"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3792"},"pull-3792")," - RATIFY and GOV constraint tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3885"},"pull-3885")," - Added a test for genTxAndNewEpoch"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3886"},"pull-3886")," - QuickCheck Imp integration")),(0,l.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3854"},"pull-3854")," - Integration work for node 8.7.0"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3872"},"pull-3872")," - Fixup ReadTheDocs build"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3871"},"pull-3871")," - Bump plutus dep to 1.16"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3874"},"pull-3874")," - Post release changes"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3880"},"pull-3880")," - Remove generic-monoid dependency"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3887"},"pull-3887")," - Add changelog for features that landed in cardano-node-8.7")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6004d2a4.ab1b5f3f.js b/assets/js/6004d2a4.ab1b5f3f.js new file mode 100644 index 00000000000..84dfa3b0cfb --- /dev/null +++ b/assets/js/6004d2a4.ab1b5f3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[57193],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),c=u(r),h=o,m=c["".concat(p,".").concat(h)]||c[h]||d[h]||a;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var n=r(87462),o=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-08-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-08-04-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-network.md",source:"@site/blog/2023-08-04-network.md",title:"Network Team Update",description:"High-level overview of sprint 41",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.515,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-08-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-04-ledger"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-04-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level overview of sprint 41",id:"high-level-overview-of-sprint-41",level:2},{value:"Other contributions",id:"other-contributions",level:2}],l={toc:u},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-overview-of-sprint-41"},"High-level overview of ",(0,o.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+41%22"},"sprint 41")),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"24th July - 6th August 2023")),(0,o.kt)("p",null,"We started the implementation of ",(0,o.kt)("strong",{parentName:"p"},"bootstrap peers"),". Bootstrap peers are designed\nto provide a safety guarantee for nodes joining the network while still taking\nadvantage of the distributed network for nodes that are synced. This will be\nan intermediate step before Genesis which will allow for further distribute the\nsystem. The bootstrap peers will be run by some trusted partners like CF,\nEmurgo or IOG. They are primarily designed for leaf nodes (e.g. full node\nwallets), which often end up syncing and require access to the honest chain. See\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4615"},"ouroboros-network#4615")," for a more detailed implementation plan."),(0,o.kt)("h2",{id:"other-contributions"},"Other contributions"),(0,o.kt)("p",null,"We started to use ",(0,o.kt)("inlineCode",{parentName:"p"},"nothunks")," library to discover if we have any unevaluated\nthunks which can lead to memory leaks ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4633"},"ouroboros-network#4633"),". We found\na small one in the peer metric component of the P2P networking stack. Fixing\nit put us on a small detour of fixing the API of the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/tree/master/strict-checked-vars"},(0,o.kt)("inlineCode",{parentName:"a"},"strict-checked-vars")),"\npackage: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pulls/431"},"cardano-base#431"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pulls/432"},"cardano-base#432"),", as well as adding ",(0,o.kt)("inlineCode",{parentName:"p"},"NFData"),"\ninstance to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/110"},(0,o.kt)("inlineCode",{parentName:"a"},"io-classes")),". We also improved ",(0,o.kt)("inlineCode",{parentName:"p"},"nothunks"),"\nlibrary to make debugging easier and we provided a ",(0,o.kt)("inlineCode",{parentName:"p"},"NoThunks")," instance for\n",(0,o.kt)("inlineCode",{parentName:"p"},"ThreadId")," which we will need in the future (see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/nothunks/pull/33"},"nothunks#33"),")."),(0,o.kt)("p",null,"We released a new version of ",(0,o.kt)("inlineCode",{parentName:"p"},"io-classes")," (version ",(0,o.kt)("inlineCode",{parentName:"p"},"1.2.0.0"),") and related\npackages to ",(0,o.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/io-classes-1.2.0.0io-classes-1.2.0.0"},"Hackage"),"."),(0,o.kt)("p",null,"We addressed all review comments on the eclipse evasion PR which introduces big\nledger peers, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"ouroboros-network#3886"),"."),(0,o.kt)("p",null,"We fixed how ",(0,o.kt)("inlineCode",{parentName:"p"},"SIGHUP")," signal handlers are registered, so it's not possible to\nshutdown a node which was starting while trying to update network topology,\nsee ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5421"},"cardano-node#5421"),"."),(0,o.kt)("p",null,"I didn't mention that in the previous update, so here it goes: in the previous\nsprint we released ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/blob/f84fcddce472d6cfc2b838b20a2ad085fe0896ed/ouroboros-network/CHANGELOG.md"},(0,o.kt)("inlineCode",{parentName:"a"},"ouroboros-network-0.8.2.0"))," and\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/blob/ouroboros-network-framework-0.7.0.0/ouroboros-network-framework/CHANGELOG.md"},(0,o.kt)("inlineCode",{parentName:"a"},"ouroboros-network-framework-0.7.0.0")),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/600e4190.0bee7b6c.js b/assets/js/600e4190.0bee7b6c.js new file mode 100644 index 00000000000..4773464c02a --- /dev/null +++ b/assets/js/600e4190.0bee7b6c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80599],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=a.createContext({}),u=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=u(n),d=o,h=m["".concat(p,".").concat(d)]||m[d]||c[d]||r;return n?a.createElement(h,i(i({ref:t},s),{},{components:n})):a.createElement(h,i({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:o,i[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var a=n(87462),o=(n(67294),n(3905));const r={title:"Network Q1 2023 Update",slug:"2023-04-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2023-04-04-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-04-network.md",source:"@site/quarterly/2023-04-04-network.md",title:"Network Q1 2023 Update",description:"2023-01 - 2023-03",date:"2023-04-04T00:00:00.000Z",formattedDate:"April 4, 2023",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:2.62,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Q1 2023 Update",slug:"2023-04-04-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-04-25-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2023-04-03-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"2023-01 - 2023-03",id:"2023-01---2023-03",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Gradual dynamic P2P release on mainnet",id:"gradual-dynamic-p2p-release-on-mainnet",level:4},{value:"Peer Sharing",id:"peer-sharing",level:4},{value:"Eclipse Evasion",id:"eclipse-evasion",level:4},{value:"Cardano Network Service Assurance",id:"cardano-network-service-assurance",level:4},{value:"Cardano-Node",id:"cardano-node",level:4},{value:"Testing improvements",id:"testing-improvements",level:4},{value:"Technical Debt",id:"technical-debt",level:4},{value:"Documentation",id:"documentation",level:4},{value:"IO-Sim",id:"io-sim",level:4},{value:"NoThunks",id:"nothunks",level:4},{value:"Next steps",id:"next-steps",level:3}],s={toc:u},m="wrapper";function c(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"2023-01---2023-03"},"2023-01 - 2023-03"),(0,o.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,o.kt)("h4",{id:"gradual-dynamic-p2p-release-on-mainnet"},"Gradual dynamic P2P release on mainnet"),(0,o.kt)("p",null,"We released two version of ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," with dynamic P2P capabilities:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/1.35.6"},(0,o.kt)("inlineCode",{parentName:"a"},"1.35.6")),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"we found and fixed a bug in exception handling in ",(0,o.kt)("inlineCode",{parentName:"li"},"peer-state-actions"),(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4357"},"pull-4357")),(0,o.kt)("li",{parentName:"ul"},"we found and fixed a busy loop when demoting a peer from hot to warm ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"pull-4385")," "))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/1.35.7"},(0,o.kt)("inlineCode",{parentName:"a"},"1.35.7")),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"includes interoperability in the legacy non-p2p network stack ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/outoboros-network/pull/4467"},"pull-4467")))),(0,o.kt)("li",{parentName:"ul"},"we fixed a busy loop of demotion & promotions: ",(0,o.kt)("inlineCode",{parentName:"li"},"warm -> hot -> warm"),"[pull-4485]"," /it will be included in ",(0,o.kt)("inlineCode",{parentName:"li"},"cardano-node-8.0.0")," release/.")),(0,o.kt)("p",null,"Currently there are more than 200 P2P relays on mainnet."),(0,o.kt)("h4",{id:"peer-sharing"},"Peer Sharing"),(0,o.kt)("p",null,"We implemented /peer sharing/ ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"pull-4019")," which will be available as an\nexperimental feature in one of the future ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," releases."),(0,o.kt)("p",null,"We implemented /light peer sharing/, e.g. adding inbound connections to the set\nof known peers of the outbound governor, which allows to bootstrap relays not\nregistered on chain. This complements peer sharing. The ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4277"},"pull-4277")," is in\nlate review stages."),(0,o.kt)("h4",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,o.kt)("p",null,"We finalised design of eclipse evasion and we started implementing it. We\nhave an initial implementation (not merged). We are in the process of extending\nour test suite to cover new implementation details: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"issue-3886"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/outoboros-network/pull/4462"},"pull-4462"),"."),(0,o.kt)("h4",{id:"cardano-network-service-assurance"},"Cardano Network Service Assurance"),(0,o.kt)("p",null,"Galois has been making progress on ",(0,o.kt)("em",{parentName:"p"},"Cardano Network Service Assurance")," project."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"In cardano-node, they have developed a ",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint")," abstraction that creates\na queue of (existing) log events, they now have two such ",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint"),"s (of log\nevents) implemented.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"They have developed a ",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint"),' client executable that can connect to a node\nwhich serves the "new tracing".')),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"They have been exploring approaches for the consolidation and analysis of\n",(0,o.kt)("inlineCode",{parentName:"p"},"datapoint")," data to extract actionable network health status."))),(0,o.kt)("h4",{id:"cardano-node"},"Cardano-Node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We made it possible to configure accepted connections limit ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"pull-4902"),".")),(0,o.kt)("h4",{id:"testing-improvements"},"Testing improvements"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We fixed a bug in network simulation implementation of TCP simultaneous open ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4265"},"pull-4265"),".")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We introduced header-body split in the diffusion simulation ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/outoboros-network/pull/4419"},"pull-4419")," (in review).")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We introduced initiator only nodes in the diffusion simulation ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4280"},"pull-4280"),".")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We fixed a connection-manager test failure ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4370"},"issue-4370"),"."))),(0,o.kt)("h4",{id:"technical-debt"},"Technical Debt"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We refactored ",(0,o.kt)("inlineCode",{parentName:"p"},"Snocket")," interface decoupling it from the multiplexer\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4260"},"pull-4260"),". This simplified some aspects of the KES agent implementation.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"We introduces a record for CBOR codecs which are used for various data\nstructures by mini-protocol codecs ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/outoboros-network/pull/4430"},"pull-4430"),"."))),(0,o.kt)("h4",{id:"documentation"},"Documentation"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We explained some limitations of CDDL in our technical report ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4351"},"pull-4351"),".")),(0,o.kt)("h4",{id:"io-sim"},"IO-Sim"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We fixed implementation of ",(0,o.kt)("inlineCode",{parentName:"li"},"MVar"),"'s ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/70"},"pull-70"),".")),(0,o.kt)("h4",{id:"nothunks"},"NoThunks"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We published a new version of ",(0,o.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/nothunks"},(0,o.kt)("inlineCode",{parentName:"a"},"nothunks"))," library to Hackage.")),(0,o.kt)("h3",{id:"next-steps"},"Next steps"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Finish implementation & testing of eclipse evasion ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"issue-3886"),"."),(0,o.kt)("li",{parentName:"ul"},"Optimise connectivity to peers behind firewall ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4381"},"issue-4381"),"."),(0,o.kt)("li",{parentName:"ul"},"Finish the work on enabling block production dynamically to allow using P2P\non block producers ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"issue-3159"),"."),(0,o.kt)("li",{parentName:"ul"},"If time permits we would like also to reserve some time for finishing\npublication of ",(0,o.kt)("inlineCode",{parentName:"li"},"io-sim")," to Hackage.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/60a77258.17d58a0f.js b/assets/js/60a77258.17d58a0f.js new file mode 100644 index 00000000000..afabbe2a0fe --- /dev/null +++ b/assets/js/60a77258.17d58a0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83160],{72327:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/52","page":52,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/51","nextPage":"/cardano-updates/page/53","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/60c9cc01.8f5bc5c6.js b/assets/js/60c9cc01.8f5bc5c6.js new file mode 100644 index 00000000000..696f17fe84d --- /dev/null +++ b/assets/js/60c9cc01.8f5bc5c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72744],{36901:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/4","page":4,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/3","nextPage":"/cardano-updates/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/60e1630c.96901eb9.js b/assets/js/60e1630c.96901eb9.js new file mode 100644 index 00000000000..2789217a237 --- /dev/null +++ b/assets/js/60e1630c.96901eb9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31831],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-02-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-02-08-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-node-cli-api.md",source:"@site/blog/2023-02-08-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-02-08T00:00:00.000Z",formattedDate:"February 8, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.095,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-02-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-08-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-08-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-02-08---2023-02-21"},"2023-02-08 - 2023-02-21"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"More maintenance and resolving raised issues."),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4889"},"Remove use of multiline literals")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4775"},"Markdown links CI check")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Date ranges for copyright"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4894"},"Re-add support for decoding GenesisExtendedKey text envelope")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4885"},"Disallow empty cost model for create update proposal")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4815"},"Refactor code using onLeft and onNothing"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4876"},"Simplify SerialiseAsRawBytes type class"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/60fae5f4.0a220c69.js b/assets/js/60fae5f4.0a220c69.js new file mode 100644 index 00000000000..a420a11abbe --- /dev/null +++ b/assets/js/60fae5f4.0a220c69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40705],{75293:a=>{a.exports=JSON.parse('{"label":"ledger","permalink":"/cardano-updates/quarterly/tags/ledger","allTagsPath":"/cardano-updates/quarterly/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/611f3a9e.dc1be487.js b/assets/js/611f3a9e.dc1be487.js new file mode 100644 index 00000000000..0859092d565 --- /dev/null +++ b/assets/js/611f3a9e.dc1be487.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25351],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),u=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(i.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),s=u(a),m=n,h=s["".concat(i,".").concat(m)]||s[m]||c[m]||o;return a?r.createElement(h,l(l({ref:t},d),{},{components:a})):r.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[s]="string"==typeof e?e:n,l[1]=p;for(var u=2;u{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-09-15-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-09-15-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-sre.md",source:"@site/blog/2023-09-15-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.055,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-09-15-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-15-network"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-09-14-db-sync"}},i={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3}],d={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet environment was updated to 8.3.0-pre."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"Cardano-parts")," now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/blob/main/flake/colmena.nix#L89-L108"},"here"),".")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/f3dcffb...c2c7680"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Adjust mainnet p2p relays to ~100%, with a legacy canary: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/commit/d3cce2585fae6a52ff5833373137af3cddbc6710"},"cardano-ops-commit"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Utilize content addressed binaries to significantly improve eval, build and devShell performance: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/8"},"cardano-parts-pull-8")),(0,n.kt)("li",{parentName:"ul"},"Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/10"},"cardano-parts-pull-10")),(0,n.kt)("li",{parentName:"ul"},"Fix warns thrown during some builds and devShell usage: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/11"},"cardano-parts-pull-11")),(0,n.kt)("li",{parentName:"ul"},"Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/12"},"cardano-parts-pull-12")),(0,n.kt)("li",{parentName:"ul"},"Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/13"},"cardano-parts-pull-13"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf/compare/9f9917c...7fc1b4c"},"cardano-perf-compare"))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Define preliminary cardano-world networks on cardano-playground: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/1"},"cardano-playground"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Rotate KES on preview and preprod, purge unused subnets, adjust explorer rate limits: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/compare/306ef6c...e9b2ed2"},"cardano-world-compare")),(0,n.kt)("li",{parentName:"ul"},"Update sanchonet network to 8.3.0: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/compare/master...sanchonet-updated"},"cardano-world-compare"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6190b2fb.6cb691e4.js b/assets/js/6190b2fb.6cb691e4.js new file mode 100644 index 00000000000..13d08f20dee --- /dev/null +++ b/assets/js/6190b2fb.6cb691e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48600],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||d[m]||i;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const i={title:"Developer Experience Update",slug:"2023-06-09-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-09-developer-experience",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-developer-experience.md",source:"@site/blog/2023-06-09-developer-experience.md",title:"Developer Experience Update",description:"High level summary",date:"2023-06-09T00:00:00.000Z",formattedDate:"June 9, 2023",tags:[{label:"devx",permalink:"/cardano-updates/tags/devx"}],readingTime:2.035,hasTruncateMarker:!1,authors:[{name:"Moritz Angermann",title:"Head of Developer Experience",url:"https://github.com/angerman",imageURL:"https://github.com/angerman.png",key:"angerman"}],frontMatter:{title:"Developer Experience Update",slug:"2023-06-09-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-06-09-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-09-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"build support & maintainance",id:"build-support--maintainance",level:3},{value:"compiler upgrades",id:"compiler-upgrades",level:3},{value:"CHaP (cardano-haskell-packages)",id:"chap-cardano-haskell-packages",level:3},{value:"GitHub Actions",id:"github-actions",level:3},{value:"iohk-nix",id:"iohk-nix",level:3},{value:"haskell.nix",id:"haskellnix",level:3},{value:"devx",id:"devx",level:3},{value:"upstream tooling",id:"upstream-tooling",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements."),(0,r.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,r.kt)("h3",{id:"build-support--maintainance"},"build support & maintainance"),(0,r.kt)("p",null,"Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure ",(0,r.kt)("inlineCode",{parentName:"p"},"LoadDLL")," errors to ",(0,r.kt)("inlineCode",{parentName:"p"},"blst")," integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base"},"cardano-base")," experiencing significant reductions in CI complexity."),(0,r.kt)("h3",{id:"compiler-upgrades"},"compiler upgrades"),(0,r.kt)("p",null,"After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility."),(0,r.kt)("h3",{id:"chap-cardano-haskell-packages"},"CHaP (cardano-haskell-packages)"),(0,r.kt)("p",null,"We relocated the underlying tooling, (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/foliage"},"foliage"),"), for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP")," into the IOG organization. Furthermore, we have introduced ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/260"},"improved tooling to quickly add constraints to packages"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/issues/285"},"better error reporting for add-revision")," and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/foliage/pull/63"},"better hackage url compatibility")," to facilitate easer usage of CHaP."),(0,r.kt)("h3",{id:"github-actions"},"GitHub Actions"),(0,r.kt)("p",null,"Our repository, ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/actions"},"input-output-hk/actions"),", now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the ",(0,r.kt)("inlineCode",{parentName:"p"},"base")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"haskell")," install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking ",(0,r.kt)("inlineCode",{parentName:"p"},"cabal"),"."),(0,r.kt)("h3",{id:"iohk-nix"},"iohk-nix"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/iohk-nix"},"iohk-nix")," repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, ",(0,r.kt)("inlineCode",{parentName:"p"},"sodium"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"blst"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"secp256k1"),", are also fixed to certain revisions within the ",(0,r.kt)("inlineCode",{parentName:"p"},"iohk-nix")," repository."),(0,r.kt)("h3",{id:"haskellnix"},"haskell.nix"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/haskell.nix"},"Haskell.nix")," has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to ",(0,r.kt)("inlineCode",{parentName:"p"},"gmp"),"."),(0,r.kt)("h3",{id:"devx"},"devx"),(0,r.kt)("p",null,"The relatively new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/devx"},"devx")," repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The ",(0,r.kt)("inlineCode",{parentName:"p"},"devx")," repository's readme has been updated to reflect its purpose and usage guidelines."),(0,r.kt)("h3",{id:"upstream-tooling"},"upstream tooling"),(0,r.kt)("p",null,"Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/61d299e1.76807eb6.js b/assets/js/61d299e1.76807eb6.js new file mode 100644 index 00000000000..ce62d5730d3 --- /dev/null +++ b/assets/js/61d299e1.76807eb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[5552],{88947:a=>{a.exports=JSON.parse('{"label":"release","permalink":"/cardano-updates/tags/release","allTagsPath":"/cardano-updates/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/61e62d68.b6c5bb67.js b/assets/js/61e62d68.b6c5bb67.js new file mode 100644 index 00000000000..a5ab7b6e7cf --- /dev/null +++ b/assets/js/61e62d68.b6c5bb67.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[81169],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=s(n),u=a,f=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-09-01-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-01-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-goedel.md",source:"@site/blog/2023-09-01-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.43,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-09-01-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-06-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-01-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"finalising a presenting performance analysis internship work to the\nformal methods team")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"developed a new Isabelle mini-protocol framework and examples")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"planning an extended version of the ICE DeltaQ paper")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"working on algebraic rules for properisation of any-to-finish"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/61f1e7c8.3b0a1c29.js b/assets/js/61f1e7c8.3b0a1c29.js new file mode 100644 index 00000000000..830bc00310e --- /dev/null +++ b/assets/js/61f1e7c8.3b0a1c29.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70883],{63732:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/tags/consensus","allTagsPath":"/cardano-updates/tags","count":32}')}}]); \ No newline at end of file diff --git a/assets/js/6226ba71.40eb13ae.js b/assets/js/6226ba71.40eb13ae.js new file mode 100644 index 00000000000..2aac4e1f58d --- /dev/null +++ b/assets/js/6226ba71.40eb13ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70644],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),p=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(r),c=n,m=d["".concat(s,".").concat(c)]||d[c]||h[c]||o;return r?a.createElement(m,l(l({ref:t},u),{},{components:r})):a.createElement(m,l({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=c;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-11-23-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-11-23-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-23-ledger.md",source:"@site/blog/2022-11-23-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-11-23T00:00:00.000Z",formattedDate:"November 23, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.19,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-23-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-25-hydra"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-18-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"The Conway ledger era",id:"the-conway-ledger-era",level:3},{value:"Versioned CBOR",id:"versioned-cbor",level:3},{value:"Deposit tracking",id:"deposit-tracking",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Node release",id:"node-release",level:3}],u={toc:p},d="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We released ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694"),",\nour proposal for entering the ",(0,n.kt)("a",{parentName:"p",href:"https://roadmap.cardano.org/en/voltaire/"},"Voltaire phase"),".\n",(0,n.kt)("strong",{parentName:"p"},"Please come join the discussion"),", this will be an incredibly exciting transition for\nCardano and we want everyone to participate!"),(0,n.kt)("p",null,"We now have a sensible way to version all of the serialization schemes used in the ledger.\nThe draft pull request was polished, reviewed, and merged this week.\nThis solves many problems that have vexed us since the beginning of the Shelley ledger era."),(0,n.kt)("p",null,"Everyone working on the Cardano node is working together to improve our release process,\nand the ledger team in particular dedicated one engineer to help with these efforts\nfor the next release."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"the-conway-ledger-era"},"The Conway ledger era"),(0,n.kt)("p",null,"The current proposal in ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694")," encompasses two new ledger eras.\nThe first era will be called Conway, after the English mathematician John Horton Conway.\nThe community facing aspects of the Conway ledger era will be very minimal,\nbut it will pave the way for introducing liquid democracy.\nThe details can be viewed ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/4"},"here"),".\nWe do not yet have a formal specification for the Conway era.\nOur plan is to debut the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger model"),".\nBriefly, the Conway ledger era will:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"introduce SPO voting for hard forks (in the spirit of the now abandoned ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/318"},"CIP-47"),")"),(0,n.kt)("li",{parentName:"ul"},"provide an on-chain mechanism for rotating the governance keys"),(0,n.kt)("li",{parentName:"ul"},"re-plumb the ledger rules involving governance to be in line with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694"))),(0,n.kt)("h3",{id:"versioned-cbor"},"Versioned CBOR"),(0,n.kt)("p",null,"We now have the ability to easily tie our serialization schemes to the Cardano\nmajor protocol version.\nWe still aim to preserve backwards compatibility as much as possible, but we now have a principled\nplan for resolving problems (see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/372"},"CIP-ledger-cbor"),").\nIn particular, we can now address several long standing issues, such as\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/2444"},"issue-2444"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/2965"},"issue-2965"),", and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/3003"},"issue-3003"),". "),(0,n.kt)("p",null,"The final (and massive!) pull request which brought us the versioning is ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3138"},"pull-3138"),"."),(0,n.kt)("h3",{id:"deposit-tracking"},"Deposit tracking"),(0,n.kt)("p",null,"The draft pull request which was exploring how best to track individual deposits\nis much closer now to being ready to take out of draft (",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3127"},"pull-3127"),").\nFor background on the issue, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/3113"},"issue-3113"),".\nThis is quite an invasive change which effects many of our tests, which we are now addressing."),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("p",null,"As always, we keep working on technical debt.\nWe have deduplicated a some things: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3129"},"pull-3129"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3162"},"pull-3162"),".\nWe have memoized a problematic computation (though more due diligence is needed before we can\nmerge): ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3141"},"pull-3141"),"."),(0,n.kt)("h3",{id:"node-release"},"Node release"),(0,n.kt)("p",null,"We have been helping with the node release efforts. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4608"},"pull-4608"),"."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/622f92df.5ca5ec26.js b/assets/js/622f92df.5ca5ec26.js new file mode 100644 index 00000000000..7bd88c4f2e5 --- /dev/null +++ b/assets/js/622f92df.5ca5ec26.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17923],{40294:a=>{a.exports=JSON.parse('{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api","allTagsPath":"/cardano-updates/tags","count":27}')}}]); \ No newline at end of file diff --git a/assets/js/62422ab6.648df983.js b/assets/js/62422ab6.648df983.js new file mode 100644 index 00000000000..248103acfdf --- /dev/null +++ b/assets/js/62422ab6.648df983.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55855],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),h=u(r),c=n,m=h["".concat(p,".").concat(c)]||h[c]||d[c]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[h]="string"==typeof e?e:n,o[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-02-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-02-17-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-ledger.md",source:"@site/blog/2023-02-17-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.33,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-02-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-17-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-02-17-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Integration work",id:"integration-work",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Small documentation improvements",id:"small-documentation-improvements",level:3},{value:"Specifying CIP-1694",id:"specifying-cip-1694",level:3},{value:"Constraint based testing",id:"constraint-based-testing",level:3}],s={toc:u},h="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This past two weeks saw many months worth of ledger changes integrated with the ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-base"),"\nand ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," repositories.\nThe vast majority of the effort involved all the changes to the ledger serialization libraries\n(and the interplay with ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-base"),") which now support proper versioning.\nSupporting the conway ledger era, and in particular allowing the ledger state to transition\nto a whole new system of governance, also played a noticeable part in the integration."),(0,n.kt)("p",null,"Besides the integration work, the team continues to address technical debt, improve the\ndocumentation, make our testing infrastructure better (such as experimenting with better\nnightly tests), and formally specifying more parts of CIP-1694."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"integration-work"},"Integration work"),(0,n.kt)("p",null,"Below is all the integration work completed, which will enable a release to node from\nthe current ledger master. Many thanks to\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/lehins"},"Alexey")," for this colossal undertaking!"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3303"},"pull-3303")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3302"},"pull-3302")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3300"},"pull-3300")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3299"},"pull-3299")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3298"},"pull-3298")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3297"},"pull-3297")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3292"},"pull-3292")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3289"},"pull-3289")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3288"},"pull-3288")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3279"},"pull-3279")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3282"},"pull-3282")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4349"},"pull-4349"))),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("p",null,"Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted\nin the CBOR specification. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3241"},"pull-3241"),"."),(0,n.kt)("p",null,"We now have our ",(0,n.kt)("inlineCode",{parentName:"p"},".cabal")," files being checked for a consistent formatting given by\n",(0,n.kt)("inlineCode",{parentName:"p"},"cabal format")," in our CI. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3286"},"pull-3286"),"."),(0,n.kt)("p",null,"We are still experimenting with better nightly tests for our long running\nproperty based tests. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3276"},"pull-3276")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3296"},"pull-3296"),"."),(0,n.kt)("h3",{id:"small-documentation-improvements"},"Small documentation improvements"),(0,n.kt)("p",null,"The hand proofs of the preservation ADA property have been added back to the\nShelley ledger specification. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3295"},"pull-3295"),"."),(0,n.kt)("p",null,"We have clarified how the script integrity hash is computed in the CDDL description.\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3290"},"pull-3290"),"."),(0,n.kt)("h3",{id:"specifying-cip-1694"},"Specifying CIP-1694"),(0,n.kt)("p",null,"Our new formal specifications backed by Agda have seen a lot of progress!\nUpgrading to Agda 2.6.3 fixed our main build infrastructure problems,\nand we no longer have to rely on our custom fork. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/50"},"pull-50"),"."),(0,n.kt)("p",null,"Our progress on formally specifying CIP-1694 can be followed here:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"in Agda: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/40"},"pull-40")),(0,n.kt)("li",{parentName:"ul"},"the corresponding Haskell: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3291"},"pull-3291"))),(0,n.kt)("h3",{id:"constraint-based-testing"},"Constraint based testing"),(0,n.kt)("p",null,"We are still actively working on our new constraint based property testing framework.\nWe have nearly all of the constraints for an entire ledger state\nhooked into generators, and tests that the generators do indeed obey the constraints.\nThe variable count in the constraints is over 100!\nThere is still much work to do on shrinking, making the generators faster,\nand writing actual property tests for the ledger, but the approach still seems viable and\nwe are hopeful that it could replace our trace generators.\nThe WIP can be followed here: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62a53033.08859e4a.js b/assets/js/62a53033.08859e4a.js new file mode 100644 index 00000000000..d4440752bfb --- /dev/null +++ b/assets/js/62a53033.08859e4a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24215],{39252:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/39","page":39,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/38","nextPage":"/cardano-updates/page/40","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/62dc90a1.3f3d2412.js b/assets/js/62dc90a1.3f3d2412.js new file mode 100644 index 00000000000..b13a1ef61ad --- /dev/null +++ b/assets/js/62dc90a1.3f3d2412.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86003],{31371:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/consensus/page/3","page":3,"postsPerPage":5,"totalPages":7,"totalCount":32,"previousPage":"/cardano-updates/tags/consensus/page/2","nextPage":"/cardano-updates/tags/consensus/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/62ec9f43.b063b2d8.js b/assets/js/62ec9f43.b063b2d8.js new file mode 100644 index 00000000000..dd979c27a1a --- /dev/null +++ b/assets/js/62ec9f43.b063b2d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[8694],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),u=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(i),d=r,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return i?a.createElement(c,o(o({ref:t},s),{},{components:i})):a.createElement(c,o({ref:t},s))}));function c(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-06-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-01-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-01-mithril.md",source:"@site/blog/2023-06-01-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-06-01T00:00:00.000Z",formattedDate:"June 1, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.415,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-06-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-02-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-31-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team released a new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2321.1"},(0,r.kt)("inlineCode",{parentName:"a"},"2321.1"))," distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots."),(0,r.kt)("p",null,"Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2321.1"},(0,r.kt)("inlineCode",{parentName:"a"},"2321.1"))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implements generic signing/verification of entity services ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance MessageAdapter for Artifact in aggregator REST API")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/925"},"#925")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Create the sub-command for 'Cardano Immutable Files Full' in client")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/895"},"#895")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance state machines Aggregator/Signer")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/933"},"#933")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Adapt the aggregator REST API to list certificates")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/892"},"#892")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Adapt end to end tests to handle new types of data")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/899"},"#899")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Update client documentation")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/897"},"#897")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Update architecture documentations for new types of data")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/898"},"#898")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance terraform infrastructure")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/930"},"#930")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that implements the computation of the stake distribution for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/880"},"#880"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Upgrade Cardano node to '8.0.0'")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/920"},"#920")))),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add export path in Client CLI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/512"},"#512"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62f46a38.200c43f2.js b/assets/js/62f46a38.200c43f2.js new file mode 100644 index 00000000000..4a1e0f9a4b7 --- /dev/null +++ b/assets/js/62f46a38.200c43f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2681],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(r),u=a,g=d["".concat(p,".").concat(u)]||d[u]||m[u]||o;return r?n.createElement(g,i(i({ref:t},c),{},{components:r})):n.createElement(g,i({ref:t},c))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-02-17-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-17-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-goedel.md",source:"@site/blog/2023-02-17-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.53,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-02-17-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-17-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-17-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},d="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This sprint the team has been working on drafts of two papers and one\ntechnical report, distributivity properties of deltaQ, and consulting\non performance design with the Marlowe team."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Processing reviews on performance engineering paper and planning\npaper revisions accordingly")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Investigating distributivity properties of DeltaQ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Preparing sections on the thorn calculus and idempotency laws for\ndraft paper about verifying design refinements for distributed\nsystem design")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Consulting on performance design with Marlowe team"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/632979e8.1945c14a.js b/assets/js/632979e8.1945c14a.js new file mode 100644 index 00000000000..8ef49627345 --- /dev/null +++ b/assets/js/632979e8.1945c14a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32831],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=u(i),d=a,c=m["".concat(p,".").concat(d)]||m[d]||h[d]||n;return i?r.createElement(c,o(o({ref:t},s),{},{components:i})):r.createElement(c,o({ref:t},s))}));function c(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var u=2;u{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-06-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-29-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-29-mithril.md",source:"@site/blog/2023-06-29-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-06-29T00:00:00.000Z",formattedDate:"June 29, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:2.205,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-06-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-30-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-28-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},m="wrapper";function h(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,r.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano ",(0,a.kt)("inlineCode",{parentName:"p"},"mainnet")," infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator."),(0,a.kt)("p",null,"Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,a.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add infrastructure monitoring")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/987"},"#987")))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Prepare Mithril Signer deployment model for SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/862"},"#862"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/961"},"#961")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Adapt infrastructure to use Mithril Relay")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1018"},"#1018")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Announce the new signer deployment model in a dev blog post")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1017"},"#1017")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,a.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Aggregator does not exit on critical error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/993"},"#993")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Computation of master certificate of an epoch is incorrect")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1006"},"#1006")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"End to end tests are flaky")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/954"},"#954")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"'testing-preview' network does not create certificates")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1015"},"#1015")))),(0,a.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Dates format is not standardized")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/946"},"#946")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add 'recompute-certificates-hash' command to aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1001"},"#1001")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add a retry mechanism for artifact creation in aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/984"},"#984")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Log node version at startup in Aggregator/Signer")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/944"},"#944")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Reactivate Publish Results job in CI")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/978"},"#978")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Clean 'pending_snapshot' directory of aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/983"},"#983")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update OpenAPI spec examples")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1000"},"#1000")))),(0,a.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor 'MithrilStakeDistribution' entity")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/967"},"#967")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactoring client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/982"},"#982")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor download code in client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1010"},"#1010")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Factorize protocol crypto operations")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/669"},"#669")))),(0,a.kt)("li",{parentName:"ul"},"Worked on dependencies:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Upgrade Cardano node to '8.1.1'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/973"},"#973"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/637356df.030a1e3f.js b/assets/js/637356df.030a1e3f.js new file mode 100644 index 00000000000..8b23ec0cf96 --- /dev/null +++ b/assets/js/637356df.030a1e3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95979],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},l=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=r,m=d["".concat(p,".").concat(h)]||d[h]||u[h]||o;return n?a.createElement(m,s(s({ref:t},l),{},{components:n})):a.createElement(m,s({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=h;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={title:"DB Sync Team Update",slug:"2022-09-19-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-09-19-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-19-db-sync.md",source:"@site/blog/2022-09-19-db-sync.md",title:"DB Sync Team Update",description:"DBSync Update",date:"2022-09-19T00:00:00.000Z",formattedDate:"September 19, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:1.525,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB Sync Team Update",slug:"2022-09-19-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-09-20-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-16-ledger"}},p={authorsImageUrls:[void 0]},c=[{value:"DBSync Update",id:"dbsync-update",level:2},{value:"New Tag",id:"new-tag",level:3},{value:"Open source",id:"open-source",level:3},{value:"Progress on tech debt and new features",id:"progress-on-tech-debt-and-new-features",level:3}],l={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"dbsync-update"},"DBSync Update"),(0,r.kt)("h3",{id:"new-tag"},"New Tag"),(0,r.kt)("p",null,"We created a new db-sync tag 13.0.5 which addresses shortcomings of the last\nrelease 13.0.4. It is currently under testing.\nThe Changelog is\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/blob/8ad98d48e0068f3768d48e18fdcbe254037cba3b/cardano-db-sync/CHANGELOG.md#1305"},"here")," and in more details:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed fees for tx with phase 2 failure that didn't include a total collateral field.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1248"},"1248"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed an issue that could cause db-sync to crash if a specific rollback occured.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1247"},"1247"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but\ncould result in the wrong CBOR encoding being inserted.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1217"},"1217"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"All the fixes above come with unit tests which validates the fix.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Added support for preprod and preview from docker. DBSync no longer needs to include the configs\nfor different networks, these are directly fetched from the cardano world.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1254"},"1254"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We added better support from docker for the new disable options and the overall documentation.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1260"},"1260")))),(0,r.kt)("p",null,"All the above were also backported to the master branch"),(0,r.kt)("h3",{id:"open-source"},"Open source"),(0,r.kt)("p",null,"We made the db-sync ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/52/views/1"},"board public"),", so\neveryone can have access on the issues we prioritise.\nWe also added new tasks to the board, some of them could be approachable to newcomers or people who\nwant to contribute."),(0,r.kt)("h3",{id:"progress-on-tech-debt-and-new-features"},"Progress on tech debt and new features"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1223"},"1223")," was merged, which removes the\nforeign keys from the db schema. This opens the road to a number of optimizations.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"An additional fix on top of the previous work was added\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1250"},"1250"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"An initial version where DBSync does not rollback on restart is done here\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1266"},"1266"),".\nThis allows db-sync to restart much faster, without the need to delete data and reinsert them. In\nthe future it can also facilitate migrations in cases where the ledger snapshots have a breaking\nchange, without the need to resync everything from genesis."))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/63fae4f0.c9242707.js b/assets/js/63fae4f0.c9242707.js new file mode 100644 index 00000000000..9cab6a1790e --- /dev/null +++ b/assets/js/63fae4f0.c9242707.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39898],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),s=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(n),m=r,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:r,i[1]=p;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-03-21-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-03-21-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-21-network.md",source:"@site/blog/2023-03-21-network.md",title:"Network Team Update",description:"High level summary",date:"2023-03-21T00:00:00.000Z",formattedDate:"March 21, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.315,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-03-21-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-22-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-17-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:s},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"In the last spring we released ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-1.35.6")," with dynamic P2P\nfunctionality."),(0,r.kt)("p",null,"We received reports from some SPOs who encountered problems with their non\nP2P block producing nodes not being able to connect to their P2P relay. Karl\nKnutsson (from Cardano Foundation) reproduced this issue between two nodes (a\nnon P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed\nit and found a bug in the legacy non p2p code. The bug is only possible to\ntrigger with a P2P node which is binding its outbound connection port to\na fixed IP address and port (default in p2p). A possible solution was found.\nFor more information see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4465"},"#4465"),"."),(0,r.kt)("p",null,"We released ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-ping-0.1.0.0")," package to ",(0,r.kt)("inlineCode",{parentName:"p"},"CHaP"),". ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-ping")," is no\nlonger available as a standalone binary, but instead it will become part of\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli")," (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"#4664"),")"),(0,r.kt)("p",null,"We are testing ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," with peer sharing functionality (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"#4019"),")."),(0,r.kt)("p",null,"We are working on ",(0,r.kt)("em",{parentName:"p"},"eclipse evasion"),". We added new class of peers: big ledger\npeers to the outbound governor, implemented tests and fixed found issues\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"#4462"),"). We also made the information if a given peer plays the role of\na big ledger peer to the mini-protocols. This will allow to modify\nmini-protocol applications for such peers. As part of this functionality we\nrefactored some core types in the network code which simplifies exposed API."),(0,r.kt)("p",null,"Together with Moritz Angerman we started to update ",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ghc-9.6.1")," (see\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/73"},"#73"),")."),(0,r.kt)("p",null,"We merged a fix of configuration of accepted connections limit in\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"#4902"),")."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/65d0391b.cf9502af.js b/assets/js/65d0391b.cf9502af.js new file mode 100644 index 00000000000..0d29b516fcf --- /dev/null +++ b/assets/js/65d0391b.cf9502af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88572],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=p(r),d=n,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||i;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=d;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-08-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-08-17-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-crypto.md",source:"@site/blog/2023-08-17-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-08-17T00:00:00.000Z",formattedDate:"August 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.65,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-08-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-18-sre"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-08-17-db-sync"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"MuSig2",id:"musig2",level:3},{value:"Sidechains",id:"sidechains",level:3},{value:"KES agent",id:"kes-agent",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation"),(0,n.kt)("li",{parentName:"ul"},"mithril: Full node verifier"),(0,n.kt)("li",{parentName:"ul"},"musig2: Include MuSig2 description in cryptography handbook"),(0,n.kt)("li",{parentName:"ul"},"kes_agent: Finilising test and CI. Working on KES binary")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Full Node Verifier merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"),".")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started describing MuSig2 to include it as part of the cryptography handbook ")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/alexandroszacharakis8/halo2/tree/iquerejeta"},"this")," fork.")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"KES agent is ready:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"CI ready ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/19"},"#19")),(0,n.kt)("li",{parentName:"ul"},"Receipt confirmation message ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/20"},"#20")),(0,n.kt)("li",{parentName:"ul"},"KES agent binary ready ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/21"},"#21")),(0,n.kt)("li",{parentName:"ul"},"Control client implemented ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/11"},"#11"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/65ecf6d5.9b390ce8.js b/assets/js/65ecf6d5.9b390ce8.js new file mode 100644 index 00000000000..598e9649f7a --- /dev/null +++ b/assets/js/65ecf6d5.9b390ce8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64112],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(r),m=n,f=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return r?a.createElement(f,l(l({ref:t},c),{},{components:r})):a.createElement(f,l({ref:t},c))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"SRE Team Update",slug:"2023-08-04-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-04-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-sre.md",source:"@site/blog/2023-08-04-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.64,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-08-04-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-04-performance-and-tracing"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-01-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-world",id:"cardano-world",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Preprod and preview envionments were updated to 8.1.2."),(0,n.kt)("li",{parentName:"ul"},"Sanchonet and shelley-qa environments were updated to 8.2.0-pre."),(0,n.kt)("li",{parentName:"ul"},"Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Deploy cardano-node 8.1.2, merge p2p modifications, script fixes and cleanup: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/pull/416"},"cardano-ops-pull-416"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf"},"cardano-perf-repo"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Deploy cardano-node 8.1.2, emurgo p2p config, optimize faucet resources: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/104"},"cardano-world-pull-104")),(0,n.kt)("li",{parentName:"ul"},"Resolve nomad segfaults via nix versioning and fixup dbSync metal job for iohkNix env update: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/105"},"cardano-world-pull-105")),(0,n.kt)("li",{parentName:"ul"},"Add nomad dbSync fix for iohkNix env update: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/106"},"cardano-world-pull-106"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6610396c.3cf94bee.js b/assets/js/6610396c.3cf94bee.js new file mode 100644 index 00000000000..5fa7ae68000 --- /dev/null +++ b/assets/js/6610396c.3cf94bee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[84340],{30594:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/31","page":31,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/30","nextPage":"/cardano-updates/page/32","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/66326f4e.78fd62e9.js b/assets/js/66326f4e.78fd62e9.js new file mode 100644 index 00000000000..aa1f5a7c32d --- /dev/null +++ b/assets/js/66326f4e.78fd62e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17837],{16524:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/8","page":8,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/7","nextPage":"/cardano-updates/page/9","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/66345e96.e312da06.js b/assets/js/66345e96.e312da06.js new file mode 100644 index 00000000000..0a9f2fdd9d0 --- /dev/null +++ b/assets/js/66345e96.e312da06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48983],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),u=n,h=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-06-23-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-06-23-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-goedel.md",source:"@site/blog/2023-06-23-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.335,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-06-23-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-28-performance-and-tracing"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-23-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the teams presented two papers at ICE 2023."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Presented two papers at ICE 2023: ",(0,n.kt)("a",{parentName:"p",href:"https://www.discotec.org/2023/ice"},"https://www.discotec.org/2023/ice"))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Analysing and implementing chain synchronization mini protocol")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/66be9998.833c32ac.js b/assets/js/66be9998.833c32ac.js new file mode 100644 index 00000000000..1f34aee78ad --- /dev/null +++ b/assets/js/66be9998.833c32ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36186],{19894:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/security","page":1,"postsPerPage":5,"totalPages":1,"totalCount":1,"blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/67ce4884.ec575d6b.js b/assets/js/67ce4884.ec575d6b.js new file mode 100644 index 00000000000..52d6392107e --- /dev/null +++ b/assets/js/67ce4884.ec575d6b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86830],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),u=n,h=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-05-12-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-12-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-goedel.md",source:"@site/blog/2023-05-12-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.445,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-05-12-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-05-12-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-12-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team had two paper accepted for ICE 2023\n(",(0,n.kt)("a",{parentName:"p",href:"https://www.discotec.org/2023/ice"},"https://www.discotec.org/2023/ice"),"). The event will be held in Lisbon\non 19th June 2023. The papers will be published in EPTCS."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Application layer for Praos formalisation in review.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Participating in interactive peer review process for ICE 2023.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/684a796f.c08bc3c2.js b/assets/js/684a796f.c08bc3c2.js new file mode 100644 index 00000000000..80dab5fc610 --- /dev/null +++ b/assets/js/684a796f.c08bc3c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32871],{83127:a=>{a.exports=JSON.parse('{"label":"open-source","permalink":"/cardano-updates/tags/open-source","allTagsPath":"/cardano-updates/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/68585f67.eb9cce0f.js b/assets/js/68585f67.eb9cce0f.js new file mode 100644 index 00000000000..cea27461e0c --- /dev/null +++ b/assets/js/68585f67.eb9cce0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[14274],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?r.createElement(h,l(l({ref:t},c),{},{components:a})):r.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-07-21-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-21-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-sre.md",source:"@site/blog/2023-07-21-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.685,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-07-21-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-07-21-ledger"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-20-goedel"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Re-spin sanchonet for testing a new node version followed by fork to Conway"),(0,n.kt)("li",{parentName:"ul"},"Deploying a sanchonet compatible faucet to sanchonet"),(0,n.kt)("li",{parentName:"ul"},"Migrate shelley qa legacy environment to cardano-world")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Bump iohk-nix for sanchonet and shelley qa environment updates: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5406"},"cardano-node-pull-5406"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/31cce1a...496f085"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-node p2p all local roots entrypoint option was added: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/102"},"cardano-world-pull-102")),(0,n.kt)("li",{parentName:"ul"},"Migrate shelley qa legacy environment to cardano-world: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/103"},"cardano-world-pull-103")),(0,n.kt)("li",{parentName:"ul"},"Create a sanchonet compatible faucet: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/91"},"cardano-world-pull-91"))),(0,n.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migrate shelley qa legacy environment to cardano-world: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/549"},"iohk-nix-pull-549")),(0,n.kt)("li",{parentName:"ul"},"Drop legacy byron environment parameters: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/550"},"iohk-nix-pull-550"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6875c492.16502a56.js b/assets/js/6875c492.16502a56.js new file mode 100644 index 00000000000..d12db186622 --- /dev/null +++ b/assets/js/6875c492.16502a56.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48610],{99703:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(67294),l=a(95999),r=a(32244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(r.Z,{permalink:s,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},79985:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(67294),l=a(9460),r=a(30390);function s(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},41714:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var n=a(67294),l=a(86010),r=a(95999),s=a(88824),o=a(1944),i=a(35281),g=a(39960),c=a(39058),m=a(99703),p=a(90197),u=a(79985);function d(e){const t=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,r.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,r.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function h(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(o.d,{title:a}),n.createElement(p.Z,{tag:"blog_tags_posts"}))}function b(e){let{tag:t,items:a,sidebar:l,listMetadata:s}=e;const o=d(t);return n.createElement(c.Z,{sidebar:l},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,o),n.createElement(g.Z,{href:t.allTagsPath},n.createElement(r.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(u.Z,{items:a}),n.createElement(m.Z,{metadata:s}))}function E(e){return n.createElement(o.FG,{className:(0,l.Z)(i.k.wrapper.blogPages,i.k.page.blogTagPostListPage)},n.createElement(h,e),n.createElement(b,e))}}}]); \ No newline at end of file diff --git a/assets/js/68fb9d2f.2531ccaa.js b/assets/js/68fb9d2f.2531ccaa.js new file mode 100644 index 00000000000..13dcc46f443 --- /dev/null +++ b/assets/js/68fb9d2f.2531ccaa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80048],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(a),m=n,h=c["".concat(u,".").concat(m)]||c[m]||s[m]||o;return a?r.createElement(h,l(l({ref:t},d),{},{components:a})):r.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-09-16-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-09-16-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-16-ledger.md",source:"@site/blog/2022-09-16-ledger.md",title:"Ledger Team Update",description:"Ledger Update",date:"2022-09-16T00:00:00.000Z",formattedDate:"September 16, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.625,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-09-16-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-09-19-db-sync"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-01-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"Ledger Update",id:"ledger-update",level:2}],d={toc:p},c="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"ledger-update"},"Ledger Update"),(0,n.kt)("p",null,"We have been focused nearly entirely on addressing technical debt."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We introduced more consistent naming across eras, this time for the auxiliary data.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3032"},"3032"),"."),(0,n.kt)("li",{parentName:"ul"},"We made clear how the ",(0,n.kt)("inlineCode",{parentName:"li"},"consumed")," functions differs between eras (which was a previous source of\nconfusion), and added some related support to the fledgling ledger API.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3016"},"3016"),"."),(0,n.kt)("li",{parentName:"ul"},"We added clarity and organizational consistency to the main ledger era type synonyms.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3017"},"3017"),"."),(0,n.kt)("li",{parentName:"ul"},"We removed code duplication related to the input data hashes.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3018"},"3018"),"."),(0,n.kt)("li",{parentName:"ul"},"We split up a large module into smaller components. The large module was actually causing our\nCI to time out.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3020"},"3020"),"."),(0,n.kt)("li",{parentName:"ul"},"We cleaned up stale information in our cabal files, and upgraded cabal 3.8.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3023"},"3023"),",\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3031"},"3031"),",\nand ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3028"},"3028"),"."),(0,n.kt)("li",{parentName:"ul"},"We made consistent, standalone ",(0,n.kt)("inlineCode",{parentName:"li"},"TxOut")," (transaction output) modules for every era.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3024"},"3024"),"."),(0,n.kt)("li",{parentName:"ul"},"We brought consistency to a maddening inconsistent use of type variables indicating the specific\nchoice of cryptographic primitives. In particular, all uses of ",(0,n.kt)("inlineCode",{parentName:"li"},"crypto")," have been renamed to ",(0,n.kt)("inlineCode",{parentName:"li"},"c"),".\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3027"},"3027"),"."),(0,n.kt)("li",{parentName:"ul"},"We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric\ntypes that will compose better in the future and which simplifies the constraints.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3029"},"3029"),"."),(0,n.kt)("li",{parentName:"ul"},"We consolidated some existing fragmented logic regarding how we gather the scripts needed for a\ngiven transaction. This is a much needed cleanup to prevent future mistakes.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3019"},"3019"),"."),(0,n.kt)("li",{parentName:"ul"},"We fixed a problem with our generators that was causing a fair number of our property tests to\nfail in CI.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3039"},"3039"),"."),(0,n.kt)("li",{parentName:"ul"},"We have started the work to update Plutus. This will bring support for SECP in the next major\nprotocol version, and also address a\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2902"},"problem"),"\nthat we current have evolving the cost models.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3030"},"3030"),"."),(0,n.kt)("li",{parentName:"ul"},"We addressed a small issue that came up when integrating the conway era downstream, namely\nthe lack of some serialization instances.\nSee ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3022"},"3022"),".")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/691b1ed7.406ee554.js b/assets/js/691b1ed7.406ee554.js new file mode 100644 index 00000000000..e576b5f2fef --- /dev/null +++ b/assets/js/691b1ed7.406ee554.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4944],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),c=o,m=d["".concat(l,".").concat(c)]||d[c]||h[c]||r;return n?a.createElement(m,s(s({ref:t},u),{},{components:n})):a.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=c;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:o,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var a=n(87462),o=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2023-01-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-01-25-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-25-consensus.md",source:"@site/blog/2023-01-25-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-01-25T00:00:00.000Z",formattedDate:"January 25, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.27,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-01-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-26-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-01-25-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Support",id:"support",level:3}],u={toc:p},d="wrapper";function h(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"During the past two weeks, the consensus team finished the testing activities\naround the UTxO-HD prototype. This is a very important milestone which will\nenable us to run system-level tests and benchmarks, as well as start refactoring\nand cleaning the prototype. Regarding our Genesis workstream, we elaborated a\nroadmap that gives an indication of the remaining work. We also continued our\nwork on benchmarking chain-sync-jumping. We also continued working on improving\nthe way we handle blocks from the future, and advancing the integration of the\nnew VRF and KES crypto."),(0,o.kt)("h2",{id:"workstreams"},"Workstreams"),(0,o.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,o.kt)("p",null,"As the prototype is nearing its completion, it was important to have enough\nconfidence that we will be able to move additional parts of the ledger state\nonto disk. We worked together with the Ledger team to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4296"},"elaborate a\nsketch")," on how the UTxO-HD design would accommodate the migration of\nadditional data from memory to disk. This gave us enough confidence that the\ncurrent architecture will be extensible in the future."),(0,o.kt)("p",null,"On the testing front, we ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4274"},"added")," property-based tests for the UTxO-HD\ntype classes. "),(0,o.kt)("p",null,"We also ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4289"},"enabled disabled components"),", and addressed several\ntechnical debt issues:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Implement ",(0,o.kt)("inlineCode",{parentName:"li"},"splitSized")," anti-diff split (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4269"},"#4269"),"), and integrate it\ninto consensus (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4273"},"#4273"),")."),(0,o.kt)("li",{parentName:"ul"},"Renaming of ",(0,o.kt)("inlineCode",{parentName:"li"},"peekVal")," to ",(0,o.kt)("inlineCode",{parentName:"li"},"peekMDBVal")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/7"},"#7"),").")),(0,o.kt)("p",null,"We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We\nfound a race condition in the LMDB backing store, which ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4283"},"we fixed"),".\nAfter the fix we were able to successfully run these benchmarks. The results\nwere published by ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4295"},"this pull request"),"."),(0,o.kt)("p",null,"We used our ",(0,o.kt)("inlineCode",{parentName:"p"},"db-analyser")," tool to benchmark the cost of reading keys and\nflushing values to disk. The following plot shows the duration of these disk\noperation in relation to the main ledger operations, where we can see that the\ncost of the former are comparatively low. The spike at the beginning of the\ngraph is when, at the start of the Shelley era, the ",(0,o.kt)("em",{parentName:"p"},"entire")," UTxO set is flushed\nto disk."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"UTxO-HD read and flush benchmarks",src:n(90595).Z,width:"1600",height:"800"})),(0,o.kt)("p",null,"After months of hard work adding tests for the prototype, we are ready to run\nend-to-end tests on the node, and system level benchmarks. This signals a very\nimportant milestone for the UTxO-HD workstream \ud83c\udf89."),(0,o.kt)("h3",{id:"genesis"},"Genesis"),(0,o.kt)("p",null,"We elaborated a ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/blob/a626c84f6df585dd27d735eb7eec73904a1f570e/ouroboros-consensus/docs/2023-Jan-Genesis-roadmap.md"},"high-level decomposition")," of the remaining\nwork for Genesis. We also continued benchmarking the chain-sync-jumping\nhappy-path."),(0,o.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,o.kt)("p",null,"We continued working on improving the way we handle blocks from the future."),(0,o.kt)("h3",{id:"support"},"Support"),(0,o.kt)("p",null,"We completed the mapping of ",(0,o.kt)("inlineCode",{parentName:"p"},"Crypto")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"HeaderCrypto")," and body ",(0,o.kt)("inlineCode",{parentName:"p"},"Crypto"),".\n",(0,o.kt)("inlineCode",{parentName:"p"},"HeaderCrypto")," is moved to ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-protocol-tpraos"),". We created a draft ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3262"},"pull\nrequest")," to facilitate compiling consensus."))}h.isMDXComponent=!0},90595:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks-6b129a1acaa4bb48443ee81add51fd39.png"}}]); \ No newline at end of file diff --git a/assets/js/692497e1.a2ed0b7c.js b/assets/js/692497e1.a2ed0b7c.js new file mode 100644 index 00000000000..e82ebf5be3b --- /dev/null +++ b/assets/js/692497e1.a2ed0b7c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92214],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=r,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?a.createElement(h,s(s({ref:t},c),{},{components:n})):a.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:r,s[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-08-09-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-08-09-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-09-consensus.md",source:"@site/blog/2023-08-09-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-08-09T00:00:00.000Z",formattedDate:"August 9, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.46,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-08-09-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-10-mithril"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-04-crypto"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Fostering collaboration",id:"fostering-collaboration",level:2},{value:"Support",id:"support",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-sim")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-api"),", and released ",(0,r.kt)("inlineCode",{parentName:"p"},"strict-checked-vars"),"."),(0,r.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Rebased UTxO-HD on top of node 8.2 (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/256"},"issue"),")"),(0,r.kt)("li",{parentName:"ul"},"Address new ",(0,r.kt)("inlineCode",{parentName:"li"},"Maybe")," translations for UTxOs in Conway 1.6. (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/261"},"PR"),")."),(0,r.kt)("li",{parentName:"ul"},"Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/compare/96e92351ad35cfce1b0c2c47c4ed05792bf81fad..90d4c93af0846c9b027d530c042180c51aeee4fd"},"Fixed")," an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully."),(0,r.kt)("li",{parentName:"ul"},"Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running ",(0,r.kt)("inlineCode",{parentName:"li"},"QueryUTxOByAddress")," (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/273"},"PR"),")."),(0,r.kt)("li",{parentName:"ul"},"Measured the speed of ",(0,r.kt)("inlineCode",{parentName:"li"},"QueryUTxOByAddress")," under different ",(0,r.kt)("inlineCode",{parentName:"li"},"queryBatchSize")," values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution."),(0,r.kt)("li",{parentName:"ul"},"Refactored and implemented ledgertable-related classes for the general ",(0,r.kt)("inlineCode",{parentName:"li"},"HardforkBlock"),".")),(0,r.kt)("h2",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Frisby")," and ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/amesgen"},"Esgen")," continue to engage with the Researchers on grinding against the Genesis design.")),(0,r.kt)("h2",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Drafted a document explaining versioning of local state queries ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/273"},"#273"),".")),(0,r.kt)("h2",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Frisby")," is the release engineer this cycle."),(0,r.kt)("li",{parentName:"ul"},"Successfully created work-in-progress ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-api")," commits that integrate the 2023 Aug 7 tip of ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-ledger"),". This will require a release of ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus"),", which hasn't happened yet.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6927f7c4.bee27a35.js b/assets/js/6927f7c4.bee27a35.js new file mode 100644 index 00000000000..53a5808bc10 --- /dev/null +++ b/assets/js/6927f7c4.bee27a35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60019],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),c=n,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-10-25-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-25-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-25-mithril.md",source:"@site/blog/2023-10-25-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-25T00:00:00.000Z",formattedDate:"October 25, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.125,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-25-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-27-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-24-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team released a new distribution ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2342.0"},(0,n.kt)("inlineCode",{parentName:"a"},"2342.0")),". This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes."),(0,n.kt)("p",null,"They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files. "),(0,n.kt)("p",null,"Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the ",(0,n.kt)("inlineCode",{parentName:"p"},"release-mainnet")," aggregator, and enhanced the Mithril explorer UI."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P Networking - Proof of Concept")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate a library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1141"},"#1141")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano UTxO set PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"ProtocolKeyRegistration")," creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1187"},"#1187")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Fix ",(0,n.kt)("inlineCode",{parentName:"strong"},"devnet")," Mithril Docker images")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1272"},"#1272")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Build ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-common")," and ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," in WASM PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1284"},"#1284")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Display a summary of signers before the full list in explorer")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1133"},"#1133")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Add certificates list in explorer")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1184"},"#1184")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"CoreVerifier")," setup does not compute ",(0,n.kt)("inlineCode",{parentName:"strong"},"total_stake")," correctly")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1306"},"#1306"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/69c7a5a7.4519d82c.js b/assets/js/69c7a5a7.4519d82c.js new file mode 100644 index 00000000000..ea46a98cac9 --- /dev/null +++ b/assets/js/69c7a5a7.4519d82c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56950],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=s(n),p=a,h=d["".concat(c,".").concat(p)]||d[p]||m[p]||i;return n?r.createElement(h,o(o({ref:t},u),{},{components:n})):r.createElement(h,o({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-09-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-22-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-22-performance-and-tracing.md",source:"@site/blog/2023-09-22-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-09-22T00:00:00.000Z",formattedDate:"September 22, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.445,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-09-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-22-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-20-consensus"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"New team member",id:"new-team-member",level:3}],u={toc:s},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Work on machine-readable tracing of tracer configuration is ongoing."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster."),(0,a.kt)("li",{parentName:"ul"},"Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Bl\xf6ndal!")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking\nbackend with means to measure and document network latency for each run. Furthermore we've implemented means to\ncapture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences\nin the behaviour of the underlying networking stack at OS level. "),(0,a.kt)("p",null,"Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided\nto compare standard deviations instead to validate the measurements from nomad."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline\nhave been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis. "),(0,a.kt)("p",null,"Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for ",(0,a.kt)("inlineCode",{parentName:"p"},"trace-dispatcher")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"tx-generator")," we were able to address those issues."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"After various steps in constructing a configuration upon node startup, it is vital to document\nwhich runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML\ntrace message for that purpose. "),(0,a.kt)("p",null,"This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node. "),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it\nproduces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an\nimpact on our measurements, as we'd be basically using two different instruments to take them. "),(0,a.kt)("p",null,"Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service\nor the slightly different system architecture of the new cluster."),(0,a.kt)("h3",{id:"new-team-member"},"New team member"),(0,a.kt)("p",null,"Baldur Bl\xf6ndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team.\nSo I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer"),", the component receiving, processing and making available node traces and metrics."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6a2140b3.b4a88233.js b/assets/js/6a2140b3.b4a88233.js new file mode 100644 index 00000000000..57e7d8869dd --- /dev/null +++ b/assets/js/6a2140b3.b4a88233.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88845],{18702:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/mithril/page/6","page":6,"postsPerPage":5,"totalPages":7,"totalCount":34,"previousPage":"/cardano-updates/tags/mithril/page/5","nextPage":"/cardano-updates/tags/mithril/page/7","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/6a75c57a.f8e5de89.js b/assets/js/6a75c57a.f8e5de89.js new file mode 100644 index 00000000000..49b1fbd48bc --- /dev/null +++ b/assets/js/6a75c57a.f8e5de89.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88592],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=s(n),p=a,h=d["".concat(l,".").concat(p)]||d[p]||m[p]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[d]="string"==typeof e?e:a,i[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-08-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-08-04-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-performance-and-tracing.md",source:"@site/blog/2023-08-04-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.76,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-08-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-04-network"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-04-sre"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:s},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version ",(0,a.kt)("inlineCode",{parentName:"li"},"8.2.0"),"."),(0,a.kt)("li",{parentName:"ul"},"Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"8.2.0")," version of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," required adjustment of some of the sanity checks that are part of our benchmarking\ncluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint\nwhen using it as default for a running node. "),(0,a.kt)("p",null,"A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any\ninconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node.\nThis feature adds another layer of robustness to the whole system."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler\nversions. We've future-proofed our benchmarking code."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend\naccordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant. "),(0,a.kt)("p",null,"The validation phase is ongoing. We were able to perform successful runs and analyses for various ",(0,a.kt)("inlineCode",{parentName:"p"},"8.x")," node versions, including ",(0,a.kt)("inlineCode",{parentName:"p"},"8.2.0-pre"),". With parallel runs on the current cluster, we hope to measure the same effects we've observed with the\nnomad backend - which will be a big step towards production use."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6b16e156.2e2f483e.js b/assets/js/6b16e156.2e2f483e.js new file mode 100644 index 00000000000..7b1041d81c4 --- /dev/null +++ b/assets/js/6b16e156.2e2f483e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[52650],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=a,h=s["".concat(u,".").concat(d)]||s[d]||m[d]||o;return r?n.createElement(h,l(l({ref:t},p),{},{components:r})):n.createElement(h,l({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"DB-sync Team Update",slug:"2023-05-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-01-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-01-db-sync.md",source:"@site/blog/2023-05-01-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-05-01T00:00:00.000Z",formattedDate:"May 1, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.515,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-05-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-03-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-04-28-crypto"}},u={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:c},s="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Prepared a schema change which is expected to speed up queries and help clients\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1389"},"#1389"),"."),(0,a.kt)("li",{parentName:"ul"},"Ran a big number of benchmarks on the above to evaluate if this change is reasonable."),(0,a.kt)("li",{parentName:"ul"},"Performance optimization related to rewards\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1382"},"#1382")),(0,a.kt)("li",{parentName:"ul"},"Using the cache in more places to reduce recourses usage\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1380"},"#1380")),(0,a.kt)("li",{parentName:"ul"},"Evaluated risks related to UTXO-HD integration"),(0,a.kt)("li",{parentName:"ul"},"Worked on a feauture request to split the ",(0,a.kt)("inlineCode",{parentName:"li"},"tx_out")," to an address table\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1396"},"#1396")),(0,a.kt)("li",{parentName:"ul"},"Worked on another feauture request to prune the consumed entries from the ",(0,a.kt)("inlineCode",{parentName:"li"},"tx_out")," table\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1398"},"#1398")),(0,a.kt)("li",{parentName:"ul"},"Prepared for CIP-1694 integration")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6b51f988.6976254a.js b/assets/js/6b51f988.6976254a.js new file mode 100644 index 00000000000..e7fa95190b0 --- /dev/null +++ b/assets/js/6b51f988.6976254a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24384],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),m=r,d=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Q2 2023 Update",slug:"2023-Q2-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/quarterly/2023-Q2-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-consensus.md",source:"@site/quarterly/2023-Q2-consensus.md",title:"Consensus Q2 2023 Update",description:"2023-04 -- 2023-06",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:4.47,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Q2 2023 Update",slug:"2023-Q2-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},nextItem:{title:"Network Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-network"}},l={authorsImageUrls:[void 0]},u=[{value:"2023-04 -- 2023-06",id:"2023-04----2023-06",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Support",id:"support",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4}],c={toc:u},p="wrapper";function h(e){let{components:t,...o}=e;return(0,r.kt)(p,(0,a.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-04----2023-06"},"2023-04 -- 2023-06"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We finished a major prototype refactoring, which includes:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"A better and finer grained DB lock mechanism."),(0,r.kt)("li",{parentName:"ul"},"Elimination of race conditions."),(0,r.kt)("li",{parentName:"ul"},"Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance."),(0,r.kt)("li",{parentName:"ul"},"Architectural simplifications and performance improvements."))),(0,r.kt)("li",{parentName:"ul"},"We implemented a new package to support db-sync integration with UTxO-HD."),(0,r.kt)("li",{parentName:"ul"},"We ran another set of ad-hoc benchmarks:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We uncovered a performance regression on the Network component when using ",(0,r.kt)("inlineCode",{parentName:"li"},"GHC-9.2/9.4"),"."),(0,r.kt)("li",{parentName:"ul"},"The synchronization and replay speed are as expected."),(0,r.kt)("li",{parentName:"ul"},"However, we uncovered memory consumption issues (see figure below).",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The in-memory backend is consuming more memory than the baseline."),(0,r.kt)("li",{parentName:"ul"},"The LMDB backend shows an unexpected memory usage peak."),(0,r.kt)("li",{parentName:"ul"},"Investigation on these issues is ongoing."))))),(0,r.kt)("li",{parentName:"ul"},"We integrated the latest changes in ",(0,r.kt)("inlineCode",{parentName:"li"},"main")," branch.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This required a re-design of the mempool to include the mempool fairness\nimprovement.")))),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(49718).Z,width:"2500",height:"1700"})),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Genesis work for this PI focused on an high-priority issue from the IOG Researchers' feedback on the proposal.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This particular question was not anticipated when the Q2 PI was planned."),(0,r.kt)("li",{parentName:"ul"},"As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized."),(0,r.kt)("li",{parentName:"ul"},"That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package."))),(0,r.kt)("li",{parentName:"ul"},"The IOG Researchers' feedback on the design was very valuable. It had two primary effects."),(0,r.kt)("li",{parentName:"ul"},'Outcome 1: We re-introduced distinct behaviors when the node is "syncing" versus when it is "caught up".',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated."),(0,r.kt)("li",{parentName:"ul"},"The additional design complexity is relatively small."))),(0,r.kt)("li",{parentName:"ul"},"Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era."),(0,r.kt)("li",{parentName:"ul"},"All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras."),(0,r.kt)("li",{parentName:"ul"},"Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later."),(0,r.kt)("li",{parentName:"ul"},"The primary invention was a model for bounding how much benefit the adversary's long-range attack could possibly gain from Praos's natural short forks."))),(0,r.kt)("li",{parentName:"ul"},"Relevant questions that the IOG Researchers are still assessing.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"These do not block the Genesis implementation, but do affect the ultimate values of specific parameters."),(0,r.kt)("li",{parentName:"ul"},"Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?"),(0,r.kt)("li",{parentName:"ul"},"Question 2: what is the upper bound on how much grinding can improve the adversary's leader schedule within some Genesis window?")))),(0,r.kt)("h4",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We performed an analysis on number of file descriptors used by Consensus, this\ninformation can be used by the node operators to check if the number of file\ndescriptors they want to support are enough, thus improving the user (eg node\noperator) experience."),(0,r.kt)("li",{parentName:"ul"},"We implemented a mempool fairness improvement, by which transactions are\nguaranteed to be processed irrespective of their size.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We fixed a bug in followers logic, which was discovered by our ",(0,r.kt)("inlineCode",{parentName:"li"},"QuickCheck"),"\nproperty tests."),(0,r.kt)("li",{parentName:"ul"},"We created an ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/68"},"immutable DB\nserver"),". This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results."),(0,r.kt)("li",{parentName:"ul"},"We created a ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/70"},(0,r.kt)("inlineCode",{parentName:"a"},"db-truncater"))," tool, which can be used in disaster recovery and benchmarking scenarios."),(0,r.kt)("li",{parentName:"ul"},"We created a ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/161"},"benchmarks comparison tool")," that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance ",(0,r.kt)("em",{parentName:"li"},"improvements")," introduced by the Ledger team in version ",(0,r.kt)("inlineCode",{parentName:"li"},"0.6.0.0")," of Consensus wrt version ",(0,r.kt)("inlineCode",{parentName:"li"},"0.5.0.0"),".")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(23425).Z,width:"1840",height:"1372"})),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We released ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim")," as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project."),(0,r.kt)("li",{parentName:"ul"},"We migrated the consensus code to a ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus"},"new repository"),", splitting\nit from the ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-network")," repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases)."),(0,r.kt)("li",{parentName:"ul"},"We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users)."),(0,r.kt)("li",{parentName:"ul"},"We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We will ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/28"},"get UTxO-HD ready for handover"),".")),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work.")))}h.isMDXComponent=!0},23425:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2023-Q2-beacon-graph-ded65e814bfe6d927faa1c5c66bbbfad.png"},49718:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks-74f9d76c2602f09652f584cc4d6a0962.png"}}]); \ No newline at end of file diff --git a/assets/js/6b553c5c.fe679aa9.js b/assets/js/6b553c5c.fe679aa9.js new file mode 100644 index 00000000000..b7f722f21f0 --- /dev/null +++ b/assets/js/6b553c5c.fe679aa9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93784],{90804:a=>{a.exports=JSON.parse('{"label":"mithril","permalink":"/cardano-updates/tags/mithril","allTagsPath":"/cardano-updates/tags","count":34}')}}]); \ No newline at end of file diff --git a/assets/js/6b6054d2.1032f2af.js b/assets/js/6b6054d2.1032f2af.js new file mode 100644 index 00000000000..81231d3825d --- /dev/null +++ b/assets/js/6b6054d2.1032f2af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30584],{75433:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/34","page":34,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/33","nextPage":"/cardano-updates/page/35","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/6bae8700.1896d76a.js b/assets/js/6bae8700.1896d76a.js new file mode 100644 index 00000000000..ce4a3bb2025 --- /dev/null +++ b/assets/js/6bae8700.1896d76a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35703],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),c=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(d.Provider,{value:t},e.children)},u="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(a),h=n,m=u["".concat(d,".").concat(h)]||u[h]||s[h]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-11-hydra",authors:["ffakenz","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-11-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-11-hydra.md",source:"@site/blog/2023-08-11-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-11T00:00:00.000Z",formattedDate:"August 11, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.8,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-11-hydra",authors:["ffakenz","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-15-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-11-performance-and-tracing"}},d={authorsImageUrls:[void 0,void 0]},c=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:c},u="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team updated ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," to support ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node"),' version\n8.1.2, ensuring compatibility with the latest mainnet release. The team also\nparticipated in discussions about a "cardanonical" JSON schema and added it as a\nsubmodule to the project, contributing to improved data modeling and\ninteroperability.'),(0,n.kt)("p",null,"In terms of community engagement, the team successfully onboarded a new\ncontributor, also participated in a RareEvo Twitter space, and continued\npreparations for the Hydra master-class."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to support cardano-node 8.1.2 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1007"},"#1007")),(0,n.kt)("li",{parentName:"ul"},"Engaged in discussions about a ","\u201c","cardanonical","\u201d"," json schema and\nadd it as submodule to the project\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1013"},"#1013")),(0,n.kt)("li",{parentName:"ul"},"Onboarded a new contributor to the hydra project (@locallycompact)"),(0,n.kt)("li",{parentName:"ul"},"Joined RareEvo twitter space and continued preparation of hydra master-class")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update & streamline tutorial to work with latest version of hydra-node"),(0,n.kt)("li",{parentName:"ul"},"Remove the internal commit functionality ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/954"},"#954")),(0,n.kt)("li",{parentName:"ul"},"Release 0.12.0")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6c658908.1afc9614.js b/assets/js/6c658908.1afc9614.js new file mode 100644 index 00000000000..a15906e71ee --- /dev/null +++ b/assets/js/6c658908.1afc9614.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73875],{18860:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/sre","page":1,"postsPerPage":5,"totalPages":3,"totalCount":15,"nextPage":"/cardano-updates/tags/sre/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/6c8b7ad4.3b4a3f73.js b/assets/js/6c8b7ad4.3b4a3f73.js new file mode 100644 index 00000000000..aa16ff8cc54 --- /dev/null +++ b/assets/js/6c8b7ad4.3b4a3f73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[28577],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(n),d=r,h=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const o={title:"SRE Q3 2023 Update",slug:"2023-Q3-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2023-Q3-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q3-sre.md",source:"@site/quarterly/2023-Q3-sre.md",title:"SRE Q3 2023 Update",description:"2023-07 - 2023-09",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"sre",permalink:"/cardano-updates/quarterly/tags/sre"}],readingTime:.905,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Q3 2023 Update",slug:"2023-Q3-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-performance-and-tracing"},nextItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-04-25-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"2023-07 - 2023-09",id:"2023-07---2023-09",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Next steps",id:"next-steps",level:3}],u={toc:s},c="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-07---2023-09"},"2023-07 - 2023-09"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("p",null,"In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Completion of mainnet relay networking conversion to p2p topology"),(0,r.kt)("li",{parentName:"ul"},"Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality"),(0,r.kt)("li",{parentName:"ul"},"Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines"),(0,r.kt)("li",{parentName:"ul"},"Creation of a nix content addressed packages repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs"},"capkgs"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a cardano performance benchmarking cluster, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf"},"cardano-perf"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"To replace legacy cluster benchmark tooling"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a cardano cluster composition repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"cardano-parts"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"For enabling multi-cluster, multi-role cardano network deployments"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a cardano testnets repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Utilizing cardano-parts for testnet deployments"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a sanchonet demo repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo"},"sanchonet-demo"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Utilizing cardano-parts for fast sanchonet test environment and demo purposes")))),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Continue with migration of cardano-world testnets to cardano-playground"),(0,r.kt)("li",{parentName:"ul"},"Proceed with spinup of mainnet p2p bootstrap cluster"),(0,r.kt)("li",{parentName:"ul"},"Scale down mainnet non-p2p legacy cluster at the appropriate time")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6d22e028.a5fcbc6b.js b/assets/js/6d22e028.a5fcbc6b.js new file mode 100644 index 00000000000..52365339b9e --- /dev/null +++ b/assets/js/6d22e028.a5fcbc6b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29750],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(a),d=r,h=s["".concat(p,".").concat(d)]||s[d]||m[d]||l;return a?n.createElement(h,o(o({ref:t},c),{},{components:a})):n.createElement(h,o({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:r,o[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const l={title:"Node API & CLI Team Update",slug:"2023-11-14-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-11-14-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-14-node-cli-api.md",source:"@site/blog/2023-11-14-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-11-14T00:00:00.000Z",formattedDate:"November 14, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.155,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-11-14-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-15-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-10-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},s="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(s,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-11-01---2023-11-14"},"2023-11-01 - 2023-11-14"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CARDANO-NODE"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.6.0-pre"},"Pre-release of Cardano Node 8.6.0-pre"))),(0,r.kt)("p",null,"CARDANO-CLI"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improve golden tests"),(0,r.kt)("li",{parentName:"ul"},"Clean-up of conway era commands")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/451"},"Replace usages of assertFileOccurences (6/6)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/448"},"Replace usages of assertFileOccurences (5/6)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/444"},"Replace usages of assertFileOccurences by usage of new functions \u2728 (4/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/443"},"put n shelley/byron key witnesses arguments in correct order")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/441"},"Replace usages of assertFileOccurences by comparisons with golden files (3/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/436"},"Replace usages of assertFileOccurences by comparisons with golden files (2/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/435"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-8.31.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/434"},"Remove remaining uses of ",(0,r.kt)("inlineCode",{parentName:"a"},"IsCardanoEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/432"},"Release 8.14.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/430"},"Upgrade cardano-api to 8.30")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/428"},"Command types for ",(0,r.kt)("inlineCode",{parentName:"a"},"node")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/427"},"Split governance ",(0,r.kt)("inlineCode",{parentName:"a"},"MIRTransferConstructor"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/426"},"Replace usages of assertFileOccurences by comparisons with golden files (1/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/425"},"Command argument types for ",(0,r.kt)("inlineCode",{parentName:"a"},"drep")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/421"},"Add golden test for ",(0,r.kt)("inlineCode",{parentName:"a"},"governance action create-no-confidence"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/419"},"Command arguments types for stake-pool commands"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/364"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.31.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/360"},"Use ledger presentation of multi-asset values directly. Lens to make this uniform over ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/358"},"Protocol version change is not common to all versions anymore")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/355"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"ByronAndAllegraEraOnwards"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/354"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"IsCardanoEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"IsShelleyBasedEra")," contraints in GADT constructors with ",(0,r.kt)("inlineCode",{parentName:"a"},"Typeable"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/353"},"Modify foldBlocks to recurse on ledger events ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/352"},"Add generators for ",(0,r.kt)("inlineCode",{parentName:"a"},"EraBasedProtocolParametersUpdate"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/351"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.30.0.0")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.6.0-pre"},"Pre-release of Cardano Node 8.6.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5525"},"cardano-node: use ouroboros-network-protocols-0.5.2"))))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6d25229c.2394cdc6.js b/assets/js/6d25229c.2394cdc6.js new file mode 100644 index 00000000000..d041bc1516f --- /dev/null +++ b/assets/js/6d25229c.2394cdc6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91879],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=s(a),u=r,h=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-06-08-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-08-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-goedel.md",source:"@site/blog/2023-06-08-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.605,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-06-08-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-06-08-db-sync"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-08-sre"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint the team has been working on giving and preparing public\ntalks, also on preparing final versions of their ICE 2023 papers, and\non analysing chain selection."),(0,r.kt)("p",null,"This sprint the team has been working on final revisions for the\npre-proceedings versions of two ICE 2023 papers."),(0,r.kt)("h2",{id:"details"},"Details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Lambda Days keynote by Kevin Hammond:\n",(0,r.kt)("a",{parentName:"p",href:"https://www.lambdadays.org/lambdadays2023"},"https://www.lambdadays.org/lambdadays2023"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Codebeam keynote by Peter Van Roy: ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"},"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"),"; ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"},"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing talks and final versions for two ICE 2023 contributions:\n",(0,r.kt)("a",{parentName:"p",href:"https://www.discotec.org/2023/ice"},"https://www.discotec.org/2023/ice"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Analysing chain selection.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,r.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6d371395.59984cd7.js b/assets/js/6d371395.59984cd7.js new file mode 100644 index 00000000000..e9c4d0240b3 --- /dev/null +++ b/assets/js/6d371395.59984cd7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97730],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var d=n.createContext({}),s=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(d.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,d=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(d,".").concat(m)]||c[m]||p[m]||o;return a?n.createElement(h,i(i({ref:t},u),{},{components:a})):n.createElement(h,i({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-09-01-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-09-01-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-01-ledger.md",source:"@site/blog/2022-09-01-ledger.md",title:"Ledger Team Update",description:"Ledger Update",date:"2022-09-01T00:00:00.000Z",formattedDate:"September 1, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.94,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-09-01-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-16-ledger"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-08-31-consensus"}},d={authorsImageUrls:[void 0]},s=[{value:"Ledger Update",id:"ledger-update",level:2},{value:"New minimal ledger era",id:"new-minimal-ledger-era",level:3},{value:"Addressing technical debt",id:"addressing-technical-debt",level:3}],u={toc:s},c="wrapper";function p(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"ledger-update"},"Ledger Update"),(0,r.kt)("p",null,"Since finishing up support for the Vasil Hardfork, the ledger team has been\nfocused on two main things: a new ledger era and technical debt."),(0,r.kt)("h3",{id:"new-minimal-ledger-era"},"New minimal ledger era"),(0,r.kt)("p",null,"We have implemented a new ledger era named ",(0,r.kt)("inlineCode",{parentName:"p"},"conway")," which is nearly identical\nto the ",(0,r.kt)("inlineCode",{parentName:"p"},"babbage")," era. This has been the first time that we have been able to see\nwhat a minimal ledger era looks like. We have finished this task, modulo any\nintegration issues that might come up. The only thing that the ",(0,r.kt)("inlineCode",{parentName:"p"},"conway")," era\ndoes differently from the ",(0,r.kt)("inlineCode",{parentName:"p"},"babbage")," era is provide support for rotating\nthe master keys using the hardfork combinator's state translation.\nWe may end up adding features to the ",(0,r.kt)("inlineCode",{parentName:"p"},"conway")," era, but it is a nice exercise\nseeing what it looks like to get a minimal ledger era supported in all the\ndownstream components."),(0,r.kt)("h3",{id:"addressing-technical-debt"},"Addressing technical debt"),(0,r.kt)("p",null,"We have been addressing technical debt, mostly in an effort to make the\nrepository a more friendly code base to work in."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We have begun work on a ledger API, called ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-ledger-api"),"."),(0,r.kt)("li",{parentName:"ul"},"We have done a big re-design of the major type classes used in the ledger.\nWith hindsight on our side, we now have something much more organized and\neasier to use."),(0,r.kt)("li",{parentName:"ul"},"We have done a lot of re-naming. The names across eras are now much more\nuniform, avoid certain confusions that plagued us, and are clearer in where\nthey are from."),(0,r.kt)("li",{parentName:"ul"},"We have reduced a lot of code duplication that could lead to bugs if you\ndo not have the whole code base in your head."),(0,r.kt)("li",{parentName:"ul"},"We have added a handful of performance improvements."),(0,r.kt)("li",{parentName:"ul"},"We added type safety in a number of locations. In particular, the type of\nvalues that can be minted in a transaction no longer allow for Lovelace\nin the type, and some functions which used to handle both timelock scripts\nand plutus script now correctly enoforce at the type level that only one of\nthem can be used."),(0,r.kt)("li",{parentName:"ul"},"We made our generators so that they now produce a much richer set of\nvalid serializations. There is room within CBOR to serialize the same\ndata structure in multiple ways, and it is helpful to have the generators\nuse a wide variety."),(0,r.kt)("li",{parentName:"ul"},"We have begun re-organizing our test suites.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6d826f51.2c78b028.js b/assets/js/6d826f51.2c78b028.js new file mode 100644 index 00000000000..c9b7438e3ef --- /dev/null +++ b/assets/js/6d826f51.2c78b028.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7729],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),h=p(n),c=a,d=h["".concat(l,".").concat(c)]||h[c]||m[c]||o;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=c;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[h]="string"==typeof e?e:a,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-10-18-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-18-consensus.md",source:"@site/blog/2022-10-18-consensus.md",title:"Consensus Team Update",description:"High-level summary",date:"2022-10-18T00:00:00.000Z",formattedDate:"October 18, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:3.225,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-19-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-14-hydra"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"High-level status report",id:"high-level-status-report",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Finish the UTxO HD prototype",id:"finish-the-utxo-hd-prototype",level:3},{value:"Era transition property tests",id:"era-transition-property-tests",level:4},{value:"Mempool state-machine tests",id:"mempool-state-machine-tests",level:4},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"Benchmarking the CSJ prototype",id:"benchmarking-the-csj-prototype",level:3}],u={toc:p},h="wrapper";function m(e){let{components:t,...o}=e;return(0,a.kt)(h,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,a.kt)("p",null,"During the past two weeks, the consensus team worked on adding property test for\ndifferent aspects of the UTxO HD prototype: era transitions, mempool, and\nbacking store. Thanks to these tests we were able to uncover a bug in the\nprototype. On the Genesis front, we benchmarked a different version of the\nChainSync jumping prototype to try to improve its performance, but this did not\nresult in any noticeable speedup."),(0,a.kt)("h2",{id:"high-level-status-report"},"High-level status report"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Finish the UTxO HD prototype: on track.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We focused on increasing test coverage for the UTxO-HD prototype:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We started implementing Cadano-eras transition property-tests."),(0,a.kt)("li",{parentName:"ul"},"We started implementing state-machine property-tests for the mempool."),(0,a.kt)("li",{parentName:"ul"},"We merged the mempool rewrite."),(0,a.kt)("li",{parentName:"ul"},"We started working on state-machine tests for the backing store. This\nuncovered a bug in the range-read implementation of the LMDB backing\nstore."))))),(0,a.kt)("li",{parentName:"ul"},"Genesis: on track.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We benchmarked a version of the Genesis ChainSync Jumping prototype that\nspreads out the ChainSync updates over a longer period of time. This did not\nresult in any noticeable speedup."),(0,a.kt)("li",{parentName:"ul"},"We investigated the overhead introduced by non-ChainSync components, but no\nconclusions could be drawn from the benchmarks we ran.")))),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"finish-the-utxo-hd-prototype"},"Finish the UTxO HD prototype"),(0,a.kt)("p",null,"We focused on increasing test coverage for the UTxO HD prototype. We also merged\nthe ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4049"},"mempool\nrewrite"),"."),(0,a.kt)("h4",{id:"era-transition-property-tests"},"Era transition property tests"),(0,a.kt)("p",null,"We started implementing ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4043"},"Cardano era transition property\ntests"),",\nwhich are needed for making sure that the ledger tables get updated in the\nright way when we move from one era to the next. There are at the moment two\nimportant transitions."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Byron to Shelley: where all the UTxO is transferred from in-memory Byron\nstate (which has no tables) to the ledger tables of the Shelley state."),(0,a.kt)("li",{parentName:"ul"},"Shelley to Allegra: where the AVVM addresses must be deleted.")),(0,a.kt)("p",null,"We have tests for the Byron to Shelley transitions. We are working on adding\nthe remaining ones."),(0,a.kt)("h4",{id:"mempool-state-machine-tests"},"Mempool state-machine tests"),(0,a.kt)("p",null,"We started implementing ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4044"},"state-machine property tests for the\nmempool"),".\nThe mempool is currently tested via pure property tests, and use a ledger\nstate without tables. With the introduction of UTxO HD, testing the concurrent\nbehavior of the mempool became of crucial importance (eg now we have to\nacquire locks to flush the backing store). In addition, we need to test a\nledger state with tables. These needs led to the creation of a new set of\nproperty tests. In particular we aim to run parallel state-machine tests that\nexercise the mempool in a way similar to how the node would make use of it."),(0,a.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,a.kt)("p",null,"We started working on ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4081"},"state-machine tests for the backing\nstore")," that UTxO\nHD uses. The property tests uncovered errors in the range-reads implementation\nof the LMDB backing store. To facilitate fixing this bug, we made\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"changes")," to the Haskell\nLMDB bindings."),(0,a.kt)("h3",{id:"benchmarking-the-csj-prototype"},"Benchmarking the CSJ prototype"),(0,a.kt)("p",null,"Prompted by previous benchmarks showing significant improvements in sync time by\nusing more capabilities, we implemented a way to spread out the ChainSync\nupdates over a larger period instead of firing them all at the same time. This\ndidn't result in a noticeable speedup."),(0,a.kt)("p",null,"We also benchmarked the prototype with CSJ disabled (such that just the dynamo\npeer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule\nout/confirm overhead by non-ChainSync (mainly BlockFetch) related components.\nThis results in era-specific behavior (speed is like the prototype in Byron, but\nlike the baseline in Shelley). This deserves a closer look in the future."),(0,a.kt)("p",null,"This diagram shows the respective syncing progress, starting at Genesis and\ncontinuing a good part into Shelley (with the dashed line indicating the\nByron-to-Shelley transition)."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Red: baseline"),(0,a.kt)("li",{parentName:"ul"},"Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps."),(0,a.kt)("li",{parentName:"ul"},"Blue: like Green, jumps are spread out."),(0,a.kt)("li",{parentName:"ul"},"Orange: variant with no jumping, to measure unrelated overhead.")),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(35555).Z,width:"654",height:"459"})))}m.isMDXComponent=!0},35555:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/happy-path-csj-prototype-bench-2-e23d2986ddef0a187df9ce336b2db116.svg"}}]); \ No newline at end of file diff --git a/assets/js/6da0a796.a9cb8072.js b/assets/js/6da0a796.a9cb8072.js new file mode 100644 index 00000000000..273513e2093 --- /dev/null +++ b/assets/js/6da0a796.a9cb8072.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80567],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=s(r),h=n,d=c["".concat(u,".").concat(h)]||c[h]||m[h]||i;return r?a.createElement(d,l(l({ref:t},p),{},{components:r})):a.createElement(d,l({ref:t},p))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=h;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2022-11-25-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2022-11-25-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-25-crypto.md",source:"@site/blog/2022-11-25-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2022-11-25T00:00:00.000Z",formattedDate:"November 25, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.705,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-11-25-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-28-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-25-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"MuSig2",id:"musig2",level:3},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:2}],p={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The four open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team. "),(0,n.kt)("li",{parentName:"ul"},"Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes"),(0,n.kt)("li",{parentName:"ul"},"cardano-base: The VRF and BLS branchs are still open and in progress"),(0,n.kt)("li",{parentName:"ul"},"KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent. ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/31"},"PR#31")),(0,n.kt)("li",{parentName:"ul"},"We are introducing a more granular error handling mechanism ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/33"},"PR#33")),(0,n.kt)("li",{parentName:"ul"},"We rethought the API and made it more consistent with the underlying secp256k1 library ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/35"},"PR#35"))),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The mithril crates in general will be published in crates.io, and we adapted the core library's README ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/616"},"PR#616")," "),(0,n.kt)("li",{parentName:"ul"},"We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/620"},"PR#620"))),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#341")),(0,n.kt)("li",{parentName:"ul"},"SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/344"},"PR#344")),(0,n.kt)("li",{parentName:"ul"},"Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"))),(0,n.kt)("h2",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We keep progressing in the secure forgetting PR and resolving some bugs on memory handling ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"PR#255")),(0,n.kt)("li",{parentName:"ul"},"Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e43d302.e737c437.js b/assets/js/6e43d302.e737c437.js new file mode 100644 index 00000000000..36f8898d849 --- /dev/null +++ b/assets/js/6e43d302.e737c437.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59747],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var l=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,l)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var u=l.createContext({}),o=function(e){var t=l.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=o(e.components);return l.createElement(u.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},h=l.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,u=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),m=o(a),h=r,c=m["".concat(u,".").concat(h)]||m[h]||d[h]||n;return a?l.createElement(c,i(i({ref:t},s),{},{components:a})):l.createElement(c,i({ref:t},s))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,i=new Array(n);i[0]=h;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p[m]="string"==typeof e?e:r,i[1]=p;for(var o=2;o{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>n,metadata:()=>p,toc:()=>o});var l=a(87462),r=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-09-29-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-09-29-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-ledger.md",source:"@site/blog/2023-09-29-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.465,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-09-29-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-29-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-29-sre"}},u={authorsImageUrls:[void 0]},o=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Performance",id:"performance",level:3},{value:"Releasing",id:"releasing",level:3},{value:"Testing",id:"testing",level:3}],s={toc:o},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,l.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"Few important Conway related features were completed in this two week period:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Constitutional Committee was the last missing Conway related entity that has now been\nfully implemented."),(0,r.kt)("li",{parentName:"ul"},"Treasury withdrawals governance actions have been fixed and now behave as expected."),(0,r.kt)("li",{parentName:"ul"},"Current treasury amount supplied in the transaction is now enforced by the rules."),(0,r.kt)("li",{parentName:"ul"},"DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no\nproposals to vote on."),(0,r.kt)("li",{parentName:"ul"},"Semantics of how CostModels are updated with Protocol Parameters have been changed to\nallow for individual Plutus language version updates, rather than requiring a complete\nreplacement of all CostModels")),(0,r.kt)("p",null,"Besides the new features there were also important performance and testing improvements:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"In particular stake distribution computation and native script handling received some\noptimizations."),(0,r.kt)("li",{parentName:"ul"},"New testing DSL has been implemented that drastically simplifies writing unit tests for\nledger rules."),(0,r.kt)("li",{parentName:"ul"},"Integration tests and benchmarks are now possible for Conway era because of the overhaul\nof functionality for initial funds and staking injection whenever node starts up in\nConway, while bypassing all previous eras.")),(0,r.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,r.kt)("h3",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3729"},"pull-3729")," - DRep expiry update after a contiguous set of epochs with no proposals to vote on"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3739"},"pull-3739")," - Rename some PParams to be consistent with Agda specification"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3743"},"pull-3743")," - Move DRepDistr from VState to ConwayGovState"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3746"},"pull-3746")," - Implement ",(0,r.kt)("inlineCode",{parentName:"li"},"tcTranslationContextL")," for Shelley"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3737"},"pull-3737")," - Implement EraTransition"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3749"},"pull-3749")," - Add predicate failure: current treasury value mismatch in LEDGER"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3748"},"pull-3748")," - Apply enacted treasury withdrawals"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3745"},"pull-3745")," - Constitutional Committee Ratification"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3763"},"pull-3763")," - Plutus interface improvements"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3771"},"pull-3771")," - Changed how costmodel updates are applied"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3766"},"pull-3766")," - Prevent updating protocol version with ",(0,r.kt)("inlineCode",{parentName:"li"},"PParamUpdate"))),(0,r.kt)("h3",{id:"performance"},"Performance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3765"},"pull-3765")," - Improve native script handling"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3747"},"pull-3747")," - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3758"},"pull-3758")," - Cardano-Perf regression: UMap.size regression fix"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3754"},"pull-3754")," - Use Alonzo-style TxOut encoder when possible")),(0,r.kt)("h3",{id:"releasing"},"Releasing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3742"},"pull-3742")," - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3744"},"pull-3744")," - Changelog 8.4"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3752"},"pull-3752")," - Patch release of cardano ledger conway 1.8.1.0"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3753"},"pull-3753")," - Minor cleanup and changelog entries"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3760"},"pull-3760")," - Fixup issues for release"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3764"},"pull-3764")," - Bump plutus deps to 1.13")),(0,r.kt)("h3",{id:"testing"},"Testing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3734"},"pull-3734")," - Removed ",(0,r.kt)("inlineCode",{parentName:"li"},"Shaped")," instance for ",(0,r.kt)("inlineCode",{parentName:"li"},"Rep")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3735"},"pull-3735")," - Simplify the implementations of ",(0,r.kt)("inlineCode",{parentName:"li"},"hasOrd")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"hasEq")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3728"},"pull-3728")," - STS tests based on constraints"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3714"},"pull-3714")," - Implement the remaining upgradable families"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3733"},"pull-3733")," - Add some unit tests for Conway features"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3762"},"pull-3762")," - Update CDDL for praos headers.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e743f1b.64602d6e.js b/assets/js/6e743f1b.64602d6e.js new file mode 100644 index 00000000000..6d1b878afc6 --- /dev/null +++ b/assets/js/6e743f1b.64602d6e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42686],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(n),h=a,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||o;return n?r.createElement(m,i(i({ref:t},p),{},{components:n})):r.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-01-11-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-01-11-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-11-consensus.md",source:"@site/blog/2023-01-11-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-01-11T00:00:00.000Z",formattedDate:"January 11, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.35,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-01-11-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-12-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-01-11-performance-and-tracing"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"New Conway era",id:"new-conway-era",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],p={toc:u},c="wrapper";function d(e){let{components:t,...o}=e;return(0,a.kt)(c,(0,r.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The consensus team is resuming its activities after the Christmas break. During\nthese weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and\ndiscussing with the Ledger team the changes that might be required for the next\niterations. The pull request that adds the Conway era is waiting for a second\nreview round and we hope to merge it soon. On the technical debt side we are\nlooking into a property-test failure found in the iterators. We are\ninvestigating if this is an error in the model or in the implementation. We also\nimproved the documentation of our testing code."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,a.kt)("p",null,"We worked with the Ledger team to start preparing the next versions of UTxO-HD.\nThe Ledger team is concerned that for the remaining maps we might need the full\nledger state on epoch boundaries. Since the main consumer of the ledger rules is\nConsensus, the code that requires access to a full state could be moved from the\nledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take\nplace in such bridge, instead of querying the ledger for the values that are\nrequired in the epoch-transition computations."),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4234"},"relocated")," some UTxO-HD definitions, in preparation for merging\nthe prototype into ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."),(0,a.kt)("p",null,"We also completed updated local benchmarks comparing the replay time and memory\nconsumption of:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"the baseline node (",(0,a.kt)("inlineCode",{parentName:"li"},"f2fc76ef45647275c98634da1718290b976ff364"),") "),(0,a.kt)("li",{parentName:"ul"},"the UTxO-HD node with the in-memory backend "),(0,a.kt)("li",{parentName:"ul"},"the UTxO-HD node with the LMDB backend")),(0,a.kt)("p",null,"The following plot shows the results: we can see that the LMDB node barely\nreaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The\nin-memory backend is about 30 minutes faster, but still slower than the baseline\nversion. We are aware of this phenomenon and it is inherent to the problem of\nmaintaining sequences of differences of the last ",(0,a.kt)("inlineCode",{parentName:"p"},"k")," ledger states that allows\nus to perform rollback and roll-forward. We are in the process of measuring\nsyncing from scratch times."),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(15253).Z,width:"2500",height:"1700"})),(0,a.kt)("p",null,"We also ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4263"},"added ",(0,a.kt)("inlineCode",{parentName:"a"},"StaticEither")," accessors")," that helped us to simplify\nthe UTxO-HD prototype."),(0,a.kt)("h3",{id:"new-conway-era"},"New Conway era"),(0,a.kt)("p",null,"We incorporated the feedback of the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3971"},"pull request"),", and rebased this\nbranch on top of ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". The PR is pending a second review round and we hope\nto merge this soon."),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("p",null,"We are investigating a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4183"},"property-testing failure")," involving\niterators. Solving this requires understanding the expected behavior of\niterators in the counterexample found by ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," to determine if the error\nis in the model or in the implementation."),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4248"},"moved")," the contents of ",(0,a.kt)("inlineCode",{parentName:"p"},"docs/Testing.md")," closer to the code, so that the\nexplanations about the tests are easier to find in the relevant modules, and the\ndocumentation is easier to keep up to date."))}d.isMDXComponent=!0},15253:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/2023-01-11-utxo-hd-replay-benchmarks-dcf6daaf5460de7591a60db1457d2e58.png"}}]); \ No newline at end of file diff --git a/assets/js/6e7b669d.61ef66f9.js b/assets/js/6e7b669d.61ef66f9.js new file mode 100644 index 00000000000..97e7f2b5eae --- /dev/null +++ b/assets/js/6e7b669d.61ef66f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96799],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=o.createContext({}),l=function(e){var t=o.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=l(r),h=n,m=u["".concat(p,".").concat(h)]||u[h]||c[h]||a;return r?o.createElement(m,i(i({ref:t},d),{},{components:r})):o.createElement(m,i({ref:t},d))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:n,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=r(87462),n=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-09-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-09-15-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-network.md",source:"@site/blog/2023-09-15-network.md",title:"Network Team Update",description:"High-level overview of sprint 44",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.41,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-09-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-15-ledger"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-15-sre"}},p={authorsImageUrls:[void 0]},l=[{value:"High-level overview of sprint 44",id:"high-level-overview-of-sprint-44",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"Cardano-Node-8.4.0 Release",id:"cardano-node-840-release",level:3},{value:"Towards Typed Protocols 0.2.0.0",id:"towards-typed-protocols-0200",level:3},{value:"Tech Debt",id:"tech-debt",level:3},{value:"P2P adoption",id:"p2p-adoption",level:3},{value:"Open Source",id:"open-source",level:3}],d={toc:l},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,o.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-44"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+44%22"},"sprint 44")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"In this sprint, we focused on developing bootstrap peers."),(0,n.kt)("p",null,"Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we\nidentified a possible improvement to bootstrap peers. A more detailed\ndescription is available ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4675"},"here"),"."),(0,n.kt)("h3",{id:"cardano-node-840-release"},"Cardano-Node-8.4.0 Release"),(0,n.kt)("p",null,"We also were responsible for the ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node-8.4.0-pre")," release. A final\nintegration ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5467"},"PR")," is currently being merged. We published\nnew versions of ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-api")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-cli"),"."),(0,n.kt)("h3",{id:"towards-typed-protocols-0200"},"Towards Typed Protocols 0.2.0.0"),(0,n.kt)("p",null,"We also updated the future ",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols-0.2.0.0")," and its integration with\n",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node"),". This is towards our goal which we planned for the next\nquarter. The identified tasks are to fix breaking tests, and then measure and\naddress possible performance regressions."),(0,n.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,n.kt)("p",null,"Mark Tullsen (Galois) submitted two more PRs: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4663"},"ouroboros-network-#4663"),",\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4664"},"ouroboros-network-#4664"),". We provided feedback on their other pull requests: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661")," and\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4660"},"ouroboros-network-#4660"),"."),(0,n.kt)("h3",{id:"p2p-adoption"},"P2P adoption"),(0,n.kt)("p",null,"In the last two weeks, there was a regression in P2P adoption concerning\nthe number of SPOs or stakes, although the number of overall P2P relays has\nincreased. Karl Knutsson (",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"Cardano Foundation"),") is investigating\nthis issue.\n",(0,n.kt)("img",{alt:"P2P relays",src:r(70480).Z,width:"2014",height:"1586"})),(0,n.kt)("p",null,"The following graphs show several different versions of relays running on the mainnet. The\ngreen line ",(0,n.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionV10.True")," denotes P2P relays, which slowly\nincrease over time. The ",(0,n.kt)("inlineCode",{parentName:"p"},"V9")," and earlier versions of the ",(0,n.kt)("inlineCode",{parentName:"p"},"node-to-node"),"\nthe protocol indicates nodes version ",(0,n.kt)("inlineCode",{parentName:"p"},"1.35.x")," or earlier.\n",(0,n.kt)("img",{alt:"node versions",src:r(20669).Z,width:"2016",height:"1576"})),(0,n.kt)("p",null,"Data has been kindly provided by ",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"Cardano Foundation")," and their mainnet\nmonitoring infrastructure."),(0,n.kt)("h3",{id:"open-source"},"Open Source"),(0,n.kt)("p",null,"We are in the process of upstreaming our ffi to Windows Named Pipes API to the ",(0,n.kt)("inlineCode",{parentName:"p"},"Win32")," package, see ","[win32-220]","."))}c.isMDXComponent=!0},70480:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/2023-09-14-p2p-relays-1b3da3da7ec3915f63ca8668bd38aff9.png"},20669:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/2023-09-14-relay-versions-a689a96e93e12ee1c78dfe14229f0ea9.png"}}]); \ No newline at end of file diff --git a/assets/js/6eecfaae.6cbf1fce.js b/assets/js/6eecfaae.6cbf1fce.js new file mode 100644 index 00000000000..ed55a6e0093 --- /dev/null +++ b/assets/js/6eecfaae.6cbf1fce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[84069],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=n,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?a.createElement(h,i(i({ref:t},s),{},{components:r})):a.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2023-06-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-09-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-crypto.md",source:"@site/blog/2023-06-09-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-06-09T00:00:00.000Z",formattedDate:"June 9, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.705,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-06-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-12-network"},nextItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-06-09-developer-experience"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"cardano-base",id:"cardano-base",level:3},{value:"Mithril",id:"mithril",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-base: E2E tests for BLS bindings and KES agent "),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Implement ECC chip and Rescue hash primitives for ATMS"),(0,n.kt)("li",{parentName:"ul"},"mithril: Full node verifier")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"RawBearer API in ouroboros-network-framework (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395)"},"https://github.com/input-output-hk/ouroboros-network/pull/4395)"),"; blocked due to issue with windows' localSnocket. Trying to resolve."),(0,n.kt)("li",{parentName:"ul"},"Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"#317"),"."),(0,n.kt)("li",{parentName:"ul"},"Above, blocked by the simplification of typeclasses ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/404"},"#404"),"."),(0,n.kt)("li",{parentName:"ul"},"Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings")),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implementation of Full Node Verifier ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"))),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sidechains-zk/tree/master/prover/src/ecc"},"ECC chip")," implemented for JubJub over BLS12-381"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sidechains-zk/tree/master/prover/src/rescue"},"Rescue chip")," implemented for hashing."),(0,n.kt)("li",{parentName:"ul"},"Currently working on Schnorr signature (which uses the above constraints)")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6f700e99.66ebd5a7.js b/assets/js/6f700e99.66ebd5a7.js new file mode 100644 index 00000000000..28c377ca367 --- /dev/null +++ b/assets/js/6f700e99.66ebd5a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60459],{90442:a=>{a.exports=JSON.parse('{"label":"mithril","permalink":"/cardano-updates/tags/mithril","allTagsPath":"/cardano-updates/tags","count":34}')}}]); \ No newline at end of file diff --git a/assets/js/6fb45133.8780f9a7.js b/assets/js/6fb45133.8780f9a7.js new file mode 100644 index 00000000000..2ececf781a7 --- /dev/null +++ b/assets/js/6fb45133.8780f9a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79260],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-03-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-03-08-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-node-cli-api.md",source:"@site/blog/2023-03-08-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-03-08T00:00:00.000Z",formattedDate:"March 8, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.795,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-03-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-08-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-08-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-03-08---2023-03-21"},"2023-03-08 - 2023-03-21"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"General bug fixes and some refactoring "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4958"},"Remove error calls in Cardano.CLI.Shelley.Run.Transaction")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4880"},"Detect invalid counter and certificate")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5003"},"Add missing imports")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5001"},"Add LedgerStateBabbage and LedgerStateConway pattern synonyms")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4967"},"Remove unnecessary functions")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4953"},"Remove duplicate scripts when building transaction body for Mary, Alonzo and Babbage")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4903"},"Reduce number of calls to toLedgerPParams")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4686"},"Add ToJSON/FromJSON instances for ChainPoint")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4683"},"Derive Eq instance for AcquiringFailure")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4682"},"Export ",(0,r.kt)("inlineCode",{parentName:"a"},"fromShelleyBasedScript")," from Cardano.Api")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4344"},"Remove unnecessary validation of Data")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3775"},'Remove hint of "string" support for ScriptData')," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4988"},"Conway hard forks on prot-ver 9")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4968"},"Reinstate -Werror for cardano-node and fix errors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4921"},"Take all dependencies from Hackage or CHaP")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4911"},"Less verbose node-to-client and node-to-node version logging")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"Get AcceptedConnectionsLimit from the configuration")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4729"},"fix cardano-testnet Babbage genesis.json"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7030fa2f.ac2104c3.js b/assets/js/7030fa2f.ac2104c3.js new file mode 100644 index 00000000000..42add491e15 --- /dev/null +++ b/assets/js/7030fa2f.ac2104c3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39640],{3905:(t,e,a)=>{a.d(e,{Zo:()=>u,kt:()=>N});var n=a(67294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function i(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var m=n.createContext({}),o=function(t){var e=n.useContext(m),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},u=function(t){var e=o(t.components);return n.createElement(m.Provider,{value:e},t.children)},s="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,r=t.originalType,m=t.parentName,u=p(t,["components","mdxType","originalType","parentName"]),s=o(a),k=l,N=s["".concat(m,".").concat(k)]||s[k]||d[k]||r;return a?n.createElement(N,i(i({ref:e},u),{},{components:a})):n.createElement(N,i({ref:e},u))}));function N(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var r=a.length,i=new Array(r);i[0]=k;var p={};for(var m in e)hasOwnProperty.call(e,m)&&(p[m]=e[m]);p.originalType=t,p[s]="string"==typeof t?t:l,i[1]=p;for(var o=2;o{a.r(e),a.d(e,{assets:()=>m,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>o});var n=a(87462),l=(a(67294),a(3905));const r={title:"Consensus Team Update",slug:"2022-08-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2022-08-31-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-08-31-consensus.md",source:"@site/blog/2022-08-31-consensus.md",title:"Consensus Team Update",description:"Executive summary",date:"2022-08-31T00:00:00.000Z",formattedDate:"August 31, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:8.925,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-08-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-01-ledger"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-08-12-network"}},m={authorsImageUrls:[void 0]},o=[{value:"Executive summary",id:"executive-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Conway",id:"conway",level:3},{value:"UTxO HD",id:"utxo-hd",level:3},{value:"Only small rollbacks",id:"only-small-rollbacks",level:4},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3}],u={toc:o},s="wrapper";function d(t){let{components:e,...a}=t;return(0,l.kt)(s,(0,n.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"executive-summary"},"Executive summary"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"We did most of the heavy lifting required to integrate the Conway era."),(0,l.kt)("li",{parentName:"ul"},"We have property tests for the UTxO HD backing store API implementations. A\npossible bug was identified. Work is ongoing to make sure the property-tests\ncover all the relevant cases."),(0,l.kt)("li",{parentName:"ul"},'We implemented and benchmarked the "anti-diff" prototype to speed up the UTxO\nHD functionality. Results show a rough speedup of ',(0,l.kt)("inlineCode",{parentName:"li"},"4x")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"5.5x")," across\nseveral scenarios. Note that: ",(0,l.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/tasty-bench-0.3.2/docs/Test-Tasty-Bench.html"},'"Data reported by ',(0,l.kt)("inlineCode",{parentName:"a"},"tasty-bench"),' is only of\nindicative and comparative significance."'),'.\nWe are investigating additional performance improvements. The "anti-diff"\nprototype and benchmarks are still pending code review.'),(0,l.kt)("li",{parentName:"ul"},"We elaborated a draft specification for the Genesis implementation and\n",(0,l.kt)("inlineCode",{parentName:"li"},"ChainSync")," jumping optimization.")),(0,l.kt)("h2",{id:"workstreams"},"Workstreams"),(0,l.kt)("h3",{id:"conway"},"Conway"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Integration PR of the minimal Conway era (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3962"},"Issue #3963"),", ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3971"},"PR\n#3971"),")."),(0,l.kt)("li",{parentName:"ul"},"Discussions with Ledger revealed possible sources of confusion about which\ndata should be changed in the Conway era. As a result, a new technical debt\nissue was raised, which does not block the integration of the Conway era\n(",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3976"},"Issue #3976"),").")),(0,l.kt)("h3",{id:"utxo-hd"},"UTxO HD"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3954"},"Issue #3954"),", ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/tree/jdral/3954-backingstore-property-tests"},"branch"),": The functionality of a\nbacking store, which is the interface to the on-disk part of ledger state in\nUTxO-HD, is tested at a high level through the ",(0,l.kt)("inlineCode",{parentName:"p"},"OnDisk")," tests. However, some\nfunctionalities remain untested, e.g., reads of ranges of keys. As such, we\nhave implemented ",(0,l.kt)("inlineCode",{parentName:"p"},"quickcheck-state-machine")," tests that exercise backing stores\ndirectly. The tests are reusable for different backing store implementations\nbecause the tests are implementation-agnostic: Any backing store that conforms\nto the backing store interface can be plugged into the tests. Work is still\nongoing to label/monitor the tests, such that we can verify that interesting\ncases are being tested. Furthermore, a possible bug has been identified in the\nLMDB backing store with respect to range reads, though the bug has not been\nresolved yet.")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3946"},"Issue #3946"),", ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/tree/jdral/CAD-4199-prototype-anti-diffs"},"branch"),", ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3882"},"PR #3882"),': The\n"anti-diff" prototype proposes an alternative approach to keeping track of\nsequences (more specifically, ',(0,l.kt)("inlineCode",{parentName:"p"},"FingerTree"),'s) of diffs. These diff sequences\nare a component of the in-memory parts of the ledger state in UTxO-HD. Since\nthe consensus code often requires the cumulative diff of a sequence of diffs,\nthe current implementation "caches" cumulative diffs of each subtree in the\ndiff sequence. This caching allows relatively fast reconstruction of the total\ncumulative diff, but this caching proved to incur a non-negligible cost: when\nwe manipulate diff sequences through splits and appends, we force re-computing\na logarithmic number of caches. This is problematic, since we often split and\nappend in consensus: we split when we flush diffs to a backing store or when\nwe roll back blocks, and we append when pushing blocks. The new approach\nshould reduce the overhead of this caching.'),(0,l.kt)("p",{parentName:"li"},'We implemented micro-benchmarks for the "anti-diff" prototype: we\nfirst generate a sequence of commands (',(0,l.kt)("inlineCode",{parentName:"p"},"Forward"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"Push"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"Flush"),", or\n",(0,l.kt)("inlineCode",{parentName:"p"},"Rollback"),") through a simulation, after which we measure the performance of\napplying the commands to a diff sequence. In this context, ",(0,l.kt)("inlineCode",{parentName:"p"},"Forward")," means\nforwarding of values through a diff, whereas ",(0,l.kt)("inlineCode",{parentName:"p"},"Rollback"),' means switching to\na different fork by rolling back diffs/blocks and pushing new ones.\nMoreover, we compare the performance for the two implementations: the\n"legacy" approach, and the anti-diff approach.'),(0,l.kt)("p",{parentName:"li"},"Some preliminary results were positive, but we needed to revisit the\nbenchmark's configuration to obtain more definitive results. After a\ndiscussion with @dcoutts and the consensus team about this configuration\n(e.g., number of commands generated, choice of the security parameter ",(0,l.kt)("inlineCode",{parentName:"p"},"k"),"),\nthe benchmarks should now be closer to the realistic setting. The following\nconfiguration specifies the default configuration that is used in the\nbenchmarking code:"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Number of commands generated: ",(0,l.kt)("inlineCode",{parentName:"li"},"10_000")),(0,l.kt)("li",{parentName:"ul"},"Security parameter ",(0,l.kt)("inlineCode",{parentName:"li"},"k"),": ",(0,l.kt)("inlineCode",{parentName:"li"},"2160")),(0,l.kt)("li",{parentName:"ul"},"Number of initial backing values: ",(0,l.kt)("inlineCode",{parentName:"li"},"100")),(0,l.kt)("li",{parentName:"ul"},"Number of key-value pairs deleted by a push: ",(0,l.kt)("inlineCode",{parentName:"li"},"50")),(0,l.kt)("li",{parentName:"ul"},"Number of key-value pairs inserted by a push: ",(0,l.kt)("inlineCode",{parentName:"li"},"50")),(0,l.kt)("li",{parentName:"ul"},"Number of key-value pairs forwarded by a forward: ",(0,l.kt)("inlineCode",{parentName:"li"},"50")),(0,l.kt)("li",{parentName:"ul"},"Probability of a large (in the range ",(0,l.kt)("inlineCode",{parentName:"li"},"[1000, 2000]"),") rollback: ",(0,l.kt)("inlineCode",{parentName:"li"},"0.05")),(0,l.kt)("li",{parentName:"ul"},"Probability of a small (in the range ",(0,l.kt)("inlineCode",{parentName:"li"},"[1, 10]"),") rollback: ",(0,l.kt)("inlineCode",{parentName:"li"},"0.95")),(0,l.kt)("li",{parentName:"ul"},"Order of commands:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"An equal number of forward and pushes."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"1")," flush every ",(0,l.kt)("inlineCode",{parentName:"li"},"10")," pushes."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"1")," rollback every ",(0,l.kt)("inlineCode",{parentName:"li"},"100")," pushes")))),(0,l.kt)("p",{parentName:"li"},"Moreover, we run four benchmark scenarios:"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Default configuration"),(0,l.kt)("li",{parentName:"ul"},"Without rollbacks"),(0,l.kt)("li",{parentName:"ul"},"With only small rollbacks"),(0,l.kt)("li",{parentName:"ul"},"Without rollbacks, larger flushes (",(0,l.kt)("inlineCode",{parentName:"li"},"1")," flush every ",(0,l.kt)("inlineCode",{parentName:"li"},"100")," pushes)")),(0,l.kt)("h3",{parentName:"li",id:"how-to-read-results"},"How to read results"),(0,l.kt)("p",{parentName:"li"},"Note: this section uses documentation from the\n",(0,l.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/tasty-bench"},"tasty-bench")," package to\nexplain how to read the results of running our benchmarks."),(0,l.kt)("p",{parentName:"li"},"Running a benchmark scenario gives us the following (curated) output:"),(0,l.kt)("pre",{parentName:"li"},(0,l.kt)("code",{parentName:"pre",className:"language-text"},"...\nAntiDiff: OK (18.27s)\n 2.527 s \xb1 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x\nLegacyDiff: OK (32.73s)\n 10.829 s \xb1 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory\n...\n")),(0,l.kt)("p",{parentName:"li"},"The output says that the first benchmark, which exercises the anti-diff\nprototype, was repeatedly executed for ",(0,l.kt)("inlineCode",{parentName:"p"},"18.27")," seconds (wall-clock time),\nits predicted mean CPU time was ",(0,l.kt)("inlineCode",{parentName:"p"},"2.527")," seconds and means of individual\nsamples do not often diverge from it further than ",(0,l.kt)("inlineCode",{parentName:"p"},"\xb1 47")," milliseconds\n(double standard deviation). We also configure the RTS to collect GC\nstatistics, which enables ",(0,l.kt)("inlineCode",{parentName:"p"},"tasty-bench")," to estimate and report memory usage.\nThis data is reported as per ",(0,l.kt)("inlineCode",{parentName:"p"},"RTSStats")," fields: ",(0,l.kt)("inlineCode",{parentName:"p"},"allocated_bytes"),",\n",(0,l.kt)("inlineCode",{parentName:"p"},"copied_bytes")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"max_mem_in_use_bytes"),". So, the output of the first\nbenchmark says that a total of ",(0,l.kt)("inlineCode",{parentName:"p"},"2.1 GB")," of memory was allocated, that a\ntotal of ",(0,l.kt)("inlineCode",{parentName:"p"},"544 MB")," of memory were copied, and that the peak memory in usage\nwas ",(0,l.kt)("inlineCode",{parentName:"p"},"2.2 GB"),". We read the output for the second benchmark in the same way."),(0,l.kt)("p",{parentName:"li"},"Furthermore, the benchmark compares the mean CPU times for\nboth the anti-diff and legacy approaches: In this case, the mean CPU time\nfor the anti-diff approach is ",(0,l.kt)("inlineCode",{parentName:"p"},"~0.23x")," the mean CPU time for the legacy\napproach. Conversely, the mean CPU time for the legacy approach is\n",(0,l.kt)("inlineCode",{parentName:"p"},"1 / 0.23 ~= 4.35x")," the mean CPU time for the anti-diff approach. We will\ncall ",(0,l.kt)("inlineCode",{parentName:"p"},"0.23x")," the ",(0,l.kt)("em",{parentName:"p"},"improvement factor"),". We will call ",(0,l.kt)("inlineCode",{parentName:"p"},"4.35x")," the ",(0,l.kt)("em",{parentName:"p"},"speedup"),"."),(0,l.kt)("p",{parentName:"li"},"Note that these improvement factors (and reported results) are subject to\nnoise, randomness, the specific configuration parameters, and the whims\nof statistics. Data reported by ",(0,l.kt)("inlineCode",{parentName:"p"},"tasty-bench")," is only of indicative and\ncomparative significance."),(0,l.kt)("h3",{parentName:"li",id:"results"},"Results"),(0,l.kt)("p",{parentName:"li"},"For each of the 4 scenarios, we list the results of running the anti-diff and\nlegacy approaches 5 times. We run the benchmarks 5 times to get an indication\nof whether the results are similar across multiple runs. Furthermore, we\ncalculate the accompanying ",(0,l.kt)("em",{parentName:"p"},"ranges")," (if applicable) of improvement factors and\nspeedups."),(0,l.kt)("p",{parentName:"li"},"Note also the decrease in total bytes allocated and total bytes copied for\nthe anti-diff approach compared to the legacy approach."),(0,l.kt)("h4",{parentName:"li",id:"default-configuration"},"Default configuration"),(0,l.kt)("table",{parentName:"li"},(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.533 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"4.7 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"557 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.792 s"),(0,l.kt)("td",{parentName:"tr",align:null},"162 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.508 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"245 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"515 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.850 s"),(0,l.kt)("td",{parentName:"tr",align:null},"30 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.9 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.562 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"5.0 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"552 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.993 s"),(0,l.kt)("td",{parentName:"tr",align:null},"149 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.9 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.168 s (0.22x)"),(0,l.kt)("td",{parentName:"tr",align:null},"5.3 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"434 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"9.976 s"),(0,l.kt)("td",{parentName:"tr",align:null},"39 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"2.527 s (0.23x)"),(0,l.kt)("td",{parentName:"tr",align:null},"47 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"2.1 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"544 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.829 s"),(0,l.kt)("td",{parentName:"tr",align:null},"148 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"6.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.3 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")))),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"li"},"[0.22, 0.23]")),(0,l.kt)("li",{parentName:"ul"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"li"},"[1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]"))),(0,l.kt)("h4",{parentName:"li",id:"no-rollbacks"},"No rollbacks"),(0,l.kt)("table",{parentName:"li"},(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.638 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"36 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.656 s"),(0,l.kt)("td",{parentName:"tr",align:null},"207 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.638 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"75 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.654 s"),(0,l.kt)("td",{parentName:"tr",align:null},"322 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.663 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"74 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.799 s"),(0,l.kt)("td",{parentName:"tr",align:null},"216 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.645 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"51 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.732 s"),(0,l.kt)("td",{parentName:"tr",align:null},"261 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.639 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"19 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"181 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.653 s"),(0,l.kt)("td",{parentName:"tr",align:null},"234 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.7 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")))),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"li"},"0.19")),(0,l.kt)("li",{parentName:"ul"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"li"},"1 / 0.19 ~= 5.25"))))),(0,l.kt)("h4",{id:"only-small-rollbacks"},"Only small rollbacks"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.833 s (0.18x)"),(0,l.kt)("td",{parentName:"tr",align:null},"36 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"185 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"10.362 s"),(0,l.kt)("td",{parentName:"tr",align:null},"867 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.6 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.696 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"30 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"185 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.822 s"),(0,l.kt)("td",{parentName:"tr",align:null},"106 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.702 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"44 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"186 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.906 s"),(0,l.kt)("td",{parentName:"tr",align:null},"147 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.701 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"47 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"185 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.949 s"),(0,l.kt)("td",{parentName:"tr",align:null},"197 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.677 s (0.19x)"),(0,l.kt)("td",{parentName:"tr",align:null},"55 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"186 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"8.856 s"),(0,l.kt)("td",{parentName:"tr",align:null},"177 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"5.8 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")))),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"p"},"[0.18, 0.19]"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"p"},"[1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]")),(0,l.kt)("h4",{parentName:"li",id:"no-rollbacks-larger-flushes-every-100-pushes"},"No rollbacks, larger flushes (every 100 pushes)"),(0,l.kt)("table",{parentName:"li"},(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Name"),(0,l.kt)("th",{parentName:"tr",align:null},"Mean CPU time"),(0,l.kt)("th",{parentName:"tr",align:null},"2*Stdev (CPU time)"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes allocated"),(0,l.kt)("th",{parentName:"tr",align:null},"Total bytes copied"),(0,l.kt)("th",{parentName:"tr",align:null},"Peak memory"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.643 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"21 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 1: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.591 s"),(0,l.kt)("td",{parentName:"tr",align:null},"351 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.4 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.616 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"47 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 2: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.520 s"),(0,l.kt)("td",{parentName:"tr",align:null},"232 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.640 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"34 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 3: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.540 s"),(0,l.kt)("td",{parentName:"tr",align:null},"150 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.635 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"76 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 4: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.589 s"),(0,l.kt)("td",{parentName:"tr",align:null},"131 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.0 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: AntiDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"1.628 s (0.25x)"),(0,l.kt)("td",{parentName:"tr",align:null},"19 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"1.5 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"196 MB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Run 5: LegacyDiff"),(0,l.kt)("td",{parentName:"tr",align:null},"6.490 s"),(0,l.kt)("td",{parentName:"tr",align:null},"5.9 ms"),(0,l.kt)("td",{parentName:"tr",align:null},"4.0 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"1.4 GB"),(0,l.kt)("td",{parentName:"tr",align:null},"2.2 GB"))))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Improvement factor: ",(0,l.kt)("inlineCode",{parentName:"p"},"0.25"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},"Speedup : ",(0,l.kt)("inlineCode",{parentName:"p"},"1 / 0.25 ~= 4")))),(0,l.kt)("h3",{id:"genesis"},"Genesis"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"We elaborated a draft of the specification of the Genesis implementation and\nthe ChainSync Jumping optimization. In particular, this includes a proof\nsketch that the latter preserves liveness and safety in all cases (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3964"},"Issue\n3964"),").",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"@nfrisby's main realization during this sprint was that he had been\nfocusing so far on the case where the selected chain is an extension of\nthe intersection of our peers' ChainSync candidates."),(0,l.kt)("li",{parentName:"ul"},'This is the main case, ie an "absorbing" state, but it\'s not the only\ncase.'),(0,l.kt)("li",{parentName:"ul"},"The new proof sketch begins by case splitting on that predicate, and\nthat made the sketch quite a bit easier to follow."))),(0,l.kt)("li",{parentName:"ul"},'We continued working on the "happy path" ',(0,l.kt)("inlineCode",{parentName:"li"},"ChainSync")," Jumping prototype (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3960"},"Issue\n3960"),").")),(0,l.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"We started working on the issues required to re-enable nightly CI runs..\nNightly CI runs have far more lax time constraints, which gives the option to\nrun significantly more property tests than in our regular CI. To this end, we\nmerged a PR to easily adapt the number of tests globally (",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3947"},"PR\n#3947"),").")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/70372002.8347b491.js b/assets/js/70372002.8347b491.js new file mode 100644 index 00000000000..a2be70fdfc8 --- /dev/null +++ b/assets/js/70372002.8347b491.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[52703],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),d=c(n),p=a,h=d["".concat(l,".").concat(p)]||d[p]||u[p]||i;return n?r.createElement(h,o(o({ref:t},m),{},{components:n})):r.createElement(h,o({ref:t},m))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-10-06-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2023-10-06-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-06-performance-and-tracing.md",source:"@site/blog/2023-10-06-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-10-06T00:00:00.000Z",formattedDate:"October 6, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.625,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-10-06-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-06-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-04-consensus"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Consensus QTAs",id:"consensus-qtas",level:3},{value:"Development",id:"development",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system."),(0,a.kt)("li",{parentName:"ul"},"Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7."),(0,a.kt)("li",{parentName:"ul"},"Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store."),(0,a.kt)("li",{parentName:"ul"},"Tracing: The machine-readable tracer configuration has been merged. Optimization of ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-tracer")," started."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Ongoing variance analysis and refined cluster topology.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the\nperformance of the in-memory backing store and evaluate possible optimizations (or regressions) for it. "),(0,a.kt)("p",null,"Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results\nshow all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," service."),(0,a.kt)("h3",{id:"consensus-qtas"},"Consensus QTAs"),(0,a.kt)("p",null,"The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The\nfeedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype."),(0,a.kt)("h3",{id:"development"},"Development"),(0,a.kt)("p",null,"Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort. "),(0,a.kt)("p",null,"PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time,\nwe'd like to validate the many improvements that have gone into the Plutus evaluator."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The focus for further optimization of the new tracing system has shifted to ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," - the service\nreceiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," is\nmore performance critical, the receiving service must still minimize its resource footprint. Moreover, it can\ngenerate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated\nthe same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/70396aa3.b3e5d301.js b/assets/js/70396aa3.b3e5d301.js new file mode 100644 index 00000000000..359a61ca241 --- /dev/null +++ b/assets/js/70396aa3.b3e5d301.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92517],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=i,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||n;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:i,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-10-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-04-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-04-mithril.md",source:"@site/blog/2023-10-04-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-04T00:00:00.000Z",formattedDate:"October 4, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.15,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-04-consensus"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-02-network"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(h,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/discussions/1273"},"on implementing Mithril in a light wallet")," to receive feedback and contributions from the community."),(0,i.kt)("p",null,"They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks."),(0,i.kt)("p",null,"Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Created the discussion ",(0,i.kt)("strong",{parentName:"li"},"Implement Mithril in a light wallet")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/discussions/1273"},"#1273")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Run client in browser WASM PoC")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1254"},"#1254")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Benchmark aggregator performances")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1220"},"#1220")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Add SPO tickers in explorer")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1185"},"#1185")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Add a non ",(0,i.kt)("inlineCode",{parentName:"strong"},"404")," status code on the aggregator endpoint")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1103"},"#1103")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Use source attribute in errors")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1265"},"#1265")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Create a SPO checklist for KES keys update")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1267"},"#1267")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Configure status page and alerting")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1277"},"#1277")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Upgrade dependencies")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1274"},"#1274"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/704e5bb8.fbbc39f4.js b/assets/js/704e5bb8.fbbc39f4.js new file mode 100644 index 00000000000..7bad30e2a9f --- /dev/null +++ b/assets/js/704e5bb8.fbbc39f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56733],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var l=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,l)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var u=l.createContext({}),p=function(e){var t=l.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=p(e.components);return l.createElement(u.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},c=l.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,u=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(a),c=r,h=d["".concat(u,".").concat(c)]||d[c]||s[c]||n;return a?l.createElement(h,i(i({ref:t},m),{},{components:a})):l.createElement(h,i({ref:t},m))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,i=new Array(n);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>s,frontMatter:()=>n,metadata:()=>o,toc:()=>p});var l=a(87462),r=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-08-04-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-08-04-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-ledger.md",source:"@site/blog/2023-08-04-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.915,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-08-04-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-04-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-04-network"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway progress",id:"conway-progress",level:3},{value:"Testing",id:"testing",level:3},{value:"Bugfixes",id:"bugfixes",level:3},{value:"Plutus integration",id:"plutus-integration",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],m={toc:p},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,l.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The ledger team was working almost exclusively on the Conway era implementation. In\nparticular, the main focus was directed towards solidifying transaction related types and\ntheir binary representation. We also directed some effort into unblocking Plutus team with\nrespect to PlutusV3 integration."),(0,r.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,r.kt)("h3",{id:"conway-progress"},"Conway progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3552"},"pull-3552")," - Allow Constitutional Committee Hot Key to be ScriptHash"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3581"},"pull-3581")," - Make Constitutional Committee Cold Key to be ScriptHash"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3571"},"pull-3571")," - Implement a portion of the TICKF rule."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3556"},"pull-3556")," - Add Script to Constitution"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3576"},"pull-3576")," - Add optional Anchor to ConwayRegDRep certificate"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3495"},"pull-3495")," - Implement refund logic for Proposal deposits"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3579"},"pull-3579")," - Change voting procedure in the transaction to a nested Map"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3585"},"pull-3585")," - Rename ",(0,r.kt)("inlineCode",{parentName:"li"},"CommitteeCert")," into a ",(0,r.kt)("inlineCode",{parentName:"li"},"GovCert")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3587"},"pull-3587")," - Remove ",(0,r.kt)("inlineCode",{parentName:"li"},"DelegStakeTxCert")," from the ",(0,r.kt)("inlineCode",{parentName:"li"},"COMPLETE")," pragma for ",(0,r.kt)("inlineCode",{parentName:"li"},"TxCert")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3586"},"pull-3586")," - Add ",(0,r.kt)("inlineCode",{parentName:"li"},"CurrentTreasuryValue")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"TxBody")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3588"},"pull-3588")," - Rename key roles"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3557"},"pull-3557")," - Update ",(0,r.kt)("inlineCode",{parentName:"li"},"NewCommittee")," action to use ",(0,r.kt)("inlineCode",{parentName:"li"},"RewardAcnt")," and add more info"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3595"},"pull-3595")," - Add ",(0,r.kt)("inlineCode",{parentName:"li"},"ConwayUpdateDRep")," constructor to ConwayTxCertGov type"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3600"},"pull-3600")," - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3597"},"pull-3597")," - Update ",(0,r.kt)("inlineCode",{parentName:"li"},"ProposalProcedure")," return address to be a ",(0,r.kt)("inlineCode",{parentName:"li"},"RewardAcnt"))),(0,r.kt)("h3",{id:"testing"},"Testing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3374"},"pull-3374")," - New features for generation subject to constraints"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3519"},"pull-3519")," - Basic Conway features test")),(0,r.kt)("h3",{id:"bugfixes"},"Bugfixes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3566"},"pull-3566")," - Mint field translation bugfix.")),(0,r.kt)("h3",{id:"plutus-integration"},"Plutus integration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3538"},"issue-3538")," - A fairly complete specification was created for the PlutusV3 context"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3593"},"pull-3593")," - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality")),(0,r.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3574"},"pull-3574")," - Improve clarity and performance of collateral Non-ADA validation:"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3573"},"pull-3573")," - Update top-level ",(0,r.kt)("inlineCode",{parentName:"li"},"CHANGELOG.md")," with cardano-node relevant changes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3555"},"pull-3555")," - Bump pygments from 2.12.0 to 2.15.0 in /doc"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3575"},"pull-3575")," - Bump certifi from 2022.12.7 to 2023.7.22 in /doc"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3567"},"pull-3567")," - Backport mint field translation bugfix"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3568"},"pull-3568")," - Fixed typo in byron ledger spec"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3572"},"pull-3572")," - Release/backport tickf bugfix")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/709abed9.708c231e.js b/assets/js/709abed9.708c231e.js new file mode 100644 index 00000000000..fc62ad93a0c --- /dev/null +++ b/assets/js/709abed9.708c231e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85362],{92776:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/55","page":55,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/54","nextPage":"/cardano-updates/page/56","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/71d215be.87d3dda2.js b/assets/js/71d215be.87d3dda2.js new file mode 100644 index 00000000000..cb51e0fe2fb --- /dev/null +++ b/assets/js/71d215be.87d3dda2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[74390],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(a),d=n,m=c["".concat(p,".").concat(d)]||c[d]||h[d]||i;return a?r.createElement(m,o(o({ref:t},s),{},{components:a})):r.createElement(m,o({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-07-14-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-07-14-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-14-hydra.md",source:"@site/blog/2023-07-14-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-14T00:00:00.000Z",formattedDate:"July 14, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.79,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-14-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-18-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-13-mithril"}},p={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:u},c="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week the team focused on exploring the event sourced persistence in order\nto improve ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," performance. Because of this work the team noticed we\nneed to refactor the emit snapshot emission logic and update the spec in the\nlight of new changes. They also took the time to revisit their goals and product\nplans for the next quarter as well as doing some security fixes related to\nmultisignatures."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finished spike about performance improvements of event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/963"},"#963"),"."),(0,n.kt)("li",{parentName:"ul"},"Refactor snapshot emission in protocol logic."),(0,n.kt)("li",{parentName:"ul"},"Revisited our roadmap and goals."),(0,n.kt)("li",{parentName:"ul"},"Prepared and conducated a learning session on lean-waste."),(0,n.kt)("li",{parentName:"ul"},"Improve security of multi-signature checks, see ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-c8qp-cv4h-vcc4"},"this Github security advisory"),"."),(0,n.kt)("li",{parentName:"ul"},"Implemented a cache friendly way to version our binaries ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/962"},"#962"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement Event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/913"},"#913"),"."),(0,n.kt)("li",{parentName:"ul"},"Remove deprecated internal commit ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/954"},"#954")," and close ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/728"},"#728"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/71e4641a.c575aa4b.js b/assets/js/71e4641a.c575aa4b.js new file mode 100644 index 00000000000..f31f734ec79 --- /dev/null +++ b/assets/js/71e4641a.c575aa4b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53940],{16528:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>s,contentTitle:()=>p,default:()=>d,frontMatter:()=>i,metadata:()=>u,toc:()=>l});var n=o(87462),a=(o(67294),o(3905)),r=o(22004);const i={title:"Network Team Update",slug:"2022-08-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},p=void 0,u={permalink:"/cardano-updates/2022-08-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-08-12-network.md",source:"@site/blog/2022-08-12-network.md",title:"Network Team Update",description:"The networking team took an active part in the project iteration (PI) planning",date:"2022-08-12T00:00:00.000Z",formattedDate:"August 12, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.88,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-08-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-08-31-consensus"}},s={authorsImageUrls:[void 0]},l=[],k={toc:l},h="wrapper";function d(t){let{components:e,...o}=t;return(0,a.kt)(h,(0,n.Z)({},k,o,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The networking team took an active part in the project iteration (PI) planning\nsession, see cardano-node ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/39"},"backlog")," for detailed\noutcomes."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We started working on a detailed design / implementation plan for gossip.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We merged ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3859"},"input-output-hk/ouroboros-network#3859")," which\nsets the ouroboros-network repository for the single relay release.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified a bug in the network simulator, which is fixed in the\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3852"},"input-output-hk/ouroboros-network#3852"),".\nThe above PR was reviewed.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We set the tracing configuration for nodes which we deploy and fixed and\nidentified some deployment hiccups. We identified some bugs in the RT view\nwhich were registered by the maintainers.\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network-ops/pull/4"},"input-output-hk/ouroboros-network-ops#4"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We fixed typos in network-mux library:\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3921"},"input-output-hk/ouroboros-network#3921"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"For easy of debugging we renamed a trace point:\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3922"},"input-output-hk/ouroboros-network#3922"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Duncan iterated on his simulation / visualisation. He also was able to\nidentify and fix a bug in the simulator. The simulation contains 50 nodes.\nDashed lines indicate and established connection, while solid lines indicate\na TCP connection with fully open TCP window."))),(0,a.kt)(r.Z,{playing:!0,controls:!0,url:"/p2p-relay3.mp4",mdxType:"ReactPlayer"}))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7221b837.a070d45c.js b/assets/js/7221b837.a070d45c.js new file mode 100644 index 00000000000..20a91fdc283 --- /dev/null +++ b/assets/js/7221b837.a070d45c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90045],{3905:(e,t,o)=>{o.d(t,{Zo:()=>h,kt:()=>m});var n=o(67294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},h=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),u=c(o),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||r;return o?n.createElement(m,i(i({ref:t},h),{},{components:o})):n.createElement(m,i({ref:t},h))}));function m(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,i=new Array(r);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var n=o(87462),a=(o(67294),o(3905));const r={title:"Initial CIP 1694 Security Analysis and Responses",slug:"2023-11-20-cip1694",authors:"kevinhammond",tags:["ledger","cip1694","security"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-11-20-cip1694",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-20-cip1694.md",source:"@site/blog/2023-11-20-cip1694.md",title:"Initial CIP 1694 Security Analysis and Responses",description:"High level summary",date:"2023-11-20T00:00:00.000Z",formattedDate:"November 20, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"},{label:"cip1694",permalink:"/cardano-updates/tags/cip-1694"},{label:"security",permalink:"/cardano-updates/tags/security"}],readingTime:5.345,hasTruncateMarker:!1,authors:[{name:"Kevin Hammond",title:"Head of Software Engineering, Cardano Core",url:"https://github.com/kevinhammond",imageURL:"https://github.com/kevinhammond.png",key:"kevinhammond"}],frontMatter:{title:"Initial CIP 1694 Security Analysis and Responses",slug:"2023-11-20-cip1694",authors:"kevinhammond",tags:["ledger","cip1694","security"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-22-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-17-hydra"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Initial CIP-1694 Security Analysis and Responses",id:"initial-cip-1694-security-analysis-and-responses",level:2},{value:"Section: The constitutional committee",id:"section-the-constitutional-committee",level:3},{value:"Section: Size of the constitutional committee",id:"section-size-of-the-constitutional-committee",level:3},{value:"Section: Terms",id:"section-terms",level:3},{value:"Section: Registered DReps",id:"section-registered-dreps",level:3},{value:"Section: Ratification",id:"section-ratification",level:3},{value:"Section: Content",id:"section-content",level:3},{value:"Section: Protocol Parameter groups",id:"section-protocol-parameter-groups",level:3},{value:"Section: Votes",id:"section-votes",level:3},{value:"Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes",id:"section-separation-of-hard-fork-initiation-from-standard-protocol-parameter-changes",level:3},{value:"Section: Changes post Edinburgh workshop (July 2023)",id:"section-changes-post-edinburgh-workshop-july-2023",level:3},{value:"Section: Reduced deposits for some government actions",id:"section-reduced-deposits-for-some-government-actions",level:3}],h={toc:c},u="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(u,(0,n.Z)({},h,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here."),(0,a.kt)("h2",{id:"initial-cip-1694-security-analysis-and-responses"},"Initial CIP-1694 Security Analysis and Responses"),(0,a.kt)("h3",{id:"section-the-constitutional-committee"},"Section: The constitutional committee"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},'\u201cFor example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.')),(0,a.kt)("p",null,"There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-size-of-the-constitutional-committee"},"Section: Size of the constitutional committee"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.")),(0,a.kt)("p",null,"Thanks. Yes, we\u2019ve been thinking about this issue for a long time, see for example the section \u2018Final safety measure, post bootstrapping\u2019. We don\u2019t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps"),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-terms"},"Section: Terms"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The following sentence is a bit awkward to read: \u201cFor example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.\u201d \u2014> Suggestion: \u201cFor example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.\u201d ")),(0,a.kt)("p",null,"Thanks. Yes, that suggestion is a bit easier to read."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-registered-dreps"},"Section: Registered DReps"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u201cAdditionally, registered DReps will need to vote regularly to still be considered active.\u201d - There is a minor issue with requiring \u201cvoting regularly\u201d. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).")),(0,a.kt)("p",null,"Thanks. We\u2019ve added a mechanism to prevent that issue in the spec/code where if there\u2019s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-ratification"},"Section: Ratification"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It is a bit unclear why protocol changes: network group and technical group are two separate groups.")),(0,a.kt)("p",null,"These correspond exactly to the groups that are administered by the Parameter Committee."),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"I didn\u2019t understand the rationale for requiring 100% \u201cYes\u201d votes to pass \u201cInfo\u201d type governance actions? It seems they have the least potential to harm the system.")),(0,a.kt)("p",null,"Yes, it\u2019s not about harming the system, since ",(0,a.kt)("inlineCode",{parentName:"p"},"Info"),"\nactions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action. "),(0,a.kt)("p",null,"Once an action is enacted it\u2019s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-content"},"Section: Content"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.")),(0,a.kt)("p",null,"Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-protocol-parameter-groups"},"Section: Protocol Parameter groups"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.")),(0,a.kt)("p",null,"These are existing protocol parameters, described in e.g. ",(0,a.kt)("a",{parentName:"p",href:"https://docs.cardano.org/explore-cardano/parameter-guide/#:~:text=Protocol%20parameters%20on%20Cardano%20are,to%20changing%20conditions%20over%20time."},"https://cips.cardano.org/cips/cip9/"),"9 or ",(0,a.kt)("a",{parentName:"p",href:"https://docs.cardano.org/explore-cardano/parameter-guide/#:~:text=Protocol%20parameters%20on%20Cardano%20are,to%20changing%20conditions%20over%20time."},"The Cardano Protocol Parameters Guide"),"."),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories. ")),(0,a.kt)("p",null,"All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-votes"},"Section: Votes"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?")),(0,a.kt)("p",null,"They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don\u2019t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-separation-of-hard-fork-initiation-from-standard-protocol-parameter-changes"},"Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.")),(0,a.kt)("p",null,"There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-changes-post-edinburgh-workshop-july-2023"},"Section: Changes post Edinburgh workshop (July 2023)"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u201cAll governance actions are enacted one epoch after they are ratified.\u201d - I\u2019m not sure if this line is currently in the main body of the CIP?")),(0,a.kt)("p",null,"It is, but it is phrased differently: \u2018All governance actions are enacted on the epoch boundary after their ratification.\u2019"),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"section-reduced-deposits-for-some-government-actions"},"Section: Reduced deposits for some government actions"),(0,a.kt)("hr",null),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.")),(0,a.kt)("p",null,"Indeed. We have no plans for this at the moment."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/72c81964.0dc8e201.js b/assets/js/72c81964.0dc8e201.js new file mode 100644 index 00000000000..0acd8afe9dc --- /dev/null +++ b/assets/js/72c81964.0dc8e201.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94590],{3905:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>d});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(i),c=r,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||n;return i?a.createElement(d,o(o({ref:t},u),{},{components:i})):a.createElement(d,o({ref:t},u))}));function d(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var s=2;s{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-01-26-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-26-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-26-mithril.md",source:"@site/blog/2023-01-26-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-01-26T00:00:00.000Z",formattedDate:"January 26, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.175,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-01-26-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-27-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-25-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team released a new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2302.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2302.0"))," distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes."),(0,r.kt)("p",null,"Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2302.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2302.0"))),(0,r.kt)("li",{parentName:"ul"},"Implemented a backward/forward compatibility mechanism for API messages ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/688"},"#688"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for the signer registration ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/689"},"#689")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for the signature registration ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/693"},"#693")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for epoch settings ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/695"},"#695")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for certificate pending ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/696"},"#696")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for certificate ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/697"},"#697")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for snapshots list ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/698"},"#698")),(0,r.kt)("li",{parentName:"ul"},"Implement the mechanism for snapshot ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/699"},"#699")),(0,r.kt)("li",{parentName:"ul"},"Update enforcement of API version with Semver ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/705"},"#705")))),(0,r.kt)("li",{parentName:"ul"},"Completed the PoC implementation of backward compatibility with ",(0,r.kt)("inlineCode",{parentName:"li"},"protobuf")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/677"},"#677")),(0,r.kt)("li",{parentName:"ul"},"Completed the PoC implementation of backward compatibility with ",(0,r.kt)("inlineCode",{parentName:"li"},"avro")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/678"},"#678")),(0,r.kt)("li",{parentName:"ul"},"Completed the PoC to Read/Write transaction on chain for Era activations ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/672"},"#672")),(0,r.kt)("li",{parentName:"ul"},"Completed the upgrade Cardano devnet to 1.35.4 ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/523"},"#523"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7312b66d.97615e9e.js b/assets/js/7312b66d.97615e9e.js new file mode 100644 index 00000000000..f274af9dc26 --- /dev/null +++ b/assets/js/7312b66d.97615e9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3403],{39898:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/performance-tracing/page/4","page":4,"postsPerPage":5,"totalPages":5,"totalCount":25,"previousPage":"/cardano-updates/tags/performance-tracing/page/3","nextPage":"/cardano-updates/tags/performance-tracing/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/7325235b.554ee35f.js b/assets/js/7325235b.554ee35f.js new file mode 100644 index 00000000000..5f3999c6e71 --- /dev/null +++ b/assets/js/7325235b.554ee35f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[99873],{50767:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/11","page":11,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/10","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/733f2214.260f1743.js b/assets/js/733f2214.260f1743.js new file mode 100644 index 00000000000..5dc3d734225 --- /dev/null +++ b/assets/js/733f2214.260f1743.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[947],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),h=n,m=u["".concat(s,".").concat(h)]||u[h]||c[h]||o;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-10-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-14-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-14-hydra.md",source:"@site/blog/2022-10-14-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-10-14T00:00:00.000Z",formattedDate:"October 14, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.26,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-10-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-18-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-10-14-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node"),' over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks "past the opening of a Head". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Last week we thought we were done with ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/adr/18/"},"ADR18"),", but were not ..."),(0,n.kt)("li",{parentName:"ul"},"... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence."),(0,n.kt)("li",{parentName:"ul"},"Implemented a first version for persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/187"},"#187")," in response."),(0,n.kt)("li",{parentName:"ul"},"Enhanced CI to publish test results ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/benchmarks/tests/hydra-node/hspec-results"},"on our website")),(0,n.kt)("li",{parentName:"ul"},"Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!"),(0,n.kt)("li",{parentName:"ul"},"Pulled static executable feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/200"},"#200")," into scope, implemented it and merged it!"),(0,n.kt)("li",{parentName:"ul"},"Received and read through a project proposal by a vendor (building a Hydra platform).")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Get backup/recovery ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/187"},"#187")," done with proper event sourcing (ADR18)"),(0,n.kt)("li",{parentName:"ul"},"Cut the next release, version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.8.0")),(0,n.kt)("li",{parentName:"ul"},"Address open comments on specification document & complete the list of identified gaps between specification and implementation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Have the CI build macos artifacts")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/73a1bc7a.eede1bae.js b/assets/js/73a1bc7a.eede1bae.js new file mode 100644 index 00000000000..6b770553345 --- /dev/null +++ b/assets/js/73a1bc7a.eede1bae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[44379],{32801:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/ledger/page/4","page":4,"postsPerPage":5,"totalPages":6,"totalCount":30,"previousPage":"/cardano-updates/tags/ledger/page/3","nextPage":"/cardano-updates/tags/ledger/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/73a96f39.b97f3a8a.js b/assets/js/73a96f39.b97f3a8a.js new file mode 100644 index 00000000000..321a947a92b --- /dev/null +++ b/assets/js/73a96f39.b97f3a8a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95845],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(s,".").concat(c)]||d[c]||h[c]||o;return a?r.createElement(m,i(i({ref:t},u),{},{components:a})):r.createElement(m,i({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-04-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-21-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-21-hydra.md",source:"@site/blog/2023-04-21-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-21T00:00:00.000Z",formattedDate:"April 21, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.26,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-27-hydra"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-04-21-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team worked on several fronts, including fixing state\nmachine continuity on-chain, discussing voting project solutions, exploring\nadding Hydra support to kupo, and improving API navigation with a sidebar. The\nteam also updated dependencies and fixed issues in their test suites. Moving\nforward, the team plans to hold the next monthly review meeting, address a user\nissue, prepare for the 0.10.0 release, and work on a dirt road fix for the\nrollbacks issue with proper test coverage."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixed scripts to enforce state machine continuity on-chain ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/777"},"#777"),"."),(0,n.kt)("li",{parentName:"ul"},"Took part in a twitter space on ",(0,n.kt)("a",{parentName:"li",href:"https://twitter.com/thepizzaknight_/status/1647833904282320896"},"\u201c","Scaling Cardano","\u201d"),"."),(0,n.kt)("li",{parentName:"ul"},"Joined a CBIA meeting to discuss Cardano network protocols & how to specify them."),(0,n.kt)("li",{parentName:"ul"},"Discussed potential solutions of ensuring vote uniqueness in the voting project."),(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to match ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node")," master to prepare for upcoming releases and hard-forks"),(0,n.kt)("li",{parentName:"ul"},"Explored adding Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/CardanoSolutions/kupo/pull/117"},"support to kupo"),", a lightweight Cardano chain indexer - some more work required."),(0,n.kt)("li",{parentName:"ul"},"Improved navigation of the API Reference with a sidebar, see ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/api-reference/"},"unstable API version"),"."),(0,n.kt)("li",{parentName:"ul"},"Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting (join via ",(0,n.kt)("a",{parentName:"li",href:"https://discord.gg/inputoutput?event=1097863746216538194"},"Discord")," or ",(0,n.kt)("a",{parentName:"li",href:"https://www.addevent.com/event/ck16794110"},"AddEvent"),") & report"),(0,n.kt)("li",{parentName:"ul"},"Dirt road fix for rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")," properly covered by a test."),(0,n.kt)("li",{parentName:"ul"},"Groom and ideally address user issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/823"},"#823"),"."),(0,n.kt)("li",{parentName:"ul"},"Put the spec into the repo ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693")," and prepare release 0.10.0.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/73bbd4d7.28eef603.js b/assets/js/73bbd4d7.28eef603.js new file mode 100644 index 00000000000..bc44560abd1 --- /dev/null +++ b/assets/js/73bbd4d7.28eef603.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25590],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(n),h=r,d=c["".concat(l,".").concat(h)]||c[h]||m[h]||o;return n?a.createElement(d,i(i({ref:t},u),{},{components:n})):a.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i="Executive summary",s={permalink:"/cardano-updates/2022-09-20-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-20-consensus.md",source:"@site/blog/2022-09-20-consensus.md",title:"Consensus Team Update",description:"- We proposed a fix for the performance degradation observed when running",date:"2022-09-20T00:00:00.000Z",formattedDate:"September 20, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:3.895,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-09-27-network"},nextItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-09-19-db-sync"}},l={authorsImageUrls:[void 0]},p=[{value:"UTxO HD",id:"utxo-hd",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Technical debt",id:"technical-debt",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...o}=e;return(0,r.kt)(c,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We proposed a fix for the performance degradation observed when running\ndistributed multi-node benchmarks in the UTxO HD feature branch. While this\nfixed the problems observed when running local benchmarks, it broke the\n",(0,r.kt)("inlineCode",{parentName:"li"},"ThreadNet")," tests due to concurrency issues. Therefore, we think it is wise to\nstart redesigning the UTxO HD mempool integration."),(0,r.kt)("li",{parentName:"ul"},"We did several rounds of code review on the alternative implementation of\ndiff-sequences required by the UTxO HD feature based on the idea of\nanti-diffs. This alternative implementation is close to being merged, and the\nnext step is to integrate this to the UTxO HD branch, so that we can run\nad-hoc replaying and syncing from scratch benchmarks and compare these with\nthe baseline. The micro-benchmarks we elaborated for the alternative\nimplementation show speedups of up to 4x, so we are optimistic about the\nperformance of replaying and syncing from scratch benchmarks, however it is\nimportant to notice that ",(0,r.kt)("em",{parentName:"li"},"due to the nature of UTxO HD")," we will still be\nslower than the baseline."),(0,r.kt)("li",{parentName:"ul"},"The final draft of the Genesis implementation specification is ready for\nreview."),(0,r.kt)("li",{parentName:"ul"},"We implemented a prototype for the happy path of Genesis' ChainSync Jumping\n(CSJ). The prototype is slower than the baseline, however it is not the latest\nversion of the prototype and the jump interval is very small."),(0,r.kt)("li",{parentName:"ul"},"Work on integrating Conway has ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3971#issuecomment-1252524031"},"stopped")," since\npriorities have changed."),(0,r.kt)("li",{parentName:"ul"},"We started work on benchmarking epoch-boundaries and epoch overhead\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4014"},"pr-4014"),". To this end, we made use of a modified version of our\n",(0,r.kt)("inlineCode",{parentName:"li"},"db-analyser")," tool. We ran the new benchmarking setup using the Cardano\nmainnet chain, and we can see that block tick and application take\nsubstantially longer at epoch boundaries, although there are a couple of slots\nduring an epoch in which these computations take more than normal. We notified\nthe ledger team about these findings. We will use this modified version of\n",(0,r.kt)("inlineCode",{parentName:"li"},"db-analyser")," to investigate the epoch overhead.")),(0,r.kt)("h1",{id:"workstreams"},"Workstreams"),(0,r.kt)("h2",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Spent quite some time investigating the root cause of the degradation in\nperformance observed in the benchmarks. We run the ",(0,r.kt)("inlineCode",{parentName:"p"},"make forge-stress"),"\nbenchmarks locally in order to debug this behavior."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Transaction batching doesn't make a notable difference in the outcome\n(considering we are using the in-memory backend).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The mempool batching implementation required asynchronous transaction\nvalidation which is a violation of the ",(0,r.kt)("inlineCode",{parentName:"p"},"LocalTxSubmission")," protocol\ncontract and therefore if we continued on that route, the impact would\nhave been quite big.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The STM logic we implemented by using a ",(0,r.kt)("inlineCode",{parentName:"p"},"TMVar")," for the mempool internal\nstate was buggy and under certain circumstances it seemed to lock.\nReverting the mempool internal state to be stored in a ",(0,r.kt)("inlineCode",{parentName:"p"},"TVar")," seems to\nsolve this problem.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The results we get after this change look almost identical to the ones\nfrom the baseline.")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3997"},"The anti-diff prototype (PR\n#3997)")," has\nbeen reviewed and is close to being merged."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"A follow-up issue (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4010"},"issue\n#4010"),")\nto integrate the anti-diff prototype in the various ",(0,r.kt)("inlineCode",{parentName:"li"},"consensus"),' packages\nwas created. A first version of the integration exists, and all tests\npass. A next step is to get some indication of the "real" performance gain\nby profiling ',(0,r.kt)("inlineCode",{parentName:"li"},"db-analyser")," (or ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node"),").")))),(0,r.kt)("h2",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Final draft of the Genesis implementation specification, now up for review.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Local benchmark setup for parameter tuning via the happy path ChainSync\nJumping (CSJ) prototype (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3987"},"Issue 3987"),")."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Context: Our Genesis design requires us to check in with a large (~20)\nnumber of servers periodically while syncing. These servers are offered\njump requests via the ChainSync protocol (hence the name), which they can\naccept or decline. If a peer declines, the Genesis rule allows us to\ndetermine whether a node actually has a better chain.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'The "happy path" is when no peer declines a jump. We want this to have\nclose to no overhead compared to status quo, i.e. syncing without Genesis.')),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented a prototype for this happy path, and are now starting to\ntest in various configurations (number of peers, latency, bandwidth) to\ntune the performance of ChainSync jumping, i.e. how complicated our logic\nof choosing when to jump needs to be."),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Example:"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Simulated connection: 50 MBit/s, 50ms latency")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Jump interval: 3000 slots (on the low end, could be increased to up to\n",(0,r.kt)("inlineCode",{parentName:"p"},"3k/f"),")")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Red: baseline (1.35.3), one peer in topology file")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Blue: Preliminary version of our prototype, with 10 peers."),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("img",{src:n(88213).Z,width:"654",height:"459"})),(0,r.kt)("p",{parentName:"li"},"It is slower by about ~30%, but it is not the latest version of the\nprototype, and the jump interval is very small, making CSJ more of a\nbottleneck."))))),(0,r.kt)("h2",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fix flakiness in ChainDB QSM tests (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3990"},"PR 3990"),").")))}m.isMDXComponent=!0},88213:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/happy-path-csj-prototype-prelim-5bbe2e2a20a2740e6238a7c73e618168.svg"}}]); \ No newline at end of file diff --git a/assets/js/73f0dde0.f2c110fe.js b/assets/js/73f0dde0.f2c110fe.js new file mode 100644 index 00000000000..8ef3d277600 --- /dev/null +++ b/assets/js/73f0dde0.f2c110fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30101],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(a),s=r,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||i;return a?n.createElement(h,o(o({ref:t},d),{},{components:a})):n.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-05-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-05-05-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-05-node-cli-api.md",source:"@site/blog/2023-05-05-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-05-05T00:00:00.000Z",formattedDate:"May 5, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.81,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-05-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-05-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-04-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-05-05---2023-05-23"},"2023-05-05 - 2023-05-23"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Golden tests for cardano-cli command help output were added."),(0,r.kt)("li",{parentName:"ul"},"Documentation was updated with new libsodium installation instructions."),(0,r.kt)("li",{parentName:"ul"},"There were several updates for the cardano-cli:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Deletion of the deprecated shelley command group."),(0,r.kt)("li",{parentName:"ul"},"Addition of golden tests for CLI help."),(0,r.kt)("li",{parentName:"ul"},"An improvement to avoid bare IO in tests, allowing better error reporting in failed tests."),(0,r.kt)("li",{parentName:"ul"},"Generation of UTCTime test values without leap seconds (avoids erroneous test failures)"),(0,r.kt)("li",{parentName:"ul"},"Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32."))),(0,r.kt)("li",{parentName:"ul"},"The cardano-api underwent multiple refinements:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Implementing deposit handling when balancing transactions (necessary for Conway)"),(0,r.kt)("li",{parentName:"ul"},"Cleaning up socket file path code."))),(0,r.kt)("li",{parentName:"ul"},"Several changes were made to the cardano-testnet:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Adding golden tests for cardano-testnet help."),(0,r.kt)("li",{parentName:"ul"},"Removing all hardcoded yaml files in cardano-testnet"),(0,r.kt)("li",{parentName:"ul"},"Improving cardano-testnet help output."),(0,r.kt)("li",{parentName:"ul"},"Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.")))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5181"},"Update libsodium installation instructions")," ")),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5264"},"Delete deprecated ",(0,r.kt)("inlineCode",{parentName:"a"},"shelley")," command group")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5206"},"Add golden tests for CLI help")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5201"},"Avoid bare IO in tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5200"},"Split ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli")," test files into separate directories")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5198"},"Make UTCTime test generator generate values without leap seconds")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5189"},"Add support with signing transactions with ",(0,r.kt)("inlineCode",{parentName:"a"},"GenesisDelegateSigningKey_ed25519_bip32"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5184"},"Rename --signed-tx-file argument to --tx-file argument in verify-poll command")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5120"},"Simplify socket path code")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5221"},"refactor: make renderScriptWitnessIndex output more explicit")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5218"},"Implement deposit handling when balancing transactions")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5217"},"Replace remaining ",(0,r.kt)("inlineCode",{parentName:"a"},"FilePath")," use in ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5215"},"Cleanup socket file path code")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5207"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"readEnvSocketPath")," function")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5194"},"IO functions for reading. Remove PoolMetadataFile type")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5191"},"Expose config reader")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5188"},"Golden tests for ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api")," errors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5175"},"Fix ",(0,r.kt)("inlineCode",{parentName:"a"},"toEraInMode")," for conway")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5168"},"Use machine readable output for ToJSON ScriptWitnessIndex")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5096"},"Expose LocalTxSubmissionClient data constructor")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5047"},"Use cardano-api from separate repository")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4684"},"[cardano-api] Export fromConsensusPointHF")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5022"},"Provide orphan ",(0,r.kt)("inlineCode",{parentName:"a"},"ToJSON")," instances for ",(0,r.kt)("inlineCode",{parentName:"a"},"HardForkNodeToClientVersion")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"HardForkNodeToNodeVersion"))," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5254"},"Add golden test for ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-testnet")," help")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5242"},"Remove all hardcoded yaml files from cardano-testnet")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5234"},"Fix cardano-testnet help")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5211"},"Parameterize default yaml configuration value in cardano-testnet")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5165"},"Freeze callstack in integration and integrationRetryWorkspace functions")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5128"},"Create defaultYamlValue for cardano-testnet"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7439ef37.e15faba5.js b/assets/js/7439ef37.e15faba5.js new file mode 100644 index 00000000000..6695d002f30 --- /dev/null +++ b/assets/js/7439ef37.e15faba5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20433],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=r.createContext({}),u=function(e){var t=r.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(o.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,o=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),d=u(a),h=l,c=d["".concat(o,".").concat(h)]||d[h]||m[h]||n;return a?r.createElement(c,i(i({ref:t},s),{},{components:a})):r.createElement(c,i({ref:t},s))}));function c(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,i=new Array(n);i[0]=h;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p[d]="string"==typeof e?e:l,i[1]=p;for(var u=2;u{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>m,frontMatter:()=>n,metadata:()=>p,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-11-08-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-11-08-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-08-ledger.md",source:"@site/blog/2023-11-08-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-11-08T00:00:00.000Z",formattedDate:"November 8, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.685,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-11-08-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-11-09-db-sync"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-08-mithril"}},o={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway",id:"conway",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],s={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"This update contains mostly improvements to quality of Conway era implementation and\ntooling that we use for testing Ledger. Major Conway bugs that were discovered and\nsquashed are:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"PParamsUpdate proposals will now correctly use DRep thresholds for ratification"),(0,l.kt)("li",{parentName:"ul"},"Treasury withdrawals are now properly enacted."),(0,l.kt)("li",{parentName:"ul"},"Corrected snapshotting and DRep Stake Distribution Pulser initialization"),(0,l.kt)("li",{parentName:"ul"},"Delegation to non-existent Stake pool is no longer possible")),(0,l.kt)("p",null,"Other important quality of life improvements are addition of reusable interfaces for an\nordered set ",(0,l.kt)("inlineCode",{parentName:"p"},"OSet")," and ordered map ",(0,l.kt)("inlineCode",{parentName:"p"},"OMap"),". Which allowed us to disable duplicate\ncertificates and proposals in a transaction. As a precursor to ",(0,l.kt)("inlineCode",{parentName:"p"},"PlutusV3")," integration, a\nserious reorganization of Plutus related functionality was performed."),(0,l.kt)("p",null,"Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on\nexpired proposals, addition of Anchor to Constitutional Committee resignation proposals."),(0,l.kt)("p",null,'Significant improvements have been made to a specialized "Imp" test library that allows us\nwriting concise stateful unit tests for verifying the Ledger logic. Serious progress has\nbeen made on the conformance testing, where we can now interface with Haskell generated\ncode from the Agda specification. Serialization testing has been extended to increase\nbinary conformance coverage.'),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway"},"Conway"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3808"},"pull-3808")," - Enhance ",(0,l.kt)("inlineCode",{parentName:"li"},"CommitteeMembersState")," query to return quorum and NoConfidence"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3801"},"pull-3801")," - Fix epoch rule and tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3803"},"pull-3803")," - Fix delegation validation"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3759"},"pull-3759")," - Reshuffle things to the DRepPulser incorporates some snap shot things"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3779"},"pull-3779")," - Prevent duplicate certs and proposals"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3794"},"pull-3794")," - Added anchor to resign certs"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3797"},"pull-3797")," - Cleanup JSON instances for Conway governance"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3848"},"pull-3848")," - Plutus modules restructure"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3840"},"pull-3840")," - Fix anomalies in Deposits in the Conway Era"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3856"},"pull-3856")," - Add governance related ledger events"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3825"},"pull-3825")," - Prevent voting on expired GovActions"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3831"},"pull-3831")," - Treasury withdrawal fix"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3791"},"pull-3791")," - Use a Data.OMap.Strict to replace ProposalsSnapshot"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3836"},"pull-3836")," - PParamsUpdate enactment fix"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3846"},"pull-3846")," - Revert argument order swap.")),(0,l.kt)("h3",{id:"testing"},"Testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3782"},"pull-3782")," - Move ",(0,l.kt)("inlineCode",{parentName:"li"},"ImpTest")," to Shelley testlib"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3842"},"pull-3842")," - Imp improvements"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3844"},"pull-3844")," - Add mappings to Agda types"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3853"},"pull-3853")," - Fix strange assertion failure, which hides real Block too big problem."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3809"},"pull-3809")," - CDDL roundtrip testing"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3832"},"pull-3832")," - Treasury withdrawals tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3839"},"pull-3839")," - Added ",(0,l.kt)("inlineCode",{parentName:"li"},"cardano-ledger-conformance")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3841"},"pull-3841")," - Add ",(0,l.kt)("inlineCode",{parentName:"li"},"sha256")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"cardano-ledger-executable-spec"))),(0,l.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3843"},"pull-3843")," - Add ...WithLogs versions of evalScripts and friends"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3795"},"pull-3795")," - Bump plutus to 1.15"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3798"},"pull-3798")," - Bump urllib3 from 1.26.17 to 1.26.18 in /doc"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3799"},"pull-3799")," - Changes needed for 8.6 release"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3807"},"pull-3807")," - Add invalidBeforeL and invalidHereAfterL functions"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3819"},"pull-3819")," - Fixups needed for a release"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3829"},"pull-3829")," - Post release CHANGELOG version bumps"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3830"},"pull-3830")," - Bump aeson to 2.2"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3833"},"pull-3833")," - Backport release cardano-ledger-conway-1.10.1.0"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3828"},"pull-3828")," - Add changelog for node release 8.6")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/74d66224.39d38542.js b/assets/js/74d66224.39d38542.js new file mode 100644 index 00000000000..c48ab062d5c --- /dev/null +++ b/assets/js/74d66224.39d38542.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40767],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,m=u["".concat(l,".").concat(h)]||u[h]||c[h]||r;return n?o.createElement(m,i(i({ref:t},d),{},{components:n})):o.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var o=n(87462),a=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2022-12-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-12-14-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-consensus.md",source:"@site/blog/2022-12-14-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.995,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-12-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-15-mithril"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2022-12-14-db-sync"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD prototype",id:"utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:3},{value:"Genesis",id:"genesis",level:3},{value:"New VRF and KES crypto integration",id:"new-vrf-and-kes-crypto-integration",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],d={toc:p},u="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,o.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks, the Consensus team finalized the QSM tests for the\nbacking store and Mempool on the UTxO-HD branch with important discoveries\nregarding parallel QSM testing. We also worked with the Ledger team to envisage\nthe modifications that are required in Ledger and Consensus to accommodate the\nchanges in the crypto VRF and KES. The ",(0,a.kt)("inlineCode",{parentName:"p"},"db-analyser")," now supports bechmarking\nthe ledger operations, which will allow us to identify, debug, and profile\npotential performance problems. We drafted a document that defines how to manage\nthe versions of Consensus-related packages. The top level documentation of\n",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," now features a description of the consensus components and\nprovides a hyperlinked map to the modules documentation."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD prototype"),(0,a.kt)("p",null,"Whereas we had passing sequential state-machine tests for the mempool, the\nparallel case proved to be more challenging than we thought. The operation of\nadding a list of transactions to the mempool is not atomic and, as a result,\nwhen adding a list of transactions, transactions from other processes can be\nadded in between. The mempool implementation handles this correctly, however\nthis required us to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4076"},"redesign")," the parallel model we had to take\nthe lack of atomicity into account."),(0,a.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,a.kt)("p",null,"We finished refactoring the backing store property tests. The second review\nround is ongoing."),(0,a.kt)("h3",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,a.kt)("p",null,"We are working on benchmarking (in terms of time and number of IO operations)\nfetching/looking up data from disk."),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"We worked on the design of a mechanism to prevent a DoS attack on our Genesis\ndesign related to rollbacks. This was arguably the biggest outstanding question."),(0,a.kt)("p",null,"During the discussions around Genesis, we noticed a design boundary that nicely\ndelineates a fundamental component. We almost have a full Haskell prototype of\nit. It will be very nicely self-contained, perhaps even usable in the ultimate\nimplementation!"),(0,a.kt)("h3",{id:"new-vrf-and-kes-crypto-integration"},"New VRF and KES crypto integration"),(0,a.kt)("p",null,"We collaborated with the Ledger team on preparing the ledger state and crypto\ntypes to avoid huge allocation on the epoch boundary when changing aspects of\nthe crypto that will only manifest in headers, not in the ledger states."),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("p",null,"We merged the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4014"},"pull-request")," that adds a support to ",(0,a.kt)("inlineCode",{parentName:"p"},"db-analyser")," for\nbenchmarking ledger operations. This will allow us to identify, debug, and\nprofile potential performance problems. The benchmark focus on the main 5 ledger\noperations that are involved in chain syncing, block forging, and block\nvalidation, namely:"),(0,a.kt)("ol",{start:0},(0,a.kt)("li",{parentName:"ol"},"Forecast."),(0,a.kt)("li",{parentName:"ol"},"Header tick."),(0,a.kt)("li",{parentName:"ol"},"Header application."),(0,a.kt)("li",{parentName:"ol"},"Block tick."),(0,a.kt)("li",{parentName:"ol"},"Block application.")),(0,a.kt)("p",null,"The following figure shows a plot of the benchmarking results for the first 65\nmillion blocks (approximately) of the Cardano chain. The thin yellow lines under\nthe x-axis show the epoch boundaries, whereas the thick yellow lines correspond\nto the era transitions."),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(2666).Z,width:"1600",height:"800"})),(0,a.kt)("p",null,"As we can see in this figure, era and epoch boundaries require more computation\ntime. The ledger team are aware of this problem, and we are working to improve\nthis situation."),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4207"},"drafted a document")," motivating and defining how Consensus (and\npossibly other core teams) will/should manage our package versions. This\npull-request garnered many great discussions from our team members and other\nteams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et\nal. We want to thank you all for your input, and we found this discussion very\nenlightening!"),(0,a.kt)("p",null,"We merged the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4197"},"pull request")," that adds an overview of consensus to\nthe ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/ouroboros-network/"},"top level\ndocumentation")," of\nouroboros-network. This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation."))}c.isMDXComponent=!0},2666:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/2022-12-14-ledger-ops-benchmark-c46be3db45ff5480ed104e0d520711a6.png"}}]); \ No newline at end of file diff --git a/assets/js/752b6ead.8868ca89.js b/assets/js/752b6ead.8868ca89.js new file mode 100644 index 00000000000..6545d3792bc --- /dev/null +++ b/assets/js/752b6ead.8868ca89.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[50165],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=s(n),p=a,h=u["".concat(c,".").concat(p)]||u[p]||m[p]||o;return n?r.createElement(h,i(i({ref:t},d),{},{components:n})):r.createElement(h,i({ref:t},d))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-05-31-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-05-31-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-31-performance-and-tracing.md",source:"@site/blog/2023-05-31-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-05-31T00:00:00.000Z",formattedDate:"May 31, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.055,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-05-31-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-31-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-26-goedel"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build\nconfiguration: As it stands, the ",(0,a.kt)("inlineCode",{parentName:"p"},"ghc-bignum")," package is using the Haskell ",(0,a.kt)("inlineCode",{parentName:"p"},"native-backend")," as a default. We strive\nto benchmark a build with the ",(0,a.kt)("inlineCode",{parentName:"p"},"gmp-backend")," next. "),(0,a.kt)("p",null,"A variant of our ",(0,a.kt)("inlineCode",{parentName:"p"},"forge-stress")," local benchmark has been set up to serve as an early indicator for the resource usage profile\nwe'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way\nshorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great\nsupport when evaluating different compiler versions or RTS flags incrementally."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The hub of the new tracing system ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," is designed with a fixed output behaviour, which is limited to various\nlogging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to\ndirectly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with\njob definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing\nbenchmarking run required us to fine-tune communications with the nomad server. "),(0,a.kt)("p",null,"Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible\nand offers more detailed insight than the previous iteration in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-ops"),". The backend will enable you to formulate\nvery specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7574ff34.785c26ac.js b/assets/js/7574ff34.785c26ac.js new file mode 100644 index 00000000000..436f200b18a --- /dev/null +++ b/assets/js/7574ff34.785c26ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[34891],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),s=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,h=d["".concat(i,".").concat(m)]||d[m]||c[m]||o;return a?r.createElement(h,l(l({ref:t},u),{},{components:a})):r.createElement(h,l({ref:t},u))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[d]="string"==typeof e?e:n,l[1]=p;for(var s=2;s{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-09-01-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-09-01-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-sre.md",source:"@site/blog/2023-09-01-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.075,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-09-01-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-01-network"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-29-node-cli-api"}},i={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Sanchonet-demo",id:"sanchonet-demo",level:3}],u={toc:s},d="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes"),(0,n.kt)("li",{parentName:"ul"},"Work on a new ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs"},"capkgs"),' repository started -- "Content Addressed Packages"',(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output"),(0,n.kt)("li",{parentName:"ul"},"These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do"),(0,n.kt)("li",{parentName:"ul"},"Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers")))),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Content addressed packages -- new repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs"},"capkgs"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/5a0eabe...03e8e42"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Flake devShell module improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/4"},"cardano-parts-pull-4")),(0,n.kt)("li",{parentName:"ul"},"Cardano-world entrypoints migrated to flake parts module: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/5"},"cardano-parts-pull-5")),(0,n.kt)("li",{parentName:"ul"},"Cardano-world jobs migrated to flake parts module: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/6"},"cardano-parts-pull-6")),(0,n.kt)("li",{parentName:"ul"},"Drep delegation fixups: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/7"},"cardano-parts-pull-7")),(0,n.kt)("li",{parentName:"ul"},"Utilize content addressed binaries, WIP: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/8"},"cardano-parts-pull-8")),(0,n.kt)("li",{parentName:"ul"},"Cardano-node module preparation branch, WIP: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/compare/capkgs...node-module"},"cardano-parts-compare"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Availability zone pinning and explorer mods: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf/compare/d3a8644...9f9917c"},"cardano-perf-compare"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Remove performance nodes for migration to cardano-perf: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/306ef6c6dd6c09d9b90b9768f2b84a1d05cded26"},"cardano-world-commit"))),(0,n.kt)("h3",{id:"sanchonet-demo"},"Sanchonet-demo"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet demonstration repository: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo"},"sanchonet-demo"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/76794a21.2d5266e5.js b/assets/js/76794a21.2d5266e5.js new file mode 100644 index 00000000000..0f7d79a44a4 --- /dev/null +++ b/assets/js/76794a21.2d5266e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29071],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),c=i,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||n;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:i,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-02-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-23-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-23-mithril.md",source:"@site/blog/2023-02-23-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-02-23T00:00:00.000Z",formattedDate:"February 23, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.47,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-02-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-24-hydra"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-23-performance-and-tracing"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...r}=e;return(0,i.kt)(m,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team released a new ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2306.0"},(0,i.kt)("inlineCode",{parentName:"a"},"2306.0"))," distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes\u2019 CLI that allows generating and signing an era marker\u2019s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2306.0"},(0,i.kt)("inlineCode",{parentName:"a"},"2306.0"))),(0,i.kt)("li",{parentName:"ul"},"Completed the epic that implements signer versions deployment monitoring ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/718"},"#718"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the implementation an event producer/consumer via channel ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/738"},"#738")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation of a database and its configuration to save the events on the consumer side ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/740"},"#740")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation of events and sending them on the channel on the producer side ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/741"},"#741")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation of the signer registration event ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/742"},"#742")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation a query to extract the node versions stakes distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/743"},"#743")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements eras behavior switch ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/707"},"#707"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the loading of era reader adapters from config in the signer and the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/732"},"#732")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an era cli command in the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/755"},"#755")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of a dynamic matrix of cases in CI end to end tests ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/760"},"#760")))),(0,i.kt)("li",{parentName:"ul"},"Fixed some bugs:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Fixed the unsupported ",(0,i.kt)("inlineCode",{parentName:"li"},"unixepoch()")," function ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/757"},"#757")),(0,i.kt)("li",{parentName:"ul"},"Fixed the problem that prevented some signers from signing on the ",(0,i.kt)("inlineCode",{parentName:"li"},"testing-preview")," network ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/730"},"#730")),(0,i.kt)("li",{parentName:"ul"},"Update SQLite version to ",(0,i.kt)("inlineCode",{parentName:"li"},"3.40")," in aggregator infrastructure ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/765"},"#765"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/769eb34c.4403be81.js b/assets/js/769eb34c.4403be81.js new file mode 100644 index 00000000000..1937365ca2e --- /dev/null +++ b/assets/js/769eb34c.4403be81.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6919],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},c),{},{components:n})):r.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-07-26-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-07-26-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-26-consensus.md",source:"@site/blog/2023-07-26-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-07-26T00:00:00.000Z",formattedDate:"July 26, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.85,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-07-26-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-27-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-21-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis liaising",id:"genesis-liaising",level:3}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"db-sync")," team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now.\nWe also focused on completing tracing support for UTxO-HD in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),".\nCurrently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further. "),(0,a.kt)("p",null,"The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"ChainSync")," client as part of the onboarding efforts for the team that will implement Genesis."),(0,a.kt)("p",null,"The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team."),(0,a.kt)("h3",{id:"genesis-liaising"},"Genesis liaising"),(0,a.kt)("p",null,"Improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"ChainSync")," client:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/222"},"#222"),"."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/233"},"#233"),".")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/76c61a3b.3a82d970.js b/assets/js/76c61a3b.3a82d970.js new file mode 100644 index 00000000000..0d70c0943d1 --- /dev/null +++ b/assets/js/76c61a3b.3a82d970.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91192],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),d=s(r),m=a,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[d]="string"==typeof e?e:a,i[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2022-11-16-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2022-11-16-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-performance-and-tracing.md",source:"@site/blog/2022-11-16-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2022-11-16T00:00:00.000Z",formattedDate:"November 16, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.635,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2022-11-16-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-16-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-11-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"P2P performance investigation is ongoing, in support of the networking team."),(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support."),(0,a.kt)("li",{parentName:"ol"},"Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing."),(0,a.kt)("li",{parentName:"ol"},"On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started."),(0,a.kt)("li",{parentName:"ol"},"We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends."),(0,a.kt)("p",null,"We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing."),(0,a.kt)("p",null,"A number of smaller workbench, data analysis & reporting improvements have been made."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/771f29e6.38c2d771.js b/assets/js/771f29e6.38c2d771.js new file mode 100644 index 00000000000..b6264061deb --- /dev/null +++ b/assets/js/771f29e6.38c2d771.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56674],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),s=p(a),c=n,m=s["".concat(u,".").concat(c)]||s[c]||h[c]||l;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=c;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-03-31-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-03-31-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-ledger.md",source:"@site/blog/2023-03-31-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.97,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-03-31-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-31-hydra"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-03-27-system-test"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Support for the next release",id:"support-for-the-next-release",level:3},{value:"Experiments for DRep stake distribution",id:"experiments-for-drep-stake-distribution",level:3},{value:"Technical debt and bug fixes",id:"technical-debt-and-bug-fixes",level:3},{value:"Documentation changes",id:"documentation-changes",level:3}],d={toc:p},s="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We are still heavily involved in work related to preparing the next release.\nThe other main thing we have worked on is experimentation about how we will\nhandle the DRep stake distribution for CIP-1694 in the conway ledger era.\nLastly, we merged a fix for\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4826"},"node-4826"),"\ninto our main branch (there will be a post-mortem shortly)."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"support-for-the-next-release"},"Support for the next release"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3363"},"pull-3363")," - Fix problems relating to Arbitrary instances used by consensus."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3361"},"pull-3361")," - Remove the alonze genesis from the conway genesis."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3360"},"pull-3360")," - Translate bad pointer addresses to valid ones in conway."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3357"},"pull-3357")," - Fix a bug relating to zero valued ADA in the script context."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3356"},"pull-3356")," - Added needed instances (Arbitrary and Serialization) for conway integration."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3345"},"pull-3345")," - Added helper functions for the CLI."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3342"},"pull-3342")," - Fix a bug with a CLI helper function (having to do with deposit tracking).")),(0,n.kt)("h3",{id:"experiments-for-drep-stake-distribution"},"Experiments for DRep stake distribution"),(0,n.kt)("p",null,"Adding another stake distribution to the ledger state presents some new challenges.\nWe would like to be able to use the current stake distribution at the epoch boundary\nfor DRep voting so that people can always vote themselves in time for any proposal.\nTo this end, we have a prototype of an incremental computation based on the incremental\nlambda calculus, together with tests and benchmarks (which are very promising).\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3344"},"pull-3344"),"."),(0,n.kt)("p",null,"Additionally, more of the ledger state is going to need to be rearranged to accomodate\nthe new incremental computations.\nWe have two draft PRs up for possibles solution.\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3353"},"pull-3353")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3364"},"pull-3364"),"."),(0,n.kt)("h3",{id:"technical-debt-and-bug-fixes"},"Technical debt and bug fixes"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3343"},"pull-3343")," - A fix ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/4826"},"node-4826"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3333"},"pull-3333")," - Moving more code out of the shelley packages. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3347"},"pull-3347")," - Bug fix for the multi-asset generators."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3341"},"pull-3341")," - Removal of code duplication.")),(0,n.kt)("h3",{id:"documentation-changes"},"Documentation changes"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3354"},"pull-3354"),' - Rename "optional datums" with "supplemental datums" in the alonzo spec.'),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3352"},"pull-3352")," - Add a section to the Shelly errata about the individual deposit tracking."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3351"},"pull-3351")," - Further clarify the details regarding the script integrity hash."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3350"},"pull-3350")," - Some cleanup of the Babbage spec.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77215fb3.5fcc484d.js b/assets/js/77215fb3.5fcc484d.js new file mode 100644 index 00000000000..d1666ae2cd6 --- /dev/null +++ b/assets/js/77215fb3.5fcc484d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[13680],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(a),h=n,m=u["".concat(p,".").concat(h)]||u[h]||d[h]||i;return a?r.createElement(m,o(o({ref:t},c),{},{components:a})):r.createElement(m,o({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-10-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-10-21-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-21-hydra.md",source:"@site/blog/2022-10-21-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-10-21T00:00:00.000Z",formattedDate:"October 21, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.97,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-10-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-10-27-crypto"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-19-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],c={toc:s},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team reviewed and addressed several open comments on the\nnew HeadV1 specification, completing a list the of identified gaps between\nspecification and implementation while doing so. In the wake of the recent\ndemonstration of SundaeSwap running their DEX in a Hydra Head, they met with\nthem to capture feature ideas & incorporate their feedback on the roadmap, as\nwell as potential research avenues."),(0,n.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Had the monthly review meeting, a bit earlier than expected: ",(0,n.kt)("a",{parentName:"li",href:"https://input-output.atlassian.net/wiki/spaces/HYDRA/pages/3650813953/Monthly+report+-+October+2022"},"https://input-output.atlassian.net/wiki/spaces/HYDRA/pages/3650813953/Monthly+report+-+October+2022")),(0,n.kt)("li",{parentName:"ul"},"Reviewed and addressed several open comments on HeadV1 specification."),(0,n.kt)("li",{parentName:"ul"},"Completed the list of identified gaps between specification and implementation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Had two meetings with SundaeSwap to incorporate their feedback (on research and on the roadmap)."),(0,n.kt)("li",{parentName:"ul"},"Some small fixes on TUI and our docker images. ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/538"},"#538")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/562"},"#562")),(0,n.kt)("li",{parentName:"ul"},"Met with the internal audit team and clarified scope.")),(0,n.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete the last two items required for a version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.8.0"),"."),(0,n.kt)("li",{parentName:"ul"},"Cut the next release, version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.8.0")),(0,n.kt)("li",{parentName:"ul"},"Get backup/recovery ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/187"},"#187")," done with proper event sourcing (ADR18)"),(0,n.kt)("li",{parentName:"ul"},"Have the CI build macos artifacts")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77550e96.e668c8a1.js b/assets/js/77550e96.e668c8a1.js new file mode 100644 index 00000000000..5d56dfb32b1 --- /dev/null +++ b/assets/js/77550e96.e668c8a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62227],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=u(a),s=r,h=m["".concat(p,".").concat(s)]||m[s]||d[s]||i;return a?n.createElement(h,o(o({ref:t},c),{},{components:a})):n.createElement(h,o({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-08-29-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-08-29-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-29-node-cli-api.md",source:"@site/blog/2023-08-29-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-08-29T00:00:00.000Z",formattedDate:"August 29, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.55,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-08-29-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-01-sre"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-28-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-08-16---2023-08-29"},"2023-08-16 - 2023-08-29"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CLI is making progress towards phases 3 and 4 of SanchoNet."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Ability to create info, no-confidence and new committee governance actions.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Voting as DREP is possible now on the CLI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"API is now using Ledger's PParams and VotingProcedures")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Expose following queries from consensus:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"- GetGovState\n- GetDRepState\n- GetDRepStakeDistr\n- GetCommitteeState\n- GetConstitution\n")))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/179"},"Add goverance info action creation to era based cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/176"},"Add create-no-confidence command to era based cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/175"},"Add create-new-committee command to era based cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/204"},"Enable ",(0,r.kt)("inlineCode",{parentName:"a"},"--drep-script-hash")," option")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/211"},"Remove ",(0,r.kt)("inlineCode",{parentName:"a"},"experimental")," subcommand")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/210"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.17.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/194"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"governance drep id")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/189"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"governance query")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/187"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--verification-key")," option to ",(0,r.kt)("inlineCode",{parentName:"a"},"committee key-hash")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/203"},"Read and write ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingProcedures")," files instead of ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingEntry")," files")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/201"},"Release 8.6.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/195"},"Merge ",(0,r.kt)("inlineCode",{parentName:"a"},"LegacyClientCmdError")," into ",(0,r.kt)("inlineCode",{parentName:"a"},"CmdError")," ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/193"},"Add test for conway governance action create-constitution")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/192"},"Move legacy errors out of legacy command structure modules")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/191"},"Governance ",(0,r.kt)("inlineCode",{parentName:"a"},"drep")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"vote")," command groups")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/188"},"Move command errors from era-based to ",(0,r.kt)("inlineCode",{parentName:"a"},"CmdError")," module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/186"},"Move some error types")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/185"},"Delete unused module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/183"},"Refactor: Use ",(0,r.kt)("inlineCode",{parentName:"a"},"maybeFeatureInEra")," instead of ",(0,r.kt)("inlineCode",{parentName:"a"},"featureInEra")," where possible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/182"},"Remove all uses of ",(0,r.kt)("inlineCode",{parentName:"a"},"toS"),", ",(0,r.kt)("inlineCode",{parentName:"a"},"purer"),", ",(0,r.kt)("inlineCode",{parentName:"a"},"cborError")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"intercalate")," from ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Prelude"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/180"},"Remove example era-based parsers we don't need anymore")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/174"},"Bump CHaP index in preparation for 8.3.0 pre"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/216"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.17.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/214"},"Replace ProtocolParameters usage with ledger's PParams")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/210"},"Use injective type families to improve type inference")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/209"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"TxVotes")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingEntry")," and use ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingProcedures")," instead")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/208"},"New functions ",(0,r.kt)("inlineCode",{parentName:"a"},"emptyVotingProcedures"),", ",(0,r.kt)("inlineCode",{parentName:"a"},"singletonVotingProcedures")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"mergeVotingProcedures"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/207"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"makeStakeAddressAndDRepDelegationCertificate")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/206"},"Expose ledger lenses for governance types")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/205"},"New version cardano-api-8.16.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/204"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"VotingProcedures")," type")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/202"},"Release 8.16.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/200"},"Update createAnchor to use hashAnchorData")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/197"},"Release 8.15.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/196"},"Add consensus governance queries"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/778ef860.762eeabd.js b/assets/js/778ef860.762eeabd.js new file mode 100644 index 00000000000..6cf240fa845 --- /dev/null +++ b/assets/js/778ef860.762eeabd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96838],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=a,g=s["".concat(p,".").concat(d)]||s[d]||u[d]||o;return r?n.createElement(g,l(l({ref:t},m),{},{components:r})):n.createElement(g,l({ref:t},m))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-09-15-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-15-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-goedel.md",source:"@site/blog/2023-09-15-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.44,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-09-15-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-20-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-15-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],m={toc:c},s="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"working on collating and open sourcing performance analysis prototype")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"improvements to Ouroboros Praos specification in Isabelle")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"working on formalising chain sync mini-protocol")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"reviewing an alternatice semantics for DeltaQ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Seminar talk at U. Bergen on algebraic properties of timeliness"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77d69aed.613ab23b.js b/assets/js/77d69aed.613ab23b.js new file mode 100644 index 00000000000..9710c5478c7 --- /dev/null +++ b/assets/js/77d69aed.613ab23b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29399],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=u(n),m=r,h=c["".concat(s,".").concat(m)]||c[m]||d[m]||i;return n?a.createElement(h,o(o({ref:t},p),{},{components:n})):a.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const i={title:"Consensus Team Update",slug:"2023-05-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-31-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-31-consensus.md",source:"@site/blog/2023-05-31-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-05-31T00:00:00.000Z",formattedDate:"May 31, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.825,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-05-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-01-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-31-performance-and-tracing"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Support",id:"support",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/101"},"this issue"),"). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain."),(0,r.kt)("p",null,"On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano."),(0,r.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking ",(0,r.kt)("inlineCode",{parentName:"li"},"SOP")," classes like ",(0,r.kt)("inlineCode",{parentName:"li"},"HPure")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"HAp")," . In short, we implement generalised versions of important classes like ",(0,r.kt)("inlineCode",{parentName:"li"},"Applicative")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"Traversable"),".")),(0,r.kt)("h2",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim-0.1.0.2")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-api-0.1.0.2")," were released, which makes them now compatible with GHC up to ",(0,r.kt)("inlineCode",{parentName:"li"},"9.6"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus-0.7.0.0")," was released for ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node")," ",(0,r.kt)("inlineCode",{parentName:"li"},"8.1"),", including query serialization fixes for backwards compatibility.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77d820b6.ed642bc4.js b/assets/js/77d820b6.ed642bc4.js new file mode 100644 index 00000000000..2557b39ecc0 --- /dev/null +++ b/assets/js/77d820b6.ed642bc4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76413],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>f});var a=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=s(t),m=r,f=p["".concat(c,".").concat(m)]||p[m]||u[m]||i;return t?a.createElement(f,o(o({ref:n},d),{},{components:t})):a.createElement(f,o({ref:n},d))}));function f(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=m;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=t(87462),r=(t(67294),t(3905));const i={title:"Performance & tracing update",slug:"2023-05-03-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-05-03-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-03-performance-and-tracing.md",source:"@site/blog/2023-05-03-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.",date:"2023-05-03T00:00:00.000Z",formattedDate:"May 3, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.76,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-05-03-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-03-consensus"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-05-01-db-sync"}},c={authorsImageUrls:[void 0]},s=[{value:"Dataflow documentation",id:"dataflow-documentation",level:3},{value:"Remove redundant Plutus flake input",id:"remove-redundant-plutus-flake-input",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},p="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(p,(0,a.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: The benchmarks and performance investigations for the new ",(0,r.kt)("inlineCode",{parentName:"li"},"8.0")," release branch are ongoing."),(0,r.kt)("li",{parentName:"ul"},"New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint."),(0,r.kt)("li",{parentName:"ul"},"Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on."),(0,r.kt)("li",{parentName:"ul"},"Infrastructure: The ",(0,r.kt)("inlineCode",{parentName:"li"},"plutus-apps")," flake input for ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node")," has finally been removed."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: A PR implementing placement of benchmarking clusters has been merged.")),(0,r.kt)("h1",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"The performance investigations on the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.0")," release branch have lead to pinpointing and addressing incosistent behaviour. For that,\nwe created yet another local reproduction with the workbench's ",(0,r.kt)("inlineCode",{parentName:"p"},"forge-stress")," benchmark. "),(0,r.kt)("p",null,"Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into ",(0,r.kt)("inlineCode",{parentName:"p"},"8.0")," and\nsubsequent releases. "),(0,r.kt)("p",null,"Additionally, we've refined the ",(0,r.kt)("inlineCode",{parentName:"p"},"trace-bench")," family of profiles that target benchmarking our own new tracing system. "),(0,r.kt)("h1",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally\nintended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant\nconversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system."),(0,r.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,r.kt)("h3",{id:"dataflow-documentation"},"Dataflow documentation"),(0,r.kt)("p",null,"The LogObject CLI ",(0,r.kt)("inlineCode",{parentName:"p"},"locli")," is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate\nfurther development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting. "),(0,r.kt)("h3",{id:"remove-redundant-plutus-flake-input"},"Remove redundant Plutus flake input"),(0,r.kt)("p",null,"This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input,\nwe simplify the dependency graph for ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),", as well as enable immediate feedback when developing Plutus benchmarks."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking.\nThis capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along\nwith various quality-of-life improvements, has been merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77e9cceb.9b232c45.js b/assets/js/77e9cceb.9b232c45.js new file mode 100644 index 00000000000..3bf414183ec --- /dev/null +++ b/assets/js/77e9cceb.9b232c45.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54868],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>y});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=p(n),m=a,y=s["".concat(u,".").concat(m)]||s[m]||d[m]||o;return n?r.createElement(y,l(l({ref:t},c),{},{components:n})):r.createElement(y,l({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-08-17-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-17-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-db-sync.md",source:"@site/blog/2023-08-17-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-08-17T00:00:00.000Z",formattedDate:"August 17, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.41,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-08-17-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-17-crypto"},nextItem:{title:"SECP bindings Security Issue Report",permalink:"/cardano-updates/2023-08-17-secp-issue"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],c={toc:p},s="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(s,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have integrated many new Conway feutures and allow db-sync to sync sanchonet.\nWe also continued testing and improving the new db-sync options."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Conway integration\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1484"},"#1484")),(0,a.kt)("li",{parentName:"ul"},"Support for Sanchonet\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1476"},"#1476")),(0,a.kt)("li",{parentName:"ul"},"Stake distribution is computed earlier\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1484"},"#1484")),(0,a.kt)("li",{parentName:"ul"},"Deposit ledger events are now used. This reduces the db queries and makes syncing faster\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1484"},"#1484")),(0,a.kt)("li",{parentName:"ul"},"Testing new db-sync options\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1466"},"#1466")),(0,a.kt)("li",{parentName:"ul"},"Added support for ghc-9.6\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1479"},"#1479")),(0,a.kt)("li",{parentName:"ul"},"Tech debt: improve exceptions\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1471"},"#1471"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/789f2cca.39f99462.js b/assets/js/789f2cca.39f99462.js new file mode 100644 index 00000000000..7f29e7e99af --- /dev/null +++ b/assets/js/789f2cca.39f99462.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43261],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=u(a),h=n,c=m["".concat(p,".").concat(h)]||m[h]||d[h]||l;return a?r.createElement(c,i(i({ref:t},s),{},{components:a})):r.createElement(c,i({ref:t},s))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=h;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:n,i[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-08-18-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-08-18-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-ledger.md",source:"@site/blog/2023-08-18-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-08-18-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-18-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-18-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway progress",id:"conway-progress",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],s={toc:u},m="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The ledger team made great progress in advancing Conway era forward. In particular, voting\nfor DRep and Stake Pool Operators is now at the state that can be used by downstream\ncomponents. Addition of new ledger state queries makes it possible to verify changes to\nthe governance state, such as placement of votes, submission of governance proposals,\ninspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the\nability to enact all of the governance actions, except for the hard fork initiation."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-progress"},"Conway progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3577"},"pull-3577")," - Move ",(0,n.kt)("inlineCode",{parentName:"li"},"PParams")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"GovState")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3609"},"pull-3609")," - Adjust thresholds for sanchonet"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3604"},"pull-3604")," - README: update CIP-1694 link"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3616"},"pull-3616")," - Switch ",(0,n.kt)("inlineCode",{parentName:"li"},"TreasuryWithdrawals")," to use ",(0,n.kt)("inlineCode",{parentName:"li"},"RewardAcnt")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3599"},"pull-3599")," - Add governance action well-formedness check"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3607"},"pull-3607")," - Rename governance to gov"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3601"},"pull-3601")," - Added ",(0,n.kt)("inlineCode",{parentName:"li"},"DRep")," anchors"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3615"},"pull-3615")," - Add optional previous ",(0,n.kt)("inlineCode",{parentName:"li"},"GovActionId")," in some ",(0,n.kt)("inlineCode",{parentName:"li"},"ProposalProcedures")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3596"},"pull-3596")," - Upgradeable families"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3625"},"pull-3625")," - Change constitution to use ",(0,n.kt)("inlineCode",{parentName:"li"},"Anchor")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3592"},"pull-3592")," - Added pulsing incremental computation of the DRep distribution"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3523"},"pull-3523")," - Treasury donations"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3633"},"pull-3633")," - Prevent state changes on phase2 failure"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3634"},"pull-3634")," - Disable serialization of protocolVersion param update"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3630"},"pull-3630")," - Implemented DRep refreshing"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3640"},"pull-3640")," - Remove crypto parameterization from ",(0,n.kt)("inlineCode",{parentName:"li"},"AnchorData")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3636"},"pull-3636"),' - Implement DRep ratification with an "always passing"; threshold'),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3648"},"pull-3648")," - Governance queries"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3650"},"pull-3650")," - Change environment for ",(0,n.kt)("inlineCode",{parentName:"li"},"ShelleyPOOLREAP")," rule"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3658"},"pull-3658")," - Set ",(0,n.kt)("inlineCode",{parentName:"li"},"DRep")," ratify threshold to 51%"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3628"},"pull-3628")," - ",(0,n.kt)("inlineCode",{parentName:"li"},"DELEG"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"POOL"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"GOVCERT")," conformance with Spec v0.8")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3619"},"pull-3619")," - Disabled a broken test")),(0,n.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3660"},"pull-3660")," - Fix bounds and versions"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3661"},"pull-3661")," - Adjust versions, bounds and CHANGELOGs to account for the latest release")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/78c763b8.c42d19d7.js b/assets/js/78c763b8.c42d19d7.js new file mode 100644 index 00000000000..23e6ec2adc9 --- /dev/null +++ b/assets/js/78c763b8.c42d19d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96944],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,c=o(t,["components","mdxType","originalType","parentName"]),d=u(a),h=r,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||i;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[d]="string"==typeof t?t:r,l[1]=o;for(var u=2;u{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-10-24-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-10-24-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-24-node-cli-api.md",source:"@site/blog/2023-10-24-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-10-24T00:00:00.000Z",formattedDate:"October 24, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.68,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-10-24-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-25-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-20-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},d="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-10-11---2023-10-24"},"2023-10-11 - 2023-10-24"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CARDANO-CLI"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"stake-address-info")," now shows deposits balance."),(0,r.kt)("li",{parentName:"ul"},"Added ",(0,r.kt)("inlineCode",{parentName:"li"},"conway governance action view")," to allow to inspect governance action files before submitting them on a transaction."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"build-raw")," support for ",(0,r.kt)("inlineCode",{parentName:"li"},"--vote-file")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"--proposal-file"))),(0,r.kt)("p",null,"CARDANO-API"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Support DRep extended keys"),(0,r.kt)("li",{parentName:"ul"},"Support Plutus V1 in Conway")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/394"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.28.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/393"},"Simplify ",(0,r.kt)("inlineCode",{parentName:"a"},"toTxOutInAnyEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/390"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.27.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/389"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.26.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/380"},"Check that poll answer index is not negative, to avoid a Prelude.!! error")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/379"},"drep registration-certificate: add a golden test")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/378"},"Disambiguate treasury withdrawal flags")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/375"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"stake-address-info")," query also return deposit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/374"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"conway governance action view"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/372"},"Ch/clearer anchor flags")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/371"},"Command argument types for ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/370"},"Remove eras' constitution-hash")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/368"},"Shelley to Alonzo: add create-genesis-key-delegation-certificate to governance")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/367"},"Enable reading of Conway ",(0,r.kt)("inlineCode",{parentName:"a"},"TxWitness"),"es")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/366"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"governance action create-protocol-parameters-update")," Conway onwards only")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/365"},(0,r.kt)("inlineCode",{parentName:"a"},"transaction build-raw")," support for ",(0,r.kt)("inlineCode",{parentName:"a"},"--vote-file")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"--proposal-file"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/364"},"Command argument types for governance key commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/363"},"Add test of voting using a cc hot key"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/338"},"Add Show instance for FoldBlocksError")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/336"},"Upgrade typed-protocols to 1.1.1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/332"},"Improved validity range handling")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/331"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.28.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/330"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"AlonzoEraOnly"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/329"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyToAlonzoEraToShelleyToBabbageEra")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/327"},"DRep extended key: add CastVerificationKeyRole")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/326"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardadno-api-8.27.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/325"},"Delete unnecessary calls to ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraints"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/324"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardadno-api-8.27.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/323"},"Support Plutus V1 in Conway")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/322"},"Parameterize GovernanceAction on era ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/320"},"Support DRep extended keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/317"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.26.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/314"},"Haddock document the case functions, so that their behavior is easier to understand when calling them")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/313"},"Avoid ",(0,r.kt)("inlineCode",{parentName:"a"},"IsShelleyBasedEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"IsCardanoEra")," where possible")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/312"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"MaryEraOnly")," eon. Disjoint functions"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5515"},"Factor out file creation for SPO"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5504"},"Tracer documentation generation enhacements "))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/78d554ba.66ab6334.js b/assets/js/78d554ba.66ab6334.js new file mode 100644 index 00000000000..acf622b5f84 --- /dev/null +++ b/assets/js/78d554ba.66ab6334.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[61980],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>g});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),d=n,g=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return r?a.createElement(g,l(l({ref:t},s),{},{components:r})):a.createElement(g,l({ref:t},s))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-05-26-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-26-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-goedel.md",source:"@site/blog/2023-05-26-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.39,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-05-26-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-31-performance-and-tracing"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-26-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team has been working on final revisions for the\npre-proceedings versions of two ICE 2023 papers."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Porting Ouroboros Praos formalisation to new application layer.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Preparing pre-proceedings version of two ICE 2023 papers.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/78d8ce1d.84441dbe.js b/assets/js/78d8ce1d.84441dbe.js new file mode 100644 index 00000000000..7e2761ae7a8 --- /dev/null +++ b/assets/js/78d8ce1d.84441dbe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73320],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,h=u["".concat(l,".").concat(d)]||u[d]||m[d]||i;return n?r.createElement(h,o(o({ref:t},p),{},{components:n})):r.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={title:"DB Sync Team Update",slug:"2022-11-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2022-11-01-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-01-db-sync.md",source:"@site/blog/2022-11-01-db-sync.md",title:"DB Sync Team Update",description:"High level summary",date:"2022-11-01T00:00:00.000Z",formattedDate:"November 1, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.86,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB Sync Team Update",slug:"2022-11-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-11-02-system-test"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-28-hydra"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Schema simplifications",id:"schema-simplifications",level:3},{value:"Performance",id:"performance",level:3},{value:"Migrations and resyncing",id:"migrations-and-resyncing",level:3},{value:"Release",id:"release",level:3}],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DBSync team is preparing a release which introduces schema simplifications, removes indexes,\nunique and foreign keys. It also provides a way to fix older values and migrates without the need to\nresync from genesis."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("h3",{id:"schema-simplifications"},"Schema simplifications"),(0,a.kt)("p",null,"Indexes, Unique and Foreign keys are removed in order to speedup syncing\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1295"},"#1295"),"\nThe same pr also introduces a different way to rollback, which doesn't rely on foreign keys and\nindexes."),(0,a.kt)("h3",{id:"performance"},"Performance"),(0,a.kt)("p",null,"The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A\nconservative number of these will be included in the next release and the rest can be found in\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/52/views/7"},"performance view"),"."),(0,a.kt)("h3",{id:"migrations-and-resyncing"},"Migrations and resyncing"),(0,a.kt)("p",null,"The next release will be 13.1.0, it will enable a migration without the need to resync. It will also\nintroduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1294"},"#1294")),(0,a.kt)("h3",{id:"release"},"Release"),(0,a.kt)("p",null,"The release has been mostly cherry-picked from master\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1294"},"#1294")," and its scope can be seen\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/52/views/6"},"release view")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/78df8d65.119ba796.js b/assets/js/78df8d65.119ba796.js new file mode 100644 index 00000000000..315113482ec --- /dev/null +++ b/assets/js/78df8d65.119ba796.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29537],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>d});var a=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function i(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",k={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,r=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(o),c=n,d=m["".concat(p,".").concat(c)]||m[c]||k[c]||r;return o?a.createElement(d,i(i({ref:t},u),{},{components:o})):a.createElement(d,i({ref:t},u))}));function d(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=o.length,i=new Array(r);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:n,i[1]=l;for(var s=2;s{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>k,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var a=o(87462),n=(o(67294),o(3905));const r={title:"Network Team Update",slug:"2023-04-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-28-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-network.md",source:"@site/blog/2023-04-28-network.md",title:"Network Team Update",description:"High level summary",date:"2023-04-28T00:00:00.000Z",formattedDate:"April 28, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.21,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-04-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-28-goedel"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-27-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed log",id:"detailed-log",level:2},{value:"Ouroboros-Network",id:"ouroboros-network",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"Typed Protocols",id:"typed-protocols",level:3}],u={toc:s},m="wrapper";function k(e){let{components:t,...o}=e;return(0,n.kt)(m,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The networking team has released the following packages to ",(0,n.kt)("inlineCode",{parentName:"p"},"Hackage"),":"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/io-classes"},(0,n.kt)("inlineCode",{parentName:"a"},"io-classes")),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/io-classes-mtl"},(0,n.kt)("inlineCode",{parentName:"a"},"io-classes-mtl"))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/io-sim"},(0,n.kt)("inlineCode",{parentName:"a"},"io-sim")),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/strict-stm"},(0,n.kt)("inlineCode",{parentName:"a"},"strict-stm")),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/strict-mvar"},(0,n.kt)("inlineCode",{parentName:"a"},"strict-mvar")))),(0,n.kt)("p",null,"We published an announcement ",(0,n.kt)("a",{parentName:"p",href:"https://engineering.iog.io/2023-04-14-io-sim-annoucement"},"blog post"),". We made progress\nalso on another blog post which will describes the design of the P2P networking\nlayer."),(0,n.kt)("p",null,"After moving ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," to its own repository, we made\n",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," compatible with ",(0,n.kt)("inlineCode",{parentName:"p"},"GHC")," ",(0,n.kt)("inlineCode",{parentName:"p"},"9.4")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"9.6"),"."),(0,n.kt)("p",null,"We made ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-client")," library independent of\n",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-diffusion"),"."),(0,n.kt)("p",null,"We prepared release of network packages for ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node-8.0"),"."),(0,n.kt)("h2",{id:"detailed-log"},"Detailed log"),(0,n.kt)("h3",{id:"ouroboros-network"},"Ouroboros-Network"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Compatibility with ",(0,n.kt)("inlineCode",{parentName:"li"},"io-classes-1.1.0.0"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4281"},"ouroboros-network#4281"),"."),(0,n.kt)("li",{parentName:"ul"},"Compatibility with ",(0,n.kt)("inlineCode",{parentName:"li"},"GHC")," ",(0,n.kt)("inlineCode",{parentName:"li"},"9.4")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"9.6"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4527"},"ouroboros-network#4527"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"cardano-client")," independent of ",(0,n.kt)("inlineCode",{parentName:"li"},"ouroboros-cosnensus-diffusion"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4526"},"ouroboros-network#4526"),"."),(0,n.kt)("li",{parentName:"ul"},"Release new versions of packages for ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node-8.0"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4532"},"ouroboros-network#4532"),"."),(0,n.kt)("li",{parentName:"ul"},"Galois Inc, has been making progress towards merging ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"ouroboros-network#4256"),".")),(0,n.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"io-classes-1.0.0.0"),", and following up releases: ",(0,n.kt)("inlineCode",{parentName:"li"},"1.0.0.1")," (",(0,n.kt)("inlineCode",{parentName:"li"},"ghc-9.6"),"\nsupport), ",(0,n.kt)("inlineCode",{parentName:"li"},"1.1.0.0")," (documentation fix)."),(0,n.kt)("li",{parentName:"ul"},"Fixed timeouts and delays in ",(0,n.kt)("inlineCode",{parentName:"li"},"io-sim")," in a series of PRs: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/81"},"io-sim#81"),",\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/82"},"io-sim#82"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/86"},"io-sim#86"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/87"},"io-sim#87"),"."),(0,n.kt)("li",{parentName:"ul"},"Renamed a module: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/88"},"io-sim#88"),"."),(0,n.kt)("li",{parentName:"ul"},"Fixed a failing ",(0,n.kt)("inlineCode",{parentName:"li"},"registerDelayCancellable")," test: ","[io-sim#80]","."),(0,n.kt)("li",{parentName:"ul"},"Use GitHub merge queue in ",(0,n.kt)("inlineCode",{parentName:"li"},"io-sim")," repository."),(0,n.kt)("li",{parentName:"ul"},"CI: download ",(0,n.kt)("inlineCode",{parentName:"li"},"stylish-haskell"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/83"},"io-sim#83"),".")),(0,n.kt)("h3",{id:"typed-protocols"},"Typed Protocols"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released ",(0,n.kt)("inlineCode",{parentName:"li"},"typed-protocols-0.1.0.4")," which support ",(0,n.kt)("inlineCode",{parentName:"li"},"io-classes-1.1.0.0"),":\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/227"},"typed-protocols#227"),"."),(0,n.kt)("li",{parentName:"ul"},"Use GitHub merge queue in ",(0,n.kt)("inlineCode",{parentName:"li"},"typed-protocols"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/30"},"typed-protocols#30"),"."),(0,n.kt)("li",{parentName:"ul"},"CI: download ",(0,n.kt)("inlineCode",{parentName:"li"},"stylish-haskell"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/29"},"typed-protocols#29"),".")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/79239208.68e37e23.js b/assets/js/79239208.68e37e23.js new file mode 100644 index 00000000000..d82d93c2510 --- /dev/null +++ b/assets/js/79239208.68e37e23.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35748],{61778:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/2","page":2,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra","nextPage":"/cardano-updates/tags/hydra/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/795480a5.e692d8ea.js b/assets/js/795480a5.e692d8ea.js new file mode 100644 index 00000000000..49536899100 --- /dev/null +++ b/assets/js/795480a5.e692d8ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78446],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=u(a),c=r,m=d["".concat(p,".").concat(c)]||d[c]||h[c]||l;return a?n.createElement(m,i(i({ref:t},s),{},{components:a})):n.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-01-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-01-05-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-05-ledger.md",source:"@site/blog/2023-01-05-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-01-05T00:00:00.000Z",formattedDate:"January 5, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:4.44,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-01-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-06-crypto"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-28-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Finishing the deposit tracking",id:"finishing-the-deposit-tracking",level:3},{value:"New Conway era transaction",id:"new-conway-era-transaction",level:3},{value:"Optimizing the TICKF transition",id:"optimizing-the-tickf-transition",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Improved ledger event",id:"improved-ledger-event",level:4},{value:"Improved type saftey",id:"improved-type-saftey",level:4},{value:"Code/Module organization",id:"codemodule-organization",level:4},{value:"Revert pointer address deprecation",id:"revert-pointer-address-deprecation",level:4},{value:"Miscellaneous",id:"miscellaneous",level:4}],s={toc:u},d="wrapper";function h(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The ledger team finished up the remaining work for tracking individual depots,\nbuilt out the new Conway era transaction body (in line with CIP-1694),\ngreatly reduce some problematically large calculations on the epoch boundary,\nand addressed technical debt."),(0,r.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,r.kt)("h3",{id:"finishing-the-deposit-tracking"},"Finishing the deposit tracking"),(0,r.kt)("p",null,"The initial work on the individual deposit tracking project focused only on correctness.\nAs this is a large data structure\n(since its size is linear with respect to the number of registered stake credentials),\nit is very important that we also reduce the memory overhead as much as possible.\nFortunately, we were able to add very little overhead for the deposits by using existing\nefficient data structures. The extra tracking now only incurs one word (8 bytes)\nper registered stake credential."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3195"},"pull-3195")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3202"},"pull-3202")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3217"},"pull-3217"))),(0,r.kt)("h3",{id:"new-conway-era-transaction"},"New Conway era transaction"),(0,r.kt)("p",null,'We implemented the Conway era transaction body, which is in line with CIP-1694.\nNote that the Conway era implements, losing speaking, the parts of CIP-1694 that are not\nrelated to the liquid democracy (the "DReps").\nThe new transaction body adds the new governance actions and votes,\nwhile also deprecating the old governance structures\n(i.e. the old protocol parameter updates and MIR certificates).'),(0,r.kt)("p",null,"We also now have the wire specification (CDDL file) and serialization code in place.\nThe wire specification is still subject to change while we work on the Conway era,\nbut it is now usable and has proper testing support\n(so that, for example, the serialization round-trips, etc)."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3176"},"pull-3176")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3226"},"pull-3226"))),(0,r.kt)("h3",{id:"optimizing-the-tickf-transition"},"Optimizing the ",(0,r.kt)("inlineCode",{parentName:"h3"},"TICKF")," transition"),(0,r.kt)("p",null,"Every since the release of the Shelley era, we have been working to reduce the computational load\nplaced on the node by the ledger at the epoch boundary.\nWhile still not perfect, we believe that we have removed one of the final problematically long\nepoch boundary computations that exacerbate situations like\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4421"},"this"),".\nIn particular, the problem involved the way in which the consensus layer obtains a view of the\nledger for the purposes of checking the leadership schedule in a new epoch.\nWe implemented a stopgap measure which now only incurs a single multi-second cost once per epoch\ninstead of potentially several multi-second costs while the networks waits for the first block\nof a new epoch to be minted."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"An ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/blob/ea48d4815946c4f35239eb41815fe06cd6ffec2e/docs/adr/2022-12-12_007-optimize-ledger-view.md"},"ADR")," about the decision."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3209"},"pull-3209"))),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"We closed the year out with a lot of reduction to the technical debt!"),(0,r.kt)("h4",{id:"improved-ledger-event"},"Improved ledger event"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3212"},"pull-3212")," - The ledger events are not guaranteed to appear in any given order within a block.\nFor this reason, motivated by the use case in db-sync, the ",(0,r.kt)("inlineCode",{parentName:"li"},"TotalDeposits")," event now\nincludes a transaction ID and emits the ",(0,r.kt)("em",{parentName:"li"},"change")," in deposits instead of the value.")),(0,r.kt)("h4",{id:"improved-type-saftey"},"Improved type saftey"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3208"},"pull-3208")," - We replaced ",(0,r.kt)("inlineCode",{parentName:"li"},"NominalDiffTime")," with a newtype wrapper. The problem was that our CBOR\nencoders and decoders were using the wrong level of precision, having to due with with\nthe Shelley genesis file. We removed the potential problem with a newtype wrapper."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3167"},"pull-3167")," - We now use a GADT to ensure consistency of the Plutus language in the types\nfor ",(0,r.kt)("inlineCode",{parentName:"li"},"TransactionScriptFailure")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"PlutusDebug"),".")),(0,r.kt)("h4",{id:"codemodule-organization"},"Code/Module organization"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3175"},"pull-3175")," - The Allegra and Mary eras had an unusual relationship in our codebase,\ndue to the uncertainly of release dates while we were implementing them.\nIn particular, they were coupled in way that is different from the rest of the code base.\nWith hindsight on our side, we split the combined ",(0,r.kt)("inlineCode",{parentName:"li"},"shelley-ma")," Haskell package into two\nseparate ledger era packages, which is now consistent with the rest of the repository\nand module structure."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3184"},"pull-3184")," - We created a core test sub-library, cleaning up a lot of our property test\ngenerator code."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3210"},"pull-3210")," - We moved the ",(0,r.kt)("inlineCode",{parentName:"li"},"KeyPair")," type to the test library. Outside of testing,\nthe ledger does not need to deal with signing keys, and since this is a topic that\ndeserves the utmost care, it is best to make it clear that our use of signing keys\nis only for testing."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3229"},"pull-3229")," - We split the ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardano.Ledger.Alonzo.Data")," module, which is more consistent with the rest\nof the codebase.")),(0,r.kt)("h4",{id:"revert-pointer-address-deprecation"},"Revert pointer address deprecation"),(0,r.kt)("p",null,"Thanks to one of our excellent internal auditors,\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/jmhrpr"},"@jmhrpr"),",\nwe now have a better plan for deprecating pointer addresses.\nThis meant that we had to revert the previous work to deprecate them."),(0,r.kt)("p",null,"See:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3161"},"issue-3161")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3215"},"pull-3215"))),(0,r.kt)("h4",{id:"miscellaneous"},"Miscellaneous"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3205"},"pull-3205")," - We removed deprecated type synonyms."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3218"},"pull-3218")," - We cleaned up the address deserialization."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3223"},"pull-3223")," - We fixed faulty address deserialization tests."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3222"},"pull-3222")," - We switched to a general type family ",(0,r.kt)("inlineCode",{parentName:"li"},"TxOut")," from concrete ones,\nreducing many constraints."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3224"},"pull-3224")," - ",(0,r.kt)("inlineCode",{parentName:"li"},"ShelleyGenesis")," is now parameterized by crypto instead of by era."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3170"},"pull-3170")," - We set the cabal-version to 3.0 in our projects."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3172"},"pull-3172")," - We removed the now useless ",(0,r.kt)("inlineCode",{parentName:"li"},"EncodeMint"),"/",(0,r.kt)("inlineCode",{parentName:"li"},"DecodeMint")," classes."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3225"},"pull-3225")," - We switch from ",(0,r.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/ormolu"},"ormolu")," to\n",(0,r.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/fourmolu"},"fourmolu"),".\nThe reason was to be able to finally have more diff friendly code!")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/79730245.14cda0d8.js b/assets/js/79730245.14cda0d8.js new file mode 100644 index 00000000000..913163249d2 --- /dev/null +++ b/assets/js/79730245.14cda0d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[61596],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(h,i(i({ref:t},c),{},{components:n})):r.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var r=n(87462),o=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-02-17-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-17-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-network.md",source:"@site/blog/2023-02-17-network.md",title:"Network Team Update",description:"High level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.865,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-02-17-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-17-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-10-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"Recently QA found a bug in P2P code, which results in busy loops. We added one\nfix to ",(0,o.kt)("inlineCode",{parentName:"p"},"1.35.6")," release, another one will likely be part of next release. The\nfirst one is already included in ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.3.0.1")," release. These\nbugs could only affect nodes which are out of sync and thus should not impose\nrisk on well maintained nodes on mainnet. We also advertise to deploy at most\none of the relays as a P2P node, which shields from possible consequences."),(0,o.kt)("p",null,"We recently finished design phase of eclipse evasion and we started\nimplementing it (see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?pane=issue&itemId=19819205"},"issue #3886")," for progress)."),(0,o.kt)("p",null,"Galois finished implementing Handshake extension which will allow to query\nnetwork protocol versions (see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"pr #4256"),")."),(0,o.kt)("p",null,"We also recently released a newer set of network packages to be integrated with\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," ",(0,o.kt)("inlineCode",{parentName:"p"},"master")," branch, this includes:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"* monoidal-synchronisation-0.1.0.2\n* cardano-client-0.1.0.2\n* network-mux-0.3.0.0\n* ouroboros-network-api-0.1.0.0\n* ouroboros-network-protocols-0.2.0.0\n* ouroboros-network-testing-0.2.0.1\n* ouroboros-network-mock-0.1.0.0\n* ouroboros-network-framework-0.3.0.0\n* ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included\n in `0.3.0.1`)\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/798d160f.fc29dc61.js b/assets/js/798d160f.fc29dc61.js new file mode 100644 index 00000000000..7b24ef590cb --- /dev/null +++ b/assets/js/798d160f.fc29dc61.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[82358],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),m=a,d=c["".concat(u,".").concat(m)]||c[m]||h[m]||o;return n?r.createElement(d,s(s({ref:t},p),{},{components:n})):r.createElement(d,s({ref:t},p))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-10-18-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-18-consensus.md",source:"@site/blog/2023-10-18-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-10-18T00:00:00.000Z",formattedDate:"October 18, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-20-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-18-mithril"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Support",id:"support",level:3}],p={toc:l},c="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node."),(0,a.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The Plutus workload benchmark for the in-memory backend ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/203#issuecomment-1768560330"},"showed no regressions")," for the metrics of interest, but it does show an increase in resource usage."),(0,a.kt)("li",{parentName:"ul"},"We got additional ad-hoc ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/5495#issuecomment-1768593069"},"measurements")," on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB."),(0,a.kt)("li",{parentName:"ul"},"We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.")),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We produced the first draft for a Survivable Eclipse Duration Model (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/422"},"422"),").")),(0,a.kt)("h3",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/amesgen"},"Esgen")," finished his cycle as release engineer. Node ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.5.0-pre"},"8.5.0")," has been released."),(0,a.kt)("li",{parentName:"ul"},"We resumed work on the subpar handling of block from the future (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4251"},"4251"),")."),(0,a.kt)("li",{parentName:"ul"},"We prepared the integration of ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5502"},"new tracing events")," for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4251"},"issue"),").")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/79d76848.47b0a3f4.js b/assets/js/79d76848.47b0a3f4.js new file mode 100644 index 00000000000..f1fcdde4897 --- /dev/null +++ b/assets/js/79d76848.47b0a3f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75379],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(r),h=a,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||o;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=h;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:a,i[1]=p;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Open-Source Update",slug:"2023-01-13-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/quarterly/2023-01-13-open-source",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-13-open-source.md",source:"@site/quarterly/2023-01-13-open-source.md",title:"Open-Source Update",description:"Open Source Quarterly Update",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"open-source",permalink:"/cardano-updates/quarterly/tags/open-source"}],readingTime:2.215,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Open-Source Update",slug:"2023-01-13-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},prevItem:{title:"Network Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-13-network"},nextItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2022-11-15-consensus"}},l={authorsImageUrls:[void 0]},s=[{value:"Open Source Quarterly Update",id:"open-source-quarterly-update",level:2},{value:"2022-11 - 2023-01",id:"2022-11---2023-01",level:2},{value:"Summary",id:"summary",level:3},{value:"Detailed log",id:"detailed-log",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"open-source-quarterly-update"},"Open Source Quarterly Update"),(0,a.kt)("h2",{id:"2022-11---2023-01"},"2022-11 - 2023-01"),(0,a.kt)("h3",{id:"summary"},"Summary"),(0,a.kt)("p",null,"In the last quarter the open-source initiative delivered a comprehensive report\non the state of our repositories. As part of this work stream we\nidentified the key open-source repositories for the cardano project across all\nthe projects From a list of more than 500 repositories (some of which are\nforks) we identified key repositories which constitute the core of Cardano.\n20 of them were identified as to be transferred to the future MBO which will\ngovern Cardano development. Some where excluded (like ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim"},(0,a.kt)("inlineCode",{parentName:"a"},"io-sim"))," and\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols"},(0,a.kt)("inlineCode",{parentName:"a"},"typed-protocols")),"), to be govern by IOG, since they have a much broader\napplication than Cardano itself, and thus we think their open-source future\nwill be better outside of the Cardano umbrella."),(0,a.kt)("p",null,"Christian Taylor identified a number of ways we can improve our repositories to\nmake them more attractive for open-source contributions by analysing each of\nthem. This includes adding or improving various documentation files, like\n",(0,a.kt)("inlineCode",{parentName:"p"},"CONTRIBUTING")," files, adding code of conduct, improving readme files, issue\n& pull request templates etc. Christian also computed various interesting\nmetrics which gives a very good insight into the development practices: e.g.\naverage merge ratio, average number of reviews, comments and many more! The\npresentation is available ",(0,a.kt)("a",{parentName:"p",href:"https://docs.google.com/presentation/d/127IFEavlrZeeoFrVXFYWzSt0ugOkSL7isxjyM1vmMzQ"},"here"),"."),(0,a.kt)("p",null,"We followed with work on the ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},"Cardano Engineering Handbook"),". We included\na standard code of conduct which is now used by most important projects in the\nCardano space. We included ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),"'s security policy and added\na responsible disclosure policy. We also described how roles and\nresponsibilities should be clarified. This progress was made by\na collaborative effort of the Cardano Core, Plutus and Architecture teams, and\nit wouldn't be possible without Michael Peyton Jones, Arnaud Bailly, Kevin\nHammond, Jared Corduan and Marcin Szamotulski."),(0,a.kt)("p",null,"We also improved the documentation of key repositories, by adding description,\nimproving their ",(0,a.kt)("inlineCode",{parentName:"p"},"README")," file & ",(0,a.kt)("inlineCode",{parentName:"p"},"CONTRIBUTING")," files, adding code of conducts\nfollowing the ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},"Cardano Engineering Handbook"),". This includes improvements to:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network"},(0,a.kt)("inlineCode",{parentName:"a"},"ouroboros-network"))," (both ",(0,a.kt)("inlineCode",{parentName:"li"},"network")," & ",(0,a.kt)("inlineCode",{parentName:"li"},"consensus"),")"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger"},(0,a.kt)("inlineCode",{parentName:"a"},"cardano-ledger"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node"},(0,a.kt)("inlineCode",{parentName:"a"},"cardano-node")))),(0,a.kt)("p",null,"And also"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim"},(0,a.kt)("inlineCode",{parentName:"a"},"io-sim"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols"},(0,a.kt)("inlineCode",{parentName:"a"},"typed-protocols"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-prelude"},(0,a.kt)("inlineCode",{parentName:"a"},"cardano-prelude"))," (work in progress)")),(0,a.kt)("p",null,"The work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan. "),(0,a.kt)("p",null,"In this quarter we also identified a number of projects which can be published to\n",(0,a.kt)("inlineCode",{parentName:"p"},"Hackage")," (Haskell's package repository) or ",(0,a.kt)("inlineCode",{parentName:"p"},"crate")," (Rust package repository).\nThe list contains 21 packages, 2 of which (",(0,a.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/hedgehog-extras"},(0,a.kt)("inlineCode",{parentName:"a"},"hedgehog-extras"))," and\n",(0,a.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/quickcheck-dynamic"},(0,a.kt)("inlineCode",{parentName:"a"},"quickcheck-dynamic")),") are already published on Hackage and another 5 (from\nthe ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim"},(0,a.kt)("inlineCode",{parentName:"a"},"io-sim"))," repository) are close to be published."),(0,a.kt)("h3",{id:"detailed-log"},"Detailed log"),(0,a.kt)("p",null,"The progress of the open-source project is tracked in ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/60/views/1"},"this project"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a263bfa.1c805219.js b/assets/js/7a263bfa.1c805219.js new file mode 100644 index 00000000000..bc8973cb29b --- /dev/null +++ b/assets/js/7a263bfa.1c805219.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98450],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>d});var r=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function s(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var l=r.createContext({}),p=function(e){var t=r.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):s(s({},t),e)),o},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(o),h=n,d=c["".concat(l,".").concat(h)]||c[h]||m[h]||a;return o?r.createElement(d,s(s({ref:t},u),{},{components:o})):r.createElement(d,s({ref:t},u))}));function d(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,s=new Array(a);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:n,s[1]=i;for(var p=2;p{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var r=o(87462),n=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-10-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-10-27-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-network.md",source:"@site/blog/2023-10-27-network.md",title:"Network Team Update",description:"High-level overview of sprint 47",date:"2023-10-27T00:00:00.000Z",formattedDate:"October 27, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.765,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-10-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-27-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-27-sre"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level overview of sprint 47",id:"high-level-overview-of-sprint-47",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"CI / Tests",id:"ci--tests",level:3},{value:"KeepAlive client",id:"keepalive-client",level:3},{value:"Galois",id:"galois",level:3},{value:"Cardano Network Service Assurance (CNSA)",id:"cardano-network-service-assurance-cnsa",level:3},{value:"New CHaP Release",id:"new-chap-release",level:3},{value:"More details",id:"more-details",level:2},{value:"CI / Tests",id:"ci--tests-1",level:3},{value:"Release Process",id:"release-process",level:3}],u={toc:p},c="wrapper";function m(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-47"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+47%22"},"sprint 47")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We continued to review the process of bootstrap peers, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4555"},"ouroboros-network#4555")),(0,n.kt)("h3",{id:"ci--tests"},"CI / Tests"),(0,n.kt)("p",null,"We investigated our CI issues. We found a memory leak in ",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols"),"\nfunction used for testing codecs which triggered out of memory manager (OOM) on\nsome platforms (",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/43"},"typed-protocols#43"),"); we also found a bug in the connection manager which resulted in CI\n",(0,n.kt)("inlineCode",{parentName:"p"},"timeouts")," (see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4696/commits/010d9b2bd76356373d8c139eaedd8aea7ad90680"},"connection-manager-fix"),"). "),(0,n.kt)("h3",{id:"keepalive-client"},"KeepAlive client"),(0,n.kt)("p",null,"We found two small issues with the keep-alive client, which were addressed\nby Karl Knutsson (",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"Cardano Foundation"),"), ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4689"},"ouroboros-network#4689"),"."),(0,n.kt)("h3",{id:"galois"},"Galois"),(0,n.kt)("p",null,"We merged two large PRs prepared by ",(0,n.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois"),":"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4660"},"inspect ",(0,n.kt)("inlineCode",{parentName:"a"},"error")," call sites")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4663"},"implement micro benchmarks for ",(0,n.kt)("inlineCode",{parentName:"a"},"PeerMetrics")))),(0,n.kt)("h3",{id:"cardano-network-service-assurance-cnsa"},"Cardano Network Service Assurance (CNSA)"),(0,n.kt)("p",null,"Galois made the following progress on CNSA:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a simple ","[InfuxDB]"," database backend has been added;"),(0,n.kt)("li",{parentName:"ul"},"the documentation has been updated;"),(0,n.kt)("li",{parentName:"ul"},"internal improvements to the code;"),(0,n.kt)("li",{parentName:"ul"},'progress on a new "CSNA analysis" that provides, for each sampler node, the\nblock download throughput in bytes over time.')),(0,n.kt)("h3",{id:"new-chap-release"},"New CHaP Release"),(0,n.kt)("p",null,"We cut a new release of ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-netowrk")," packages to ",(0,n.kt)("inlineCode",{parentName:"p"},"CHaP"),": ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/547"},"chap#547")),(0,n.kt)("h2",{id:"more-details"},"More details"),(0,n.kt)("h3",{id:"ci--tests-1"},"CI / Tests"),(0,n.kt)("p",null,"We improved the memory footprint of some of our tests by analysing a stream of\n",(0,n.kt)("inlineCode",{parentName:"p"},"IOSim")," traces without retaining them, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4696"},"ouroboros-network#4696")),(0,n.kt)("p",null,"As a safety measure, we introduced an upper bound for heap memory used by test\nartefacts in our ",(0,n.kt)("inlineCode",{parentName:"p"},"nix")," tests. We use ",(0,n.kt)("inlineCode",{parentName:"p"},"200MB")," limit for all tests except for\n",(0,n.kt)("inlineCode",{parentName:"p"},"network-mux")," tests which use ",(0,n.kt)("inlineCode",{parentName:"p"},"350MB")," limit, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4702"},"ouroboros-network#4702"),"."),(0,n.kt)("p",null,"We refactored one of our tests to use ephemeral ports thus allowing it to\nrun concurrently, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4702"},"ouroboros-network#4702"),"."),(0,n.kt)("p",null,"We merged ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4623"},"ouroboros-network#4623")," which fixes a bunch of test failures."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4694"},"inbound-governor: connection leak")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4607"},"connection-manager: assertion failure")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4605"},"not released connection"))),(0,n.kt)("p",null,"All of them were due to a bug in test logic rather than a bug in production\ncode."),(0,n.kt)("h3",{id:"release-process"},"Release Process"),(0,n.kt)("p",null,"We updated our release process & associated scripts, see\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4705"},"ouroboros-network#4705"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a4b421f.f75b7a16.js b/assets/js/7a4b421f.f75b7a16.js new file mode 100644 index 00000000000..7c4bf74394c --- /dev/null +++ b/assets/js/7a4b421f.f75b7a16.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67452],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>h});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},u=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(t),u=a,h=p["".concat(s,".").concat(u)]||p[u]||m[u]||i;return t?r.createElement(h,o(o({ref:n},d),{},{components:t})):r.createElement(h,o({ref:n},d))}));function h(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=u;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[p]="string"==typeof e?e:a,o[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(87462),a=(t(67294),t(3905));const i={title:"Performance & tracing update",slug:"2023-04-19-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-04-19-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-19-performance-and-tracing.md",source:"@site/blog/2023-04-19-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.",date:"2023-04-19T00:00:00.000Z",formattedDate:"April 19, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.575,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-04-19-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-19-consensus"},nextItem:{title:"Incident Report",permalink:"/cardano-updates/2023-04-17-ledger"}},s={authorsImageUrls:[void 0]},c=[{value:"Detailed manifest",id:"detailed-manifest",level:3},{value:"GHC profiling inside workbench",id:"ghc-profiling-inside-workbench",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:c},p="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We performed a series of benchmarks aimed at the new ",(0,a.kt)("inlineCode",{parentName:"li"},"8.0")," release branch and built a timeline from the ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35")," releases to that branch."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.")),(0,a.kt)("h1",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"We have performed various cluster runs targeting the ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0")," release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile ",(0,a.kt)("inlineCode",{parentName:"p"},"epoch-transition")," for local reproduction of what we observed on the benchmarking cluster. "),(0,a.kt)("p",null,"Furthermore, we bridged the gap between the run data from the ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.x")," releases to the the new ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0.x")," release branch. This included walking the\n",(0,a.kt)("inlineCode",{parentName:"p"},"master")," branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial\nin locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of\nbenchmarks."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still\nongoing. "),(0,a.kt)("p",null,"In coordination with Galois, who are developing a system assurance service by observing a number of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),"s, we're working with the implementation\nof data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational\nburden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," could be extended with a richer\nfeature set to that end."),(0,a.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,a.kt)("h3",{id:"detailed-manifest"},"Detailed manifest"),(0,a.kt)("p",null,"A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with.\nThese dependencies come from different package sources, have different versioning policies, and an identical package version might provide different\nperformance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated\nby making all component bumps visible and accessible."),(0,a.kt)("h3",{id:"ghc-profiling-inside-workbench"},"GHC profiling inside workbench"),(0,a.kt)("p",null,"The workbench has been equipped with a new ",(0,a.kt)("inlineCode",{parentName:"p"},"-profnix")," profile flavour. This enforces a ",(0,a.kt)("inlineCode",{parentName:"p"},"-fprof-auto")," build for all node-related packages. The type of\nprofiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already\nbeen merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances.\nThis results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a6174e7.93ed69fb.js b/assets/js/7a6174e7.93ed69fb.js new file mode 100644 index 00000000000..39679187798 --- /dev/null +++ b/assets/js/7a6174e7.93ed69fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[44377],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),m=n,c=h["".concat(s,".").concat(m)]||h[m]||d[m]||a;return r?i.createElement(c,o(o({ref:t},u),{},{components:r})):i.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-08-28-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-08-28-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-28-mithril.md",source:"@site/blog/2023-08-28-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-08-28T00:00:00.000Z",formattedDate:"August 28, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-08-28-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-29-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-25-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of ",(0,n.kt)("inlineCode",{parentName:"p"},"zstandard")," compression of the snapshot archive, and streaming its download and decompression in the client."),(0,n.kt)("p",null,"Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer. "),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Create explorer page with registered signers")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1097"},"#1097")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Simplify logs on the Signer/Aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1106"},"#1106")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Refactor (de)serialization of crypto entities")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/668"},"#668")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Mithril client last snapshot download")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1078"},"#1078")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Use the '/signers/registered' route to verify if a signer is registered")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1152"},"#1152")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Provide progress information with '--json' option in Client")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1095"},"#1095")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Use 'zstandard' compression for snapshot archives")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/876"},"#876")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Make client download and extract the archive simultaneously")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1115"},"#1115"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a7e39bb.20054c14.js b/assets/js/7a7e39bb.20054c14.js new file mode 100644 index 00000000000..1e244447fdc --- /dev/null +++ b/assets/js/7a7e39bb.20054c14.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[61660],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),d=i,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return r?a.createElement(c,o(o({ref:t},u),{},{components:r})):a.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:i,o[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-05-17-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-17-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-mithril.md",source:"@site/blog/2023-05-17-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-05-17T00:00:00.000Z",formattedDate:"May 17, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.555,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-05-17-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-17-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-17-performance-and-tracing"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(h,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team released a new ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2318.0"},(0,i.kt)("inlineCode",{parentName:"a"},"2318.0"))," distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types."),(0,i.kt)("p",null,"Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node ",(0,i.kt)("inlineCode",{parentName:"p"},"8.0.0")," (along with the backward compatibility for previous ",(0,i.kt)("inlineCode",{parentName:"p"},"1.35.x")," versions)."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implements generic signing/verification of entity services ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the handling of multiple types of signed entity in the aggregator runtime ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/907"},"#907")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the signer runtime to use the signable builder service ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/854"},"#854")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the aggregator runtime to use the artifact builder service ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/869"},"#869")),(0,i.kt)("li",{parentName:"ul"},"Completed the appending of the next AVK to all protocol messages ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/888"},"#888")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/893"},"#893")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the explorer to handle new artifact routes of the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/927"},"#927")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements the computation of the stake distribution for ",(0,i.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/880"},"#880"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of the new stake distribution computation in the chain observer ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/919"},"#919")),(0,i.kt)("li",{parentName:"ul"},"Worked on upgrading the Cardano node to ",(0,i.kt)("inlineCode",{parentName:"li"},"8.0.0")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/920"},"#920"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7aaa65e3.2ad8effb.js b/assets/js/7aaa65e3.2ad8effb.js new file mode 100644 index 00000000000..5a4f20c0fb9 --- /dev/null +++ b/assets/js/7aaa65e3.2ad8effb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98882],{2632:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/network/page/4","page":4,"postsPerPage":5,"totalPages":5,"totalCount":24,"previousPage":"/cardano-updates/tags/network/page/3","nextPage":"/cardano-updates/tags/network/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/7b73b4cd.d7498fa0.js b/assets/js/7b73b4cd.d7498fa0.js new file mode 100644 index 00000000000..c6a70836a31 --- /dev/null +++ b/assets/js/7b73b4cd.d7498fa0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60881],{25184:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/19","page":19,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/18","nextPage":"/cardano-updates/page/20","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/7c359f4d.0c522b73.js b/assets/js/7c359f4d.0c522b73.js new file mode 100644 index 00000000000..941f1b81a48 --- /dev/null +++ b/assets/js/7c359f4d.0c522b73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[77696],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=p(r),c=a,y=u["".concat(i,".").concat(c)]||u[c]||d[c]||s;return r?n.createElement(y,o(o({ref:t},m),{},{components:r})):n.createElement(y,o({ref:t},m))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=c;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const s={title:"System Test Team Update",slug:"2023-01-13-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-13-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-system-test.md",source:"@site/blog/2023-01-13-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.91,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"System Test Team Update",slug:"2023-01-13-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2023-01-13-release"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-12-mithril"}},i={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"Node:",id:"node",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],m={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the ",(0,a.kt)("em",{parentName:"p"},"P2P Single\nRelay")," functionality."),(0,a.kt)("p",null,"We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"extended the ",(0,a.kt)("em",{parentName:"li"},"cardano-node-tests")," with the ability for anybody to fork the repo and ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/readme.html"},"run all our System Tests on GitHub Actions")),(0,a.kt)("li",{parentName:"ul"},"added 2 new nightly pipelines - nightly-mixed and nightly-p2p - ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/nightly_system_tests.html"},"details here")),(0,a.kt)("li",{parentName:"ul"},"some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"}," === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) ===\n to\n === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===")),(0,a.kt)("h3",{id:"node"},"Node:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled"),(0,a.kt)("li",{parentName:"ul"},"started the preparations for testing the next tag - ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.5_rc1/src_docs/source/test_results/node/tag_1_35_5_rc1.rst"},"details here"))),(0,a.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"some improvements on db-sync sync tests")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7c815b5e.a5522061.js b/assets/js/7c815b5e.a5522061.js new file mode 100644 index 00000000000..f1b9480262b --- /dev/null +++ b/assets/js/7c815b5e.a5522061.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59318],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(n),h=a,d=c["".concat(l,".").concat(h)]||c[h]||m[h]||o;return n?r.createElement(d,i(i({ref:t},p),{},{components:n})):r.createElement(d,i({ref:t},p))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-10-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-10-05-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-05-consensus.md",source:"@site/blog/2022-10-05-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2022-10-05T00:00:00.000Z",formattedDate:"October 5, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.825,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-10-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-10-14-ledger"},nextItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-10-04-db-sync"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Executive summary",id:"executive-summary",level:2},{value:"Additional information",id:"additional-information",level:2},{value:"Genesis",id:"genesis",level:3}],p={toc:u},c="wrapper";function m(e){let{components:t,...o}=e;return(0,a.kt)(c,(0,r.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks, the consensus team worked on improving the\nperformance of the ChainSync jumping logic, which is needed for Genesis. We also\nrewrote the implementation of the mempool in the UTxO HD prototype which solved\nthe issues that prevented us from running system level benchmarks. Also on the\nUTxO HD front, we have an improved implementation of the sequence-of-differences\n(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for\nthe UTxO HD feature."),(0,a.kt)("h2",{id:"executive-summary"},"Executive summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"With the latest implementation of ChainSync jumping we are closer to the\nbaseline performance. In particular, the prototype seems to benefit from the\nextra concurrency provided by additional capabilities."),(0,a.kt)("li",{parentName:"ul"},"We rewrote the implementation of the mempool in the UTxO HD prototype. This\nrewrite was required due to performance problems we observed when running the\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/blob/master/Makefile#L51"},"workbench"),".\nThese performance problems prevented us from running system level benchmarks.\nThe rewrite solved these issues. After the ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4049"},"UTxO-HD: mempool\nrewrite")," PR is\nmerged, we will contact the Benchmarking team so that they run the system\nlevel benchmarks."),(0,a.kt)("li",{parentName:"ul"},"The implementation of sequences of differences based on anti-diffs was\nintegrated into the UTxO HD prototype. It is pending\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4036"},"review")," and\nwe also need to run replay and syncing benchmarks to confirm that this will\ndeliver a performance improvement, as observed in our micro-benchmarks."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3944"},"The UTxO HD prototype\ninspection"),"\nresulted in a ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4045"},"list of\ntests"),"\nneeded for consensus to consider the UTxO HD prototype as fully tested.")),(0,a.kt)("h2",{id:"additional-information"},"Additional information"),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"Benchmarking setup: 50MBit/s, 50ms latency"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Red: baseline"),(0,a.kt)("li",{parentName:"ul"},"Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.")),(0,a.kt)("p",null,"As ChainSync Jumping involves many concurrent network operations at every jump,\nwe tried to run the node with 6 instead of the default 2 capabilties."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Orange: baseline with 6 capabilities"),(0,a.kt)("li",{parentName:"ul"},"Blue: CSJ prototype with 6 capabilities")),(0,a.kt)("p",null,"This diagram shows the respective syncing progress, starting at Genesis and\ncontinuing a good part into Shelley (with the dashed line indicating the\nByron-to-Shelley transition)."),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(36276).Z,width:"654",height:"459"})),(0,a.kt)("p",null,"Further work includes whether we can tune the prototype to better handle few\ncapabilities, or to adapt the default number of capabilities (potentially just\nwhile syncing)."))}m.isMDXComponent=!0},36276:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/happy-path-csj-prototype-bench-1-2c33ba45f44a086415e703fe8f0f7ad1.svg"}}]); \ No newline at end of file diff --git a/assets/js/7c895c96.960a5ba4.js b/assets/js/7c895c96.960a5ba4.js new file mode 100644 index 00000000000..f03c4f346fe --- /dev/null +++ b/assets/js/7c895c96.960a5ba4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83036],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(n),m=a,d=c["".concat(l,".").concat(m)]||c[m]||h[m]||s;return n?r.createElement(d,o(o({ref:t},p),{},{components:n})):r.createElement(d,o({ref:t},p))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,o=new Array(s);o[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:a,o[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const s={title:"Consensus Team Update",slug:"2023-09-06-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-09-06-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-06-consensus.md",source:"@site/blog/2023-09-06-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-09-06T00:00:00.000Z",formattedDate:"September 6, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.22,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-09-06-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-07-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-01-goedel"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Tech debt",id:"tech-debt",level:2},{value:"Support",id:"support",level:2}],p={toc:u},c="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation.\nOn the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers.\nThe Consensus release engineer finished his rotation: version ",(0,a.kt)("inlineCode",{parentName:"p"},"8.3.0-pre")," of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," is releasing 2023 September 5."),(0,a.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We ran the first successful system-level benchmarks for UTxO-HD (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/203"},"#203"),") using the ",(0,a.kt)("em",{parentName:"li"},"in-memory")," backend.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot."),(0,a.kt)("li",{parentName:"ul"},"After the mempool regression is fixed the benchmarks need to be ran again."),(0,a.kt)("li",{parentName:"ul"},"System-level UTxO-HD benchmarks with the LMDB are still pending."))),(0,a.kt)("li",{parentName:"ul"},"UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"#344"),")."),(0,a.kt)("li",{parentName:"ul"},"We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in ",(0,a.kt)("inlineCode",{parentName:"li"},"GetUTxOByAddress")," (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/205#issuecomment-1706878418"},"this comment"),"). Preliminary results are promising."),(0,a.kt)("li",{parentName:"ul"},"Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"#344"),"), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.")),(0,a.kt)("h2",{id:"tech-debt"},"Tech debt"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We added tests that Consensus emits valid CBOR (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3099"},"#3099"),"). This helped us detect a couple of serialization bugs. The tests still need to be merged into the ",(0,a.kt)("inlineCode",{parentName:"li"},"main")," branch (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/323"},"#323"),").")),(0,a.kt)("h2",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Nick Frisby")," finished his release engineer rotation; ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node 8.3.0-pre")," is releasing 2023 September 5."),(0,a.kt)("li",{parentName:"ul"},"We helped to investigate a protocol version bug in Sanchonet (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3491"},"#3491"),")."),(0,a.kt)("li",{parentName:"ul"},"We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/91"},"#91"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7d4ab4f9.0ec0db41.js b/assets/js/7d4ab4f9.0ec0db41.js new file mode 100644 index 00000000000..c31150a96ce --- /dev/null +++ b/assets/js/7d4ab4f9.0ec0db41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54007],{90958:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/9","page":9,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/8","nextPage":"/cardano-updates/page/10","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/7d6aa09c.fba7f48c.js b/assets/js/7d6aa09c.fba7f48c.js new file mode 100644 index 00000000000..1ced72a1491 --- /dev/null +++ b/assets/js/7d6aa09c.fba7f48c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18058],{18069:a=>{a.exports=JSON.parse('{"label":"goedel","permalink":"/cardano-updates/tags/goedel","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/7de7ce98.caa95da2.js b/assets/js/7de7ce98.caa95da2.js new file mode 100644 index 00000000000..a424bcc06cf --- /dev/null +++ b/assets/js/7de7ce98.caa95da2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[9828],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>h});var a=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=c(t),d=r,h=u["".concat(s,".").concat(d)]||u[d]||p[d]||i;return t?a.createElement(h,o(o({ref:n},m),{},{components:t})):a.createElement(h,o({ref:n},m))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:r,o[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=t(87462),r=(t(67294),t(3905));const i={title:"Performance & Tracing Q3 2023 Update",slug:"2023-Q3-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/quarterly/2023-Q3-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q3-performance-and-tracing.md",source:"@site/quarterly/2023-Q3-performance-and-tracing.md",title:"Performance & Tracing Q3 2023 Update",description:"2023-07 - 2023-09",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/quarterly/tags/performance-tracing"}],readingTime:3.27,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & Tracing Q3 2023 Update",slug:"2023-Q3-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"SRE Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-sre"},nextItem:{title:"SRE Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-sre"}},s={authorsImageUrls:[void 0]},c=[{value:"2023-07 - 2023-09",id:"2023-07---2023-09",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Release benchmarking",id:"release-benchmarking",level:4},{value:"UTxO-HD benchmarks",id:"utxo-hd-benchmarks",level:4},{value:"P2P benchmarks",id:"p2p-benchmarks",level:4},{value:"New nomad cluster",id:"new-nomad-cluster",level:4},{value:"New tracing system",id:"new-tracing-system",level:4},{value:"GHC9 performance",id:"ghc9-performance",level:4},{value:"Consensus QTAs",id:"consensus-qtas",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"Benchmarking:",id:"benchmarking",level:4},{value:"Performance",id:"performance",level:4},{value:"New tracing system",id:"new-tracing-system-1",level:4},{value:"UTxO-HD monitoring",id:"utxo-hd-monitoring",level:4},{value:"Nomad backend",id:"nomad-backend",level:4},{value:"Workbench",id:"workbench",level:4},{value:"Consensus component QTAs (co-development)",id:"consensus-component-qtas-co-development",level:4}],m={toc:c},u="wrapper";function p(e){let{components:n,...t}=e;return(0,r.kt)(u,(0,a.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-07---2023-09"},"2023-07 - 2023-09"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Release benchmarking"),(0,r.kt)("li",{parentName:"ul"},"Developing and running UTxO-HD benchmarks - in-memory flavour"),(0,r.kt)("li",{parentName:"ul"},"P2P benchmarks, facilitating rollout"),(0,r.kt)("li",{parentName:"ul"},"Production-readiness of the new Nomad cluster has been reached"),(0,r.kt)("li",{parentName:"ul"},"Optimization of and introspection capability for the new tracing system"),(0,r.kt)("li",{parentName:"ul"},"GHC9 performance investigation (and possible remedy)"),(0,r.kt)("li",{parentName:"ul"},"Conensus QTAs: first real-world application of prototype")),(0,r.kt)("h4",{id:"release-benchmarking"},"Release benchmarking"),(0,r.kt)("p",null,"Ongoing release benchmarking is a crucial safeguard to ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),"'s release cycle from a performance perspective. We've performed and analyzed benchmarks for node versions ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.x")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"8.5")," throughout Q3."),(0,r.kt)("h4",{id:"utxo-hd-benchmarks"},"UTxO-HD benchmarks"),(0,r.kt)("p",null,"Targeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery."),(0,r.kt)("h4",{id:"p2p-benchmarks"},"P2P benchmarks"),(0,r.kt)("p",null,"In Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature."),(0,r.kt)("h4",{id:"new-nomad-cluster"},"New nomad cluster"),(0,r.kt)("p",null,"The new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received\nvarious rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest\nof our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it\nready for production use."),(0,r.kt)("h4",{id:"new-tracing-system"},"New tracing system"),(0,r.kt)("p",null,"Our new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that\nit is roughly on par with the legacy system while offering a richer feature set and greater flexibility. "),(0,r.kt)("p",null,"Additionally, in Q3 we equipped the system with an introspection capability. This is now used for generating\nend user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system."),(0,r.kt)("h4",{id:"ghc9-performance"},"GHC9 performance"),(0,r.kt)("p",null,"In Q3, a joint investigation with DevX into GHC9's behaviour revealed where and how GHC9 misses opportunities for\noptimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable\nthose optimizations - which is still being validated."),(0,r.kt)("h4",{id:"consensus-qtas"},"Consensus QTAs"),(0,r.kt)("p",null,"In collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations'\nperformance characteristics. It's now applicable, and being applied, to a real-world task - namely\ngathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds."),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"benchmarking"},"Benchmarking:"),(0,r.kt)("p",null,"In Q4, the focus will be on:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"facilitating the next mainnet release"),(0,r.kt)("li",{parentName:"ul"},"benchmarking runs in the Conway era"),(0,r.kt)("li",{parentName:"ul"},"developing benchmarks / workloads for Conway-exclusive actions"),(0,r.kt)("li",{parentName:"ul"},"implementing a specialized benchmark setup for the UTxO-HD on-disk variant"),(0,r.kt)("li",{parentName:"ul"},"developing new Plutus benchmarks to safeguard Plutus V3"),(0,r.kt)("li",{parentName:"ul"},"benchmarks regarding the rollout of P2P")),(0,r.kt)("h4",{id:"performance"},"Performance"),(0,r.kt)("p",null,"For certain blocking performance issues we've located the cause, or even found a solution in a cross-team effort. In Q4 we'll advance that work to ensure the ongoing\nrelease cycle for mainnet, as well as make GHC9 become a viable release platform."),(0,r.kt)("h4",{id:"new-tracing-system-1"},"New tracing system"),(0,r.kt)("p",null,"For the new tracing system, we'll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support."),(0,r.kt)("h4",{id:"utxo-hd-monitoring"},"UTxO-HD monitoring"),(0,r.kt)("p",null,"We'll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way."),(0,r.kt)("h4",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"From Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad."),(0,r.kt)("h4",{id:"workbench"},"Workbench"),(0,r.kt)("p",null,"We will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),"."),(0,r.kt)("h4",{id:"consensus-component-qtas-co-development"},"Consensus component QTAs (co-development)"),(0,r.kt)("p",null,"In Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7de83161.6e30b750.js b/assets/js/7de83161.6e30b750.js new file mode 100644 index 00000000000..53b83300804 --- /dev/null +++ b/assets/js/7de83161.6e30b750.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7968],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),h=a,m=p["".concat(l,".").concat(h)]||p[h]||d[h]||o;return n?r.createElement(m,s(s({ref:t},u),{},{components:n})):r.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-11-15-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-15-consensus.md",source:"@site/blog/2023-11-15-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-11-15T00:00:00.000Z",formattedDate:"November 15, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.34,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-11-16-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-15-mithril"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"Over the last two weeks, we managed to run a UTxO-HD capable node in ",(0,a.kt)("em",{parentName:"p"},"legacy mode"),", which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does).\nThis ",(0,a.kt)("em",{parentName:"p"},"legacy mode")," could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not.\nHowever, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter.\nOn the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node.\nTherefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend."),(0,a.kt)("p",null,"On the Genesis front, we reviewed the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/434"},"peer simulator")," for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team."),(0,a.kt)("p",null,"We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos."),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/jasagredo"},"Javier Sagredo")," continues his cycle as release engineer, and he is working on version 8.7 of Cardano node."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7e644b1f.ef2c8f6f.js b/assets/js/7e644b1f.ef2c8f6f.js new file mode 100644 index 00000000000..8a5d94f0962 --- /dev/null +++ b/assets/js/7e644b1f.ef2c8f6f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60375],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},h=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,h=i(e,["components","mdxType","originalType","parentName"]),u=p(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||d[c]||o;return a?r.createElement(m,l(l({ref:t},h),{},{components:a})):r.createElement(m,l({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=c;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:n,l[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-04-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-04-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-hydra.md",source:"@site/blog/2023-08-04-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.06,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-04-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-04-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-04-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team achieved notable progress in various aspects of the\nproject. The team updated the use case section for auctions on the ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/unstable/use-cases/"},"/unstable"),"\nbranch of the website, improving the understanding of Hydra","\u2019","s applicability."),(0,n.kt)("p",null,"From the development side, the team successfully completed event-sourced\npersistence, a key enhancement in the project","\u2019","s architecture which improves\noff-chain transaction processing performance. They also added a\n","\u201c","submit-transaction","\u201d"," endpoint to the API."),(0,n.kt)("p",null,"In addition to project-related progress, the team actively engaged in community\nreviews for several catalyst proposals related to Hydra and Mithril,\ncontributing to the wider Cardano ecosystem."),(0,n.kt)("p",null,"Finally, the full report for the month of July was also published ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2023-07"},"here"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published the ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-07"},"monthly report for July")),(0,n.kt)("li",{parentName:"ul"},"Updated the use case section for auctions (published on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/use-cases/"},"/unstable")," branch)"),(0,n.kt)("li",{parentName:"ul"},"Completed event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/913"},"#913")),(0,n.kt)("li",{parentName:"ul"},"Added a ","\u201c","submit-transaction","\u201d"," endpoint to the API ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/966"},"#966")),(0,n.kt)("li",{parentName:"ul"},"Community reviews for several catalyst proposals related to Hydra and Mithril"),(0,n.kt)("li",{parentName:"ul"},"Created a network testing tool (hydra-net) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1006"},"#1006"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update hydra-node to work with cardano-node version 8.x"),(0,n.kt)("li",{parentName:"ul"},"Remove the internal commit functionality"),(0,n.kt)("li",{parentName:"ul"},"Release version 0.12.0"),(0,n.kt)("li",{parentName:"ul"},"Update & streamline tutorial to work with latest version of hydra-node")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7e87972d.24662f86.js b/assets/js/7e87972d.24662f86.js new file mode 100644 index 00000000000..d37cd307787 --- /dev/null +++ b/assets/js/7e87972d.24662f86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2432],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),d=a,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2022-11-30-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-30-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-performance-and-tracing.md",source:"@site/blog/2022-11-30-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2022-11-30T00:00:00.000Z",formattedDate:"November 30, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.95,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2022-11-30-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-30-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-28-network"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release."),(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them.\nThe idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time."),(0,a.kt)("p",null,"To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation."),(0,a.kt)("p",null,"In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model."),(0,a.kt)("p",null,"The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged.\nWe are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration."),(0,a.kt)("p",null,"We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability."),(0,a.kt)("p",null,"We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP."),(0,a.kt)("p",null,"As usual, a number of smaller workbench, data analysis & reporting improvements have been made."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7e8e081f.455c9b12.js b/assets/js/7e8e081f.455c9b12.js new file mode 100644 index 00000000000..e2ad2fa5bdc --- /dev/null +++ b/assets/js/7e8e081f.455c9b12.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49238],{37418:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/network/page/5","page":5,"postsPerPage":5,"totalPages":5,"totalCount":24,"previousPage":"/cardano-updates/tags/network/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/7fa9de70.cff3c34e.js b/assets/js/7fa9de70.cff3c34e.js new file mode 100644 index 00000000000..5912e2cc76e --- /dev/null +++ b/assets/js/7fa9de70.cff3c34e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[38938],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(s,".").concat(c)]||d[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:n,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-11-17-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-17-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-17-hydra.md",source:"@site/blog/2023-11-17-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-11-17T00:00:00.000Z",formattedDate:"November 17, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.135,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-11-17-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Initial CIP 1694 Security Analysis and Responses",permalink:"/cardano-updates/2023-11-20-cip1694"},nextItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-11-17-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team made several impactful updates. They addressed\nmisleading errors regarding collect com transactions, resolved a security\nadvisory (CVE-2023-42806), and simplified the Hydra Head protocol by using\ninline datums. The team also tackled minor inconsistencies in specifications and\nimplementation, documented reasons for potentially dropped close transactions by\nthe cardano-node, and collaborated with SundaeLabs on an offline mode for\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node"),". Additionally, they engaged in discussions with researchers about\nincremental de-/commits."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Removed misleading errors about collect com transactions ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/839"},"#839")),(0,n.kt)("li",{parentName:"ul"},"Addressed security advisory ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq"},"CVE-2023-42806")," in PR ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1161"},"#1161")),(0,n.kt)("li",{parentName:"ul"},"Changed the head protocol to use inline datums, simplifying things in the hydra-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1162"},"#1162")),(0,n.kt)("li",{parentName:"ul"},"Addressed minor inconsistencies in spec and implementation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1104"},"#1104")),(0,n.kt)("li",{parentName:"ul"},"Documented why close transacations might be dropped by the cardano-node (can","\u2019","t fix) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1039"},"#1039")),(0,n.kt)("li",{parentName:"ul"},"Tidy up a few things here and there"),(0,n.kt)("li",{parentName:"ul"},"Worked with SundaeLabs on the offline mode for ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")),(0,n.kt)("li",{parentName:"ul"},"Discussed incremental de-/commits with researchers")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Start work on incremental decommits protocol specification ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1057"},"#1057")),(0,n.kt)("li",{parentName:"ul"},"Provide support to Hypix"),(0,n.kt)("li",{parentName:"ul"},"Address all ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/labels/bug%20%3Abug%3A"},"open bugs")),(0,n.kt)("li",{parentName:"ul"},"Release version 0.14.0 with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/milestone/14?closed=1"},"this scope")),(0,n.kt)("li",{parentName:"ul"},"Update dependencies to prepare for Conway ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1114"},"#1114")),(0,n.kt)("li",{parentName:"ul"},"Shepherd off-line mode PR over the finish line"),(0,n.kt)("li",{parentName:"ul"},"Complete tidying up chain layer via stateless observation changes in hydra-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1096"},"#1096"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7faccef9.aac12434.js b/assets/js/7faccef9.aac12434.js new file mode 100644 index 00000000000..df5bb73c736 --- /dev/null +++ b/assets/js/7faccef9.aac12434.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75064],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=s(r),d=a,f=m["".concat(l,".").concat(d)]||m[d]||u[d]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:a,i[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & Tracing Team Update",slug:"2022-10-28-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2022-10-28-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-performance-and-tracing.md",source:"@site/blog/2022-10-28-performance-and-tracing.md",title:"Performance & Tracing Team Update",description:"High level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.155,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & Tracing Team Update",slug:"2022-10-28-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-10-28-network"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2022-08-12-sre"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Executive summary",id:"executive-summary",level:2}],p={toc:s},m="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline."),(0,a.kt)("p",null,"On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario."),(0,a.kt)("h2",{id:"executive-summary"},"Executive summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale."),(0,a.kt)("li",{parentName:"ul"},"The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment."),(0,a.kt)("li",{parentName:"ul"},"The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7ff27d5d.5960fd00.js b/assets/js/7ff27d5d.5960fd00.js new file mode 100644 index 00000000000..014f0d89a1b --- /dev/null +++ b/assets/js/7ff27d5d.5960fd00.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16091],{97270:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/cli-api/page/5","page":5,"postsPerPage":5,"totalPages":6,"totalCount":27,"previousPage":"/cardano-updates/tags/cli-api/page/4","nextPage":"/cardano-updates/tags/cli-api/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/7ff38eb4.f5ac8427.js b/assets/js/7ff38eb4.f5ac8427.js new file mode 100644 index 00000000000..21af8ddb4a1 --- /dev/null +++ b/assets/js/7ff38eb4.f5ac8427.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[19105],{25873:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/43","page":43,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/42","nextPage":"/cardano-updates/page/44","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/80057f85.edc1c235.js b/assets/js/80057f85.edc1c235.js new file mode 100644 index 00000000000..c31e61eb641 --- /dev/null +++ b/assets/js/80057f85.edc1c235.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83377],{13147:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/tags/network","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/80210.245c42c2.js b/assets/js/80210.245c42c2.js new file mode 100644 index 00000000000..c80f812826f --- /dev/null +++ b/assets/js/80210.245c42c2.js @@ -0,0 +1 @@ +(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80210],{3905:(e,t,n)=>{"use strict";n.d(t,{Zo:()=>u,kt:()=>f});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),i=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=i(e.components);return o.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=i(n),p=r,f=m["".concat(s,".").concat(p)]||m[p]||d[p]||a;return n?o.createElement(f,c(c({ref:t},u),{},{components:n})):o.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,c=new Array(a);c[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:r,c[1]=l;for(var i=2;i{"use strict";n.d(t,{Z:()=>i});var o=n(87462),r=n(67294),a=n(86010),c=n(95999),l=n(86668);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function i(e){let{as:t,id:n,...i}=e;const{navbar:{hideOnScroll:u}}=(0,l.L)();return"h1"!==t&&n?r.createElement(t,(0,o.Z)({},i,{className:(0,a.Z)("anchor",u?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar),id:n}),i.children,r.createElement("a",{className:"hash-link",href:`#${n}`,title:(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to heading",description:"Title for link to heading"})},"\u200b")):r.createElement(t,(0,o.Z)({},i,{id:void 0}))}},80210:(e,t,n)=>{"use strict";n.d(t,{Z:()=>pe});var o=n(67294),r=n(3905),a=n(87462),c=n(35742);var l=n(72389),s=n(86010),i=n(92949),u=n(86668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,i.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(35281),p=n(87594),f=n.n(p);const h=/title=(?["'])(?.*?)\1/,g=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function b(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:a}=t;if(a&&g.test(a)){const e=a.match(g).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],t);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],t);case"html":return b(["js","jsBlock","html"],t);case"python":case"py":case"bash":return b(["bash"],t);case"markdown":case"md":return b(["html","jsx","bash"],t);default:return b(Object.keys(y),t)}}(o,r),l=n.split("\n"),s=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),i=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));i[t]?s[i[t]].range+=`${p},`:u[t]?s[u[t]].start=p:m[t]&&(s[m[t]].range+=`${s[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(s).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E={codeBlockContainer:"codeBlockContainer_Ckt0"};function k(e){let{as:t,...n}=e;const r=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const a=t[o];a&&"string"==typeof r&&(n[a]=r)})),n}(m());return o.createElement(t,(0,a.Z)({},n,{style:r,className:(0,s.Z)(n.className,E.codeBlockContainer,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,s.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var w=n(902);const B={attributes:!0,characterData:!0,childList:!0,subtree:!0};function T(e,t){const[n,r]=(0,o.useState)(),a=(0,o.useCallback)((()=>{r(e.current?.closest("[role=tabpanel][hidden]"))}),[e,r]);(0,o.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=B);const r=(0,w.zX)(t),a=(0,w.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(r);return e&&t.observe(e,a),()=>t.disconnect()}),[e,r,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const L={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var j={Prism:n(87410).Z,theme:L};function O(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Z(){return Z=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},Z.apply(this,arguments)}var x=/\r\n|\r|\n/,S=function(e){0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},_=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function P(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var z=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),O(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=Z({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=Z({},n,{backgroundColor:null}),r}(e.theme,e.language):void 0;return t.themeDict=n})),O(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,a=Z({},P(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(a.style=c.plain),void 0!==r&&(a.style=void 0!==a.style?Z({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),O(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return a[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[c].concat(l))}})),O(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,a=e.token,c=Z({},P(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?Z({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),O(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var a=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),a}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,r=e.children,a=this.getThemeDict(this.props),c=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],a=0,c=0,l=[],s=[l];c>-1;){for(;(a=o[c]++)<r[c];){var i=void 0,u=t[c],m=n[c][a];if("string"==typeof m?(u=c>0?u:["plain"],i=m):(u=_(u,m.type),m.alias&&(u=_(u,m.alias)),i=m.content),"string"==typeof i){var d=i.split(x),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)S(l),s.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(i),o.push(0),r.push(i.length)}c--,t.pop(),n.pop(),o.pop(),r.pop()}return S(l),s}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const A=z,I={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function M(e){let{line:t,classNames:n,showLineNumbers:r,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const i=c({line:t,className:(0,s.Z)(n,r&&I.codeLine)}),u=t.map(((e,t)=>o.createElement("span",(0,a.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",i,r?o.createElement(o.Fragment,null,o.createElement("span",{className:I.codeLineNumber}),o.createElement("span",{className:I.codeLineContent},u)):u,o.createElement("br",null))}var D=n(95999);const H={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function W(e){let{code:t,className:n}=e;const[r,a]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),r=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}o.remove(),c&&(a.removeAllRanges(),a.addRange(c)),r&&r.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":r?(0,D.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,D.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,D.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,s.Z)("clean-btn",n,H.copyButton,r&&H.copyButtonCopied),onClick:l},o.createElement("span",{className:H.copyButtonIcons,"aria-hidden":"true"},o.createElement("svg",{className:H.copyButtonIcon,viewBox:"0 0 24 24"},o.createElement("path",{d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})),o.createElement("svg",{className:H.copyButtonSuccessIcon,viewBox:"0 0 24 24"},o.createElement("path",{d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))))}const V={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function R(e){let{className:t,onClick:n,isEnabled:r}=e;const a=(0,D.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,s.Z)("clean-btn",t,r&&V.wordWrapButtonEnabled),"aria-label":a,title:a},o.createElement("svg",{className:V.wordWrapButtonIcon,viewBox:"0 0 24 24","aria-hidden":"true"},o.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})))}function $(e){let{children:t,className:n="",metastring:r,title:c,showLineNumbers:l,language:i}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d,g=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,r]=(0,o.useState)(!1),a=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return T(a,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(h)?.groups.title??""}(r)||c,{lineClassNames:E,code:C}=v(t,{metastring:r,language:f,magicComments:p}),w=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(r);return o.createElement(k,{as:"div",className:(0,s.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&o.createElement("div",{className:N.codeBlockTitle},b),o.createElement("div",{className:N.codeBlockContent},o.createElement(A,(0,a.Z)({},j,{theme:g,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:r,getTokenProps:a}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,s.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,s.Z)(N.codeBlockLines,w&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(M,{key:t,line:e,getLineProps:r,getTokenProps:a,classNames:E[t],showLineNumbers:w})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(R,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement(W,{className:N.codeButton,code:C}))))}function F(e){let{children:t,...n}=e;const r=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),s="string"==typeof c?$:C;return o.createElement(s,(0,a.Z)({key:String(r)},n),c)}var q=n(39960);var G=n(86043);const U={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function Y(e){return!!e&&("SUMMARY"===e.tagName||Y(e.parentElement))}function Q(e,t){return!!e&&(e===t||Q(e.parentElement,t))}function X(e){let{summary:t,children:n,...r}=e;const c=(0,l.Z)(),i=(0,o.useRef)(null),{collapsed:u,setCollapsed:m}=(0,G.u)({initialState:!r.open}),[d,p]=(0,o.useState)(r.open);return o.createElement("details",(0,a.Z)({},r,{ref:i,open:d,"data-collapsed":u,className:(0,s.Z)(U.details,c&&U.isBrowser,r.className),onMouseDown:e=>{Y(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Y(t)&&Q(t,i.current)&&(e.preventDefault(),u?(m(!1),p(!0)):m(!0))}}),t??o.createElement("summary",null,"Details"),o.createElement(G.z,{lazy:!1,collapsed:u,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{m(e),p(!e)}},o.createElement("div",{className:U.collapsibleContent},n)))}const J={details:"details_b_Ee"},K="alert alert--info";function ee(e){let{...t}=e;return o.createElement(X,(0,a.Z)({},t,{className:(0,s.Z)(K,J.details,t.className)}))}var te=n(92503);function ne(e){return o.createElement(te.Z,e)}const oe={containsTaskList:"containsTaskList_mC6p"};const re={img:"img_ev3q"};const ae="admonition_LlT9",ce="admonitionHeading_tbUL",le="admonitionIcon_kALy",se="admonitionContent_S0QG";const ie={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:o.createElement(D.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:o.createElement(D.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:o.createElement(D.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:o.createElement(D.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:o.createElement(D.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},ue={secondary:"note",important:"info",success:"tip",warning:"danger"};function me(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:r}}(e.children);return{...e,title:e.title??t,children:n}}const de={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...r}=e.props;return o.createElement(e.props.originalType,r)}return e}(e):e));return o.createElement(c.Z,e,t)},code:function(e){const t=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(F,e)},a:function(e){return o.createElement(q.Z,e)},pre:function(e){return o.createElement(F,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),r=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(ee,(0,a.Z)({},e,{summary:n}),r)},ul:function(e){return o.createElement("ul",(0,a.Z)({},e,{className:(t=e.className,(0,s.Z)(t,t?.includes("contains-task-list")&&oe.containsTaskList))}));var t},img:function(e){return o.createElement("img",(0,a.Z)({loading:"lazy"},e,{className:(t=e.className,(0,s.Z)(t,re.img))}));var t},h1:e=>o.createElement(ne,(0,a.Z)({as:"h1"},e)),h2:e=>o.createElement(ne,(0,a.Z)({as:"h2"},e)),h3:e=>o.createElement(ne,(0,a.Z)({as:"h3"},e)),h4:e=>o.createElement(ne,(0,a.Z)({as:"h4"},e)),h5:e=>o.createElement(ne,(0,a.Z)({as:"h5"},e)),h6:e=>o.createElement(ne,(0,a.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:a}=me(e),c=function(e){const t=ue[e]??e,n=ie[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),ie.info)}(n),l=r??c.label,{iconComponent:i}=c,u=a??o.createElement(i,null);return o.createElement("div",{className:(0,s.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,ae)},o.createElement("div",{className:ce},o.createElement("span",{className:le},u),l),o.createElement("div",{className:se},t))},mermaid:n(11875).Z};function pe(e){let{children:t}=e;return o.createElement(r.Zo,{components:de},t)}},87594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,a]=t;if(o&&a){o=parseInt(o),a=parseInt(a);const e=o<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=e);for(let t=o;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/80537537.5725cfd8.js b/assets/js/80537537.5725cfd8.js new file mode 100644 index 00000000000..1ece2d244b4 --- /dev/null +++ b/assets/js/80537537.5725cfd8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43140],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function o(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function p(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var l=n.createContext({}),u=function(t){var e=n.useContext(l),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(l.Provider,{value:e},t.children)},m="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,l=t.parentName,c=p(t,["components","mdxType","originalType","parentName"]),m=u(a),s=r,h=m["".concat(l,".").concat(s)]||m[s]||d[s]||i;return a?n.createElement(h,o(o({ref:e},c),{},{components:a})):n.createElement(h,o({ref:e},c))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,o=new Array(i);o[0]=s;var p={};for(var l in e)hasOwnProperty.call(e,l)&&(p[l]=e[l]);p.originalType=t,p[m]="string"==typeof t?t:r,o[1]=p;for(var u=2;u<i;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},88265:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-08-01-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},o="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-08-01-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-01-node-cli-api.md",source:"@site/blog/2023-08-01-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-08-01T00:00:00.000Z",formattedDate:"August 1, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.76,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-08-01-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-04-sre"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-07-31-network"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-07-19---2023-08-01"},"2023-07-19 - 2023-08-01"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Release of Node 8.2.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694."),(0,r.kt)("li",{parentName:"ul"},"This release is phase 1 of the SanchoNet roll out"),(0,r.kt)("li",{parentName:"ul"},"Allows SPOs to vote on changes to the on-chain constitution."),(0,r.kt)("li",{parentName:"ul"},"Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag."),(0,r.kt)("li",{parentName:"ul"},"Updates to the networking packages prepare the road for peer sharing."))),(0,r.kt)("li",{parentName:"ul"},"cardano-cli and cardano-api continue to integrate Conway era features"),(0,r.kt)("li",{parentName:"ul"},"Continue refactoring of cardano-testnet")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/116"},"Use AnyShelleyToBabbageEra from cardano-api instead")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/115"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/113"},"Add rendering for ",(0,r.kt)("inlineCode",{parentName:"a"},"ConwayCertificate")," in ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Cli.Json.Friendly"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/111"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/110"},"Add DRep registration certificate command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/109"},"Add options to delegate voting stake ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/107"},"Share MIR certificates code between era-based and legacy CLI parsers")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/106"},"Release cardano-cli 8.4.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/103"},"Update to",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/100"},"Change directory structure from Options/.. to EraBased/..")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/98"},"Era-sensitive command structure")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/90"},"#86 Set default era to Babbage in stake-address, stake-pool and governance commmands"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/155"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyCertificateConstraints")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"conwayCertificateConstraints"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/154"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"TxVotesSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/152"},"Add SerialiseAsBech32 instances for committee cold and hot keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/151"},"Deprecate some constraint functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/150"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"TxGovernanceActionSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/149"},"More ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraint")," constraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/148"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/147"},"Expose shelleyCertificateConstraints and conwayCertificateConstraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/146"},"Remove unnecessary function ",(0,r.kt)("inlineCode",{parentName:"a"},"getShelleyEraTxBodyConstraint"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/143"},"Provide additional constraints in ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraints"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/142"},"Update changelogs for ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/141"},"handleFileForWritingWithOwnerPermissionImpl: Fix permisions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/138"},"Update DRepKey with correct ",(0,r.kt)("inlineCode",{parentName:"a"},"Voting")," keyrole")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/137"},"Support more constraints for Conway witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/135"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/134"},"Expose toShelleyPoolParams for conway integration")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/131"},(0,r.kt)("inlineCode",{parentName:"a"},"FeatureInEra")," instance for ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/130"},"Expose more functionality from cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/128"},"Improved feature ergonomics")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/127"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"AtMostBabbageEra")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyToBabbageEra")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5412"},"Fix stubbed LogFormatting instances")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5411"},"8.2.0 version bumps")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"Bump network packages version")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5404"},"Fix missing ",(0,r.kt)("inlineCode",{parentName:"a"},"ToObject")," tracing instances.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5401"},"input-output-hk/cardano-cli#85 Fix node crashing in babbage"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5411"},"8.2.0 version bumps")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"Bump network packages version")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5404"},"Fix missing ",(0,r.kt)("inlineCode",{parentName:"a"},"ToObject")," tracing instances.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5400"},"Fix plutus script costing in cardano-testnet"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"Bump network packages version"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/blob/05c0392b4722d7fe2f82db1854b28de4f28a917b/doc/getting-started/understanding-config-files.md?plain=1#L84C1-L97C42"},"WarmValency"))))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/805fc822.c864d419.js b/assets/js/805fc822.c864d419.js new file mode 100644 index 00000000000..8e511606f0d --- /dev/null +++ b/assets/js/805fc822.c864d419.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53165],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=u(r),d=a,f=s["".concat(p,".").concat(d)]||s[d]||m[d]||o;return r?n.createElement(f,i(i({ref:t},c),{},{components:r})):n.createElement(f,i({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:a,i[1]=l;for(var u=2;u<o;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},7581:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"Network Team Update",slug:"2022-12-12-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-12-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-12-network.md",source:"@site/blog/2022-12-12-network.md",title:"Network Team Update",description:"High level summary",date:"2022-12-12T00:00:00.000Z",formattedDate:"December 12, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"},{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:.43,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-12-12-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-12-14-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-12-09-crypto"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:u},s="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"In last sprint the team focused on preparations for the conference talk at\n",(0,a.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/"},"OPODIS 2022"),". We also worked on preparations to publish ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," and related\npackages on Hackage (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"PR #57"),", ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/60"},"PR #60"),")."),(0,a.kt)("p",null,"We also started reviewing:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"ouroboros-network")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"cardano-ledger"),"\nrepositories for open-source readiness (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4218"},"PR #4128"),").")),(0,a.kt)("p",null,"We prepared a PR which changes how ",(0,a.kt)("inlineCode",{parentName:"p"},"node-to-node")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol\nversiones are serialised in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," log (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4691"},"PR #4691"),")."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/80617771.3351af55.js b/assets/js/80617771.3351af55.js new file mode 100644 index 00000000000..fc6f4d02d05 --- /dev/null +++ b/assets/js/80617771.3351af55.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23427],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=p(a),s=n,m=d["".concat(u,".").concat(s)]||d[s]||h[s]||i;return a?r.createElement(m,l(l({ref:t},c),{},{components:a})):r.createElement(m,l({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=s;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,l[1]=o;for(var p=2;p<i;p++)l[p]=a[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}s.displayName="MDXCreateElement"},22977:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-09-29-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-09-29-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-hydra.md",source:"@site/blog/2023-09-29-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.49,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-29-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-29-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-29-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],c={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team mainly focused on having a working new reliability\nnetwork layer; and specified its expected behavior in a new ADR."),(0,n.kt)("p",null,'They also revisited the security policy and vulnerability disclosure policy on\nhow to handle security vulnerability within Hydra, and in particular how to\nhandle so-called "Silent fixes".'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated security policy and vulnerability disclosure policy ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1088"},"#1088")),(0,n.kt)("li",{parentName:"ul"},"Adr/network reliability ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1082"},"#1082"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Introduce reliability network layer ","[#1074]"," (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1074"},"https://github.com/input-output-hk/hydra/pull/1074"),")"),(0,n.kt)("li",{parentName:"ul"},"Refactor the vCommit validator in Aiken ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1072"},"#1072"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8084428b.0eba4435.js b/assets/js/8084428b.0eba4435.js new file mode 100644 index 00000000000..d8deafd6ee6 --- /dev/null +++ b/assets/js/8084428b.0eba4435.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31724],{16813:a=>{a.exports=JSON.parse('{"label":"cli-api","permalink":"/cardano-updates/tags/cli-api","allTagsPath":"/cardano-updates/tags","count":27}')}}]); \ No newline at end of file diff --git a/assets/js/80c54634.fd705a3e.js b/assets/js/80c54634.fd705a3e.js new file mode 100644 index 00000000000..2d0b13f1f97 --- /dev/null +++ b/assets/js/80c54634.fd705a3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[99808],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),c=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(d.Provider,{value:t},e.children)},u="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(a),h=n,m=u["".concat(d,".").concat(h)]||u[h]||s[h]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var c=2;c<o;c++)i[c]=a[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},57809:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-11-hydra",authors:["ffakenz","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-11-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-11-hydra.md",source:"@site/blog/2023-08-11-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-11T00:00:00.000Z",formattedDate:"August 11, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.8,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-11-hydra",authors:["ffakenz","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-15-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-11-performance-and-tracing"}},d={authorsImageUrls:[void 0,void 0]},c=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:c},u="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team updated ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," to support ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node"),' version\n8.1.2, ensuring compatibility with the latest mainnet release. The team also\nparticipated in discussions about a "cardanonical" JSON schema and added it as a\nsubmodule to the project, contributing to improved data modeling and\ninteroperability.'),(0,n.kt)("p",null,"In terms of community engagement, the team successfully onboarded a new\ncontributor, also participated in a RareEvo Twitter space, and continued\npreparations for the Hydra master-class."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to support cardano-node 8.1.2 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1007"},"#1007")),(0,n.kt)("li",{parentName:"ul"},"Engaged in discussions about a ","\u201c","cardanonical","\u201d"," json schema and\nadd it as submodule to the project\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1013"},"#1013")),(0,n.kt)("li",{parentName:"ul"},"Onboarded a new contributor to the hydra project (@locallycompact)"),(0,n.kt)("li",{parentName:"ul"},"Joined RareEvo twitter space and continued preparation of hydra master-class")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update & streamline tutorial to work with latest version of hydra-node"),(0,n.kt)("li",{parentName:"ul"},"Remove the internal commit functionality ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/954"},"#954")),(0,n.kt)("li",{parentName:"ul"},"Release 0.12.0")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/81528b00.9aeb470f.js b/assets/js/81528b00.9aeb470f.js new file mode 100644 index 00000000000..df9b19c3fc4 --- /dev/null +++ b/assets/js/81528b00.9aeb470f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[50471],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),c=n,d=h["".concat(s,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},67938:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-12-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-01-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-mithril.md",source:"@site/blog/2022-12-01-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2022-12-01T00:00:00.000Z",formattedDate:"December 1, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.04,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2022-12-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"DB sync Team Update",permalink:"/cardano-updates/2022-12-01-db-sync"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-12-01-system-test"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes. "),(0,n.kt)("p",null,"Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implemented custom Mithril SPOs on testing/pre-release networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/563"},"#563")),(0,n.kt)("li",{parentName:"ul"},"Deprecated Signer Declarative Pool Id registration mode ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/585"},"#585")),(0,n.kt)("li",{parentName:"ul"},"Completed the second stage of the store automatic migration process ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/600"},"#600")),(0,n.kt)("li",{parentName:"ul"},"Completed the deployment pipelines to crates.io registry ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/588"},"#588")),(0,n.kt)("li",{parentName:"ul"},"Completed automatic generation of nodes/libraries versions manifest in releases notes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/599"},"#599")),(0,n.kt)("li",{parentName:"ul"},"Completed CI/CD handling of PR from forks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/597"},"#597")),(0,n.kt)("li",{parentName:"ul"},"Worked on the CIP design for Mithril piggybacked on the Cardano network layer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/586"},"#586")),(0,n.kt)("li",{parentName:"ul"},"Worked on signing the artifacts released in the distributions by the CI/CD ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/587"},"#587")),(0,n.kt)("li",{parentName:"ul"},"Worked on multi-platforms end to end test ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/601"},"#601")),(0,n.kt)("li",{parentName:"ul"},"Worked on the refactorizaton of the aggregator multi-signer engine ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/398"},"#398"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/81bb24c9.76693a73.js b/assets/js/81bb24c9.76693a73.js new file mode 100644 index 00000000000..4362703ab80 --- /dev/null +++ b/assets/js/81bb24c9.76693a73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46003],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),h=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=h(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=h(r),c=n,d=p["".concat(s,".").concat(c)]||p[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var h=2;h<a;h++)o[h]=r[h];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},94887:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>h});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-11-18-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-11-18-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-18-mithril.md",source:"@site/blog/2022-11-18-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2022-11-18T00:00:00.000Z",formattedDate:"November 18, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.35,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Mithril Team Update",slug:"2022-11-18-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-18-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-16-consensus"}},s={authorsImageUrls:[void 0]},h=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:h},p="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks. "),(0,n.kt)("p",null,"Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released a new Mithril distribution ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2246.1"},"2246.1")),(0,n.kt)("li",{parentName:"ul"},"Completed the first stage of the store migrations process ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/562"},"#562")),(0,n.kt)("li",{parentName:"ul"},"Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/565"},"#565")),(0,n.kt)("li",{parentName:"ul"},"Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/576"},"#576")),(0,n.kt)("li",{parentName:"ul"},"Prepared a Daedalus synchronization benchmark video with/without Mithril ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/606"},"#606")),(0,n.kt)("li",{parentName:"ul"},"Upgraded the Cardano nodes of the testing Mithril networks to ",(0,n.kt)("inlineCode",{parentName:"li"},"1.35.4")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/594"},"#594")),(0,n.kt)("li",{parentName:"ul"},"Worked on implementing SPO tests nodes on testing Mithril networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/563"},"#563")),(0,n.kt)("li",{parentName:"ul"},"Worked on the CIP design for Mithril piggybacked on the Cardano network layer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/588"},"#588")),(0,n.kt)("li",{parentName:"ul"},"Worked on the refactorizaton of the aggregator multi signer engine ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/398"},"#398"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/82209890.d5e4ff65.js b/assets/js/82209890.d5e4ff65.js new file mode 100644 index 00000000000..4e237e2f7d7 --- /dev/null +++ b/assets/js/82209890.d5e4ff65.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30141],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>f});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=r.createContext({}),s=function(e){var n=r.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=s(e.components);return r.createElement(c.Provider,{value:n},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},p=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),m=s(t),p=a,f=m["".concat(c,".").concat(p)]||m[p]||u[p]||i;return t?r.createElement(f,o(o({ref:n},d),{},{components:t})):r.createElement(f,o({ref:n},d))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=p;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var s=2;s<i;s++)o[s]=t[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,t)}p.displayName="MDXCreateElement"},25680:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=t(87462),a=(t(67294),t(3905));const i={title:"Performance & tracing update",slug:"2023-06-14-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-14-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-14-performance-and-tracing.md",source:"@site/blog/2023-06-14-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-06-14T00:00:00.000Z",formattedDate:"June 14, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.515,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-06-14-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-14-consensus"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-12-network"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},m="wrapper";function u(e){let{components:n,...t}=e;return(0,a.kt)(m,(0,r.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've continued release benchmarking and established a new baseline for ",(0,a.kt)("inlineCode",{parentName:"li"},"8.0.0"),"."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"In our release benchmarking cycle, we established a new performance baseline for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0.0"),". Additionally, we've measured\nperformance under various workloads for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.1.1-pre"),"; the results look promising and validate the optimization efforts\ndone on several system components. "),(0,a.kt)("p",null,"In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for\nbenchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be\nmeaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific\ntrace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles. "),(0,a.kt)("p",null,"Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs. "),(0,a.kt)("p",null,"This means the backend is entering validation phase, where we systematically compare all metrics taken from the new\ninfrastructure to the existing ones, including determining reproducibility and variance."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/822bd8ab.dfb2cd17.js b/assets/js/822bd8ab.dfb2cd17.js new file mode 100644 index 00000000000..2a6e5cc8f6c --- /dev/null +++ b/assets/js/822bd8ab.dfb2cd17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36504],{3905:(t,e,a)=>{a.d(e,{Zo:()=>l,kt:()=>f});var r=a(67294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function s(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?o(Object(a),!0).forEach((function(e){n(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,r,n=function(t,e){if(null==t)return{};var a,r,n={},o=Object.keys(t);for(r=0;r<o.length;r++)a=o[r],e.indexOf(a)>=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(r=0;r<o.length;r++)a=o[r],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var u=r.createContext({}),c=function(t){var e=r.useContext(u),a=e;return t&&(a="function"==typeof t?t(e):s(s({},e),t)),a},l=function(t){var e=c(t.components);return r.createElement(u.Provider,{value:e},t.children)},p="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var a=t.components,n=t.mdxType,o=t.originalType,u=t.parentName,l=i(t,["components","mdxType","originalType","parentName"]),p=c(a),m=n,f=p["".concat(u,".").concat(m)]||p[m]||d[m]||o;return a?r.createElement(f,s(s({ref:e},l),{},{components:a})):r.createElement(f,s({ref:e},l))}));function f(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var o=a.length,s=new Array(o);s[0]=m;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i[p]="string"==typeof t?t:n,s[1]=i;for(var c=2;c<o;c++)s[c]=a[c];return r.createElement.apply(null,s)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},27428:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={sidebar_position:6},s="Congratulations!",i={unversionedId:"tutorial-basics/congratulations",id:"tutorial-basics/congratulations",title:"Congratulations!",description:"You have just learned the basics of Docusaurus and made some changes to the initial template.",source:"@site/docs/tutorial-basics/congratulations.md",sourceDirName:"tutorial-basics",slug:"/tutorial-basics/congratulations",permalink:"/cardano-updates/docs/tutorial-basics/congratulations",draft:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"defaultSidebar",previous:{title:"Deploy your site",permalink:"/cardano-updates/docs/tutorial-basics/deploy-your-site"},next:{title:"Tutorial - Extras",permalink:"/cardano-updates/docs/category/tutorial---extras"}},u={},c=[{value:"What's next?",id:"whats-next",level:2}],l={toc:c},p="wrapper";function d(t){let{components:e,...a}=t;return(0,n.kt)(p,(0,r.Z)({},l,a,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"congratulations"},"Congratulations!"),(0,n.kt)("p",null,"You have just learned the ",(0,n.kt)("strong",{parentName:"p"},"basics of Docusaurus")," and made some changes to the ",(0,n.kt)("strong",{parentName:"p"},"initial template"),"."),(0,n.kt)("p",null,"Docusaurus has ",(0,n.kt)("strong",{parentName:"p"},"much more to offer"),"!"),(0,n.kt)("p",null,"Have ",(0,n.kt)("strong",{parentName:"p"},"5 more minutes"),"? Take a look at ",(0,n.kt)("strong",{parentName:"p"},(0,n.kt)("a",{parentName:"strong",href:"/cardano-updates/docs/tutorial-extras/manage-docs-versions"},"versioning"))," and ",(0,n.kt)("strong",{parentName:"p"},(0,n.kt)("a",{parentName:"strong",href:"/cardano-updates/docs/tutorial-extras/translate-your-site"},"i18n")),"."),(0,n.kt)("p",null,"Anything ",(0,n.kt)("strong",{parentName:"p"},"unclear")," or ",(0,n.kt)("strong",{parentName:"p"},"buggy")," in this tutorial? ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/facebook/docusaurus/discussions/4610"},"Please report it!")),(0,n.kt)("h2",{id:"whats-next"},"What's next?"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Read the ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/"},"official documentation")),(0,n.kt)("li",{parentName:"ul"},"Modify your site configuration with ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/docs/api/docusaurus-config"},(0,n.kt)("inlineCode",{parentName:"a"},"docusaurus.config.js"))),(0,n.kt)("li",{parentName:"ul"},"Add navbar and footer items with ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/docs/api/themes/configuration"},(0,n.kt)("inlineCode",{parentName:"a"},"themeConfig"))),(0,n.kt)("li",{parentName:"ul"},"Add a custom ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/docs/styling-layout"},"Design and Layout")),(0,n.kt)("li",{parentName:"ul"},"Add a ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/docs/search"},"search bar")),(0,n.kt)("li",{parentName:"ul"},"Find inspirations in the ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/showcase"},"Docusaurus showcase")),(0,n.kt)("li",{parentName:"ul"},"Get involved in the ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/community/support"},"Docusaurus Community"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/82c38436.f7c1816e.js b/assets/js/82c38436.f7c1816e.js new file mode 100644 index 00000000000..13bc3cecaa1 --- /dev/null +++ b/assets/js/82c38436.f7c1816e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36229],{47683:a=>{a.exports=JSON.parse('{"label":"sre","permalink":"/cardano-updates/tags/sre","allTagsPath":"/cardano-updates/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/82db709e.075c055a.js b/assets/js/82db709e.075c055a.js new file mode 100644 index 00000000000..9c8b57fba44 --- /dev/null +++ b/assets/js/82db709e.075c055a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27647],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,h=d["".concat(p,".").concat(m)]||d[m]||c[m]||o;return a?r.createElement(h,l(l({ref:t},u),{},{components:a})):r.createElement(h,l({ref:t},u))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var s=2;s<o;s++)l[s]=a[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},10627:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-11-10-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-11-10-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-10-sre.md",source:"@site/blog/2023-11-10-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-11-10T00:00:00.000Z",formattedDate:"November 10, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:2.225,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-11-10-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-10-hydra"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-11-09-db-sync"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3},{value:"Sanchonet-demo",id:"sanchonet-demo",level:3}],u={toc:s},d="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground")," stack")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Minor bug fix and db-sync sanchonet package update: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/b1f1cbd...994696f"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"General migration support PR for cardano-world to cardano-playground ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/18"},"cardano-parts-pull-18"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground"),(0,n.kt)("li",{parentName:"ul"},"Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes"),(0,n.kt)("li",{parentName:"ul"},"Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains"),(0,n.kt)("li",{parentName:"ul"},"The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state"),(0,n.kt)("li",{parentName:"ul"},"The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable"),(0,n.kt)("li",{parentName:"ul"},"Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0"),(0,n.kt)("li",{parentName:"ul"},"For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true"),(0,n.kt)("li",{parentName:"ul"},"Template updates include:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds optional TF AZ declaration on ec2 resources"),(0,n.kt)("li",{parentName:"ul"},"Adds a cardano node p2p dashboard to the grafana cloud stack"),(0,n.kt)("li",{parentName:"ul"},"Adds a dbsync pool performance analysis query"),(0,n.kt)("li",{parentName:"ul"},"Updates python distribute and delegation scripts from world for playground compatibility"),(0,n.kt)("li",{parentName:"ul"},"Starts a python script lib to reduce shared code among the python scripts"),(0,n.kt)("li",{parentName:"ul"},"Several justfile improvements and new recipes"))),(0,n.kt)("li",{parentName:"ul"},"More detail is available in the PR description"))),(0,n.kt)("li",{parentName:"ul"},"Update submit action script for 8.6 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/19"},"cardano-parts-pull-19")),(0,n.kt)("li",{parentName:"ul"},"Update scripts for 8.6.0-pre ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/21"},"cardano-parts-pull-21"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Fixes subcommand names based on ERA_CMD"),(0,n.kt)("li",{parentName:"ul"},"Adds deposits to some commands"),(0,n.kt)("li",{parentName:"ul"},"Separates CC cold/hot key generation as host authorization has to occur after action is approved"),(0,n.kt)("li",{parentName:"ul"},"CC voting enabled in vote job")))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migration PR to largely complete the network migration from cardano-world to cardano-playground: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/5"},"cardano-playground-pull-5"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds re-spun private chain network"),(0,n.kt)("li",{parentName:"ul"},"Migrates shelley-qa chain network from world"),(0,n.kt)("li",{parentName:"ul"},"Justfile improvements and new recipes"),(0,n.kt)("li",{parentName:"ul"},"Improve concurrent environment chain support"),(0,n.kt)("li",{parentName:"ul"},"More detail is available in the PR description")))),(0,n.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migration to play: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/561"},"iohk-nix-pull-561"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org"),(0,n.kt)("li",{parentName:"ul"},"Remove deprecated cardano-lib p2p network environment"),(0,n.kt)("li",{parentName:"ul"},"Update sanchonet chain with respin changes"),(0,n.kt)("li",{parentName:"ul"},"Update private chain with respin changes"),(0,n.kt)("li",{parentName:"ul"},"Bump private and shelley-qa chains to sanchonet equivalent conway genesis"),(0,n.kt)("li",{parentName:"ul"},"Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing")))),(0,n.kt)("h3",{id:"sanchonet-demo"},"Sanchonet-demo"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update for cardano-node 8.6.0-pre demo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo/commit/b54da94057ac0949421918208fd04795d029447d"},"sanchonet-demo-commit"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/82ed4471.838c38ab.js b/assets/js/82ed4471.838c38ab.js new file mode 100644 index 00000000000..2159f071e62 --- /dev/null +++ b/assets/js/82ed4471.838c38ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58312],{9933:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/7","page":7,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/6","nextPage":"/cardano-updates/page/8","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/82f24945.8746cef5.js b/assets/js/82f24945.8746cef5.js new file mode 100644 index 00000000000..de19a42d018 --- /dev/null +++ b/assets/js/82f24945.8746cef5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33724],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(a),m=n,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||i;return a?r.createElement(h,o(o({ref:t},p),{},{components:a})):r.createElement(h,o({ref:t},p))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<i;s++)o[s]=a[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},11607:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Crypto Team Update",slug:"2023-01-20-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-20-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-crypto.md",source:"@site/blog/2023-01-20-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-01-20-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-01-25-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-20-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3}],p={toc:s},c="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: We explored whether some uses of ",(0,n.kt)("inlineCode",{parentName:"li"},"transmute")," could be removed, but it resulted in considerable regression. "),(0,n.kt)("li",{parentName:"ul"},"cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: An inconsistency between ",(0,n.kt)("inlineCode",{parentName:"li"},"contra-tracer")," available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the ",(0,n.kt)("inlineCode",{parentName:"li"},"contra-tracer")," used by consensus. ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/675"},"PR#675"),". We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing. "),(0,n.kt)("li",{parentName:"ul"},"We are writing a RFP for the audit of the core library. ")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A problem with Nix is blocking merge of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#341")),(0,n.kt)("li",{parentName:"ul"},"Plutus team ran ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus/blob/kwxm/BLS12_381/prototype/plutus-benchmark/bls-benchmarks/Main.hs"},"benchmarks")," of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution."),(0,n.kt)("li",{parentName:"ul"},"Team is fully digesting the Plonk paper. "),(0,n.kt)("li",{parentName:"ul"},"There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used. ")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A little unforseen delay has been caused by a mismatch in the use of ",(0,n.kt)("inlineCode",{parentName:"li"},"contra-tracer"),". The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255/commits/39b2d9473aa296976825248360a73cf066065431"},"doing the change"),", but still the CI is not happy."),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317/commits/39b2d9473aa296976825248360a73cf066065431"},"same")," was needed for the KES agents prerequisites ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"PR#317"),"."),(0,n.kt)("li",{parentName:"ul"},"We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/830ba2c4.c975997b.js b/assets/js/830ba2c4.c975997b.js new file mode 100644 index 00000000000..d1a95d778f6 --- /dev/null +++ b/assets/js/830ba2c4.c975997b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[99726],{49778:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/831d95cb.0c66da8a.js b/assets/js/831d95cb.0c66da8a.js new file mode 100644 index 00000000000..e0a08810056 --- /dev/null +++ b/assets/js/831d95cb.0c66da8a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75319],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=d(a),c=n,m=h["".concat(s,".").concat(c)]||h[c]||u[c]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},69346:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-01-13-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-01-13-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-hydra.md",source:"@site/blog/2023-01-13-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.56,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-01-13-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-01-14-db-sync"},nextItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2023-01-13-release"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:d},h="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"Since last weekly update before christmas, the Hydra team worked on the\ntechnical specification, closed gaps in ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts, made the unique\n",(0,n.kt)("inlineCode",{parentName:"p"},"headId")," available to Hydra clients through the API, allow the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," to\nexplicitly synchronize from genesis (if configured), and fixed smaller log and\nbuild issues reported by new users."),(0,n.kt)("p",null,"Besides this, a retrospective ",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/en/news/hydra-head-protocol-an-open-source-solution-for-scalability/"},"blog\npost"),"\nwas published by Matthias Benkort (CF) on Hydra, summarizing our progress made\nin 2022 also an outlook where Hydra is headed for in 2023. Also, the team had\nsome first sessions on the voting project with Catalyst and the CF."),(0,n.kt)("p",null,"A full digest monthly digest for December 2022 can be found on the ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2022-12"},"hydra\nwebsite"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Had some first sessions on the voting project with Catalyst and CF"),(0,n.kt)("li",{parentName:"ul"},"Published retrospective ",(0,n.kt)("a",{parentName:"li",href:"https://cardanofoundation.org/en/news/hydra-head-protocol-an-open-source-solution-for-scalability/"},"blog\npost"),"\nby Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also\nan outlook where Hydra is headed for in 2023."),(0,n.kt)("li",{parentName:"ul"},"Worked on the LaTeX spec for HydraHeadV1, not final or published yet - ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/ch1bo/hydra-spec"},"latest\nversion in this repository"),"."),(0,n.kt)("li",{parentName:"ul"},"Add unique ",(0,n.kt)("inlineCode",{parentName:"li"},"headId")," to API and hence make it available to clients."),(0,n.kt)("li",{parentName:"ul"},"Allow ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")," to explicitly synchronize from genesis using ",(0,n.kt)("inlineCode",{parentName:"li"},"--start-chain-from 0"),"."),(0,n.kt)("li",{parentName:"ul"},"Closed gaps in ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-plutus")," scripts",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"bounded transaction validity (",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/adr/21/"},"ADR21"),")"),(0,n.kt)("li",{parentName:"ul"},"enforcing contract continuity via state token in output"))),(0,n.kt)("li",{parentName:"ul"},"Fixed JSON for some logs and smaller build issues reported by new users.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Reach out to have ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial")," integrated."),(0,n.kt)("li",{parentName:"ul"},"Plan the next couple of months."),(0,n.kt)("li",{parentName:"ul"},"Complete checking reimbursing of commits in head validator."),(0,n.kt)("li",{parentName:"ul"},"Align plutus scripts to spec and simplify them (identified some simplifications)"),(0,n.kt)("li",{parentName:"ul"},"Improve mutation framework to be sure we fail tests for the right reasons"),(0,n.kt)("li",{parentName:"ul"},"Complete the spec except the open points (<5) and also discuss them with researchers.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8395f67d.798e5dd2.js b/assets/js/8395f67d.798e5dd2.js new file mode 100644 index 00000000000..daae1a14391 --- /dev/null +++ b/assets/js/8395f67d.798e5dd2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16934],{55035:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/crypto/page/2","page":2,"postsPerPage":5,"totalPages":4,"totalCount":18,"previousPage":"/cardano-updates/tags/crypto","nextPage":"/cardano-updates/tags/crypto/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/83e7e4db.6c511419.js b/assets/js/83e7e4db.6c511419.js new file mode 100644 index 00000000000..a3644b4d2aa --- /dev/null +++ b/assets/js/83e7e4db.6c511419.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68102],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||c[m]||i;return n?a.createElement(h,o(o({ref:t},p),{},{components:n})):a.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,o[1]=s;for(var u=2;u<i;u++)o[u]=n[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},85321:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const i={title:"Consensus Quarterly Update",slug:"2022-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/quarterly/2022-11-15-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-15-consensus.md",source:"@site/quarterly/2022-11-15-consensus.md",title:"Consensus Quarterly Update",description:"Consensus Quarterly Update",date:"2022-11-15T00:00:00.000Z",formattedDate:"November 15, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:3.655,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Quarterly Update",slug:"2022-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Open-Source Update",permalink:"/cardano-updates/quarterly/2023-01-13-open-source"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/quarterly/2022-11-09-network"}},l={authorsImageUrls:[void 0]},u=[{value:"Consensus Quarterly Update",id:"consensus-quarterly-update",level:2},{value:"2022-09 - 2022-11",id:"2022-09---2022-11",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Conway era",id:"conway-era",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4},{value:"Tech debt",id:"tech-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration-1",level:4}],p={toc:u},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"consensus-quarterly-update"},"Consensus Quarterly Update"),(0,r.kt)("h2",{id:"2022-09---2022-11"},"2022-09 - 2022-11"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"As a consequence of the errors observed when running distributed mempool\nbenchmarks, we re-designed the UTxO HD mempool integration, which fixed these\nerrors and lead to a simpler and more maintainable design.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We focused on increasing test coverage for the UTxO-HD prototype. In\nparticular, we added property tests for:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Backing store (work ongoing)"),(0,r.kt)("li",{parentName:"ul"},"Era transitions"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The property tests we added uncovered several bugs, which is a great result\ngiven the exponential increase in the cost of finding bugs as they are closer\nto deployment.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"One of the errors found by our tests required us to work on improvements in\nthe Haskell bindings for LMDB. This work is ongoing.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We started working on the mempool property tests that will exercise the new\ncode paths that UTxO HD introduced.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'We developed, benchmarked and tested an implementation of sequences of\ndifferences based on "anti-diffs". Performance results of diff sequence\noperations show that we achieved a speedup of about ',(0,r.kt)("inlineCode",{parentName:"p"},"4x")," across several\nscenarios. Note: this speedup is taking into account diff sequence operations\nonly, so the consensus-wide speedup is less than ",(0,r.kt)("inlineCode",{parentName:"p"},"4x"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'We integrated the "anti-diff" prototype into the UTxO HD feature branch.'))),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We wrote a simulator that demonstrates soundness of an abstract implementation\nof the new chain selection rule."),(0,r.kt)("li",{parentName:"ul"},"We elaborated a draft specification for the Genesis implementation (currently\nawaiting feedback from other architects)."),(0,r.kt)("li",{parentName:"ul"},"We elaborated a draft specification for the ChainSync Jumping optimization. In\nparticular, this includes a proof sketch that the latter preserves liveness\nand safety in all cases."),(0,r.kt)("li",{parentName:"ul"},"With the Networking team, we co-designed the eclipse avoidance mechanism,\nspecifically its coherence with the Genesis implementation plan's security\nand its dependence on the new ChainSync Jumping optimization."),(0,r.kt)("li",{parentName:"ul"},"We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a\nperformance degradation wrt the baseline. Our optimization attempts so far\nhave brought the performance closer to the baseline, but not yet to parity.")),(0,r.kt)("h4",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We did most of the heavy lifting required to integrate the Conway era into the\nConsensus layer.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We started working on enabling CI nightly tests, which revealed several test\nfailures due to thunks being found it data structures used by the ledger and\nconsensus. We made a lot of progress fixing those thunk errors, but some\nerrors still remain.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We elaborated a ",(0,r.kt)("inlineCode",{parentName:"p"},"db-analyser")," benchmark for the ledger operations. This led us\nto the identification of high processing time at epoch boundaries, and we\ncould not observe any performance degradation that can be attributed to era\nchanges.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed a source of flakiness in the ChainDB QSM test.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We clarified a common source of confusion around VRF tie-breaking and\ncross-era chain selection.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed a bug in the maximum-allowed ledger major protocol version."))),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We spent time making ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-updates")," the central source of information for\nthe core teams stakeholders."),(0,r.kt)("li",{parentName:"ul"},"We went through the Galois gap analysis and extracted actionable points to\ntake on next."),(0,r.kt)("li",{parentName:"ul"},"Bart and Yogesh continued with their onboarding and stated making substantial\ncontributions to consensus.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish the mempool property tests."),(0,r.kt)("li",{parentName:"ul"},"Benchmark the latest version of the prototype."),(0,r.kt)("li",{parentName:"ul"},"Elaborate a document that describes new integration test scenarios and pass it\nto the SDET team."),(0,r.kt)("li",{parentName:"ul"},"Bring query UTxO by address command performance on par with the baseline\nversion.")),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Receive and incorporate Duncan's feedback on the first draft specification for\nthe Genesis implementation."),(0,r.kt)("li",{parentName:"ul"},"Begin prototyping the first genesis implementation, unless the first draft\nneeds major changes."),(0,r.kt)("li",{parentName:"ul"},"Draft a second revision of the Genesis report."),(0,r.kt)("li",{parentName:"ul"},"Review the second revision with a wider audience, which includes at least\nAlexander Russell. That feedback will drive a third and hopefully final\nrevision."),(0,r.kt)("li",{parentName:"ul"},"Investigate how to mitigate the ~30% slowdown we have observed so far in the\nChainSync jumping prototype, and try to mitigate it. In particular, we might\nneed to optimize the existing BlockFetch logic.")),(0,r.kt)("h4",{id:"tech-debt"},"Tech debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Enabling nightly CI tests.")),(0,r.kt)("h4",{id:"fostering-collaboration-1"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Merge the tutorial document Galois wrote; requires CI integration."),(0,r.kt)("li",{parentName:"ul"},"Come up with our own documentation improvements, many of which were suggested\nin the Galois gap analysis."),(0,r.kt)("li",{parentName:"ul"},"Try to hire a new team member.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/84189288.e5afffc2.js b/assets/js/84189288.e5afffc2.js new file mode 100644 index 00000000000..3e88669a22b --- /dev/null +++ b/assets/js/84189288.e5afffc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48863],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,h=p["".concat(l,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(h,s(s({ref:t},u),{},{components:n})):r.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c<o;c++)s[c]=n[c];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},59071:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-07-12-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-07-12-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-12-consensus.md",source:"@site/blog/2023-07-12-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-07-12T00:00:00.000Z",formattedDate:"July 12, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.59,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-07-12-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-13-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-07-12-performance-and-tracing"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4620"},"proposed fix"),". The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine."),(0,a.kt)("p",null,"The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility."),(0,a.kt)("p",null,"On the support front, the team ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/200"},"drafted")," an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/84677cf0.55a9266a.js b/assets/js/84677cf0.55a9266a.js new file mode 100644 index 00000000000..1bfecbe6d47 --- /dev/null +++ b/assets/js/84677cf0.55a9266a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54415],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),d=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),s=d(a),c=n,m=s["".concat(u,".").concat(c)]||s[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var d=2;d<i;d++)o[d]=a[d];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},70789:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-12-09-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-09-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-hydra.md",source:"@site/blog/2022-12-09-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-12-09T00:00:00.000Z",formattedDate:"December 9, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.62,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-12-09-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-12-09-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-12-09-ledger"}},u={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:d},s="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team has worked on completing to "Validate coordinated head protocol against formal model", this is a huge step to verify the implementation is secure. They also worked on implementing ',(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," related to bounded tx validity which is now under review. ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/obsidiansystems/hydra-pay"},"HydraPay")," project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/obsidiansystems/hydra-pay/issues?q=is%3Aissue"},"issues")," they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Document model based testing ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/194"},"#194")," & ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/641"},"#641")),(0,n.kt)("li",{parentName:"ul"},"Got ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21"),", reducing gaps between implementation and specification, under review."),(0,n.kt)("li",{parentName:"ul"},"Complete review on ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete first round of review on ",(0,n.kt)("inlineCode",{parentName:"li"},"HydraPay")," work ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/634"},"#634")),(0,n.kt)("li",{parentName:"ul"},"Meeting with ",(0,n.kt)("inlineCode",{parentName:"li"},"Director of CyberSecurity")," frio ",(0,n.kt)("inlineCode",{parentName:"li"},"IOG"),' to unblock "the RFP prepared for the external audit" ',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/606"},"#606")),(0,n.kt)("li",{parentName:"ul"},"Remove ",(0,n.kt)("inlineCode",{parentName:"li"},"vasil-dev")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"testnet")," from ",(0,n.kt)("inlineCode",{parentName:"li"},"smoke-test")," because they were not working ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/630"},"#630")),(0,n.kt)("li",{parentName:"ul"},"Fix flaky ",(0,n.kt)("inlineCode",{parentName:"li"},"plutus-merkle-tree")," test ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/642"},"#642")),(0,n.kt)("li",{parentName:"ul"},"Refactor ",(0,n.kt)("inlineCode",{parentName:"li"},"NetworkSpec")," to improve legilibility."),(0,n.kt)("li",{parentName:"ul"},"Fix benchmark cost for ",(0,n.kt)("inlineCode",{parentName:"li"},"abortTx")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/631"},"#631")),(0,n.kt)("li",{parentName:"ul"},"Adapt ",(0,n.kt)("inlineCode",{parentName:"li"},"nix.conf")," to the recent hydra-ci nix cache migration.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Get ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," accepted & close tx validity gap in our implementation."),(0,n.kt)("li",{parentName:"ul"},"Integrate the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial"),"."),(0,n.kt)("li",{parentName:"ul"},"Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec."),(0,n.kt)("li",{parentName:"ul"},"Get Cicero (new CI) working."),(0,n.kt)("li",{parentName:"ul"},"Use reference inputs to reduce the cost of the ",(0,n.kt)("inlineCode",{parentName:"li"},"commitTx"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8470e3c7.4090b9b2.js b/assets/js/8470e3c7.4090b9b2.js new file mode 100644 index 00000000000..d19e05f930c --- /dev/null +++ b/assets/js/8470e3c7.4090b9b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[38141],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(r),h=n,d=c["".concat(p,".").concat(h)]||c[h]||m[h]||i;return r?a.createElement(d,o(o({ref:t},s),{},{components:r})):a.createElement(d,o({ref:t},s))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=r[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}h.displayName="MDXCreateElement"},75734:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-01-06-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-06-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-06-crypto.md",source:"@site/blog/2023-01-06-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-01-06T00:00:00.000Z",formattedDate:"January 6, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.46,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-01-06-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-01-11-performance-and-tracing"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-05-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"MuSig2",id:"musig2",level:3},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Cryptography handbook",id:"cryptography-handbook",level:3}],s={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The four open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"MuSig2: The API features (error handling) has been merged. "),(0,n.kt)("li",{parentName:"ul"},"Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures."),(0,n.kt)("li",{parentName:"ul"},"cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: We keep progressing with KES secure forgetting implementation.")),(0,n.kt)("p",null,"We also started working in the cryptography engineering handbook, which will be a cross team effort."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Merged the more granular error handling mechanism ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/33"},"PR#33"))),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes/commit/9de00835ed354cbb8d37838f6cee57930ea9fd3d"},"Version 0.1.1"),", which was published in ",(0,n.kt)("a",{parentName:"li",href:"https://crates.io/crates/kes-summed-ed25519"},"crates.io"),". "),(0,n.kt)("li",{parentName:"ul"},"Updated new KES format to mithril library ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/674"},"PR 674")),(0,n.kt)("li",{parentName:"ul"},"We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/531"},"PR 531")),(0,n.kt)("li",{parentName:"ul"},"We keep progressing on reducing the use of ",(0,n.kt)("inlineCode",{parentName:"li"},"transmute")," in ",(0,n.kt)("inlineCode",{parentName:"li"},"mithril-stm"),".")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Nothing new to report. Still working in merging these PRs. We are only missing nix merge of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/520"},"PR#520")," and the updates on VRF will be merged.")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255#issuecomment-1362601518"},"PR#255"),".")),(0,n.kt)("h3",{id:"cryptography-handbook"},"Cryptography handbook"),(0,n.kt)("p",null,"We have made available the (temporary) cryptography handbook ",(0,n.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cryptography_spec/"},"https://input-output-hk.github.io/cryptography_spec/"),", and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/84823557.5b494971.js b/assets/js/84823557.5b494971.js new file mode 100644 index 00000000000..e60a1b2b423 --- /dev/null +++ b/assets/js/84823557.5b494971.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94771],{53381:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/36","page":36,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/35","nextPage":"/cardano-updates/page/37","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/8534c2dd.8ec8dbda.js b/assets/js/8534c2dd.8ec8dbda.js new file mode 100644 index 00000000000..b0b8fee70f0 --- /dev/null +++ b/assets/js/8534c2dd.8ec8dbda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39987],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(a),c=r,m=h["".concat(s,".").concat(c)]||h[c]||d[c]||i;return a?n.createElement(m,o(o({ref:t},u),{},{components:a})):n.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},88128:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-11-24-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-24-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-24-hydra.md",source:"@site/blog/2023-11-24-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-11-24T00:00:00.000Z",formattedDate:"November 24, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.12,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-11-24-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-29-mithril"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-24-sre"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],u={toc:p},h="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(h,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"This week, the Hydra team spent significant time opening a head among\nthemselves on ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet")," using the release candidate, revealing and\naddressing lurking bugs such as\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1174"},"#","1174"),". Also\nrequired was this change to dynamically calculate the min utxo value\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/1176"},"#","1176"),", a\nnecessary adjustment following the switch to inline datums. The team\nengaged with ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli")," / ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-api")," maintainers to discuss recent\nchanges and collaborated on drafting feature ideas, including providing\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1177"},"Conway support"),"\nfor the Hydra roadmap. As part of ongoing improvements, they\nexperimented with writing the specification in markdown instead of\nLaTex."),(0,r.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Opened head among us on mainnet and uncovered a few lurking bugs like\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1174"},"#","1174")," in the\nrelease candidate"),(0,r.kt)("li",{parentName:"ul"},"Calculate the min utxo value instead of hard-coding it\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1176"},"#","1176"),", which is\nneeded since we switched to inline datums."),(0,r.kt)("li",{parentName:"ul"},"Met with the ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-cli")," / ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-api")," maintainers to discuss\nrecent changes and way forward"),(0,r.kt)("li",{parentName:"ul"},"Drafted features ideas to provide ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1177"},"Conway\nsupport")," on the\nHydra roadmap"),(0,r.kt)("li",{parentName:"ul"},"Experimented in writing the specification in markdown instead of LaTex")),(0,r.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Have the Monthly review meeting with several demos"),(0,r.kt)("li",{parentName:"ul"},"Release version 0.14.0 with ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/milestone/14?closed=1"},"this\nscope")),(0,r.kt)("li",{parentName:"ul"},"Complete tidying up chain layer via stateless observation changes in\nhydra-node\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1096"},"#","1096")),(0,r.kt)("li",{parentName:"ul"},"Update dependencies to prepare for Conway\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1114"},"#","1114"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/859b6012.9836dc83.js b/assets/js/859b6012.9836dc83.js new file mode 100644 index 00000000000..3235457851b --- /dev/null +++ b/assets/js/859b6012.9836dc83.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85173],{96249:a=>{a.exports=JSON.parse('{"label":"db-sync","permalink":"/cardano-updates/tags/db-sync","allTagsPath":"/cardano-updates/tags","count":14}')}}]); \ No newline at end of file diff --git a/assets/js/86c4d158.2e916fa2.js b/assets/js/86c4d158.2e916fa2.js new file mode 100644 index 00000000000..9c05fefa228 --- /dev/null +++ b/assets/js/86c4d158.2e916fa2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46831],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>k});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=u(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),p=u(r),c=a,k=p["".concat(i,".").concat(c)]||p[c]||d[c]||s;return r?n.createElement(k,o(o({ref:t},m),{},{components:r})):n.createElement(k,o({ref:t},m))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=c;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[p]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<s;u++)o[u]=r[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}c.displayName="MDXCreateElement"},3439:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const s={title:"System Test Team Update",slug:"2023-06-08-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-08-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-system-test.md",source:"@site/blog/2023-06-08-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:1.005,hasTruncateMarker:!1,authors:[{name:"Martin Kourim",title:"System Test Engineer",url:"https://github.com/mkoura",imageURL:"https://github.com/mkoura.png",key:"mkoura"}],frontMatter:{title:"System Test Team Update",slug:"2023-06-08-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-08-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-06-07-node-cli-api"}},i={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"Testing improvements",id:"testing-improvements",level:3},{value:"Node:",id:"node",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],m={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the ",(0,a.kt)("em",{parentName:"p"},"1.35.7")," and ",(0,a.kt)("em",{parentName:"p"},"8.0.0")," releases."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node-tests/pulls?page=1&q=is%3Apr+is%3Aclosed+updated%3A2023-03-26..2023-06-08"},"Full list of closed PRs")),(0,a.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Make cardano-submit-api REST API service available and run corresponding regression tests by default"),(0,a.kt)("li",{parentName:"ul"},"Update cabal build testing for 8.0.0"),(0,a.kt)("li",{parentName:"ul"},"Add support for testing governance SPO poll"),(0,a.kt)("li",{parentName:"ul"},"Use Poetry for Python dependency management"),(0,a.kt)("li",{parentName:"ul"},"Check status of known GH issues during tests runtime and finish the test accordingly"),(0,a.kt)("li",{parentName:"ul"},"Generate topology files with both IP addresses and DNS names"),(0,a.kt)("li",{parentName:"ul"},"Log issues like failure to start a cluster instance and report errors during tests runtime")),(0,a.kt)("h3",{id:"testing-improvements"},"Testing improvements"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Add rollback testing:",(0,a.kt)("ol",{parentName:"li"},(0,a.kt)("li",{parentName:"ol"},"global consensus is reached after rollback, in situation where less than ",(0,a.kt)("inlineCode",{parentName:"li"},"securityParam")," blocks were produced since cluster split"),(0,a.kt)("li",{parentName:"ol"},"global consensus is not reached when more than ",(0,a.kt)("inlineCode",{parentName:"li"},"securityParam")," blocks were produced, and the result is permanent fork"))),(0,a.kt)("li",{parentName:"ul"},"Add tests to governance SPO poll commands")),(0,a.kt)("h3",{id:"node"},"Node:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"tested the ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_7.html"},"1.35.7")," release"),(0,a.kt)("li",{parentName:"ul"},"tested the ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_8_0_0.html"},"8.0.0")," release")),(0,a.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"improvements in db-sync sync tests"),(0,a.kt)("li",{parentName:"ul"},"improvements in db-sync functional tests")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/86cc1b5f.c4aa4649.js b/assets/js/86cc1b5f.c4aa4649.js new file mode 100644 index 00000000000..215bcdad4fc --- /dev/null +++ b/assets/js/86cc1b5f.c4aa4649.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62034],{12783:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/60","page":60,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/59","nextPage":"/cardano-updates/page/61","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/86e0423a.929b4796.js b/assets/js/86e0423a.929b4796.js new file mode 100644 index 00000000000..8a45350eb7e --- /dev/null +++ b/assets/js/86e0423a.929b4796.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[69778],{6118:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/mithril","page":1,"postsPerPage":5,"totalPages":7,"totalCount":34,"nextPage":"/cardano-updates/tags/mithril/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/87088759.90416017.js b/assets/js/87088759.90416017.js new file mode 100644 index 00000000000..ff903c4ba97 --- /dev/null +++ b/assets/js/87088759.90416017.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90047],{32425:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Consensus Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-consensus"},{"title":"Network Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-network"},{"title":"SRE Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-sre"},{"title":"Performance & Tracing Q3 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q3-performance-and-tracing"},{"title":"SRE Q3 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q3-sre"}]}')}}]); \ No newline at end of file diff --git a/assets/js/871691d4.358d342f.js b/assets/js/871691d4.358d342f.js new file mode 100644 index 00000000000..71b1fe6b4ae --- /dev/null +++ b/assets/js/871691d4.358d342f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2136],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),s=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(n),m=r,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:r,i[1]=p;for(var s=2;s<a;s++)i[s]=n[s];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},78081:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-06-23-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-06-23-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-network.md",source:"@site/blog/2023-06-23-network.md",title:"Network Team Update",description:"Network Update",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-06-23-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-23-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-23-sre"}},l={authorsImageUrls:[void 0]},s=[{value:"Network Update",id:"network-update",level:2},{value:"Key contributions",id:"key-contributions",level:3},{value:"Other smaller changes",id:"other-smaller-changes",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"network-update"},"Network Update"),(0,r.kt)("h3",{id:"key-contributions"},"Key contributions"),(0,r.kt)("p",null,"We held a series of session to review the implementation of big ledger peers\n(eclipse evasion). See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"#4462"),"."),(0,r.kt)("p",null,"We get a request from a 3rd party to clarify an inconsistency between CDDL spec\nand protocol implementation. We worked out a nice solution which takes\nadvantage of the ",(0,r.kt)("inlineCode",{parentName:"p"},"any")," notion available in ",(0,r.kt)("inlineCode",{parentName:"p"},"CDDL"),". On the Haskell side we\nprovide ",(0,r.kt)("inlineCode",{parentName:"p"},"Any")," type which gen generate almost any CBOR term (some are excluded\nonly because they are not decoded back to the same form, and we relay on that\nproperty). See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4580"},"#4580"),"."),(0,r.kt)("p",null,"We fixed a bunch of problems of the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," command. It also now has\na limited support of ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," mini-protocol (the ",(0,r.kt)("inlineCode",{parentName:"p"},"-c")," option is\nignored, as it cannot be supported by ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol). Note that\nthe format of messages has changed, timestamps are printed in ISO8601 format.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4601"},"#4601"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5326"},"#5326"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"#5313"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30"},"#30")),(0,r.kt)("p",null,"In order to provide a new flag in the topology file which enables ledger peers\nwhen the chain is close to the tip, we continued to work on ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"#4530"),". This is\ncurrently in review, the consensus team will need to provide us with the new\napi. This feature is useful for two reasons: makes it easier to maintain\na topology file, it will also limit the traffic on public roots generated by\nfor example full node wallets and distribute it to ledger peers."),(0,r.kt)("p",null,"We also continued to work on a blog post which describes the journey of design\n& implementation of the dynamic P2P network layer. Too be announced soon :). "),(0,r.kt)("h3",{id:"other-smaller-changes"},"Other smaller changes"),(0,r.kt)("p",null,"We limit the concurrency of resolving dns names. Up to 8 root peers or ledger\npeers DNS names are resolved concurrently, and at most 2 local root peer DNS\nnames. See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4596"},"#4596"),"."),(0,r.kt)("p",null,"We fixed handshake query timeout in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4603"},"#4603"),"."),(0,r.kt)("p",null,"We renamed one of the block-fetch decision constructors as requested by the\nconsensus team, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4608"},"#4608"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/876c34e9.eaf9747b.js b/assets/js/876c34e9.eaf9747b.js new file mode 100644 index 00000000000..d797b8b6749 --- /dev/null +++ b/assets/js/876c34e9.eaf9747b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85369],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=d(a),c=n,m=p["".concat(s,".").concat(c)]||p[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var d=2;d<i;d++)o[d]=a[d];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},94306:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-04-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-04-27-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-27-hydra.md",source:"@site/blog/2023-04-27-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-27T00:00:00.000Z",formattedDate:"April 27, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.11,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-27-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-04-28-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-21-hydra"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:d},p="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team held their Monthly review meeting and drafted the\nreport which likely is published next week. They put the spec into the\nrepository and website, addressed a user issue and fixed the TUI peer list.\nFurthermore, they updated dependencies, conducted a Twitter space on Auctions\nuse cases, covered the rollback bug with tests and implemented a solution.\nLooking ahead, their goals for next week include releasing 0.10.0, implementing\ntimed transactions support, writing a Query API ADR, and grooming work items\nlike off-chain benchmarks."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Held the Monthly review meeting and drafted the report (to be published next week)"),(0,n.kt)("li",{parentName:"ul"},"Added the spec into the repository\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693")," and published on\n",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/core-concepts/specification"},"the\nwebsite")),(0,n.kt)("li",{parentName:"ul"},"Groom and addressed user issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/823"},"#823")),(0,n.kt)("li",{parentName:"ul"},"Covered the rollback bug with tests and implemented a solution (to be reviewed) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Fixed the TUI peer list"),(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to match ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node")," master"),(0,n.kt)("li",{parentName:"ul"},"Conducted a twitter space on Auctions use cases")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Release 0.10.0"),(0,n.kt)("li",{parentName:"ul"},"Support timed transactions solution drafted and validated API with users"),(0,n.kt)("li",{parentName:"ul"},"Write Query API ADR and groom a concrete step"),(0,n.kt)("li",{parentName:"ul"},"Groom and solve ",(0,n.kt)("inlineCode",{parentName:"li"},"PostTxOnChainFailed")," UX problem ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/832"},"#832")),(0,n.kt)("li",{parentName:"ul"},"Groom off-chain benchmarks idea ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186")," and turn it into a ","\u201c","feature","\u201d")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/878c8163.fc733a29.js b/assets/js/878c8163.fc733a29.js new file mode 100644 index 00000000000..25e61c63289 --- /dev/null +++ b/assets/js/878c8163.fc733a29.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45932],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=s(n),d=a,h=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(h,l(l({ref:t},c),{},{components:n})):r.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[u]="string"==typeof e?e:a,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},91329:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-09-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-14-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-14-db-sync.md",source:"@site/blog/2023-09-14-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-09-14T00:00:00.000Z",formattedDate:"September 14, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.47,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-09-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-15-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-12-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],c={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have created a DBSync tag ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-1-1-0")," which can follow sanchonet. Also\nthe team has ran a number of benchmarks and tests for the new options/flavours of DBSync\nand prepared a blogpost which summorises them, for downstream components."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Integration of node-8.3.x and support for Sanchonet on Conway\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1498"},"#1498")),(0,a.kt)("li",{parentName:"ul"},"Simplifications of new feautures\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1496"},"#1496")),(0,a.kt)("li",{parentName:"ul"},"Makes it impossible to restart DBSync with different schema options and adds\ntests for them\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1466"},"#1466")),(0,a.kt)("li",{parentName:"ul"},"CI fixes\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1494"},"#1494"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1491"},"#1491")),(0,a.kt)("li",{parentName:"ul"},"Prepared a blogpost about different DBSync options\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/blob/blog/blog/blog.pdf"},"blog"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/884eee03.9c216150.js b/assets/js/884eee03.9c216150.js new file mode 100644 index 00000000000..1af05faedda --- /dev/null +++ b/assets/js/884eee03.9c216150.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54975],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},m=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),d=u(a),c=n,h=d["".concat(p,".").concat(c)]||d[c]||s[c]||l;return a?r.createElement(h,o(o({ref:t},m),{},{components:a})):r.createElement(h,o({ref:t},m))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var u=2;u<l;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},99054:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-12-06-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-12-06-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-06-ledger.md",source:"@site/blog/2023-12-06-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-12-06T00:00:00.000Z",formattedDate:"December 6, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.53,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-12-06-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-12-06-mithril"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway",id:"conway",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],m={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This period we reached a major milestone, namely we now have an initial version of Conway\nconformance testing working. We are now able to generate random valid data with the help\nof constraint based testing framework, apply that data to Conway Ledger rules and verify\nthat the output matches to the one produced by the executable version of the Formal Ledger\nSpecification, when it is applied to the same random data."),(0,n.kt)("p",null,"We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get\nConstitutional Committee query is complete and tested. Various improvements to the\ntesting tools. Addition of more test cases."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway"},"Conway"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3888"},"pull-3888")," - Add checks for valid ProtVer when a proposal is a HardFork"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3902"},"pull-3902")," - Fix pvCanFollow usage in Conway and improve clarity in Shelley"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3855"},"pull-3855")," - Remove unreachable proposals"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3903"},"pull-3903")," - Add lenient decoder for ",(0,n.kt)("inlineCode",{parentName:"li"},"Addr")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3878"},"pull-3878")," - Committee query - implement next epoch change")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3893"},"pull-3893")," - Move ",(0,n.kt)("inlineCode",{parentName:"li"},"tree-diff")," dependency to tests together with all instances"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3896"},"pull-3896")," - Fix Brute force failure"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3904"},"pull-3904")," - New ListWhere Pred added to the Constrained Solver."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3907"},"pull-3907")," - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3883"},"pull-3883")," - Committee QuerySpec Imp Test"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3909"},"pull-3909")," - Make ",(0,n.kt)("inlineCode",{parentName:"li"},"impAnn")," a bit more useful, by making the logs scoped by ",(0,n.kt)("inlineCode",{parentName:"li"},"impAnn")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3908"},"pull-3908")," - Use upstream testing instances for very basic types"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3912"},"pull-3912")," - Removed call to tail, and the ","'","watchPulser","'"," test"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3852"},"pull-3852")," - Added constrained generators to conformance tests - Part 1")),(0,n.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3891"},"pull-3891")," - Bump plutus to 1.17")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8864b77b.cb1a7306.js b/assets/js/8864b77b.cb1a7306.js new file mode 100644 index 00000000000..f6b386a106d --- /dev/null +++ b/assets/js/8864b77b.cb1a7306.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[61908],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>g});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),s=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=s(n),u=r,g=d["".concat(c,".").concat(u)]||d[u]||p[u]||i;return n?a.createElement(g,o(o({ref:t},m),{},{components:n})):a.createElement(g,o({ref:t},m))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=u;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var s=2;s<i;s++)o[s]=n[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},21318:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-03-08-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-03-08-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-performance-and-tracing.md",source:"@site/blog/2023-03-08-performance-and-tracing.md",title:"Performance & tracing update",description:"* Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.",date:"2023-03-08T00:00:00.000Z",formattedDate:"March 8, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.805,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-03-08-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-08-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-03-crypto"}},c={authorsImageUrls:[void 0]},s=[{value:"1.35.6 release",id:"1356-release",level:3},{value:"Analysis pipeline",id:"analysis-pipeline",level:3},{value:"Open Sourcing",id:"open-sourcing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:s},d="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate."),(0,r.kt)("li",{parentName:"ul"},"New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users."),(0,r.kt)("li",{parentName:"ul"},"Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination."),(0,r.kt)("li",{parentName:"ul"},"Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.")),(0,r.kt)("h1",{id:"performance"},"Performance"),(0,r.kt)("h3",{id:"1356-release"},"1.35.6 release"),(0,r.kt)("p",null,"Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health."),(0,r.kt)("h3",{id:"analysis-pipeline"},"Analysis pipeline"),(0,r.kt)("p",null,"Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better\ndifferentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance.\nAdditionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking\ndata more easily accessible."),(0,r.kt)("h3",{id:"open-sourcing"},"Open Sourcing"),(0,r.kt)("p",null,"As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable\nthird parties to make use of that data much more easily, by having reliable guidelines and a working example."),(0,r.kt)("h1",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make\nthe switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process."),(0,r.kt)("h1",{id:"infrastructure"},"Infrastructure"),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8914fa7e.0fe96f3b.js b/assets/js/8914fa7e.0fe96f3b.js new file mode 100644 index 00000000000..eef65f99fa2 --- /dev/null +++ b/assets/js/8914fa7e.0fe96f3b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15347],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),l=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=l(e.components);return a.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),h=l(n),c=o,m=h["".concat(s,".").concat(c)]||h[c]||d[c]||i;return n?a.createElement(m,r(r({ref:t},u),{},{components:n})):a.createElement(m,r({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=c;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[h]="string"==typeof e?e:o,r[1]=p;for(var l=2;l<i;l++)r[l]=n[l];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}c.displayName="MDXCreateElement"},17177:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>l});var a=n(87462),o=(n(67294),n(3905));const i={title:"Consensus Team Update",slug:"2022-11-16-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},r=void 0,p={permalink:"/cardano-updates/2022-11-16-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-consensus.md",source:"@site/blog/2022-11-16-consensus.md",title:"Consensus Team Update",description:"High-level summary",date:"2022-11-16T00:00:00.000Z",formattedDate:"November 16, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:5.06,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-11-16-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-18-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-16-node-cli-api"}},s={authorsImageUrls:[void 0]},l=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"High-level status report",id:"high-level-status-report",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Finish the UTxO HD prototype",id:"finish-the-utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:3},{value:"Benchmarking the CSJ prototype",id:"benchmarking-the-csj-prototype",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3},{value:"Support",id:"support",level:3}],u={toc:l},h="wrapper";function d(e){let{components:t,...i}=e;return(0,o.kt)(h,(0,a.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,o.kt)("p",null,'During the past two weeks, the consensus team started documenting the\nimplementation of the UTxO HD feature and continued developing tests for it. As\npart of our work on UTxO HD, we improved the Haskell support for LMDB. We also\nspent time working on the LSM tree prototype, and designed a parameter tuning\nalgorithm for it. Regarding our work on Genesis, our investigation of the\n"plateaus" pointed at the ',(0,o.kt)("inlineCode",{parentName:"p"},"TICKF"),' slowdown on era boundaries as culprit. This\nled us to developing a caching strategy that will not only remove the\naforementioned "plateaus", but can help alleviating the growing block production\ndelay on epoch switch. We also helped reviewing the block forge credential\nhotswap feature, which is intended for use in the adoption of P2P.'),(0,o.kt)("p",null,"We also worked on paying technical debt and fostering collaboration. In\nparticular, we improved the ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim")," framework, which is crucial for testing and\nsimulating Cardano components. We also removed thunks that appeared on era\ntranslations, and improved our diffusion pipelining feature. We are working on a\npresentation for explaining Praos and Genesis."),(0,o.kt)("h2",{id:"high-level-status-report"},"High-level status report"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Finish the UTxO HD prototype: in progress.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"We added documentation for this feature."),(0,o.kt)("li",{parentName:"ul"},"We developed the second version of the mempool tests."),(0,o.kt)("li",{parentName:"ul"},"We fixed benchmarks that were inflating the speedup we observed in the\nanti-diff implementation of sequences of differences. Speedups are now in the\nrange of ","[3.33, 4.75]",", which remain significant."),(0,o.kt)("li",{parentName:"ul"},"We continued improving Haskell LMDB support."),(0,o.kt)("li",{parentName:"ul"},'We finished implementing a "parameter tuning algorithm" for the LSM tree\nprototype. This enables us to run experiments to check the correctness of\nthe algorithm.'))),(0,o.kt)("li",{parentName:"ul"},"Genesis: in progress.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},'Work investigating the "plateaus" in the ',(0,o.kt)("inlineCode",{parentName:"li"},"ChainSync")," jumping prototype\npointed to the ",(0,o.kt)("inlineCode",{parentName:"li"},"TICKF")," slowdown on era boundaries as culprit."))),(0,o.kt)("li",{parentName:"ul"},"Tech debt:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"We improved the capabilities of our ",(0,o.kt)("inlineCode",{parentName:"li"},"io-sim")," library, which is crucial for\ntesting and simulating Cardano components."),(0,o.kt)("li",{parentName:"ul"},"We removed thunks from epoch translations in the ledger."),(0,o.kt)("li",{parentName:"ul"},"We added Linux CI support for ",(0,o.kt)("inlineCode",{parentName:"li"},"lmdb-simple"),"."),(0,o.kt)("li",{parentName:"ul"},"We got pending diffusion pipelining improvements merged."))),(0,o.kt)("li",{parentName:"ul"},"Fostering collaboration:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"We are working on a explanation of Praos and Genesis protocols."))),(0,o.kt)("li",{parentName:"ul"},"Support:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},'Investigation of CSJ "plateaus" led us to developing a caching strategy for\n',(0,o.kt)("inlineCode",{parentName:"li"},"TICKF"),' that will not only remove these "plateaus", but can help alleviating\nthe growing block production delay on epoch switch.'),(0,o.kt)("li",{parentName:"ul"},"We reviewed the block forge credential hotswapping feature which is intended\nfor use in the adoption of P2P.")))),(0,o.kt)("h2",{id:"workstreams"},"Workstreams"),(0,o.kt)("h3",{id:"finish-the-utxo-hd-prototype"},"Finish the UTxO HD prototype"),(0,o.kt)("p",null,"We merged PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4060"},"#4060"),", which adds a report documenting the UTxO HD\nfeature, and puts emphasis in explaining how the mempool works in combination\nwith UTxO HD."),(0,o.kt)("p",null,"We opened a draft PR with the second iteration of the property tests for the\nmempool (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4076"},"#4076"),")."),(0,o.kt)("p",null,"We fixed the ",(0,o.kt)("inlineCode",{parentName:"p"},"Arbitrary")," instances for keys and values in ",(0,o.kt)("inlineCode",{parentName:"p"},"DiffSeq")," benchmarks\n(",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4143"},"#4143"),"). The problem was that we were testing with mostly small\nvalues, which artificially boosted the performance gains we saw on benhcmarks.\nSpeedups are now in the range of ","[3.33, 4.75]"," across the different\nconfigurations."),(0,o.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,o.kt)("p",null,"We focused on incorporating feedback on the monadic cursor API PR (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"#1"),").\nThis required us to make small tweaks to ",(0,o.kt)("inlineCode",{parentName:"p"},"quickcheck-lockstep")," to test the new\nAPI. We also updated the backing store property tests to use the new version of\nthe monadic cursor API."),(0,o.kt)("h3",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,o.kt)("p",null,'We worked on the LSM tree prototype. In particular: finished implementing a\n"parameter tuning algorithm" that adapts the LSM tree design based on factors\nlike:'),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"workload"),(0,o.kt)("li",{parentName:"ul"},"machine specs, "),(0,o.kt)("li",{parentName:"ul"},"and characteristics of the data being stored. ")),(0,o.kt)("p",null,"We are now running experiments to gather results and cross-reference them with\nexisting experimental results from the LSM tree paper to see if the algorithm is\nworking correctly."),(0,o.kt)("h3",{id:"benchmarking-the-csj-prototype"},"Benchmarking the CSJ prototype"),(0,o.kt)("p",null,'We focused on investigating the "plateaus" in the ',(0,o.kt)("inlineCode",{parentName:"p"},"ChainSync")," tip, which turned\nout to be due to the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," bug which we previously were only aware of in the\ncontext of the long forging times near epoch boundaries. For the most drastic\npatch by @nfrisby to speed up ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF"),", full sync is speeding up by 7%."),(0,o.kt)("p",null,"The following plot shows that by caching the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," the ",(0,o.kt)("inlineCode",{parentName:"p"},"ChainSync")," tip and the\n",(0,o.kt)("inlineCode",{parentName:"p"},"VolatileDB")," tip progress at the same rate."),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(29287).Z,width:"765",height:"445"})),(0,o.kt)("p",null,"The plot below shows the speedup observed by caching the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," rule wrt the\nbaseline."),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(17885).Z,width:"773",height:"445"})),(0,o.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,o.kt)("p",null,"After addressing the PR comments, we merged PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/16"},"#16"),", which implements\nthe ",(0,o.kt)("inlineCode",{parentName:"p"},"MonadCatch")," instance for ",(0,o.kt)("inlineCode",{parentName:"p"},"STM"),". This extends the capability of our ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim"),"\nlibrary, which is crucial for testing and simulating Cardano components PR #16\nclosed ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/1461"},"#1461"),". This new feature was published as version ",(0,o.kt)("inlineCode",{parentName:"p"},"0.4.0.0"),"\nof ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim"),"."),(0,o.kt)("p",null,"We continued with our work fixing the ",(0,o.kt)("inlineCode",{parentName:"p"},"NoThunk")," errors required for enabling\nnightly tests, with the help of ",(0,o.kt)("inlineCode",{parentName:"p"},"TVarInvariant")," checks in ",(0,o.kt)("inlineCode",{parentName:"p"},"strict-stm")," and\n",(0,o.kt)("inlineCode",{parentName:"p"},"nothunks")," libraries. We proposed fixes in ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger")," that took care of\nthunks that appeared in era translations (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3143"},"#3143"),"). The fixes will be\nintegrated back into consensus when ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger")," approves and publish the\nchanges introduced in ",(0,o.kt)("inlineCode",{parentName:"p"},"#3143"),"."),(0,o.kt)("p",null,"We added CI support for ",(0,o.kt)("inlineCode",{parentName:"p"},"lmdb-simple")," (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/2"},"#2"),"). We currently test the build on\na Linux environment only."),(0,o.kt)("p",null,"We got pending diffusion pipelining PRs (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3857"},"#3857"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3860"},"#3860"),",\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3856"},"#3856"),") merged, after rebasing and addressing feedback."),(0,o.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,o.kt)("p",null,"@nfrisby finished a visualisation tool and outlined scripts for the Praos and\nGenesis explanation presentations. The idea is to produce a video that gives an\noverview of these protocols."),(0,o.kt)("h3",{id:"support"},"Support"),(0,o.kt)("p",null,"We started working on caching the computation of the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," rule\n(",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4054"},"#4054"),"), since this was blocking our benchmarking work for\nGenesis. In addition, this issue has the Cardano community ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4421"},"quite\nconcerned"),", so we are hoping the work done in caching the\ncomputation of the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," rule can help alleviating the growing block\nproduction delay on epoch switch."),(0,o.kt)("p",null,"We reviewed the block forge credential hotswapping PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3800"},"#3800")," from the\nnetworking team, which is intended for use in the adoption of P2P."))}d.isMDXComponent=!0},17885:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-16-comparing-TICKF-batch-c6570a71c4a5d53b10cb7309d2cc742c.png"},29287:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-16-removed-stuttering-e49aa27a0e549f0195373203da971ba7.png"}}]); \ No newline at end of file diff --git a/assets/js/89211367.d2f211db.js b/assets/js/89211367.d2f211db.js new file mode 100644 index 00000000000..dc52293cf56 --- /dev/null +++ b/assets/js/89211367.d2f211db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97421],{89635:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/33","page":33,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/32","nextPage":"/cardano-updates/page/34","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/89931013.c6ff4cfa.js b/assets/js/89931013.c6ff4cfa.js new file mode 100644 index 00000000000..8cb15c8aff6 --- /dev/null +++ b/assets/js/89931013.c6ff4cfa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[10173],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,r,a=function(e,t){if(null==e)return{};var i,r,a={},n=Object.keys(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(i),d=a,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return i?r.createElement(c,o(o({ref:t},s),{},{components:i})):r.createElement(c,o({ref:t},s))}));function c(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,i)}d.displayName="MDXCreateElement"},34101:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-04-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-04-06-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-06-mithril.md",source:"@site/blog/2023-04-06-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-04-06T00:00:00.000Z",formattedDate:"April 6, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.075,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-04-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-07-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-05-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,a.kt)(h,(0,r.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team released a new ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2313.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2313.0"))," distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages."),(0,a.kt)("p",null,"Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.6"),"."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2313.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2313.0"))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that implements a relational store in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"epoch_settings")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/813"},"#813")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signed-entity-type")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/815"},"#815")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"certificate")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/817"},"#817")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"open_message")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/827"},"#827")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signer_registration")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/828"},"#828")))),(0,a.kt)("li",{parentName:"ul"},"Completed the refactoring of the dependency injection of the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/823"},"#823")),(0,a.kt)("li",{parentName:"ul"},"Completed the cleanup of the multi-signer of the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/824"},"#824")),(0,a.kt)("li",{parentName:"ul"},"Completed the upgrade of the Cardano node to ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35.6")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/843"},"#843"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/89a43a90.47af50cd.js b/assets/js/89a43a90.47af50cd.js new file mode 100644 index 00000000000..ea32bcb1858 --- /dev/null +++ b/assets/js/89a43a90.47af50cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[82939],{76907:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/sre/page/3","page":3,"postsPerPage":5,"totalPages":3,"totalCount":15,"previousPage":"/cardano-updates/tags/sre/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/8a6fc2ec.f5b11d20.js b/assets/js/8a6fc2ec.f5b11d20.js new file mode 100644 index 00000000000..1a689bce120 --- /dev/null +++ b/assets/js/8a6fc2ec.f5b11d20.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22154],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),s=p(r),h=a,m=s["".concat(u,".").concat(h)]||s[h]||c[h]||l;return r?n.createElement(m,o(o({ref:t},d),{},{components:r})):n.createElement(m,o({ref:t},d))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=h;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:a,o[1]=i;for(var p=2;p<l;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},82391:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-01-19-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-01-19-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-19-ledger.md",source:"@site/blog/2023-01-19-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-01-19T00:00:00.000Z",formattedDate:"January 19, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.665,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-01-19-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-01-20-sre"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-01-14-db-sync"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Restructuring the ledger state",id:"restructuring-the-ledger-state",level:3},{value:"PDF hosting",id:"pdf-hosting",level:3},{value:"Powering the new ledger API",id:"powering-the-new-ledger-api",level:3},{value:"Constraint-based generators",id:"constraint-based-generators",level:3},{value:"Technical debt",id:"technical-debt",level:3}],d={toc:p},s="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The ledger team completed some preliminary ground work in preparation for CIP-1694\n(restructuring the ledger state),\nfixed the PDF hosting problem (mostly the formal specs),\nbuilt out more of the new user-friendly ledger API,\nfinished a proof of concept for constraint-based generators for property tests\n(with the hopes of being able to replace our trace generators one day),\nand addressed technical debt."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("h3",{id:"restructuring-the-ledger-state"},"Restructuring the ledger state"),(0,a.kt)("p",null,"The existing governance structures will be replace in the conway ledger era,\nas described in CIP-1694.\nIn particular, the ledger rules will be restructured as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"}," BBODY\n |\n |-------------------------------|\n v v\n TICK LEDGERS\n | |\n |---------| |\n v v v\n RUPD ~NEWEPOCH~ ~LEDGER~\n | |\n |----------| |--------|-------------------|-----------|\n v v v v v\n ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+\n | | |\n |---------|------------| v |\n v v v DELPL v\n SNAP POOLREAP -UPEC- | UTXO\n |--------| |\n v v v\n POOL DELEG ~UTXOS~\n\n-..- Removed\n+..+ Added\n~..~ Modified\n")),(0,a.kt)("p",null,"Moreover, the ledger state will also be restructured in accordance with the new rules.\nIn the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT.\nWe have also adapted all the data structures in the ledger state."),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3216"},"pull-3216"))),(0,a.kt)("h3",{id:"pdf-hosting"},"PDF hosting"),(0,a.kt)("p",null,"We now build all of our PDFs using a GitHub action which is triggered by pushing a tag\nwith a specific form, ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-ledger-spec-YYYY-MM-DD"),".\nThe action creates a GitHub release containing the PDFs.\nThe links in the main ledger README now point to the PDFs in the latest release."),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3245"},"pull-3245")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3260"},"pull-3260"))),(0,a.kt)("h3",{id:"powering-the-new-ledger-api"},"Powering the new ledger API"),(0,a.kt)("p",null,"We have now removed all the ",(0,a.kt)("inlineCode",{parentName:"p"},"HasField")," instances from the protocol parameter data types,\nand replaced them with lenses.\nThis is probably the last major restructuring that the ledger team will do on the code base\nfor the API for a while\n(the Plutus tools team will be working on it next, see ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/5"},"here"),").\nWe also added a new helpful function ",(0,a.kt)("inlineCode",{parentName:"p"},"ensureMinCoinTxOut"),"."),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3242"},"pull-3242")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3248"},"pull-3248"))),(0,a.kt)("h3",{id:"constraint-based-generators"},"Constraint-based generators"),(0,a.kt)("p",null,"Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks\nwhich span several epochs, mimicking a real network.\nThese tests are, in theory, excellent for checking properties.\nThey are, however, very difficult to maintain and are not as random as we would like\n(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks)."),(0,a.kt)("p",null,"We would like to switch to tests which instead generate a random ledger state representative\nof not just an initial state, generate a single random valid block, and then test our properties.\nThe hope is that these will be much more random and easier to maintain."),(0,a.kt)("p",null,"We have finished a proof of concept are encouraged that this approach could work!"),(0,a.kt)("p",null,"See:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"))),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3244"},"pull-3244")," massive CI speedup"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3249"},"pull-3249")," better types for fees in the protocol parameters"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3264"},"pull-3264")," move our annotator code to the ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-ledger-binary")," package where it belongs"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3239"},"pull-3239")," move the ",(0,a.kt)("inlineCode",{parentName:"li"},"Wdrls")," type to the ",(0,a.kt)("inlineCode",{parentName:"li"},"Core")," module.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8a766cbb.70e76067.js b/assets/js/8a766cbb.70e76067.js new file mode 100644 index 00000000000..33fda96f6fc --- /dev/null +++ b/assets/js/8a766cbb.70e76067.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24212],{4627:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/tags/consensus","allTagsPath":"/cardano-updates/tags","count":32}')}}]); \ No newline at end of file diff --git a/assets/js/8b4d9039.1f86965b.js b/assets/js/8b4d9039.1f86965b.js new file mode 100644 index 00000000000..8d3d4c0597c --- /dev/null +++ b/assets/js/8b4d9039.1f86965b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55202],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(n),m=a,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var l=2;l<o;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},81007:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-04-19-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-04-19-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-19-consensus.md",source:"@site/blog/2023-04-19-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-04-19T00:00:00.000Z",formattedDate:"April 19, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.77,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-04-19-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-20-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-19-performance-and-tracing"}},c={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This week the consensus team continued working on the improved DB lock mechanism\nfor UTxO-HD, and modifications to the mempool benchmarks that this prototype\nrequires."),(0,a.kt)("p",null,"On the Genesis front we validated that the fragment size calculation in\n",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch")," is a major performance sink for ChainSync Jumping. By removing it\nwe will get performance that is acceptably close to that of the baseline. We\nalso started investigating a performance fix that does not alter the existing\nbaseline behavior too much. In addition we reviewed our Genesis attack vector\ncalculations."),(0,a.kt)("p",null,"On the support front we released Consensus 0.4, and we are working on improving\nour release process, to support the Cardano-wide efforts in this area. We also\nperformed an analysis on the number of file descriptors that consensus use. This\ninformation can be used by the node operators to check if the number of file\ndescriptors they want to support are enough."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8bfc66fb.c75678d4.js b/assets/js/8bfc66fb.c75678d4.js new file mode 100644 index 00000000000..ba0ae60c600 --- /dev/null +++ b/assets/js/8bfc66fb.c75678d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15623],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||i;return r?n.createElement(h,o(o({ref:t},s),{},{components:r})):n.createElement(h,o({ref:t},s))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<i;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},69907:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-07-07-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-07-07-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-crypto.md",source:"@site/blog/2023-07-07-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.795,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-07-07-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-07-12-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-07-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"kes_agent",id:"kes_agent",level:3},{value:"Mithril",id:"mithril",level:3},{value:"Sidechains",id:"sidechains",level:3},{value:"CIPs and community",id:"cips-and-community",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Sidechains: First version of snark-based ATMS"),(0,a.kt)("li",{parentName:"ul"},"mithril: Full node verifier"),(0,a.kt)("li",{parentName:"ul"},"kes_agent: Keep progress, and prepare CIP and CPS"),(0,a.kt)("li",{parentName:"ul"},"CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP")),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("h3",{id:"kes_agent"},"kes_agent"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"KES Agent CIP/CSP. Preparing documents. Will become public in the future."),(0,a.kt)("li",{parentName:"ul"},"KES Agent testsuite (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/14"},"https://github.com/input-output-hk/kes-agent/issues/14"),")"),(0,a.kt)("li",{parentName:"ul"},"RawBearer abstraction in ouroboros-network-framework (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395"},"https://github.com/input-output-hk/ouroboros-network/pull/4395"),")"),(0,a.kt)("li",{parentName:"ul"},"Maintaining required changes to cardano-base for KES Agent (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"https://github.com/input-output-hk/cardano-base/pull/317"),")")),(0,a.kt)("h3",{id:"mithril"},"Mithril"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Final review of the implementation of Full Node Verifier ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"),".\nIncluded benchmarks and further tests.")),(0,a.kt)("h3",{id:"sidechains"},"Sidechains"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Schnorr signature implemented"),(0,a.kt)("li",{parentName:"ul"},"ATMS signature implemented"),(0,a.kt)("li",{parentName:"ul"},"First benchmarks show that for the committe size we expect, we need 2^21 constraints. ")),(0,a.kt)("h3",{id:"cips-and-community"},"CIPs and community"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Addressed some review comments in ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/506"},"#PR506")),(0,a.kt)("li",{parentName:"ul"},"Worked with the communityt on ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/524"},"#PR524")," to include Keccak as part of the next Plutus release.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8c574ba2.ca3a46e5.js b/assets/js/8c574ba2.ca3a46e5.js new file mode 100644 index 00000000000..5c0ed537690 --- /dev/null +++ b/assets/js/8c574ba2.ca3a46e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78183],{60540:a=>{a.exports=JSON.parse('{"label":"performance-tracing","permalink":"/cardano-updates/quarterly/tags/performance-tracing","allTagsPath":"/cardano-updates/quarterly/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/8c6dbeca.57f339f6.js b/assets/js/8c6dbeca.57f339f6.js new file mode 100644 index 00000000000..6f52ee0490c --- /dev/null +++ b/assets/js/8c6dbeca.57f339f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96162],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(r),d=i,g=c["".concat(u,".").concat(d)]||c[d]||m[d]||n;return r?a.createElement(g,o(o({ref:t},p),{},{components:r})):a.createElement(g,o({ref:t},p))}));function g(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var s=2;s<n;s++)o[s]=r[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},32688:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Crypto Team Update",slug:"2023-02-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-17-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-crypto.md",source:"@site/blog/2023-02-17-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.43,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-02-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-02-21-db-sync"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-17-goedel"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"MuSig2",id:"musig2",level:3}],p={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,i.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration."),(0,i.kt)("li",{parentName:"ul"},"cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus."),(0,i.kt)("li",{parentName:"ul"},"KES agent: using snockets and making things testable in IOSim"),(0,i.kt)("li",{parentName:"ul"},"MuSig2: started implementation in rust.")),(0,i.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,i.kt)("h3",{id:"mithril"},"Mithril"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Transmute helpers merged ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/722"},"PR#722")),(0,i.kt)("li",{parentName:"ul"},"We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope. "),(0,i.kt)("li",{parentName:"ul"},"We are working in a modification of KES to require caller to allocate the secret key buffer."),(0,i.kt)("li",{parentName:"ul"},"Proposed a solution for signer registration of ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/wiki/Mithril-registration-procedure#cost"},"Mithril"),".")),(0,i.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus/tree/kwxm/BLS12_381/prototype/plutus-benchmark/bls-benchmarks"},"proof"),".",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Results are promising, with using only 23% of the execution budget to verify a realistic proof. "),(0,i.kt)("li",{parentName:"ul"},"Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril."))),(0,i.kt)("li",{parentName:"ul"},"KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this."),(0,i.kt)("li",{parentName:"ul"},"Conversion finally merged ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/344"},"PR#344"),".")),(0,i.kt)("h3",{id:"kes-agent"},"KES agent"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation"),(0,i.kt)("li",{parentName:"ul"},"Figuring out how to go from fake file descriptor to write the raw bytes")),(0,i.kt)("h3",{id:"musig2"},"MuSig2"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8c75942c.5e08e3a4.js b/assets/js/8c75942c.5e08e3a4.js new file mode 100644 index 00000000000..cb8afdde6ce --- /dev/null +++ b/assets/js/8c75942c.5e08e3a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3530],{3905:(e,t,r)=>{r.d(t,{Zo:()=>h,kt:()=>c});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},h=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(r),d=i,c=s["".concat(p,".").concat(d)]||s[d]||m[d]||n;return r?a.createElement(c,o(o({ref:t},h),{},{components:r})):a.createElement(c,o({ref:t},h))}));function c(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:i,o[1]=l;for(var u=2;u<n;u++)o[u]=r[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},6905:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-02-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-09-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-09-mithril.md",source:"@site/blog/2023-02-09-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-02-09T00:00:00.000Z",formattedDate:"February 9, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.01,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-02-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-10-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-08-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(s,(0,a.Z)({},h,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team released a new ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2304.1"},(0,i.kt)("inlineCode",{parentName:"a"},"2304.1"))," distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store."),(0,i.kt)("p",null,"Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version ",(0,i.kt)("inlineCode",{parentName:"p"},"1.35.5")," on their ",(0,i.kt)("inlineCode",{parentName:"p"},"devnet")," and infrastructure."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2304.1"},(0,i.kt)("inlineCode",{parentName:"a"},"2304.1"))),(0,i.kt)("li",{parentName:"ul"},"Fixed a bug that prevented some signers to sign with ",(0,i.kt)("inlineCode",{parentName:"li"},"2304.0-prerelease")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/716"},"#716")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an ",(0,i.kt)("inlineCode",{parentName:"li"},"EraChecker")," that checks if an era is active ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/708"},"#708")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an ",(0,i.kt)("inlineCode",{parentName:"li"},"EraReader")," that gathers era activation data ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/709"},"#709")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an ",(0,i.kt)("inlineCode",{parentName:"li"},"EraReader")," adapter with on chain transaction as source ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/710"},"#710")),(0,i.kt)("li",{parentName:"ul"},"Completed the relational design of the aggregator store ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/476"},"#476")),(0,i.kt)("li",{parentName:"ul"},"Completed adding a new SPO on the ",(0,i.kt)("inlineCode",{parentName:"li"},"testing-preview")," network ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/729"},"#729")),(0,i.kt)("li",{parentName:"ul"},"Completed the upgrade of the Cardano node to ",(0,i.kt)("inlineCode",{parentName:"li"},"1.35.5")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/725"},"#725")),(0,i.kt)("li",{parentName:"ul"},"Fixed flakiness in the CI ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/734"},"#734"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8ccf5d9f.108f5ee1.js b/assets/js/8ccf5d9f.108f5ee1.js new file mode 100644 index 00000000000..8d00e7e2e61 --- /dev/null +++ b/assets/js/8ccf5d9f.108f5ee1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[66649],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),h=n,m=c["".concat(u,".").concat(h)]||c[h]||d[h]||o;return r?a.createElement(m,i(i({ref:t},s),{},{components:r})):a.createElement(m,i({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}h.displayName="MDXCreateElement"},78367:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-10-14-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-14-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-14-ledger.md",source:"@site/blog/2022-10-14-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-10-14T00:00:00.000Z",formattedDate:"October 14, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.03,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-10-14-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-14-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-05-consensus"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Completed Technical Debt",id:"completed-technical-debt",level:3},{value:"In-progress Technical Debt",id:"in-progress-technical-debt",level:3}],s={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The ledger team is still primarily focused on addressing\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues?q=is%3Aissue+is%3Aopen+label%3A%22%3Acredit_card%3A+technical-debt%22"},"technical"),"\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/3"},"debt"),".\nWe now have the infrastructure for versioning our serialization schemes,\nwhich we continue to put into action.\nWe have made first steps towards getting proper support for the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger repository"),"\n(in particular, we've added nix builds and\ncontinuous integration support).\nWe are wrapping up an investigation of the performance of a critical\nfunction used by the consensus layer for leader checks.\nFinally, we are improving the packaging and versioning of our code."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"completed-technical-debt"},"Completed Technical Debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of\nour code lives in the ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-ledger-shelley")," package, though with hindsight we can say that\nmuch of it should live in ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-ledger-core"),".\nWe continue to move things to ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-ledger-core"),", and have much more to come. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3059"},"pull-3059"),"]"),(0,n.kt)("li",{parentName:"ul"},"We now have the infrastructure to support ",(0,n.kt)("strong",{parentName:"li"},"versioned")," serialization schemes.\nThe inability to do this has caused us a lot difficulties,\nsuch as [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3003"},"issue-3003"),"], [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2965"},"issue-2965"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2444"},"issue-2444"),"].\nWe are still in the process of switching to the versioned serialization scheme\n(such as [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3078"},"pull-3078"),"]),\nbut the infrastructure was completed in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3063"},"pull-3063"),"]."),(0,n.kt)("li",{parentName:"ul"},"We now have proper nix and CI support for the formal ledger project. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/19"},"pull-19"),"]"),(0,n.kt)("li",{parentName:"ul"},"A separate team is helping bring support for\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP"),"\nto all the cardano-node repositories.\nWe have been helping out with this effort.")),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A separate team continues working on upgrading all the\ncardano-node repositories to work with ghc 9.2.4.\nWe have been helping out with this effort.")),(0,n.kt)("h3",{id:"in-progress-technical-debt"},"In-progress Technical Debt"),(0,n.kt)("p",null,"We also have several fairly large pull-requests in review\nthat we are working on."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"In an on-going attempt to build out a more user-friendly API,\nwe continue to remove ",(0,n.kt)("inlineCode",{parentName:"li"},"HasField")," instances in place of using micro-lenses.\nThe protocol parameters, in particular, are being worked on. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3045"},"pull-3045"),"]"),(0,n.kt)("li",{parentName:"ul"},"We are also renaming record fields to be consistent across the repository. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3062"},"pull-3062"),"]"),(0,n.kt)("li",{parentName:"ul"},"We are now cleaning up all the work we did to understand the performance\nof the TICKF transition. We have some improvements to the computatation\nas well. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3068"},"pull-3068"),"]"),(0,n.kt)("li",{parentName:"ul"},"We are adding more documentation, in particular to our ",(0,n.kt)("inlineCode",{parentName:"li"},"Twiddler")," functionality. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3073"},"pull-3073"),"]"),(0,n.kt)("li",{parentName:"ul"},"The formal ledger is adding support for finite set theory. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/20"},"pull-20"),"]")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8cd47ea9.cf455658.js b/assets/js/8cd47ea9.cf455658.js new file mode 100644 index 00000000000..baf19e04096 --- /dev/null +++ b/assets/js/8cd47ea9.cf455658.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58628],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(a),h=n,m=u["".concat(p,".").concat(h)]||u[h]||d[h]||i;return a?r.createElement(m,o(o({ref:t},c),{},{components:a})):r.createElement(m,o({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<i;s++)o[s]=a[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},31550:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2022-10-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-10-21-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-21-hydra.md",source:"@site/blog/2022-10-21-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-10-21T00:00:00.000Z",formattedDate:"October 21, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.97,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-10-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-10-27-crypto"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-19-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],c={toc:s},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team reviewed and addressed several open comments on the\nnew HeadV1 specification, completing a list the of identified gaps between\nspecification and implementation while doing so. In the wake of the recent\ndemonstration of SundaeSwap running their DEX in a Hydra Head, they met with\nthem to capture feature ideas & incorporate their feedback on the roadmap, as\nwell as potential research avenues."),(0,n.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Had the monthly review meeting, a bit earlier than expected: ",(0,n.kt)("a",{parentName:"li",href:"https://input-output.atlassian.net/wiki/spaces/HYDRA/pages/3650813953/Monthly+report+-+October+2022"},"https://input-output.atlassian.net/wiki/spaces/HYDRA/pages/3650813953/Monthly+report+-+October+2022")),(0,n.kt)("li",{parentName:"ul"},"Reviewed and addressed several open comments on HeadV1 specification."),(0,n.kt)("li",{parentName:"ul"},"Completed the list of identified gaps between specification and implementation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Had two meetings with SundaeSwap to incorporate their feedback (on research and on the roadmap)."),(0,n.kt)("li",{parentName:"ul"},"Some small fixes on TUI and our docker images. ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/538"},"#538")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/562"},"#562")),(0,n.kt)("li",{parentName:"ul"},"Met with the internal audit team and clarified scope.")),(0,n.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete the last two items required for a version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.8.0"),"."),(0,n.kt)("li",{parentName:"ul"},"Cut the next release, version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.8.0")),(0,n.kt)("li",{parentName:"ul"},"Get backup/recovery ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/187"},"#187")," done with proper event sourcing (ADR18)"),(0,n.kt)("li",{parentName:"ul"},"Have the CI build macos artifacts")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d0075ff.7598228c.js b/assets/js/8d0075ff.7598228c.js new file mode 100644 index 00000000000..9673c793f79 --- /dev/null +++ b/assets/js/8d0075ff.7598228c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[99750],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),d=o,m=c["".concat(u,".").concat(d)]||c[d]||h[d]||a;return n?r.createElement(m,s(s({ref:t},p),{},{components:n})):r.createElement(m,s({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:o,s[1]=i;for(var l=2;l<a;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},65389:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-09-20-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-20-consensus.md",source:"@site/blog/2023-09-20-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-09-20T00:00:00.000Z",formattedDate:"September 20, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.82,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-22-performance-and-tracing"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-20-mithril"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Support",id:"support",level:3}],p={toc:l},c="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks.\nWe are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough.\nOn the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain.\nWe also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway."),(0,o.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/349"},"349"),"). System level benchmark results are pending."),(0,o.kt)("li",{parentName:"ul"},"Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"344"),"), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run."),(0,o.kt)("li",{parentName:"ul"},"We also brought the ",(0,o.kt)("inlineCode",{parentName:"li"},"UTxO-HD")," branch up to date with node version ",(0,o.kt)("inlineCode",{parentName:"li"},"8.4.0"),".")),(0,o.kt)("h3",{id:"genesis"},"Genesis"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain.\nWe are now drafting the final self-contained argument. (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4157"},"4157"),")")),(0,o.kt)("h3",{id:"support"},"Support"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We debugged a bad parameter update on the ",(0,o.kt)("inlineCode",{parentName:"li"},"Babbage")," to ",(0,o.kt)("inlineCode",{parentName:"li"},"Conway")," transition in the SanchoNet testnet (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/339"},"339"),").\nA superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/340"},"340"),", ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/354"},"354"),", and ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/355"},"355"),")\nHowever we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ",(0,o.kt)("inlineCode",{parentName:"li"},"ConsensusProtocol")," type class and the ",(0,o.kt)("inlineCode",{parentName:"li"},"HardForkBlock")," combinator (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/345"},"345")," and ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/346"},"346"),"). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d209506.e4591885.js b/assets/js/8d209506.e4591885.js new file mode 100644 index 00000000000..2744533c84c --- /dev/null +++ b/assets/js/8d209506.e4591885.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32936],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(a),m=n,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||i;return a?r.createElement(h,o(o({ref:t},p),{},{components:a})):r.createElement(h,o({ref:t},p))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<i;s++)o[s]=a[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},58373:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Crypto Team Update",slug:"2023-01-20-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-20-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-crypto.md",source:"@site/blog/2023-01-20-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-01-20-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-01-25-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-20-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3}],p={toc:s},c="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: We explored whether some uses of ",(0,n.kt)("inlineCode",{parentName:"li"},"transmute")," could be removed, but it resulted in considerable regression. "),(0,n.kt)("li",{parentName:"ul"},"cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: An inconsistency between ",(0,n.kt)("inlineCode",{parentName:"li"},"contra-tracer")," available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the ",(0,n.kt)("inlineCode",{parentName:"li"},"contra-tracer")," used by consensus. ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/675"},"PR#675"),". We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing. "),(0,n.kt)("li",{parentName:"ul"},"We are writing a RFP for the audit of the core library. ")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A problem with Nix is blocking merge of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#341")),(0,n.kt)("li",{parentName:"ul"},"Plutus team ran ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus/blob/kwxm/BLS12_381/prototype/plutus-benchmark/bls-benchmarks/Main.hs"},"benchmarks")," of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution."),(0,n.kt)("li",{parentName:"ul"},"Team is fully digesting the Plonk paper. "),(0,n.kt)("li",{parentName:"ul"},"There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used. ")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A little unforseen delay has been caused by a mismatch in the use of ",(0,n.kt)("inlineCode",{parentName:"li"},"contra-tracer"),". The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255/commits/39b2d9473aa296976825248360a73cf066065431"},"doing the change"),", but still the CI is not happy."),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317/commits/39b2d9473aa296976825248360a73cf066065431"},"same")," was needed for the KES agents prerequisites ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"PR#317"),"."),(0,n.kt)("li",{parentName:"ul"},"We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d306cf9.aa58ca4c.js b/assets/js/8d306cf9.aa58ca4c.js new file mode 100644 index 00000000000..9ef89605bd3 --- /dev/null +++ b/assets/js/8d306cf9.aa58ca4c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18144],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(r),c=n,d=m["".concat(s,".").concat(c)]||m[c]||h[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},9865:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-11-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-01-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-01-mithril.md",source:"@site/blog/2023-11-01-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-01T00:00:00.000Z",formattedDate:"November 1, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.895,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-01-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-27-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},m="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the ",(0,n.kt)("inlineCode",{parentName:"p"},"release-mainnet")," aggregator."),(0,n.kt)("p",null,"Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P Networking - Proof of Concept")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Build ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-common")," and ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," in WASM PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1284"},"#1284")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Fix ",(0,n.kt)("inlineCode",{parentName:"strong"},"devnet")," Mithril Docker images")," ","[#1272]","(",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1272"},"https://github.com/input-output-hk/mithril/issues/1272")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1311"},"#1311")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano UTxO set PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Client regressions in snapshot list and download")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1321"},"#1321"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d3da32e.efff0598.js b/assets/js/8d3da32e.efff0598.js new file mode 100644 index 00000000000..d1b05c2aba0 --- /dev/null +++ b/assets/js/8d3da32e.efff0598.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[84877],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),p=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(r),m=n,h=c["".concat(s,".").concat(m)]||c[m]||d[m]||o;return r?a.createElement(h,l(l({ref:t},u),{},{components:r})):a.createElement(h,l({ref:t},u))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var p=2;p<o;p++)l[p]=r[p];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},92122:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Node Release Team Update",slug:"2022-11-02-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-11-02-release",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-release.md",source:"@site/blog/2022-11-02-release.md",title:"Node Release Team Update",description:"Node Reelease Update",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:.445,hasTruncateMarker:!1,authors:[{name:"Samuel Leathers",title:"Service Reliability Manager",url:"https://github.com/disassembler",imageURL:"https://github.com/disassembler.png",key:"disassembler"}],frontMatter:{title:"Node Release Team Update",slug:"2022-11-02-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-02-node-cli-api"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-11-02-system-test"}},s={authorsImageUrls:[void 0]},p=[{value:"Node Reelease Update",id:"node-reelease-update",level:2},{value:"2022-10-19 - 2022-11-02",id:"2022-10-19---2022-11-02",level:2},{value:"Executive Summary",id:"executive-summary",level:3},{value:"Completed",id:"completed",level:3},{value:"In Progress",id:"in-progress",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"node-reelease-update"},"Node Reelease Update"),(0,n.kt)("h2",{id:"2022-10-19---2022-11-02"},"2022-10-19 - 2022-11-02"),(0,n.kt)("h3",{id:"executive-summary"},"Executive Summary"),(0,n.kt)("p",null,"The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset,\na temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8."),(0,n.kt)("p",null,"1.35.4 release candidates have been created and are being tested internally and externally."),(0,n.kt)("h3",{id:"completed"},"Completed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/commits/1.35.4-rc1"},"1.35.4-rc1 tag")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/commits/1.35.4-rc1"},"1.35.4-rc2 tag (config changes only for preview)")),(0,n.kt)("li",{parentName:"ul"},"[CHaP Migration]"," (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4540"},"https://github.com/input-output-hk/cardano-node/pull/4540"),")")),(0,n.kt)("h3",{id:"in-progress"},"In Progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/commits/release/1.35"},"Release 1.35.4")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.4_rc1/src_docs/source/test_results/node/tag_1_35_4_rc1.rst"},"Test Status")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-updates/2022-08-12-sre"},"Cicero CI Migration")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8e410d22.c34ee40e.js b/assets/js/8e410d22.c34ee40e.js new file mode 100644 index 00000000000..00508033219 --- /dev/null +++ b/assets/js/8e410d22.c34ee40e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25272],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>d});var a=i(67294);function n(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?r(Object(i),!0).forEach((function(t){n(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,a,n=function(e,t){if(null==e)return{};var i,a,n={},r=Object.keys(e);for(a=0;a<r.length;a++)i=r[a],t.indexOf(i)>=0||(n[i]=e[i]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)i=r[a],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},h=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var i=e.components,n=e.mdxType,r=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(i),c=n,d=u["".concat(p,".").concat(c)]||u[c]||m[c]||r;return i?a.createElement(d,o(o({ref:t},h),{},{components:i})):a.createElement(d,o({ref:t},h))}));function d(e,t){var i=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=i.length,o=new Array(r);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<r;s++)o[s]=i[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,i)}c.displayName="MDXCreateElement"},54212:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var a=i(87462),n=(i(67294),i(3905));const r={title:"Mithril Team Update",slug:"2023-03-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-23-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-23-mithril.md",source:"@site/blog/2023-03-23-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-03-23T00:00:00.000Z",formattedDate:"March 23, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.615,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-03-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-03-23-db-sync"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-22-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:s},u="wrapper";function m(e){let{components:t,...i}=e;return(0,n.kt)(u,(0,a.Z)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team released a new ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2310.0"},(0,n.kt)("inlineCode",{parentName:"a"},"2310.0"))," distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images."),(0,n.kt)("p",null,"Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano ",(0,n.kt)("inlineCode",{parentName:"p"},"mainnet")," and they have fixed some bugs. "),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the epic that implements eras behavior switch ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/707"},"#707"),":",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Completed handling the API version switch at era transition ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/727"},"#727")))),(0,n.kt)("li",{parentName:"ul"},"Worked on the epic that implements a relational store in the aggregator ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Completed on the migration/adaptation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"stake_pool")," table ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/787"},"#787")),(0,n.kt)("li",{parentName:"ul"},"Worked on the migration/adaptation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"epoch_settings")," table ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/813"},"#813")),(0,n.kt)("li",{parentName:"ul"},"Worked on the migration/adaptation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"signed-entity-type")," table ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/815"},"#815")),(0,n.kt)("li",{parentName:"ul"},"Completed the creation of a stake distribution service ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/799"},"#799")))),(0,n.kt)("li",{parentName:"ul"},"Completed the testing of Mithril with Cardano ",(0,n.kt)("inlineCode",{parentName:"li"},"mainnet")," network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/777"},"#777")),(0,n.kt)("li",{parentName:"ul"},"Completed qualifying the computation of the stake distribution ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/810"},"#810")),(0,n.kt)("li",{parentName:"ul"},"Completed the testing of the Docker client in the ",(0,n.kt)("inlineCode",{parentName:"li"},"Mithril Client multi-platform test")," workflow ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/794"},"#794")),(0,n.kt)("li",{parentName:"ul"},"Worked on bugs and optimizations:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Fixed a bug that made computation of the stake distribution occur multiple times during an epoch ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/804"},"#804")),(0,n.kt)("li",{parentName:"ul"},"Fixed a bug that created deadlocks on the SQLite connection ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/807"},"#807")),(0,n.kt)("li",{parentName:"ul"},"Optimized the error message and the behavior of the signer node when KES keys have expired ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/820"},"#820")),(0,n.kt)("li",{parentName:"ul"},"Upgraded the infrastructure of the ",(0,n.kt)("inlineCode",{parentName:"li"},"testing-preview")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"pre-release-preview")," networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/801"},"#801")),(0,n.kt)("li",{parentName:"ul"},"Re-genesis of the ",(0,n.kt)("inlineCode",{parentName:"li"},"testing-preview")," network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/803"},"#803")),(0,n.kt)("li",{parentName:"ul"},"Re-genesis of the ",(0,n.kt)("inlineCode",{parentName:"li"},"pre-release-preview")," network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/818"},"#818"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8ed15298.d65354c1.js b/assets/js/8ed15298.d65354c1.js new file mode 100644 index 00000000000..d04ee12d635 --- /dev/null +++ b/assets/js/8ed15298.d65354c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[9928],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function o(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,c=o(t,["components","mdxType","originalType","parentName"]),d=u(a),h=r,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||i;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[d]="string"==typeof t?t:r,l[1]=o;for(var u=2;u<i;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},5378:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-07-04-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-07-04-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-04-node-cli-api.md",source:"@site/blog/2023-07-04-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-07-04T00:00:00.000Z",formattedDate:"July 4, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.495,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-07-04-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-07-04-db-sync"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-30-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},d="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-06-21---2023-07-04"},"2023-06-21 - 2023-07-04"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Started integration of conway era into the cardano-api,"),(0,r.kt)("li",{parentName:"ul"},'Pre-release of cardano-cli 8.2.1 which enables creating goveranance "Update constitution" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.'),(0,r.kt)("li",{parentName:"ul"},"Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities."),(0,r.kt)("li",{parentName:"ul"},"Continue refactoring cardano-testnet"),(0,r.kt)("li",{parentName:"ul"},"CI and docs house keeping on the new cardnao-cli and cardano-api repositories")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/60"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.7.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/44"},"Release 8.2.1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/39"},"Use new function-based API instead of using query data types directly"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/94"},"Release cardano-api 8.7")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/92"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.6.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/90"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.2.0.0.1.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/88"},"Backport: Add era phantom type parameter to Certificate")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/86"},"Parameterise ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate")," type with phantom ",(0,r.kt)("inlineCode",{parentName:"a"},"era")," type argument")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/85"},"Voting procedure and proposal procedure updates")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/84"},"Parameterise ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate")," with ",(0,r.kt)("inlineCode",{parentName:"a"},"era"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/83"},"Parameterise ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate")," type with phantom ",(0,r.kt)("inlineCode",{parentName:"a"},"era")," type argument")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/79"},"Add contributing guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/77"},"Unified ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra")," constraint summoning")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/70"},"Update CHaP index")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/41"},"CIP-1694 API - Part 1"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5356"},"cardano-node top level error handler")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5353"},"Turn on some traces by default"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5364"},"Report payment address and UTxOs in testnets")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5362"},"New Conway ",(0,r.kt)("inlineCode",{parentName:"a"},"stake-snapshot")," tests"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/79"},"Add contributing guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/33"},"Release workflow description")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5353"},"Turn on some traces by default"))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/75"},"Add PR changelog check")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/71"},"Fix stylish haskell in github action workflow")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/62"},"Enable CI on PRs from forks")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/53"},"Remove merge_group trigger from changelog check CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/46"},"Add PR changelog check. Add core-tech group to GHA description codeowners.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/41"},"Fix stylish haskell in github action workflow")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/40"},"Enable CI in PRs from forks")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/48"},"Add contributing guide"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8f7e10a3.d241f9ad.js b/assets/js/8f7e10a3.d241f9ad.js new file mode 100644 index 00000000000..541dd950e2d --- /dev/null +++ b/assets/js/8f7e10a3.d241f9ad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72033],{79573:a=>{a.exports=JSON.parse('{"title":"Tutorial - Basics","description":"5 minutes to learn the most important Docusaurus concepts.","slug":"/category/tutorial---basics","permalink":"/cardano-updates/docs/category/tutorial---basics","navigation":{"previous":{"title":"Tutorial Intro","permalink":"/cardano-updates/docs/intro"},"next":{"title":"Create a Page","permalink":"/cardano-updates/docs/tutorial-basics/create-a-page"}}}')}}]); \ No newline at end of file diff --git a/assets/js/8fddd37c.2e76cb01.js b/assets/js/8fddd37c.2e76cb01.js new file mode 100644 index 00000000000..e96abea0590 --- /dev/null +++ b/assets/js/8fddd37c.2e76cb01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25778],{55797:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/26","page":26,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/25","nextPage":"/cardano-updates/page/27","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/8fe062a7.d7311ede.js b/assets/js/8fe062a7.d7311ede.js new file mode 100644 index 00000000000..77812fc1354 --- /dev/null +++ b/assets/js/8fe062a7.d7311ede.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21597],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=s(a),d=n,g=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return a?r.createElement(g,l(l({ref:t},u),{},{components:a})):r.createElement(g,l({ref:t},u))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var s=2;s<o;s++)l[s]=a[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},17331:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-10-27-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-10-27-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-sre.md",source:"@site/blog/2023-10-27-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-10-27T00:00:00.000Z",formattedDate:"October 27, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.405,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-10-27-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-27-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-25-mithril"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3}],u={toc:s},c="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground")," stack")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Adds offchain-metadata-tools, dbsync sanchonet updates: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/b197e22...b1f1cbd"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"General package updates, modules improvements and template recipes to support network migration from world to playground ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/17"},"cardano-parts-pull-17"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Bumps cardano-db-sync-ng to sancho-2-0-0 tag"),(0,n.kt)("li",{parentName:"ul"},"Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play"),(0,n.kt)("li",{parentName:"ul"},"Adds more machine system bins and devShell bins for scripting and debug purposes"),(0,n.kt)("li",{parentName:"ul"},"Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module"),(0,n.kt)("li",{parentName:"ul"},"Adds profile-cardano-node-topology module for a simplified interface to most common topology needs"),(0,n.kt)("li",{parentName:"ul"},"Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs"),(0,n.kt)("li",{parentName:"ul"},"Adds a topology function to filter self from group machines with an allowList for matching infixes"),(0,n.kt)("li",{parentName:"ul"},"Adds metadata-server and related offchain-metadata-tools bins from capkgs"),(0,n.kt)("li",{parentName:"ul"},"Updates justfile template with:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"a new query-all recipe for getting status of multiple concurrent running environments"),(0,n.kt)("li",{parentName:"ul"},"a new set-default-cardano-env recipe for fast switching between environments"),(0,n.kt)("li",{parentName:"ul"},"a new start-demo recipe for forking a custom env into conway"),(0,n.kt)("li",{parentName:"ul"},"a new start-node recipe for generic environment start"),(0,n.kt)("li",{parentName:"ul"},"a new stop-node recipe for generic environment stop"),(0,n.kt)("li",{parentName:"ul"},"updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions"),(0,n.kt)("li",{parentName:"ul"},"updated query-tip recipe to a generic query tip compatible with each environment")))))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migrates sanchonet from world, prepares further migration and support automation: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/4"},"cardano-playground-pull-4"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8fea44ca.9d9d62e9.js b/assets/js/8fea44ca.9d9d62e9.js new file mode 100644 index 00000000000..4a59f8a7503 --- /dev/null +++ b/assets/js/8fea44ca.9d9d62e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97517],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),c=o,m=d["".concat(l,".").concat(c)]||d[c]||h[c]||r;return n?a.createElement(m,s(s({ref:t},u),{},{components:n})):a.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=c;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:o,s[1]=i;for(var p=2;p<r;p++)s[p]=n[p];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}c.displayName="MDXCreateElement"},11611:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var a=n(87462),o=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2023-01-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-01-25-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-25-consensus.md",source:"@site/blog/2023-01-25-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-01-25T00:00:00.000Z",formattedDate:"January 25, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.27,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-01-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-26-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-01-25-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Support",id:"support",level:3}],u={toc:p},d="wrapper";function h(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"During the past two weeks, the consensus team finished the testing activities\naround the UTxO-HD prototype. This is a very important milestone which will\nenable us to run system-level tests and benchmarks, as well as start refactoring\nand cleaning the prototype. Regarding our Genesis workstream, we elaborated a\nroadmap that gives an indication of the remaining work. We also continued our\nwork on benchmarking chain-sync-jumping. We also continued working on improving\nthe way we handle blocks from the future, and advancing the integration of the\nnew VRF and KES crypto."),(0,o.kt)("h2",{id:"workstreams"},"Workstreams"),(0,o.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,o.kt)("p",null,"As the prototype is nearing its completion, it was important to have enough\nconfidence that we will be able to move additional parts of the ledger state\nonto disk. We worked together with the Ledger team to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4296"},"elaborate a\nsketch")," on how the UTxO-HD design would accommodate the migration of\nadditional data from memory to disk. This gave us enough confidence that the\ncurrent architecture will be extensible in the future."),(0,o.kt)("p",null,"On the testing front, we ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4274"},"added")," property-based tests for the UTxO-HD\ntype classes. "),(0,o.kt)("p",null,"We also ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4289"},"enabled disabled components"),", and addressed several\ntechnical debt issues:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Implement ",(0,o.kt)("inlineCode",{parentName:"li"},"splitSized")," anti-diff split (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4269"},"#4269"),"), and integrate it\ninto consensus (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4273"},"#4273"),")."),(0,o.kt)("li",{parentName:"ul"},"Renaming of ",(0,o.kt)("inlineCode",{parentName:"li"},"peekVal")," to ",(0,o.kt)("inlineCode",{parentName:"li"},"peekMDBVal")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/7"},"#7"),").")),(0,o.kt)("p",null,"We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We\nfound a race condition in the LMDB backing store, which ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4283"},"we fixed"),".\nAfter the fix we were able to successfully run these benchmarks. The results\nwere published by ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4295"},"this pull request"),"."),(0,o.kt)("p",null,"We used our ",(0,o.kt)("inlineCode",{parentName:"p"},"db-analyser")," tool to benchmark the cost of reading keys and\nflushing values to disk. The following plot shows the duration of these disk\noperation in relation to the main ledger operations, where we can see that the\ncost of the former are comparatively low. The spike at the beginning of the\ngraph is when, at the start of the Shelley era, the ",(0,o.kt)("em",{parentName:"p"},"entire")," UTxO set is flushed\nto disk."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"UTxO-HD read and flush benchmarks",src:n(90595).Z,width:"1600",height:"800"})),(0,o.kt)("p",null,"After months of hard work adding tests for the prototype, we are ready to run\nend-to-end tests on the node, and system level benchmarks. This signals a very\nimportant milestone for the UTxO-HD workstream \ud83c\udf89."),(0,o.kt)("h3",{id:"genesis"},"Genesis"),(0,o.kt)("p",null,"We elaborated a ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/blob/a626c84f6df585dd27d735eb7eec73904a1f570e/ouroboros-consensus/docs/2023-Jan-Genesis-roadmap.md"},"high-level decomposition")," of the remaining\nwork for Genesis. We also continued benchmarking the chain-sync-jumping\nhappy-path."),(0,o.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,o.kt)("p",null,"We continued working on improving the way we handle blocks from the future."),(0,o.kt)("h3",{id:"support"},"Support"),(0,o.kt)("p",null,"We completed the mapping of ",(0,o.kt)("inlineCode",{parentName:"p"},"Crypto")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"HeaderCrypto")," and body ",(0,o.kt)("inlineCode",{parentName:"p"},"Crypto"),".\n",(0,o.kt)("inlineCode",{parentName:"p"},"HeaderCrypto")," is moved to ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-protocol-tpraos"),". We created a draft ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3262"},"pull\nrequest")," to facilitate compiling consensus."))}h.isMDXComponent=!0},90595:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks-6b129a1acaa4bb48443ee81add51fd39.png"}}]); \ No newline at end of file diff --git a/assets/js/90bf9c2d.ecec42d7.js b/assets/js/90bf9c2d.ecec42d7.js new file mode 100644 index 00000000000..f615c092bed --- /dev/null +++ b/assets/js/90bf9c2d.ecec42d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32035],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>d});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,r,a=function(e,t){if(null==e)return{};var i,r,a={},n=Object.keys(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(i),c=a,d=s["".concat(p,".").concat(c)]||s[c]||m[c]||n;return i?r.createElement(d,o(o({ref:t},h),{},{components:i})):r.createElement(d,o({ref:t},h))}));function d(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,i)}c.displayName="MDXCreateElement"},91041:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-05-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-04-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-04-mithril.md",source:"@site/blog/2023-05-04-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-05-04T00:00:00.000Z",formattedDate:"May 4, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.56,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-05-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-05-node-cli-api"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-03-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...i}=e;return(0,a.kt)(s,(0,r.Z)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.7"),"."),(0,a.kt)("p",null,"Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implements generic signing/verification of entity services ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"Certifier")," service in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/850"},"#850")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the signable builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Mithril Stake Distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/851"},"#851")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the artifact builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Mithril Stake Distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/870"},"#870")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the signable builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Full Immutables Snapshot")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/852"},"#852")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the artifact builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Full Immutables Snapshot")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/871"},"#871")),(0,a.kt)("li",{parentName:"ul"},"Completed the adaptation of the aggregator runtime to use the signable builder service ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/853"},"#853")),(0,a.kt)("li",{parentName:"ul"},"Worked on the adaptation of the signer runtime to use the signable builder service ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/854"},"#854")),(0,a.kt)("li",{parentName:"ul"},"Completed the definition of the entity service interface for verification/restoration ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/868"},"#868")),(0,a.kt)("li",{parentName:"ul"},"Completed the refactoring of the ",(0,a.kt)("inlineCode",{parentName:"li"},"OpenMessage")," type ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/878"},"#878")))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic that simplifies the multi-signer in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/398"},"#398"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the extraction of the single signature registration from the multi-signer ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/643"},"#643")))),(0,a.kt)("li",{parentName:"ul"},"Completed the upgrade of the Cardano node to version ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35.7")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/881"},"#881")),(0,a.kt)("li",{parentName:"ul"},"Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/873"},"#873"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/90cc522f.bcba69c4.js b/assets/js/90cc522f.bcba69c4.js new file mode 100644 index 00000000000..44080a46e4d --- /dev/null +++ b/assets/js/90cc522f.bcba69c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75696],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(s,".").concat(c)]||d[c]||h[c]||o;return a?r.createElement(m,i(i({ref:t},u),{},{components:a})):r.createElement(m,i({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},73887:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-04-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-21-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-21-hydra.md",source:"@site/blog/2023-04-21-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-21T00:00:00.000Z",formattedDate:"April 21, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.26,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-21-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-27-hydra"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-04-21-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team worked on several fronts, including fixing state\nmachine continuity on-chain, discussing voting project solutions, exploring\nadding Hydra support to kupo, and improving API navigation with a sidebar. The\nteam also updated dependencies and fixed issues in their test suites. Moving\nforward, the team plans to hold the next monthly review meeting, address a user\nissue, prepare for the 0.10.0 release, and work on a dirt road fix for the\nrollbacks issue with proper test coverage."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixed scripts to enforce state machine continuity on-chain ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/777"},"#777"),"."),(0,n.kt)("li",{parentName:"ul"},"Took part in a twitter space on ",(0,n.kt)("a",{parentName:"li",href:"https://twitter.com/thepizzaknight_/status/1647833904282320896"},"\u201c","Scaling Cardano","\u201d"),"."),(0,n.kt)("li",{parentName:"ul"},"Joined a CBIA meeting to discuss Cardano network protocols & how to specify them."),(0,n.kt)("li",{parentName:"ul"},"Discussed potential solutions of ensuring vote uniqueness in the voting project."),(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to match ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node")," master to prepare for upcoming releases and hard-forks"),(0,n.kt)("li",{parentName:"ul"},"Explored adding Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/CardanoSolutions/kupo/pull/117"},"support to kupo"),", a lightweight Cardano chain indexer - some more work required."),(0,n.kt)("li",{parentName:"ul"},"Improved navigation of the API Reference with a sidebar, see ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/api-reference/"},"unstable API version"),"."),(0,n.kt)("li",{parentName:"ul"},"Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting (join via ",(0,n.kt)("a",{parentName:"li",href:"https://discord.gg/inputoutput?event=1097863746216538194"},"Discord")," or ",(0,n.kt)("a",{parentName:"li",href:"https://www.addevent.com/event/ck16794110"},"AddEvent"),") & report"),(0,n.kt)("li",{parentName:"ul"},"Dirt road fix for rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")," properly covered by a test."),(0,n.kt)("li",{parentName:"ul"},"Groom and ideally address user issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/823"},"#823"),"."),(0,n.kt)("li",{parentName:"ul"},"Put the spec into the repo ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693")," and prepare release 0.10.0.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/90f359c5.bdc4672e.js b/assets/js/90f359c5.bdc4672e.js new file mode 100644 index 00000000000..e98cd9826d7 --- /dev/null +++ b/assets/js/90f359c5.bdc4672e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[66891],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>h});var i=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,i,n=function(e,t){if(null==e)return{};var a,i,n={},r=Object.keys(e);for(i=0;i<r.length;i++)a=r[i],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i<r.length;i++)a=r[i],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=i.createContext({}),p=function(e){var t=i.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=p(e.components);return i.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=p(a),m=n,h=c["".concat(u,".").concat(m)]||c[m]||d[m]||r;return a?i.createElement(h,l(l({ref:t},s),{},{components:a})):i.createElement(h,l({ref:t},s))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,l=new Array(r);l[0]=m;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var p=2;p<r;p++)l[p]=a[p];return i.createElement.apply(null,l)}return i.createElement.apply(null,a)}m.displayName="MDXCreateElement"},83762:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>p});var i=a(87462),n=(a(67294),a(3905));const r={title:"SRE Team Update",slug:"2022-08-12-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2022-08-12-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-sre.md",source:"@site/blog/2022-10-28-sre.md",title:"SRE Team Update",description:"High level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:3.04,hasTruncateMarker:!1,authors:[{name:"Michael Fellinger",title:"SRE Team Lead",url:"https://github.com/manveru",imageURL:"https://github.com/manveru.png",key:"manveru"}],frontMatter:{title:"SRE Team Update",slug:"2022-08-12-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Team Update",permalink:"/cardano-updates/2022-10-28-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-10-27-crypto"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"OpenZiti",id:"openziti",level:3},{value:"Cicero & Tullia Integrations",id:"cicero--tullia-integrations",level:3},{value:"Cicero & Tullia Features",id:"cicero--tullia-features",level:3},{value:"Spongix",id:"spongix",level:3},{value:"Bugs",id:"bugs",level:3}],s={toc:p},c="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,i.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team is heavily working on the Equinix Metal migration, replacing Hydra\nwith Cicero, and a new version of Spongix."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"openziti"},"OpenZiti"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work is ongoing on our OpenZiti integration into Bitte in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte/compare/zt"},"bitte-zt"),"]."),(0,n.kt)("li",{parentName:"ul"},"CI-World deployment of Darwin CI Ziti service in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/commit/d40f4d19187a2128b6f0d63bde7e3f9a33071994"},"ci-world-commit-d40f4d"),"]."),(0,n.kt)("li",{parentName:"ul"},"Multiple issues filed, and a lot of discussion with the OpenZiti developers,\nwe're making pretty rapid progress thanks to them."),(0,n.kt)("li",{parentName:"ul"},"Work on getting Equinix baremetal machines integrated into AWS World Bitte\nclusters utilizing a Ziti ZTNA network overlay to bridge the networking of\nthe two environments and get IAM extension to Equinix machine for Nomad\nclient onboarding."),(0,n.kt)("li",{parentName:"ul"},"A Nix Flake for most of our OpenZiti dependencies including the Console,\nController, Edge Tunnel, and Router is now at [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/johnalotoski/openziti-bins"},"openziti-bins"),"]."),(0,n.kt)("li",{parentName:"ul"},"The Flake also includes a WiP NixOS modules for these components."),(0,n.kt)("li",{parentName:"ul"},"Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with\nno issues seen so far"),(0,n.kt)("li",{parentName:"ul"},"Moved the console to traefik routing service (",(0,n.kt)("inlineCode",{parentName:"li"},"zac.$DOMAIN"),") and\ncontroller/edge router stay at ",(0,n.kt)("inlineCode",{parentName:"li"},"zt.$DOMAIN"),", but have registered consul\nservices")),(0,n.kt)("h3",{id:"cicero--tullia-integrations"},"Cicero & Tullia Integrations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added webhook for [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/haskell.nix"},"haskell.nix"),"]."),(0,n.kt)("li",{parentName:"ul"},"Finished Cicero CI action for [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-addresses/pull/205"},"cardano-addresses-pull-205"),"]."),(0,n.kt)("li",{parentName:"ul"},"Fixed cardano-prelude cicero action in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-prelude/pull/176#issuecomment-1280947946"},"cardano-prelude-pull-176"),"]."),(0,n.kt)("li",{parentName:"ul"},"Fixed the ",(0,n.kt)("inlineCode",{parentName:"li"},"abcird-stdlib/publish")," action [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc/pull/104"},"abcirdc-pull-104"),"]"),(0,n.kt)("li",{parentName:"ul"},"fix error on vm-bigdisk flake configs [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cicero/pull/66"},"cicero-pull-66"),"]."),(0,n.kt)("li",{parentName:"ul"},"Helped with Cicero actions and answered questions for [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus"},"plutus"),"]\n[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-prelude"},"cardano-prelude"),"], and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc"},"abcirdc"),"]."),(0,n.kt)("li",{parentName:"ul"},"Merged [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/323"},"cardano-base-pull-323"),"] for Tullia on cardano-base."),(0,n.kt)("li",{parentName:"ul"},"Merged Cicero action in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ogmios/pull/5"},"cardano-ogmios-pull-5"),"]."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-explorer-app/pull/427"},"cardano-explorer-app-pull-427"),"] to add Tullia and Cicero."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3097"},"cardano-ledger-pull-3097"),"] to add Cicero CI action."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4489"},"cardano-node-pull-4489"),"] to add Tullia and Cicero, including\nOS-agnostic jobs."),(0,n.kt)("li",{parentName:"ul"},"Opened [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4108"},"ouroboros-network-pull-4108"),"] to add Cicero action."),(0,n.kt)("li",{parentName:"ul"},"Reviewed [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/plutus/pull/4918"},"plutus-pull-4918"),"] and helped test it."),(0,n.kt)("li",{parentName:"ul"},"Update Tullia in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc/pull/97"},"abcirdc-pull-97"),"] to build if a tag is given.")),(0,n.kt)("h3",{id:"cicero--tullia-features"},"Cicero & Tullia Features"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improvements to Tullia task aggregation to make [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-addresses"},"cardano-addresses"),"] build\ncorrectly."),(0,n.kt)("li",{parentName:"ul"},"Better tullia CUE lib default for tags [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/tullia/commit/4df3c5d956f1b062b950643da12768ae71acf245"},"tullia-commit-4df3c5d"),"]."),(0,n.kt)("li",{parentName:"ul"},"Put ",(0,n.kt)("inlineCode",{parentName:"li"},"cache.nixos.org")," back in ",(0,n.kt)("inlineCode",{parentName:"li"},"cache.iog.io"),"'s upstreams. This is now\nconsidered a public cache again, and without it some Cicero evaluations had\nto build huge packages."),(0,n.kt)("li",{parentName:"ul"},"Started working on a flake-parts module for Tullia."),(0,n.kt)("li",{parentName:"ul"},"Started working on cutting down Tullia task build time by putting facts in\nJSON files."),(0,n.kt)("li",{parentName:"ul"},"Fixed running into kernel arg limit by reading tullia's DAG from a file"),(0,n.kt)("li",{parentName:"ul"},"Merged [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/tullia/pull/9"},"tullia-pull-9"),"] that fixes several issues related to error reporting.\nand escaping."),(0,n.kt)("li",{parentName:"ul"},"Added Mac builders in Cicero on CI-World."),(0,n.kt)("li",{parentName:"ul"},"Started work on Tullia invocation caching.")),(0,n.kt)("h3",{id:"spongix"},"Spongix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A lot of progress on an SQlite backed version of Spongix, it already supports\nthe full HTTP binary cache protocol but still lacks comprehensive testing and\nsome tuning, as well as recursive lookups."),(0,n.kt)("li",{parentName:"ul"},"First steps in the implementation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"nix-daemon")," ",(0,n.kt)("inlineCode",{parentName:"li"},"ssh-ng")," protocol so\nSpongix can be used via SSH and we can get rid of basic auth.")),(0,n.kt)("h3",{id:"bugs"},"Bugs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Discovered Cicero bug where Nomad reschedules cause the Github commit status\nto get stuck in ",(0,n.kt)("inlineCode",{parentName:"li"},"pending")),(0,n.kt)("li",{parentName:"ul"},"Discovered Cicero race condition bug around concurrent transactions for\ncodependent actions."),(0,n.kt)("li",{parentName:"ul"},"Fixed tullia task order bug in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-addresses"},"cardano-addresses"),"]"),(0,n.kt)("li",{parentName:"ul"},"Diagnose Cicero action not triggered in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/abcirdc"},"abcirdc"),"]"),(0,n.kt)("li",{parentName:"ul"},"Fixed meta/description of the Tullia package in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/tullia/pull/7"},"tullia-pull-7"),"]"),(0,n.kt)("li",{parentName:"ul"},"Add Vault token loop alerts in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/bitte-cells/pull/40"},"bitte-cells-pull-40"),"]"),(0,n.kt)("li",{parentName:"ul"},"Ongoing investigation on recurring Patroni and nomad-follower issues related\nto token rotation.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9136968b.5abe266e.js b/assets/js/9136968b.5abe266e.js new file mode 100644 index 00000000000..1440d521b59 --- /dev/null +++ b/assets/js/9136968b.5abe266e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4986],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=p(r),d=n,h=s["".concat(u,".").concat(d)]||s[d]||m[d]||i;return r?a.createElement(h,o(o({ref:t},c),{},{components:r})):a.createElement(h,o({ref:t},c))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=r[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},99124:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-03-31-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-31-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-crypto.md",source:"@site/blog/2023-03-31-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.105,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-03-31-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-05-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-31-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3},{value:"MuSig2",id:"musig2",level:3}],c={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: Started looking into full-node verifier"),(0,n.kt)("li",{parentName:"ul"},"cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties."),(0,n.kt)("li",{parentName:"ul"},"KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent. "),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Included BLS12-381 & JubJub to halo2curves"),(0,n.kt)("li",{parentName:"ul"},"MuSig2: Final modifs to C version.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started designing how a full-node verifier would work. Issue comming in the next couple of weeks. ")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"BLS12-381 branch merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"),". "),(0,n.kt)("li",{parentName:"ul"},"Testing strategy for BLS bindings:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Test-vectors for Groth16, and simple BLS signatures ready."),(0,n.kt)("li",{parentName:"ul"},"Test-vectors with different library, and created by different engineer. ")))),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Resolved issues of circular dependency"),(0,n.kt)("li",{parentName:"ul"},"Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same. "),(0,n.kt)("li",{parentName:"ul"},"Opened a PR for raw bearer branch in ouroboros network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395"},"PR4395")),(0,n.kt)("li",{parentName:"ul"},"Resolved a bug where the agent node did not properly closed connections"),(0,n.kt)("li",{parentName:"ul"},"Updated version of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/70"},"IOSim")," allowed us to finish a first version of KES agent.")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Included ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/iquerejeta/halo2curves/commit/1ccf987b772dcfaa3c1e3439a4a28f23fcf07c7a"},"BLS12-381")," curve to our branch of halo2curves"),(0,n.kt)("li",{parentName:"ul"},"Included ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/iquerejeta/halo2curves/commit/3f20edb2ed112733a0a0986b0a0386c1b9bc439f"},"JubJub")," to our branch of halo2curves ")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Minor reorg ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/42"},"PR#42")),(0,n.kt)("li",{parentName:"ul"},"Started including fuzz testing for deserialisation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/43"},"PR#"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/913aac40.95dd1cb5.js b/assets/js/913aac40.95dd1cb5.js new file mode 100644 index 00000000000..0ffe18cdec1 --- /dev/null +++ b/assets/js/913aac40.95dd1cb5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92846],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>d});var a=i(67294);function n(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?r(Object(i),!0).forEach((function(t){n(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,a,n=function(e,t){if(null==e)return{};var i,a,n={},r=Object.keys(e);for(a=0;a<r.length;a++)i=r[a],t.indexOf(i)>=0||(n[i]=e[i]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)i=r[a],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},h=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var i=e.components,n=e.mdxType,r=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(i),c=n,d=u["".concat(p,".").concat(c)]||u[c]||m[c]||r;return i?a.createElement(d,o(o({ref:t},h),{},{components:i})):a.createElement(d,o({ref:t},h))}));function d(e,t){var i=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=i.length,o=new Array(r);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<r;s++)o[s]=i[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,i)}c.displayName="MDXCreateElement"},97344:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var a=i(87462),n=(i(67294),i(3905));const r={title:"Mithril Team Update",slug:"2023-03-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-23-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-23-mithril.md",source:"@site/blog/2023-03-23-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-03-23T00:00:00.000Z",formattedDate:"March 23, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.615,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-03-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-03-23-db-sync"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-22-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:s},u="wrapper";function m(e){let{components:t,...i}=e;return(0,n.kt)(u,(0,a.Z)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team released a new ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2310.0"},(0,n.kt)("inlineCode",{parentName:"a"},"2310.0"))," distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images."),(0,n.kt)("p",null,"Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano ",(0,n.kt)("inlineCode",{parentName:"p"},"mainnet")," and they have fixed some bugs. "),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the epic that implements eras behavior switch ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/707"},"#707"),":",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Completed handling the API version switch at era transition ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/727"},"#727")))),(0,n.kt)("li",{parentName:"ul"},"Worked on the epic that implements a relational store in the aggregator ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Completed on the migration/adaptation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"stake_pool")," table ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/787"},"#787")),(0,n.kt)("li",{parentName:"ul"},"Worked on the migration/adaptation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"epoch_settings")," table ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/813"},"#813")),(0,n.kt)("li",{parentName:"ul"},"Worked on the migration/adaptation of the ",(0,n.kt)("inlineCode",{parentName:"li"},"signed-entity-type")," table ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/815"},"#815")),(0,n.kt)("li",{parentName:"ul"},"Completed the creation of a stake distribution service ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/799"},"#799")))),(0,n.kt)("li",{parentName:"ul"},"Completed the testing of Mithril with Cardano ",(0,n.kt)("inlineCode",{parentName:"li"},"mainnet")," network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/777"},"#777")),(0,n.kt)("li",{parentName:"ul"},"Completed qualifying the computation of the stake distribution ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/810"},"#810")),(0,n.kt)("li",{parentName:"ul"},"Completed the testing of the Docker client in the ",(0,n.kt)("inlineCode",{parentName:"li"},"Mithril Client multi-platform test")," workflow ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/794"},"#794")),(0,n.kt)("li",{parentName:"ul"},"Worked on bugs and optimizations:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Fixed a bug that made computation of the stake distribution occur multiple times during an epoch ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/804"},"#804")),(0,n.kt)("li",{parentName:"ul"},"Fixed a bug that created deadlocks on the SQLite connection ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/807"},"#807")),(0,n.kt)("li",{parentName:"ul"},"Optimized the error message and the behavior of the signer node when KES keys have expired ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/820"},"#820")),(0,n.kt)("li",{parentName:"ul"},"Upgraded the infrastructure of the ",(0,n.kt)("inlineCode",{parentName:"li"},"testing-preview")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"pre-release-preview")," networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/801"},"#801")),(0,n.kt)("li",{parentName:"ul"},"Re-genesis of the ",(0,n.kt)("inlineCode",{parentName:"li"},"testing-preview")," network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/803"},"#803")),(0,n.kt)("li",{parentName:"ul"},"Re-genesis of the ",(0,n.kt)("inlineCode",{parentName:"li"},"pre-release-preview")," network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/818"},"#818"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/91595845.dbcc8865.js b/assets/js/91595845.dbcc8865.js new file mode 100644 index 00000000000..338cec8018b --- /dev/null +++ b/assets/js/91595845.dbcc8865.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51268],{3905:(t,e,a)=>{a.d(e,{Zo:()=>s,kt:()=>d});var r=a(67294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function i(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?o(Object(a),!0).forEach((function(e){n(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function u(t,e){if(null==t)return{};var a,r,n=function(t,e){if(null==t)return{};var a,r,n={},o=Object.keys(t);for(r=0;r<o.length;r++)a=o[r],e.indexOf(a)>=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(r=0;r<o.length;r++)a=o[r],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var l=r.createContext({}),p=function(t){var e=r.useContext(l),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.createElement(l.Provider,{value:e},t.children)},c="mdxType",h={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var a=t.components,n=t.mdxType,o=t.originalType,l=t.parentName,s=u(t,["components","mdxType","originalType","parentName"]),c=p(a),m=n,d=c["".concat(l,".").concat(m)]||c[m]||h[m]||o;return a?r.createElement(d,i(i({ref:e},s),{},{components:a})):r.createElement(d,i({ref:e},s))}));function d(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var o=a.length,i=new Array(o);i[0]=m;var u={};for(var l in e)hasOwnProperty.call(e,l)&&(u[l]=e[l]);u.originalType=t,u[c]="string"==typeof t?t:n,i[1]=u;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},3573:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Crypto Team Update",slug:"2023-05-12-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,u={permalink:"/cardano-updates/2023-05-12-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-crypto.md",source:"@site/blog/2023-05-12-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.095,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-05-12-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-17-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-12-goedel"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"cardano-base",id:"cardano-base",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},c="wrapper";function h(t){let{components:e,...a}=t;return(0,n.kt)(c,(0,r.Z)({},s,a,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-base: Include final tests for BLS signature. Further adaptations for KES agent. "),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"RawBearer API in ouroboros-network-framework (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395)"},"https://github.com/input-output-hk/ouroboros-network/pull/4395)"),"; this is needed for KES Agent. Review ongoing."),(0,n.kt)("li",{parentName:"ul"},"Facilitate BLS test vectors in Haskell test suite (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/408"},"https://github.com/input-output-hk/cardano-base/pull/408"),")"),(0,n.kt)("li",{parentName:"ul"},"Add the SignKeyWithKES type to cardano-base (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/389"},"https://github.com/input-output-hk/cardano-base/pull/389"),")"),(0,n.kt)("li",{parentName:"ul"},"Restructuring and simplifying the MLocking code in cardano-base (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/404"},"https://github.com/input-output-hk/cardano-base/pull/404"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/405"},"https://github.com/input-output-hk/cardano-base/pull/405"),"), getting rid of the purpose-built MonadMLock etc. typeclasses in the process"),(0,n.kt)("li",{parentName:"ul"},"Merging the DSIGN and DSIGNM APIs such that the same phantom type can be used to select both the pure and mlocked versions of the same DSIGN algorithm (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/411"},"https://github.com/input-output-hk/cardano-base/pull/411"),")"),(0,n.kt)("li",{parentName:"ul"},"Simplifying the KES API into a single KESAlgorithm typeclass, merging the KESSignAlgorithm class into it (this is possible due to the simplifications from #404). (Same PR as above: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/411"},"https://github.com/input-output-hk/cardano-base/pull/411"),")."),(0,n.kt)("li",{parentName:"ul"},"Update CIP-0381 with new plutus built-in functions, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/506"},"#506"),". In particular hash_to_curve now takes as input a secon input for the Domain Separation Tag (DST), and we limit to have a maximu size of 255 bytes. ")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Opened PR in halo2curves to include BLS12-381 and JubJub, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/privacy-scaling-explorations/halo2curves/pull/38"},"#38")),(0,n.kt)("li",{parentName:"ul"},"Addition constraint over JubJub merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sidechains-zk/pull/10"},"#10"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/91831590.028d52d9.js b/assets/js/91831590.028d52d9.js new file mode 100644 index 00000000000..855fb27b6cc --- /dev/null +++ b/assets/js/91831590.028d52d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29121],{50864:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/91b05c51.41ca190f.js b/assets/js/91b05c51.41ca190f.js new file mode 100644 index 00000000000..a19b5b4f6ac --- /dev/null +++ b/assets/js/91b05c51.41ca190f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17490],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=u(r),d=a,f=s["".concat(p,".").concat(d)]||s[d]||m[d]||o;return r?n.createElement(f,i(i({ref:t},c),{},{components:r})):n.createElement(f,i({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:a,i[1]=l;for(var u=2;u<o;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},34691:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"Network Team Update",slug:"2022-12-12-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-12-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-12-network.md",source:"@site/blog/2022-12-12-network.md",title:"Network Team Update",description:"High level summary",date:"2022-12-12T00:00:00.000Z",formattedDate:"December 12, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"},{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:.43,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-12-12-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-12-14-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-12-09-crypto"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:u},s="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"In last sprint the team focused on preparations for the conference talk at\n",(0,a.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/"},"OPODIS 2022"),". We also worked on preparations to publish ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," and related\npackages on Hackage (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"PR #57"),", ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/60"},"PR #60"),")."),(0,a.kt)("p",null,"We also started reviewing:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"ouroboros-network")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"cardano-ledger"),"\nrepositories for open-source readiness (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4218"},"PR #4128"),").")),(0,a.kt)("p",null,"We prepared a PR which changes how ",(0,a.kt)("inlineCode",{parentName:"p"},"node-to-node")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol\nversiones are serialised in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," log (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4691"},"PR #4691"),")."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/924be064.77e5f297.js b/assets/js/924be064.77e5f297.js new file mode 100644 index 00000000000..bba8eb00387 --- /dev/null +++ b/assets/js/924be064.77e5f297.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21798],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(r),h=n,d=c["".concat(p,".").concat(h)]||c[h]||m[h]||i;return r?a.createElement(d,o(o({ref:t},s),{},{components:r})):a.createElement(d,o({ref:t},s))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=r[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}h.displayName="MDXCreateElement"},93825:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-01-06-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-06-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-06-crypto.md",source:"@site/blog/2023-01-06-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-01-06T00:00:00.000Z",formattedDate:"January 6, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.46,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-01-06-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-01-11-performance-and-tracing"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-05-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"MuSig2",id:"musig2",level:3},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Cryptography handbook",id:"cryptography-handbook",level:3}],s={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The four open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"MuSig2: The API features (error handling) has been merged. "),(0,n.kt)("li",{parentName:"ul"},"Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures."),(0,n.kt)("li",{parentName:"ul"},"cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: We keep progressing with KES secure forgetting implementation.")),(0,n.kt)("p",null,"We also started working in the cryptography engineering handbook, which will be a cross team effort."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Merged the more granular error handling mechanism ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/33"},"PR#33"))),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes/commit/9de00835ed354cbb8d37838f6cee57930ea9fd3d"},"Version 0.1.1"),", which was published in ",(0,n.kt)("a",{parentName:"li",href:"https://crates.io/crates/kes-summed-ed25519"},"crates.io"),". "),(0,n.kt)("li",{parentName:"ul"},"Updated new KES format to mithril library ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/674"},"PR 674")),(0,n.kt)("li",{parentName:"ul"},"We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/531"},"PR 531")),(0,n.kt)("li",{parentName:"ul"},"We keep progressing on reducing the use of ",(0,n.kt)("inlineCode",{parentName:"li"},"transmute")," in ",(0,n.kt)("inlineCode",{parentName:"li"},"mithril-stm"),".")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Nothing new to report. Still working in merging these PRs. We are only missing nix merge of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/520"},"PR#520")," and the updates on VRF will be merged.")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255#issuecomment-1362601518"},"PR#255"),".")),(0,n.kt)("h3",{id:"cryptography-handbook"},"Cryptography handbook"),(0,n.kt)("p",null,"We have made available the (temporary) cryptography handbook ",(0,n.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cryptography_spec/"},"https://input-output-hk.github.io/cryptography_spec/"),", and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/925feafa.07b667eb.js b/assets/js/925feafa.07b667eb.js new file mode 100644 index 00000000000..adc94d8b479 --- /dev/null +++ b/assets/js/925feafa.07b667eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[19773],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),c=i,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||n;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:i,o[1]=l;for(var s=2;s<n;s++)o[s]=r[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},67358:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-02-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-23-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-23-mithril.md",source:"@site/blog/2023-02-23-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-02-23T00:00:00.000Z",formattedDate:"February 23, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.47,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-02-23-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-24-hydra"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-23-performance-and-tracing"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...r}=e;return(0,i.kt)(m,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team released a new ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2306.0"},(0,i.kt)("inlineCode",{parentName:"a"},"2306.0"))," distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes\u2019 CLI that allows generating and signing an era marker\u2019s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2306.0"},(0,i.kt)("inlineCode",{parentName:"a"},"2306.0"))),(0,i.kt)("li",{parentName:"ul"},"Completed the epic that implements signer versions deployment monitoring ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/718"},"#718"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the implementation an event producer/consumer via channel ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/738"},"#738")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation of a database and its configuration to save the events on the consumer side ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/740"},"#740")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation of events and sending them on the channel on the producer side ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/741"},"#741")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation of the signer registration event ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/742"},"#742")),(0,i.kt)("li",{parentName:"ul"},"Completed the creation a query to extract the node versions stakes distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/743"},"#743")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements eras behavior switch ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/707"},"#707"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the loading of era reader adapters from config in the signer and the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/732"},"#732")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an era cli command in the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/755"},"#755")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of a dynamic matrix of cases in CI end to end tests ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/760"},"#760")))),(0,i.kt)("li",{parentName:"ul"},"Fixed some bugs:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Fixed the unsupported ",(0,i.kt)("inlineCode",{parentName:"li"},"unixepoch()")," function ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/757"},"#757")),(0,i.kt)("li",{parentName:"ul"},"Fixed the problem that prevented some signers from signing on the ",(0,i.kt)("inlineCode",{parentName:"li"},"testing-preview")," network ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/730"},"#730")),(0,i.kt)("li",{parentName:"ul"},"Update SQLite version to ",(0,i.kt)("inlineCode",{parentName:"li"},"3.40")," in aggregator infrastructure ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/765"},"#765"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9291df2e.9b87d940.js b/assets/js/9291df2e.9b87d940.js new file mode 100644 index 00000000000..8a56f5c39e3 --- /dev/null +++ b/assets/js/9291df2e.9b87d940.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62302],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=i,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||n;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:i,o[1]=l;for(var s=2;s<n;s++)o[s]=r[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},32194:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-10-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-04-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-04-mithril.md",source:"@site/blog/2023-10-04-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-04T00:00:00.000Z",formattedDate:"October 4, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.15,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-04-consensus"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-02-network"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(h,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/discussions/1273"},"on implementing Mithril in a light wallet")," to receive feedback and contributions from the community."),(0,i.kt)("p",null,"They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks."),(0,i.kt)("p",null,"Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Created the discussion ",(0,i.kt)("strong",{parentName:"li"},"Implement Mithril in a light wallet")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/discussions/1273"},"#1273")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Run client in browser WASM PoC")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1254"},"#1254")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Benchmark aggregator performances")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1220"},"#1220")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Add SPO tickers in explorer")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1185"},"#1185")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Add a non ",(0,i.kt)("inlineCode",{parentName:"strong"},"404")," status code on the aggregator endpoint")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1103"},"#1103")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Use source attribute in errors")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1265"},"#1265")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Create a SPO checklist for KES keys update")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1267"},"#1267")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Configure status page and alerting")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1277"},"#1277")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Upgrade dependencies")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1274"},"#1274"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/934a8f8d.939addfb.js b/assets/js/934a8f8d.939addfb.js new file mode 100644 index 00000000000..f7a961adf51 --- /dev/null +++ b/assets/js/934a8f8d.939addfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36370],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=p(n),d=a,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return n?r.createElement(h,l(l({ref:t},s),{},{components:n})):r.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,l[1]=i;for(var p=2;p<o;p++)l[p]=n[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},81779:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-11-09-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-11-09-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-09-db-sync.md",source:"@site/blog/2023-11-09-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-11-09T00:00:00.000Z",formattedDate:"November 9, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.485,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-11-09-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-10-sre"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-08-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],s={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have created new tag ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-2-2-0"),", which integrates missing Conway feautures and some minor fix\ntags ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-2-1-0"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"sancho-2-0-1"),".\nWe have completed the initial implementation for the bootstrap instance objective."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Add a new ",(0,a.kt)("inlineCode",{parentName:"li"},"--disable-gov")," flag which disabled Conway ferautures\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1558"},"#1558")),(0,a.kt)("li",{parentName:"ul"},"Fix of the committee key size\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1544"},"#1544")),(0,a.kt)("li",{parentName:"ul"},"Workaround a ledger issue with unregistered pools\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1542"},"#1542")),(0,a.kt)("li",{parentName:"ul"},"Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1539"},"#1539")),(0,a.kt)("li",{parentName:"ul"},"Rename offline to offchain\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1533"},"#1533")),(0,a.kt)("li",{parentName:"ul"},"Transfer existing tests to Conway era\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1529"},"#1529"),(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1547"},"#1547"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.12b4c978.js b/assets/js/935f2afb.12b4c978.js new file mode 100644 index 00000000000..fc8a71822b9 --- /dev/null +++ b/assets/js/935f2afb.12b4c978.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80053],{1109:a=>{a.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"defaultSidebar":[{"type":"link","label":"Tutorial Intro","href":"/cardano-updates/docs/intro","docId":"intro"},{"type":"category","label":"Tutorial - Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Create a Page","href":"/cardano-updates/docs/tutorial-basics/create-a-page","docId":"tutorial-basics/create-a-page"},{"type":"link","label":"Create a Document","href":"/cardano-updates/docs/tutorial-basics/create-a-document","docId":"tutorial-basics/create-a-document"},{"type":"link","label":"Create a Blog Post","href":"/cardano-updates/docs/tutorial-basics/create-a-blog-post","docId":"tutorial-basics/create-a-blog-post"},{"type":"link","label":"Markdown Features","href":"/cardano-updates/docs/tutorial-basics/markdown-features","docId":"tutorial-basics/markdown-features"},{"type":"link","label":"Deploy your site","href":"/cardano-updates/docs/tutorial-basics/deploy-your-site","docId":"tutorial-basics/deploy-your-site"},{"type":"link","label":"Congratulations!","href":"/cardano-updates/docs/tutorial-basics/congratulations","docId":"tutorial-basics/congratulations"}],"href":"/cardano-updates/docs/category/tutorial---basics"},{"type":"category","label":"Tutorial - Extras","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manage Docs Versions","href":"/cardano-updates/docs/tutorial-extras/manage-docs-versions","docId":"tutorial-extras/manage-docs-versions"},{"type":"link","label":"Translate your site","href":"/cardano-updates/docs/tutorial-extras/translate-your-site","docId":"tutorial-extras/translate-your-site"}],"href":"/cardano-updates/docs/category/tutorial---extras"}]},"docs":{"intro":{"id":"intro","title":"Tutorial Intro","description":"Let\'s discover Docusaurus in less than 5 minutes.","sidebar":"defaultSidebar"},"tutorial-basics/congratulations":{"id":"tutorial-basics/congratulations","title":"Congratulations!","description":"You have just learned the basics of Docusaurus and made some changes to the initial template.","sidebar":"defaultSidebar"},"tutorial-basics/create-a-blog-post":{"id":"tutorial-basics/create-a-blog-post","title":"Create a Blog Post","description":"Docusaurus creates a page for each blog post, but also a blog index page, a tag system, an RSS feed...","sidebar":"defaultSidebar"},"tutorial-basics/create-a-document":{"id":"tutorial-basics/create-a-document","title":"Create a Document","description":"Documents are groups of pages connected through:","sidebar":"defaultSidebar"},"tutorial-basics/create-a-page":{"id":"tutorial-basics/create-a-page","title":"Create a Page","description":"Add Markdown or React files to src/pages to create a standalone page:","sidebar":"defaultSidebar"},"tutorial-basics/deploy-your-site":{"id":"tutorial-basics/deploy-your-site","title":"Deploy your site","description":"Docusaurus is a static-site-generator (also called Jamstack).","sidebar":"defaultSidebar"},"tutorial-basics/markdown-features":{"id":"tutorial-basics/markdown-features","title":"Markdown Features","description":"Docusaurus supports Markdown and a few additional features.","sidebar":"defaultSidebar"},"tutorial-extras/manage-docs-versions":{"id":"tutorial-extras/manage-docs-versions","title":"Manage Docs Versions","description":"Docusaurus can manage multiple versions of your docs.","sidebar":"defaultSidebar"},"tutorial-extras/translate-your-site":{"id":"tutorial-extras/translate-your-site","title":"Translate your site","description":"Let\'s translate docs/intro.md to French.","sidebar":"defaultSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/93729337.24640633.js b/assets/js/93729337.24640633.js new file mode 100644 index 00000000000..4f0b54bb2b2 --- /dev/null +++ b/assets/js/93729337.24640633.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85845],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=u(r),m=a,y=s["".concat(c,".").concat(m)]||s[m]||d[m]||o;return r?n.createElement(y,l(l({ref:t},p),{},{components:r})):n.createElement(y,l({ref:t},p))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var u=2;u<o;u++)l[u]=r[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},82597:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"DB-sync Team Update",slug:"2023-01-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-01-14-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-14-db-sync.md",source:"@site/blog/2023-01-14-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-01-14T00:00:00.000Z",formattedDate:"January 14, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.36,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-01-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-19-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-13-hydra"}},c={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:u},s="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"After spending the last months on improving DBSync and releasing ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.0")," the DBSync team focused\nthe last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the\nnew leger core and ghc-9.2.4"),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Integrate CHaP\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1331"},"#1331")),(0,a.kt)("li",{parentName:"ul"},"Integrate new ledger core ",(0,a.kt)("inlineCode",{parentName:"li"},"0.1.1.1")," and ghc-9.2\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1332"},"#1332")),(0,a.kt)("li",{parentName:"ul"},"Technical debt: Add code formatter fourmolu\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1334"},"#1334")),(0,a.kt)("li",{parentName:"ul"},"Preparing and tracking Conway and UTxO integration")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/93b15a8c.d2a93a61.js b/assets/js/93b15a8c.d2a93a61.js new file mode 100644 index 00000000000..164c44f95e5 --- /dev/null +++ b/assets/js/93b15a8c.d2a93a61.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[14582],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(r),h=a,m=u["".concat(s,".").concat(h)]||u[h]||d[h]||o;return r?n.createElement(m,i(i({ref:t},c),{},{components:r})):n.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},34989:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2022-10-27-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-27-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-27-crypto.md",source:"@site/blog/2022-10-27-crypto.md",title:"Crypto Team Update",description:"High level overview",date:"2022-10-27T00:00:00.000Z",formattedDate:"October 27, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.095,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-10-27-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2022-08-12-sre"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-21-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"SECP built-ins",id:"secp-built-ins",level:3},{value:"KES agent",id:"kes-agent",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to\nmeeting the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/issues/315"},"acceptance criteria")," in cardano-base,\nwhich lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and\nwe are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution,\nbut also progressing on the implementation."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"secp-built-ins"},"SECP built-ins"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"(missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/313"},"PR 313")),(0,a.kt)("li",{parentName:"ul"},"CIP-0049 was addressed in the editors meeting, and ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/250"},"PR 250")," was merged"),(0,a.kt)("li",{parentName:"ul"},"The unit-tests ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/320"},"PR 320")," is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.")),(0,a.kt)("h3",{id:"kes-agent"},"KES agent"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them."),(0,a.kt)("li",{parentName:"ul"},"We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/94133299.4eaf7b31.js b/assets/js/94133299.4eaf7b31.js new file mode 100644 index 00000000000..18cfd86879c --- /dev/null +++ b/assets/js/94133299.4eaf7b31.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48275],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var u=n.createContext({}),d=function(e){var t=n.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=d(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(a),h=r,m=p["".concat(u,".").concat(h)]||p[h]||c[h]||o;return a?n.createElement(m,i(i({ref:t},s),{},{components:a})):n.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},87687:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-09-30-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-09-30-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-30-ledger.md",source:"@site/blog/2022-09-30-ledger.md",title:"Ledger Team Update",description:"Ledger Update",date:"2022-09-30T00:00:00.000Z",formattedDate:"September 30, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.285,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-09-30-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-04-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-09-27-network"}},u={authorsImageUrls:[void 0]},d=[{value:"Ledger Update",id:"ledger-update",level:2},{value:"Technical debt issues completed",id:"technical-debt-issues-completed",level:3},{value:"Technical debt in progress",id:"technical-debt-in-progress",level:3}],s={toc:d},p="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"ledger-update"},"Ledger Update"),(0,r.kt)("p",null,"We have continued focusing nearly entirely on addressing technical debt.\nA lot of design work has begun for the next ledger era,\nbut we do not yet have anything concrete to share."),(0,r.kt)("h3",{id:"technical-debt-issues-completed"},"Technical debt issues completed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/1676"},"issue-1676"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/2992"},"pull-2992"),"] We have finally removed the ledger dependency on the\n",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-prelude")," package. It was barely used in the ledger repository, and it added a dependency\nthat we did not want to maintain. It was a bit difficult to remove, and we had\nto coordinate removing it from cardano-base.\nA lot ended up going into ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/2992"},"pull-2992"),", due to the coordination effort, and we ended\nup updating Plutus as well.\nThis means that we've now also made a lot of progress on the problematic cost model serialization\nissues described in ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2902"},"issue-2902"),".\nIn particular, after we resolve ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3014"},"issue-3014"),", we will not have to wait an epoch before\nreleasing a cost model for a new version of Plutus, as we had to do for the Vasil HF."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3046"},"issue-3046"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3055"},"pull-3055"),"] We moved a module that is now only used in Byron to a Byron package."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3047"},"issue-3047"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3054"},"pull-3054"),"] We improved the interface to the ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," (multi-asset) type."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3044"},"pull-3044"),"] We debugged and fixed a tricky compilation issue. Certain kinds of field updates\nwere adding approximately 20 minutes to our compile time!"),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2932"},"issue-2932"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3036"},"pull-3036"),"] As a part of our ongoing re-organization of the codebase, we\nhave added a ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardano.Ledger.[Era].Core")," module to each ledger era that has a TxBody class.\nMost classes defined in the era should go in this new module.\nWe also re-export the ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardno.Ledger.Core")," module and the previous ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardano.Ledger.[Era].Core"),"\nmodules from each era.")),(0,r.kt)("h3",{id:"technical-debt-in-progress"},"Technical debt in progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3034"},"issue-3034"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3035"},"issue-3035"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/4421"},"node-issue-4421"),"] We are continuing to write benchmarks to understand exactly where\nall the time is being spent on executing the ",(0,r.kt)("inlineCode",{parentName:"li"},"TICKF")," transition.\nThe consolidation of the per-stake-credential stake distribution to the per-stake-pool\ndistribution does seem to account for a large amount of time (near a second as written, which we\nhave down to about half a second with some optimizations),\nbut this does not account for everything.\nApplying the reward update may also be a big contributing factor."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3033"},"pull-3033"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3038"},"pull-3038"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3041"},"pull-3041"),"] A separate team is working on upgrading all the\ncardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort."),(0,r.kt)("li",{parentName:"ul"},"The nix scripts used to build our new\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger model"),"\ndo not work consistently for everyone, and we have been working on fixing these issues."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3014"},"issue-3014"),"] We are still working on adding a versioning scheme to all of the ledger\nserializers.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9440f007.f4a7587d.js b/assets/js/9440f007.f4a7587d.js new file mode 100644 index 00000000000..d9beab84d89 --- /dev/null +++ b/assets/js/9440f007.f4a7587d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98254],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,m=u["".concat(l,".").concat(h)]||u[h]||c[h]||r;return n?o.createElement(m,i(i({ref:t},d),{},{components:n})):o.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,i[1]=s;for(var p=2;p<r;p++)i[p]=n[p];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},59255:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var o=n(87462),a=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2022-12-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-12-14-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-consensus.md",source:"@site/blog/2022-12-14-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.995,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-12-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-15-mithril"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2022-12-14-db-sync"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD prototype",id:"utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:3},{value:"Genesis",id:"genesis",level:3},{value:"New VRF and KES crypto integration",id:"new-vrf-and-kes-crypto-integration",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],d={toc:p},u="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,o.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks, the Consensus team finalized the QSM tests for the\nbacking store and Mempool on the UTxO-HD branch with important discoveries\nregarding parallel QSM testing. We also worked with the Ledger team to envisage\nthe modifications that are required in Ledger and Consensus to accommodate the\nchanges in the crypto VRF and KES. The ",(0,a.kt)("inlineCode",{parentName:"p"},"db-analyser")," now supports bechmarking\nthe ledger operations, which will allow us to identify, debug, and profile\npotential performance problems. We drafted a document that defines how to manage\nthe versions of Consensus-related packages. The top level documentation of\n",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," now features a description of the consensus components and\nprovides a hyperlinked map to the modules documentation."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD prototype"),(0,a.kt)("p",null,"Whereas we had passing sequential state-machine tests for the mempool, the\nparallel case proved to be more challenging than we thought. The operation of\nadding a list of transactions to the mempool is not atomic and, as a result,\nwhen adding a list of transactions, transactions from other processes can be\nadded in between. The mempool implementation handles this correctly, however\nthis required us to ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4076"},"redesign")," the parallel model we had to take\nthe lack of atomicity into account."),(0,a.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,a.kt)("p",null,"We finished refactoring the backing store property tests. The second review\nround is ongoing."),(0,a.kt)("h3",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,a.kt)("p",null,"We are working on benchmarking (in terms of time and number of IO operations)\nfetching/looking up data from disk."),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"We worked on the design of a mechanism to prevent a DoS attack on our Genesis\ndesign related to rollbacks. This was arguably the biggest outstanding question."),(0,a.kt)("p",null,"During the discussions around Genesis, we noticed a design boundary that nicely\ndelineates a fundamental component. We almost have a full Haskell prototype of\nit. It will be very nicely self-contained, perhaps even usable in the ultimate\nimplementation!"),(0,a.kt)("h3",{id:"new-vrf-and-kes-crypto-integration"},"New VRF and KES crypto integration"),(0,a.kt)("p",null,"We collaborated with the Ledger team on preparing the ledger state and crypto\ntypes to avoid huge allocation on the epoch boundary when changing aspects of\nthe crypto that will only manifest in headers, not in the ledger states."),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("p",null,"We merged the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4014"},"pull-request")," that adds a support to ",(0,a.kt)("inlineCode",{parentName:"p"},"db-analyser")," for\nbenchmarking ledger operations. This will allow us to identify, debug, and\nprofile potential performance problems. The benchmark focus on the main 5 ledger\noperations that are involved in chain syncing, block forging, and block\nvalidation, namely:"),(0,a.kt)("ol",{start:0},(0,a.kt)("li",{parentName:"ol"},"Forecast."),(0,a.kt)("li",{parentName:"ol"},"Header tick."),(0,a.kt)("li",{parentName:"ol"},"Header application."),(0,a.kt)("li",{parentName:"ol"},"Block tick."),(0,a.kt)("li",{parentName:"ol"},"Block application.")),(0,a.kt)("p",null,"The following figure shows a plot of the benchmarking results for the first 65\nmillion blocks (approximately) of the Cardano chain. The thin yellow lines under\nthe x-axis show the epoch boundaries, whereas the thick yellow lines correspond\nto the era transitions."),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(2666).Z,width:"1600",height:"800"})),(0,a.kt)("p",null,"As we can see in this figure, era and epoch boundaries require more computation\ntime. The ledger team are aware of this problem, and we are working to improve\nthis situation."),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4207"},"drafted a document")," motivating and defining how Consensus (and\npossibly other core teams) will/should manage our package versions. This\npull-request garnered many great discussions from our team members and other\nteams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et\nal. We want to thank you all for your input, and we found this discussion very\nenlightening!"),(0,a.kt)("p",null,"We merged the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4197"},"pull request")," that adds an overview of consensus to\nthe ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/ouroboros-network/"},"top level\ndocumentation")," of\nouroboros-network. This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation."))}c.isMDXComponent=!0},2666:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/2022-12-14-ledger-ops-benchmark-c46be3db45ff5480ed104e0d520711a6.png"}}]); \ No newline at end of file diff --git a/assets/js/9450fd8f.f4c685b8.js b/assets/js/9450fd8f.f4c685b8.js new file mode 100644 index 00000000000..c6c98db8f32 --- /dev/null +++ b/assets/js/9450fd8f.f4c685b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45410],{9804:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/18","page":18,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/17","nextPage":"/cardano-updates/page/19","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/94780c38.71d2b83d.js b/assets/js/94780c38.71d2b83d.js new file mode 100644 index 00000000000..e31ad5bca1a --- /dev/null +++ b/assets/js/94780c38.71d2b83d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58925],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=u(r),m=a,y=s["".concat(c,".").concat(m)]||s[m]||d[m]||o;return r?n.createElement(y,l(l({ref:t},p),{},{components:r})):n.createElement(y,l({ref:t},p))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var u=2;u<o;u++)l[u]=r[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},99178:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"DB-sync Team Update",slug:"2023-01-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-01-14-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-14-db-sync.md",source:"@site/blog/2023-01-14-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-01-14T00:00:00.000Z",formattedDate:"January 14, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.36,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-01-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-19-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-13-hydra"}},c={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:u},s="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"After spending the last months on improving DBSync and releasing ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.0")," the DBSync team focused\nthe last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the\nnew leger core and ghc-9.2.4"),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Integrate CHaP\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1331"},"#1331")),(0,a.kt)("li",{parentName:"ul"},"Integrate new ledger core ",(0,a.kt)("inlineCode",{parentName:"li"},"0.1.1.1")," and ghc-9.2\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1332"},"#1332")),(0,a.kt)("li",{parentName:"ul"},"Technical debt: Add code formatter fourmolu\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1334"},"#1334")),(0,a.kt)("li",{parentName:"ul"},"Preparing and tracking Conway and UTxO integration")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/948ff80d.35bdc0f3.js b/assets/js/948ff80d.35bdc0f3.js new file mode 100644 index 00000000000..0ab06115549 --- /dev/null +++ b/assets/js/948ff80d.35bdc0f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88767],{31306:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/10","page":10,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/9","nextPage":"/cardano-updates/tags/hydra/page/11","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/94a907c9.b1899393.js b/assets/js/94a907c9.b1899393.js new file mode 100644 index 00000000000..ea56646fb66 --- /dev/null +++ b/assets/js/94a907c9.b1899393.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23941],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>g});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),c=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(a),u=r,g=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return a?n.createElement(g,l(l({ref:t},s),{},{components:a})):n.createElement(g,l({ref:t},s))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=a[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}u.displayName="MDXCreateElement"},44751:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=a(87462),r=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-03-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-03-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-goedel.md",source:"@site/blog/2023-03-03-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.815,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-03-03-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-03-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-03-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint the team has been working on drafts of two papers and one\ntechnical report, improving the deltaQ tutorial, consulting on\nperformance design, and the Djed paper has been accepted for\npublication."),(0,r.kt)("h2",{id:"details"},"Details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing draft of DeltaQSD algebra paper for FORTE 2023")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Extending the technical report on which the above paper is based")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Consulting with an external company on performance engineering of Plutus contracts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Planning improvements and collecting material for the deltaQ\ntutorial based on experience with systems that manage risk at\nmultiple timescales")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing sections on the communication language and idempontency\nlaws for draft paper about verifying design refinements for\ndistributed system design")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Studying Cardano chain sync protocol")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'"Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin\nProtocol" has been accepted for publication at IEEE ICBC 2023'))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/94c6d911.ce947e81.js b/assets/js/94c6d911.ce947e81.js new file mode 100644 index 00000000000..a97dcd86aa1 --- /dev/null +++ b/assets/js/94c6d911.ce947e81.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[44501],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),d=s(r),m=a,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[d]="string"==typeof e?e:a,i[1]=c;for(var s=2;s<o;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},14130:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2022-11-16-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2022-11-16-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-performance-and-tracing.md",source:"@site/blog/2022-11-16-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2022-11-16T00:00:00.000Z",formattedDate:"November 16, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.635,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2022-11-16-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-16-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-11-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"P2P performance investigation is ongoing, in support of the networking team."),(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support."),(0,a.kt)("li",{parentName:"ol"},"Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing."),(0,a.kt)("li",{parentName:"ol"},"On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started."),(0,a.kt)("li",{parentName:"ol"},"We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends."),(0,a.kt)("p",null,"We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing."),(0,a.kt)("p",null,"A number of smaller workbench, data analysis & reporting improvements have been made."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/94dc91d7.e956eef6.js b/assets/js/94dc91d7.e956eef6.js new file mode 100644 index 00000000000..e9f8becb289 --- /dev/null +++ b/assets/js/94dc91d7.e956eef6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6683],{59277:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/56","page":56,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/55","nextPage":"/cardano-updates/page/57","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/95f12e12.89a759bd.js b/assets/js/95f12e12.89a759bd.js new file mode 100644 index 00000000000..8341e849e92 --- /dev/null +++ b/assets/js/95f12e12.89a759bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[84727],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=u(n),h=r,m=d["".concat(l,".").concat(h)]||d[h]||c[h]||o;return n?a.createElement(m,i(i({ref:t},p),{},{components:n})):a.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var u=2;u<o;u++)i[u]=n[u];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},67975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Quarterly Update",slug:"2023-01-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/quarterly/2023-01-18-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-18-consensus.md",source:"@site/quarterly/2023-01-18-consensus.md",title:"Consensus Quarterly Update",description:"Consensus Quarterly Update",date:"2023-01-18T00:00:00.000Z",formattedDate:"January 18, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:3.205,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Quarterly Update",slug:"2023-01-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2023-04-03-ledger"},nextItem:{title:"Network Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-13-network"}},l={authorsImageUrls:[void 0]},u=[{value:"Consensus Quarterly Update",id:"consensus-quarterly-update",level:2},{value:"2022-12 - 2023-01",id:"2022-12---2023-01",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Support",id:"support",level:4},{value:"Conway era",id:"conway-era",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4},{value:"Support",id:"support-1",level:4},{value:"Tech debt",id:"tech-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration-1",level:4},{value:"Risks",id:"risks",level:3},{value:"UTxO HD",id:"utxo-hd-2",level:4}],p={toc:u},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"consensus-quarterly-update"},"Consensus Quarterly Update"),(0,r.kt)("h2",{id:"2022-12---2023-01"},"2022-12 - 2023-01"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("p",null,"The prototype is feature complete and thoroughly tested at the consensus level.\nIn particular, we invested a lot of time in writing property-test for the\nmempool, and other crucial new parts of the prototype. Now we are ready to run\nintegration tests and system-level benchmarks."),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("p",null,"We identified and fixed a slowdown in cross-era forecasting that was inhibiting\nour efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7%\nspeedup in full sync times in the baseline."),(0,r.kt)("p",null,"We also started prototyping a self-contained implementation of the Genesis\ndynamics (in particular of the parts intentionally not part of the ChainSync\nJumping prototype) that furthered our understanding of subtleties and edge\ncases."),(0,r.kt)("h4",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We worked on designing integration of new VRF and KES crypto into consensus.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"Crypto")," class was split into two parts: ",(0,r.kt)("inlineCode",{parentName:"li"},"Crypto")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"HeaderCrypto"),"."),(0,r.kt)("li",{parentName:"ul"},"With the Ledger team's help, we refactored ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-ledger")," to use a proxy\ntype for VRF.")))),(0,r.kt)("h4",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"PR went through its second review round. It is about to be merged, but it got\ndelayed due to people's availability during Christmas break.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We improved the capabilities of our ",(0,r.kt)("inlineCode",{parentName:"li"},"io-sim")," library, which is key for testing\nand simulating Cardano components."),(0,r.kt)("li",{parentName:"ul"},"We removed thunks from epoch translations in the ledger, which is important\nfor reducing memory consumption of the Cardano node.")),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We added a tutorial on how to instantiate the Consensus layer to run custom\nledgers. This should be a valuable resource to people looking to roll their\nown custom blockchain (either for commercial or research purposes)."),(0,r.kt)("li",{parentName:"ul"},"We added an overview of consensus to the ",(0,r.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/ouroboros-network/"},"top level\ndocumentation")," of\nouroboros-network. This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Evaluate the extensibility of the prototype. Moving the UTxO to disk is only\nthe first step towards reducing the memory requirements of Cardano node, and\nensuring its long term sustainability. In the future, we plan on moving other\nlarge maps, such as delegation maps. The prototype should be able to\naccommodate these changes without any major modifications."),(0,r.kt)("li",{parentName:"ul"},"Start the integration with other downstream components, such as the wallet and\ndb-sync. The idea is to identify and address any potential pain points that\nmight arise during this integration."),(0,r.kt)("li",{parentName:"ul"},"Run integration tests and system-level benchmarks.")),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish benchmarking and tuning the fast-path ChainSync Jumping prototype"),(0,r.kt)("li",{parentName:"ul"},"Expand and optimize the self-contained implementation of the Disconnect Rule\n(including density comparisons and the LoE)"),(0,r.kt)("li",{parentName:"ul"},"Develop documentation and smoke tests for these components."),(0,r.kt)("li",{parentName:"ul"},"Start modifying the ChainSync Client for the LoP and LoR.")),(0,r.kt)("h4",{id:"support-1"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Help the Network team with diagnosing performance regression in block\nproduction.")),(0,r.kt)("h4",{id:"tech-debt"},"Tech debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fix property-test failures concerning iterators (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3999"},"#3999")," and\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4183"},"#4183"),").")),(0,r.kt)("h4",{id:"fostering-collaboration-1"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4145"},"mapping consensus"),".")),(0,r.kt)("h3",{id:"risks"},"Risks"),(0,r.kt)("h4",{id:"utxo-hd-2"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Moving other parts of the ledger state to disk might require a major redesign\nof the prototype. For instance, if it turns out that the epoch change rules\nrequire access to the ",(0,r.kt)("em",{parentName:"li"},"full")," ledger state. If this is the case, we might\naccept this risk and do the redesign after the initial release of UTxO-HD."),(0,r.kt)("li",{parentName:"ul"},"Integration with downstream clients might require more work than we\nanticipate."),(0,r.kt)("li",{parentName:"ul"},"Access to the benchmarking's team time and resources."),(0,r.kt)("li",{parentName:"ul"},"Benchmarking results might show significant performance degradation, which\nwill require additional work if such performance degradation is not accepted\nby other stakeholders."),(0,r.kt)("li",{parentName:"ul"},"The prototype's performance might not be accepted by other stakeholders. Here\nwe need to clearly communicate that this is necessary to ensure that as the\nblockchain size grows, the node can operate within reasonable memory\nconstraints.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/960e3390.9a5d2160.js b/assets/js/960e3390.9a5d2160.js new file mode 100644 index 00000000000..1ffa77f3252 --- /dev/null +++ b/assets/js/960e3390.9a5d2160.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24913],{57070:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/mithril/page/4","page":4,"postsPerPage":5,"totalPages":7,"totalCount":34,"previousPage":"/cardano-updates/tags/mithril/page/3","nextPage":"/cardano-updates/tags/mithril/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/965e9e9a.ae2a813a.js b/assets/js/965e9e9a.ae2a813a.js new file mode 100644 index 00000000000..5ae9642061a --- /dev/null +++ b/assets/js/965e9e9a.ae2a813a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[37595],{27622:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/tags/ledger","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/9668e24b.a1fef7db.js b/assets/js/9668e24b.a1fef7db.js new file mode 100644 index 00000000000..d96d4f181d7 --- /dev/null +++ b/assets/js/9668e24b.a1fef7db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68044],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),m=a,d=h["".concat(s,".").concat(m)]||h[m]||c[m]||i;return r?n.createElement(d,o(o({ref:t},u),{},{components:r})):n.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<i;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},14624:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const i={title:"Mithril Team Update",slug:"2023-09-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-20-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-20-mithril.md",source:"@site/blog/2023-09-20-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-09-20T00:00:00.000Z",formattedDate:"September 20, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.935,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-09-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-20-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-15-goedel"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports. "),(0,a.kt)("p",null,"Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Add snapshot compression parameters in infrastructure deployments")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1200"},"#1200")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Add Cloudflare protection of infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/986"},"#986")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Record statistics about the downloaded snapshot in the aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1127"},"#1127")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Error refactoring")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/798"},"#798")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Activate Cloudflare protection of infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1230"},"#1230")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Release new ",(0,a.kt)("inlineCode",{parentName:"strong"},"2337")," distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1219"},"#1219")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Upgrade dependencies")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1238"},"#1238"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/97407dee.1346e5b9.js b/assets/js/97407dee.1346e5b9.js new file mode 100644 index 00000000000..e9d23e02e1b --- /dev/null +++ b/assets/js/97407dee.1346e5b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47263],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(n),h=r,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||o;return n?a.createElement(m,s(s({ref:t},p),{},{components:n})):a.createElement(m,s({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var u=2;u<o;u++)s[u]=n[u];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},53615:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Quarterly Update",slug:"2023-04-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/quarterly/2023-04-25-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-25-consensus.md",source:"@site/quarterly/2023-04-25-consensus.md",title:"Consensus Quarterly Update",description:"Consensus Quarterly Update",date:"2023-04-25T00:00:00.000Z",formattedDate:"April 25, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:2.3,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Quarterly Update",slug:"2023-04-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"SRE Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-sre"},nextItem:{title:"Network Q1 2023 Update",permalink:"/cardano-updates/quarterly/2023-04-04-network"}},l={authorsImageUrls:[void 0]},u=[{value:"Consensus Quarterly Update",id:"consensus-quarterly-update",level:2},{value:"2023-01 - 2023-03",id:"2023-01---2023-03",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Support",id:"support",level:4},{value:"Conway era",id:"conway-era",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4},{value:"Support",id:"support-1",level:4},{value:"Tech debt",id:"tech-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration-1",level:4}],p={toc:u},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"consensus-quarterly-update"},"Consensus Quarterly Update"),(0,r.kt)("h2",{id:"2023-01---2023-03"},"2023-01 - 2023-03"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We finished the testing activities for the prototype, which involved adding\nnew tests, and fixing and enabling temporarily disabled tests."),(0,r.kt)("li",{parentName:"ul"},"We spent a substantial amount of effort refactoring and cleaning the\nprototype."),(0,r.kt)("li",{parentName:"ul"},"We audited the UTxO HD prototype to make sure it can accommodate the migration\nof other tables (eg stake-keys registration) from memory to disk. The result\nof the audit was positive."),(0,r.kt)("li",{parentName:"ul"},"We ran ad-hoc benchmarks for reading keys and flushing values to disk. No\nunexpected costs found."),(0,r.kt)("li",{parentName:"ul"},"We ran the first system level benchmarks. The performance regressions reported\nwere due to an unrealistic snapshotting rate. We need to re-run them again\nafter we design a more fine grained locking mechanism.")),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We elaborated a roadmap of the remaining work for Genesis."),(0,r.kt)("li",{parentName:"ul"},"We presented the design to the IOG Researchers and PNSol on February 20. The\ndesign was well received. We updated the Genesis design with the researcher's\nfeedback.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We plugged the new DoS vector identified during the aforementioned\npresentation."))),(0,r.kt)("li",{parentName:"ul"},"We developed a generator for adversarial leader schedules that satisfy key\nOuroboros properties, which will be used to test the Genesis design.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The generator enables use of smaller Ouroboros parameters, which makes\nextrema more likely and counterxamples easier interpret."))),(0,r.kt)("li",{parentName:"ul"},"We wrote up the latest design iteration."),(0,r.kt)("li",{parentName:"ul"},"We continued benchmarking the Chain Sync Jumping prototype. In particular:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We debugged the prototype's performance regression, and unmasked the\nactual cause by patching our initial theory (bad queuing behavior)"),(0,r.kt)("li",{parentName:"ul"},"We identified and validated the actual cause (a pathological case in\nBlockFetch tiebreaker).")))),(0,r.kt)("h4",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother\nto serve a local immutable DB.")),(0,r.kt)("h4",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We integrated the Conway era into consensus.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We fixed a bug with followers, which was discovered by property tests."),(0,r.kt)("li",{parentName:"ul"},"We developed a DSL for specifying and running ChainDB test cases."),(0,r.kt)("li",{parentName:"ul"},"We fixed failing tests with iterators."),(0,r.kt)("li",{parentName:"ul"},"We created micro-benchmarks for adding transactions to the mempool.")),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We released a new technical documentation site for consensus."),(0,r.kt)("li",{parentName:"ul"},"We factored out several packages to external repositories. Some of this work\noriginated in the UTxO HD workstream.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/28"},"https://github.com/input-output-hk/ouroboros-consensus/issues/28"))),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/33"},"https://github.com/input-output-hk/ouroboros-consensus/issues/33")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/32"},"https://github.com/input-output-hk/ouroboros-consensus/issues/32")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/31"},"https://github.com/input-output-hk/ouroboros-consensus/issues/31"))),(0,r.kt)("h4",{id:"support-1"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Design Consensus side of hardfork-enactment in the Voltaire phase\n(",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4180"},"#4180"),")."),(0,r.kt)("li",{parentName:"ul"},"Estimate the number of file descriptors Consensus needs\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/20"},"#20"),".")),(0,r.kt)("h4",{id:"tech-debt"},"Tech debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define\nfor consensus. Pick one and implement benchmarks for it.")),(0,r.kt)("h4",{id:"fostering-collaboration-1"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Onboard a new team member.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/97cbe67b.9fa74904.js b/assets/js/97cbe67b.9fa74904.js new file mode 100644 index 00000000000..97fcf03876b --- /dev/null +++ b/assets/js/97cbe67b.9fa74904.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48221],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,r,a=function(e,t){if(null==e)return{};var i,r,a={},n=Object.keys(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(i),d=a,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return i?r.createElement(c,o(o({ref:t},s),{},{components:i})):r.createElement(c,o({ref:t},s))}));function c(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,i)}d.displayName="MDXCreateElement"},70314:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-04-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-04-06-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-06-mithril.md",source:"@site/blog/2023-04-06-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-04-06T00:00:00.000Z",formattedDate:"April 6, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.075,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-04-06-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-07-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-05-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,a.kt)(h,(0,r.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team released a new ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2313.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2313.0"))," distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages."),(0,a.kt)("p",null,"Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.6"),"."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2313.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2313.0"))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that implements a relational store in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"epoch_settings")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/813"},"#813")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signed-entity-type")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/815"},"#815")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"certificate")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/817"},"#817")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"open_message")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/827"},"#827")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signer_registration")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/828"},"#828")))),(0,a.kt)("li",{parentName:"ul"},"Completed the refactoring of the dependency injection of the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/823"},"#823")),(0,a.kt)("li",{parentName:"ul"},"Completed the cleanup of the multi-signer of the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/824"},"#824")),(0,a.kt)("li",{parentName:"ul"},"Completed the upgrade of the Cardano node to ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35.6")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/843"},"#843"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/97daee08.077f549d.js b/assets/js/97daee08.077f549d.js new file mode 100644 index 00000000000..ef6ffc6c7dc --- /dev/null +++ b/assets/js/97daee08.077f549d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32070],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var h=a.createContext({}),p=function(e){var t=a.useContext(h),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(h.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,h=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),s=p(r),c=i,d=s["".concat(h,".").concat(c)]||s[c]||m[c]||n;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var h in t)hasOwnProperty.call(t,h)&&(l[h]=t[h]);l.originalType=e,l[s]="string"==typeof e?e:i,o[1]=l;for(var p=2;p<n;p++)o[p]=r[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},43729:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-03-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-09-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-09-mithril.md",source:"@site/blog/2023-03-09-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-03-09T00:00:00.000Z",formattedDate:"March 9, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.42,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-03-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-10-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-08-consensus"}},h={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(s,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano ",(0,i.kt)("inlineCode",{parentName:"p"},"mainnet")," and computes the stake distribution with the optimized unreleased Cardano CLI command."),(0,i.kt)("p",null,"Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements eras behavior switch ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/707"},"#707"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the deployment of the era behavior switch to the test networks ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/752"},"#752")),(0,i.kt)("li",{parentName:"ul"},"Completed the enhancement of datum generation for era markers ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/786"},"#786")),(0,i.kt)("li",{parentName:"ul"},"Worked on handling the API version with an era switch ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/727"},"#727")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements a relational store in the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Worked on the migration/adaptation of the ",(0,i.kt)("inlineCode",{parentName:"li"},"stake_pool")," table ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/787"},"#787")))),(0,i.kt)("li",{parentName:"ul"},"Completed the refactoring of errors in the signer and aggregator state machines ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/665"},"#665")),(0,i.kt)("li",{parentName:"ul"},"Worked on testing Mithril with a ",(0,i.kt)("inlineCode",{parentName:"li"},"mainnet")," Cardano network ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/777"},"#777")),(0,i.kt)("li",{parentName:"ul"},"Worked on fixing bugs with the Docker client image:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Fixed a bug that made the Docker client container crash at startup ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/769"},"#769")),(0,i.kt)("li",{parentName:"ul"},"Fixed a bug that prevented the restoration of a snapshot with a Docker client ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/791"},"#791")),(0,i.kt)("li",{parentName:"ul"},"Worked on testing the Docker client in the ",(0,i.kt)("inlineCode",{parentName:"li"},"Mithril Client multi-platform test")," workflow ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/794"},"#794"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/98277053.8204ac95.js b/assets/js/98277053.8204ac95.js new file mode 100644 index 00000000000..967b7fa5f22 --- /dev/null +++ b/assets/js/98277053.8204ac95.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[66602],{16938:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra","page":1,"postsPerPage":5,"totalPages":11,"totalCount":55,"nextPage":"/cardano-updates/tags/hydra/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/986e43da.f541f01c.js b/assets/js/986e43da.f541f01c.js new file mode 100644 index 00000000000..5053e8851f2 --- /dev/null +++ b/assets/js/986e43da.f541f01c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6807],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=s(r),g=n,h=d["".concat(u,".").concat(g)]||d[g]||c[g]||o;return r?a.createElement(h,l(l({ref:t},p),{},{components:r})):a.createElement(h,l({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=g;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var s=2;s<o;s++)l[s]=r[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}g.displayName="MDXCreateElement"},61934:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2023-02-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-02-02-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-02-ledger.md",source:"@site/blog/2023-02-02-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-02-02T00:00:00.000Z",formattedDate:"February 2, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.23,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-02-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-03-hydra"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-27-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Ledger evolution CIP",id:"ledger-evolution-cip",level:3},{value:"Serialization issues",id:"serialization-issues",level:3},{value:"New tests",id:"new-tests",level:3},{value:"Progress on a better cost model serialization situation.",id:"progress-on-a-better-cost-model-serialization-situation",level:3},{value:"Nightly tests",id:"nightly-tests",level:3},{value:"Constraint based generators",id:"constraint-based-generators",level:3}],p={toc:s},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"Much of the work the past two weeks involved integration efforts,\ncleaning up and debugging some serialization issues,\nadding tests, and work on large projects that are still ongoing.\nWe also released a CIP this week that aims to make the ledger\na registered CIP category."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"ledger-evolution-cip"},"Ledger evolution CIP"),(0,n.kt)("p",null,"We published a\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/456"},"CIP"),"\nthat will make the Cardano ledger a registered category of the CIP process."),(0,n.kt)("h3",{id:"serialization-issues"},"Serialization issues"),(0,n.kt)("p",null,"We had previously thought that we had found a serialization problem with the redeemers,\nbut it turned out to just be particularly confusing code.\nWe have now clarified the issue for the future."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3263"},"pull-3263"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3269"},"pull-3269"),", and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3268"},"pull-3268"),"."),(0,n.kt)("p",null,"Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3277"},"pull-3277"),"."),(0,n.kt)("h3",{id:"new-tests"},"New tests"),(0,n.kt)("p",null,"We added a new property test suite for some of our custom containers."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3270"},"pull-3270"),"."),(0,n.kt)("h3",{id:"progress-on-a-better-cost-model-serialization-situation"},"Progress on a better cost model serialization situation."),(0,n.kt)("p",null,"We are still working our way through ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/2902"},"issue-2902"),".\nTowards this end, we are now properly gating the new flexible encoders\nuntil version 9."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3274"},"pull-3274"),"."),(0,n.kt)("h3",{id:"nightly-tests"},"Nightly tests"),(0,n.kt)("p",null,"We are still experimenting with moving more CI actions to GitHub actions."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3276"},"pull-3276"),"."),(0,n.kt)("h3",{id:"constraint-based-generators"},"Constraint based generators"),(0,n.kt)("p",null,"We continue to add to our proof of concept for constraint based generators.\nSee the previous ledger update for more information about this project."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/98b2ca25.58b9f52d.js b/assets/js/98b2ca25.58b9f52d.js new file mode 100644 index 00000000000..ae9901b4d4a --- /dev/null +++ b/assets/js/98b2ca25.58b9f52d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1435],{27627:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/cli-api/page/6","page":6,"postsPerPage":5,"totalPages":6,"totalCount":27,"previousPage":"/cardano-updates/tags/cli-api/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/98e6984f.26f25dbd.js b/assets/js/98e6984f.26f25dbd.js new file mode 100644 index 00000000000..55f0bceb4cd --- /dev/null +++ b/assets/js/98e6984f.26f25dbd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[19861],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),c=n,d=h["".concat(s,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},80648:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-12-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-15-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-15-mithril.md",source:"@site/blog/2022-12-15-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2022-12-15T00:00:00.000Z",formattedDate:"December 15, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.11,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2022-12-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-16-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-12-14-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team has released the new distribution ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2248.1"},(0,n.kt)("inlineCode",{parentName:"a"},"2248.1"))," of their nodes. They have published the first version of the Mithril cryptographic library on ",(0,n.kt)("a",{parentName:"p",href:"https://crates.io/crates/mithril-stm"},(0,n.kt)("inlineCode",{parentName:"a"},"crates.io")),", the Rust community\u2019s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots."),(0,n.kt)("p",null,"Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implemented removing verification key and stake from single signatures ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/619"},"#619")),(0,n.kt)("li",{parentName:"ul"},"Completed the extraction of the signer registration from the multi-signer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/642"},"#642")),(0,n.kt)("li",{parentName:"ul"},"Completed the extraction of the certificate creation from the multi-signer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/638"},"#638")),(0,n.kt)("li",{parentName:"ul"},"Implemented a workflow to test client binaries (Linux / MacOS / Windows) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/601"},"#601")),(0,n.kt)("li",{parentName:"ul"},"Completed the signature of the artifacts produced by the CI ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/587"},"#587")),(0,n.kt)("li",{parentName:"ul"},"Fixed the protocol parameters transition ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/627"},"#627")),(0,n.kt)("li",{parentName:"ul"},"Worked on optimizing the snapshot digest computation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/510"},"#510")),(0,n.kt)("li",{parentName:"ul"},"Worked on enforcing the API protocol versions in the client and signer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/633"},"#633")),(0,n.kt)("li",{parentName:"ul"},"Worked on deactivating the non certified signer registration mode ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/621"},"#621")),(0,n.kt)("li",{parentName:"ul"},"Worked on the re-genesis of the test networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/651"},"#651"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9945c128.4d1fc2f5.js b/assets/js/9945c128.4d1fc2f5.js new file mode 100644 index 00000000000..b26292de909 --- /dev/null +++ b/assets/js/9945c128.4d1fc2f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89325],{41340:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/mithril/page/5","page":5,"postsPerPage":5,"totalPages":7,"totalCount":34,"previousPage":"/cardano-updates/tags/mithril/page/4","nextPage":"/cardano-updates/tags/mithril/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/996aa714.48a86a7d.js b/assets/js/996aa714.48a86a7d.js new file mode 100644 index 00000000000..ef3b46d2f04 --- /dev/null +++ b/assets/js/996aa714.48a86a7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70594],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(r),p=a,h=m["".concat(s,".").concat(p)]||m[p]||d[p]||o;return r?n.createElement(h,i(i({ref:t},u),{},{components:r})):n.createElement(h,i({ref:t},u))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}p.displayName="MDXCreateElement"},73172:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2022-12-14-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-12-14-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-performance-and-tracing.md",source:"@site/blog/2022-12-14-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:3.095,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2022-12-14-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-14-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-12-12-network"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],u={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment."),(0,a.kt)("li",{parentName:"ol"},"A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload."),(0,a.kt)("p",null,"We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical."),(0,a.kt)("p",null,"To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.")),(0,a.kt)("p",null,"All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further."),(0,a.kt)("p",null,"In addition, we're still pursuing our performance-enhancing rework of the new tracing internals."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends."),(0,a.kt)("p",null,"Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it.\nThis means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis.\nThis will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports."),(0,a.kt)("p",null,"A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches.\nPreviously we only had automation for two aspects separately, so we only could either:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"compare individual runs (used for different node configurations / versions)"),(0,a.kt)("li",{parentName:"ul"},"collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version)\nNaturally, combining these two capabilities was a long-desired feature of our analysis pipeline.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/99881079.7399a249.js b/assets/js/99881079.7399a249.js new file mode 100644 index 00000000000..653c2da0441 --- /dev/null +++ b/assets/js/99881079.7399a249.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53004],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(n),p=a,h=d["".concat(s,".").concat(p)]||d[p]||m[p]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},38772:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-05-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-05-17-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-performance-and-tracing.md",source:"@site/blog/2023-05-17-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-05-17T00:00:00.000Z",formattedDate:"May 17, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:3.21,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-05-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-17-mithril"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-05-12-crypto"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Analysis",id:"analysis",level:3},{value:"Open Sourcing",id:"open-sourcing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"Performance & Tracing Meetup",id:"performance--tracing-meetup",level:3},{value:"Offboarding",id:"offboarding",level:3}],u={toc:c},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes."),(0,a.kt)("li",{parentName:"ul"},"New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: First steps on implementing incremental analysis have been untertaken."),(0,a.kt)("li",{parentName:"ul"},"Open Sourcing: Exhaustive dataflow charts for both our analysis tool ",(0,a.kt)("inlineCode",{parentName:"li"},"locli")," and our ",(0,a.kt)("inlineCode",{parentName:"li"},"workbanch")," have been merged to ",(0,a.kt)("inlineCode",{parentName:"li"},"master")),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster."),(0,a.kt)("li",{parentName:"ul"},"P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland."),(0,a.kt)("li",{parentName:"ul"},"Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"As a compiler switch to GHC 9.2.7 for ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),"'s default build environment is around the corner, we're setting up our benchmarking cluster to\nhandle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This\nalso involves choosing a reliable baseline as reference point for inter-version comparisons. "),(0,a.kt)("p",null,"Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet,\nwe strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to\nbe balanced against resource demand for all our cluster's nodes."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some\nquality-of-life details that have changed required us to revision the system documentation."),(0,a.kt)("h3",{id:"analysis"},"Analysis"),(0,a.kt)("p",null,"As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been\nnormally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a\nhuge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken. "),(0,a.kt)("h3",{id:"open-sourcing"},"Open Sourcing"),(0,a.kt)("p",null,"A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking\ncopmonents more accessible. As a result, detailed charts for both our LogObject CLI ",(0,a.kt)("inlineCode",{parentName:"p"},"locli")," and our ",(0,a.kt)("inlineCode",{parentName:"p"},"workbench")," have been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". "),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting\nthose profiles of our ",(0,a.kt)("inlineCode",{parentName:"p"},"workbench")," that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality\nof the nomad cloud backend. "),(0,a.kt)("p",null,"Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster."),(0,a.kt)("h3",{id:"performance--tracing-meetup"},"Performance & Tracing Meetup"),(0,a.kt)("p",null,"We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive\ndays together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future.\nAlso, it was a great opportunity to finally meet in person."),(0,a.kt)("h3",{id:"offboarding"},"Offboarding"),(0,a.kt)("p",null,"Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation\nof team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/999e2b46.b9eca61e.js b/assets/js/999e2b46.b9eca61e.js new file mode 100644 index 00000000000..8552c3d715b --- /dev/null +++ b/assets/js/999e2b46.b9eca61e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76433],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||u[m]||o;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var p=2;p<o;p++)i[p]=n[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},25360:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-06-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-06-14-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-14-consensus.md",source:"@site/blog/2023-06-14-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-06-14T00:00:00.000Z",formattedDate:"June 14, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.115,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-06-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-15-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-14-performance-and-tracing"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:p},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the ",(0,r.kt)("inlineCode",{parentName:"p"},"Byron")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"TPraos")," eras do not need to be checkpointed for an MVP.\nThere is one remaining question (which applies also to the ",(0,r.kt)("inlineCode",{parentName:"p"},"Praos"),' era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated "Limit on Patience" timeout sufficiently bounds how long the adversary can inflate a victim\'s overall sync time.'),(0,r.kt)("p",null,"On the UTxO-HD front, the prototype branch was rebased on top of the latest ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," branch and integrated on top of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node 8.1.1-pre"),". As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD.\nWe managed to run a node again with UTxO-HD enabled.\nWe also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),", which uncovered a performance regression on the Network component when using ",(0,r.kt)("inlineCode",{parentName:"p"},"GHC-9.2/9.4"),". This is being addressed."),(0,r.kt)("p",null,"Regarding our support activities, we Released ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-sim-0.2.0.0")," and are in the process of preparing the 8.2 release of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/99b0bd12.4ff93e6b.js b/assets/js/99b0bd12.4ff93e6b.js new file mode 100644 index 00000000000..fbadac5f6b3 --- /dev/null +++ b/assets/js/99b0bd12.4ff93e6b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59798],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),d=l(n),h=o,m=d["".concat(s,".").concat(h)]||d[h]||c[h]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=h;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[d]="string"==typeof e?e:o,i[1]=p;for(var l=2;l<a;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}h.displayName="MDXCreateElement"},17110:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>p,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-06-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-06-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-12-network.md",source:"@site/blog/2023-06-12-network.md",title:"Network Team Update",description:"Network Update",date:"2023-06-12T00:00:00.000Z",formattedDate:"June 12, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.205,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-06-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-14-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-06-09-crypto"}},s={authorsImageUrls:[void 0]},l=[{value:"Network Update",id:"network-update",level:2},{value:"Key contributions and advances",id:"key-contributions-and-advances",level:3},{value:"New <code>cardano-ping</code> / <code>cardano-cli ping</code> release",id:"new-cardano-ping--cardano-cli-ping-release",level:4},{value:"Other smaller contributions",id:"other-smaller-contributions",level:3}],u={toc:l},d="wrapper";function c(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"network-update"},"Network Update"),(0,o.kt)("h3",{id:"key-contributions-and-advances"},"Key contributions and advances"),(0,o.kt)("p",null,"We merged ",(0,o.kt)("inlineCode",{parentName:"p"},"light peer sharing")," feature, which allows to include inbound peers\ninto outbound governor known peers. This is the primary way for new\nunregistered nodes to enter the network, which then can be shared using peer\nsharing. Note that peer sharing is an experimental feature which is disabled\nuntil genesis & eclipse evasion as fully implemented. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3596"},"#3596"),"."),(0,o.kt)("p",null,"We are making progress reviewing eclipse evasion, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"#3886"),"."),(0,o.kt)("p",null,"We fixed another bug in local root peers. We found out that if the local roots\nwhere ignored until the first domain name was resolved, see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4583"},"#4583"),". The bug\nfix was backported and released in ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.8.1.1"),"."),(0,o.kt)("p",null,"We re-started working on dynamically enabling block forging to address issue\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"#3159"),", which will enable us to release ",(0,o.kt)("inlineCode",{parentName:"p"},"P2P")," on block producing nodes. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/140"},"#140"),"."),(0,o.kt)("h4",{id:"new-cardano-ping--cardano-cli-ping-release"},"New ",(0,o.kt)("inlineCode",{parentName:"h4"},"cardano-ping")," / ",(0,o.kt)("inlineCode",{parentName:"h4"},"cardano-cli ping")," release"),(0,o.kt)("p",null,"We prepared a new release of ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ping")," library which supports the new\nquery feature (query supported versions). See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4589"},"#4589"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4593"},"#4593")," and ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"#5313"),".\nThe new version of ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," will use ",(0,o.kt)("inlineCode",{parentName:"p"},"ISO8601")," formatted\ntimestamps; also the formatting of ping results is slightly improved, and it\nwill introduce the new ",(0,o.kt)("inlineCode",{parentName:"p"},"--query-versions")," (",(0,o.kt)("inlineCode",{parentName:"p"},"-Q"),") switch. If the remote site\nsupports the query parameter, the command will print:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"redacted-ip:port network rtt: 0.064\nredacted-ip:port handshake rtt: 0.064010896s\nredacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat\norAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]\n")),(0,o.kt)("p",null,"otherwise it will print the negotiation results"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"redacted-ip:port network rtt: 0.045\nredacted-ip:port handshake rtt: 0.101867615s\nredacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder\n")),(0,o.kt)("p",null,"Note that in that case ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," offers ",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorAndResponder"),", which\nallows us to detect whether the remote side is an ",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorOnly")," or\n",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorAndResponder"),". Also ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," will no longer announce\nitself as ",(0,o.kt)("inlineCode",{parentName:"p"},"InitiatorAndResponder"),", except for the case mentioned above."),(0,o.kt)("h3",{id:"other-smaller-contributions"},"Other smaller contributions"),(0,o.kt)("p",null,"On a request from the Marlow Team, we published haddocks of ",(0,o.kt)("inlineCode",{parentName:"p"},"typed-protocols"),",\nwhich are now available ",(0,o.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/typed-protocols/"},"here")," (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/40"},"#40"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/41"},"#41"),")."),(0,o.kt)("p",null,"We made a new release of ",(0,o.kt)("inlineCode",{parentName:"p"},"strict-stm-1.1.0.1")," on Hackage, which fixed a bug in\npackage description file, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/101"},"#101")," ."),(0,o.kt)("p",null,"We also helped to debug a deadlock when using named pipes on Windows in the new\n",(0,o.kt)("inlineCode",{parentName:"p"},"RawBearer")," API. The API is being used to store secret keys only in memory.\nThe PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395"},"#4395")," is under review."),(0,o.kt)("p",null,"We also have two more PRs which are under review:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"#4530"),": enabling ledger peers on a fixed number of slots before the tip of the chain;"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4580"},"#4580"),": a PR which fixes inconsistencies in one of our cddl specs.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9a01d9b0.da592dca.js b/assets/js/9a01d9b0.da592dca.js new file mode 100644 index 00000000000..5080476c23e --- /dev/null +++ b/assets/js/9a01d9b0.da592dca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21158],{78905:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/23","page":23,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/22","nextPage":"/cardano-updates/page/24","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/9a03c440.55017adb.js b/assets/js/9a03c440.55017adb.js new file mode 100644 index 00000000000..7110cdf9cc6 --- /dev/null +++ b/assets/js/9a03c440.55017adb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16959],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),d=a,f=m["".concat(c,".").concat(d)]||m[d]||p[d]||o;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},66401:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2023-02-23-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i="High level summary",l={permalink:"/cardano-updates/2023-02-23-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-23-performance-and-tracing.md",source:"@site/blog/2023-02-23-performance-and-tracing.md",title:"Performance & tracing update",description:"* SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.",date:"2023-02-23T00:00:00.000Z",formattedDate:"February 23, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.245,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-02-23-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-23-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-22-consensus"}},c={authorsImageUrls:[void 0]},s=[{value:"SECP",id:"secp",level:3},{value:"UTxO-HD",id:"utxo-hd",level:3},{value:"1.35.6 release",id:"1356-release",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"NixOps backend",id:"nixops-backend",level:3}],u={toc:s},m="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork."),(0,a.kt)("li",{parentName:"ul"},"Release benchmarking: we performed a round of benchmarks for the 1.35.6 release."),(0,a.kt)("li",{parentName:"ul"},"UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup."),(0,a.kt)("li",{parentName:"ul"},"New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.")),(0,a.kt)("h1",{id:"performance"},"Performance"),(0,a.kt)("h3",{id:"secp"},"SECP"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead."),(0,a.kt)("li",{parentName:"ol"},"The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run."),(0,a.kt)("li",{parentName:"ol"},"The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking. ")),(0,a.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop."),(0,a.kt)("li",{parentName:"ol"},"We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.")),(0,a.kt)("h3",{id:"1356-release"},"1.35.6 release"),(0,a.kt)("p",null,"Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible."),(0,a.kt)("h1",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients."),(0,a.kt)("li",{parentName:"ol"},"Locality assumptions were removed and job monitoring was refactored."),(0,a.kt)("li",{parentName:"ol"},"To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster."),(0,a.kt)("li",{parentName:"ol"},"We're currently evaluating different options for genesis distribution in said cluster.")),(0,a.kt)("h3",{id:"nixops-backend"},"NixOps backend"),(0,a.kt)("p",null,"The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9a4c05df.566cf4df.js b/assets/js/9a4c05df.566cf4df.js new file mode 100644 index 00000000000..0db01dfb640 --- /dev/null +++ b/assets/js/9a4c05df.566cf4df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68077],{23401:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/cli-api/page/2","page":2,"postsPerPage":5,"totalPages":6,"totalCount":27,"previousPage":"/cardano-updates/tags/cli-api","nextPage":"/cardano-updates/tags/cli-api/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/9b5ce5fa.860ab49e.js b/assets/js/9b5ce5fa.860ab49e.js new file mode 100644 index 00000000000..b7a1a3490d4 --- /dev/null +++ b/assets/js/9b5ce5fa.860ab49e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75501],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(r),m=i,d=c["".concat(s,".").concat(m)]||c[m]||h[m]||a;return r?n.createElement(d,o(o({ref:t},u),{},{components:r})):n.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},64213:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var n=r(87462),i=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-11-08-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-08-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-08-mithril.md",source:"@site/blog/2023-11-08-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-08T00:00:00.000Z",formattedDate:"November 8, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.805,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-08-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-08-ledger"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-01-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},c="wrapper";function h(e){let{components:t,...r}=e;return(0,i.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files."),(0,i.kt)("p",null,"Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Prototype a P2P relay with ",(0,i.kt)("inlineCode",{parentName:"strong"},"libp2p"))," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,i.kt)("inlineCode",{parentName:"strong"},"mithril-client")," library")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1311"},"#1311")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},"Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,i.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,i.kt)("li",{parentName:"ul"},"Completed the issue ",(0,i.kt)("strong",{parentName:"li"},"Client Docker package is incorrect")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1322"},"#1322"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9b6092d7.8ac0135c.js b/assets/js/9b6092d7.8ac0135c.js new file mode 100644 index 00000000000..4aec0959d9c --- /dev/null +++ b/assets/js/9b6092d7.8ac0135c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48990],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},u),{},{components:n})):r.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c<o;c++)s[c]=n[c];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},90436:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2022-12-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-12-14-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-db-sync.md",source:"@site/blog/2022-12-14-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.73,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2022-12-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-12-14-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-14-node-cli-api"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DBSync team continued testing release ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.0"),". The QA team has reported that no issues have\nbeen found. The DBSync team also worked on cherry-picks back to master and on fixing bugs."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Release is cherry-picked back to master, which uses the new rollback mechanism which uses\nreverse indexes, same as the release\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1320"},"#1320"),"\nThis also fixes a bug number of issues on master."),(0,a.kt)("li",{parentName:"ul"},"Depenencies upgrade and CHaP integration\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1324"},"#1324")),(0,a.kt)("li",{parentName:"ul"},"AdaPots fix ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1323"},"#1323"),". This\nfixes an issue where the per epoch AdaPots didn't match the epoch boundary, but\nthey also included changes from the first block of the epoch."),(0,a.kt)("li",{parentName:"ul"},"Deposits Event fix ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3212"},"#3212"),". This pr\nadjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the\nnumber of queries that db-sync does during syncing an make syncing faster.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9b7a95a2.ff1a9f67.js b/assets/js/9b7a95a2.ff1a9f67.js new file mode 100644 index 00000000000..a82d2bfd4c9 --- /dev/null +++ b/assets/js/9b7a95a2.ff1a9f67.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7266],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),h=p(n),c=a,d=h["".concat(l,".").concat(c)]||h[c]||m[c]||o;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=c;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[h]="string"==typeof e?e:a,s[1]=i;for(var p=2;p<o;p++)s[p]=n[p];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}c.displayName="MDXCreateElement"},54972:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-10-18-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-18-consensus.md",source:"@site/blog/2022-10-18-consensus.md",title:"Consensus Team Update",description:"High-level summary",date:"2022-10-18T00:00:00.000Z",formattedDate:"October 18, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:3.225,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-10-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-19-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-14-hydra"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"High-level status report",id:"high-level-status-report",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Finish the UTxO HD prototype",id:"finish-the-utxo-hd-prototype",level:3},{value:"Era transition property tests",id:"era-transition-property-tests",level:4},{value:"Mempool state-machine tests",id:"mempool-state-machine-tests",level:4},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"Benchmarking the CSJ prototype",id:"benchmarking-the-csj-prototype",level:3}],u={toc:p},h="wrapper";function m(e){let{components:t,...o}=e;return(0,a.kt)(h,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,a.kt)("p",null,"During the past two weeks, the consensus team worked on adding property test for\ndifferent aspects of the UTxO HD prototype: era transitions, mempool, and\nbacking store. Thanks to these tests we were able to uncover a bug in the\nprototype. On the Genesis front, we benchmarked a different version of the\nChainSync jumping prototype to try to improve its performance, but this did not\nresult in any noticeable speedup."),(0,a.kt)("h2",{id:"high-level-status-report"},"High-level status report"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Finish the UTxO HD prototype: on track.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We focused on increasing test coverage for the UTxO-HD prototype:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We started implementing Cadano-eras transition property-tests."),(0,a.kt)("li",{parentName:"ul"},"We started implementing state-machine property-tests for the mempool."),(0,a.kt)("li",{parentName:"ul"},"We merged the mempool rewrite."),(0,a.kt)("li",{parentName:"ul"},"We started working on state-machine tests for the backing store. This\nuncovered a bug in the range-read implementation of the LMDB backing\nstore."))))),(0,a.kt)("li",{parentName:"ul"},"Genesis: on track.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We benchmarked a version of the Genesis ChainSync Jumping prototype that\nspreads out the ChainSync updates over a longer period of time. This did not\nresult in any noticeable speedup."),(0,a.kt)("li",{parentName:"ul"},"We investigated the overhead introduced by non-ChainSync components, but no\nconclusions could be drawn from the benchmarks we ran.")))),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"finish-the-utxo-hd-prototype"},"Finish the UTxO HD prototype"),(0,a.kt)("p",null,"We focused on increasing test coverage for the UTxO HD prototype. We also merged\nthe ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4049"},"mempool\nrewrite"),"."),(0,a.kt)("h4",{id:"era-transition-property-tests"},"Era transition property tests"),(0,a.kt)("p",null,"We started implementing ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4043"},"Cardano era transition property\ntests"),",\nwhich are needed for making sure that the ledger tables get updated in the\nright way when we move from one era to the next. There are at the moment two\nimportant transitions."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Byron to Shelley: where all the UTxO is transferred from in-memory Byron\nstate (which has no tables) to the ledger tables of the Shelley state."),(0,a.kt)("li",{parentName:"ul"},"Shelley to Allegra: where the AVVM addresses must be deleted.")),(0,a.kt)("p",null,"We have tests for the Byron to Shelley transitions. We are working on adding\nthe remaining ones."),(0,a.kt)("h4",{id:"mempool-state-machine-tests"},"Mempool state-machine tests"),(0,a.kt)("p",null,"We started implementing ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4044"},"state-machine property tests for the\nmempool"),".\nThe mempool is currently tested via pure property tests, and use a ledger\nstate without tables. With the introduction of UTxO HD, testing the concurrent\nbehavior of the mempool became of crucial importance (eg now we have to\nacquire locks to flush the backing store). In addition, we need to test a\nledger state with tables. These needs led to the creation of a new set of\nproperty tests. In particular we aim to run parallel state-machine tests that\nexercise the mempool in a way similar to how the node would make use of it."),(0,a.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,a.kt)("p",null,"We started working on ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4081"},"state-machine tests for the backing\nstore")," that UTxO\nHD uses. The property tests uncovered errors in the range-reads implementation\nof the LMDB backing store. To facilitate fixing this bug, we made\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"changes")," to the Haskell\nLMDB bindings."),(0,a.kt)("h3",{id:"benchmarking-the-csj-prototype"},"Benchmarking the CSJ prototype"),(0,a.kt)("p",null,"Prompted by previous benchmarks showing significant improvements in sync time by\nusing more capabilities, we implemented a way to spread out the ChainSync\nupdates over a larger period instead of firing them all at the same time. This\ndidn't result in a noticeable speedup."),(0,a.kt)("p",null,"We also benchmarked the prototype with CSJ disabled (such that just the dynamo\npeer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule\nout/confirm overhead by non-ChainSync (mainly BlockFetch) related components.\nThis results in era-specific behavior (speed is like the prototype in Byron, but\nlike the baseline in Shelley). This deserves a closer look in the future."),(0,a.kt)("p",null,"This diagram shows the respective syncing progress, starting at Genesis and\ncontinuing a good part into Shelley (with the dashed line indicating the\nByron-to-Shelley transition)."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Red: baseline"),(0,a.kt)("li",{parentName:"ul"},"Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps."),(0,a.kt)("li",{parentName:"ul"},"Blue: like Green, jumps are spread out."),(0,a.kt)("li",{parentName:"ul"},"Orange: variant with no jumping, to measure unrelated overhead.")),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(35555).Z,width:"654",height:"459"})))}m.isMDXComponent=!0},35555:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/happy-path-csj-prototype-bench-2-e23d2986ddef0a187df9ce336b2db116.svg"}}]); \ No newline at end of file diff --git a/assets/js/9ba26136.1faa833c.js b/assets/js/9ba26136.1faa833c.js new file mode 100644 index 00000000000..e8fe9fd771b --- /dev/null +++ b/assets/js/9ba26136.1faa833c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62231],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),s=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=s(r),h=n,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||a;return r?o.createElement(m,p(p({ref:t},u),{},{components:r})):o.createElement(m,p({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,p=new Array(a);p[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:n,p[1]=i;for(var s=2;s<a;s++)p[s]=r[s];return o.createElement.apply(null,p)}return o.createElement.apply(null,r)}h.displayName="MDXCreateElement"},19146:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>p,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var o=r(87462),n=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-10-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},p=void 0,i={permalink:"/cardano-updates/2023-10-15-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-15-network.md",source:"@site/blog/2023-10-15-network.md",title:"Network Team Update",description:"High-level overview of sprint 46",date:"2023-10-15T00:00:00.000Z",formattedDate:"October 15, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.59,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-10-15-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-18-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-13-hydra"}},l={authorsImageUrls:[void 0]},s=[{value:"High-level overview of sprint 46",id:"high-level-overview-of-sprint-46",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"Towards Typed Protocols 0.2.0.0",id:"towards-typed-protocols-0200",level:3},{value:"Peer Sharing",id:"peer-sharing",level:3},{value:"Tech Debt",id:"tech-debt",level:3}],u={toc:s},c="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-46"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+46%22"},"sprint 46")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We continued reviewing of bootstrap peers, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4555"},"ouroboros-network#4555"),"."),(0,n.kt)("h3",{id:"towards-typed-protocols-0200"},"Towards Typed Protocols 0.2.0.0"),(0,n.kt)("p",null,"We diagnosed the performance regression of the new design. The work on\n",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols")," will be postponed. For more details see the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/3"},"typed-protocols#3"),". As an outcome of the performance debugging we prepared\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4691"},"PR")," which updates the ",(0,n.kt)("inlineCode",{parentName:"p"},"demo-ping-pong")," and\n",(0,n.kt)("inlineCode",{parentName:"p"},"demo-chain-sync")," applications."),(0,n.kt)("h3",{id:"peer-sharing"},"Peer Sharing"),(0,n.kt)("p",null,"We made progress in review of ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4644"},"ouroboros-network#4644"),", which simplifies the\npeer sharing and fixes the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4642"},"ouroboros-network#4642")," issue."),(0,n.kt)("h3",{id:"tech-debt"},"Tech Debt"),(0,n.kt)("p",null,"We reviewed the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3836"},"ouroboros-network#3836")," PR which inspects all the uses of\n",(0,n.kt)("inlineCode",{parentName:"p"},"error")," in ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),". The PR was prepared by Galois."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9bcfaf7c.459a8722.js b/assets/js/9bcfaf7c.459a8722.js new file mode 100644 index 00000000000..477cf7f8742 --- /dev/null +++ b/assets/js/9bcfaf7c.459a8722.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27850],{13927:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/48","page":48,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/47","nextPage":"/cardano-updates/page/49","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/9c662d1f.abf660e9.js b/assets/js/9c662d1f.abf660e9.js new file mode 100644 index 00000000000..57ab6789310 --- /dev/null +++ b/assets/js/9c662d1f.abf660e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75773],{23714:a=>{a.exports=JSON.parse('{"label":"mithril","permalink":"/cardano-updates/tags/mithril","allTagsPath":"/cardano-updates/tags","count":34}')}}]); \ No newline at end of file diff --git a/assets/js/9c7979b1.e1cf42fe.js b/assets/js/9c7979b1.e1cf42fe.js new file mode 100644 index 00000000000..d59667898c5 --- /dev/null +++ b/assets/js/9c7979b1.e1cf42fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31757],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),s=i(a),m=n,h=s["".concat(u,".").concat(m)]||s[m]||d[m]||o;return a?r.createElement(h,l(l({ref:t},c),{},{components:a})):r.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p[s]="string"==typeof e?e:n,l[1]=p;for(var i=2;i<o;i++)l[i]=a[i];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},71635:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>i});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-08-18-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-08-18-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-sre.md",source:"@site/blog/2023-08-18-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.66,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-08-18-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-18-network"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-17-crypto"}},u={authorsImageUrls:[void 0]},i=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Inputs-check",id:"inputs-check",level:3}],c={toc:i},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet and shelley-qa environments were updated to 8.2.1-pre."),(0,n.kt)("li",{parentName:"ul"},"Work on two new repos utilizing ",(0,n.kt)("a",{parentName:"li",href:"https://flake.parts"},"flake parts")," for cardano cluster generation, automation and operation.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"cardano-parts")," -- Nix flake parts for cardano clusters"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground")," -- Cardano testnet clusters")))),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano p2p relay and alert threshold adjustments: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/c4a04cc...5a0eabe"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"cardano-parts"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Misc improvements to perf cluster functionality: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf/compare/0944c40...d3a8644"},"cardano-perf-compare"))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improve explorer topology generation alerting: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/109"},"cardano-world-pull-109")),(0,n.kt)("li",{parentName:"ul"},"Update p2p configs: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/110"},"cardano-world-pull-110"))),(0,n.kt)("h3",{id:"inputs-check"},"Inputs-check"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A flake parts module to check input closure sizes recursively for optimization considerations: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/inputs-check"},"inputs-check"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9c96fa11.ea8e50f7.js b/assets/js/9c96fa11.ea8e50f7.js new file mode 100644 index 00000000000..d56cc62a7f8 --- /dev/null +++ b/assets/js/9c96fa11.ea8e50f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90178],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(a),c=n,h=d["".concat(u,".").concat(c)]||d[c]||m[c]||o;return a?r.createElement(h,i(i({ref:t},p),{},{components:a})):r.createElement(h,i({ref:t},p))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},42764:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-31-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-31-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-hydra.md",source:"@site/blog/2023-03-31-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.82,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-31-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-31-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-31-ledger"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},d="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra continued work on finishing mainnet compatibility. The\nsemi-automated smoke tests and some missing documentation is still preventing\nfrom calling that fully done. They fixed smaller issues and made a step in the\nHead protocol more robust. Besides development, they met with interested people\nfrom the community who want to get started collaborating on communication and\nmarketing materials."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Groomed and followed-up on ",(0,n.kt)("inlineCode",{parentName:"li"},"GetUTxO")," user request discussion ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/discussions/797"},"#797")),(0,n.kt)("li",{parentName:"ul"},"Fixed ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")," crashes after forks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/560"},"#560")),(0,n.kt)("li",{parentName:"ul"},"Made ",(0,n.kt)("inlineCode",{parentName:"li"},"collectCom")," more robust and aligned with spec ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/786"},"#786")),(0,n.kt)("li",{parentName:"ul"},"Completed configurable API feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/380"},"#380")),(0,n.kt)("li",{parentName:"ul"},"Met potential contributors about Hydra communication and marketing materials"),(0,n.kt)("li",{parentName:"ul"},"Versioned documentation: we have a ",(0,n.kt)("inlineCode",{parentName:"li"},"unstable")," bleeding edge version available as well now, seperate from the last released version")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Follow-up backlog and roadmap clean-up"),(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713")," (documentation updates)"),(0,n.kt)("li",{parentName:"ul"},"Integrate Hydra specification into repository ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9cab6d73.47f4f611.js b/assets/js/9cab6d73.47f4f611.js new file mode 100644 index 00000000000..b421bdc6cd0 --- /dev/null +++ b/assets/js/9cab6d73.47f4f611.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93203],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),u=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),p=u(a),m=n,d=p["".concat(s,".").concat(m)]||p[m]||c[m]||o;return a?r.createElement(d,i(i({ref:t},h),{},{components:a})):r.createElement(d,i({ref:t},h))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},72305:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-07-07-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-07-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-hydra.md",source:"@site/blog/2023-07-07-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.865,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-07-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-07-goedel"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-07-sre"}},s={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},p="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week the Hydra team accomplished some nice progress. They secured the\nnetwork layer further by implementing authentication of the messages between the\npeers in the Head protocol. In the process they also managed to separate\nHeartBeat messages from the protocol ones which somewhat improved the quality of\ncode in Hydra. The team also finished work related to sending only transaction\nids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark\npublishing on the website."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"Implemented")," authenticated messages"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"Implemented")," send only transaction ids in ReqSn messages"),(0,n.kt)("li",{parentName:"ul"},"Separate ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/969"},"HeartBeat")," messages from the core network protocol messages"),(0,n.kt)("li",{parentName:"ul"},"Publish multiple pre-defined ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/947"},"benchmarks")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/967"},"Fixed")," a smoke-test issue where funds would not be returned to the faucet"),(0,n.kt)("li",{parentName:"ul"},"Found a bug in the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-ghsa-c8qp-cv4h-vcc4/pull/1"},"off-chain signature\nverification"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Spike on performance improvements of event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/913"},"#913")),(0,n.kt)("li",{parentName:"ul"},"Add new endpoint for submitting client transactions"),(0,n.kt)("li",{parentName:"ul"},"Remove commit from internal wallet")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9ce37f6e.77804269.js b/assets/js/9ce37f6e.77804269.js new file mode 100644 index 00000000000..38abfb1b58b --- /dev/null +++ b/assets/js/9ce37f6e.77804269.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[66764],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(a),d=n,m=h["".concat(s,".").concat(d)]||h[d]||c[d]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},79098:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-12-01-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-12-01-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-01-hydra.md",source:"@site/blog/2023-12-01-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-12-01T00:00:00.000Z",formattedDate:"December 1, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.865,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-12-01-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-12-04-performance-and-tracing"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-29-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],u={toc:p},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team conducted a packed Monthly Review meeting,\nfeaturing demonstrations and the preparation of the monthly report. They\naddressed flakiness in tests and enhanced the logs json schema,\nimproving overall test reliability. Additionally, the team successfully\nbuilt MacOS ARM64 (",(0,n.kt)("inlineCode",{parentName:"p"},"aarch64-darwin"),") binaries in CI, expanding platform\nsupport. They further improved the network configuration by detecting\nincompatible persisted states, contributing to overall system\nrobustness. Finally, the team released version 0.14.0, highlighting\ntheir commitment to delivering regular updates and improvements."),(0,n.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly Review\n",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/1-iv8IveUzA2KrJV_Kqrgx4ts05Ow0zjM"},"meeting"),"\npacked with demonstrations and prepared monthly report\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1189"},"#","1189")),(0,n.kt)("li",{parentName:"ul"},"Fixed several flaky tests and improved the logs json schema\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1188"},"#","1188"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1190"},"#","1190"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1192"},"#","1192")),(0,n.kt)("li",{parentName:"ul"},"Built MacOS ARM64 (",(0,n.kt)("inlineCode",{parentName:"li"},"aarch64-darwin"),") binaries in CI\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1182"},"#","1182")),(0,n.kt)("li",{parentName:"ul"},"Improved network configuration by detecting incompatible persisted\nstates ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1174"},"#","1174")),(0,n.kt)("li",{parentName:"ul"},"Released version 0.14.0")),(0,n.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Start work on incremental decommit"),(0,n.kt)("li",{parentName:"ul"},"Continue shepherding contributed PRs to completion"),(0,n.kt)("li",{parentName:"ul"},"Finish stateless-observation work"),(0,n.kt)("li",{parentName:"ul"},"Open a head on a Conway network")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d43e047.df69749e.js b/assets/js/9d43e047.df69749e.js new file mode 100644 index 00000000000..71935da7f44 --- /dev/null +++ b/assets/js/9d43e047.df69749e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78148],{29117:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/29","page":29,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/28","nextPage":"/cardano-updates/page/30","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/9d7869bb.35b4854a.js b/assets/js/9d7869bb.35b4854a.js new file mode 100644 index 00000000000..a6823287321 --- /dev/null +++ b/assets/js/9d7869bb.35b4854a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[37734],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?n(Object(a),!0).forEach((function(t){l(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):n(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,l=function(e,t){if(null==e)return{};var a,r,l={},n=Object.keys(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=u(a),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||n;return a?r.createElement(h,o(o({ref:t},d),{},{components:a})):r.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:l,o[1]=i;for(var u=2;u<n;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}s.displayName="MDXCreateElement"},91509:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-09-01-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-09-01-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-ledger.md",source:"@site/blog/2023-09-01-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.355,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-09-01-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-01-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-09-01-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3},{value:"Testing",id:"testing",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"Broadly speaking the Ledger team focused on a few main areas of Conway era:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Creation of voting state snapshots in order to correctly delay ratification for one epoch"),(0,l.kt)("li",{parentName:"ul"},"Validation of the Governance Actions sequencing and ordering"),(0,l.kt)("li",{parentName:"ul"},"Proper expiry of DReps and Proposal Procedures"),(0,l.kt)("li",{parentName:"ul"},"Expanding Conway Genesis functionality"),(0,l.kt)("li",{parentName:"ul"},"Utilization of some of the new Protocol Parameters in ledger validation rules")),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway-era"},"Conway era"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3659"},"pull-3659")," - Validate Network for ProposalProcedure and TreasuryWithdrawal"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3637"},"pull-3637")," - Avoid using sequence of tuples, by adding GovActionId to GovActionState"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3651"},"pull-3651")," - Inactive DReps"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3664"},"pull-3664")," - Track proposal expiry"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3668"},"pull-3668")," - Add min committee size predicate to NewCommittee"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3669"},"pull-3669")," - Add Proposal deposit check against PParam"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3676"},"pull-3676")," - Fix inactive PoolStake not counting as Drep Stake"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3635"},"pull-3635")," - Make snapshots of GovActionsState"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3670"},"pull-3670")," - Validate previously enacted govAction"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3694"},"pull-3694")," - Improve error reporting on the positive coin decoder"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3674"},"pull-3674")," - Added RATIFY thresholds"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3684"},"pull-3684")," - Add proposal delaying, remove predicate failure from ENACT"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3688"},"pull-3688")," - DRep Refunds and update evalTransactionBalance")),(0,l.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3677"},"pull-3677")," - Minor patch that fixes the DRep distribution computation"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3686"},"pull-3686")," - Post patch release fixup"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3695"},"pull-3695")," - Changelog for cardano-node-8.3 release"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3683"},"pull-3683")," - Add two new bench mark programs")),(0,l.kt)("h3",{id:"testing"},"Testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3662"},"pull-3662")," - Equality on raw types")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9dce568f.09ea27c7.js b/assets/js/9dce568f.09ea27c7.js new file mode 100644 index 00000000000..bc32fe6afa8 --- /dev/null +++ b/assets/js/9dce568f.09ea27c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35029],{35560:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/network","page":1,"postsPerPage":5,"totalPages":5,"totalCount":24,"nextPage":"/cardano-updates/tags/network/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/9dee36e7.c9cec439.js b/assets/js/9dee36e7.c9cec439.js new file mode 100644 index 00000000000..714aef547c8 --- /dev/null +++ b/assets/js/9dee36e7.c9cec439.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58744],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),i=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),s=i(a),m=n,h=s["".concat(u,".").concat(m)]||s[m]||d[m]||o;return a?r.createElement(h,l(l({ref:t},c),{},{components:a})):r.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p[s]="string"==typeof e?e:n,l[1]=p;for(var i=2;i<o;i++)l[i]=a[i];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},57912:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>i});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-08-18-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-08-18-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-sre.md",source:"@site/blog/2023-08-18-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.66,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-08-18-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-18-network"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-17-crypto"}},u={authorsImageUrls:[void 0]},i=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-perf",id:"cardano-perf",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Inputs-check",id:"inputs-check",level:3}],c={toc:i},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet and shelley-qa environments were updated to 8.2.1-pre."),(0,n.kt)("li",{parentName:"ul"},"Work on two new repos utilizing ",(0,n.kt)("a",{parentName:"li",href:"https://flake.parts"},"flake parts")," for cardano cluster generation, automation and operation.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"cardano-parts")," -- Nix flake parts for cardano clusters"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground")," -- Cardano testnet clusters")))),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano p2p relay and alert threshold adjustments: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/c4a04cc...5a0eabe"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"cardano-parts"))),(0,n.kt)("h3",{id:"cardano-perf"},"Cardano-perf"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Misc improvements to perf cluster functionality: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf/compare/0944c40...d3a8644"},"cardano-perf-compare"))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New repo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Improve explorer topology generation alerting: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/109"},"cardano-world-pull-109")),(0,n.kt)("li",{parentName:"ul"},"Update p2p configs: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/110"},"cardano-world-pull-110"))),(0,n.kt)("h3",{id:"inputs-check"},"Inputs-check"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A flake parts module to check input closure sizes recursively for optimization considerations: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/inputs-check"},"inputs-check"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.47006cd4.js b/assets/js/9e4087bc.47006cd4.js new file mode 100644 index 00000000000..c1b0c61b66a --- /dev/null +++ b/assets/js/9e4087bc.47006cd4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53608],{63169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(67294),l=a(39960),n=a(95999),c=a(1944),m=a(93285);function s(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function i(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(s,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),s=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(m.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,s.length>0&&r.createElement(i,{years:s}))))}}}]); \ No newline at end of file diff --git a/assets/js/9e570fef.3918b741.js b/assets/js/9e570fef.3918b741.js new file mode 100644 index 00000000000..483b53ccf27 --- /dev/null +++ b/assets/js/9e570fef.3918b741.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32925],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>g});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},m=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),s=c(r),d=a,g=s["".concat(p,".").concat(d)]||s[d]||u[d]||o;return r?n.createElement(g,l(l({ref:t},m),{},{components:r})):n.createElement(g,l({ref:t},m))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},62129:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-09-15-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-15-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-goedel.md",source:"@site/blog/2023-09-15-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.44,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-09-15-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-20-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-15-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],m={toc:c},s="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"working on collating and open sourcing performance analysis prototype")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"improvements to Ouroboros Praos specification in Isabelle")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"working on formalising chain sync mini-protocol")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"reviewing an alternatice semantics for DeltaQ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Seminar talk at U. Bergen on algebraic properties of timeliness"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e834cf3.1e4d257a.js b/assets/js/9e834cf3.1e4d257a.js new file mode 100644 index 00000000000..46ea8d8d0b5 --- /dev/null +++ b/assets/js/9e834cf3.1e4d257a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24941],{36262:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/13","page":13,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/12","nextPage":"/cardano-updates/page/14","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/9e9bda24.2571a9f9.js b/assets/js/9e9bda24.2571a9f9.js new file mode 100644 index 00000000000..b67691d21bd --- /dev/null +++ b/assets/js/9e9bda24.2571a9f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48679],{30570:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/50","page":50,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/49","nextPage":"/cardano-updates/page/51","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/9f70a142.92a32352.js b/assets/js/9f70a142.92a32352.js new file mode 100644 index 00000000000..f80bc8d4f46 --- /dev/null +++ b/assets/js/9f70a142.92a32352.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6169],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=s(r),h=n,g=m["".concat(u,".").concat(h)]||m[h]||c[h]||i;return r?a.createElement(g,l(l({ref:t},p),{},{components:r})):a.createElement(g,l({ref:t},p))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=h;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[m]="string"==typeof e?e:n,l[1]=o;for(var s=2;s<i;s++)l[s]=r[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}h.displayName="MDXCreateElement"},4756:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2022-12-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2022-12-09-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-crypto.md",source:"@site/blog/2022-12-09-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2022-12-09T00:00:00.000Z",formattedDate:"December 9, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.39,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-12-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-12-12-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-09-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"MuSig2",id:"musig2",level:3},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:2}],p={toc:s},m="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The four open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency. "),(0,n.kt)("li",{parentName:"ul"},"Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe. "),(0,n.kt)("li",{parentName:"ul"},"cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"[Still in progress]"," We are introducing a more granular error handling mechanism ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/33"},"PR#33")),(0,n.kt)("li",{parentName:"ul"},"We merged the API redesig ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/35"},"PR#35")),(0,n.kt)("li",{parentName:"ul"},"We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/36"},"PR#36"))),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We merged the individual signature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/620"},"PR#620")),(0,n.kt)("li",{parentName:"ul"},"We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes/commits/master"},"kes repo"),") ")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Nothing new to report. Still working in merging these PRs. "),(0,n.kt)("li",{parentName:"ul"},"We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a ",(0,n.kt)("a",{parentName:"li",href:"https://gitlab.haskell.org/ghc/ghc/-/issues/22564"},"bug in GHC"))),(0,n.kt)("h2",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We keep progressing in the secure forgetting PR and resolving some bugs on memory handling ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"PR#255")),(0,n.kt)("li",{parentName:"ul"},"Fixed a 'use-after-free' bug in the KES agent.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9f761678.efd79bb9.js b/assets/js/9f761678.efd79bb9.js new file mode 100644 index 00000000000..20378dd151c --- /dev/null +++ b/assets/js/9f761678.efd79bb9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[278],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),c=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),s=c(r),m=n,h=s["".concat(u,".").concat(m)]||s[m]||d[m]||o;return r?a.createElement(h,i(i({ref:t},p),{},{components:r})):a.createElement(h,i({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var c=2;c<o;c++)i[c]=r[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},32230:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2023-04-28-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-28-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-crypto.md",source:"@site/blog/2023-04-28-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-04-28T00:00:00.000Z",formattedDate:"April 28, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.26,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-04-28-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-05-01-db-sync"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-28-goedel"}},u={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3}],p={toc:c},s="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library."),(0,n.kt)("li",{parentName:"ul"},"KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction."),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Started implementing ECC chip of JubJub over BLS12-381.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"#255")," finally merged \ud83c\udf89"),(0,n.kt)("li",{parentName:"ul"},"Additional tests for BLS bindings ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/384"},"#384")),(0,n.kt)("li",{parentName:"ul"},"Open PR for including test vectors created with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/zkcrypto/bls12_381"},"zkscrypto"),"'s library, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/397"},"PR#397"))),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/389"},"PR#389"),"."),(0,n.kt)("li",{parentName:"ul"},"Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"#317"),"."),(0,n.kt)("li",{parentName:"ul"},"Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim"),(0,n.kt)("li",{parentName:"ul"},"Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes"),(0,n.kt)("li",{parentName:"ul"},"Refactor MonadSodium into MonadMLock ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/388"},"PR#388"),".")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)"),(0,n.kt)("li",{parentName:"ul"},"Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9f7c2154.b8bd5c7b.js b/assets/js/9f7c2154.b8bd5c7b.js new file mode 100644 index 00000000000..c3a253e237c --- /dev/null +++ b/assets/js/9f7c2154.b8bd5c7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32472],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?o(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},o=Object.keys(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",h={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=u(a),m=r,s=d["".concat(p,".").concat(m)]||d[m]||h[m]||o;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[d]="string"==typeof t?t:r,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},35890:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-12-28-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-12-28-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-28-node-cli-api.md",source:"@site/blog/2022-12-28-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-12-28T00:00:00.000Z",formattedDate:"December 28, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.325,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-12-28-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-05-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-16-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function h(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-12-28---2023-01-10"},"2022-12-28 - 2023-01-10"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4762"},"Fix hedgehog-extras sha hash")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4759"},"Update hegehog-extras bounds")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4751"},"GitHub token fix")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4743"},"Use setup-haskell action")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4738"},"Use Github Action to install libsecp256k1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4714"},"Update index state and hedgehog-extras.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4710"},"Cleaned cabal files")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4737"},"Add cache versioning")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4742"},"Delete obsolete scripts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4746"},"Use SECURITY.md published in Cardano Engineering Handbook"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4749"},"Filter out duplicate collateral inputs in tx build cmds")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4754"},"Optimise query stake-snapshot command"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Copyright updates"))),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9fba849d.b41ee22a.js b/assets/js/9fba849d.b41ee22a.js new file mode 100644 index 00000000000..aa3e434330d --- /dev/null +++ b/assets/js/9fba849d.b41ee22a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[82941],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),s=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),h=s(a),m=n,d=h["".concat(l,".").concat(m)]||h[m]||c[m]||o;return a?r.createElement(d,i(i({ref:t},u),{},{components:a})):r.createElement(d,i({ref:t},u))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[h]="string"==typeof e?e:n,i[1]=p;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},14990:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-11-04-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2022-11-04-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-hydra.md",source:"@site/blog/2022-11-04-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-11-04T00:00:00.000Z",formattedDate:"November 4, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.935,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-04-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-11-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-04-mithril"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:s},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun ",(0,n.kt)("inlineCode",{parentName:"p"},"preview")," network, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},"0.8.0 release notes"),". They also completed implementation of ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/adr/18/"},"ADR18")," and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-poc/issues/195#issuecomment-1300503557"},"#195")," and alignment of the specification document with auditors."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete and merge ADR18 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/579"},"#579")),(0,n.kt)("li",{parentName:"ul"},"Re-deploy hydra scripts to respun ",(0,n.kt)("inlineCode",{parentName:"li"},"preview")," network, see ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},"0.8.0 release notes")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/595"},"#595")),(0,n.kt)("li",{parentName:"ul"},"Have first gap of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/452"},"#452")," in review."),(0,n.kt)("li",{parentName:"ul"},"Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot."),(0,n.kt)("li",{parentName:"ul"},"Engineering meeting to discuss hard forks and protocol parameter updates ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/195#issuecomment-1300503557"},"#195")),(0,n.kt)("li",{parentName:"ul"},"Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions."),(0,n.kt)("li",{parentName:"ul"},"Drafted project scope for an external audit RFP.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement event-sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Answer the internal auditor","\u2019","s questions"),(0,n.kt)("li",{parentName:"ul"},"Have a draft RFP ready for a first review internally"),(0,n.kt)("li",{parentName:"ul"},"Close some gaps ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/452"},"#452"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a040c838.3f6e8559.js b/assets/js/a040c838.3f6e8559.js new file mode 100644 index 00000000000..363820d64e6 --- /dev/null +++ b/assets/js/a040c838.3f6e8559.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[9499],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=n,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?a.createElement(h,i(i({ref:t},s),{},{components:r})):a.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},85704:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2023-06-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-09-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-crypto.md",source:"@site/blog/2023-06-09-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-06-09T00:00:00.000Z",formattedDate:"June 9, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.705,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-06-09-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-12-network"},nextItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-06-09-developer-experience"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"cardano-base",id:"cardano-base",level:3},{value:"Mithril",id:"mithril",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-base: E2E tests for BLS bindings and KES agent "),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Implement ECC chip and Rescue hash primitives for ATMS"),(0,n.kt)("li",{parentName:"ul"},"mithril: Full node verifier")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"RawBearer API in ouroboros-network-framework (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395)"},"https://github.com/input-output-hk/ouroboros-network/pull/4395)"),"; blocked due to issue with windows' localSnocket. Trying to resolve."),(0,n.kt)("li",{parentName:"ul"},"Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"#317"),"."),(0,n.kt)("li",{parentName:"ul"},"Above, blocked by the simplification of typeclasses ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/404"},"#404"),"."),(0,n.kt)("li",{parentName:"ul"},"Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings")),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implementation of Full Node Verifier ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"))),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sidechains-zk/tree/master/prover/src/ecc"},"ECC chip")," implemented for JubJub over BLS12-381"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sidechains-zk/tree/master/prover/src/rescue"},"Rescue chip")," implemented for hashing."),(0,n.kt)("li",{parentName:"ul"},"Currently working on Schnorr signature (which uses the above constraints)")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a0d18a99.9c37ba0b.js b/assets/js/a0d18a99.9c37ba0b.js new file mode 100644 index 00000000000..939a555fceb --- /dev/null +++ b/assets/js/a0d18a99.9c37ba0b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62767],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>g});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),d=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=d(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=d(r),m=n,g=s["".concat(u,".").concat(m)]||s[m]||c[m]||o;return r?a.createElement(g,l(l({ref:t},p),{},{components:r})):a.createElement(g,l({ref:t},p))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:n,l[1]=i;for(var d=2;d<o;d++)l[d]=r[d];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},11960:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-11-07-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/quarterly/2022-11-07-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-07-ledger.md",source:"@site/quarterly/2022-11-07-ledger.md",title:"Ledger Team Update",description:"Ledger Quarterly Update",date:"2022-11-07T00:00:00.000Z",formattedDate:"November 7, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/quarterly/tags/ledger"}],readingTime:1.255,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-07-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/quarterly/2022-11-09-network"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/quarterly/2022-10-07-node-cli-api"}},u={authorsImageUrls:[void 0]},d=[{value:"Ledger Quarterly Update",id:"ledger-quarterly-update",level:2},{value:"2022-09 - 2022-11-04",id:"2022-09---2022-11-04",level:2},{value:"Next steps",id:"next-steps",level:2}],p={toc:d},s="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"ledger-quarterly-update"},"Ledger Quarterly Update"),(0,n.kt)("h2",{id:"2022-09---2022-11-04"},"2022-09 - 2022-11-04"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We finished a minimal ledger era capable of master key rotation.\nThis will be re-purposed our upcoming work."),(0,n.kt)("li",{parentName:"ul"},"We have the humble beginnings of a proper ledger API."),(0,n.kt)("li",{parentName:"ul"},"We improved the problematic cost model serialization\n(recall the song and dance about updating the cost model one epoch after the hard fork)."),(0,n.kt)("li",{parentName:"ul"},"We have added benchmarks for problematic areas."),(0,n.kt)("li",{parentName:"ul"},"Massive repository restructure and cleanup.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Unified and consistent variable name schemes (not completely finished, but nearly there)."),(0,n.kt)("li",{parentName:"ul"},"Massive reduction in type constraints, which causes a lot of developer friction,\nin our code and also downstream."),(0,n.kt)("li",{parentName:"ul"},"More organized module structures."),(0,n.kt)("li",{parentName:"ul"},"Improved generators for our property tests."),(0,n.kt)("li",{parentName:"ul"},"We removed our dependency on cardano-prelude."))),(0,n.kt)("li",{parentName:"ul"},"The formal ledger model has come a long way.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"We created a fork of Agda that provides some meta-programming support for the ledger rules."),(0,n.kt)("li",{parentName:"ul"},"We have a large amount of the basic UTxO support in the model."),(0,n.kt)("li",{parentName:"ul"},"We can generate a good looking PDF from the model."),(0,n.kt)("li",{parentName:"ul"},"We can produce Haskell from the model."),(0,n.kt)("li",{parentName:"ul"},"We have a nice finite set theory library that we can use for many of the ledger rules."),(0,n.kt)("li",{parentName:"ul"},"We have nix support for the model.")))),(0,n.kt)("h2",{id:"next-steps"},"Next steps"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Individual tracking of deposits. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3113"},"issue-3113"),"]"),(0,n.kt)("li",{parentName:"ul"},"Versioned CBOR encoders/decoders. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3014"},"issue-3014"),"]"),(0,n.kt)("li",{parentName:"ul"},"New ledger era transaction body (and the surround work associated with it)."),(0,n.kt)("li",{parentName:"ul"},"Designs for the next ledger era.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a0fc6770.402665bb.js b/assets/js/a0fc6770.402665bb.js new file mode 100644 index 00000000000..b6918edb446 --- /dev/null +++ b/assets/js/a0fc6770.402665bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59158],{94032:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/db-sync/page/2","page":2,"postsPerPage":5,"totalPages":3,"totalCount":14,"previousPage":"/cardano-updates/tags/db-sync","nextPage":"/cardano-updates/tags/db-sync/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/a14fd889.9bf1cea0.js b/assets/js/a14fd889.9bf1cea0.js new file mode 100644 index 00000000000..e499c643739 --- /dev/null +++ b/assets/js/a14fd889.9bf1cea0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87326],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=n,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<a;s++)o[s]=r[s];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},16410:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-10-18-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-18-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-18-mithril.md",source:"@site/blog/2023-10-18-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-18T00:00:00.000Z",formattedDate:"October 18, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.07,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-18-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-18-consensus"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-15-network"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay."),(0,n.kt)("p",null,"Finally, they enhanced the CI/CD to publish multiple packages to ",(0,n.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io")," and started improving the developer experience with the Mithril devnet."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published the security advisory ",(0,n.kt)("strong",{parentName:"li"},"Mithril relay could expose Cardano block producer internal IP when updated")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/security/advisories/GHSA-9m3h-72xj-x2gq"},"#GHSA-9m3h-72xj-x2gq")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P Networking - Proof of Concept")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate a library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1141"},"#1141")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano transactions history PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"ProtocolKeyRegistration")," creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1187"},"#1187")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Publish multiple packages to ",(0,n.kt)("inlineCode",{parentName:"strong"},"crates.io"))," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1298"},"#1298")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Rename public key published in releases")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1292"},"#1292")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Mithril networks infrastructure maintenance")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1218"},"#1218")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Fix ",(0,n.kt)("inlineCode",{parentName:"strong"},"devnet")," Mithril Docker images")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1272"},"#1272"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a1597564.186e8185.js b/assets/js/a1597564.186e8185.js new file mode 100644 index 00000000000..956e603385a --- /dev/null +++ b/assets/js/a1597564.186e8185.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60715],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=s(r),g=n,h=d["".concat(u,".").concat(g)]||d[g]||c[g]||o;return r?a.createElement(h,l(l({ref:t},p),{},{components:r})):a.createElement(h,l({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=g;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var s=2;s<o;s++)l[s]=r[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}g.displayName="MDXCreateElement"},33286:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2023-02-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-02-02-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-02-ledger.md",source:"@site/blog/2023-02-02-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-02-02T00:00:00.000Z",formattedDate:"February 2, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.23,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-02-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-03-hydra"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-27-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Ledger evolution CIP",id:"ledger-evolution-cip",level:3},{value:"Serialization issues",id:"serialization-issues",level:3},{value:"New tests",id:"new-tests",level:3},{value:"Progress on a better cost model serialization situation.",id:"progress-on-a-better-cost-model-serialization-situation",level:3},{value:"Nightly tests",id:"nightly-tests",level:3},{value:"Constraint based generators",id:"constraint-based-generators",level:3}],p={toc:s},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"Much of the work the past two weeks involved integration efforts,\ncleaning up and debugging some serialization issues,\nadding tests, and work on large projects that are still ongoing.\nWe also released a CIP this week that aims to make the ledger\na registered CIP category."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"ledger-evolution-cip"},"Ledger evolution CIP"),(0,n.kt)("p",null,"We published a\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/456"},"CIP"),"\nthat will make the Cardano ledger a registered category of the CIP process."),(0,n.kt)("h3",{id:"serialization-issues"},"Serialization issues"),(0,n.kt)("p",null,"We had previously thought that we had found a serialization problem with the redeemers,\nbut it turned out to just be particularly confusing code.\nWe have now clarified the issue for the future."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3263"},"pull-3263"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3269"},"pull-3269"),", and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3268"},"pull-3268"),"."),(0,n.kt)("p",null,"Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3277"},"pull-3277"),"."),(0,n.kt)("h3",{id:"new-tests"},"New tests"),(0,n.kt)("p",null,"We added a new property test suite for some of our custom containers."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3270"},"pull-3270"),"."),(0,n.kt)("h3",{id:"progress-on-a-better-cost-model-serialization-situation"},"Progress on a better cost model serialization situation."),(0,n.kt)("p",null,"We are still working our way through ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/2902"},"issue-2902"),".\nTowards this end, we are now properly gating the new flexible encoders\nuntil version 9."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3274"},"pull-3274"),"."),(0,n.kt)("h3",{id:"nightly-tests"},"Nightly tests"),(0,n.kt)("p",null,"We are still experimenting with moving more CI actions to GitHub actions."),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3276"},"pull-3276"),"."),(0,n.kt)("h3",{id:"constraint-based-generators"},"Constraint based generators"),(0,n.kt)("p",null,"We continue to add to our proof of concept for constraint based generators.\nSee the previous ledger update for more information about this project."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a1ac97eb.58460967.js b/assets/js/a1ac97eb.58460967.js new file mode 100644 index 00000000000..5ae2a2a1094 --- /dev/null +++ b/assets/js/a1ac97eb.58460967.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36463],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},25274:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-11-30-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2022-11-30-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-node-cli-api.md",source:"@site/blog/2022-11-30-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-11-30T00:00:00.000Z",formattedDate:"November 30, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.01,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-11-30-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-30-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-30-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-11-30---2022-12-13"},"2022-11-30 - 2022-12-13"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped. "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4675"},"Append tx output in cli transaction build command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4592"},"Update Error messages in cardano-cli"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4675"},"Replace Data.Map with Data.Map.Strict")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4708"},"Update Github actions"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a1b4c76a.51af9271.js b/assets/js/a1b4c76a.51af9271.js new file mode 100644 index 00000000000..9bdbb315b50 --- /dev/null +++ b/assets/js/a1b4c76a.51af9271.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[8765],{48796:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/14","page":14,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/13","nextPage":"/cardano-updates/page/15","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/a1cde312.838f2c04.js b/assets/js/a1cde312.838f2c04.js new file mode 100644 index 00000000000..7637d5ea04b --- /dev/null +++ b/assets/js/a1cde312.838f2c04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90748],{3905:(e,t,r)=>{r.d(t,{Zo:()=>h,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},h=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=p(r),m=n,d=s["".concat(u,".").concat(m)]||s[m]||c[m]||o;return r?a.createElement(d,i(i({ref:t},h),{},{components:r})):a.createElement(d,i({ref:t},h))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},47553:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Hydra Team Update",slug:"2023-07-28-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-28-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-28-hydra.md",source:"@site/blog/2023-07-28-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-28T00:00:00.000Z",formattedDate:"July 28, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.005,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-28-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-07-31-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-27-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},s="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},h,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"During this week, the Hydra team achieved significant progress in various areas.\nThey conducted the monthly review meeting for July, which continously ensures\ntransparent communication and project evaluation. The team migrated the core\nlogic of the node to an event-sourced architecture and incremental writes of\nevents to persistence, enhancing the project","\u2019","s performance and maintainability.\nFurthermore, the team added the ability to read protocol parameters via the API\nand fixed the CI workflows to support pull requests from forks of external\ncontributors, streamlining the development process for community involvement."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Held the monthly review meeting for July (",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/14ANZ3efuxgXpYK94EBWxZLR9TtN7voru/"},"recording"),")"),(0,n.kt)("li",{parentName:"ul"},"Migrate the core logic of the node to an event-sourced architecture ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/999"},"#999")),(0,n.kt)("li",{parentName:"ul"},"Updated persistence to faster incremental writes of events ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1000"},"#1000")),(0,n.kt)("li",{parentName:"ul"},"Added ability to read protocol parameters via API ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/735"},"#735")),(0,n.kt)("li",{parentName:"ul"},"Fix CI workflows to support pull requests from forks of external contributors ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/993"},"#993")),(0,n.kt)("li",{parentName:"ul"},"Updated to GHC 9.2.8 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1005"},"#1005")),(0,n.kt)("li",{parentName:"ul"},"Prepared an updated use cases section on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family"},"https://hydra.family")," (published with next release)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Publish monthly report"),(0,n.kt)("li",{parentName:"ul"},"Complete user transaction submission work ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/966"},"#966")),(0,n.kt)("li",{parentName:"ul"},"Remove commit from internal wallet (deprecated) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/954"},"#954"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a1d1f035.546a3e7f.js b/assets/js/a1d1f035.546a3e7f.js new file mode 100644 index 00000000000..62f9fed0d6f --- /dev/null +++ b/assets/js/a1d1f035.546a3e7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91282],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),d=o,m=c["".concat(u,".").concat(d)]||c[d]||h[d]||a;return n?r.createElement(m,s(s({ref:t},p),{},{components:n})):r.createElement(m,s({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:o,s[1]=i;for(var l=2;l<a;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},39065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-09-20-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-20-consensus.md",source:"@site/blog/2023-09-20-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-09-20T00:00:00.000Z",formattedDate:"September 20, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.82,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-09-20-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-22-performance-and-tracing"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-20-mithril"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Support",id:"support",level:3}],p={toc:l},c="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks.\nWe are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough.\nOn the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain.\nWe also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway."),(0,o.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/349"},"349"),"). System level benchmark results are pending."),(0,o.kt)("li",{parentName:"ul"},"Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"344"),"), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run."),(0,o.kt)("li",{parentName:"ul"},"We also brought the ",(0,o.kt)("inlineCode",{parentName:"li"},"UTxO-HD")," branch up to date with node version ",(0,o.kt)("inlineCode",{parentName:"li"},"8.4.0"),".")),(0,o.kt)("h3",{id:"genesis"},"Genesis"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain.\nWe are now drafting the final self-contained argument. (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4157"},"4157"),")")),(0,o.kt)("h3",{id:"support"},"Support"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We debugged a bad parameter update on the ",(0,o.kt)("inlineCode",{parentName:"li"},"Babbage")," to ",(0,o.kt)("inlineCode",{parentName:"li"},"Conway")," transition in the SanchoNet testnet (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/339"},"339"),").\nA superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/340"},"340"),", ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/354"},"354"),", and ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/355"},"355"),")\nHowever we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ",(0,o.kt)("inlineCode",{parentName:"li"},"ConsensusProtocol")," type class and the ",(0,o.kt)("inlineCode",{parentName:"li"},"HardForkBlock")," combinator (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/345"},"345")," and ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/346"},"346"),"). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a1d4a798.53b252bf.js b/assets/js/a1d4a798.53b252bf.js new file mode 100644 index 00000000000..b601fa283f7 --- /dev/null +++ b/assets/js/a1d4a798.53b252bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25353],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>h});var a=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,r=function(e,n){if(null==e)return{};var t,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},m=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=s(t),u=r,h=d["".concat(c,".").concat(u)]||d[u]||p[u]||i;return t?a.createElement(h,o(o({ref:n},m),{},{components:t})):a.createElement(h,o({ref:n},m))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=u;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var s=2;s<i;s++)o[s]=t[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,t)}u.displayName="MDXCreateElement"},53712:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=t(87462),r=(t(67294),t(3905));const i={title:"Performance & Tracing Update",slug:"2023-11-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-17-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-17-performance-and-tracing.md",source:"@site/blog/2023-11-17-performance-and-tracing.md",title:"Performance & Tracing Update",description:"High level summary",date:"2023-11-17T00:00:00.000Z",formattedDate:"November 17, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.585,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & Tracing Update",slug:"2023-11-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-17-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-11-16-network"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Development",id:"development",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"Workbench",id:"workbench",level:3}],m={toc:s},d="wrapper";function p(e){let{components:n,...t}=e;return(0,r.kt)(d,(0,a.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: Release benchmarking for node ",(0,r.kt)("inlineCode",{parentName:"li"},"8.6.0")," as well as benchmarks scrutinizing GHC versions and the new tracing system."),(0,r.kt)("li",{parentName:"ul"},"Development: PlutusV3 capability of our workload generator has been implemented."),(0,r.kt)("li",{parentName:"ul"},"Tracing: First round of optimization of the ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-tracer")," service has completed, awaiting validation."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: A significant PR has landed addressing automation features and debugging capabilites."),(0,r.kt)("li",{parentName:"ul"},"Workbench: Configurable remote environments and improvements to run documentation have been merged to ",(0,r.kt)("inlineCode",{parentName:"li"},"master"),".")),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"We've performed and analyzed a full set of benchmarks for node ",(0,r.kt)("inlineCode",{parentName:"p"},"8.6.0"),", both in comparison to recent release tags\nand mainnet version ",(0,r.kt)("inlineCode",{parentName:"p"},"8.1.2"),". A lot of development work has entered the system since then, so it is crucial\nwe can rule out any potential performance risks for the next mainnet release. "),(0,r.kt)("p",null,"Additionally, we've been benchmarking GHC9.6.3 builds of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform. "),(0,r.kt)("p",null,"A last set of benchmarks was dedicated to the new tracing system with node ",(0,r.kt)("inlineCode",{parentName:"p"},"8.6.0"),". We were able to show that\nthere is no performance risk to enabling the new system, even when forwarding all trace messages to a ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-tracer"),"\nservice on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression."),(0,r.kt)("h3",{id:"development"},"Development"),(0,r.kt)("p",null,"For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes\nto the execution budgets by developing specialized workloads."),(0,r.kt)("h3",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," service has received its first batch of optimizations. Profiling output is promising; to measure\nperformance for a long service run time, we're currently equipping the service binary with the same capability to\nemit regular resource traces as ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". Analysis of those will be the basis for validating this and possible future optimization efforts."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"Many improvements for the nomad backend have been implemented and merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),". This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service,\nmore detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables\nour team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred."),(0,r.kt)("h3",{id:"workbench"},"Workbench"),(0,r.kt)("p",null,"Our performance workbench has seen upgrades in documenting and reporting ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler.\nWhen alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential. "),(0,r.kt)("p",null,"Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a1f2945e.cd202afc.js b/assets/js/a1f2945e.cd202afc.js new file mode 100644 index 00000000000..e0f25fb78f5 --- /dev/null +++ b/assets/js/a1f2945e.cd202afc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87407],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),u=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),m=u(a),h=r,s=m["".concat(l,".").concat(h)]||m[h]||d[h]||i;return a?n.createElement(s,o(o({ref:t},c),{},{components:a})):n.createElement(s,o({ref:t},c))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=h;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[m]="string"==typeof e?e:r,o[1]=p;for(var u=2;u<i;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},18936:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-09-26-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-09-26-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-26-node-cli-api.md",source:"@site/blog/2023-09-26-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-09-26T00:00:00.000Z",formattedDate:"September 26, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.68,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-09-26-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-27-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-22-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-09-13---2023-09-26"},"2023-09-13 - 2023-09-26"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.4.0-pre"},"cardano-node 8.4.0-pre")," release suitable for SanchoNet."),(0,r.kt)("li",{parentName:"ul"},"CLI continues making progress integrating governance features. During this sprint we integrated the ",(0,r.kt)("strong",{parentName:"li"},"info")," and ",(0,r.kt)("strong",{parentName:"li"},"new-committee")," governance actions."),(0,r.kt)("li",{parentName:"ul"},"The team continued moving to the ERA top-level commands structure. Removed ",(0,r.kt)("inlineCode",{parentName:"li"},"--conway-era")," flag from the legacy commands making conway era commands only accessible via ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-cli conway"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"stake-pool")," command is now under the ERA top level structure."),(0,r.kt)("li",{parentName:"ul"},"API continues integration with governance features, it is worth to higlight that now ",(0,r.kt)("em",{parentName:"li"},"ProposeNewCommitee")," uses the right key type (cc-cold)")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/302"},"Disambiguate 2-n flags in governance new-committee action")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/298"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.10.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/295"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.20.2"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/292"},"cardano-cli: add governance create-info command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/287"},"Release 8.9.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/286"},"Export ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.CLI.Legacy.Options.pLegacyCardanoEra")," for cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/284"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"SomeWitness")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"SomeSigningWitness"),". Rename constructors to avoid name conflicts.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/283"},"Update cardano-api to 8.20.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/282"},"Remove unused governance-related code")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/281"},"Fix typo in stake-pool help text and clarify drep queries arguments")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/280"},"Remove redundant conversions in JSON friendly instances ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/279"},"Regularise era based command structure")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/277"},"Simplify era handling")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/276"},"Remove ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/275"},"Era-based ",(0,r.kt)("inlineCode",{parentName:"a"},"stake-pool")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/274"},"Fix git revision in ",(0,r.kt)("inlineCode",{parentName:"a"},"version")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/273"},"cardano-cli-8.8.0.0"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/265"},"Organise eon re-exports. Export ",(0,r.kt)("inlineCode",{parentName:"a"},"MaryEraOnwards"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/264"},"cardano-api-internal: ProposeNewCommittee: StakeKey -> CommitteeColdKey")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/262"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.21.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/256"},"Delete unused eon constraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/255"},"Export ByronEraOnly")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/254"},"Replace only ",(0,r.kt)("inlineCode",{parentName:"a"},"AdaSupportedInEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"MultiAssetSupportedInEra")," with eons")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/250"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.20.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/249"},"Add JSON instance for Hash GenesisKey ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/248"},"Support more ledger constraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/247"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"FeatureInEra")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"Eon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/246"},"Release 8.20.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/245"},"Fix DRep Stake and DRep Stake queries for empty lists")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/244"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"TxFeesExplicitInEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"TxFeesImplicitInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/243"},"Fix typos in some deserialization error messages")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/240"},"Fix querying for dreps in ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction build")," in eras before conway"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5480"},"Trace Configuration Trace Message Enhancement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5474"},"Bump versions for cardano-node-8.4.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5467"},"Updated dependencies for cardano-node-8.4.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5466"},"cardano-node: reduce orphan instances"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5474"},"Bump versions for cardano-node-8.4.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5471"},"Update to cardano-cli 8.9.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5467"},"Updated dependencies for cardano-node-8.4.0-pre"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a2a63bac.f350ae76.js b/assets/js/a2a63bac.f350ae76.js new file mode 100644 index 00000000000..1d53b692f36 --- /dev/null +++ b/assets/js/a2a63bac.f350ae76.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16002],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(a),d=n,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||i;return a?r.createElement(c,o(o({ref:t},s),{},{components:a})):r.createElement(c,o({ref:t},s))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},54903:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-06-09-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-09-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-hydra.md",source:"@site/blog/2023-06-09-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-09T00:00:00.000Z",formattedDate:"June 9, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.18,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-09-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-06-09-developer-experience"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-06-08-db-sync"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team worked on multiple fronts. They finished the\ninvestigation about the broken head on mainnet and re-opened their persistent\nhead instance. The team also fixed the monthly report publication on their\nwebsite and started sketching ideas and further improvements. Also, they are on\nthe last mile to deliver a new feature which will allow parties to commit funds\nfrom extern wallets. Finally the team started to work on optimizing the\nperformance on their benchmarks."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finished investigation on broken head on mainnet ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/897"},"#897")," and re-opened it."),(0,n.kt)("li",{parentName:"ul"},"Added support for externally committing regular utxo ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/887"},"#887")),(0,n.kt)("li",{parentName:"ul"},"Fix monthly report publication on docs website and published the ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-05"},"monthly report"),". Odd problems when publishing monthly report:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Make us think about if we should change something about the website ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/908"},"#908")),(0,n.kt)("li",{parentName:"ul"},"Open issue to docusaurus ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/facebook/docusaurus/issues/9036"},"#9036")))),(0,n.kt)("li",{parentName:"ul"},"Fixed a bug in the benchmark process ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/910"},"#910")),(0,n.kt)("li",{parentName:"ul"},"Explored performance of the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node"),"{.verbatim} and identified a\nbottleneck."),(0,n.kt)("li",{parentName:"ul"},"Timed transaction feature is being used by the auction project \ud83c\udf89 ")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete performance analysis and start/plan improvements and provide\nregular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186")),(0,n.kt)("li",{parentName:"ul"},"Add hydra as tool to developer platform ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/872"},"#872"),"."),(0,n.kt)("li",{parentName:"ul"},"Authenticate network messages ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"#727"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete journey for external commits using multiple script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"Start implementing ",(0,n.kt)("em",{parentName:"li"},"Option B")," for external commits ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),".")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a2ee852b.3deb7f04.js b/assets/js/a2ee852b.3deb7f04.js new file mode 100644 index 00000000000..929f2dce86b --- /dev/null +++ b/assets/js/a2ee852b.3deb7f04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95208],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=a,h=d["".concat(l,".").concat(m)]||d[m]||p[m]||r;return n?o.createElement(h,s(s({ref:t},u),{},{components:n})):o.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,s=new Array(r);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c<r;c++)s[c]=n[c];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},15302:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var o=n(87462),a=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2023-05-03-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-05-03-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-03-consensus.md",source:"@site/blog/2023-05-03-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-05-03T00:00:00.000Z",formattedDate:"May 3, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.755,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-05-03-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-04-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-03-performance-and-tracing"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Fostering collaboration",id:"fostering-collaboration",level:2}],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks we made some important progress in the Genesis design.\nIt seems the ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch")," logic need not be modified for Genesis, although this\nneeds to be confirmed. We started a DoS mitigation handbook and updated our\nconceptual component diagram to guide the Genesis design. We engaged with the\nIOG researchers to work on the Limit on Patience attack vector, work in this\narea is still ongoing. We sketched a design to decouple the CPU load of the node\nfrom its responsiveness to the socket. Finally, we discussed with Networking our\napproach to lower the performance impact of the BlockFetch decision logic, and\ngot green light from them."),(0,a.kt)("p",null,"We migrated the consensus code to a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus"},"new\nrepository"),", splitting\nit from the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," repository, and released version 0.6 of\nConsensus."),(0,a.kt)("p",null,"We also merged the mempool fairness improvement to main branch."),(0,a.kt)("p",null,"Another significant enhancement to our documentation was the addition of an\nexplanation of the hardfork combinator forecast horizon."),(0,a.kt)("p",null,"See the sections below for more details."),(0,a.kt)("h2",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"We reviewed the ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch")," design documentation, and added some source-code\ncomments that emphasize certain properties of the decisions the ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch"),"\nlogic makes that are helping us confirm that Genesis does not require any\nchanges to ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch"),". We are waiting on input from our former system\narchitect to verify this."),(0,a.kt)("p",null,"We migrated and updated the conceptual component diagram in the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),"\nrepository which helps us situate the Genesis design and argument."),(0,a.kt)("p",null,"We engaged with the IOG researchers about the Genesis design. We sketched out a\nway to address the concern that the Limit on Patiente (LoP) attack vector duty\ncycle is indeed low, but it's still non-trivial to ultimately conclude it's\nsufficiently low."),(0,a.kt)("p",null,"We also sketched a design to decouple the CPU load of the node from its\nresponsiveness to the socket, since the LoP is a relatively tight timeout, and\nnode performance bugs inducing seconds-worth of latency are unfortunately\nfamiliar phenomena."),(0,a.kt)("h2",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/62"},"added an\nexplanation")," of\na question that we had to explain many times about the exact behavior of the\nhardfork combinator forecast horizon."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a34b3179.fc92e4ec.js b/assets/js/a34b3179.fc92e4ec.js new file mode 100644 index 00000000000..c5fb3eaddcf --- /dev/null +++ b/assets/js/a34b3179.fc92e4ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22254],{94029:a=>{a.exports=JSON.parse('{"label":"crypto","permalink":"/cardano-updates/tags/crypto","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/a3889346.f4b45fc1.js b/assets/js/a3889346.f4b45fc1.js new file mode 100644 index 00000000000..150212711e9 --- /dev/null +++ b/assets/js/a3889346.f4b45fc1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49769],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var u=n.createContext({}),d=function(e){var t=n.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=d(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(a),h=r,m=p["".concat(u,".").concat(h)]||p[h]||c[h]||o;return a?n.createElement(m,i(i({ref:t},s),{},{components:a})):n.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},8838:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-09-30-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-09-30-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-30-ledger.md",source:"@site/blog/2022-09-30-ledger.md",title:"Ledger Team Update",description:"Ledger Update",date:"2022-09-30T00:00:00.000Z",formattedDate:"September 30, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.285,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-09-30-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-10-04-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-09-27-network"}},u={authorsImageUrls:[void 0]},d=[{value:"Ledger Update",id:"ledger-update",level:2},{value:"Technical debt issues completed",id:"technical-debt-issues-completed",level:3},{value:"Technical debt in progress",id:"technical-debt-in-progress",level:3}],s={toc:d},p="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"ledger-update"},"Ledger Update"),(0,r.kt)("p",null,"We have continued focusing nearly entirely on addressing technical debt.\nA lot of design work has begun for the next ledger era,\nbut we do not yet have anything concrete to share."),(0,r.kt)("h3",{id:"technical-debt-issues-completed"},"Technical debt issues completed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/1676"},"issue-1676"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/2992"},"pull-2992"),"] We have finally removed the ledger dependency on the\n",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-prelude")," package. It was barely used in the ledger repository, and it added a dependency\nthat we did not want to maintain. It was a bit difficult to remove, and we had\nto coordinate removing it from cardano-base.\nA lot ended up going into ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/2992"},"pull-2992"),", due to the coordination effort, and we ended\nup updating Plutus as well.\nThis means that we've now also made a lot of progress on the problematic cost model serialization\nissues described in ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2902"},"issue-2902"),".\nIn particular, after we resolve ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3014"},"issue-3014"),", we will not have to wait an epoch before\nreleasing a cost model for a new version of Plutus, as we had to do for the Vasil HF."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3046"},"issue-3046"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3055"},"pull-3055"),"] We moved a module that is now only used in Byron to a Byron package."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3047"},"issue-3047"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3054"},"pull-3054"),"] We improved the interface to the ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," (multi-asset) type."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3044"},"pull-3044"),"] We debugged and fixed a tricky compilation issue. Certain kinds of field updates\nwere adding approximately 20 minutes to our compile time!"),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2932"},"issue-2932"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3036"},"pull-3036"),"] As a part of our ongoing re-organization of the codebase, we\nhave added a ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardano.Ledger.[Era].Core")," module to each ledger era that has a TxBody class.\nMost classes defined in the era should go in this new module.\nWe also re-export the ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardno.Ledger.Core")," module and the previous ",(0,r.kt)("inlineCode",{parentName:"li"},"Cardano.Ledger.[Era].Core"),"\nmodules from each era.")),(0,r.kt)("h3",{id:"technical-debt-in-progress"},"Technical debt in progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3034"},"issue-3034"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3035"},"issue-3035"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/4421"},"node-issue-4421"),"] We are continuing to write benchmarks to understand exactly where\nall the time is being spent on executing the ",(0,r.kt)("inlineCode",{parentName:"li"},"TICKF")," transition.\nThe consolidation of the per-stake-credential stake distribution to the per-stake-pool\ndistribution does seem to account for a large amount of time (near a second as written, which we\nhave down to about half a second with some optimizations),\nbut this does not account for everything.\nApplying the reward update may also be a big contributing factor."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3033"},"pull-3033"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3038"},"pull-3038"),"][",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3041"},"pull-3041"),"] A separate team is working on upgrading all the\ncardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort."),(0,r.kt)("li",{parentName:"ul"},"The nix scripts used to build our new\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger model"),"\ndo not work consistently for everyone, and we have been working on fixing these issues."),(0,r.kt)("li",{parentName:"ul"},"[",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3014"},"issue-3014"),"] We are still working on adding a versioning scheme to all of the ledger\nserializers.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a48d66c0.554b9825.js b/assets/js/a48d66c0.554b9825.js new file mode 100644 index 00000000000..b5b0c79167b --- /dev/null +++ b/assets/js/a48d66c0.554b9825.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[77965],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),s=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,m=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=r,h=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return n?a.createElement(h,o(o({ref:t},m),{},{components:n})):a.createElement(h,o({ref:t},m))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:r,o[1]=c;for(var s=2;s<i;s++)o[s]=n[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},69029:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-09-07-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,c={permalink:"/cardano-updates/2023-09-07-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-07-performance-and-tracing.md",source:"@site/blog/2023-09-07-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-09-07T00:00:00.000Z",formattedDate:"September 7, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.3,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-09-07-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-07-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-06-consensus"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:s},u="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack."),(0,r.kt)("li",{parentName:"ul"},"Infrastructure: Various improvements of our analysis pipeline have been merged to ",(0,r.kt)("inlineCode",{parentName:"li"},"master"),", supporting safe log truncation."),(0,r.kt)("li",{parentName:"ul"},"Tracing: Namespace consistency checks have been merged to ",(0,r.kt)("inlineCode",{parentName:"li"},"master")," along with a curated configuration for benchmarking."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.")),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer. "),(0,r.kt)("p",null,"With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance. "),(0,r.kt)("p",null,"The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack."),(0,r.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,r.kt)("p",null,"As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation\noperation that keeps the interdependencies of block events intact. "),(0,r.kt)("p",null,"Truncation might happen at a slightly different point\nin time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time."),(0,r.kt)("h3",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"Consistency checking of namespace implementation and configuration when using the new system has been completed.\nThis feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," shows inconsistencies with the namespaces the system provides - and hence needs attention. "),(0,r.kt)("p",null,"Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many\ndetailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the\nfirst real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a572b6ff.fac7438c.js b/assets/js/a572b6ff.fac7438c.js new file mode 100644 index 00000000000..bce66cfdff4 --- /dev/null +++ b/assets/js/a572b6ff.fac7438c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56618],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=s(n),p=a,h=d["".concat(l,".").concat(p)]||d[p]||m[p]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[d]="string"==typeof e?e:a,i[1]=c;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},18104:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-08-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-08-04-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-performance-and-tracing.md",source:"@site/blog/2023-08-04-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.76,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-08-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-08-04-network"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-04-sre"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:s},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version ",(0,a.kt)("inlineCode",{parentName:"li"},"8.2.0"),"."),(0,a.kt)("li",{parentName:"ul"},"Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"8.2.0")," version of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," required adjustment of some of the sanity checks that are part of our benchmarking\ncluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint\nwhen using it as default for a running node. "),(0,a.kt)("p",null,"A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any\ninconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node.\nThis feature adds another layer of robustness to the whole system."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler\nversions. We've future-proofed our benchmarking code."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend\naccordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant. "),(0,a.kt)("p",null,"The validation phase is ongoing. We were able to perform successful runs and analyses for various ",(0,a.kt)("inlineCode",{parentName:"p"},"8.x")," node versions, including ",(0,a.kt)("inlineCode",{parentName:"p"},"8.2.0-pre"),". With parallel runs on the current cluster, we hope to measure the same effects we've observed with the\nnomad backend - which will be a big step towards production use."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a5bf291f.f146d996.js b/assets/js/a5bf291f.f146d996.js new file mode 100644 index 00000000000..e9b1d75b222 --- /dev/null +++ b/assets/js/a5bf291f.f146d996.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30907],{97577:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/open-source","page":1,"postsPerPage":5,"totalPages":1,"totalCount":1,"blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/a6238997.20176f92.js b/assets/js/a6238997.20176f92.js new file mode 100644 index 00000000000..5125f77d86e --- /dev/null +++ b/assets/js/a6238997.20176f92.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49904],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function d(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},s="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=d(e,["components","mdxType","originalType","parentName"]),s=c(n),m=o,g=s["".concat(l,".").concat(m)]||s[m]||p[m]||a;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var d={};for(var l in t)hasOwnProperty.call(t,l)&&(d[l]=t[l]);d.originalType=e,d[s]="string"==typeof e?e:o,i[1]=d;for(var c=2;c<a;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},46010:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const a={title:"Incident Report",slug:"2023-04-17-ledger",authors:"kevinhammond",tags:["ledger"],hide_table_of_contents:!1},i=void 0,d={permalink:"/cardano-updates/2023-04-17-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-17-incident.md",source:"@site/blog/2023-04-17-incident.md",title:"Incident Report",description:"Incident reporting: Cardano block production temporary outage",date:"2023-04-17T00:00:00.000Z",formattedDate:"April 17, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.38,hasTruncateMarker:!1,authors:[{name:"Kevin Hammond",title:"Head of Software Engineering, Cardano Core",url:"https://github.com/kevinhammond",imageURL:"https://github.com/kevinhammond.png",key:"kevinhammond"}],frontMatter:{title:"Incident Report",slug:"2023-04-17-ledger",authors:"kevinhammond",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-19-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-14-goedel"}},l={authorsImageUrls:[void 0]},c=[{value:"Incident reporting: Cardano block production temporary outage",id:"incident-reporting-cardano-block-production-temporary-outage",level:2},{value:"Further Details",id:"further-details",level:3}],u={toc:c},s="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(s,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"incident-reporting-cardano-block-production-temporary-outage"},"Incident reporting: Cardano block production temporary outage"),(0,o.kt)("p",null,"On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a \u2018critical\u2019 incident, thus warranting immediate response and investigation by IOG engineers.\nThe investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue \u2013 a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite.\nFollowing successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version.\nWith the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue."),(0,o.kt)("h3",{id:"further-details"},"Further Details"),(0,o.kt)("p",null,"You can read more details on the incident and how it was managed from SundaeSwap\u2019s Pi Lanningham ",(0,o.kt)("a",{parentName:"p",href:"https://www.314pool.com/post/cardano-post-mortem-1"},"here"),". Thanks again to all the community for its support in identifying and fixing this bug."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a687dd04.bb48cff5.js b/assets/js/a687dd04.bb48cff5.js new file mode 100644 index 00000000000..483518cc1cd --- /dev/null +++ b/assets/js/a687dd04.bb48cff5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26026],{3905:(e,a,t)=>{t.d(a,{Zo:()=>c,kt:()=>h});var r=t(67294);function n(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function o(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?o(Object(t),!0).forEach((function(a){n(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function s(e,a){if(null==e)return{};var t,r,n=function(e,a){if(null==e)return{};var t,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],a.indexOf(t)>=0||(n[t]=e[t]);return n}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var i=r.createContext({}),p=function(e){var a=r.useContext(i),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},c=function(e){var a=p(e.components);return r.createElement(i.Provider,{value:a},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var a=e.children;return r.createElement(r.Fragment,{},a)}},m=r.forwardRef((function(e,a){var t=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),m=n,h=d["".concat(i,".").concat(m)]||d[m]||u[m]||o;return t?r.createElement(h,l(l({ref:a},c),{},{components:t})):r.createElement(h,l({ref:a},c))}));function h(e,a){var t=arguments,n=a&&a.mdxType;if("string"==typeof e||n){var o=t.length,l=new Array(o);l[0]=m;var s={};for(var i in a)hasOwnProperty.call(a,i)&&(s[i]=a[i]);s.originalType=e,s[d]="string"==typeof e?e:n,l[1]=s;for(var p=2;p<o;p++)l[p]=t[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},59536:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>i,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=t(87462),n=(t(67294),t(3905));const o={title:"SRE Team Update",slug:"2023-10-13-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,s={permalink:"/cardano-updates/2023-10-13-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-sre.md",source:"@site/blog/2023-10-13-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-10-13T00:00:00.000Z",formattedDate:"October 13, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:2.595,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-10-13-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-10-13-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-11-mithril"}},i={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Sanchonet-demo",id:"sanchonet-demo",level:3}],c={toc:p},d="wrapper";function u(e){let{components:a,...t}=e;return(0,n.kt)(d,(0,r.Z)({},c,t,{components:a,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet environment was updated to 8.5.0-pre."),(0,n.kt)("li",{parentName:"ul"},"Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Various improvements and fixes including:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Add GHA cron schedule"),(0,n.kt)("li",{parentName:"ul"},"Add nix auto-gc to avoid running out of storage during large package set builds"),(0,n.kt)("li",{parentName:"ul"},"Add new packages to capkgs"),(0,n.kt)("li",{parentName:"ul"},"Reduce runner storage requirement leaving more room for builds"),(0,n.kt)("li",{parentName:"ul"},"Restructure capkgs attribute names to avoid package name collisions"),(0,n.kt)("li",{parentName:"ul"},"Return to non-musl builds for cardano packages to retain journald compatability"),(0,n.kt)("li",{parentName:"ul"},"Update cache usage to from file level to folder level to reduce network and latency overhead"),(0,n.kt)("li",{parentName:"ul"},"Commit diff: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/a274b72...b197e22"},"capkgs-compare"))))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/16"},"cardano-parts-pull-16")),(0,n.kt)("li",{parentName:"ul"},"Dbsync, smash, faucet and more: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/15"},"cardano-parts-pull-15"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes"),(0,n.kt)("li",{parentName:"ul"},"Adds nginx vhost metrics exporter profile"),(0,n.kt)("li",{parentName:"ul"},"Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down"),(0,n.kt)("li",{parentName:"ul"},"Adds bash *-ng autocompletion compatible wrappers"),(0,n.kt)("li",{parentName:"ul"},"Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview"),(0,n.kt)("li",{parentName:"ul"},"Adds downstream grafana cloud dashboard as templates"),(0,n.kt)("li",{parentName:"ul"},"Adds downstream grafana cloud alerts as templates"),(0,n.kt)("li",{parentName:"ul"},"Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish"),(0,n.kt)("li",{parentName:"ul"},"Updates the basic profile with IOG cache and commonly used bins"),(0,n.kt)("li",{parentName:"ul"},"Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning"),(0,n.kt)("li",{parentName:"ul"},"Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks"),(0,n.kt)("li",{parentName:"ul"},"Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets"),(0,n.kt)("li",{parentName:"ul"},"Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration"),(0,n.kt)("li",{parentName:"ul"},"Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion"),(0,n.kt)("li",{parentName:"ul"},"Updates the colmena template with dbsync, smash, faucet machines profiles and roles"),(0,n.kt)("li",{parentName:"ul"},"Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns"),(0,n.kt)("li",{parentName:"ul"},"Bumps capkgs node-ng to 8.5.0-pre")))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Dbsync, smash, faucet and more: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/3"},"cardano-playground-pull-3"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview"),(0,n.kt)("li",{parentName:"ul"},"Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts"),(0,n.kt)("li",{parentName:"ul"},"Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change"),(0,n.kt)("li",{parentName:"ul"},"Optimizes machine sizes"),(0,n.kt)("li",{parentName:"ul"},"Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets"),(0,n.kt)("li",{parentName:"ul"},"Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion"),(0,n.kt)("li",{parentName:"ul"},"Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning"),(0,n.kt)("li",{parentName:"ul"},"Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration")))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update sanchonet network to cardano-node 8.5.0: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/c8a480fa7cdb6eff4f8b4565450c57361ddfdec4"},"cardano-world-commit"))),(0,n.kt)("h3",{id:"sanchonet-demo"},"Sanchonet-demo"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo/commit/4124465c0c663d11c8cf4ef80af18a5246f89b31"},"sanchonet-demo-commit"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a69f0deb.4d5ff44c.js b/assets/js/a69f0deb.4d5ff44c.js new file mode 100644 index 00000000000..25600029c02 --- /dev/null +++ b/assets/js/a69f0deb.4d5ff44c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2773],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=u(a),h=r,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||i;return a?n.createElement(s,l(l({ref:t},c),{},{components:a})):n.createElement(s,l({ref:t},c))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,l[1]=o;for(var u=2;u<i;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},67900:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-07-18-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-07-18-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-18-node-cli-api.md",source:"@site/blog/2023-07-18-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-07-18T00:00:00.000Z",formattedDate:"July 18, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.065,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-07-18-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-20-goedel"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-14-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-07-05---2023-07-18"},"2023-07-05 - 2023-07-18"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Integrate Conway certificates in cardano-api"),(0,r.kt)("li",{parentName:"ul"},"Prepare cardano-cli and cardano-api for cardano-node 8.1.2"),(0,r.kt)("li",{parentName:"ul"},"Tagged cardano-cli 8.3.0.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Query for the hash of the constitution (Conway)"),(0,r.kt)("li",{parentName:"ul"},"Ability to create votes and governance actions"))),(0,r.kt)("li",{parentName:"ul"},"Tagged cardano-cli 8.3.1.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Make it build with ghc-9.6"))),(0,r.kt)("li",{parentName:"ul"},"Upgrade to optparse-applicative-fork-0.18.1.0 for parsing command line options")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/74"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"optparse-applicative-fork-0.18.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/72"},"Integrate cardano-api changes for fixed Show and Eq instances for Proposal type")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/68"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.3.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/67"},"Add alonzo era to ",(0,r.kt)("inlineCode",{parentName:"a"},"Parser AnyShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/66"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"sbe")," variable name for the type is ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/65"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.3.0.0")))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/123"},"Fix ghc version CPP")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/122"},"Add a HasTypeProxy constraint to getVerificationKey")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/119"},"Incorporate remaining ledger certificates")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/117"},"Release cardano-api 8.8.1.0, cardano-api-gen 8.1.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/115"},"Fix Eq, Show for Proposal type")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/112"},"Wire up remaining governance actions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/108"},"Export ",(0,r.kt)("inlineCode",{parentName:"a"},"withShelleyBasedEraConstraintsForLedger"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/106"},"Remove unnecessary constraint")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/104"},"Make it build with ghc-9.6")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/103"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraints")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/102"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.8.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/101"},"Add CastVerificationKeyRole StakePoolKey StakeKey instance")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/99"},"Update ledger and consensus")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/98"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"era")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"sbe")," when type is ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5391"},"Fix Shutdown test for new exit codes"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5387"},"Fix markdown links"))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/69"},"Apply ",(0,r.kt)("inlineCode",{parentName:"a"},"stylish-haskell")," to project"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.3167acc2.js b/assets/js/a6aa9e1f.3167acc2.js new file mode 100644 index 00000000000..7cfaf6538b5 --- /dev/null +++ b/assets/js/a6aa9e1f.3167acc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93089],{80046:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var n=a(67294),r=a(86010),l=a(52263),i=a(1944),o=a(35281),s=a(39058),c=a(99703),m=a(90197),g=a(79985);function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,l.Z)(),{blogDescription:r,blogTitle:o,permalink:s}=t,c="/"===s?a:o;return n.createElement(n.Fragment,null,n.createElement(i.d,{title:c,description:r}),n.createElement(m.Z,{tag:"blog_posts_list"}))}function d(e){const{metadata:t,items:a,sidebar:r}=e;return n.createElement(s.Z,{sidebar:r},n.createElement(g.Z,{items:a}),n.createElement(c.Z,{metadata:t}))}function u(e){return n.createElement(i.FG,{className:(0,r.Z)(o.k.wrapper.blogPages,o.k.page.blogListPage)},n.createElement(p,e),n.createElement(d,e))}},99703:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(67294),r=a(95999),l=a(32244);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,r.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(l.Z,{permalink:a,title:n.createElement(r.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),i&&n.createElement(l.Z,{permalink:i,title:n.createElement(r.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},79985:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(67294),r=a(9460),l=a(30390);function i(e){let{items:t,component:a=l.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(r.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}}}]); \ No newline at end of file diff --git a/assets/js/a6afc437.c755f9a0.js b/assets/js/a6afc437.c755f9a0.js new file mode 100644 index 00000000000..c4ae4233c07 --- /dev/null +++ b/assets/js/a6afc437.c755f9a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[69565],{87737:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/a6e1d45a.affc557f.js b/assets/js/a6e1d45a.affc557f.js new file mode 100644 index 00000000000..e40ad9bc804 --- /dev/null +++ b/assets/js/a6e1d45a.affc557f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[8737],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),s=u(a),m=n,c=s["".concat(p,".").concat(m)]||s[m]||h[m]||i;return a?r.createElement(c,o(o({ref:t},d),{},{components:a})):r.createElement(c,o({ref:t},d))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},30221:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-10-27-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-27-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-hydra.md",source:"@site/blog/2023-10-27-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-27T00:00:00.000Z",formattedDate:"October 27, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.895,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-27-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-01-mithril"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-27-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],d={toc:u},s="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team fixed the ",(0,n.kt)("inlineCode",{parentName:"p"},"gen-hydra-keys")," command to avoid\noverwriting existing keys, and resolved issues related to the rewritten\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-tui"),'. They also worked on a \\"dirt road\\" implementation for the\n\\"Ignored init tx\\" notification, improving the robustness of the system.'),(0,n.kt)("p",null,"The team finalized preparations for the Cardano Summit presentation, including\nimplementation of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-poll")," example DApp."),(0,n.kt)("p",null,'If you happen to read this and attend the Summit in Dubai, make sure to check\nout our Masterclass about \\"Developing Hydra + Mithril for Scaling Cardano\\" on\nFriday, November 3 at 14:00-15:30 local time in the \\"Al Dar\\" room!'),(0,n.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"gen-hydra-keys")," command to not overwrite existing keys\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1136"},"#1136")),(0,n.kt)("li",{parentName:"ul"},"Fixed the rewritten ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tui"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1113"},"#1113"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1137"},"#1137")),(0,n.kt)("li",{parentName:"ul"},"Finalized cardano summit preparation\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1109"},"#1109")),(0,n.kt)("li",{parentName:"ul"},"Implemented the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-poll")," example DApp ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-scaling/hydra-poll"},"link to\nrepository")),(0,n.kt)("li",{parentName:"ul"},'Dirt road implementation for \\"Ignored init tx\\" notification\n',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/529"},"#529"))),(0,n.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Attend cardano summit and deliver presentation"),(0,n.kt)("li",{parentName:"ul"},"Clarify / close user created issues"),(0,n.kt)("li",{parentName:"ul"},"Build ",(0,n.kt)("inlineCode",{parentName:"li"},"aarch64-darwin")," binaries in CI")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6e5ff3c.f8f8d3c0.js b/assets/js/a6e5ff3c.f8f8d3c0.js new file mode 100644 index 00000000000..39decb94bc0 --- /dev/null +++ b/assets/js/a6e5ff3c.f8f8d3c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78153],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=d(a),h=n,m=p["".concat(s,".").concat(h)]||p[h]||u[h]||o;return a?r.createElement(m,i(i({ref:t},c),{},{components:a})):r.createElement(m,i({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},3868:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-18-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-18-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-hydra.md",source:"@site/blog/2023-08-18-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.13,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-18-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-18-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-18-ledger"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],c={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version 0.12.0, a significant update that\nbrings support for cardano-node 8.1.2, along with performance enhancements and\nvarious API improvements. Additionally, the team successfully onboarded a new\ncontributor who is now actively participating in operating a Hydra Head. They\ntook part in a meeting of the Intersect open source committee and prepared the\nHydra master-class for RareEvo, an educational initiative for the community."),(0,n.kt)("p",null,"If you happen to be at RareEvo, register for the Hydra master-class ",(0,n.kt)("a",{parentName:"p",href:"https://docs.google.com/forms/d/1Q9KIxwKeyZeNrKDBiYWceYjnbxIxaEwC8Eo5LWxSa2g/viewform?edit_requested=true"},"using this\nform"),".\nWe hope to make it possible to follow along on-line as well and will announce\ndetails on the Hydra announcements channel on the ",(0,n.kt)("a",{parentName:"p",href:"https://discord.gg/Qq5vNTg9PT"},"IOG discord\nserver"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released version 0.12.0 which adds support for cardano-node 8.1.2, performance\nand several API improvements. ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.12.0"},"Release notes")),(0,n.kt)("li",{parentName:"ul"},"Replaced commit via websocket with external draft + submit. ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/954"},"#954")),(0,n.kt)("li",{parentName:"ul"},"Onboarded new contributor to the point where he actively participates in operating a Head now."),(0,n.kt)("li",{parentName:"ul"},"Joined a first meeting of the Intersect open source committee"),(0,n.kt)("li",{parentName:"ul"},"Prepared the Hydra master-class for RareEvo.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting"),(0,n.kt)("li",{parentName:"ul"},"Run the Hydra master-class at RareEvo!"),(0,n.kt)("li",{parentName:"ul"},"Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff"),(0,n.kt)("li",{parentName:"ul"},"Clear out red bin items (technical debt)"),(0,n.kt)("li",{parentName:"ul"},"Groom network resilience and explorer features")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7418040.313e46d8.js b/assets/js/a7418040.313e46d8.js new file mode 100644 index 00000000000..f31559f4a6a --- /dev/null +++ b/assets/js/a7418040.313e46d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16886],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,a=function(e,t){if(null==e)return{};var r,i,a={},n=Object.keys(e);for(i=0;i<n.length;i++)r=n[i],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i<n.length;i++)r=n[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(r),c=a,d=m["".concat(s,".").concat(c)]||m[c]||h[c]||n;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<n;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},43603:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var i=r(87462),a=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-11-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-15-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-15-mithril.md",source:"@site/blog/2023-11-15-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-15T00:00:00.000Z",formattedDate:"November 15, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.92,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-15-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-11-14-node-cli-api"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},m="wrapper";function h(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files."),(0,a.kt)("p",null,"Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Prototype a P2P relay with ",(0,a.kt)("inlineCode",{parentName:"strong"},"libp2p"))," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,a.kt)("inlineCode",{parentName:"strong"},"mithril-client")," library")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1311"},"#1311")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Fix certificate hashes re-computation in aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1343"},"#1343")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("strong",{parentName:"li"},"Remove ",(0,a.kt)("inlineCode",{parentName:"strong"},"unstable")," tag in ",(0,a.kt)("inlineCode",{parentName:"strong"},"unstable")," release")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1235"},"#1235")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7a31948.7327cf2d.js b/assets/js/a7a31948.7327cf2d.js new file mode 100644 index 00000000000..ed186235ea7 --- /dev/null +++ b/assets/js/a7a31948.7327cf2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85943],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),u=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return r.createElement(i.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,h=d["".concat(i,".").concat(m)]||d[m]||s[m]||o;return a?r.createElement(h,l(l({ref:t},c),{},{components:a})):r.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[d]="string"==typeof e?e:n,l[1]=p;for(var u=2;u<o;u++)l[u]=a[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},91654:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-09-29-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-09-29-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-sre.md",source:"@site/blog/2023-09-29-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.68,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-09-29-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-29-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-27-mithril"}},i={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.4.0-pre"},"8.4.0-pre"),"."),(0,n.kt)("li",{parentName:"ul"},"The use of cardano-node ",(0,n.kt)("a",{parentName:"li",href:"https://hub.docker.com/r/inputoutput/cardano-node"},"docker hub")," will be deprecated in preference of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pkgs/container/cardano-node"},"GHCR"))),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Refactor parsing scripts, add github action automation, various bugfixes and cleanup: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/c2c7680...a274b72"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/14"},"cardano-parts-pull-8"))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/2"},"cardano-playground"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update sanchonet network to cardano-node 8.4.0: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/compare/8cb559a...3edafb9"},"cardano-world-compare")),(0,n.kt)("li",{parentName:"ul"},"Rotate KES on shelley-qa: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/8301b044ad106ff8ca71dcbbdb5b17fe9ec6fc6d"},"cardano-world-commit"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a8723288.631293b3.js b/assets/js/a8723288.631293b3.js new file mode 100644 index 00000000000..d08ccf2d4c3 --- /dev/null +++ b/assets/js/a8723288.631293b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86673],{51115:a=>{a.exports=JSON.parse('{"label":"sre","permalink":"/cardano-updates/tags/sre","allTagsPath":"/cardano-updates/tags","count":15}')}}]); \ No newline at end of file diff --git a/assets/js/a8738e5f.f18e47da.js b/assets/js/a8738e5f.f18e47da.js new file mode 100644 index 00000000000..cab67b29e7c --- /dev/null +++ b/assets/js/a8738e5f.f18e47da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[99881],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>d});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,r,a=function(e,t){if(null==e)return{};var i,r,a={},n=Object.keys(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(i),c=a,d=s["".concat(p,".").concat(c)]||s[c]||m[c]||n;return i?r.createElement(d,o(o({ref:t},h),{},{components:i})):r.createElement(d,o({ref:t},h))}));function d(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,i)}c.displayName="MDXCreateElement"},67461:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-04-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-04-20-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-20-mithril.md",source:"@site/blog/2023-04-20-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-04-20T00:00:00.000Z",formattedDate:"April 20, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.245,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-04-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-04-21-ledger"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-20-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...i}=e;return(0,a.kt)(s,(0,r.Z)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team released a new ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2315.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2315.0"))," distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures."),(0,a.kt)("p",null,"Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2315.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2315.0"))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic that implements a relational store in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signed_entity")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/816"},"#816")),(0,a.kt)("li",{parentName:"ul"},"Completed the creation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signer")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/814"},"#814")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"single_signature")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/829"},"#829")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implement generic signing/verification of entity services ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the definition of the interface of the generic entity service for signing ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/847"},"#847")),(0,a.kt)("li",{parentName:"ul"},"Worked on the implementation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"Certifier")," service in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/850"},"#850")),(0,a.kt)("li",{parentName:"ul"},"Completed the extension of the ",(0,a.kt)("inlineCode",{parentName:"li"},"SignedEntityType")," type ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/848"},"#848")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"Tick")," service in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/849"},"#849")),(0,a.kt)("li",{parentName:"ul"},"Worked on implementing the signable builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Mithril Stake Distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/851"},"#851"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a9019578.618a0894.js b/assets/js/a9019578.618a0894.js new file mode 100644 index 00000000000..861d91dc90d --- /dev/null +++ b/assets/js/a9019578.618a0894.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4497],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(a),s=r,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},d),{},{components:a})):n.createElement(h,i({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},65934:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-10-04-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-04-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-04-node-cli-api.md",source:"@site/blog/2022-10-04-node-cli-api.md",title:"Node API & CLI Team Update",description:"Node-Api-Cli Update",date:"2022-10-04T00:00:00.000Z",formattedDate:"October 4, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.98,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-10-04-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-10-04-db-sync"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-30-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"Node-Api-Cli Update",id:"node-api-cli-update",level:2},{value:"2022-10-04 - 2022-10-18",id:"2022-10-04---2022-10-18",level:2},{value:"Executive Summary",id:"executive-summary",level:3},{value:"Completed",id:"completed",level:3},{value:"cardano-cli",id:"cardano-cli",level:4},{value:"cardano-api",id:"cardano-api",level:4},{value:"cardano-node",id:"cardano-node",level:4},{value:"In Progress",id:"in-progress",level:3},{value:"cardano-cli",id:"cardano-cli-1",level:4},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"node-api-cli-update"},"Node-Api-Cli Update"),(0,r.kt)("h2",{id:"2022-10-04---2022-10-18"},"2022-10-04 - 2022-10-18"),(0,r.kt)("h3",{id:"executive-summary"},"Executive Summary"),(0,r.kt)("p",null,"The majority of the team's time was spent between getting ",(0,r.kt)("inlineCode",{parentName:"p"},"1.34.4")," ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli"),"."),(0,r.kt)("h3",{id:"completed"},"Completed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4504"},"GHC 9.2.4 preparations"))),(0,r.kt)("h4",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[Serenity]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4491"},"Separate IO from txBuild and txBuildRaw functions"))),(0,r.kt)("h4",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4501"},"TxWitness text envelope format does not roundtrip in Shelley era"))),(0,r.kt)("h4",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4526"},"Fix MacOS GHA CI"))),(0,r.kt)("h3",{id:"in-progress"},"In Progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4508"},"Release 1.34.4"))),(0,r.kt)("h4",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4538"},"Fix query era mismatch bug in transaction build command")),(0,r.kt)("li",{parentName:"ul"},"[Serenity]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4516"},"Condense Read and Validation modules in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4276"},"Add tx-mempool command to CLI"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4482"},"Return Lovelace for calculateMinimumUTxO")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a9347c1b.a93f84b5.js b/assets/js/a9347c1b.a93f84b5.js new file mode 100644 index 00000000000..b03a55675e8 --- /dev/null +++ b/assets/js/a9347c1b.a93f84b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76323],{3905:(e,t,r)=>{r.d(t,{Zo:()=>h,kt:()=>c});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},h=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(r),d=i,c=s["".concat(p,".").concat(d)]||s[d]||m[d]||n;return r?a.createElement(c,o(o({ref:t},h),{},{components:r})):a.createElement(c,o({ref:t},h))}));function c(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:i,o[1]=l;for(var u=2;u<n;u++)o[u]=r[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},95829:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-02-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-09-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-09-mithril.md",source:"@site/blog/2023-02-09-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-02-09T00:00:00.000Z",formattedDate:"February 9, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.01,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-02-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-10-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-08-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(s,(0,a.Z)({},h,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team released a new ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2304.1"},(0,i.kt)("inlineCode",{parentName:"a"},"2304.1"))," distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store."),(0,i.kt)("p",null,"Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version ",(0,i.kt)("inlineCode",{parentName:"p"},"1.35.5")," on their ",(0,i.kt)("inlineCode",{parentName:"p"},"devnet")," and infrastructure."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2304.1"},(0,i.kt)("inlineCode",{parentName:"a"},"2304.1"))),(0,i.kt)("li",{parentName:"ul"},"Fixed a bug that prevented some signers to sign with ",(0,i.kt)("inlineCode",{parentName:"li"},"2304.0-prerelease")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/716"},"#716")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an ",(0,i.kt)("inlineCode",{parentName:"li"},"EraChecker")," that checks if an era is active ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/708"},"#708")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an ",(0,i.kt)("inlineCode",{parentName:"li"},"EraReader")," that gathers era activation data ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/709"},"#709")),(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of an ",(0,i.kt)("inlineCode",{parentName:"li"},"EraReader")," adapter with on chain transaction as source ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/710"},"#710")),(0,i.kt)("li",{parentName:"ul"},"Completed the relational design of the aggregator store ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/476"},"#476")),(0,i.kt)("li",{parentName:"ul"},"Completed adding a new SPO on the ",(0,i.kt)("inlineCode",{parentName:"li"},"testing-preview")," network ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/729"},"#729")),(0,i.kt)("li",{parentName:"ul"},"Completed the upgrade of the Cardano node to ",(0,i.kt)("inlineCode",{parentName:"li"},"1.35.5")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/725"},"#725")),(0,i.kt)("li",{parentName:"ul"},"Fixed flakiness in the CI ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/734"},"#734"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/aa4c9cc8.6f769daf.js b/assets/js/aa4c9cc8.6f769daf.js new file mode 100644 index 00000000000..b899eabb90a --- /dev/null +++ b/assets/js/aa4c9cc8.6f769daf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[50919],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),u=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=u(a),m=n,c=h["".concat(s,".").concat(m)]||h[m]||d[m]||i;return a?r.createElement(c,o(o({ref:t},p),{},{components:a})):r.createElement(c,o({ref:t},p))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},13503:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-05-19-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-19-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-19-hydra.md",source:"@site/blog/2023-05-19-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-05-19T00:00:00.000Z",formattedDate:"May 19, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.045,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-05-19-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-24-node-cli-api"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-17-consensus"}},s={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:u},h="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the "Coding Standards" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete validation of timed transactions feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/196"},"#196"),"."),(0,n.kt)("li",{parentName:"ul"},"Write ","\u201c","ops","\u201d"," instructions and troubleshooting ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/569"},"#569")," and improve logs."),(0,n.kt)("li",{parentName:"ul"},"Remove ",(0,n.kt)("inlineCode",{parentName:"li"},"--ledger-genesis")," argument to hydra-node options ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/863"},"#863"),"."),(0,n.kt)("li",{parentName:"ul"},"Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/877"},"#877"),"."),(0,n.kt)("li",{parentName:"ul"},"Use nix to build test binaries to increase CI speed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/867"},"#867"),"."),(0,n.kt)("li",{parentName:"ul"},"Updated our ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/wiki/Coding-Standards"},"Coding Standards"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting."),(0,n.kt)("li",{parentName:"ul"},'Have a first end-to-end journey for external commits implementing "Option A" ',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),"."),(0,n.kt)("li",{parentName:"ul"},"Integrate spanish translation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/866"},"#866"),"."),(0,n.kt)("li",{parentName:"ul"},"Improve and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"),"."),(0,n.kt)("li",{parentName:"ul"},"Allow commit transactions with multiple UTxO ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/774"},"#774"),"."),(0,n.kt)("li",{parentName:"ul"},"Explored stateless observation and refined hydra explorer ticket ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/696"},"#696"),".")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/aafd9eaa.e577fb53.js b/assets/js/aafd9eaa.e577fb53.js new file mode 100644 index 00000000000..855dce80032 --- /dev/null +++ b/assets/js/aafd9eaa.e577fb53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89083],{25543:a=>{a.exports=JSON.parse('{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing","allTagsPath":"/cardano-updates/tags","count":25}')}}]); \ No newline at end of file diff --git a/assets/js/ab4c3279.cc8e8278.js b/assets/js/ab4c3279.cc8e8278.js new file mode 100644 index 00000000000..b9fbdbc862c --- /dev/null +++ b/assets/js/ab4c3279.cc8e8278.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72690],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function u(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),h=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=h(e.components);return r.createElement(l.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,p=u(e,["components","mdxType","originalType","parentName"]),s=h(a),c=n,m=s["".concat(l,".").concat(c)]||s[c]||d[c]||i;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var u={};for(var l in t)hasOwnProperty.call(t,l)&&(u[l]=t[l]);u.originalType=e,u[s]="string"==typeof e?e:n,o[1]=u;for(var h=2;h<i;h++)o[h]=a[h];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},67660:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>u,toc:()=>h});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-09-22-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,u={permalink:"/cardano-updates/2023-09-22-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-22-hydra.md",source:"@site/blog/2023-09-22-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-22T00:00:00.000Z",formattedDate:"September 22, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.035,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-22-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-26-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-22-performance-and-tracing"}},l={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:h},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team conducted the monthly review meeting in\ncollaboration with Mithril, enhancing project coordination."),(0,n.kt)("p",null,"The team improved the gen-hydra-key node command for smoother usability\nand identified concrete steps to enhance network resiliency in feature\nitems ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188"),",\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1080"},"#1080"),", and\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1079"},"#1079"),".\nAdditionally, they contributed the aiken-mode editor integration to the\naiken-lang organization, updated dependencies to utilize cardano-api\n8.20, and published the Hydra security advisory CVE-2023-42806 with a\nworkaround available for users."),(0,n.kt)("p",null,"These efforts demonstrate the team\\'s commitment to project improvement,\nsecurity, and open-source community collaboration."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Conducted the monthly review meeting together with Mithril"),(0,n.kt)("li",{parentName:"ul"},"Improved gen-hydra-key node command\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1077"},"#1077")),(0,n.kt)("li",{parentName:"ul"},"Established a clear plan to improve resiliency of network and manifested\nfeature items ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188"),",\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1080"},"#1080")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1079"},"#1079")),(0,n.kt)("li",{parentName:"ul"},"Moved ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/aiken-lang/aiken-mode"},"aiken-mode")," (created by SN)\nto aiken-lang organization"),(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to using cardano-api 8.20\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1075"},"#1075")),(0,n.kt)("li",{parentName:"ul"},"Published security advisory\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq"},"CVE-2023-42806"),"\n(workaround available)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Write-up the monthly report for September"),(0,n.kt)("li",{parentName:"ul"},'Finish "network resilience to disconnects"\n',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"Finish kupo integration with hydra\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1078"},"#1078")),(0,n.kt)("li",{parentName:"ul"},"Discuss and decide on using aiken or not"),(0,n.kt)("li",{parentName:"ul"},"Address the published security advisory\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq"},"CVE-2023-42806"),"\n(to not require workaround)"),(0,n.kt)("li",{parentName:"ul"},"Ideally, release 0.13.0")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ac12bff3.f511d815.js b/assets/js/ac12bff3.f511d815.js new file mode 100644 index 00000000000..ae5a4023dec --- /dev/null +++ b/assets/js/ac12bff3.f511d815.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[4608],{66384:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/49","page":49,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/48","nextPage":"/cardano-updates/page/50","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ac56cb0b.5e036803.js b/assets/js/ac56cb0b.5e036803.js new file mode 100644 index 00000000000..708134d24bf --- /dev/null +++ b/assets/js/ac56cb0b.5e036803.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39329],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),l=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=l(e.components);return a.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),h=l(n),c=o,m=h["".concat(s,".").concat(c)]||h[c]||d[c]||i;return n?a.createElement(m,r(r({ref:t},u),{},{components:n})):a.createElement(m,r({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=c;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[h]="string"==typeof e?e:o,r[1]=p;for(var l=2;l<i;l++)r[l]=n[l];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}c.displayName="MDXCreateElement"},7640:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>l});var a=n(87462),o=(n(67294),n(3905));const i={title:"Consensus Team Update",slug:"2022-11-16-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},r=void 0,p={permalink:"/cardano-updates/2022-11-16-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-consensus.md",source:"@site/blog/2022-11-16-consensus.md",title:"Consensus Team Update",description:"High-level summary",date:"2022-11-16T00:00:00.000Z",formattedDate:"November 16, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:5.06,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-11-16-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-18-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-16-node-cli-api"}},s={authorsImageUrls:[void 0]},l=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"High-level status report",id:"high-level-status-report",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Finish the UTxO HD prototype",id:"finish-the-utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:3},{value:"Benchmarking the CSJ prototype",id:"benchmarking-the-csj-prototype",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3},{value:"Support",id:"support",level:3}],u={toc:l},h="wrapper";function d(e){let{components:t,...i}=e;return(0,o.kt)(h,(0,a.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,o.kt)("p",null,'During the past two weeks, the consensus team started documenting the\nimplementation of the UTxO HD feature and continued developing tests for it. As\npart of our work on UTxO HD, we improved the Haskell support for LMDB. We also\nspent time working on the LSM tree prototype, and designed a parameter tuning\nalgorithm for it. Regarding our work on Genesis, our investigation of the\n"plateaus" pointed at the ',(0,o.kt)("inlineCode",{parentName:"p"},"TICKF"),' slowdown on era boundaries as culprit. This\nled us to developing a caching strategy that will not only remove the\naforementioned "plateaus", but can help alleviating the growing block production\ndelay on epoch switch. We also helped reviewing the block forge credential\nhotswap feature, which is intended for use in the adoption of P2P.'),(0,o.kt)("p",null,"We also worked on paying technical debt and fostering collaboration. In\nparticular, we improved the ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim")," framework, which is crucial for testing and\nsimulating Cardano components. We also removed thunks that appeared on era\ntranslations, and improved our diffusion pipelining feature. We are working on a\npresentation for explaining Praos and Genesis."),(0,o.kt)("h2",{id:"high-level-status-report"},"High-level status report"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Finish the UTxO HD prototype: in progress.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"We added documentation for this feature."),(0,o.kt)("li",{parentName:"ul"},"We developed the second version of the mempool tests."),(0,o.kt)("li",{parentName:"ul"},"We fixed benchmarks that were inflating the speedup we observed in the\nanti-diff implementation of sequences of differences. Speedups are now in the\nrange of ","[3.33, 4.75]",", which remain significant."),(0,o.kt)("li",{parentName:"ul"},"We continued improving Haskell LMDB support."),(0,o.kt)("li",{parentName:"ul"},'We finished implementing a "parameter tuning algorithm" for the LSM tree\nprototype. This enables us to run experiments to check the correctness of\nthe algorithm.'))),(0,o.kt)("li",{parentName:"ul"},"Genesis: in progress.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},'Work investigating the "plateaus" in the ',(0,o.kt)("inlineCode",{parentName:"li"},"ChainSync")," jumping prototype\npointed to the ",(0,o.kt)("inlineCode",{parentName:"li"},"TICKF")," slowdown on era boundaries as culprit."))),(0,o.kt)("li",{parentName:"ul"},"Tech debt:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"We improved the capabilities of our ",(0,o.kt)("inlineCode",{parentName:"li"},"io-sim")," library, which is crucial for\ntesting and simulating Cardano components."),(0,o.kt)("li",{parentName:"ul"},"We removed thunks from epoch translations in the ledger."),(0,o.kt)("li",{parentName:"ul"},"We added Linux CI support for ",(0,o.kt)("inlineCode",{parentName:"li"},"lmdb-simple"),"."),(0,o.kt)("li",{parentName:"ul"},"We got pending diffusion pipelining improvements merged."))),(0,o.kt)("li",{parentName:"ul"},"Fostering collaboration:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"We are working on a explanation of Praos and Genesis protocols."))),(0,o.kt)("li",{parentName:"ul"},"Support:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},'Investigation of CSJ "plateaus" led us to developing a caching strategy for\n',(0,o.kt)("inlineCode",{parentName:"li"},"TICKF"),' that will not only remove these "plateaus", but can help alleviating\nthe growing block production delay on epoch switch.'),(0,o.kt)("li",{parentName:"ul"},"We reviewed the block forge credential hotswapping feature which is intended\nfor use in the adoption of P2P.")))),(0,o.kt)("h2",{id:"workstreams"},"Workstreams"),(0,o.kt)("h3",{id:"finish-the-utxo-hd-prototype"},"Finish the UTxO HD prototype"),(0,o.kt)("p",null,"We merged PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4060"},"#4060"),", which adds a report documenting the UTxO HD\nfeature, and puts emphasis in explaining how the mempool works in combination\nwith UTxO HD."),(0,o.kt)("p",null,"We opened a draft PR with the second iteration of the property tests for the\nmempool (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4076"},"#4076"),")."),(0,o.kt)("p",null,"We fixed the ",(0,o.kt)("inlineCode",{parentName:"p"},"Arbitrary")," instances for keys and values in ",(0,o.kt)("inlineCode",{parentName:"p"},"DiffSeq")," benchmarks\n(",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4143"},"#4143"),"). The problem was that we were testing with mostly small\nvalues, which artificially boosted the performance gains we saw on benhcmarks.\nSpeedups are now in the range of ","[3.33, 4.75]"," across the different\nconfigurations."),(0,o.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,o.kt)("p",null,"We focused on incorporating feedback on the monadic cursor API PR (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"#1"),").\nThis required us to make small tweaks to ",(0,o.kt)("inlineCode",{parentName:"p"},"quickcheck-lockstep")," to test the new\nAPI. We also updated the backing store property tests to use the new version of\nthe monadic cursor API."),(0,o.kt)("h3",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,o.kt)("p",null,'We worked on the LSM tree prototype. In particular: finished implementing a\n"parameter tuning algorithm" that adapts the LSM tree design based on factors\nlike:'),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"workload"),(0,o.kt)("li",{parentName:"ul"},"machine specs, "),(0,o.kt)("li",{parentName:"ul"},"and characteristics of the data being stored. ")),(0,o.kt)("p",null,"We are now running experiments to gather results and cross-reference them with\nexisting experimental results from the LSM tree paper to see if the algorithm is\nworking correctly."),(0,o.kt)("h3",{id:"benchmarking-the-csj-prototype"},"Benchmarking the CSJ prototype"),(0,o.kt)("p",null,'We focused on investigating the "plateaus" in the ',(0,o.kt)("inlineCode",{parentName:"p"},"ChainSync")," tip, which turned\nout to be due to the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," bug which we previously were only aware of in the\ncontext of the long forging times near epoch boundaries. For the most drastic\npatch by @nfrisby to speed up ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF"),", full sync is speeding up by 7%."),(0,o.kt)("p",null,"The following plot shows that by caching the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," the ",(0,o.kt)("inlineCode",{parentName:"p"},"ChainSync")," tip and the\n",(0,o.kt)("inlineCode",{parentName:"p"},"VolatileDB")," tip progress at the same rate."),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(29287).Z,width:"765",height:"445"})),(0,o.kt)("p",null,"The plot below shows the speedup observed by caching the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," rule wrt the\nbaseline."),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(17885).Z,width:"773",height:"445"})),(0,o.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,o.kt)("p",null,"After addressing the PR comments, we merged PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/16"},"#16"),", which implements\nthe ",(0,o.kt)("inlineCode",{parentName:"p"},"MonadCatch")," instance for ",(0,o.kt)("inlineCode",{parentName:"p"},"STM"),". This extends the capability of our ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim"),"\nlibrary, which is crucial for testing and simulating Cardano components PR #16\nclosed ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/1461"},"#1461"),". This new feature was published as version ",(0,o.kt)("inlineCode",{parentName:"p"},"0.4.0.0"),"\nof ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim"),"."),(0,o.kt)("p",null,"We continued with our work fixing the ",(0,o.kt)("inlineCode",{parentName:"p"},"NoThunk")," errors required for enabling\nnightly tests, with the help of ",(0,o.kt)("inlineCode",{parentName:"p"},"TVarInvariant")," checks in ",(0,o.kt)("inlineCode",{parentName:"p"},"strict-stm")," and\n",(0,o.kt)("inlineCode",{parentName:"p"},"nothunks")," libraries. We proposed fixes in ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger")," that took care of\nthunks that appeared in era translations (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3143"},"#3143"),"). The fixes will be\nintegrated back into consensus when ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger")," approves and publish the\nchanges introduced in ",(0,o.kt)("inlineCode",{parentName:"p"},"#3143"),"."),(0,o.kt)("p",null,"We added CI support for ",(0,o.kt)("inlineCode",{parentName:"p"},"lmdb-simple")," (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/2"},"#2"),"). We currently test the build on\na Linux environment only."),(0,o.kt)("p",null,"We got pending diffusion pipelining PRs (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3857"},"#3857"),", ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3860"},"#3860"),",\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3856"},"#3856"),") merged, after rebasing and addressing feedback."),(0,o.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,o.kt)("p",null,"@nfrisby finished a visualisation tool and outlined scripts for the Praos and\nGenesis explanation presentations. The idea is to produce a video that gives an\noverview of these protocols."),(0,o.kt)("h3",{id:"support"},"Support"),(0,o.kt)("p",null,"We started working on caching the computation of the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," rule\n(",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4054"},"#4054"),"), since this was blocking our benchmarking work for\nGenesis. In addition, this issue has the Cardano community ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4421"},"quite\nconcerned"),", so we are hoping the work done in caching the\ncomputation of the ",(0,o.kt)("inlineCode",{parentName:"p"},"TICKF")," rule can help alleviating the growing block\nproduction delay on epoch switch."),(0,o.kt)("p",null,"We reviewed the block forge credential hotswapping PR ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3800"},"#3800")," from the\nnetworking team, which is intended for use in the adoption of P2P."))}d.isMDXComponent=!0},17885:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-16-comparing-TICKF-batch-c6570a71c4a5d53b10cb7309d2cc742c.png"},29287:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-16-removed-stuttering-e49aa27a0e549f0195373203da971ba7.png"}}]); \ No newline at end of file diff --git a/assets/js/ac87db6a.c0500c01.js b/assets/js/ac87db6a.c0500c01.js new file mode 100644 index 00000000000..8f44570bc8f --- /dev/null +++ b/assets/js/ac87db6a.c0500c01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62703],{20637:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/4","page":4,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/3","nextPage":"/cardano-updates/tags/hydra/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ac8a5a87.fb97dd70.js b/assets/js/ac8a5a87.fb97dd70.js new file mode 100644 index 00000000000..8360098cf62 --- /dev/null +++ b/assets/js/ac8a5a87.fb97dd70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25853],{33480:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"2023-Q2-consensus","metadata":{"permalink":"/cardano-updates/quarterly/2023-Q2-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-consensus.md","source":"@site/quarterly/2023-Q2-consensus.md","title":"Consensus Q2 2023 Update","description":"2023-04 -- 2023-06","date":"2023-12-07T21:19:58.000Z","formattedDate":"December 7, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/quarterly/tags/consensus"}],"readingTime":4.47,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Q2 2023 Update","slug":"2023-Q2-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"nextItem":{"title":"Network Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-network"}},"content":"## 2023-04 -- 2023-06\\n\\n### Main achievements\\n\\n#### UTxO HD\\n\\n- We finished a major prototype refactoring, which includes:\\n - A better and finer grained DB lock mechanism.\\n - Elimination of race conditions.\\n - Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance.\\n - Architectural simplifications and performance improvements.\\n- We implemented a new package to support db-sync integration with UTxO-HD.\\n- We ran another set of ad-hoc benchmarks:\\n - We uncovered a performance regression on the Network component when using `GHC-9.2/9.4`.\\n - The synchronization and replay speed are as expected.\\n - However, we uncovered memory consumption issues (see figure below).\\n - The in-memory backend is consuming more memory than the baseline.\\n - The LMDB backend shows an unexpected memory usage peak.\\n - Investigation on these issues is ongoing.\\n- We integrated the latest changes in `main` branch.\\n - This required a re-design of the mempool to include the mempool fairness\\n improvement.\\n\\n![](/images/consensus/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks.png)\\n\\n#### Genesis\\n\\n- The Genesis work for this PI focused on an high-priority issue from the IOG Researchers\' feedback on the proposal.\\n - This particular question was not anticipated when the Q2 PI was planned.\\n - As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized.\\n - That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package.\\n- The IOG Researchers\' feedback on the design was very valuable. It had two primary effects.\\n- Outcome 1: We re-introduced distinct behaviors when the node is \\"syncing\\" versus when it is \\"caught up\\".\\n - This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated.\\n - The additional design complexity is relatively small.\\n- Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.\\n - The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era.\\n - All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras.\\n - Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later.\\n - The primary invention was a model for bounding how much benefit the adversary\'s long-range attack could possibly gain from Praos\'s natural short forks.\\n- Relevant questions that the IOG Researchers are still assessing.\\n - These do not block the Genesis implementation, but do affect the ultimate values of specific parameters.\\n - Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?\\n - Question 2: what is the upper bound on how much grinding can improve the adversary\'s leader schedule within some Genesis window?\\n\\n#### Support\\n- We performed an analysis on number of file descriptors used by Consensus, this\\n information can be used by the node operators to check if the number of file\\n descriptors they want to support are enough, thus improving the user (eg node\\n operator) experience.\\n- We implemented a mempool fairness improvement, by which transactions are\\n guaranteed to be processed irrespective of their size.\\n\\n#### Technical debt\\n\\n- We fixed a bug in followers logic, which was discovered by our `QuickCheck`\\nproperty tests.\\n- We created an [immutable DB\\n server](https://github.com/input-output-hk/ouroboros-consensus/pull/68). This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results.\\n- We created a [`db-truncater`](https://github.com/input-output-hk/ouroboros-consensus/pull/70) tool, which can be used in disaster recovery and benchmarking scenarios.\\n- We created a [benchmarks comparison tool](https://github.com/input-output-hk/ouroboros-consensus/pull/161) that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance *improvements* introduced by the Ledger team in version `0.6.0.0` of Consensus wrt version `0.5.0.0`.\\n\\n![](/images/consensus/2023-Q2-beacon-graph.png)\\n\\n#### Fostering collaboration\\n\\n- We released `fs-sim` as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project.\\n- We migrated the consensus code to a [new repository](https://github.com/input-output-hk/ouroboros-consensus), splitting\\nit from the `ouroboros-network` repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases).\\n- We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users).\\n- We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.\\n\\n### Next steps\\n\\n#### UTxO HD\\n\\n- We will [get UTxO-HD ready for handover](https://github.com/input-output-hk/ouroboros-consensus/issues/28).\\n\\n#### Genesis\\n\\n- We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work."},{"id":"2023-Q2-network","metadata":{"permalink":"/cardano-updates/quarterly/2023-Q2-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-network.md","source":"@site/quarterly/2023-Q2-network.md","title":"Network Q2 2023 Update","description":"2023-04 - 2023-06","date":"2023-12-07T21:19:58.000Z","formattedDate":"December 7, 2023","tags":[{"label":"network","permalink":"/cardano-updates/quarterly/tags/network"}],"readingTime":5.145,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Q2 2023 Update","slug":"2023-Q2-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-consensus"},"nextItem":{"title":"SRE Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-sre"}},"content":"## 2023-04 - 2023-06\\n\\n### Main achievements\\n\\n#### Eclipse Evasion\\n\\nWe finalised the design of eclipse evasion and implemented its mechanism which\\nrelays on connectivity to _big ledger peers_. _Big ledger peers_ are the\\nlargest ledger peers which accumulate 90% of stake (currently there are less\\nthan 1000 of them). The outbound governor has new targets for _known_,\\n_established_ and _active_ big ledger peers which work in a similar way that\\nsuch targets work for ledger peers. The [ouroboros-network#4662] PR is\\ncurrently in review.\\n\\nAs part of this work we also identified a bug which would prevent a node to\\nconnect to itself. Such connections are not easily detectable and are expected\\nto be dropped by the churn mechanism, nonetheless they should not be buggy.\\nThe failure was discovered thanks to our e2e simulation of diffusion using\\n`io-sim` & property based testing.\\n\\nThe PR also refactors the heart of the `ouroboros-network` interface reducing\\ntechnical debt that would otherwise accumulate.\\n\\nWe also identified a possible improvement in the churn mechanism, which will be\\nimplemented in Q3. Churn needs to await for peers to terminate, we can\\nimprove the synchronisation. [ouroboros-network#4617]\\n\\n#### Ecosystem P2P Deployment Progress\\n\\nWe reached __50% of stake in hands of SPOs who run at least on P2P relay__. Now\\nalso Emurgo and CF are running some P2P relays. Also 20% of IOG relays are\\nrunning in P2P mode.\\n\\n![P2P Progress](/images/network/2023-07-06-p2p-progress.png)\\n\\n#### Peer Sharing\\n\\nWe implemented _bootstrapping for peer sharing_ (also known as light peer\\nsharing). New downstream (inbound) peers are now added to the _known peers_ of\\nthe _outbound governor_. Together with peer sharing this allows for non\\nregistered relays to propagate through the network. [ouroboros-network#3596]\\n\\n_Please note that peer sharing is disabled by default and is not considered safe\\nuntil Bootstrap Peers (see below) or Genesis is implemented._\\n\\n#### Diffusion (P2P)\\n\\n- We designed a feature which will reduce the load on IOG relays (in future\\n also run by CF & Emurgo). The feature consists of two parts. A new source\\n of peers called _bootstrap peers_ (obtained from via an https request), the\\n ability to switch from bootstrap peers to ledger peers if the node is synced\\n (we are collaborating with the consensus team on the interface [Bootstrap\\n Peers IER][bootstrap-ier]). This feature will be completed in Q3.\\n [ouroboros-network#4530]\\n\\n- We published a blog post about [P2P design & implementation][p2p-blog].\\n\\n- Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections:\\n [ouroboros-network#4559].\\n\\n- We merged changes which allow the consensus layer to start / stop block\\n forging thread. This will allow to deploy P2P block producing nodes which\\n serve as a live backup node. [ouroboros-consensus#140]\\n\\n- We fixed a few bugs in local root peers DNS resolution service:\\n [ouroboros-network#4583], [ouroboros-network#4571].\\n\\n- We limited concurrency of DNS name resolutions: [ouroboros-network#4596].\\n\\n- Galois Inc implemented query option for Handshake: [ouroboros-network#4256].\\n\\n- We fixed handshake query timeout: [ouroboros-network#4608].\\n\\n- We implemented warm valency for local root peers. This can help when using\\n DNS names in local root peers which resolve to many IP addresses. [ouroboros-network#4575]\\n\\n- We merged handshake changes which allow query protocol versions. Thanks to\\n James Parker from Galois Inc.: [ouroboros-network#4256], [cardano-cli#30].\\n\\n### Other Improvements & Developments\\n\\n#### CDDL\\n\\n- We added `node-to-node` and `node-to-client` CDDL specs / tests for encoding\\n of `NodeToNodeVersionData` and `NodeToClientVersionData`. \\n\\n- We clarified an inconsistency between CDDL spec and implementation which is\\n highly polymorphic. We designed and implemented a fix for `tx-submission`\\n and `local-tx-submission` mini-protocols. Specs for other mini-protocols will\\n be improved at a later stage. [ouroboros-network#4580]\\n\\n#### [Cardano Ping][cardano-ping]\\n\\n- `cardano-ping` command was deprecated in favour of `cardano-cli ping` (the\\n transition was done by the `node` team).\\n\\n- Support for `node-to-client` protocol using Unix sockets.\\n [ouroboros-network#4601]\\n\\n- Support for `NodeToNodeV_11` and `NodeToClientV_16`, [ouroboros-network#4587]\\n\\n- `cardano-cli ping` is now using _ISO8601_ format for timestamps. Formatting of\\n messages was improved. [ouroboros-network#4593]\\n\\n- `cardano-cli ping` has a new `--query-versions` flag which allows to query\\n supported versions by the remote node. This is supported by\\n `cardano-node-8.1.0`. [ouroboros-network#4589], [cardano-node#5313], [cardano-cli#30]\\n\\n#### [IOSim][io-sim]\\n\\n- We fixed timeouts & delays in `io-classes` in a series of PRs: [io-sim#81],\\n [io-sim#82], [io-sim#86], [io-sim#87].\\n\\n- We released `strict-stm-1.1.0.1` on Hackage which fixed a bug in package\\n description file: [io-sim#101].\\n\\n#### [Typed Protocols][typed-protocols]\\n\\n- We published haddocks of `typed-protocols` at\\n https://input-output-hk.github.io/typed-protocols\\n\\n#### [Cardano Client][cardano-client]\\n\\n- We fixed a bug in `cardano-client-0.1.0.2` release which results in clients\\n (e.g. `db-sync`) negotiate an experimental protocol version.\\n\\n#### Technical debt\\n\\n- After the split between consensus & network, we made `cardano-client`\\n independent of `ouroboros-consensus-diffusion`: [ouroboros-network#4526].\\n\\n- We wrap all exceptions in `DiffusionError`: [ouroboros-network#4537], [cardano-node#5356].\\n\\n#### CI improvements\\n\\n- We switched to use GitHub merge queues in `ouroboros-network`, `io-sim` and\\n `typed-protocols` repositories; [typed-protocols#30], [ouroboros-network#4546].\\n\\n- We cleaned & updated scripts which run on CI.\\n\\n- We implemented a script to verify & release packages on CHaP; [ouroboros-network#4542], [ouroboros-network#4573].\\n\\n- We implemented a new CI script and cleaned existing ones:\\n [ouroboros-network#4572].\\n\\n- We don\'t install cryptographic libraries on CI anymore as none of our\\n packages requires them; [ouroboros-network#4539].\\n\\n- Improved caching of dependencies: [ouroboros-network#4553].\\n\\n- We made it possible to trigger building haddock manually:\\n [ouroboros-network#4549].\\n\\n#### GHC 9.4 & 9.6\\n\\nWe made all repositories under our control compile with `ghc-9.4` and `ghc-9.6`\\nwhich includes `ouroboros-network`, `io-sim`, `typed-protocols` and\\n`Win32-network`.\\n\\n### Next steps\\n\\nWe will continue towards our [aspirational roadmap][roadmap].\\n\\n* We will continue reviewing eclipse evasion.\\n* As [ouroboros-consensus#140] was merged, we are making progress towards\\n releasing P2P on block production nodes. We hope to analyse performance\\n regression on such nodes observed on the benchmarking cluster. [roadmap-3887]\\n* We are also focused on [roadmap-3969]. Note that it was expanded in Q2.\\n\\n\\n[typed-protocols]: https://github.com/input-output-hk/typed-protocols\\n[typed-protocols#30]: https://github.com/input-output-hk/typed-protocols/pull/30\\n\\n[io-sim]: https://github.com/input-output-hk/io-sim\\n[io-sim#81]: https://github.com/input-output-hk/io-sim/pull/81\\n[io-sim#82]: https://github.com/input-output-hk/io-sim/pull/82\\n[io-sim#86]: https://github.com/input-output-hk/io-sim/pull/86\\n[io-sim#87]: https://github.com/input-output-hk/io-sim/pull/87\\n[io-sim#101]: https://github.com/input-output-hk/io-sim/pull/101\\n\\n\\n[cardano-node#5313]: https://github.com/input-output-hk/cardano-node/pull/5313\\n[cardano-node#5356]: https://github.com/input-output-hk/cardano-node/pull/5356\\n[cardano-cli#30]: https://github.com/input-output-hk/cardano-cli/pull/30/\\n\\n[cardano-client]: https://github.com/input-output-hk/ouroboros-network/blob/master/cardano-client\\n[cardano-ping]: https://github.com/input-output-hk/ouroboros-network/blob/master/cardano-ping\\n[ouroboros-network#3596]: https://github.com/input-output-hk/ouroboros-network/issues/3596\\n[ouroboros-network#4256]: https://github.com/input-output-hk/ouroboros-network/pull/4256\\n[ouroboros-network#4256]: https://github.com/input-output-hk/ouroboros-network/pull/4256\\n[ouroboros-network#4526]: https://github.com/input-output-hk/ouroboros-network/pull/4526\\n[ouroboros-network#4530]: https://github.com/input-output-hk/ouroboros-network/issues/4530\\n[ouroboros-network#4537]: https://github.com/input-output-hk/ouroboros-network/issues/4537\\n[ouroboros-network#4539]: https://github.com/input-output-hk/ouroboros-network/issues/4539\\n[ouroboros-network#4540]: https://github.com/input-output-hk/ouroboros-network/issues/4540\\n[ouroboros-network#4542]: https://github.com/input-output-hk/ouroboros-network/issues/4542\\n[ouroboros-network#4546]: https://github.com/input-output-hk/ouroboros-network/pull/4546\\n[ouroboros-network#4549]: https://github.com/input-output-hk/ouroboros-network/issues/4549\\n[ouroboros-network#4553]: https://github.com/input-output-hk/ouroboros-network/issues/4553\\n[ouroboros-network#4559]: https://github.com/input-output-hk/ouroboros-network/pull/4559\\n[ouroboros-network#4571]: https://github.com/input-output-hk/ouroboros-network/pull/4571\\n[ouroboros-network#4572]: https://github.com/input-output-hk/ouroboros-network/pull/4572\\n[ouroboros-network#4573]: https://github.com/input-output-hk/ouroboros-network/pull/4573\\n[ouroboros-network#4575]: https://github.com/input-output-hk/ouroboros-network/pull/4575\\n[ouroboros-network#4580]: https://github.com/input-output-hk/ouroboros-network/pull/4580\\n[ouroboros-network#4583]: https://github.com/input-output-hk/ouroboros-network/pull/4583\\n[ouroboros-network#4587]: https://github.com/input-output-hk/ouroboros-network/pull/4587\\n[ouroboros-network#4589]: https://github.com/input-output-hk/ouroboros-network/pull/4589\\n[ouroboros-network#4593]: https://github.com/input-output-hk/ouroboros-network/pull/4593\\n[ouroboros-network#4596]: https://github.com/input-output-hk/ouroboros-network/pull/4596\\n[ouroboros-network#4601]: https://github.com/input-output-hk/ouroboros-network/pull/4601\\n[ouroboros-network#4608]: https://github.com/input-output-hk/ouroboros-network/pull/4608\\n[ouroboros-network#4662]: https://github.com/input-output-hk/ouroboros-network/pull/4662\\n\\n[bootstrap-ier]: https://github.com/input-output-hk/ouroboros-consensus/blob/fbb8c8ee97517809dec0d0c8ae3fae9b8d272caf/docs/website/docs/bootstrap-peers-IER.md\\n[ouroboros-consensus#140]: https://github.com/input-output-hk/ouroboros-consensus/pull/140\\n\\n[io-sim-blog]: https://engineering.iog.io/2023-04-14-io-sim-annoucement\\n[p2p-blog]: https://engineering.iog.io/2023-06-28-p2p\\n\\n[roadmap]: https://github.com/orgs/input-output-hk/projects/39/views/30\\n[roadmap-3887]: https://github.com/orgs/input-output-hk/projects/39/views/30?pane=issue&itemId=6875505\\n[roadmap-3969]: https://github.com/orgs/input-output-hk/projects/39/views/30?pane=issue&itemId=8920085"},{"id":"2023-Q2-sre","metadata":{"permalink":"/cardano-updates/quarterly/2023-Q2-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-sre.md","source":"@site/quarterly/2023-Q2-sre.md","title":"SRE Q2 2023 Update","description":"2023-04 - 2023-06","date":"2023-12-07T21:19:58.000Z","formattedDate":"December 7, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/quarterly/tags/sre"}],"readingTime":0.68,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Q2 2023 Update","slug":"2023-Q2-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Network Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-network"},"nextItem":{"title":"Performance & Tracing Q3 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q3-performance-and-tracing"}},"content":"## 2023-04 - 2023-06\\n\\n### Main achievements\\n\\nIn addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:\\n- Expanding the darwin CI cluster and adding aarch64 builder support\\n- Adding bare metal capability to bitte clusters\\n- Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality\\n- Creation of pool performance analysis queries and scripting\\n- Migration of testnet metadata server to cardano-world\\n- Cardano shelley qa migration to cardano-world\\n- Cardano sanchonet environment spin up to test Conway era functionality\\n- Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature\\n\\n### Next steps\\n\\n- Continue with the conversion of mainnet to using p2p topology"},{"id":"2023-Q3-performance-and-tracing","metadata":{"permalink":"/cardano-updates/quarterly/2023-Q3-performance-and-tracing","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q3-performance-and-tracing.md","source":"@site/quarterly/2023-Q3-performance-and-tracing.md","title":"Performance & Tracing Q3 2023 Update","description":"2023-07 - 2023-09","date":"2023-12-07T21:19:58.000Z","formattedDate":"December 7, 2023","tags":[{"label":"performance-tracing","permalink":"/cardano-updates/quarterly/tags/performance-tracing"}],"readingTime":3.27,"hasTruncateMarker":false,"authors":[{"name":"Michael Karg","title":"Performance and Tracing Team Lead","url":"https://github.com/mgmeier","imageURL":"https://github.com/mgmeier.png","key":"mgmeier"}],"frontMatter":{"title":"Performance & Tracing Q3 2023 Update","slug":"2023-Q3-performance-and-tracing","authors":"mgmeier","tags":["performance-tracing"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Q2 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q2-sre"},"nextItem":{"title":"SRE Q3 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q3-sre"}},"content":"## 2023-07 - 2023-09\\n\\n### Main achievements\\n\\n* Release benchmarking\\n* Developing and running UTxO-HD benchmarks - in-memory flavour\\n* P2P benchmarks, facilitating rollout\\n* Production-readiness of the new Nomad cluster has been reached\\n* Optimization of and introspection capability for the new tracing system\\n* GHC9 performance investigation (and possible remedy)\\n* Conensus QTAs: first real-world application of prototype\\n#### Release benchmarking\\n\\nOngoing release benchmarking is a crucial safeguard to `cardano-node`\'s release cycle from a performance perspective. We\'ve performed and analyzed benchmarks for node versions `8.2.x` to `8.5` throughout Q3.\\n\\n#### UTxO-HD benchmarks\\n\\nTargeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery.\\n\\n#### P2P benchmarks\\n\\nIn Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature.\\n\\n#### New nomad cluster\\n\\nThe new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received \\nvarious rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest\\nof our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it\\nready for production use.\\n\\n#### New tracing system\\n\\nOur new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that\\nit is roughly on par with the legacy system while offering a richer feature set and greater flexibility. \\n\\nAdditionally, in Q3 we equipped the system with an introspection capability. This is now used for generating\\nend user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system.\\n\\n#### GHC9 performance\\n\\nIn Q3, a joint investigation with DevX into GHC9\'s behaviour revealed where and how GHC9 misses opportunities for\\noptimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable\\nthose optimizations - which is still being validated.\\n\\n#### Consensus QTAs\\n\\nIn collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations\'\\nperformance characteristics. It\'s now applicable, and being applied, to a real-world task - namely\\ngathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds.\\n\\n### Next steps\\n\\n#### Benchmarking:\\n\\nIn Q4, the focus will be on:\\n* facilitating the next mainnet release\\n* benchmarking runs in the Conway era\\n* developing benchmarks / workloads for Conway-exclusive actions\\n* implementing a specialized benchmark setup for the UTxO-HD on-disk variant\\n* developing new Plutus benchmarks to safeguard Plutus V3\\n* benchmarks regarding the rollout of P2P\\n\\n#### Performance\\n\\nFor certain blocking performance issues we\'ve located the cause, or even found a solution in a cross-team effort. In Q4 we\'ll advance that work to ensure the ongoing\\nrelease cycle for mainnet, as well as make GHC9 become a viable release platform.\\n\\n#### New tracing system\\n\\nFor the new tracing system, we\'ll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support.\\n\\n#### UTxO-HD monitoring\\n\\nWe\'ll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way.\\n\\n#### Nomad backend\\n\\nFrom Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad.\\n\\n#### Workbench\\n\\nWe will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with `cardano-node`.\\n\\n#### Consensus component QTAs (co-development)\\n\\nIn Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation."},{"id":"2023-Q3-sre","metadata":{"permalink":"/cardano-updates/quarterly/2023-Q3-sre","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q3-sre.md","source":"@site/quarterly/2023-Q3-sre.md","title":"SRE Q3 2023 Update","description":"2023-07 - 2023-09","date":"2023-12-07T21:19:58.000Z","formattedDate":"December 7, 2023","tags":[{"label":"sre","permalink":"/cardano-updates/quarterly/tags/sre"}],"readingTime":0.905,"hasTruncateMarker":false,"authors":[{"name":"John Lotoski","title":"Service Reliability Engineer","url":"https://github.com/johnalotoski","imageURL":"https://github.com/johnalotoski.png","key":"johnalotoski"}],"frontMatter":{"title":"SRE Q3 2023 Update","slug":"2023-Q3-sre","authors":"johnalotoski","tags":["sre"],"hide_table_of_contents":false},"prevItem":{"title":"Performance & Tracing Q3 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q3-performance-and-tracing"},"nextItem":{"title":"Consensus Quarterly Update","permalink":"/cardano-updates/quarterly/2023-04-25-consensus"}},"content":"## 2023-07 - 2023-09\\n\\n### Main achievements\\n\\nIn addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:\\n* Completion of mainnet relay networking conversion to p2p topology\\n* Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality\\n* Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines\\n* Creation of a nix content addressed packages repository, [capkgs](https://github.com/input-output-hk/capkgs):\\n * To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells\\n* Creation of a cardano performance benchmarking cluster, [cardano-perf](https://github.com/input-output-hk/cardano-perf):\\n * To replace legacy cluster benchmark tooling\\n* Creation of a cardano cluster composition repository, [cardano-parts](https://github.com/input-output-hk/cardano-parts):\\n * For enabling multi-cluster, multi-role cardano network deployments\\n* Creation of a cardano testnets repository, [cardano-playground](https://github.com/input-output-hk/cardano-playground):\\n * Utilizing cardano-parts for testnet deployments\\n* Creation of a sanchonet demo repository, [sanchonet-demo](https://github.com/input-output-hk/sanchonet-demo):\\n * Utilizing cardano-parts for fast sanchonet test environment and demo purposes\\n\\n### Next steps\\n\\n* Continue with migration of cardano-world testnets to cardano-playground\\n* Proceed with spinup of mainnet p2p bootstrap cluster\\n* Scale down mainnet non-p2p legacy cluster at the appropriate time"},{"id":"2023-04-25-consensus","metadata":{"permalink":"/cardano-updates/quarterly/2023-04-25-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-25-consensus.md","source":"@site/quarterly/2023-04-25-consensus.md","title":"Consensus Quarterly Update","description":"Consensus Quarterly Update","date":"2023-04-25T00:00:00.000Z","formattedDate":"April 25, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/quarterly/tags/consensus"}],"readingTime":2.3,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Quarterly Update","slug":"2023-04-25-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"SRE Q3 2023 Update","permalink":"/cardano-updates/quarterly/2023-Q3-sre"},"nextItem":{"title":"Network Q1 2023 Update","permalink":"/cardano-updates/quarterly/2023-04-04-network"}},"content":"## Consensus Quarterly Update\\n## 2023-01 - 2023-03\\n\\n### Main achievements\\n\\n#### UTxO HD\\n\\n- We finished the testing activities for the prototype, which involved adding\\n new tests, and fixing and enabling temporarily disabled tests.\\n- We spent a substantial amount of effort refactoring and cleaning the\\n prototype.\\n- We audited the UTxO HD prototype to make sure it can accommodate the migration\\n of other tables (eg stake-keys registration) from memory to disk. The result\\n of the audit was positive.\\n- We ran ad-hoc benchmarks for reading keys and flushing values to disk. No\\n unexpected costs found.\\n- We ran the first system level benchmarks. The performance regressions reported\\n were due to an unrealistic snapshotting rate. We need to re-run them again\\n after we design a more fine grained locking mechanism.\\n\\n#### Genesis\\n\\n- We elaborated a roadmap of the remaining work for Genesis.\\n- We presented the design to the IOG Researchers and PNSol on February 20. The\\n design was well received. We updated the Genesis design with the researcher\'s\\n feedback.\\n - We plugged the new DoS vector identified during the aforementioned\\n presentation.\\n- We developed a generator for adversarial leader schedules that satisfy key\\n Ouroboros properties, which will be used to test the Genesis design.\\n - The generator enables use of smaller Ouroboros parameters, which makes\\n extrema more likely and counterxamples easier interpret.\\n- We wrote up the latest design iteration.\\n- We continued benchmarking the Chain Sync Jumping prototype. In particular:\\n - We debugged the prototype\'s performance regression, and unmasked the\\n actual cause by patching our initial theory (bad queuing behavior)\\n - We identified and validated the actual cause (a pathological case in\\n BlockFetch tiebreaker).\\n\\n#### Support\\n\\n- We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother\\n to serve a local immutable DB.\\n\\n#### Conway era\\n\\n- We integrated the Conway era into consensus.\\n\\n#### Technical debt\\n\\n- We fixed a bug with followers, which was discovered by property tests.\\n- We developed a DSL for specifying and running ChainDB test cases.\\n- We fixed failing tests with iterators.\\n- We created micro-benchmarks for adding transactions to the mempool.\\n\\n#### Fostering collaboration\\n\\n- We released a new technical documentation site for consensus.\\n- We factored out several packages to external repositories. Some of this work\\n originated in the UTxO HD workstream.\\n\\n### Next steps\\n\\n#### UTxO HD\\n\\n- https://github.com/input-output-hk/ouroboros-consensus/issues/28\\n\\n#### Genesis\\n\\n- https://github.com/input-output-hk/ouroboros-consensus/issues/33\\n- https://github.com/input-output-hk/ouroboros-consensus/issues/32\\n- https://github.com/input-output-hk/ouroboros-consensus/issues/31\\n\\n#### Support\\n\\n- Design Consensus side of hardfork-enactment in the Voltaire phase\\n ([#4180](https://github.com/input-output-hk/ouroboros-network/issues/4180)).\\n- Estimate the number of file descriptors Consensus needs\\n [#20](https://github.com/input-output-hk/ouroboros-consensus/issues/20).\\n\\n#### Tech debt\\n\\n- Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define\\n for consensus. Pick one and implement benchmarks for it.\\n\\n#### Fostering collaboration\\n\\n- Onboard a new team member."},{"id":"2023-04-04-network","metadata":{"permalink":"/cardano-updates/quarterly/2023-04-04-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-04-network.md","source":"@site/quarterly/2023-04-04-network.md","title":"Network Q1 2023 Update","description":"2023-01 - 2023-03","date":"2023-04-04T00:00:00.000Z","formattedDate":"April 4, 2023","tags":[{"label":"network","permalink":"/cardano-updates/quarterly/tags/network"}],"readingTime":2.62,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Q1 2023 Update","slug":"2023-04-04-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Quarterly Update","permalink":"/cardano-updates/quarterly/2023-04-25-consensus"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/quarterly/2023-04-03-ledger"}},"content":"## 2023-01 - 2023-03\\n\\n### Main achievements\\n\\n#### Gradual dynamic P2P release on mainnet\\n\\nWe released two version of `cardano-node` with dynamic P2P capabilities:\\n\\n* [`1.35.6`][cardano-node-1.35.6]\\n - we found and fixed a bug in exception handling in `peer-state-actions`\\n [pull-4357]\\n - we found and fixed a busy loop when demoting a peer from hot to warm [pull-4385] \\n* [`1.35.7`][cardano-node-1.35.7]\\n - includes interoperability in the legacy non-p2p network stack [pull-4467]\\n* we fixed a busy loop of demotion & promotions: `warm -> hot -> warm`\\n [pull-4485] /it will be included in `cardano-node-8.0.0` release/.\\n\\nCurrently there are more than 200 P2P relays on mainnet.\\n\\n#### Peer Sharing\\n\\nWe implemented /peer sharing/ [pull-4019] which will be available as an\\nexperimental feature in one of the future `cardano-node` releases.\\n\\nWe implemented /light peer sharing/, e.g. adding inbound connections to the set\\nof known peers of the outbound governor, which allows to bootstrap relays not\\nregistered on chain. This complements peer sharing. The [pull-4277] is in\\nlate review stages.\\n\\n#### Eclipse Evasion\\n\\nWe finalised design of eclipse evasion and we started implementing it. We\\nhave an initial implementation (not merged). We are in the process of extending\\nour test suite to cover new implementation details: [issue-3886], [pull-4462].\\n\\n#### Cardano Network Service Assurance\\n\\nGalois has been making progress on _Cardano Network Service Assurance_ project.\\n\\n* In cardano-node, they have developed a `datapoint` abstraction that creates\\n a queue of (existing) log events, they now have two such `datapoint`s (of log\\n events) implemented.\\n\\n* They have developed a `datapoint` client executable that can connect to a node\\n which serves the \\"new tracing\\".\\n\\n* They have been exploring approaches for the consolidation and analysis of\\n `datapoint` data to extract actionable network health status.\\n\\n#### Cardano-Node\\n\\n* We made it possible to configure accepted connections limit [pull-4902].\\n\\n#### Testing improvements\\n\\n* We fixed a bug in network simulation implementation of TCP simultaneous open [pull-4265].\\n\\n* We introduced header-body split in the diffusion simulation [pull-4419] (in review).\\n\\n* We introduced initiator only nodes in the diffusion simulation [pull-4280].\\n\\n* We fixed a connection-manager test failure [issue-4370].\\n\\n#### Technical Debt\\n\\n* We refactored `Snocket` interface decoupling it from the multiplexer\\n [pull-4260]. This simplified some aspects of the KES agent implementation.\\n\\n* We introduces a record for CBOR codecs which are used for various data\\n structures by mini-protocol codecs [pull-4430].\\n\\n#### Documentation\\n\\n* We explained some limitations of CDDL in our technical report [pull-4351].\\n\\n#### IO-Sim\\n\\n* We fixed implementation of `MVar`\'s [pull-70].\\n\\n#### NoThunks\\n\\n* We published a new version of [`nothunks`] library to Hackage.\\n\\n### Next steps\\n\\n* Finish implementation & testing of eclipse evasion [issue-3886].\\n* Optimise connectivity to peers behind firewall [issue-4381].\\n* Finish the work on enabling block production dynamically to allow using P2P\\n on block producers [issue-3159].\\n* If time permits we would like also to reserve some time for finishing\\n publication of `io-sim` to Hackage.\\n\\n\\n[cardano-node-1.35.6]: https://github.com/input-output-hk/cardano-node/releases/tag/1.35.6\\n[cardano-node-1.35.7]: https://github.com/input-output-hk/cardano-node/releases/tag/1.35.7\\n\\n[pull-4019]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[pull-4277]: https://github.com/input-output-hk/ouroboros-network/pull/4277\\n[pull-4260]: https://github.com/input-output-hk/ouroboros-network/pull/4260\\n[pull-4265]: https://github.com/input-output-hk/ouroboros-network/pull/4265\\n[pull-4280]: https://github.com/input-output-hk/ouroboros-network/pull/4280\\n[pull-4351]: https://github.com/input-output-hk/ouroboros-network/pull/4351\\n[pull-4357]: https://github.com/input-output-hk/ouroboros-network/pull/4357\\n[pull-4385]: https://github.com/input-output-hk/ouroboros-network/pull/4385\\n[pull-4430]: https://github.com/input-output-hk/outoboros-network/pull/4430\\n[pull-4460]: https://github.com/input-output-hk/outoboros-network/pull/4460\\n[pull-4462]: https://github.com/input-output-hk/outoboros-network/pull/4462\\n[pull-4465]: https://github.com/input-output-hk/outoboros-network/pull/4465\\n[pull-4467]: https://github.com/input-output-hk/outoboros-network/pull/4467\\n[pull-4419]: https://github.com/input-output-hk/outoboros-network/pull/4419\\n\\n[pull-4902]: https://github.com/input-output-hk/cardano-node/pull/4902\\n\\n[issue-3159]: https://github.com/input-output-hk/ouroboros-network/issues/3159\\n[issue-3886]: https://github.com/input-output-hk/ouroboros-network/issues/3886\\n[issue-4370]: https://github.com/input-output-hk/ouroboros-network/issues/4370\\n[issue-4381]: https://github.com/input-output-hk/ouroboros-network/issues/4381\\n\\n[pull-70]: https://github.com/input-output-hk/io-sim/pull/70\\n\\n[`nothunks`]: https://hackage.haskell.org/package/nothunks"},{"id":"2023-04-03-ledger","metadata":{"permalink":"/cardano-updates/quarterly/2023-04-03-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-03-ledger.md","source":"@site/quarterly/2023-04-03-ledger.md","title":"Ledger Team Update","description":"Ledger Quarterly Update","date":"2023-04-03T00:00:00.000Z","formattedDate":"April 3, 2023","tags":[{"label":"ledger","permalink":"/cardano-updates/quarterly/tags/ledger"}],"readingTime":6.405,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2023-04-03-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Network Q1 2023 Update","permalink":"/cardano-updates/quarterly/2023-04-04-network"},"nextItem":{"title":"Consensus Quarterly Update","permalink":"/cardano-updates/quarterly/2023-01-18-consensus"}},"content":"## Ledger Quarterly Update\\n## 2023-01 - 2023-03\\n\\n### Main achievements\\n\\n#### CIPs\\n\\n* **Entering the Voltaire phase** -\\n CIP-1694 received a major update after participation in the design has expanded to\\n more and more people, including those who attended the Colorado workshop.\\n See [CIP-1694](https://github.com/cardano-foundation/CIPs/pull/380).\\n* **Ledger CIP category** -\\n The ledger team continues to embrace the CIP process, and has begun the process of\\n registering the ledger as an official CIP category.\\n See [CIP-84](https://github.com/cardano-foundation/CIPs/pull/456).\\n* **Ledger serialization** -\\n A CIP for the ledger serialization deprecation cycle has been accepted.\\n See [CIP-80](https://github.com/cardano-foundation/CIPs/tree/master/CIP-0080).\\n\\n#### Formal ledger model\\n\\nOur new formal specifications backed by Agda have seen a lot of progress.\\nThe majority of the ideas in CIP-1694 are now present, and we have made enough progress\\nthat we can now safely say that the PDF produced by the Agda model will be the\\nofficial ledger specification for the Conway ledger era.\\nSee [the repository](https://github.com/input-output-hk/formal-ledger-specifications).\\n\\n\\n#### Conway ledger era\\n\\nProgress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model.\\nThe major component still missing is the DRep stake distribution, which still presents some\\ntechnical challenges.\\n\\n[[pull-3176]]\\n[[pull-3216]]\\n[[pull-3226]]\\n[[pull-3291]]\\n[[pull-3326]]\\n[[pull-3330]]\\n[[pull-3339]]\\n\\n#### DRep stake distribution computation\\n\\nAdding another large stake distribution to the ledger state must proceed with caution.\\nWe do not want the memory used by the node to increase too much,\\nand performance problems can lead to reduced block production.\\nWe have prototyped, tested, and benchmarked several approaches that could give us\\nthe current DRep stake distribution at each epoch boundary.\\nThis has very important implications, since we want every ADA holder to be able to at any\\ntime (such as during a contentious vote) register themselves as a DRep and still have time\\nto vote themselves on the issue.\\n\\n[[pull-3344]]\\n[[pull-3353]]\\n[[pull-3364]]\\n\\n#### Integration work\\n\\nThe ledger has made some wonderful improvements over the past six months,\\nbut which entail a significant amount of integration efforts:\\n\\n* Our new versioned CBOR schemes\\n* Individual deposit tracking\\n* An improved cross-era interface utilizing lenses\\n* A new ledger API\\n* Re-arranging the ledger stake in preparation for CIP-1694\\n* Versioning our Haskell packages\\n using [CHaPs](https://github.com/input-output-hk/cardano-haskell-packages).\\n* Consistent conventions for variable names\\n\\n\\n[[pull-3279]]\\n[[pull-3282]]\\n[[pull-3288]]\\n[[pull-3289]]\\n[[pull-3292]]\\n[[pull-3297]]\\n[[pull-3298]]\\n[[pull-3299]]\\n[[pull-3300]]\\n[[pull-3302]]\\n[[pull-3303]]\\n[[pull-3308]]\\n[[pull-3342]]\\n[[pull-3345]]\\n[[pull-3356]]\\n[[pull-3357]]\\n[[pull-3360]]\\n[[pull-3361]]\\n[[pull-3363]]\\n[[pull-4349]]\\n[[pull-378]]\\n[[pull-376]]\\n[[pull-373]]\\n[[pull-370]]\\n[[pull-361]]\\n[[pull-4976]]\\n[[pull-5013]]\\n\\n#### Deposit tracking\\n\\nIndividual deposits (for stake credential and stake pool registrations) were not tracked by the ledger.\\nDeposits were returned according to the current protocol parameters.\\nWhen the values of these two protocol parameters change, the deposit pot\\nis adjusted by adding to, or removing from, the reserves.\\n\\nThis has several problems:\\n* Most people expect a deposit to be paid back exactly.\\n* We cannot increase the deposit amount once the reserves hits zero.\\n* If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials.\\n* Because of the problems above, it is going to be incredibly hard to ever change the values.\\n* There is a serious issue involving hard forks.\\n The consensus layer makes the decision about whether or not to enact a hard fork based on\\n the protocol parameter update state two stability windows before the end of the epoch.\\n However, the ledger will reject a protocol parameter update on the epoch boundary\\n if the deposit pot adjustments cannot be reconciled with the reseve pot.\\n This means that if quorum is met regarding changing the major protocol version,\\n but the update is rejected on the epoch boundary, consensus will change the era but the\\n ledger will not change the major protocol version, leaving the ledger in a split-brain state.\\n\\nBecause we never actually changed the values of the two deposits amounts in the protocol parameters\\non mainnet, we were able to retroactively change the behavior.\\nWe made the following changes:\\n * Individual deposits are tracked in the `DState`.\\n * The amount deposited is always returned.\\n\\n[[pull-3195]]\\n[[pull-3202]]\\n[[pull-3217]]\\n\\n#### New ledger API\\n\\nWe have significantly built up the ledger API.\\nWe will eventually replace much of the `cardano-api` in the node repository with this ledger API.\\n\\n[[pull-3242]]\\n[[pull-3248]]\\n[[pull-3328]]\\n\\n#### Constraint-based generators\\n\\nOur largest scale property tests generate an initial ledger state and a long sequence of valid blocks\\nwhich span several epochs, mimicking a real network.\\nThese tests are, in theory, excellent for checking properties.\\nThey are, however, very difficult to maintain and are not as random as we would like\\n(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).\\n\\nWe have a new declaritive infrastructure for building constraint-based generators,\\nwhich instead generate a random ledger state representative of not just an initial state,\\nbut also those representative of the end result of a long sequence of valid blocks.\\nMoreover, these generators are very fast and are much more random than our old generators.\\nBefore we can start using them for our existing property tests, however, we still need to\\nexpand them to generate a valid block for a given ledger state.\\n\\n[[pull-3219]]\\n\\n#### Technical debt\\n\\nWe continued to address technical debt as much as we can.\\n\\n[[pull-3167]]\\n[[pull-3170]]\\n[[pull-3172]]\\n[[pull-3175]]\\n[[pull-3184]]\\n[[pull-3205]]\\n[[pull-3208]]\\n[[pull-3210]]\\n[[pull-3212]]\\n[[pull-3218]]\\n[[pull-3222]]\\n[[pull-3223]]\\n[[pull-3224]]\\n[[pull-3225]]\\n[[pull-3229]]\\n[[pull-3239]]\\n[[pull-3241]]\\n[[pull-3244]]\\n[[pull-3245]]\\n[[pull-3249]]\\n[[pull-3260]]\\n[[pull-3263]]\\n[[pull-3264]]\\n[[pull-3268]]\\n[[pull-3269]]\\n[[pull-3270]]\\n[[pull-3274]]\\n[[pull-3276]]\\n[[pull-3277]]\\n[[pull-3286]]\\n[[pull-3290]]\\n[[pull-3295]]\\n[[pull-3296]]\\n[[pull-3306]]\\n[[pull-3307]]\\n[[pull-3310]]\\n[[pull-3311]]\\n[[pull-3316]]\\n[[pull-3320]]\\n[[pull-3323]]\\n[[pull-3327]]\\n[[pull-3331]]\\n[[pull-3332]]\\n[[pull-3333]]\\n[[pull-3338]]\\n[[pull-3341]]\\n[[pull-3347]]\\n[[pull-3350]]\\n[[pull-3351]]\\n[[pull-3352]]\\n[[pull-3354]]\\n\\n##### Critical fixes\\n\\nWe fixed two critical issues:\\n* Growing block production delay on the epoch boundary: [[pull-3209]]\\n* Unexpected node shutdown from `balanceR`: [[pull-3343]]\\n\\n### Next steps\\n\\n* **Conway spec** -\\n Complete the first version of the conway formal specification.\\n* **DRep stake distribution** -\\n Have the ledger compute the DRep stake distribution with acceptible performance.\\n* **Devnet ready** -\\n Have the Haskell implementation of the conway era in sync with the formal specification,\\n and integrate the changes with consensus and node.\\n All the details might not be finalized, but the wire specification and the API should\\n be stable so that conway can be placed on a devnet for tool builders to start integrating with.\\n* **Plutus V3** -\\n Integrate Plutus V3 into the ledger, including a new script context which supports DReps.\\n\\n### More details\\n\\nThis quarterly report was based off of the following fortnightly ones:\\n\\n* [2023-01-05](2023-01-05-ledger)\\n* [2023-01-19](2023-01-19-ledger)\\n* [2023-02-02](2023-02-02-ledger)\\n* [2023-02-17](2023-02-17-ledger)\\n* [2023-03-03](2023-03-03-ledger)\\n* [2023-03-17](2023-03-17-ledger)\\n* [2023-03-31](2023-03-31-ledger)\\n\\n[pull-3167]: https://github.com/input-output-hk/cardano-ledger/pull/3167\\n[pull-3170]: https://github.com/input-output-hk/cardano-ledger/pull/3170\\n[pull-3172]: https://github.com/input-output-hk/cardano-ledger/pull/3172\\n[pull-3175]: https://github.com/input-output-hk/cardano-ledger/pull/3175\\n[pull-3176]: https://github.com/input-output-hk/cardano-ledger/pull/3176\\n[pull-3184]: https://github.com/input-output-hk/cardano-ledger/pull/3184\\n[pull-3195]: https://github.com/input-output-hk/cardano-ledger/pull/3195\\n[pull-3202]: https://github.com/input-output-hk/cardano-ledger/pull/3202\\n[pull-3205]: https://github.com/input-output-hk/cardano-ledger/pull/3205\\n[pull-3208]: https://github.com/input-output-hk/cardano-ledger/pull/3208\\n[pull-3209]: https://github.com/input-output-hk/cardano-ledger/pull/3209\\n[pull-3210]: https://github.com/input-output-hk/cardano-ledger/pull/3210\\n[pull-3212]: https://github.com/input-output-hk/cardano-ledger/pull/3212\\n[pull-3214]: https://github.com/input-output-hk/cardano-ledger/pull/3214\\n[pull-3215]: https://github.com/input-output-hk/cardano-ledger/pull/3215\\n[pull-3216]: https://github.com/input-output-hk/cardano-ledger/pull/3216\\n[pull-3217]: https://github.com/input-output-hk/cardano-ledger/pull/3217\\n[pull-3218]: https://github.com/input-output-hk/cardano-ledger/pull/3218\\n[pull-3219]: https://github.com/input-output-hk/cardano-ledger/pull/3219\\n[pull-3222]: https://github.com/input-output-hk/cardano-ledger/pull/3222\\n[pull-3223]: https://github.com/input-output-hk/cardano-ledger/pull/3223\\n[pull-3224]: https://github.com/input-output-hk/cardano-ledger/pull/3224\\n[pull-3225]: https://github.com/input-output-hk/cardano-ledger/pull/3225\\n[pull-3226]: https://github.com/input-output-hk/cardano-ledger/pull/3226\\n[pull-3229]: https://github.com/input-output-hk/cardano-ledger/pull/3229\\n[pull-3239]: https://github.com/input-output-hk/cardano-ledger/pull/3239\\n[pull-3241]: https://github.com/input-output-hk/cardano-ledger/pull/3241\\n[pull-3242]: https://github.com/input-output-hk/cardano-ledger/pull/3242\\n[pull-3244]: https://github.com/input-output-hk/cardano-ledger/pull/3244\\n[pull-3245]: https://github.com/input-output-hk/cardano-ledger/pull/3245\\n[pull-3248]: https://github.com/input-output-hk/cardano-ledger/pull/3248\\n[pull-3249]: https://github.com/input-output-hk/cardano-ledger/pull/3249\\n[pull-3260]: https://github.com/input-output-hk/cardano-ledger/pull/3260\\n[pull-3263]: https://github.com/input-output-hk/cardano-ledger/pull/3263\\n[pull-3264]: https://github.com/input-output-hk/cardano-ledger/pull/3264\\n[pull-3268]: https://github.com/input-output-hk/cardano-ledger/pull/3268\\n[pull-3269]: https://github.com/input-output-hk/cardano-ledger/pull/3269\\n[pull-3270]: https://github.com/input-output-hk/cardano-ledger/pull/3270\\n[pull-3274]: https://github.com/input-output-hk/cardano-ledger/pull/3274\\n[pull-3276]: https://github.com/input-output-hk/cardano-ledger/pull/3276\\n[pull-3277]: https://github.com/input-output-hk/cardano-ledger/pull/3277\\n[pull-3279]: https://github.com/input-output-hk/cardano-ledger/pull/3279\\n[pull-3282]: https://github.com/input-output-hk/cardano-ledger/pull/3282\\n[pull-3286]: https://github.com/input-output-hk/cardano-ledger/pull/3286\\n[pull-3288]: https://github.com/input-output-hk/cardano-ledger/pull/3288\\n[pull-3289]: https://github.com/input-output-hk/cardano-ledger/pull/3289\\n[pull-3290]: https://github.com/input-output-hk/cardano-ledger/pull/3290\\n[pull-3291]: https://github.com/input-output-hk/cardano-ledger/pull/3291\\n[pull-3292]: https://github.com/input-output-hk/cardano-ledger/pull/3292\\n[pull-3295]: https://github.com/input-output-hk/cardano-ledger/pull/3295\\n[pull-3296]: https://github.com/input-output-hk/cardano-ledger/pull/3296\\n[pull-3297]: https://github.com/input-output-hk/cardano-ledger/pull/3297\\n[pull-3298]: https://github.com/input-output-hk/cardano-ledger/pull/3298\\n[pull-3299]: https://github.com/input-output-hk/cardano-ledger/pull/3299\\n[pull-3300]: https://github.com/input-output-hk/cardano-ledger/pull/3300\\n[pull-3302]: https://github.com/input-output-hk/cardano-ledger/pull/3302\\n[pull-3303]: https://github.com/input-output-hk/cardano-ledger/pull/3303\\n[pull-3306]: https://github.com/input-output-hk/cardano-ledger/pull/3306\\n[pull-3307]: https://github.com/input-output-hk/cardano-ledger/pull/3307\\n[pull-3308]: https://github.com/input-output-hk/cardano-ledger/pull/3308\\n[pull-3310]: https://github.com/input-output-hk/cardano-ledger/pull/3310\\n[pull-3311]: https://github.com/input-output-hk/cardano-ledger/pull/3311\\n[pull-3316]: https://github.com/input-output-hk/cardano-ledger/pull/3316\\n[pull-3320]: https://github.com/input-output-hk/cardano-ledger/pull/3320\\n[pull-3323]: https://github.com/input-output-hk/cardano-ledger/pull/3323\\n[pull-3326]: https://github.com/input-output-hk/cardano-ledger/pull/3326\\n[pull-3327]: https://github.com/input-output-hk/cardano-ledger/pull/3327\\n[pull-3328]: https://github.com/input-output-hk/cardano-ledger/pull/3328\\n[pull-3330]: https://github.com/input-output-hk/cardano-ledger/pull/3330\\n[pull-3331]: https://github.com/input-output-hk/cardano-ledger/pull/3331\\n[pull-3332]: https://github.com/input-output-hk/cardano-ledger/pull/3332\\n[pull-3333]: https://github.com/input-output-hk/cardano-ledger/pull/3333\\n[pull-3338]: https://github.com/input-output-hk/cardano-ledger/pull/3338\\n[pull-3339]: https://github.com/input-output-hk/cardano-ledger/pull/3339\\n[pull-3341]: https://github.com/input-output-hk/cardano-ledger/pull/3341\\n[pull-3342]: https://github.com/input-output-hk/cardano-ledger/pull/3342\\n[pull-3343]: https://github.com/input-output-hk/cardano-ledger/pull/3343\\n[pull-3344]: https://github.com/input-output-hk/cardano-ledger/pull/3344\\n[pull-3345]: https://github.com/input-output-hk/cardano-ledger/pull/3345\\n[pull-3347]: https://github.com/input-output-hk/cardano-ledger/pull/3347\\n[pull-3350]: https://github.com/input-output-hk/cardano-ledger/pull/3350\\n[pull-3351]: https://github.com/input-output-hk/cardano-ledger/pull/3351\\n[pull-3352]: https://github.com/input-output-hk/cardano-ledger/pull/3352\\n[pull-3353]: https://github.com/input-output-hk/cardano-ledger/pull/3353\\n[pull-3354]: https://github.com/input-output-hk/cardano-ledger/pull/3354\\n[pull-3356]: https://github.com/input-output-hk/cardano-ledger/pull/3356\\n[pull-3357]: https://github.com/input-output-hk/cardano-ledger/pull/3357\\n[pull-3360]: https://github.com/input-output-hk/cardano-ledger/pull/3360\\n[pull-3361]: https://github.com/input-output-hk/cardano-ledger/pull/3361\\n[pull-3363]: https://github.com/input-output-hk/cardano-ledger/pull/3363\\n[pull-3364]: https://github.com/input-output-hk/cardano-ledger/pull/3364\\n\\n[pull-4349]: https://github.com/input-output-hk/ouroboros-network/pull/4349\\n\\n[pull-378]: https://github.com/input-output-hk/cardano-base/pull/378\\n[pull-376]: https://github.com/input-output-hk/cardano-base/pull/376\\n[pull-373]: https://github.com/input-output-hk/cardano-base/pull/373\\n[pull-370]: https://github.com/input-output-hk/cardano-base/pull/370\\n[pull-361]: https://github.com/input-output-hk/cardano-base/pull/361\\n\\n[pull-4976]: https://github.com/input-output-hk/cardano-node/pull/4976\\n[pull-5013]: https://github.com/input-output-hk/cardano-node/pull/5013"},{"id":"2023-01-18-consensus","metadata":{"permalink":"/cardano-updates/quarterly/2023-01-18-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-18-consensus.md","source":"@site/quarterly/2023-01-18-consensus.md","title":"Consensus Quarterly Update","description":"Consensus Quarterly Update","date":"2023-01-18T00:00:00.000Z","formattedDate":"January 18, 2023","tags":[{"label":"consensus","permalink":"/cardano-updates/quarterly/tags/consensus"}],"readingTime":3.205,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Quarterly Update","slug":"2023-01-18-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/quarterly/2023-04-03-ledger"},"nextItem":{"title":"Network Quarterly Update","permalink":"/cardano-updates/quarterly/2023-01-13-network"}},"content":"## Consensus Quarterly Update\\n## 2022-12 - 2023-01\\n\\n### Main achievements\\n\\n#### UTxO HD\\n\\nThe prototype is feature complete and thoroughly tested at the consensus level.\\nIn particular, we invested a lot of time in writing property-test for the\\nmempool, and other crucial new parts of the prototype. Now we are ready to run\\nintegration tests and system-level benchmarks.\\n\\n#### Genesis\\n\\nWe identified and fixed a slowdown in cross-era forecasting that was inhibiting\\nour efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7%\\nspeedup in full sync times in the baseline.\\n\\nWe also started prototyping a self-contained implementation of the Genesis\\ndynamics (in particular of the parts intentionally not part of the ChainSync\\nJumping prototype) that furthered our understanding of subtleties and edge\\ncases.\\n\\n#### Support\\n\\n- We worked on designing integration of new VRF and KES crypto into consensus.\\n - `Crypto` class was split into two parts: `Crypto` and `HeaderCrypto`.\\n - With the Ledger team\'s help, we refactored `cardano-ledger` to use a proxy\\n type for VRF.\\n\\n#### Conway era\\n\\n- PR went through its second review round. It is about to be merged, but it got\\n delayed due to people\'s availability during Christmas break.\\n\\n#### Technical debt\\n\\n- We improved the capabilities of our `io-sim` library, which is key for testing\\n and simulating Cardano components.\\n- We removed thunks from epoch translations in the ledger, which is important\\n for reducing memory consumption of the Cardano node.\\n\\n#### Fostering collaboration\\n\\n- We added a tutorial on how to instantiate the Consensus layer to run custom\\n ledgers. This should be a valuable resource to people looking to roll their\\n own custom blockchain (either for commercial or research purposes).\\n- We added an overview of consensus to the [top level\\n documentation](https://input-output-hk.github.io/ouroboros-network/) of\\n ouroboros-network. This overview describes the consensus components and adds a\\n hyperlinked map to the modules documentation.\\n\\n### Next steps\\n\\n#### UTxO HD\\n\\n- Evaluate the extensibility of the prototype. Moving the UTxO to disk is only\\n the first step towards reducing the memory requirements of Cardano node, and\\n ensuring its long term sustainability. In the future, we plan on moving other\\n large maps, such as delegation maps. The prototype should be able to\\n accommodate these changes without any major modifications.\\n- Start the integration with other downstream components, such as the wallet and\\n db-sync. The idea is to identify and address any potential pain points that\\n might arise during this integration.\\n- Run integration tests and system-level benchmarks.\\n\\n#### Genesis\\n\\n- Finish benchmarking and tuning the fast-path ChainSync Jumping prototype\\n- Expand and optimize the self-contained implementation of the Disconnect Rule\\n (including density comparisons and the LoE)\\n- Develop documentation and smoke tests for these components.\\n- Start modifying the ChainSync Client for the LoP and LoR.\\n\\n#### Support\\n\\n- Help the Network team with diagnosing performance regression in block\\n production.\\n\\n#### Tech debt\\n\\n- Fix property-test failures concerning iterators ([#3999][issue-3999] and\\n [#4183][issue-4183]).\\n\\n#### Fostering collaboration\\n\\n- Finish [mapping consensus][issue-4145].\\n\\n### Risks \\n\\n#### UTxO HD\\n\\n- Moving other parts of the ledger state to disk might require a major redesign\\n of the prototype. For instance, if it turns out that the epoch change rules\\n require access to the *full* ledger state. If this is the case, we might\\n accept this risk and do the redesign after the initial release of UTxO-HD.\\n- Integration with downstream clients might require more work than we\\n anticipate.\\n- Access to the benchmarking\'s team time and resources.\\n- Benchmarking results might show significant performance degradation, which\\n will require additional work if such performance degradation is not accepted\\n by other stakeholders.\\n- The prototype\'s performance might not be accepted by other stakeholders. Here\\n we need to clearly communicate that this is necessary to ensure that as the\\n blockchain size grows, the node can operate within reasonable memory\\n constraints.\\n\\n[issue-4183]: https://github.com/input-output-hk/ouroboros-network/issues/4183\\n[issue-3999]: https://github.com/input-output-hk/ouroboros-network/issues/3999\\n[issue-4145]: https://github.com/input-output-hk/ouroboros-network/issues/4145"},{"id":"2023-01-13-network","metadata":{"permalink":"/cardano-updates/quarterly/2023-01-13-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-13-network.md","source":"@site/quarterly/2023-01-13-network.md","title":"Network Quarterly Update","description":"Network Quarterly Update","date":"2023-01-13T00:00:00.000Z","formattedDate":"January 13, 2023","tags":[{"label":"network","permalink":"/cardano-updates/quarterly/tags/network"}],"readingTime":4.125,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Quarterly Update","slug":"2023-01-13-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Quarterly Update","permalink":"/cardano-updates/quarterly/2023-01-18-consensus"},"nextItem":{"title":"Open-Source Update","permalink":"/cardano-updates/quarterly/2023-01-13-open-source"}},"content":"## Network Quarterly Update\\n## 2022-11 - 2023-01\\n\\n### Summary\\n\\nThe primary goal of the networking team was to focus on the single relay\\nrelease of P2P. We fixed a number of small late bugs, and concluded QA\\n& performance testing. Although it was discovered a regression in performance\\nof block production when P2P is enabled, relaying with P2P performs better\\ncomparing to a non p2p. We concluded that this is not a blocker for the Single\\nRelay Release which is planned shortly.\\n\\n[Peer sharing][pr #4019] has gone through review and final review is\\njust being done right now. After merging it will still be disabled (hidden\\nbehind a flag) as it\'s not safe without eclipse evasion. We started\\nimplementing light peer sharing (i.e. include inbound peers into known peer set\\nof the outbound governor).\\n\\nWe started a detailed eclipse evasion design, it will continue in the next\\nquarter.\\n\\nWe also made a major revision of package structure of the network packages. We\\nended up with a very clean dependency graph ([pr #4155]).\\n\\nArmando Santos delivered a talk at the [ODOPIS 2022] conference on principles\\nof distributed systems in Brussels. The slides are available [here][ODOPIS-slides].\\n\\nNeil Davies gave an invited seminar on `DeltaQ` at Universit\xe9 Catholique de\\nLouvain.\\n\\nWe also found and fixed a few of bugs:\\n\\n* a bug in keep alive mini-protocol which resulted in warm to cold transitions\\n to be always executed through a timeout path rather than do a clean demotion\\n ([pr #4168]).\\n\\n* fixed an assetion failure in the outbound governor ([issue #4177]) \\n\\n- we fixed DNS test failure [issue #4191]\\n\\n### Next steps\\n\\nWe will work towards the next release of P2P for block producer nodes. This includes:\\n\\n* analysing performance regression for BP nodes when using P2P\\n* finish the work on controlling the block forger through node kernel ([pr #3800])\\n* address [issue #3907] and write a script to analyse deployment of P2P relays\\n\\nWe would like also to push forward eclipse evasion. Although most of the work\\nhas be done already the release of `io-sim` on `Hackage` will happen in the\\nnext quarter.\\n\\nWe would also like to address [chain-sync timeout issue][issue #4244] recently\\ndiagnosed by Karl Knutsson.\\n\\nIf time permits we would also like to address some technical debt, especially:\\n\\n- [enable nothunk in diffusion tests][issue #3387]\\n- [refactor diffusion testnet simulation][issue #4085]\\n\\n### Risks\\n\\nThe performance regression for block producer with P2P needs to be investigated\\nin the near future. This is blocker for the release of P2P on BP nodes.\\n\\n### Detailed log\\n\\n#### Contributions to Ouroboros-Network\\n\\n- We added `TraceDemoteLocalAsynchronous`, which enables notification of critical issues for SPOs\\n- We fixed `cardano-ping` compatibility with `NodeToNodeV_10` (P2P, [pr #4165])\\n- We fixed a bug in demotion peers to cold which affected P2P nodes ([commit-61058aa5c2])\\n- Karl Knutsson enhanced `SendFetchRequest` ([commit-bb1c3dddee]), open-source contribution)\\n- We turned `SizeInBytes` into a newtype.\\n- We extended `CONTRIBUTING.md`, `README.md`, added `CODE_OF_CONDUCT`.\\n- We fixed DNS test failure [issue #4191]\\n- We fixed a simulation bug found in [issue #4258]\\n- [pr #4168]\\n- [issue #4177]\\n\\n#### Contributions to Cardano-Node\\n\\n- We maintained the Single Relay Release [pr #4612], (e.g. fixing CI issues,\\n Rebasing it when necessary, publishing packages to Cardano Haskell Packages);\\n- We enhanced `JSON` serialisation / deserialisation of `NodeToNodeVersion` and `NodeToClientVersion`;\\n\\n#### Contributions to IOSim\\n\\n- We started to use Cardano Haskell Packages for `IOSim` ([pr #48])\\n- We updated change log files\\n- We added support of `ghc-9.4` ([pr #50])\\n\\nWe also addressed the following issues in [pr #57] in order to prepare the package for publication on Hackage:\\n\\n- refactored `io-classes` timers API ([issue #46]);\\n- created a new package `si-timers` which exposes an interface using SI units\\n and is safe on 32-bit systems ([issue #59]);\\n- added monad transformers instances for classes defined in `io-classes` ([issue #58]);\\n- created `io-classes-mtl` package which includes (experimental) instances for monad transformers;\\n- provide `MonadMonotonicTimeNSec` in `io-classes` and `MonadMonotonicTime` in `si-timers` (so that `io-classes` follow the `base` package);\\n- added `registerCancellableDelay` in `si-timers` (which allowed us to hide fancy timer api and clean `io-classes`)\\n- added support for `js_HOST_ARCH` (the new GHC JS backend)\\n\\nNote the [pr #57] contains almost 40 commits, and was a major step forward for\\n`io-sim` ecosystem. We also prepared a draft [pr #4281] which updates\\n`ouroboros-network`.\\n\\nOther changes for `1.0.0.0` release on Hackage:\\n\\n- Refactored test suite ([pr #47])\\n- Updated documentation, cabal files, `CONTRIBUTING`, `SECURITY` documents, etc in [pr #60], currently under review.\\n\\n[commit-61058aa5c2]: https://github.com/input-output-hk/ouroboros-network/pull/4170/commits/61058aa5c28a144d723aae183d1745552d757334\\n[commit-bb1c3dddee]: https://github.com/input-output-hk/ouroboros-network/pull/4170/commits/bb1c3dddeea78949f531c144bb4f2669eddf7f47\\n[issue #3387]: https://github.com/input-output-hk/ouroboros-network/issues/3387\\n[issue #3907]: https://github.com/input-output-hk/ouroboros-network/issues/3907\\n[issue #4085]: https://github.com/input-output-hk/ouroboros-network/issues/4085\\n[issue #4168]: https://github.com/input-output-hk/ouroboros-network/issues/4168\\n[issue #4177]: https://github.com/input-output-hk/ouroboros-network/issues/4177\\n[issue #4191]: https://github.com/input-output-hk/ouroboros-network/issues/4191\\n[issue #4244]: https://github.com/input-output-hk/ouroboros-network/issues/4244\\n[issue #4258]: https://github.com/input-output-hk/ouroboros-network/issues/4258\\n[issue #46]: https://github.com/input-output-hk/io-sim/issues/46\\n[issue #58]: https://github.com/input-output-hk/io-sim/issues/58\\n[issue #59]: https://github.com/input-output-hk/io-sim/issues/59\\n[pr #3800]: https://github.com/input-output-hk/ouroboros-network/pull/3800\\n[pr #4019]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[pr #4155]: https://github.com/input-output-hk/ouroboros-network/pull/4155\\n[pr #4165]: https://github.com/input-output-hk/ouroboros-network/pull/4165\\n[pr #4281]: https://github.com/input-output-hk/cardano-node/pull/4281\\n[pr #4612]: https://github.com/input-output-hk/cardano-node/pull/4612\\n[pr #47]: https://github.com/input-output-hk/io-sim/pull/47\\n[pr #48]: https://github.com/input-output-hk/io-sim/pull/48\\n[pr #49]: https://github.com/input-output-hk/io-sim/pull/49\\n[pr #50]: https://github.com/input-output-hk/io-sim/pull/50\\n[pr #57]: https://github.com/input-output-hk/io-sim/pull/57\\n[pr #60]: https://github.com/input-output-hk/io-sim/pull/60\\n[ODOPIS 2022]: https://sites.uclouvain.be/OPODIS2022/armando-details.html\\n[ODOPIS-slides]: https://sites.uclouvain.be/OPODIS2022/slides/OPODIS2022-slides-Santos.pdf"},{"id":"2023-01-13-open-source","metadata":{"permalink":"/cardano-updates/quarterly/2023-01-13-open-source","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-13-open-source.md","source":"@site/quarterly/2023-01-13-open-source.md","title":"Open-Source Update","description":"Open Source Quarterly Update","date":"2023-01-13T00:00:00.000Z","formattedDate":"January 13, 2023","tags":[{"label":"open-source","permalink":"/cardano-updates/quarterly/tags/open-source"}],"readingTime":2.215,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Open-Source Update","slug":"2023-01-13-open-source","authors":"coot","tags":["open-source"],"hide_table_of_contents":false},"prevItem":{"title":"Network Quarterly Update","permalink":"/cardano-updates/quarterly/2023-01-13-network"},"nextItem":{"title":"Consensus Quarterly Update","permalink":"/cardano-updates/quarterly/2022-11-15-consensus"}},"content":"## Open Source Quarterly Update\\n## 2022-11 - 2023-01\\n\\n### Summary\\n\\nIn the last quarter the open-source initiative delivered a comprehensive report\\non the state of our repositories. As part of this work stream we\\nidentified the key open-source repositories for the cardano project across all\\nthe projects From a list of more than 500 repositories (some of which are\\nforks) we identified key repositories which constitute the core of Cardano.\\n20 of them were identified as to be transferred to the future MBO which will\\ngovern Cardano development. Some where excluded (like [`io-sim`] and\\n[`typed-protocols`]), to be govern by IOG, since they have a much broader\\napplication than Cardano itself, and thus we think their open-source future\\nwill be better outside of the Cardano umbrella.\\n\\nChristian Taylor identified a number of ways we can improve our repositories to\\nmake them more attractive for open-source contributions by analysing each of\\nthem. This includes adding or improving various documentation files, like\\n`CONTRIBUTING` files, adding code of conduct, improving readme files, issue\\n& pull request templates etc. Christian also computed various interesting\\nmetrics which gives a very good insight into the development practices: e.g.\\naverage merge ratio, average number of reviews, comments and many more! The\\npresentation is available [here][open-source-presentation].\\n\\nWe followed with work on the [Cardano Engineering Handbook][CEH]. We included\\na standard code of conduct which is now used by most important projects in the\\nCardano space. We included `cardano-node`\'s security policy and added\\na responsible disclosure policy. We also described how roles and\\nresponsibilities should be clarified. This progress was made by\\na collaborative effort of the Cardano Core, Plutus and Architecture teams, and\\nit wouldn\'t be possible without Michael Peyton Jones, Arnaud Bailly, Kevin\\nHammond, Jared Corduan and Marcin Szamotulski.\\n\\nWe also improved the documentation of key repositories, by adding description,\\nimproving their `README` file & `CONTRIBUTING` files, adding code of conducts\\nfollowing the [Cardano Engineering Handbook][CEH]. This includes improvements to:\\n\\n* [`ouroboros-network`] (both `network` & `consensus`)\\n* [`cardano-ledger`]\\n* [`cardano-node`]\\n\\nAnd also\\n\\n* [`io-sim`]\\n* [`typed-protocols`]\\n* [`cardano-prelude`] (work in progress)\\n\\nThe work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan. \\n\\n\\nIn this quarter we also identified a number of projects which can be published to\\n`Hackage` (Haskell\'s package repository) or `crate` (Rust package repository).\\nThe list contains 21 packages, 2 of which ([`hedgehog-extras`] and\\n[`quickcheck-dynamic`]) are already published on Hackage and another 5 (from\\nthe [`io-sim`] repository) are close to be published.\\n\\n\\n### Detailed log\\n\\nThe progress of the open-source project is tracked in [this project][open-source-project].\\n\\n[CEH]: https://input-output-hk.github.io/cardano-engineering-handbook/\\n[open-source-project]: https://github.com/orgs/input-output-hk/projects/60/views/1\\n[`cardano-ledger`]: https://github.com/input-output-hk/cardano-ledger\\n[`cardano-node`]: https://github.com/input-output-hk/cardano-node\\n[`cardano-prelude`]: https://github.com/input-output-hk/cardano-prelude\\n[`hedgehog-extras`]: https://hackage.haskell.org/package/hedgehog-extras\\n[`io-sim`]: https://github.com/input-output-hk/io-sim\\n[`ouroboros-network`]: https://github.com/input-output-hk/ouroboros-network\\n[`quickcheck-dynamic`]: https://hackage.haskell.org/package/quickcheck-dynamic\\n[`typed-protocols`]: https://github.com/input-output-hk/typed-protocols\\n[open-source-presentation]: https://docs.google.com/presentation/d/127IFEavlrZeeoFrVXFYWzSt0ugOkSL7isxjyM1vmMzQ"},{"id":"2022-11-15-consensus","metadata":{"permalink":"/cardano-updates/quarterly/2022-11-15-consensus","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-15-consensus.md","source":"@site/quarterly/2022-11-15-consensus.md","title":"Consensus Quarterly Update","description":"Consensus Quarterly Update","date":"2022-11-15T00:00:00.000Z","formattedDate":"November 15, 2022","tags":[{"label":"consensus","permalink":"/cardano-updates/quarterly/tags/consensus"}],"readingTime":3.655,"hasTruncateMarker":false,"authors":[{"name":"Damian Nadales","title":"Consensus Team Lead","url":"https://github.com/dnadales","imageURL":"https://github.com/dnadales.png","key":"dnadales"}],"frontMatter":{"title":"Consensus Quarterly Update","slug":"2022-11-15-consensus","authors":"dnadales","tags":["consensus"],"hide_table_of_contents":false},"prevItem":{"title":"Open-Source Update","permalink":"/cardano-updates/quarterly/2023-01-13-open-source"},"nextItem":{"title":"Network Team Update","permalink":"/cardano-updates/quarterly/2022-11-09-network"}},"content":"## Consensus Quarterly Update\\n## 2022-09 - 2022-11\\n\\n### Main achievements\\n\\n#### UTxO HD\\n\\n- As a consequence of the errors observed when running distributed mempool\\n benchmarks, we re-designed the UTxO HD mempool integration, which fixed these\\n errors and lead to a simpler and more maintainable design.\\n\\n- We focused on increasing test coverage for the UTxO-HD prototype. In\\n particular, we added property tests for:\\n - Backing store (work ongoing)\\n - Era transitions\\n\\n- The property tests we added uncovered several bugs, which is a great result\\n given the exponential increase in the cost of finding bugs as they are closer\\n to deployment.\\n\\n- One of the errors found by our tests required us to work on improvements in\\n the Haskell bindings for LMDB. This work is ongoing.\\n\\n- We started working on the mempool property tests that will exercise the new\\n code paths that UTxO HD introduced.\\n\\n- We developed, benchmarked and tested an implementation of sequences of\\n differences based on \\"anti-diffs\\". Performance results of diff sequence\\n operations show that we achieved a speedup of about `4x` across several\\n scenarios. Note: this speedup is taking into account diff sequence operations\\n only, so the consensus-wide speedup is less than `4x`.\\n\\n- We integrated the \\"anti-diff\\" prototype into the UTxO HD feature branch.\\n\\n#### Genesis\\n\\n- We wrote a simulator that demonstrates soundness of an abstract implementation\\n of the new chain selection rule.\\n- We elaborated a draft specification for the Genesis implementation (currently\\n awaiting feedback from other architects).\\n- We elaborated a draft specification for the ChainSync Jumping optimization. In\\n particular, this includes a proof sketch that the latter preserves liveness\\n and safety in all cases.\\n- With the Networking team, we co-designed the eclipse avoidance mechanism,\\n specifically its coherence with the Genesis implementation plan\'s security\\n and its dependence on the new ChainSync Jumping optimization.\\n- We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a\\n performance degradation wrt the baseline. Our optimization attempts so far\\n have brought the performance closer to the baseline, but not yet to parity.\\n\\n#### Conway era\\n\\n- We did most of the heavy lifting required to integrate the Conway era into the\\n Consensus layer.\\n\\n#### Technical debt\\n\\n- We started working on enabling CI nightly tests, which revealed several test\\n failures due to thunks being found it data structures used by the ledger and\\n consensus. We made a lot of progress fixing those thunk errors, but some\\n errors still remain.\\n\\n- We elaborated a `db-analyser` benchmark for the ledger operations. This led us\\n to the identification of high processing time at epoch boundaries, and we\\n could not observe any performance degradation that can be attributed to era\\n changes.\\n\\n- We fixed a source of flakiness in the ChainDB QSM test.\\n\\n- We clarified a common source of confusion around VRF tie-breaking and\\n cross-era chain selection.\\n\\n- We fixed a bug in the maximum-allowed ledger major protocol version.\\n\\n#### Fostering collaboration\\n\\n- We spent time making `cardano-updates` the central source of information for\\n the core teams stakeholders.\\n- We went through the Galois gap analysis and extracted actionable points to\\n take on next.\\n- Bart and Yogesh continued with their onboarding and stated making substantial\\n contributions to consensus.\\n\\n### Next steps\\n\\n#### UTxO HD\\n\\n- Finish the mempool property tests.\\n- Benchmark the latest version of the prototype.\\n- Elaborate a document that describes new integration test scenarios and pass it\\n to the SDET team.\\n- Bring query UTxO by address command performance on par with the baseline\\n version.\\n\\n#### Genesis\\n\\n- Receive and incorporate Duncan\'s feedback on the first draft specification for\\n the Genesis implementation.\\n- Begin prototyping the first genesis implementation, unless the first draft\\n needs major changes.\\n- Draft a second revision of the Genesis report.\\n- Review the second revision with a wider audience, which includes at least\\n Alexander Russell. That feedback will drive a third and hopefully final\\n revision.\\n- Investigate how to mitigate the ~30% slowdown we have observed so far in the\\n ChainSync jumping prototype, and try to mitigate it. In particular, we might\\n need to optimize the existing BlockFetch logic.\\n\\n#### Tech debt\\n\\n- Enabling nightly CI tests.\\n\\n#### Fostering collaboration\\n\\n- Merge the tutorial document Galois wrote; requires CI integration.\\n- Come up with our own documentation improvements, many of which were suggested\\n in the Galois gap analysis.\\n- Try to hire a new team member."},{"id":"2022-11-09-network","metadata":{"permalink":"/cardano-updates/quarterly/2022-11-09-network","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-09-network.md","source":"@site/quarterly/2022-11-09-network.md","title":"Network Team Update","description":"Network Quarterly Update","date":"2022-11-09T00:00:00.000Z","formattedDate":"November 9, 2022","tags":[{"label":"network","permalink":"/cardano-updates/quarterly/tags/network"}],"readingTime":3.87,"hasTruncateMarker":false,"authors":[{"name":"Marcin Szamotulski","title":"Network Team Lead","url":"https://github.com/coot","imageURL":"https://github.com/coot.png","key":"coot"}],"frontMatter":{"title":"Network Team Update","slug":"2022-11-09-network","authors":"coot","tags":["network"],"hide_table_of_contents":false},"prevItem":{"title":"Consensus Quarterly Update","permalink":"/cardano-updates/quarterly/2022-11-15-consensus"},"nextItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/quarterly/2022-11-07-ledger"}},"content":"## Network Quarterly Update\\n## 2022-09 - 2022-11\\n\\n### Summary of most important improvements\\n\\nDuring this quarter the networking team delivered low level specification of\\npeer sharing & eclipse evasion. We held a session with the consensus & the\\nscientists; we got a positive feedback on the design.\\n\\nFurther we focused on implementation of peer sharing. We produced a [detail\\ndesign][peer-sharing-design] and an [early implementation][peer-sharing-pr].\\n\\nWe prepared the _P2P Single Relay Release_ (`cardano-node-1.35.5`). It\\nincludes over [130 patches][p2p-release] of network stack improvements over the\\nprevious version `1.35.4`, which were accomplished over a longer period of\\ntime. Among them are both bug fixes and UX improvements for stake pool\\noperators like simplified format of the [topology file][topology-file], or\\nimprovements in the logged messages:\\n\\n* [tracing of early consensus exceptions][consensus-startup-trace]\\n* [tracing of demotion of local root peers][demotion-trace] (traced with\\n `Warning` severity), the trace is called `TraceDemoteLocalAsynchronous`, in\\n `json` format it is encoded as `DemoteLocalAsynchronous`. For an SPO\\n tracking these demotion is vital (such demotion could indicate that a block\\n producer is no longer connected to its relays or vice versa)\\n\\nWe also provide better integration with [systemd][socket-activation] (socket\\nactivation improvements) or improvements in the networking stack:\\n\\n* [exit policies][exit-policy],\\n* [peer metrics improvements][peer-metrics],\\n* [DNS TTL][dns-ttl] improvements (which make it harder to misconfigure the\\n system, an issue discovered by the performance & monitoring team),\\n* do not trigger inbound idle timeout for `node-to-client` connections ([pr\\n #3844][idle-timeout]), an issue reported to us by Matthias Benkort from\\n Cardano Foundation.\\n\\nDuncan has been making progress with the input endorsers demo. His simulation\\nprovides a useful animated visualisation and live quantification of behaviour\\nof the modeled design.\\n\\nWe also improved our e2e diffusion simulation by implementing header-body\\nsplit, similar to what the real implementation does.\\n\\nWe also made some advances towards our future goals of P2P release for block\\nproducer nodes ([pr #3800][pr-3800] - in review) & for Daedalus users\\n([pr #3690][pr-3690] - merged).\\n\\n### Detailed log\\n\\n* We expanded diffusion simulation with block-fetch protocol bringing it closer\\n to the production system.\\n\\n* We addressed some additional technical depth in diffusion simulation\\n\\n* We slightly improved documentation & CI of io-sim and typed-protocols\\n repositories for open-source contributors.\\n\\n* We closed a number of issues towards publishing io-sim on Hackage (only two\\n essential issues are left open).\\n\\n* We pushed a branch of typed-protocols which captures one of the developer UX\\n problems in the API which we need to solve.\\n\\n* We identified and fixed an issue related to systemd sockets.\\n\\n* We identified and fixed an issue in consensus initialisation not giving\\n feedback on early errors.\\n\\n* We deployed RT View, identified a number of issues which were communicated to\\n the performance & monitoring team.\\n\\n* We finished high level & detailed design of peer sharing, very early\\n implementation of peer sharing is done (note that peer sharing cannot be\\n safely deployed without eclipse evasion & genesis).\\n\\n* We finished high level design of eclipse evasion, and started working on\\n a detailed design.\\n\\n* We were assigned the role of release engineer for 1.35.5 release (the P2P\\n single relay release); we prepared a cardano-node for 1.35.5 release which\\n contains more than 130 patches of just network stack improvements done over\\n last few months.\\n\\n* We diagnosed and fixed an tricky bug in the peer state actions (a component\\n which sits between outbound governor and connection manager). That bug was\\n introduced earlier this year and never released. It was caught by the QA\\n testing framework. We expanded our diffusion simulation to cover such case and\\n also mitigated a chance for reintroducing such a bug in future.\\n\\n* We identified and quite likely mitigated a misconfiguration in the\\n benchmarking cluster (next benchmarking run will confirm our hypothesis).\\n\\n* We simplified the format of p2p topology file, we got positive feedback from\\n SPOs.\\n\\n* We raised severities of some of the logging messages, which is an important\\n improvement for SPOs, exchanges and other users of the system.\\n\\n* We worked on input endorsers simulation which gives both animated and\\n quantified live feedback on network operation, using a simplified model of\\n a TCP/IP network. \\n\\n## Next quarter\\n\\n* Release the Single Relay P2P Release `1.35.5`.\\n\\n* Carry on with Peer Sharing (review, testing).\\n\\n* Deliver a talk at [Conference on Principles of Distributed Systems 2022][OPODIS2022] in Brussels, Belgium.\\n\\n* Present Detailed Design of Eclipse Evasion and start implementation phase.\\n\\n* Work on P2P Block Producer release.\\n\\n* Carry on with publishing of `io-sim` on `Hackage`.\\n\\n[OPODIS2022]: https://sites.uclouvain.be/OPODIS2022/ \\n[peer-sharing-design]: https://github.com/input-output-hk/ouroboros-network/wiki/Peer-Sharing-Implementation-Plan\\n[peer-sharing-pr]: https://github.com/input-output-hk/ouroboros-network/pull/4019\\n[p2p-release]: https://github.com/input-output-hk/ouroboros-network/pull/4120\\n[exit-policy]: https://github.com/input-output-hk/ouroboros-network/pull/3785\\n[peer-metrics]: https://github.com/input-output-hk/ouroboros-network/pull/3915\\n[socket-activation]: https://github.com/input-output-hk/ouroboros-network/pull/3979\\n[topology-file]: https://github.com/input-output-hk/cardano-node/pull/4563\\n[dns-ttl]: https://github.com/input-output-hk/ouroboros-network/pull/4106\\n[consensus-startup-trace]: https://github.com/input-output-hk/ouroboros-network/pull/4015\\n[demotion-trace]: https://github.com/input-output-hk/ouroboros-network/pull/4127\\n[idle-timeout]: https://github.com/input-output-hk/ouroboros-network/pull/3844\\n[pr-3800]: https://github.com/input-output-hk/ouroboros-network/pull/3800\\n[pr-3690]: https://github.com/input-output-hk/ouroboros-network/issues/3968"},{"id":"2022-11-07-ledger","metadata":{"permalink":"/cardano-updates/quarterly/2022-11-07-ledger","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-07-ledger.md","source":"@site/quarterly/2022-11-07-ledger.md","title":"Ledger Team Update","description":"Ledger Quarterly Update","date":"2022-11-07T00:00:00.000Z","formattedDate":"November 7, 2022","tags":[{"label":"ledger","permalink":"/cardano-updates/quarterly/tags/ledger"}],"readingTime":1.255,"hasTruncateMarker":false,"authors":[{"name":"Jared Corduan","title":"Ledger Team Lead","url":"https://github.com/JaredCorduan","imageURL":"https://github.com/JaredCorduan.png","key":"JaredCorduan"}],"frontMatter":{"title":"Ledger Team Update","slug":"2022-11-07-ledger","authors":"JaredCorduan","tags":["ledger"],"hide_table_of_contents":false},"prevItem":{"title":"Network Team Update","permalink":"/cardano-updates/quarterly/2022-11-09-network"},"nextItem":{"title":"Node API & CLI Team Update","permalink":"/cardano-updates/quarterly/2022-10-07-node-cli-api"}},"content":"## Ledger Quarterly Update\\n## 2022-09 - 2022-11-04\\n\\n* We finished a minimal ledger era capable of master key rotation.\\n This will be re-purposed our upcoming work.\\n* We have the humble beginnings of a proper ledger API.\\n* We improved the problematic cost model serialization\\n (recall the song and dance about updating the cost model one epoch after the hard fork).\\n* We have added benchmarks for problematic areas.\\n* Massive repository restructure and cleanup.\\n * Unified and consistent variable name schemes (not completely finished, but nearly there).\\n * Massive reduction in type constraints, which causes a lot of developer friction,\\n in our code and also downstream.\\n * More organized module structures.\\n * Improved generators for our property tests.\\n * We removed our dependency on cardano-prelude.\\n* The formal ledger model has come a long way.\\n * We created a fork of Agda that provides some meta-programming support for the ledger rules.\\n * We have a large amount of the basic UTxO support in the model.\\n * We can generate a good looking PDF from the model.\\n * We can produce Haskell from the model.\\n * We have a nice finite set theory library that we can use for many of the ledger rules.\\n * We have nix support for the model.\\n\\n## Next steps\\n\\n * Individual tracking of deposits. [[issue-3113]]\\n * Versioned CBOR encoders/decoders. [[issue-3014]]\\n * New ledger era transaction body (and the surround work associated with it).\\n * Designs for the next ledger era.\\n\\n[issue-3113]: https://github.com/input-output-hk/cardano-ledger/issues/3113\\n[issue-3014]: https://github.com/input-output-hk/cardano-ledger/issues/3014"},{"id":"2022-10-07-node-cli-api","metadata":{"permalink":"/cardano-updates/quarterly/2022-10-07-node-cli-api","editUrl":"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-07-nod-api-cli.md","source":"@site/quarterly/2022-11-07-nod-api-cli.md","title":"Node API & CLI Team Update","description":"Node-Api-Cli Quarterly Update","date":"2022-11-07T00:00:00.000Z","formattedDate":"November 7, 2022","tags":[{"label":"cli-api-quarterly","permalink":"/cardano-updates/quarterly/tags/cli-api-quarterly"}],"readingTime":1.355,"hasTruncateMarker":false,"authors":[{"name":"Jordan Millar","title":"Node Team Lead","url":"https://github.com/Jimbo4350","imageURL":"https://github.com/Jimbo4350.png","key":"Jimbo4350"}],"frontMatter":{"title":"Node API & CLI Team Update","slug":"2022-10-07-node-cli-api","authors":"Jimbo4350","tags":["cli-api-quarterly"],"hide_table_of_contents":false},"prevItem":{"title":"Ledger Team Update","permalink":"/cardano-updates/quarterly/2022-11-07-ledger"}},"content":"## Node-Api-Cli Quarterly Update\\n## 2022-09 - 2022-11-04\\n\\n- Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0\\n- Major clean up of stale iusses + PRs.\\n- Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs\\n- cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node.\\n- cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation.\\n- General documentation updates and improvements\\n- Addition of tx-mempool command which allows users to:\\n - Query the node about the current mempool\'s capacity and sizes\\n - Request the next transaction from the mempool\'s current list\\n - Query if a particular transaction exists in the mempool\\n- Initial refactoring of cardano-testnet\\n\\nNext quarter\\n\\n- cardano-api\\n - Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately.\\n- cardano-testnet\\n - Working with Marc Fontaine to create an easy to use executable to deploy testnets locally - https://github.com/input-output-hk/cardano-node/issues/4598\\n- Serenity\\n - Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above.\\n- General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new."}]}')}}]); \ No newline at end of file diff --git a/assets/js/acd2edbe.7d8cc863.js b/assets/js/acd2edbe.7d8cc863.js new file mode 100644 index 00000000000..a1e8de4e240 --- /dev/null +++ b/assets/js/acd2edbe.7d8cc863.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39113],{52701:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/3","page":3,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/2","nextPage":"/cardano-updates/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ace79a55.6028e600.js b/assets/js/ace79a55.6028e600.js new file mode 100644 index 00000000000..fc08b91bf61 --- /dev/null +++ b/assets/js/ace79a55.6028e600.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[61185],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(a),m=n,c=u["".concat(p,".").concat(m)]||u[m]||d[m]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},40709:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-06-30-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-30-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-30-hydra.md",source:"@site/blog/2023-06-30-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-30T00:00:00.000Z",formattedDate:"June 30, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.925,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-30-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-04-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-29-mithril"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:s},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team wrote and published the monthly report for June,\nimplemented the end-to-end functionality for external commits, and tested it on\nthe preview environment. They also listed Hydra as a tool on the Cardano\ndeveloper portal, providing more visibility for the project. The team clarified\nthe path forward for L2 protocol improvements and explored an alternative CI\napproach using cabal instead of nix. Additionally, they released version 0.11.0,\nmarking another milestone in the project","\u2019","s development."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Written and published the monthly report for ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-06"},"June")),(0,n.kt)("li",{parentName:"ul"},"Implemented external commits end-to-end incl. tested it on preview ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215")),(0,n.kt)("li",{parentName:"ul"},"Listed Hydra as a tool on cardano ",(0,n.kt)("a",{parentName:"li",href:"https://developers.cardano.org/tools/"},"developer portal")),(0,n.kt)("li",{parentName:"ul"},"Cleared up path forward on L2 protocol improvements ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Established an alternative CI using more cabal tools ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/923"},"#923")),(0,n.kt)("li",{parentName:"ul"},"Release version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.10.0"},"0.11.0"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Spike on performance improvements of event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/913"},"#913")),(0,n.kt)("li",{parentName:"ul"},"Complete ReqSn only sends transaction ids ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Groom and plan last items for 0.12.0 (remove internal commit)"),(0,n.kt)("li",{parentName:"ul"},"Improve reliability of benchmarks")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/add555bf.8ea1e3df.js b/assets/js/add555bf.8ea1e3df.js new file mode 100644 index 00000000000..7a8f9331f9c --- /dev/null +++ b/assets/js/add555bf.8ea1e3df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23360],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(a),h=n,m=c["".concat(u,".").concat(h)]||c[h]||s[h]||o;return a?r.createElement(m,l(l({ref:t},d),{},{components:a})):r.createElement(m,l({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=h;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:n,l[1]=i;for(var p=2;p<o;p++)l[p]=a[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},7584:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Ledger Team Update",slug:"2022-11-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-11-02-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-ledger.md",source:"@site/blog/2022-11-02-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.275,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-02-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-02-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-02-node-cli-api"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Axiomatic Set Theory",id:"axiomatic-set-theory",level:3},{value:"Completed Technical Debt",id:"completed-technical-debt",level:3}],d={toc:p},c="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We have made the decision to use the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger repository"),"\nin place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure\nto the model. In particular, we now have a lot of support for axiomatic set theory.\nWhile the next ledger era is still in the design phase, most of the team remains working\non technical debt.\nIn particular, we have moved a lot more code out of the Shelley specific modules and into\na ledger core module, we have finished up our benchmarking around the problematic ",(0,n.kt)("inlineCode",{parentName:"p"},"TICKF"),"\nledger transition (while improving the performance), made conveniences to the development\nenvironment, cleaned up all the recent changes to the cost model, added a lot of documentation,\nfixed some flaky tests, and deleted some dead code."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"axiomatic-set-theory"},"Axiomatic Set Theory"),(0,n.kt)("p",null,"The formal ledger model now has support for much of the set theory that we make use of in\nthe formal ledger specifications. See [",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/20"},"pull-20"),"]."),(0,n.kt)("h3",{id:"completed-technical-debt"},"Completed Technical Debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We have addressed issues with two of our most problematic and flaky tests.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3039"},"pull-3039"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3093"},"pull-3093"),"]."),(0,n.kt)("li",{parentName:"ul"},"We have added more documentation and tests to the Twiddler module. This is a module which\nmakes our CBOR serialization round-trip tests much more robust, and will also hopefully\nhelp enforce the mandate for downstream libraries to never re-serialize data that needs\nto be hashed. See [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3073"},"pull-3073"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3095"},"pull-3095"),"]\n(we cannot merge 3095 just yet, due to a preference for merging other features)."),(0,n.kt)("li",{parentName:"ul"},"We have finished our long analysis of the problematic ",(0,n.kt)("inlineCode",{parentName:"li"},"TICKF")," transition.\nWe now have a lot of benchmarks surrounding this code, and have added performance improvements.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3068"},"pull-3068"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3035"},"issue-3035"),"]."),(0,n.kt)("li",{parentName:"ul"},"We have restored support for\n",(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/ghcid"},"ghcid"),"\nin our repository. This is a tool for developing with Haskell that many of us find greatly\nimproves our productivity by providing us with constant feedback from the type checker.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3112"},"pull-3112"),"]."),(0,n.kt)("li",{parentName:"ul"},"After much activity on the cost model, we have done some final clean up of the code.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3075"},"pull-3075"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3101"},"pull-3101"),"]."),(0,n.kt)("li",{parentName:"ul"},"We moved a lot of the existing user facing documentation regarding native tokens into the\nledger repository, and cleaned it up\n(most of the heavy lifting was done by our amazing technical writers).\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3091"},"pull-3091"),"]."),(0,n.kt)("li",{parentName:"ul"},"We removed dead code. See [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3089"},"pull-3089"),"]."),(0,n.kt)("li",{parentName:"ul"},"We moved a lot of code from the Shelley specific libraries to the ledger core library.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3109"},"pull-3109"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3110"},"pull-3110"),"]."),(0,n.kt)("li",{parentName:"ul"},"We've removed more of the awkward legacy template Haskell names.\nSee [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3108"},"pull-3108"),"].")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ae2d2424.be7ef5ae.js b/assets/js/ae2d2424.be7ef5ae.js new file mode 100644 index 00000000000..9d91b590286 --- /dev/null +++ b/assets/js/ae2d2424.be7ef5ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17873],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),h=n,m=u["".concat(s,".").concat(h)]||u[h]||c[h]||o;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},59274:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-10-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-14-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-14-hydra.md",source:"@site/blog/2022-10-14-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-10-14T00:00:00.000Z",formattedDate:"October 14, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.26,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-10-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-18-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-10-14-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node"),' over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks "past the opening of a Head". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Last week we thought we were done with ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/adr/18/"},"ADR18"),", but were not ..."),(0,n.kt)("li",{parentName:"ul"},"... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence."),(0,n.kt)("li",{parentName:"ul"},"Implemented a first version for persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/187"},"#187")," in response."),(0,n.kt)("li",{parentName:"ul"},"Enhanced CI to publish test results ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/benchmarks/tests/hydra-node/hspec-results"},"on our website")),(0,n.kt)("li",{parentName:"ul"},"Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!"),(0,n.kt)("li",{parentName:"ul"},"Pulled static executable feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/200"},"#200")," into scope, implemented it and merged it!"),(0,n.kt)("li",{parentName:"ul"},"Received and read through a project proposal by a vendor (building a Hydra platform).")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Get backup/recovery ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/187"},"#187")," done with proper event sourcing (ADR18)"),(0,n.kt)("li",{parentName:"ul"},"Cut the next release, version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.8.0")),(0,n.kt)("li",{parentName:"ul"},"Address open comments on specification document & complete the list of identified gaps between specification and implementation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Have the CI build macos artifacts")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ae455379.e0af4636.js b/assets/js/ae455379.e0af4636.js new file mode 100644 index 00000000000..e04c7b73614 --- /dev/null +++ b/assets/js/ae455379.e0af4636.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[38672],{17033:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/tags/consensus","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/ae521593.22fed2a0.js b/assets/js/ae521593.22fed2a0.js new file mode 100644 index 00000000000..b4e26e3b13a --- /dev/null +++ b/assets/js/ae521593.22fed2a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[81947],{59230:a=>{a.exports=JSON.parse('{"label":"crypto","permalink":"/cardano-updates/tags/crypto","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/ae7f7c70.147dae80.js b/assets/js/ae7f7c70.147dae80.js new file mode 100644 index 00000000000..442a41995ef --- /dev/null +++ b/assets/js/ae7f7c70.147dae80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56789],{97303:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/crypto/page/4","page":4,"postsPerPage":5,"totalPages":4,"totalCount":18,"previousPage":"/cardano-updates/tags/crypto/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/afa83c07.67905eb7.js b/assets/js/afa83c07.67905eb7.js new file mode 100644 index 00000000000..be2b8137d8f --- /dev/null +++ b/assets/js/afa83c07.67905eb7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68115],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=o.createContext({}),u=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return o.createElement(p.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(n),m=r,h=s["".concat(p,".").concat(m)]||s[m]||d[m]||a;return n?o.createElement(h,l(l({ref:t},c),{},{components:n})):o.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<a;u++)l[u]=n[u];return o.createElement.apply(null,l)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},27614:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-07-31-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-31-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-31-network.md",source:"@site/blog/2023-07-31-network.md",title:"Network Team Update",description:"Network Update (Sprints 39 & 40)",date:"2023-07-31T00:00:00.000Z",formattedDate:"July 31, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.18,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-07-31-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-01-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-28-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"Network Update (Sprints 39 & 40)",id:"network-update-sprints-39--40",level:2},{value:"Sprint 39 (Jun 26 - Jul 09)",id:"sprint-39-jun-26---jul-09",level:3},{value:"Major changes",id:"major-changes",level:4},{value:"<code>node-to-client</code> protocol",id:"node-to-client-protocol",level:5},{value:"<code>node-to-node</code> protocol",id:"node-to-node-protocol",level:5},{value:"Minor changes",id:"minor-changes",level:4},{value:"Sprint 40 (Jul 09 - Jul 23)",id:"sprint-40-jul-09---jul-23",level:3},{value:"Major changes",id:"major-changes-1",level:4}],c={toc:u},s="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(s,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"network-update-sprints-39--40"},"Network Update (Sprints 39 & 40)"),(0,r.kt)("p",null,"The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away.\nIt was great to see and talk to so many of the community members."),(0,r.kt)("h3",{id:"sprint-39-jun-26---jul-09"},"Sprint 39 (Jun 26 - Jul 09)"),(0,r.kt)("h4",{id:"major-changes"},"Major changes"),(0,r.kt)("p",null,"Now the following ",(0,r.kt)("strong",{parentName:"p"},"list of traces will be turned on by default"),":"),(0,r.kt)("h5",{id:"node-to-client-protocol"},(0,r.kt)("inlineCode",{parentName:"h5"},"node-to-client")," protocol"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalConnectionManagerTracer")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalInboundGovernor")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalHandshake")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalServer"))),(0,r.kt)("h5",{id:"node-to-node-protocol"},(0,r.kt)("inlineCode",{parentName:"h5"},"node-to-node")," protocol"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"Server"))),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5353"},"cardano-node#5353"),". This will be released in ",(0,r.kt)("inlineCode",{parentName:"p"},"node-8.2.0"),"."),(0,r.kt)("p",null,"We made sure that ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-client-0.1.0.x")," library (which is ",(0,r.kt)("inlineCode",{parentName:"p"},"db-sync"),") is not using the experimental ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol.\nThe ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-client-0.2.0.0")," was not affected.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4612"},"ouroboros-network#4612"),"."),(0,r.kt)("p",null,"We merged the ",(0,r.kt)("strong",{parentName:"p"},"dynamic block production feature")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," (also available in the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-8.2.0")," release).\nDynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"ouroboros-network#3159"),", ","[ouroboros-consensu#140]","."),(0,r.kt)("p",null,"We continued to review the implementation of big ledger peers for eclipse evasion, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"ouroboros-network#4462"),"."),(0,r.kt)("h4",{id:"minor-changes"},"Minor changes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We refactored the top level ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node")," error handler: ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5356"},"cardano-node#5356"))),(0,r.kt)("h3",{id:"sprint-40-jul-09---jul-23"},"Sprint 40 (Jul 09 - Jul 23)"),(0,r.kt)("h4",{id:"major-changes-1"},"Major changes"),(0,r.kt)("p",null,"We integrated ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.8.2.0")," with the ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," for the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.0")," release (the version match between ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," is purely accidental).\nThis includes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"integration with ",(0,r.kt)("strong",{parentName:"li"},"dynamic block production")," feature.\nThis feature is documented in the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5399"},"following PR"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Warm valency")," for local root peers (see below).")),(0,r.kt)("p",null,"For the full list of features included in the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.0")," release from the network side, please take a look at the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.2.0-pre"},"pre-release nodes"),"."),(0,r.kt)("p",null,"We ",(0,r.kt)("strong",{parentName:"p"},"improved the memory footprint")," of peer metrics measured by the P2P stack.\nPeer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation).\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4620"},"ouroboros-network#4620"),".\nThe improvement will be available in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-8.2.0"),"."),(0,r.kt)("p",null,"We added an ",(0,r.kt)("strong",{parentName:"p"},"optional explicit warm valency")," to local root peers of the ",(0,r.kt)("strong",{parentName:"p"},"P2P topology file"),".\nPreviously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to.\nThe hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones.\nWarm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4575"},"ouroboros-network#4575"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"cardano-node#5409"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b020ac17.f01a9412.js b/assets/js/b020ac17.f01a9412.js new file mode 100644 index 00000000000..f23aa7d0070 --- /dev/null +++ b/assets/js/b020ac17.f01a9412.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33538],{88564:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/22","page":22,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/21","nextPage":"/cardano-updates/page/23","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b032e7ab.b1a9961b.js b/assets/js/b032e7ab.b1a9961b.js new file mode 100644 index 00000000000..f6acf2b7333 --- /dev/null +++ b/assets/js/b032e7ab.b1a9961b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[292],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>d});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){r(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,a,r=function(e,t){if(null==e)return{};var i,a,r={},n=Object.keys(e);for(a=0;a<n.length;a++)i=n[a],t.indexOf(i)>=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)i=n[a],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),u=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(i),c=r,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||n;return i?a.createElement(d,o(o({ref:t},s),{},{components:i})):a.createElement(d,o({ref:t},s))}));function d(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,i)}c.displayName="MDXCreateElement"},32167:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-07-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-07-27-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-27-mithril.md",source:"@site/blog/2023-07-27-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-07-27T00:00:00.000Z",formattedDate:"July 27, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.715,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-07-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-28-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-26-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team launched ",(0,r.kt)("strong",{parentName:"p"},"Mithril protocol\u2019s mainnet beta"),": the ",(0,r.kt)("inlineCode",{parentName:"p"},"release-mainnet")," network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch. "),(0,r.kt)("p",null,"They have released a new distribution ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2329.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2329.0")),", which is running on the ",(0,r.kt)("inlineCode",{parentName:"p"},"release-mainnet")," network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator."),(0,r.kt)("p",null,"Finally, they have worked on enhancing the documentation for ",(0,r.kt)("a",{parentName:"p",href:"https://mithril.network/doc/manual/getting-started/SPO-on-boarding-guide"},"onboarding SPOs")," and setting up a ",(0,r.kt)("a",{parentName:"p",href:"https://mithril.network/doc/manual/getting-started/run-signer-node"},"Mithril signer"),", and fixing installation bugs of the binary artifacts produced in the CI."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Created the dev blog post ",(0,r.kt)("a",{parentName:"li",href:"https://mithril.network/doc/dev-blog/2023/07/21/mainnet-beta-launch"},"Mithril Protocol\u2019s Mainnet Beta Launch")),(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2329.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2329.0"))),(0,r.kt)("li",{parentName:"ul"},"Closed the epic that prepares the Mithril infrastructure for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Deploy 'mainnet' infrastructure")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/988"},"#988")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Handle Secrets management")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/989"},"#989")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,r.kt)("inlineCode",{parentName:"li"},"Release 'mainnet' Mithril network")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/918"},"#918"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Prepare SPO on-boarding guide")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1049"},"#1049")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,r.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,r.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance the configuration of Mithril relay")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1080"},"#1080")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Remove legacy store adapters from aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1053"},"#1053")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add a 'sign' sub-command to 'genesis' command in aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1081"},"#1081")))),(0,r.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Refactor (de)serialization of crypto entities")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/668"},"#668")))),(0,r.kt)("li",{parentName:"ul"},"Worked on documentation:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Enhance 'Run a Mithril Signer node (SPO)' guide")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1055"},"#1055")))),(0,r.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Shared library error in CI binaries")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1073"},"#1073")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Debian package does not install cleanly on older ubuntu versions")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/834"},"#834")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Aggregator panics with new (de)serialization of 'ProtocolVerificationKey'")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1083"},"#1083"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b03d4a4e.5d00abc3.js b/assets/js/b03d4a4e.5d00abc3.js new file mode 100644 index 00000000000..23cacc56563 --- /dev/null +++ b/assets/js/b03d4a4e.5d00abc3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[52834],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=u(r),h=a,m=d["".concat(s,".").concat(h)]||d[h]||c[h]||o;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var u=2;u<o;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},44301:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-11-11-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-11-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-ledger.md",source:"@site/blog/2022-11-11-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.41,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-11-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-11-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-11-network"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:u},d="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"I am extremely excited to say that we now have a pull request up which introduces our new versioned\nCBOR serialization. This was an enormous effort, but it will solve a host of problems that we have\nhad since the Shelley phase. It will take time to properly review it, and we will\nneed to put in a lot of effort to integrate it with the downstream components, but this is a huge\nmilestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction\nserialization schemes."),(0,a.kt)("p",null,"We also have a draft pull request that reworks how deposits are tracked. Users of the system will\nnot notice any difference, but it is a necessary change needed to prepare the way for\ndecentralizing the governance of Cardano."),(0,a.kt)("p",null,"Finally, we continued to address technical debt. In particular, we continued to make progress on\nbringing coherency and consistency to the code base with a common naming convention, and\nimproving some error messages."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We have a pull request up for our new versioned CBOR serialization.\nWhen we encounter a problem with our deserializers, it can be very difficult to implement a fix.\nIt is difficult because we can only fix such issues during a hard fork, and leading up to the\nhard fork we must maintain two serializations for the same type in order to not cause unintended\nnetwork splitting (the problematic version must be used before the hard fork,\nand the fixed version is used afterwards).\nThis can be especially tricky with the ",(0,a.kt)("inlineCode",{parentName:"li"},"FromCBOR")," typeclass, since it is not always easy to\nsearch for where all the problematic uses are located.\nThe new versioned CBOR serialization allows us to gracefully handle this transition.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3138"},"pull-3138"),"]."),(0,a.kt)("li",{parentName:"ul"},"We proposed a CIP for backwards compatibility of the transaction serialization schemes.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/372"},"pull-372"),"]."),(0,a.kt)("li",{parentName:"ul"},"We have draft for the new deposit tracking.\nThis draft is not as memory efficient as the final version will be,\nbut it is a sufficient proof of concept that we can write property tests against, ensuring\nthat we have not changed the semantics.\nWe will optimize after we are sure of the correctness.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3127"},"pull-3127"),"]."),(0,a.kt)("li",{parentName:"ul"},"We now provide better support for debugging failed Plutus scripts in an important helper\nfunction, named ",(0,a.kt)("inlineCode",{parentName:"li"},"evaluateTransactionExecutionUnits"),".\nIn particular, it now returns all the information needed to rerun the script with exactly the\nsame arguments. This feature will end up appearing in the CLI and other tools from the Plutus\ntools team.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3135"},"pull-3135"),"]."),(0,a.kt)("li",{parentName:"ul"},"We did a lot more renaming to bring coherency and consistency to the code base.\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3126"},"pull-3126"),"], [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3120"},"pull-3120"),"], [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3118"},"pull-3118"),"], and [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3116"},"pull-3116"),"]."),(0,a.kt)("li",{parentName:"ul"},"We have added a few things to the ledger repository to make it conform to the\n",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},"Cardano Engineering Handbook"),"\nSee [",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3139"},"pull-3139"),"].")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b073a55d.87d95835.js b/assets/js/b073a55d.87d95835.js new file mode 100644 index 00000000000..bfdbb152c6d --- /dev/null +++ b/assets/js/b073a55d.87d95835.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20955],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>h});var a=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,r=function(e,n){if(null==e)return{};var t,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=c(t),d=r,h=u["".concat(s,".").concat(d)]||u[d]||p[d]||i;return t?a.createElement(h,o(o({ref:n},m),{},{components:t})):a.createElement(h,o({ref:n},m))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:r,o[1]=l;for(var c=2;c<i;c++)o[c]=t[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,t)}d.displayName="MDXCreateElement"},7729:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=t(87462),r=(t(67294),t(3905));const i={title:"Performance & Tracing Q3 2023 Update",slug:"2023-Q3-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/quarterly/2023-Q3-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q3-performance-and-tracing.md",source:"@site/quarterly/2023-Q3-performance-and-tracing.md",title:"Performance & Tracing Q3 2023 Update",description:"2023-07 - 2023-09",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/quarterly/tags/performance-tracing"}],readingTime:3.27,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & Tracing Q3 2023 Update",slug:"2023-Q3-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"SRE Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-sre"},nextItem:{title:"SRE Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-sre"}},s={authorsImageUrls:[void 0]},c=[{value:"2023-07 - 2023-09",id:"2023-07---2023-09",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Release benchmarking",id:"release-benchmarking",level:4},{value:"UTxO-HD benchmarks",id:"utxo-hd-benchmarks",level:4},{value:"P2P benchmarks",id:"p2p-benchmarks",level:4},{value:"New nomad cluster",id:"new-nomad-cluster",level:4},{value:"New tracing system",id:"new-tracing-system",level:4},{value:"GHC9 performance",id:"ghc9-performance",level:4},{value:"Consensus QTAs",id:"consensus-qtas",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"Benchmarking:",id:"benchmarking",level:4},{value:"Performance",id:"performance",level:4},{value:"New tracing system",id:"new-tracing-system-1",level:4},{value:"UTxO-HD monitoring",id:"utxo-hd-monitoring",level:4},{value:"Nomad backend",id:"nomad-backend",level:4},{value:"Workbench",id:"workbench",level:4},{value:"Consensus component QTAs (co-development)",id:"consensus-component-qtas-co-development",level:4}],m={toc:c},u="wrapper";function p(e){let{components:n,...t}=e;return(0,r.kt)(u,(0,a.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-07---2023-09"},"2023-07 - 2023-09"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Release benchmarking"),(0,r.kt)("li",{parentName:"ul"},"Developing and running UTxO-HD benchmarks - in-memory flavour"),(0,r.kt)("li",{parentName:"ul"},"P2P benchmarks, facilitating rollout"),(0,r.kt)("li",{parentName:"ul"},"Production-readiness of the new Nomad cluster has been reached"),(0,r.kt)("li",{parentName:"ul"},"Optimization of and introspection capability for the new tracing system"),(0,r.kt)("li",{parentName:"ul"},"GHC9 performance investigation (and possible remedy)"),(0,r.kt)("li",{parentName:"ul"},"Conensus QTAs: first real-world application of prototype")),(0,r.kt)("h4",{id:"release-benchmarking"},"Release benchmarking"),(0,r.kt)("p",null,"Ongoing release benchmarking is a crucial safeguard to ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),"'s release cycle from a performance perspective. We've performed and analyzed benchmarks for node versions ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.x")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"8.5")," throughout Q3."),(0,r.kt)("h4",{id:"utxo-hd-benchmarks"},"UTxO-HD benchmarks"),(0,r.kt)("p",null,"Targeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery."),(0,r.kt)("h4",{id:"p2p-benchmarks"},"P2P benchmarks"),(0,r.kt)("p",null,"In Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature."),(0,r.kt)("h4",{id:"new-nomad-cluster"},"New nomad cluster"),(0,r.kt)("p",null,"The new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received\nvarious rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest\nof our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it\nready for production use."),(0,r.kt)("h4",{id:"new-tracing-system"},"New tracing system"),(0,r.kt)("p",null,"Our new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that\nit is roughly on par with the legacy system while offering a richer feature set and greater flexibility. "),(0,r.kt)("p",null,"Additionally, in Q3 we equipped the system with an introspection capability. This is now used for generating\nend user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system."),(0,r.kt)("h4",{id:"ghc9-performance"},"GHC9 performance"),(0,r.kt)("p",null,"In Q3, a joint investigation with DevX into GHC9's behaviour revealed where and how GHC9 misses opportunities for\noptimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable\nthose optimizations - which is still being validated."),(0,r.kt)("h4",{id:"consensus-qtas"},"Consensus QTAs"),(0,r.kt)("p",null,"In collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations'\nperformance characteristics. It's now applicable, and being applied, to a real-world task - namely\ngathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds."),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"benchmarking"},"Benchmarking:"),(0,r.kt)("p",null,"In Q4, the focus will be on:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"facilitating the next mainnet release"),(0,r.kt)("li",{parentName:"ul"},"benchmarking runs in the Conway era"),(0,r.kt)("li",{parentName:"ul"},"developing benchmarks / workloads for Conway-exclusive actions"),(0,r.kt)("li",{parentName:"ul"},"implementing a specialized benchmark setup for the UTxO-HD on-disk variant"),(0,r.kt)("li",{parentName:"ul"},"developing new Plutus benchmarks to safeguard Plutus V3"),(0,r.kt)("li",{parentName:"ul"},"benchmarks regarding the rollout of P2P")),(0,r.kt)("h4",{id:"performance"},"Performance"),(0,r.kt)("p",null,"For certain blocking performance issues we've located the cause, or even found a solution in a cross-team effort. In Q4 we'll advance that work to ensure the ongoing\nrelease cycle for mainnet, as well as make GHC9 become a viable release platform."),(0,r.kt)("h4",{id:"new-tracing-system-1"},"New tracing system"),(0,r.kt)("p",null,"For the new tracing system, we'll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support."),(0,r.kt)("h4",{id:"utxo-hd-monitoring"},"UTxO-HD monitoring"),(0,r.kt)("p",null,"We'll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way."),(0,r.kt)("h4",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"From Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad."),(0,r.kt)("h4",{id:"workbench"},"Workbench"),(0,r.kt)("p",null,"We will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),"."),(0,r.kt)("h4",{id:"consensus-component-qtas-co-development"},"Consensus component QTAs (co-development)"),(0,r.kt)("p",null,"In Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b073edd1.1e4774ca.js b/assets/js/b073edd1.1e4774ca.js new file mode 100644 index 00000000000..3b121911645 --- /dev/null +++ b/assets/js/b073edd1.1e4774ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70613],{85795:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/mithril/page/7","page":7,"postsPerPage":5,"totalPages":7,"totalCount":34,"previousPage":"/cardano-updates/tags/mithril/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b13803f3.f0a1384b.js b/assets/js/b13803f3.f0a1384b.js new file mode 100644 index 00000000000..e0c67d6804a --- /dev/null +++ b/assets/js/b13803f3.f0a1384b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96558],{47768:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/7","page":7,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/6","nextPage":"/cardano-updates/tags/hydra/page/8","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b242687d.9e8010a3.js b/assets/js/b242687d.9e8010a3.js new file mode 100644 index 00000000000..a51bd0457a3 --- /dev/null +++ b/assets/js/b242687d.9e8010a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22191],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var i=r.createContext({}),u=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return r.createElement(i.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,h=d["".concat(i,".").concat(m)]||d[m]||s[m]||o;return a?r.createElement(h,l(l({ref:t},c),{},{components:a})):r.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[d]="string"==typeof e?e:n,l[1]=p;for(var u=2;u<o;u++)l[u]=a[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},95807:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-09-29-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,p={permalink:"/cardano-updates/2023-09-29-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-sre.md",source:"@site/blog/2023-09-29-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.68,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-09-29-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-29-ledger"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-27-mithril"}},i={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Cardano-world",id:"cardano-world",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.4.0-pre"},"8.4.0-pre"),"."),(0,n.kt)("li",{parentName:"ul"},"The use of cardano-node ",(0,n.kt)("a",{parentName:"li",href:"https://hub.docker.com/r/inputoutput/cardano-node"},"docker hub")," will be deprecated in preference of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pkgs/container/cardano-node"},"GHCR"))),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Refactor parsing scripts, add github action automation, various bugfixes and cleanup: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/c2c7680...a274b72"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/14"},"cardano-parts-pull-8"))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/2"},"cardano-playground"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update sanchonet network to cardano-node 8.4.0: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/compare/8cb559a...3edafb9"},"cardano-world-compare")),(0,n.kt)("li",{parentName:"ul"},"Rotate KES on shelley-qa: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/commit/8301b044ad106ff8ca71dcbbdb5b17fe9ec6fc6d"},"cardano-world-commit"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b28a1077.d4571d53.js b/assets/js/b28a1077.d4571d53.js new file mode 100644 index 00000000000..026ab8c3293 --- /dev/null +++ b/assets/js/b28a1077.d4571d53.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7413],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(n),p=a,h=d["".concat(s,".").concat(p)]||d[p]||m[p]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},49384:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-05-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-05-17-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-performance-and-tracing.md",source:"@site/blog/2023-05-17-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-05-17T00:00:00.000Z",formattedDate:"May 17, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:3.21,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-05-17-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-17-mithril"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-05-12-crypto"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Analysis",id:"analysis",level:3},{value:"Open Sourcing",id:"open-sourcing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"Performance & Tracing Meetup",id:"performance--tracing-meetup",level:3},{value:"Offboarding",id:"offboarding",level:3}],u={toc:c},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes."),(0,a.kt)("li",{parentName:"ul"},"New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: First steps on implementing incremental analysis have been untertaken."),(0,a.kt)("li",{parentName:"ul"},"Open Sourcing: Exhaustive dataflow charts for both our analysis tool ",(0,a.kt)("inlineCode",{parentName:"li"},"locli")," and our ",(0,a.kt)("inlineCode",{parentName:"li"},"workbanch")," have been merged to ",(0,a.kt)("inlineCode",{parentName:"li"},"master")),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster."),(0,a.kt)("li",{parentName:"ul"},"P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland."),(0,a.kt)("li",{parentName:"ul"},"Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"As a compiler switch to GHC 9.2.7 for ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),"'s default build environment is around the corner, we're setting up our benchmarking cluster to\nhandle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This\nalso involves choosing a reliable baseline as reference point for inter-version comparisons. "),(0,a.kt)("p",null,"Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet,\nwe strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to\nbe balanced against resource demand for all our cluster's nodes."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some\nquality-of-life details that have changed required us to revision the system documentation."),(0,a.kt)("h3",{id:"analysis"},"Analysis"),(0,a.kt)("p",null,"As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been\nnormally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a\nhuge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken. "),(0,a.kt)("h3",{id:"open-sourcing"},"Open Sourcing"),(0,a.kt)("p",null,"A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking\ncopmonents more accessible. As a result, detailed charts for both our LogObject CLI ",(0,a.kt)("inlineCode",{parentName:"p"},"locli")," and our ",(0,a.kt)("inlineCode",{parentName:"p"},"workbench")," have been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". "),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting\nthose profiles of our ",(0,a.kt)("inlineCode",{parentName:"p"},"workbench")," that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality\nof the nomad cloud backend. "),(0,a.kt)("p",null,"Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster."),(0,a.kt)("h3",{id:"performance--tracing-meetup"},"Performance & Tracing Meetup"),(0,a.kt)("p",null,"We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive\ndays together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future.\nAlso, it was a great opportunity to finally meet in person."),(0,a.kt)("h3",{id:"offboarding"},"Offboarding"),(0,a.kt)("p",null,"Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation\nof team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b3041b60.04095479.js b/assets/js/b3041b60.04095479.js new file mode 100644 index 00000000000..4b6e8b17e3b --- /dev/null +++ b/assets/js/b3041b60.04095479.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35889],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),c=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=c(a),m=n,g=s["".concat(u,".").concat(m)]||s[m]||d[m]||l;return a?r.createElement(g,o(o({ref:t},p),{},{components:a})):r.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var c=2;c<l;c++)o[c]=a[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},2592:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-05-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-05-05-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-05-ledger.md",source:"@site/blog/2023-05-05-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-05-05T00:00:00.000Z",formattedDate:"May 5, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.235,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-05-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-12-network"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-05-node-cli-api"}},u={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway certificates",id:"conway-certificates",level:2},{value:"Constraint based testing",id:"constraint-based-testing",level:2},{value:"Integration work",id:"integration-work",level:2},{value:"Technical debt",id:"technical-debt",level:2}],p={toc:c},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The ledger team focused mainly on the conway ledger era and node integration.\nFor conway, we completed a large structural change that now allows\nfor delegation certificates to be parameterized by era, and introducing\nnew certificates for the first time since Shelley.\nWe also continue to build out our contraint based generators that we will\nuse to property test the conway era.\nIn particular, we can now generate an entire ledger state and a\ntransaction which is balanced with respect to the ledger state."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h2",{id:"conway-certificates"},"Conway certificates"),(0,n.kt)("p",null,"Certificiates are now abstracted as a type family in the ledger codebase.\nMoreover, there are new certificates in the Conway era to support CIP-1694,\nand MIR certificates have been removed."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3387"},"pull-3387"))),(0,n.kt)("h2",{id:"constraint-based-testing"},"Constraint based testing"),(0,n.kt)("p",null,"Our plan for property testing in the conway era is to no longer use the trace generators,\nbut instead generate ledger states and transactions based on constraints.\nWe hit a milestone this week, namely the ability to generate a balanced transaction in the context\nof a ledger state, all based on our ever growing constaint language."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3374"},"pull-3374")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3386"},"pull-3386"))),(0,n.kt)("h2",{id:"integration-work"},"Integration work"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3393"},"pull-3393")," - Performance improvements"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3395"},"pull-3395")," - Conway instances"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3398"},"pull-3398")," - Fix mint translation in the script context")),(0,n.kt)("h2",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3389"},"pull-3389")," - Reduce github pages size"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3390"},"pull-3390")," - Reinstate the tickf optimizations")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b3043f02.38a94c82.js b/assets/js/b3043f02.38a94c82.js new file mode 100644 index 00000000000..21433d403df --- /dev/null +++ b/assets/js/b3043f02.38a94c82.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27478],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),d=a,m=p["".concat(l,".").concat(d)]||p[d]||h[d]||o;return n?r.createElement(m,s(s({ref:t},c),{},{components:n})):r.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var u=2;u<o;u++)s[u]=n[u];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},59290:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-10-04-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-10-04-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-04-consensus.md",source:"@site/blog/2023-10-04-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-10-04T00:00:00.000Z",formattedDate:"October 4, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.135,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-10-04-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-10-06-performance-and-tracing"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-04-mithril"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:3},{value:"Support",id:"support",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],c={toc:u},p="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the ",(0,a.kt)("em",{parentName:"p"},"in-memory")," backend."),(0,a.kt)("p",null,"On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain.\nWe also merged a fix for the Babbage to Conway transition, and released a new version of Consensus."),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/392"},"392"),").")),(0,a.kt)("h3",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/366"},"366"),")."),(0,a.kt)("li",{parentName:"ul"},"We enabled richer tracers in ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node")," that can be useful in future debugging (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/384"},"384"),")."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/amesgen"},"Esgen")," continues with his release engineer activities, and created a new Consensus release.")),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/369"},"369"),").")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b41783a8.f909dc33.js b/assets/js/b41783a8.f909dc33.js new file mode 100644 index 00000000000..7b6e5aec159 --- /dev/null +++ b/assets/js/b41783a8.f909dc33.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89104],{861:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/goedel","page":1,"postsPerPage":5,"totalPages":4,"totalCount":18,"nextPage":"/cardano-updates/tags/goedel/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b4645a09.58164e44.js b/assets/js/b4645a09.58164e44.js new file mode 100644 index 00000000000..4f494afa3ec --- /dev/null +++ b/assets/js/b4645a09.58164e44.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24910],{14950:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/","page":1,"postsPerPage":5,"totalPages":61,"totalCount":303,"nextPage":"/cardano-updates/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b4cc2dd2.ac8372ad.js b/assets/js/b4cc2dd2.ac8372ad.js new file mode 100644 index 00000000000..f9bc35e042c --- /dev/null +++ b/assets/js/b4cc2dd2.ac8372ad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70635],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var h=r.createContext({}),p=function(e){var t=r.useContext(h),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(h.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,h=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(h,".").concat(c)]||d[c]||u[c]||o;return a?r.createElement(m,i(i({ref:t},s),{},{components:a})):r.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var h in t)hasOwnProperty.call(t,h)&&(l[h]=t[h]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},52945:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-03-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-hydra.md",source:"@site/blog/2023-03-03-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.19,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-03-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-03-ledger"}},h={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},d="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/releases/tag/0.9.0"},"0.9.0")," - a version\nof the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," with fully specified behavior of on-chain scripts and\noff-chain head-logic, decreased costs for opening/closing a Head and scalable\ncontestation deadline semantics. Check out the full release notes for details."),(0,n.kt)("p",null,"Furthermore, they published the ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2023-03"},"monthly\nreport")," of the Hydra project\nand conducted a review meeting with an increasingly wider audience. The team\nplans to extend invitations through the new Hydra\n",(0,n.kt)("a",{parentName:"p",href:"https://discord.gg/Bwdy2jNdm2"},"#announcements")," discord channel for the next\nmonths, stay tuned!"),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting with report published ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-03"},"on website")),(0,n.kt)("li",{parentName:"ul"},"Fixed smoke tests ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/726"},"#726")),(0,n.kt)("li",{parentName:"ul"},"Reduced the cost of opening/closing a Head (error codes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/748"},"#748")," + head reference script ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/701"},"#701"),")"),(0,n.kt)("li",{parentName:"ul"},"Released version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.9.0"},"0.9.0")),(0,n.kt)("li",{parentName:"ul"},"Conducted a first experiment on mainnet compatibility ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713")),(0,n.kt)("li",{parentName:"ul"},"New discord category with ",(0,n.kt)("a",{parentName:"li",href:"https://discord.gg/Bwdy2jNdm2"},"#announcements")," channel"),(0,n.kt)("li",{parentName:"ul"},"Received a demo about the Hydra for Voting project"),(0,n.kt)("li",{parentName:"ul"},"Lightning talk on mutation-based testing (to be shared)"),(0,n.kt)("li",{parentName:"ul"},"New ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/orgs/input-output-hk/projects/21/views/26"},"themes view")," in on our roadmap and some rearranging as we align it with high-level objectives"),(0,n.kt)("li",{parentName:"ul"},"Clarified things with researchers, but mostly identified action items for them")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs and address TODOs specification"),(0,n.kt)("li",{parentName:"ul"},"Run hydraw with 0.9.0 on preprod"),(0,n.kt)("li",{parentName:"ul"},"Make smoke tests on mainnet possible"),(0,n.kt)("li",{parentName:"ul"},"Groom the explorer item"),(0,n.kt)("li",{parentName:"ul"},"Unblock the auctions projecth with ","\u201c","commit from script","\u201d"," a solution")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b4f5b98b.d8a4a2ab.js b/assets/js/b4f5b98b.d8a4a2ab.js new file mode 100644 index 00000000000..f4145c3dcaf --- /dev/null +++ b/assets/js/b4f5b98b.d8a4a2ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78461],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function o(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function p(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var l=n.createContext({}),u=function(t){var e=n.useContext(l),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(l.Provider,{value:e},t.children)},m="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,l=t.parentName,c=p(t,["components","mdxType","originalType","parentName"]),m=u(a),s=r,h=m["".concat(l,".").concat(s)]||m[s]||d[s]||i;return a?n.createElement(h,o(o({ref:e},c),{},{components:a})):n.createElement(h,o({ref:e},c))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,o=new Array(i);o[0]=s;var p={};for(var l in e)hasOwnProperty.call(e,l)&&(p[l]=e[l]);p.originalType=t,p[m]="string"==typeof t?t:r,o[1]=p;for(var u=2;u<i;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},18983:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-08-01-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},o="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-08-01-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-01-node-cli-api.md",source:"@site/blog/2023-08-01-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-08-01T00:00:00.000Z",formattedDate:"August 1, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.76,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-08-01-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-04-sre"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-07-31-network"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-07-19---2023-08-01"},"2023-07-19 - 2023-08-01"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Release of Node 8.2.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694."),(0,r.kt)("li",{parentName:"ul"},"This release is phase 1 of the SanchoNet roll out"),(0,r.kt)("li",{parentName:"ul"},"Allows SPOs to vote on changes to the on-chain constitution."),(0,r.kt)("li",{parentName:"ul"},"Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag."),(0,r.kt)("li",{parentName:"ul"},"Updates to the networking packages prepare the road for peer sharing."))),(0,r.kt)("li",{parentName:"ul"},"cardano-cli and cardano-api continue to integrate Conway era features"),(0,r.kt)("li",{parentName:"ul"},"Continue refactoring of cardano-testnet")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/116"},"Use AnyShelleyToBabbageEra from cardano-api instead")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/115"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/113"},"Add rendering for ",(0,r.kt)("inlineCode",{parentName:"a"},"ConwayCertificate")," in ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Cli.Json.Friendly"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/111"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/110"},"Add DRep registration certificate command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/109"},"Add options to delegate voting stake ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/107"},"Share MIR certificates code between era-based and legacy CLI parsers")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/106"},"Release cardano-cli 8.4.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/103"},"Update to",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/100"},"Change directory structure from Options/.. to EraBased/..")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/98"},"Era-sensitive command structure")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/90"},"#86 Set default era to Babbage in stake-address, stake-pool and governance commmands"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/155"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyCertificateConstraints")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"conwayCertificateConstraints"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/154"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"TxVotesSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/152"},"Add SerialiseAsBech32 instances for committee cold and hot keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/151"},"Deprecate some constraint functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/150"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"TxGovernanceActionSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/149"},"More ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraint")," constraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/148"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/147"},"Expose shelleyCertificateConstraints and conwayCertificateConstraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/146"},"Remove unnecessary function ",(0,r.kt)("inlineCode",{parentName:"a"},"getShelleyEraTxBodyConstraint"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/143"},"Provide additional constraints in ",(0,r.kt)("inlineCode",{parentName:"a"},"shelleyBasedEraConstraints"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/142"},"Update changelogs for ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/141"},"handleFileForWritingWithOwnerPermissionImpl: Fix permisions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/138"},"Update DRepKey with correct ",(0,r.kt)("inlineCode",{parentName:"a"},"Voting")," keyrole")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/137"},"Support more constraints for Conway witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/135"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.10.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/134"},"Expose toShelleyPoolParams for conway integration")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/131"},(0,r.kt)("inlineCode",{parentName:"a"},"FeatureInEra")," instance for ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/130"},"Expose more functionality from cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/128"},"Improved feature ergonomics")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/127"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"AtMostBabbageEra")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyToBabbageEra")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5412"},"Fix stubbed LogFormatting instances")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5411"},"8.2.0 version bumps")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"Bump network packages version")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5404"},"Fix missing ",(0,r.kt)("inlineCode",{parentName:"a"},"ToObject")," tracing instances.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5401"},"input-output-hk/cardano-cli#85 Fix node crashing in babbage"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5411"},"8.2.0 version bumps")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"Bump network packages version")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5404"},"Fix missing ",(0,r.kt)("inlineCode",{parentName:"a"},"ToObject")," tracing instances.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5400"},"Fix plutus script costing in cardano-testnet"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"Bump network packages version"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/blob/05c0392b4722d7fe2f82db1854b28de4f28a917b/doc/getting-started/understanding-config-files.md?plain=1#L84C1-L97C42"},"WarmValency"))))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b512dd46.0c3c6eed.js b/assets/js/b512dd46.0c3c6eed.js new file mode 100644 index 00000000000..83bbbf0da5c --- /dev/null +++ b/assets/js/b512dd46.0c3c6eed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[47093],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=o.createContext({}),l=function(e){var t=o.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=l(r),d=n,h=c["".concat(s,".").concat(d)]||c[d]||m[d]||a;return r?o.createElement(h,i(i({ref:t},u),{},{components:r})):o.createElement(h,i({ref:t},u))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[c]="string"==typeof e?e:n,i[1]=p;for(var l=2;l<a;l++)i[l]=r[l];return o.createElement.apply(null,i)}return o.createElement.apply(null,r)}d.displayName="MDXCreateElement"},5136:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>p,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var o=r(87462),n=(r(67294),r(3905)),a=r(80175);const i={title:"Network Team Update",slug:"2022-11-11-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},p=void 0,s={permalink:"/cardano-updates/2022-11-11-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-network.md",source:"@site/blog/2022-11-11-network.md",title:"Network Team Update",description:"High-level summary",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.595,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-11-11-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-11-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-04-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"Detail description",id:"detail-description",level:2},{value:"Performance regression",id:"performance-regression",level:3},{value:"New P2P topology form",id:"new-p2p-topology-form",level:3},{value:"Tracing improvements",id:"tracing-improvements",level:3},{value:"Open Source Improvements",id:"open-source-improvements",level:3}],c={toc:u},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"In last sprint we got a performance report of P2P performance testing cluster\n(which consists of 50 nodes). There is a performance regression in the header\nnotification metric. The P2P cluster is constructed with the same\ntopology as the non-p2p reference one this indicates some regression which\nneeds to be further investigated. This poses a risk for releasing P2P."),(0,n.kt)("p",null,"We also continued to work on peer sharing: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"pull #4019"),"."),(0,n.kt)("p",null,"We continued working on dynamic block production which is required for P2P\nrelease for BP nodes: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"pull #3159"),"."),(0,n.kt)("p",null,"We simplified the P2P topology format: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4559"},"issue #4559"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3888"},"pull #3888"),"."),(0,n.kt)("p",null,"We added a new trace point for asynchronous demotions of local peers with\n",(0,n.kt)("inlineCode",{parentName:"p"},"Warning")," severity. This trace is ",(0,n.kt)("strong",{parentName:"p"},"important")," for SPOs."),(0,n.kt)("h2",{id:"detail-description"},"Detail description"),(0,n.kt)("h3",{id:"performance-regression"},"Performance regression"),(0,n.kt)("p",null,"Below we include a graph which shows the performance regression of the P2P code base vs non P2P."),(0,n.kt)("img",{src:a.Z}),(0,n.kt)("p",null,"On the ",(0,n.kt)("inlineCode",{parentName:"p"},"x")," axis is time in seconds which measures the delay from the start of\nthe slot to when a header was received. The ",(0,n.kt)("inlineCode",{parentName:"p"},"y")," axis is the percentile of nodes\nthat received a header. We are currently investigating possible causes of the\nregression. "),(0,n.kt)("h3",{id:"new-p2p-topology-form"},"New P2P topology form"),(0,n.kt)("p",null,"The new topology file format is described in this ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4559"},"issue #4559"),"."),(0,n.kt)("h3",{id:"tracing-improvements"},"Tracing improvements"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We improved a handshake error reporting, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4136"},"pull #4136")),(0,n.kt)("li",{parentName:"ul"},"We added ",(0,n.kt)("inlineCode",{parentName:"li"},"TraceDemoteLocalAsynchronous")," rendered as ",(0,n.kt)("inlineCode",{parentName:"li"},"DemoteLocalAsynchronous"),"\nin ",(0,n.kt)("inlineCode",{parentName:"li"},"json")," format, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4127"},"pull #4127"),". Such demotions should be investigated by the\npool operator. They can indicate a problem in the deployed system, but also\nthey could indicate a remote problem in arranged connections with other SPOs.")),(0,n.kt)("h3",{id:"open-source-improvements"},"Open Source Improvements"),(0,n.kt)("p",null,"We improved documentation of ",(0,n.kt)("inlineCode",{parentName:"p"},"io-sim")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols")," for open-source\ncontributors and/or maintenance tasks: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/22"},"pull #22"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/45"},"pull #45"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/48"},"pull #48"),". "))}d.isMDXComponent=!0},80175:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/2022-11-11-noticed-headers-55bb0b4d41e8f0cff0066e1bec91bdd2.png"}}]); \ No newline at end of file diff --git a/assets/js/b5164349.8a4ed5f9.js b/assets/js/b5164349.8a4ed5f9.js new file mode 100644 index 00000000000..5adb810e848 --- /dev/null +++ b/assets/js/b5164349.8a4ed5f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40176],{3905:(e,n,r)=>{r.d(n,{Zo:()=>u,kt:()=>g});var t=r(67294);function a(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function i(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function o(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?i(Object(r),!0).forEach((function(n){a(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function c(e,n){if(null==e)return{};var r,t,a=function(e,n){if(null==e)return{};var r,t,a={},i=Object.keys(e);for(t=0;t<i.length;t++)r=i[t],n.indexOf(r)>=0||(a[r]=e[r]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)r=i[t],n.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=t.createContext({}),l=function(e){var n=t.useContext(s),r=n;return e&&(r="function"==typeof e?e(n):o(o({},n),e)),r},u=function(e){var n=l(e.components);return t.createElement(s.Provider,{value:n},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},m=t.forwardRef((function(e,n){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(r),m=a,g=d["".concat(s,".").concat(m)]||d[m]||p[m]||i;return r?t.createElement(g,o(o({ref:n},u),{},{components:r})):t.createElement(g,o({ref:n},u))}));function g(e,n){var r=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var c={};for(var s in n)hasOwnProperty.call(n,s)&&(c[s]=n[s]);c.originalType=e,c[d]="string"==typeof e?e:a,o[1]=c;for(var l=2;l<i;l++)o[l]=r[l];return t.createElement.apply(null,o)}return t.createElement.apply(null,r)}m.displayName="MDXCreateElement"},3644:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var t=r(87462),a=(r(67294),r(3905));const i={title:"Performance & tracing update",slug:"2023-03-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",c={permalink:"/cardano-updates/2023-03-22-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-performance-and-tracing.md",source:"@site/blog/2023-03-22-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.",date:"2023-03-22T00:00:00.000Z",formattedDate:"March 22, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.5,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-03-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-22-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-21-network"}},s={authorsImageUrls:[void 0]},l=[{value:"New tracing",id:"new-tracing",level:3},{value:"GHC RTS parametrization",id:"ghc-rts-parametrization",level:3},{value:"Open Sourcing",id:"open-sourcing",level:3},{value:"General",id:"general",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:l},d="wrapper";function p(e){let{components:n,...r}=e;return(0,a.kt)(d,(0,t.Z)({},u,r,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks."),(0,a.kt)("li",{parentName:"ul"},"Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.")),(0,a.kt)("h1",{id:"performance"},"Performance"),(0,a.kt)("h3",{id:"new-tracing"},"New tracing"),(0,a.kt)("p",null,"The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe\na slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use."),(0,a.kt)("h3",{id:"ghc-rts-parametrization"},"GHC RTS parametrization"),(0,a.kt)("p",null,"We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies\non different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use."),(0,a.kt)("h3",{id:"open-sourcing"},"Open Sourcing"),(0,a.kt)("p",null,"Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well\nas a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points\nfor users of the new system, depending on their wants and needs. "),(0,a.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,a.kt)("h3",{id:"general"},"General"),(0,a.kt)("p",null,"Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will\nincrease confidence in specific metrics."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis\nis patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b57687d8.ad244a62.js b/assets/js/b57687d8.ad244a62.js new file mode 100644 index 00000000000..3b2a85c8daa --- /dev/null +++ b/assets/js/b57687d8.ad244a62.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24651],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=u(n),m=r,h=c["".concat(s,".").concat(m)]||c[m]||d[m]||i;return n?a.createElement(h,o(o({ref:t},p),{},{components:n})):a.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var u=2;u<i;u++)o[u]=n[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},17503:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const i={title:"Consensus Team Update",slug:"2023-05-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-31-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-31-consensus.md",source:"@site/blog/2023-05-31-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-05-31T00:00:00.000Z",formattedDate:"May 31, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.825,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-05-31-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-01-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-31-performance-and-tracing"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Support",id:"support",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/101"},"this issue"),"). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain."),(0,r.kt)("p",null,"On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano."),(0,r.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking ",(0,r.kt)("inlineCode",{parentName:"li"},"SOP")," classes like ",(0,r.kt)("inlineCode",{parentName:"li"},"HPure")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"HAp")," . In short, we implement generalised versions of important classes like ",(0,r.kt)("inlineCode",{parentName:"li"},"Applicative")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"Traversable"),".")),(0,r.kt)("h2",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim-0.1.0.2")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-api-0.1.0.2")," were released, which makes them now compatible with GHC up to ",(0,r.kt)("inlineCode",{parentName:"li"},"9.6"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus-0.7.0.0")," was released for ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node")," ",(0,r.kt)("inlineCode",{parentName:"li"},"8.1"),", including query serialization fixes for backwards compatibility.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b6145ff0.7ca20c32.js b/assets/js/b6145ff0.7ca20c32.js new file mode 100644 index 00000000000..f35a34f0ca4 --- /dev/null +++ b/assets/js/b6145ff0.7ca20c32.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[71843],{61785:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/59","page":59,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/58","nextPage":"/cardano-updates/page/60","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b65e5ec2.d8fca806.js b/assets/js/b65e5ec2.d8fca806.js new file mode 100644 index 00000000000..ce641f3dfb9 --- /dev/null +++ b/assets/js/b65e5ec2.d8fca806.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15715],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),s=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,m=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=r,h=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return n?a.createElement(h,o(o({ref:t},m),{},{components:n})):a.createElement(h,o({ref:t},m))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:r,o[1]=c;for(var s=2;s<i;s++)o[s]=n[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},79198:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-09-07-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,c={permalink:"/cardano-updates/2023-09-07-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-07-performance-and-tracing.md",source:"@site/blog/2023-09-07-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-09-07T00:00:00.000Z",formattedDate:"September 7, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.3,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-09-07-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-07-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-09-06-consensus"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:s},u="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack."),(0,r.kt)("li",{parentName:"ul"},"Infrastructure: Various improvements of our analysis pipeline have been merged to ",(0,r.kt)("inlineCode",{parentName:"li"},"master"),", supporting safe log truncation."),(0,r.kt)("li",{parentName:"ul"},"Tracing: Namespace consistency checks have been merged to ",(0,r.kt)("inlineCode",{parentName:"li"},"master")," along with a curated configuration for benchmarking."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.")),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer. "),(0,r.kt)("p",null,"With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance. "),(0,r.kt)("p",null,"The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack."),(0,r.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,r.kt)("p",null,"As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation\noperation that keeps the interdependencies of block events intact. "),(0,r.kt)("p",null,"Truncation might happen at a slightly different point\nin time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time."),(0,r.kt)("h3",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"Consistency checking of namespace implementation and configuration when using the new system has been completed.\nThis feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," shows inconsistencies with the namespaces the system provides - and hence needs attention. "),(0,r.kt)("p",null,"Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many\ndetailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the\nfirst real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b6ef4fcb.68ecccd5.js b/assets/js/b6ef4fcb.68ecccd5.js new file mode 100644 index 00000000000..4c7bbba16bb --- /dev/null +++ b/assets/js/b6ef4fcb.68ecccd5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53516],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),s=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(d.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=s(a),u=n,m=h["".concat(d,".").concat(u)]||h[u]||c[u]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[h]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}u.displayName="MDXCreateElement"},33340:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-12-16-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-12-16-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-16-hydra.md",source:"@site/blog/2022-12-16-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-12-16T00:00:00.000Z",formattedDate:"December 16, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.27,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-12-16-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-28-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-15-mithril"}},d={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/benchmarks/transaction-cost/"},"the website")," and reduced the cost for commit transactions by ~30% with the help of reference scripts."),(0,n.kt)("p",null,"The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Kicked-off Hydra Voting project with Catalyst, CF, and IO Research."),(0,n.kt)("li",{parentName:"ul"},"Reduce commit transaction costs by ~30% with reference scripts."),(0,n.kt)("li",{parentName:"ul"},"Prepared an RFP for external audit of the Hydra Head solution."),(0,n.kt)("li",{parentName:"ul"},"Fixed transaction cost benchmarks for abort tx ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/631"},"#631"),"."),(0,n.kt)("li",{parentName:"ul"},"Recorded decision to use model-based testing (",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/adr/22/"},"ADR22"),") and improved Model ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/haddock/hydra-node/tests/Hydra-Model.html"},"documentation"),".",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Concluding the first increment on ","\u201c","Validate coordinated Head protocol","\u201d"," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/194"},"#194"),"."),(0,n.kt)("li",{parentName:"ul"},"Formulated next step / follow-up on testing the Soundness property of our protocol ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/656"},"#656"),"."))),(0,n.kt)("li",{parentName:"ul"},"Switched to using nix flakes for development setup and CI build ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/646"},"#646"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Push ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/7e532bd1c8a840a8155cf4b0858b982308dfc3f0/docs/adr/CloseTx-validity-bounds-and-deadline-calculation-DoS.md"},"ADR21")," & tx validity gap over the finish line (smoke tests missing)."),(0,n.kt)("li",{parentName:"ul"},"Integrate the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial"),"."),(0,n.kt)("li",{parentName:"ul"},"Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec."),(0,n.kt)("li",{parentName:"ul"},"Close & recap on the year with another monthly report (+ blog post).")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b78698d9.e2fd1721.js b/assets/js/b78698d9.e2fd1721.js new file mode 100644 index 00000000000..18a9e335e9b --- /dev/null +++ b/assets/js/b78698d9.e2fd1721.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[33288],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?o(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},o=Object.keys(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",h={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=u(a),m=r,s=d["".concat(p,".").concat(m)]||d[m]||h[m]||o;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[d]="string"==typeof t?t:r,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},52949:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-01-25-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-01-25-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-25-node-cli-api.md",source:"@site/blog/2023-01-25-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-01-25T00:00:00.000Z",formattedDate:"January 25, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.585,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-01-25-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-25-consensus"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-20-crypto"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function h(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-01-25---2023-02-07"},"2023-01-25 - 2023-02-07"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli query stake-snapshot")," command. "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4853"},"Fix how changed files are selected in stylish-haskell CI check")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Copyright updates")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4848"},"Remove hlint from nix required CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4838"},"Remove reconfigure-hlint.sh script")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4837"},"Fix hlint warnings")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4833"},"Implement ADR-2: Restructure modules for generators")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4803"},"Stylish Haskell in CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4802"},"Revert skip doc in ci")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4800"},"Skip CI on doc only changes")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4792"},"Skip CI if only changes are documentation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4776"},"Build all of cardano-node in CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4766"},"Check cabal files in CI"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4785"},"Straight line error handling")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4787"},"New NodeToClientVersionOf typeclass")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4832"},"Remove NoImplicitPrelude from cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4809"},"Add ReaderT of NodeToClientVersion to LocalStateQueryExpr")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4808"},"Use hoistMaybe")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4788"},"Better error message for query utxo without oops"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4805"},"New query stake-snapshot integration test")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4671"},"Make leadership-schedule test less flaky"))),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b7dd63dc.a0a6b412.js b/assets/js/b7dd63dc.a0a6b412.js new file mode 100644 index 00000000000..d46543303d5 --- /dev/null +++ b/assets/js/b7dd63dc.a0a6b412.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[11400],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>c});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),h=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=h(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=h(a),m=r,c=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(c,i(i({ref:t},u),{},{components:a})):n.createElement(c,i({ref:t},u))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var h=2;h<o;h++)i[h]=a[h];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},51146:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>h});var n=a(87462),r=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-11-10-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-11-10-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-10-hydra.md",source:"@site/blog/2023-11-10-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-11-10T00:00:00.000Z",formattedDate:"November 10, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.65,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-11-10-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-11-14-node-cli-api"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-10-sre"}},p={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],u={toc:h},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,'The last two weeks, the Hydra team achieved several milestones. They published\nthe monthly report for October, providing updates on project developments. The\nteam delivered a presentation and workshop at the Cardano Summit, contributing\nto community engagement. They implemented a \\"dirt road\\" solution for the\n\\"Ignored init tx\\" notification and moved the ',(0,r.kt)("inlineCode",{parentName:"p"},"hydra-poll")," example project to a\ndedicated repository. Additionally, the team built a ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-chain-observer")," tool\nfor Hydra Heads, updated the toolchain to GHC 9.6.3, and made various\nimprovements to tooling and code formatting. They addressed specific issues,\nsuch as fixing the ",(0,r.kt)("inlineCode",{parentName:"p"},"gen-hydra-keys")," command and resolving concerns with the\nrewritten ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-tui"),". The team also enhanced the ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-cluster")," smoke test\nsuite by fetching network configurations dynamically. Lastly, they actively\nreviewed pull requests and architectural decision records from the community,\nincluding contributions from SundaeSwap. An experiment, the Hydra tally, was\ncompleted and successfully deployed to the mainnet by the Cardano Foundation."),(0,r.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Published the monthly ",(0,r.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-10"},"report for\noctober")),(0,r.kt)("li",{parentName:"ul"},"Given a presentation / workshop at the Cardano summit\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1109"},"#1109")),(0,r.kt)("li",{parentName:"ul"},'Dirt road implementation for \\"Ignored init tx\\" notification\n',(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/529"},"#529")," (without\nstateless observation)"),(0,r.kt)("li",{parentName:"ul"},"Completed and moved ",(0,r.kt)("inlineCode",{parentName:"li"},"hydra-poll")," example project into a\ndedicated\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-scaling/hydra-poll"},"repository")),(0,r.kt)("li",{parentName:"ul"},"Built a first version of a chain observation tool for Hydra Heads\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1096"},"#1096")),(0,r.kt)("li",{parentName:"ul"},"Switched toolchain to GHC 9.6.3 and various improvements on tooling\nand code formatting\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1135"},"#1135"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1152"},"#1152"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1151"},"#1151"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1154"},"#1154")),(0,r.kt)("li",{parentName:"ul"},"Fix ",(0,r.kt)("inlineCode",{parentName:"li"},"gen-hydra-keys")," command to not overwrite existing\nkeys ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1136"},"#1136")),(0,r.kt)("li",{parentName:"ul"},"Fixed the rewritten ",(0,r.kt)("inlineCode",{parentName:"li"},"hydra-tui"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1113"},"#1113"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1137"},"#1137")),(0,r.kt)("li",{parentName:"ul"},"Fetch network configurations instead of packaging them into\nhydra-cluster (smoke) test suite\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1156"},"#1156")),(0,r.kt)("li",{parentName:"ul"},"Reviewing PRs and ADRs from the community (SundaeSwap)\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1118"},"#1118"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1157"},"#1157")),(0,r.kt)("li",{parentName:"ul"},"Hydra tally experiment (Cardano Foundation) deployed to mainnet")),(0,r.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Tackle reported bugs"),(0,r.kt)("li",{parentName:"ul"},"Shepherd contributed off-line mode PR to the main codeline"),(0,r.kt)("li",{parentName:"ul"},"Improve chain observation tool to include more data and refactor\nexisting code towards more stateless observation"),(0,r.kt)("li",{parentName:"ul"},"Start work on incremental decommits")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8465b4d.c76114e0.js b/assets/js/b8465b4d.c76114e0.js new file mode 100644 index 00000000000..c7818a9985a --- /dev/null +++ b/assets/js/b8465b4d.c76114e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[74933],{42005:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/37","page":37,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/36","nextPage":"/cardano-updates/page/38","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b88c8fa9.9fdee81f.js b/assets/js/b88c8fa9.9fdee81f.js new file mode 100644 index 00000000000..3f91c26d261 --- /dev/null +++ b/assets/js/b88c8fa9.9fdee81f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42190],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},22750:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-12-14-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-12-14-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-node-cli-api.md",source:"@site/blog/2022-12-14-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.46,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-12-14-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2022-12-14-db-sync"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-12-14-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-12-14---2022-12-27"},"2022-12-14 - 2022-12-27"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped. "),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4703"},"Move style guide to wiki"))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4734"},"Cache secp256k1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4717"},"Use cabal-cache")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4699"},"build(deps): bump certifi from 2020.4.5.2 to 2022.12.7 in /doc/.sphinx")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4724"},"Update cabal.project"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4125"},"Add aarch64-darwin to nix-shell"))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4626"},"Improved error message for failed asset name decode")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4700"},"Remove cardano-cli address build-script"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4698"},"Move signing key reading to cardano-api"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4712"},"Only run chairman test on latest era")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4679"},"Add fix and test for ",(0,r.kt)("inlineCode",{parentName:"a"},"foldBlocks")))),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Copyright updates"))),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8a3fbda.c9a4283c.js b/assets/js/b8a3fbda.c9a4283c.js new file mode 100644 index 00000000000..f85c1c7a539 --- /dev/null +++ b/assets/js/b8a3fbda.c9a4283c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7741],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),d=a,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return r?n.createElement(f,l(l({ref:t},s),{},{components:r})):n.createElement(f,l({ref:t},s))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},68986:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-09-29-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-29-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-goedel.md",source:"@site/blog/2023-09-29-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.42,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-09-29-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-02-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-29-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is currently formalising mini protocols and testing the\nperformance analysis tool"),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"drafting processs calculus semantics of mini protocol programs")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"testing the new performance modelling tool")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"further work on specification of mini protocols")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"extension of mini protocol framework to support communication of\nprograms with local environments via synchronous channels"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8bcf1d1.204838b0.js b/assets/js/b8bcf1d1.204838b0.js new file mode 100644 index 00000000000..da26591250f --- /dev/null +++ b/assets/js/b8bcf1d1.204838b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73277],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),u=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(r),m=n,d=p["".concat(s,".").concat(m)]||p[m]||h[m]||i;return r?a.createElement(d,o(o({ref:t},c),{},{components:r})):a.createElement(d,o({ref:t},c))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=r[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},98981:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-02-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-03-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-crypto.md",source:"@site/blog/2023-02-03-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-02-03T00:00:00.000Z",formattedDate:"February 3, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:2.47,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-02-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-08-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-03-goedel"}},s={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"MuSig2",id:"musig2",level:3}],c={toc:u},p="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril. "),(0,n.kt)("li",{parentName:"ul"},"cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: using snockets and making things testable in IOSim "),(0,n.kt)("li",{parentName:"ul"},"MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/722"},"PR#722")),(0,n.kt)("li",{parentName:"ul"},"We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper."),(0,n.kt)("li",{parentName:"ul"},"We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381. "),(0,n.kt)("li",{parentName:"ul"},"The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner."),(0,n.kt)("li",{parentName:"ul"},"The update VRF ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#341")," is finally merged, and we are ready to merge ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/344"},"PR#344"),", which implements conversion functions from the compatible types between Praos and PraosBatchCompat.")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Use of snockets to send the data directly from the socket to secure memory. "),(0,n.kt)("li",{parentName:"ul"},"We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives"),(0,n.kt)("li",{parentName:"ul"},"Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("p",null,"The GitHub Action ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/fernandrone/linelint"},"linelint")," is used to check the files."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A new job for linting is added to the file ",(0,n.kt)("inlineCode",{parentName:"li"},"/.github/workflows/ci.yml"),". The rules are configured in the file ",(0,n.kt)("inlineCode",{parentName:"li"},"/.github/workflows/.linelint.yml"),". Some files from the configuration of ",(0,n.kt)("inlineCode",{parentName:"li"},"libsecp")," were failing, so in the rules in ",(0,n.kt)("inlineCode",{parentName:"li"},".linelint.yml")," the failing files are denoted to be ignored by the linter."),(0,n.kt)("li",{parentName:"ul"},"Folders are reorganized. We created a folder to handle the example. This folder includes the ",(0,n.kt)("inlineCode",{parentName:"li"},"examplemusig2.c"),", a distinct ",(0,n.kt)("inlineCode",{parentName:"li"},"config.h"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"helper.c"),". The example is enhanced by implementing the functions in the helper for the configuration given in ",(0,n.kt)("inlineCode",{parentName:"li"},"config.h"),". The number of messages is different than the tests. The example is made more generic to run with a loop.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b92c36fd.da51b229.js b/assets/js/b92c36fd.da51b229.js new file mode 100644 index 00000000000..808078e49f3 --- /dev/null +++ b/assets/js/b92c36fd.da51b229.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[52322],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=p(a),h=n,m=c["".concat(s,".").concat(h)]||c[h]||u[h]||o;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},84846:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-10-28-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-28-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-hydra.md",source:"@site/blog/2022-10-28-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.795,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-10-28-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-11-01-db-sync"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-10-28-network"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team completed several user experience improvements to the\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-tui")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node"),", and delivered a first version of persisted head\nstates by publishing release version\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},(0,n.kt)("inlineCode",{parentName:"a"},"0.8.0")),".\nBesides this, they met with researchers on topic of the HeadV1 specification and\nkicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the UX improvements on the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tui")),(0,n.kt)("li",{parentName:"ul"},"Released version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},(0,n.kt)("inlineCode",{parentName:"a"},"0.8.0")),", which delivers a first version of persisted head states"),(0,n.kt)("li",{parentName:"ul"},"Met with researchers on the HeadV1 specification"),(0,n.kt)("li",{parentName:"ul"},"Started work on the RFP for our external audit")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete ADR18 implementation and get it merged"),(0,n.kt)("li",{parentName:"ul"},"Start work on event-sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Have a first plutus script gap closed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/452"},"#452")),(0,n.kt)("li",{parentName:"ul"},"Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b96b3223.99af26b5.js b/assets/js/b96b3223.99af26b5.js new file mode 100644 index 00000000000..3896109cc57 --- /dev/null +++ b/assets/js/b96b3223.99af26b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[77411],{39478:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/crypto/page/3","page":3,"postsPerPage":5,"totalPages":4,"totalCount":18,"previousPage":"/cardano-updates/tags/crypto/page/2","nextPage":"/cardano-updates/tags/crypto/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/b9d87023.3ccfd671.js b/assets/js/b9d87023.3ccfd671.js new file mode 100644 index 00000000000..72145bbbd09 --- /dev/null +++ b/assets/js/b9d87023.3ccfd671.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95850],{95586:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/goedel/page/4","page":4,"postsPerPage":5,"totalPages":4,"totalCount":18,"previousPage":"/cardano-updates/tags/goedel/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ba0b6dbd.00ad8d78.js b/assets/js/ba0b6dbd.00ad8d78.js new file mode 100644 index 00000000000..9590ae14836 --- /dev/null +++ b/assets/js/ba0b6dbd.00ad8d78.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30126],{50065:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>s,contentTitle:()=>p,default:()=>d,frontMatter:()=>i,metadata:()=>u,toc:()=>l});var n=o(87462),a=(o(67294),o(3905)),r=o(22004);const i={title:"Network Team Update",slug:"2022-08-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},p=void 0,u={permalink:"/cardano-updates/2022-08-12-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-08-12-network.md",source:"@site/blog/2022-08-12-network.md",title:"Network Team Update",description:"The networking team took an active part in the project iteration (PI) planning",date:"2022-08-12T00:00:00.000Z",formattedDate:"August 12, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.88,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-08-12-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-08-31-consensus"}},s={authorsImageUrls:[void 0]},l=[],k={toc:l},h="wrapper";function d(t){let{components:e,...o}=t;return(0,a.kt)(h,(0,n.Z)({},k,o,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The networking team took an active part in the project iteration (PI) planning\nsession, see cardano-node ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/39"},"backlog")," for detailed\noutcomes."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We started working on a detailed design / implementation plan for gossip.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We merged ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3859"},"input-output-hk/ouroboros-network#3859")," which\nsets the ouroboros-network repository for the single relay release.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified a bug in the network simulator, which is fixed in the\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3852"},"input-output-hk/ouroboros-network#3852"),".\nThe above PR was reviewed.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We set the tracing configuration for nodes which we deploy and fixed and\nidentified some deployment hiccups. We identified some bugs in the RT view\nwhich were registered by the maintainers.\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network-ops/pull/4"},"input-output-hk/ouroboros-network-ops#4"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We fixed typos in network-mux library:\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3921"},"input-output-hk/ouroboros-network#3921"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"For easy of debugging we renamed a trace point:\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3922"},"input-output-hk/ouroboros-network#3922"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Duncan iterated on his simulation / visualisation. He also was able to\nidentify and fix a bug in the simulator. The simulation contains 50 nodes.\nDashed lines indicate and established connection, while solid lines indicate\na TCP connection with fully open TCP window."))),(0,a.kt)(r.Z,{playing:!0,controls:!0,url:"/p2p-relay3.mp4",mdxType:"ReactPlayer"}))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/baed1590.d9d74d98.js b/assets/js/baed1590.d9d74d98.js new file mode 100644 index 00000000000..bc880a8e6f5 --- /dev/null +++ b/assets/js/baed1590.d9d74d98.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[12812],{44187:a=>{a.exports=JSON.parse('{"label":"ledger","permalink":"/cardano-updates/tags/ledger","allTagsPath":"/cardano-updates/tags","count":30}')}}]); \ No newline at end of file diff --git a/assets/js/bb44f9e3.0939305b.js b/assets/js/bb44f9e3.0939305b.js new file mode 100644 index 00000000000..71bfd9fd59d --- /dev/null +++ b/assets/js/bb44f9e3.0939305b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45943],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var i=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,a=function(e,t){if(null==e)return{};var r,i,a={},n=Object.keys(e);for(i=0;i<n.length;i++)r=n[i],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i<n.length;i++)r=n[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),d=a,c=h["".concat(s,".").concat(d)]||h[d]||m[d]||n;return r?i.createElement(c,o(o({ref:t},u),{},{components:r})):i.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<n;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}d.displayName="MDXCreateElement"},90805:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var i=r(87462),a=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-09-07-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-07-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-07-mithril.md",source:"@site/blog/2023-09-07-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-09-07T00:00:00.000Z",formattedDate:"September 7, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.53,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-09-07-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-08-hydra"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-07-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team has released a new distribution ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2335.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2335.0"))," which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information."),(0,a.kt)("p",null,"They have also worked on snapshots enhancements: implementation of the ",(0,a.kt)("inlineCode",{parentName:"p"},"zstandard")," compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes."),(0,a.kt)("p",null,"Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Use 'zstandard' compression for snapshot archives")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/876"},"#876")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design & implement stress test tool for aggregator - phase 2")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1155"},"#1155")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Provide progress information with '--json' option in Client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1095"},"#1095")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Make client download and extract the archive simultaneously")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1115"},"#1115")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add aggregator Cardano node version in snapshot artifact")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/948"},"#948")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Make Cardano node version part of the Mithril network configuration")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/947"},"#947")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Post deployment 'mainnet' infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1091"},"#1091")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Errors refactoring")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/798"},"#798")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add Cloudflare protection of infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/986"},"#986")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Failed to restore recent snapshot with strange error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1160"},"#1160")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update 'ed25519-dalek' to '2.0.0'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1188"},"#1188")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add target networks blocks in release notes")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1151"},"#1151")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Fix end to end 'wait_for_the_expected_time' test")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1191"},"#1191")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Fix docs 'git checkout' command")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1174"},"#1174"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bb465a37.a85dd0e6.js b/assets/js/bb465a37.a85dd0e6.js new file mode 100644 index 00000000000..358ca0e55cd --- /dev/null +++ b/assets/js/bb465a37.a85dd0e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6246],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},l=Object.keys(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=a.createContext({}),p=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(r),m=n,b=d["".concat(i,".").concat(m)]||d[m]||c[m]||l;return r?a.createElement(b,o(o({ref:t},u),{},{components:r})):a.createElement(b,o({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:n,o[1]=s;for(var p=2;p<l;p++)o[p]=r[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},12332:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"Node Release Team Update",slug:"2023-01-13-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2023-01-13-release",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-release.md",source:"@site/blog/2023-01-13-release.md",title:"Node Release Team Update",description:"Node Reelease Update",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:.64,hasTruncateMarker:!1,authors:[{name:"Samuel Leathers",title:"Service Reliability Manager",url:"https://github.com/disassembler",imageURL:"https://github.com/disassembler.png",key:"disassembler"}],frontMatter:{title:"Node Release Team Update",slug:"2023-01-13-release",authors:"disassembler",tags:["release"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-13-hydra"},nextItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-01-13-system-test"}},i={authorsImageUrls:[void 0]},p=[{value:"Node Reelease Update",id:"node-reelease-update",level:2},{value:"2022-11-02 - 2023-01-13",id:"2022-11-02---2023-01-13",level:2},{value:"Executive Summary",id:"executive-summary",level:3},{value:"Completed",id:"completed",level:3},{value:"In Progress",id:"in-progress",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"node-reelease-update"},"Node Reelease Update"),(0,n.kt)("h2",{id:"2022-11-02---2023-01-13"},"2022-11-02 - 2023-01-13"),(0,n.kt)("h3",{id:"executive-summary"},"Executive Summary"),(0,n.kt)("p",null,"A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on\n",(0,n.kt)("inlineCode",{parentName:"p"},"release/1.35")," branch and does not bump cardano-ledger."),(0,n.kt)("p",null,"The team successfully integrated an interim release bump of ledger and consensus into cardano-node master.\nThis work will not be released in a node version, but will be continued by the current dependency bump in progress."),(0,n.kt)("p",null,"We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again."),(0,n.kt)("p",null,"The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress."),(0,n.kt)("h3",{id:"completed"},"Completed"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/1.35.4"},"Release 1.35.4"))),(0,n.kt)("h3",{id:"in-progress"},"In Progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/commits/release/1.35"},"Release 1.35.5")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.5_rc1/src_docs/source/test_results/node/tag_1_35_5_rc1.rst"},"Test Status"))))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bbc31819.a65c3848.js b/assets/js/bbc31819.a65c3848.js new file mode 100644 index 00000000000..d74897d7ab5 --- /dev/null +++ b/assets/js/bbc31819.a65c3848.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67330],{21765:a=>{a.exports=JSON.parse('{"label":"cli-api-quarterly","permalink":"/cardano-updates/quarterly/tags/cli-api-quarterly","allTagsPath":"/cardano-updates/quarterly/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/bbe7c3bd.224be55a.js b/assets/js/bbe7c3bd.224be55a.js new file mode 100644 index 00000000000..58bc7814af4 --- /dev/null +++ b/assets/js/bbe7c3bd.224be55a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24379],{38715:a=>{a.exports=JSON.parse('{"label":"mithril","permalink":"/cardano-updates/tags/mithril","allTagsPath":"/cardano-updates/tags","count":34}')}}]); \ No newline at end of file diff --git a/assets/js/bc6b65d9.f1413473.js b/assets/js/bc6b65d9.f1413473.js new file mode 100644 index 00000000000..534119c7ac3 --- /dev/null +++ b/assets/js/bc6b65d9.f1413473.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40160],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>m});var n=o(67294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?a(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):a(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function p(e,t){if(null==e)return{};var o,n,r=function(e,t){if(null==e)return{};var o,n,r={},a=Object.keys(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),l=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),h=l(o),d=r,m=h["".concat(s,".").concat(d)]||h[d]||c[d]||a;return o?n.createElement(m,i(i({ref:t},u),{},{components:o})):n.createElement(m,i({ref:t},u))}));function m(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=d;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[h]="string"==typeof e?e:r,i[1]=p;for(var l=2;l<a;l++)i[l]=o[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,o)}d.displayName="MDXCreateElement"},45335:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>p,toc:()=>l});var n=o(87462),r=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-03-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-03-02-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-02-network.md",source:"@site/blog/2023-03-02-network.md",title:"Network Team Update",description:"High level summary",date:"2023-03-02T00:00:00.000Z",formattedDate:"March 2, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.85,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-03-02-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-03-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-24-hydra"}},s={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed work log",id:"detailed-work-log",level:2}],u={toc:l},h="wrapper";function c(e){let{components:t,...o}=e;return(0,r.kt)(h,(0,n.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"In the current sprint the networking team focused on fixing bugs and pushing\nforward implementation of eclipse evasion. We also found a bug in our\nsimulation testing setup (in integration of test node). We also overviewed the\nwork on extending handshake protocol which is delivered by Galois Inc."),(0,r.kt)("p",null,"We published ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.4.0.1")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network-protocols-0.3.0.0")," to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/147"},"CHaP"),"."),(0,r.kt)("p",null,"We also fixed a bug in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," which results in not being able to\nconfigure inbound connection limits, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"PR #4902"),"."),(0,r.kt)("p",null,"Together with Karl Knutsson (CF) we realised an issue in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli"),": it's\nvalidation of DNS names, IP address & ports when registering a stake pool\nshould be more strict to protect against common mistakes which we identified on\nthe chain. See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/issues/4929"},"issue #4929"),"."),(0,r.kt)("h2",{id:"detailed-work-log"},"Detailed work log"),(0,r.kt)("p",null,"In ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," we fixed two bugs in peer state actions. First one results in\na busy loop if demotion from hot to warm times outs. This busy loop is\neventually exited when mux exits (we reported this in our previous report).\nThis fix made it to ",(0,r.kt)("inlineCode",{parentName:"p"},"1.35.6")," release as well."),(0,r.kt)("p",null,"In addition the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," also fixes another bug which results in ",(0,r.kt)("inlineCode",{parentName:"p"},"hot -> warm\n-> hot")," demotion / promotion busy loop."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," also fixed a bug in a node only used in simulation which\nresulted in not using ",(0,r.kt)("inlineCode",{parentName:"p"},"chain-sync")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"block-fetch")," mini-protocols. In the\nreview process, we realised that the header-body split in the simulated node\nrequires further work (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4419"},"PR #4419"),", which is under review)."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4385"},"PR #4385")," also extend our generators, which together with the above fix,\ncover the ",(0,r.kt)("inlineCode",{parentName:"p"},"hot -> warm -> hot")," demotion / promotion busy loop."),(0,r.kt)("p",null,"In ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4419"},"PR #4419")," we introduce a ",(0,r.kt)("inlineCode",{parentName:"p"},"ChainDB")," for our simulation node, which plays\nsimilar role to ",(0,r.kt)("inlineCode",{parentName:"p"},"ChainDB")," in the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),": a persistent (across\nsimulated restarts) store of blocks which does chain selection. This ensures\nthat the simulated node is using ",(0,r.kt)("inlineCode",{parentName:"p"},"block-fetch")," to download blocks announced by\n",(0,r.kt)("inlineCode",{parentName:"p"},"chain-sync")," mini-protocol."),(0,r.kt)("p",null,"We also made progress with reviewing ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"PR #4019")," - peer sharing."),(0,r.kt)("p",null,"We also fixed ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4370"},"issue #4370")," - a connection manager test failure, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4384"},"PR #4384"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bccb35b7.5dbc8a59.js b/assets/js/bccb35b7.5dbc8a59.js new file mode 100644 index 00000000000..5d4d607cf79 --- /dev/null +++ b/assets/js/bccb35b7.5dbc8a59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94759],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>k});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=u(r),d=o,k=c["".concat(p,".").concat(d)]||c[d]||m[d]||a;return r?n.createElement(k,l(l({ref:t},s),{},{components:r})):n.createElement(k,l({ref:t},s))}));function k(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:o,l[1]=i;for(var u=2;u<a;u++)l[u]=r[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},19604:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var n=r(87462),o=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-05-26-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-26-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-network.md",source:"@site/blog/2023-05-26-network.md",title:"Network Team Update",description:"High level summary",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.515,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-05-26-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-05-26-ledger"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-24-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed summary",id:"detailed-summary",level:2}],s={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"We continued working on ",(0,o.kt)("inlineCode",{parentName:"p"},"eclipse-evasion"),". We also analysed and fixed a bug\nwhen using DNS names in local root peers. We continued working on engineering\nblog post about P2P. We released a new version of packages for\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node-8.1.0")," release."),(0,o.kt)("p",null,"We improved our CI, removed obsolete scripts add extra validation which checks\nif ",(0,o.kt)("inlineCode",{parentName:"p"},"CHANGELOG.md")," files were updated."),(0,o.kt)("p",null,"We also improved release scripts."),(0,o.kt)("h2",{id:"detailed-summary"},"Detailed summary"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Eclipse evasion: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"#4462")),(0,o.kt)("li",{parentName:"ul"},"Local root peers bug fix: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4559"},"#4559")),(0,o.kt)("li",{parentName:"ul"},"Release to CHaP: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4573"},"#4573")),(0,o.kt)("li",{parentName:"ul"},"CI improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4572"},"#4572")),(0,o.kt)("li",{parentName:"ul"},"Release script improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4573"},"#4573"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bcf46d9c.dc0dfba9.js b/assets/js/bcf46d9c.dc0dfba9.js new file mode 100644 index 00000000000..5a94417a2be --- /dev/null +++ b/assets/js/bcf46d9c.dc0dfba9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31617],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),h=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=h(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),s=h(a),c=n,m=s["".concat(p,".").concat(c)]||s[c]||d[c]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var h=2;h<i;h++)o[h]=a[h];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},48880:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-01-20-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-20-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-hydra.md",source:"@site/blog/2023-01-20-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.13,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-01-20-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-01-20-crypto"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-01-20-network"}},p={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:h},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1\nspecification. Of which a first version has been aggregated and is currently\nunder review. They aligned the on-chain scripts of reimbursing funds on abort\nlike defined in the specification, improved the mutation test framework to have\nmore control when testing plutus scripts. The added HeadId in the API and the\nTUI example client make ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," easier to use and a first experiment of a\nHydra Head explorer was showing the utility of this - see what Heads exist on\nthe ",(0,n.kt)("inlineCode",{parentName:"p"},"preview")," network ",(0,n.kt)("a",{parentName:"p",href:"http://explorer.hydra.family"},"here"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"HeadId to API and display in the TUI ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/678"},"#678")),(0,n.kt)("li",{parentName:"ul"},"Experiment of creating a hydra explorer, first result hosted ",(0,n.kt)("a",{parentName:"li",href:"http://explorer.hydra.family"},"here")),(0,n.kt)("li",{parentName:"ul"},"Improved mutation framework allowing to fail for the right reason ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/679"},"#679")),(0,n.kt)("li",{parentName:"ul"},"Correctly reimburse funds in abort (matching the spec) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/670"},"#670")),(0,n.kt)("li",{parentName:"ul"},"Finished a first write-up of the Hydra HeadV1 spec: ",(0,n.kt)("a",{parentName:"li",href:"https://www.overleaf.com/read/bbqzmptcxryj"},"Read it on overleaf")," (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/blob/master/SUPPORT.md"},"Communication channels")," for feedback)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting with a broader audience"),(0,n.kt)("li",{parentName:"ul"},"Groom & plan actions required for a maintainable Head explorer"),(0,n.kt)("li",{parentName:"ul"},"Break \u201calign gaps\u201d feature into smaller chunks (at least on- /off-chain) and groom it"),(0,n.kt)("li",{parentName:"ul"},"Review the spec & discuss individual aborts with researchers (a bigger open question)")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bd65afd9.b89ce463.js b/assets/js/bd65afd9.b89ce463.js new file mode 100644 index 00000000000..140da21728b --- /dev/null +++ b/assets/js/bd65afd9.b89ce463.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36160],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),m=s(n),p=a,h=m["".concat(l,".").concat(p)]||m[p]||d[p]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:a,i[1]=c;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},25362:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-07-12-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-07-12-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-12-performance-and-tracing.md",source:"@site/blog/2023-07-12-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-07-12T00:00:00.000Z",formattedDate:"July 12, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.29,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-07-12-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-12-consensus"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-07-07-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:s},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Optimization of the new tracing system is ongoing and yielding good performance results."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"Our analysis of the GHC9 build of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation. "),(0,a.kt)("p",null,"In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),". This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run. "),(0,a.kt)("p",null,"Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bda3e1c7.8c9d07fa.js b/assets/js/bda3e1c7.8c9d07fa.js new file mode 100644 index 00000000000..a8b11b74eb3 --- /dev/null +++ b/assets/js/bda3e1c7.8c9d07fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27335],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},19203:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-02-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-02-08-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-node-cli-api.md",source:"@site/blog/2023-02-08-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-02-08T00:00:00.000Z",formattedDate:"February 8, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.095,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-02-08-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-08-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-08-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-02-08---2023-02-21"},"2023-02-08 - 2023-02-21"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"More maintenance and resolving raised issues."),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4889"},"Remove use of multiline literals")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4775"},"Markdown links CI check")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4755"},"Date ranges for copyright"))),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4894"},"Re-add support for decoding GenesisExtendedKey text envelope")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4885"},"Disallow empty cost model for create update proposal")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4815"},"Refactor code using onLeft and onNothing"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4876"},"Simplify SerialiseAsRawBytes type class"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))),(0,r.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bdc4c1ed.c2a461dc.js b/assets/js/bdc4c1ed.c2a461dc.js new file mode 100644 index 00000000000..77001b23080 --- /dev/null +++ b/assets/js/bdc4c1ed.c2a461dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[76581],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=u(a),d=n,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||i;return a?r.createElement(c,o(o({ref:t},s),{},{components:a})):r.createElement(c,o({ref:t},s))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},29598:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-06-09-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-09-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-09-hydra.md",source:"@site/blog/2023-06-09-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-09T00:00:00.000Z",formattedDate:"June 9, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.18,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-09-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Developer Experience Update",permalink:"/cardano-updates/2023-06-09-developer-experience"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-06-08-db-sync"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team worked on multiple fronts. They finished the\ninvestigation about the broken head on mainnet and re-opened their persistent\nhead instance. The team also fixed the monthly report publication on their\nwebsite and started sketching ideas and further improvements. Also, they are on\nthe last mile to deliver a new feature which will allow parties to commit funds\nfrom extern wallets. Finally the team started to work on optimizing the\nperformance on their benchmarks."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Finished investigation on broken head on mainnet ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/897"},"#897")," and re-opened it."),(0,n.kt)("li",{parentName:"ul"},"Added support for externally committing regular utxo ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/887"},"#887")),(0,n.kt)("li",{parentName:"ul"},"Fix monthly report publication on docs website and published the ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-05"},"monthly report"),". Odd problems when publishing monthly report:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Make us think about if we should change something about the website ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/908"},"#908")),(0,n.kt)("li",{parentName:"ul"},"Open issue to docusaurus ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/facebook/docusaurus/issues/9036"},"#9036")))),(0,n.kt)("li",{parentName:"ul"},"Fixed a bug in the benchmark process ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/910"},"#910")),(0,n.kt)("li",{parentName:"ul"},"Explored performance of the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node"),"{.verbatim} and identified a\nbottleneck."),(0,n.kt)("li",{parentName:"ul"},"Timed transaction feature is being used by the auction project \ud83c\udf89 ")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete performance analysis and start/plan improvements and provide\nregular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186")),(0,n.kt)("li",{parentName:"ul"},"Add hydra as tool to developer platform ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/872"},"#872"),"."),(0,n.kt)("li",{parentName:"ul"},"Authenticate network messages ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"#727"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete journey for external commits using multiple script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"Start implementing ",(0,n.kt)("em",{parentName:"li"},"Option B")," for external commits ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),".")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/be16a434.031b2037.js b/assets/js/be16a434.031b2037.js new file mode 100644 index 00000000000..4e9ae7b0fb9 --- /dev/null +++ b/assets/js/be16a434.031b2037.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83247],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>g});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=r.createContext({}),s=function(e){var n=r.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=s(e.components);return r.createElement(c.Provider,{value:n},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=s(t),d=a,g=m["".concat(c,".").concat(d)]||m[d]||u[d]||o;return t?r.createElement(g,i(i({ref:n},p),{},{components:t})):r.createElement(g,i({ref:n},p))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=d;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=t[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}d.displayName="MDXCreateElement"},85869:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=t(87462),a=(t(67294),t(3905));const o={title:"Performance & tracing update",slug:"2023-08-24-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-24-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-24-performance-and-tracing.md",source:"@site/blog/2023-08-24-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-08-24T00:00:00.000Z",formattedDate:"August 24, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-08-24-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-25-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-23-consensus"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],p={toc:s},m="wrapper";function u(e){let{components:n,...t}=e;return(0,a.kt)(m,(0,r.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: Benchmarking node version ",(0,a.kt)("inlineCode",{parentName:"li"},"8.2.1")," has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Our analysis pipeline has received improvements reducing memory footprint."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"We've performed and analysed the benchmarks for the ",(0,a.kt)("inlineCode",{parentName:"p"},"8.2.1")," version of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," as part of our release benchmarking cycle. "),(0,a.kt)("p",null,"Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held\nin memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The next portion of optimizations has been completed and merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),", getting rid of Haskell's native ",(0,a.kt)("inlineCode",{parentName:"p"},"String")," representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),". "),(0,a.kt)("p",null,"The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster\nand porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/be1e6782.4ec13c11.js b/assets/js/be1e6782.4ec13c11.js new file mode 100644 index 00000000000..ed8e0f2e906 --- /dev/null +++ b/assets/js/be1e6782.4ec13c11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25469],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>k});var n=o(67294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?a(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):a(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function p(e,t){if(null==e)return{};var o,n,r=function(e,t){if(null==e)return{};var o,n,r={},a=Object.keys(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),l=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=l(o),c=r,k=m["".concat(s,".").concat(c)]||m[c]||h[c]||a;return o?n.createElement(k,i(i({ref:t},u),{},{components:o})):n.createElement(k,i({ref:t},u))}));function k(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=c;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[m]="string"==typeof e?e:r,i[1]=p;for(var l=2;l<a;l++)i[l]=o[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,o)}c.displayName="MDXCreateElement"},12306:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>p,toc:()=>l});var n=o(87462),r=(o(67294),o(3905));const a={title:"Network Q2 2023 Update",slug:"2023-Q2-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/quarterly/2023-Q2-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-network.md",source:"@site/quarterly/2023-Q2-network.md",title:"Network Q2 2023 Update",description:"2023-04 - 2023-06",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:5.145,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Q2 2023 Update",slug:"2023-Q2-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-consensus"},nextItem:{title:"SRE Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-sre"}},s={authorsImageUrls:[void 0]},l=[{value:"2023-04 - 2023-06",id:"2023-04---2023-06",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Eclipse Evasion",id:"eclipse-evasion",level:4},{value:"Ecosystem P2P Deployment Progress",id:"ecosystem-p2p-deployment-progress",level:4},{value:"Peer Sharing",id:"peer-sharing",level:4},{value:"Diffusion (P2P)",id:"diffusion-p2p",level:4},{value:"Other Improvements & Developments",id:"other-improvements--developments",level:3},{value:"CDDL",id:"cddl",level:4},{value:"Cardano Ping",id:"cardano-ping",level:4},{value:"IOSim",id:"iosim",level:4},{value:"Typed Protocols",id:"typed-protocols",level:4},{value:"Cardano Client",id:"cardano-client",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"CI improvements",id:"ci-improvements",level:4},{value:"GHC 9.4 & 9.6",id:"ghc-94--96",level:4},{value:"Next steps",id:"next-steps",level:3}],u={toc:l},m="wrapper";function h(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-04---2023-06"},"2023-04 - 2023-06"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,r.kt)("p",null,"We finalised the design of eclipse evasion and implemented its mechanism which\nrelays on connectivity to ",(0,r.kt)("em",{parentName:"p"},"big ledger peers"),". ",(0,r.kt)("em",{parentName:"p"},"Big ledger peers")," are the\nlargest ledger peers which accumulate 90% of stake (currently there are less\nthan 1000 of them). The outbound governor has new targets for ",(0,r.kt)("em",{parentName:"p"},"known"),",\n",(0,r.kt)("em",{parentName:"p"},"established")," and ",(0,r.kt)("em",{parentName:"p"},"active")," big ledger peers which work in a similar way that\nsuch targets work for ledger peers. The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4662"},"ouroboros-network#4662")," PR is\ncurrently in review."),(0,r.kt)("p",null,"As part of this work we also identified a bug which would prevent a node to\nconnect to itself. Such connections are not easily detectable and are expected\nto be dropped by the churn mechanism, nonetheless they should not be buggy.\nThe failure was discovered thanks to our e2e simulation of diffusion using\n",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim")," & property based testing."),(0,r.kt)("p",null,"The PR also refactors the heart of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," interface reducing\ntechnical debt that would otherwise accumulate."),(0,r.kt)("p",null,"We also identified a possible improvement in the churn mechanism, which will be\nimplemented in Q3. Churn needs to await for peers to terminate, we can\nimprove the synchronisation. ","[ouroboros-network#4617]"),(0,r.kt)("h4",{id:"ecosystem-p2p-deployment-progress"},"Ecosystem P2P Deployment Progress"),(0,r.kt)("p",null,"We reached ",(0,r.kt)("strong",{parentName:"p"},"50% of stake in hands of SPOs who run at least on P2P relay"),". Now\nalso Emurgo and CF are running some P2P relays. Also 20% of IOG relays are\nrunning in P2P mode."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"P2P Progress",src:o(62597).Z,width:"1024",height:"768"})),(0,r.kt)("h4",{id:"peer-sharing"},"Peer Sharing"),(0,r.kt)("p",null,"We implemented ",(0,r.kt)("em",{parentName:"p"},"bootstrapping for peer sharing")," (also known as light peer\nsharing). New downstream (inbound) peers are now added to the ",(0,r.kt)("em",{parentName:"p"},"known peers")," of\nthe ",(0,r.kt)("em",{parentName:"p"},"outbound governor"),". Together with peer sharing this allows for non\nregistered relays to propagate through the network. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3596"},"ouroboros-network#3596")),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Please note that peer sharing is disabled by default and is not considered safe\nuntil Bootstrap Peers (see below) or Genesis is implemented.")),(0,r.kt)("h4",{id:"diffusion-p2p"},"Diffusion (P2P)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We designed a feature which will reduce the load on IOG relays (in future\nalso run by CF & Emurgo). The feature consists of two parts. A new source\nof peers called ",(0,r.kt)("em",{parentName:"p"},"bootstrap peers")," (obtained from via an https request), the\nability to switch from bootstrap peers to ledger peers if the node is synced\n(we are collaborating with the consensus team on the interface ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/blob/fbb8c8ee97517809dec0d0c8ae3fae9b8d272caf/docs/website/docs/bootstrap-peers-IER.md"},"Bootstrap\nPeers IER"),"). This feature will be completed in Q3.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4530"},"ouroboros-network#4530"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We published a blog post about ",(0,r.kt)("a",{parentName:"p",href:"https://engineering.iog.io/2023-06-28-p2p"},"P2P design & implementation"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4559"},"ouroboros-network#4559"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We merged changes which allow the consensus layer to start / stop block\nforging thread. This will allow to deploy P2P block producing nodes which\nserve as a live backup node. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/140"},"ouroboros-consensus#140"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed a few bugs in local root peers DNS resolution service:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4583"},"ouroboros-network#4583"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4571"},"ouroboros-network#4571"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We limited concurrency of DNS name resolutions: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4596"},"ouroboros-network#4596"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Galois Inc implemented query option for Handshake: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"ouroboros-network#4256"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed handshake query timeout: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4608"},"ouroboros-network#4608"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented warm valency for local root peers. This can help when using\nDNS names in local root peers which resolve to many IP addresses. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4575"},"ouroboros-network#4575"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We merged handshake changes which allow query protocol versions. Thanks to\nJames Parker from Galois Inc.: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"ouroboros-network#4256"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30/"},"cardano-cli#30"),"."))),(0,r.kt)("h3",{id:"other-improvements--developments"},"Other Improvements & Developments"),(0,r.kt)("h4",{id:"cddl"},"CDDL"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We added ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-node")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," CDDL specs / tests for encoding\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionData")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToClientVersionData"),". ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We clarified an inconsistency between CDDL spec and implementation which is\nhighly polymorphic. We designed and implemented a fix for ",(0,r.kt)("inlineCode",{parentName:"p"},"tx-submission"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"local-tx-submission")," mini-protocols. Specs for other mini-protocols will\nbe improved at a later stage. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4580"},"ouroboros-network#4580")))),(0,r.kt)("h4",{id:"cardano-ping"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/ouroboros-network/blob/master/cardano-ping"},"Cardano Ping")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"cardano-ping")," command was deprecated in favour of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," (the\ntransition was done by the ",(0,r.kt)("inlineCode",{parentName:"p"},"node")," team).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Support for ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol using Unix sockets.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4601"},"ouroboros-network#4601"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Support for ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToNodeV_11")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"NodeToClientV_16"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4587"},"ouroboros-network#4587"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," is now using ",(0,r.kt)("em",{parentName:"p"},"ISO8601")," format for timestamps. Formatting of\nmessages was improved. ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4593"},"ouroboros-network#4593"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli ping")," has a new ",(0,r.kt)("inlineCode",{parentName:"p"},"--query-versions")," flag which allows to query\nsupported versions by the remote node. This is supported by\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-8.1.0"),". ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4589"},"ouroboros-network#4589"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"cardano-node#5313"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30/"},"cardano-cli#30")))),(0,r.kt)("h4",{id:"iosim"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/io-sim"},"IOSim")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed timeouts & delays in ",(0,r.kt)("inlineCode",{parentName:"p"},"io-classes")," in a series of PRs: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/81"},"io-sim#81"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/82"},"io-sim#82"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/86"},"io-sim#86"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/87"},"io-sim#87"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We released ",(0,r.kt)("inlineCode",{parentName:"p"},"strict-stm-1.1.0.1")," on Hackage which fixed a bug in package\ndescription file: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/101"},"io-sim#101"),"."))),(0,r.kt)("h4",{id:"typed-protocols"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/typed-protocols"},"Typed Protocols")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We published haddocks of ",(0,r.kt)("inlineCode",{parentName:"li"},"typed-protocols")," at\n",(0,r.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/typed-protocols"},"https://input-output-hk.github.io/typed-protocols"))),(0,r.kt)("h4",{id:"cardano-client"},(0,r.kt)("a",{parentName:"h4",href:"https://github.com/input-output-hk/ouroboros-network/blob/master/cardano-client"},"Cardano Client")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We fixed a bug in ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-client-0.1.0.2")," release which results in clients\n(e.g. ",(0,r.kt)("inlineCode",{parentName:"li"},"db-sync"),") negotiate an experimental protocol version.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"After the split between consensus & network, we made ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-client"),"\nindependent of ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-diffusion"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4526"},"ouroboros-network#4526"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We wrap all exceptions in ",(0,r.kt)("inlineCode",{parentName:"p"},"DiffusionError"),": ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4537"},"ouroboros-network#4537"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5356"},"cardano-node#5356"),"."))),(0,r.kt)("h4",{id:"ci-improvements"},"CI improvements"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We switched to use GitHub merge queues in ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols")," repositories; ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/30"},"typed-protocols#30"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4546"},"ouroboros-network#4546"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We cleaned & updated scripts which run on CI.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented a script to verify & release packages on CHaP; ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4542"},"ouroboros-network#4542"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4573"},"ouroboros-network#4573"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We implemented a new CI script and cleaned existing ones:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4572"},"ouroboros-network#4572"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We don't install cryptographic libraries on CI anymore as none of our\npackages requires them; ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4539"},"ouroboros-network#4539"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Improved caching of dependencies: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4553"},"ouroboros-network#4553"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We made it possible to trigger building haddock manually:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4549"},"ouroboros-network#4549"),"."))),(0,r.kt)("h4",{id:"ghc-94--96"},"GHC 9.4 & 9.6"),(0,r.kt)("p",null,"We made all repositories under our control compile with ",(0,r.kt)("inlineCode",{parentName:"p"},"ghc-9.4")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"ghc-9.6"),"\nwhich includes ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"typed-protocols")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"Win32-network"),"."),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("p",null,"We will continue towards our ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/39/views/30"},"aspirational roadmap"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We will continue reviewing eclipse evasion."),(0,r.kt)("li",{parentName:"ul"},"As ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/140"},"ouroboros-consensus#140")," was merged, we are making progress towards\nreleasing P2P on block production nodes. We hope to analyse performance\nregression on such nodes observed on the benchmarking cluster. ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/orgs/input-output-hk/projects/39/views/30?pane=issue&itemId=6875505"},"roadmap-3887")),(0,r.kt)("li",{parentName:"ul"},"We are also focused on ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/orgs/input-output-hk/projects/39/views/30?pane=issue&itemId=8920085"},"roadmap-3969"),". Note that it was expanded in Q2.")))}h.isMDXComponent=!0},62597:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/2023-07-06-p2p-progress-194a909569eebb016b1f24fb8941e2cc.png"}}]); \ No newline at end of file diff --git a/assets/js/be26e761.724d58c0.js b/assets/js/be26e761.724d58c0.js new file mode 100644 index 00000000000..f144fd9e576 --- /dev/null +++ b/assets/js/be26e761.724d58c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86095],{20510:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/38","page":38,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/37","nextPage":"/cardano-updates/page/39","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/be32a6ec.24f1e527.js b/assets/js/be32a6ec.24f1e527.js new file mode 100644 index 00000000000..deb76e5f66e --- /dev/null +++ b/assets/js/be32a6ec.24f1e527.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15224],{27775:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/bf071e0b.76b7ab70.js b/assets/js/bf071e0b.76b7ab70.js new file mode 100644 index 00000000000..3e837dbf614 --- /dev/null +++ b/assets/js/bf071e0b.76b7ab70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67787],{36898:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/40","page":40,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/39","nextPage":"/cardano-updates/page/41","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/c0354ce6.09b0b808.js b/assets/js/c0354ce6.09b0b808.js new file mode 100644 index 00000000000..780bfc357e0 --- /dev/null +++ b/assets/js/c0354ce6.09b0b808.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36881],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(a),c=r,m=h["".concat(s,".").concat(c)]||h[c]||d[c]||i;return a?n.createElement(m,o(o({ref:t},u),{},{components:a})):n.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:r,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},50633:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-11-24-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-24-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-24-hydra.md",source:"@site/blog/2023-11-24-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-11-24T00:00:00.000Z",formattedDate:"November 24, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.12,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-11-24-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-29-mithril"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-11-24-sre"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],u={toc:p},h="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(h,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"This week, the Hydra team spent significant time opening a head among\nthemselves on ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet")," using the release candidate, revealing and\naddressing lurking bugs such as\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1174"},"#","1174"),". Also\nrequired was this change to dynamically calculate the min utxo value\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/1176"},"#","1176"),", a\nnecessary adjustment following the switch to inline datums. The team\nengaged with ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli")," / ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-api")," maintainers to discuss recent\nchanges and collaborated on drafting feature ideas, including providing\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1177"},"Conway support"),"\nfor the Hydra roadmap. As part of ongoing improvements, they\nexperimented with writing the specification in markdown instead of\nLaTex."),(0,r.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Opened head among us on mainnet and uncovered a few lurking bugs like\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1174"},"#","1174")," in the\nrelease candidate"),(0,r.kt)("li",{parentName:"ul"},"Calculate the min utxo value instead of hard-coding it\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1176"},"#","1176"),", which is\nneeded since we switched to inline datums."),(0,r.kt)("li",{parentName:"ul"},"Met with the ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-cli")," / ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-api")," maintainers to discuss\nrecent changes and way forward"),(0,r.kt)("li",{parentName:"ul"},"Drafted features ideas to provide ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1177"},"Conway\nsupport")," on the\nHydra roadmap"),(0,r.kt)("li",{parentName:"ul"},"Experimented in writing the specification in markdown instead of LaTex")),(0,r.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Have the Monthly review meeting with several demos"),(0,r.kt)("li",{parentName:"ul"},"Release version 0.14.0 with ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/milestone/14?closed=1"},"this\nscope")),(0,r.kt)("li",{parentName:"ul"},"Complete tidying up chain layer via stateless observation changes in\nhydra-node\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1096"},"#","1096")),(0,r.kt)("li",{parentName:"ul"},"Update dependencies to prepare for Conway\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1114"},"#","1114"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c036f08e.230d3185.js b/assets/js/c036f08e.230d3185.js new file mode 100644 index 00000000000..3598f067b5e --- /dev/null +++ b/assets/js/c036f08e.230d3185.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40309],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(r),m=n,h=c["".concat(p,".").concat(m)]||c[m]||s[m]||o;return r?a.createElement(h,i(i({ref:t},d),{},{components:r})):a.createElement(h,i({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=r[u];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},52303:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"SRE Team Update",slug:"2023-06-23-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-23-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-sre.md",source:"@site/blog/2023-06-23-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.98,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-06-23-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-23-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-16-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Ci-ops",id:"ci-ops",level:3},{value:"Ci-world",id:"ci-world",level:3},{value:"Devx-ci",id:"devx-ci",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3}],d={toc:u},c="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality"),(0,n.kt)("li",{parentName:"ul"},"Cardano Sanchonet environment was stood up to test Conway era functionality"),(0,n.kt)("li",{parentName:"ul"},"Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case"),(0,n.kt)("li",{parentName:"ul"},"Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5318"},"cardano-node-pull-5318"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updates required for node 8.1.1 nixos service: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/pull/414"},"cardano-ops-pull-414")),(0,n.kt)("li",{parentName:"ul"},"Work in progress continues on mixed legacy and p2p topology clusters in cardano-ops: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/tree/ops-local"},"cardano-ops-ops-local"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/tree/mn-mixed-p2p"},"cardano-ops-mn-mixed-p2p"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add Sanchonet environment: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/96"},"cardano-world-pull-96"))),(0,n.kt)("h3",{id:"ci-ops"},"Ci-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add devx-ci cluster integration for legacy darwin ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-ops/compare/b158b17...ed875b9"},"ci-ops-compare"))),(0,n.kt)("h3",{id:"ci-world"},"Ci-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ci-world/compare/840cdb6...b08c250"},"ci-world-compare"))),(0,n.kt)("h3",{id:"devx-ci"},"Devx-ci"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/devx-ci"},"devx-ci-repo"))),(0,n.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add Sanchonet environment: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/545"},"iohk-nix-pull-545"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c061e3b1.52557f8e.js b/assets/js/c061e3b1.52557f8e.js new file mode 100644 index 00000000000..2c5454580dd --- /dev/null +++ b/assets/js/c061e3b1.52557f8e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64614],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var h=a.createContext({}),p=function(e){var t=a.useContext(h),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(h.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,h=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),s=p(r),c=i,d=s["".concat(h,".").concat(c)]||s[c]||m[c]||n;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=c;var l={};for(var h in t)hasOwnProperty.call(t,h)&&(l[h]=t[h]);l.originalType=e,l[s]="string"==typeof e?e:i,o[1]=l;for(var p=2;p<n;p++)o[p]=r[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},99797:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-03-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-09-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-09-mithril.md",source:"@site/blog/2023-03-09-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-03-09T00:00:00.000Z",formattedDate:"March 9, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.42,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-03-09-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-10-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-08-consensus"}},h={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(s,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano ",(0,i.kt)("inlineCode",{parentName:"p"},"mainnet")," and computes the stake distribution with the optimized unreleased Cardano CLI command."),(0,i.kt)("p",null,"Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements eras behavior switch ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/707"},"#707"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the deployment of the era behavior switch to the test networks ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/752"},"#752")),(0,i.kt)("li",{parentName:"ul"},"Completed the enhancement of datum generation for era markers ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/786"},"#786")),(0,i.kt)("li",{parentName:"ul"},"Worked on handling the API version with an era switch ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/727"},"#727")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements a relational store in the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Worked on the migration/adaptation of the ",(0,i.kt)("inlineCode",{parentName:"li"},"stake_pool")," table ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/787"},"#787")))),(0,i.kt)("li",{parentName:"ul"},"Completed the refactoring of errors in the signer and aggregator state machines ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/665"},"#665")),(0,i.kt)("li",{parentName:"ul"},"Worked on testing Mithril with a ",(0,i.kt)("inlineCode",{parentName:"li"},"mainnet")," Cardano network ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/777"},"#777")),(0,i.kt)("li",{parentName:"ul"},"Worked on fixing bugs with the Docker client image:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Fixed a bug that made the Docker client container crash at startup ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/769"},"#769")),(0,i.kt)("li",{parentName:"ul"},"Fixed a bug that prevented the restoration of a snapshot with a Docker client ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/791"},"#791")),(0,i.kt)("li",{parentName:"ul"},"Worked on testing the Docker client in the ",(0,i.kt)("inlineCode",{parentName:"li"},"Mithril Client multi-platform test")," workflow ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/794"},"#794"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c063df1b.518f2336.js b/assets/js/c063df1b.518f2336.js new file mode 100644 index 00000000000..4bdfa0f26c1 --- /dev/null +++ b/assets/js/c063df1b.518f2336.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21562],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=n,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?a.createElement(h,i(i({ref:t},s),{},{components:r})):a.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},7314:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2023-03-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-03-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-crypto.md",source:"@site/blog/2023-03-03-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.155,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-03-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-08-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-03-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit."),(0,n.kt)("li",{parentName:"ul"},"cardano-base: BLS branch is now ready for review. We are workign forward its merge. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase."),(0,n.kt)("li",{parentName:"ul"},"Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Bumped to version ",(0,n.kt)("a",{parentName:"li",href:"https://crates.io/crates/kes-summed-ed25519/0.2.0"},"0.2.0")," the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using ",(0,n.kt)("inlineCode",{parentName:"li"},"mlock"),"."),(0,n.kt)("li",{parentName:"ul"},"Opened ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/783"},"PR#783")," to update dependency"),(0,n.kt)("li",{parentName:"ul"},"Improved testing for batch opening of mtree, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/773"},"PR#773")),(0,n.kt)("li",{parentName:"ul"},"Improved testing for batch verification of STM sigs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/774"},"PR#774")),(0,n.kt)("li",{parentName:"ul"},"RFP for crypto audit almost ready.")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"BLS12-381 branch finally ready for review ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"))),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("p",null,"Team off for one week. Other progress:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Learning about raw direct-bearer abstraction. An interface for sockets in consensus."),(0,n.kt)("li",{parentName:"ul"},"use that for direct ser/deser"),(0,n.kt)("li",{parentName:"ul"},"written those syntaxes for ouroboros (coming PR)"),(0,n.kt)("li",{parentName:"ul"},"the kes agent will depend on that. \t")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("p",null,"Progress with familiarisation of Halo2 library to write circuits."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c08c0f47.416aafe8.js b/assets/js/c08c0f47.416aafe8.js new file mode 100644 index 00000000000..555a0b3607e --- /dev/null +++ b/assets/js/c08c0f47.416aafe8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64562],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||u[m]||o;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var p=2;p<o;p++)i[p]=n[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},63876:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-06-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-06-14-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-14-consensus.md",source:"@site/blog/2023-06-14-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-06-14T00:00:00.000Z",formattedDate:"June 14, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.115,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-06-14-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-15-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-14-performance-and-tracing"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:p},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the ",(0,r.kt)("inlineCode",{parentName:"p"},"Byron")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"TPraos")," eras do not need to be checkpointed for an MVP.\nThere is one remaining question (which applies also to the ",(0,r.kt)("inlineCode",{parentName:"p"},"Praos"),' era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated "Limit on Patience" timeout sufficiently bounds how long the adversary can inflate a victim\'s overall sync time.'),(0,r.kt)("p",null,"On the UTxO-HD front, the prototype branch was rebased on top of the latest ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," branch and integrated on top of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node 8.1.1-pre"),". As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD.\nWe managed to run a node again with UTxO-HD enabled.\nWe also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),", which uncovered a performance regression on the Network component when using ",(0,r.kt)("inlineCode",{parentName:"p"},"GHC-9.2/9.4"),". This is being addressed."),(0,r.kt)("p",null,"Regarding our support activities, we Released ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-sim-0.2.0.0")," and are in the process of preparing the 8.2 release of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c091c5d8.ce22eeb2.js b/assets/js/c091c5d8.ce22eeb2.js new file mode 100644 index 00000000000..e86824f74c9 --- /dev/null +++ b/assets/js/c091c5d8.ce22eeb2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39596],{414:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/devx","page":1,"postsPerPage":5,"totalPages":1,"totalCount":2,"blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/c0ac1524.13b59269.js b/assets/js/c0ac1524.13b59269.js new file mode 100644 index 00000000000..c3c62c1e6f2 --- /dev/null +++ b/assets/js/c0ac1524.13b59269.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89752],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),u=a,f=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return r?n.createElement(f,l(l({ref:t},s),{},{components:r})):n.createElement(f,l({ref:t},s))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}u.displayName="MDXCreateElement"},58905:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-08-04-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-04-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-goedel.md",source:"@site/blog/2023-08-04-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.43,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-08-04-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-04-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-04-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is formalising mini protocols and also further developing the\nperformance modelling prototype."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Developing new framework for specification and verification of\nmini-protocols which is closer to the Haskell implementation.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Developed a new internal representation for the DeltaQ algebra that\nallows for more modularity in backend implementations")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Discussions regarding the Cardano networking specification"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c0cf6239.cd90552c.js b/assets/js/c0cf6239.cd90552c.js new file mode 100644 index 00000000000..b8c16d5c3e7 --- /dev/null +++ b/assets/js/c0cf6239.cd90552c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53482],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>k});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=u(n),c=o,k=d["".concat(s,".").concat(c)]||d[c]||m[c]||i;return n?a.createElement(k,r(r({ref:t},p),{},{components:n})):a.createElement(k,r({ref:t},p))}));function k(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:o,r[1]=l;for(var u=2;u<i;u++)r[u]=n[u];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}c.displayName="MDXCreateElement"},29025:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(87462),o=(n(67294),n(3905));const i={title:"Network Quarterly Update",slug:"2023-01-13-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},r=void 0,l={permalink:"/cardano-updates/quarterly/2023-01-13-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-13-network.md",source:"@site/quarterly/2023-01-13-network.md",title:"Network Quarterly Update",description:"Network Quarterly Update",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:4.125,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Quarterly Update",slug:"2023-01-13-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-18-consensus"},nextItem:{title:"Open-Source Update",permalink:"/cardano-updates/quarterly/2023-01-13-open-source"}},s={authorsImageUrls:[void 0]},u=[{value:"Network Quarterly Update",id:"network-quarterly-update",level:2},{value:"2022-11 - 2023-01",id:"2022-11---2023-01",level:2},{value:"Summary",id:"summary",level:3},{value:"Next steps",id:"next-steps",level:3},{value:"Risks",id:"risks",level:3},{value:"Detailed log",id:"detailed-log",level:3},{value:"Contributions to Ouroboros-Network",id:"contributions-to-ouroboros-network",level:4},{value:"Contributions to Cardano-Node",id:"contributions-to-cardano-node",level:4},{value:"Contributions to IOSim",id:"contributions-to-iosim",level:4}],p={toc:u},d="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"network-quarterly-update"},"Network Quarterly Update"),(0,o.kt)("h2",{id:"2022-11---2023-01"},"2022-11 - 2023-01"),(0,o.kt)("h3",{id:"summary"},"Summary"),(0,o.kt)("p",null,"The primary goal of the networking team was to focus on the single relay\nrelease of P2P. We fixed a number of small late bugs, and concluded QA\n& performance testing. Although it was discovered a regression in performance\nof block production when P2P is enabled, relaying with P2P performs better\ncomparing to a non p2p. We concluded that this is not a blocker for the Single\nRelay Release which is planned shortly."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"Peer sharing")," has gone through review and final review is\njust being done right now. After merging it will still be disabled (hidden\nbehind a flag) as it's not safe without eclipse evasion. We started\nimplementing light peer sharing (i.e. include inbound peers into known peer set\nof the outbound governor)."),(0,o.kt)("p",null,"We started a detailed eclipse evasion design, it will continue in the next\nquarter."),(0,o.kt)("p",null,"We also made a major revision of package structure of the network packages. We\nended up with a very clean dependency graph (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4155"},"pr #4155"),")."),(0,o.kt)("p",null,"Armando Santos delivered a talk at the ",(0,o.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/armando-details.html"},"ODOPIS 2022")," conference on principles\nof distributed systems in Brussels. The slides are available ",(0,o.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/slides/OPODIS2022-slides-Santos.pdf"},"here"),"."),(0,o.kt)("p",null,"Neil Davies gave an invited seminar on ",(0,o.kt)("inlineCode",{parentName:"p"},"DeltaQ")," at Universit\xe9 Catholique de\nLouvain."),(0,o.kt)("p",null,"We also found and fixed a few of bugs:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"a bug in keep alive mini-protocol which resulted in warm to cold transitions\nto be always executed through a timeout path rather than do a clean demotion\n(","[pr #4168]",").")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"fixed an assetion failure in the outbound governor (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177"),") "))),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"we fixed DNS test failure ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4191"},"issue #4191"))),(0,o.kt)("h3",{id:"next-steps"},"Next steps"),(0,o.kt)("p",null,"We will work towards the next release of P2P for block producer nodes. This includes:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"analysing performance regression for BP nodes when using P2P"),(0,o.kt)("li",{parentName:"ul"},"finish the work on controlling the block forger through node kernel (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3800"},"pr #3800"),")"),(0,o.kt)("li",{parentName:"ul"},"address ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3907"},"issue #3907")," and write a script to analyse deployment of P2P relays")),(0,o.kt)("p",null,"We would like also to push forward eclipse evasion. Although most of the work\nhas be done already the release of ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim")," on ",(0,o.kt)("inlineCode",{parentName:"p"},"Hackage")," will happen in the\nnext quarter."),(0,o.kt)("p",null,"We would also like to address ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4244"},"chain-sync timeout issue")," recently\ndiagnosed by Karl Knutsson."),(0,o.kt)("p",null,"If time permits we would also like to address some technical debt, especially:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3387"},"enable nothunk in diffusion tests")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4085"},"refactor diffusion testnet simulation"))),(0,o.kt)("h3",{id:"risks"},"Risks"),(0,o.kt)("p",null,"The performance regression for block producer with P2P needs to be investigated\nin the near future. This is blocker for the release of P2P on BP nodes."),(0,o.kt)("h3",{id:"detailed-log"},"Detailed log"),(0,o.kt)("h4",{id:"contributions-to-ouroboros-network"},"Contributions to Ouroboros-Network"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We added ",(0,o.kt)("inlineCode",{parentName:"li"},"TraceDemoteLocalAsynchronous"),", which enables notification of critical issues for SPOs"),(0,o.kt)("li",{parentName:"ul"},"We fixed ",(0,o.kt)("inlineCode",{parentName:"li"},"cardano-ping")," compatibility with ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToNodeV_10")," (P2P, ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4165"},"pr #4165"),")"),(0,o.kt)("li",{parentName:"ul"},"We fixed a bug in demotion peers to cold which affected P2P nodes (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4170/commits/61058aa5c28a144d723aae183d1745552d757334"},"commit-61058aa5c2"),")"),(0,o.kt)("li",{parentName:"ul"},"Karl Knutsson enhanced ",(0,o.kt)("inlineCode",{parentName:"li"},"SendFetchRequest")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4170/commits/bb1c3dddeea78949f531c144bb4f2669eddf7f47"},"commit-bb1c3dddee"),"), open-source contribution)"),(0,o.kt)("li",{parentName:"ul"},"We turned ",(0,o.kt)("inlineCode",{parentName:"li"},"SizeInBytes")," into a newtype."),(0,o.kt)("li",{parentName:"ul"},"We extended ",(0,o.kt)("inlineCode",{parentName:"li"},"CONTRIBUTING.md"),", ",(0,o.kt)("inlineCode",{parentName:"li"},"README.md"),", added ",(0,o.kt)("inlineCode",{parentName:"li"},"CODE_OF_CONDUCT"),"."),(0,o.kt)("li",{parentName:"ul"},"We fixed DNS test failure ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4191"},"issue #4191")),(0,o.kt)("li",{parentName:"ul"},"We fixed a simulation bug found in ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4258"},"issue #4258")),(0,o.kt)("li",{parentName:"ul"},"[pr #4168]"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177"))),(0,o.kt)("h4",{id:"contributions-to-cardano-node"},"Contributions to Cardano-Node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We maintained the Single Relay Release ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4612"},"pr #4612"),", (e.g. fixing CI issues,\nRebasing it when necessary, publishing packages to Cardano Haskell Packages);"),(0,o.kt)("li",{parentName:"ul"},"We enhanced ",(0,o.kt)("inlineCode",{parentName:"li"},"JSON")," serialisation / deserialisation of ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToNodeVersion")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToClientVersion"),";")),(0,o.kt)("h4",{id:"contributions-to-iosim"},"Contributions to IOSim"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We started to use Cardano Haskell Packages for ",(0,o.kt)("inlineCode",{parentName:"li"},"IOSim")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/48"},"pr #48"),")"),(0,o.kt)("li",{parentName:"ul"},"We updated change log files"),(0,o.kt)("li",{parentName:"ul"},"We added support of ",(0,o.kt)("inlineCode",{parentName:"li"},"ghc-9.4")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/50"},"pr #50"),")")),(0,o.kt)("p",null,"We also addressed the following issues in ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"pr #57")," in order to prepare the package for publication on Hackage:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"refactored ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," timers API (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/issues/46"},"issue #46"),");"),(0,o.kt)("li",{parentName:"ul"},"created a new package ",(0,o.kt)("inlineCode",{parentName:"li"},"si-timers")," which exposes an interface using SI units\nand is safe on 32-bit systems (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/issues/59"},"issue #59"),");"),(0,o.kt)("li",{parentName:"ul"},"added monad transformers instances for classes defined in ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/issues/58"},"issue #58"),");"),(0,o.kt)("li",{parentName:"ul"},"created ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes-mtl")," package which includes (experimental) instances for monad transformers;"),(0,o.kt)("li",{parentName:"ul"},"provide ",(0,o.kt)("inlineCode",{parentName:"li"},"MonadMonotonicTimeNSec")," in ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"MonadMonotonicTime")," in ",(0,o.kt)("inlineCode",{parentName:"li"},"si-timers")," (so that ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," follow the ",(0,o.kt)("inlineCode",{parentName:"li"},"base")," package);"),(0,o.kt)("li",{parentName:"ul"},"added ",(0,o.kt)("inlineCode",{parentName:"li"},"registerCancellableDelay")," in ",(0,o.kt)("inlineCode",{parentName:"li"},"si-timers")," (which allowed us to hide fancy timer api and clean ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes"),")"),(0,o.kt)("li",{parentName:"ul"},"added support for ",(0,o.kt)("inlineCode",{parentName:"li"},"js_HOST_ARCH")," (the new GHC JS backend)")),(0,o.kt)("p",null,"Note the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"pr #57")," contains almost 40 commits, and was a major step forward for\n",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim")," ecosystem. We also prepared a draft ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4281"},"pr #4281")," which updates\n",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"."),(0,o.kt)("p",null,"Other changes for ",(0,o.kt)("inlineCode",{parentName:"p"},"1.0.0.0")," release on Hackage:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Refactored test suite (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/47"},"pr #47"),")"),(0,o.kt)("li",{parentName:"ul"},"Updated documentation, cabal files, ",(0,o.kt)("inlineCode",{parentName:"li"},"CONTRIBUTING"),", ",(0,o.kt)("inlineCode",{parentName:"li"},"SECURITY")," documents, etc in ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/60"},"pr #60"),", currently under review.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c10365f3.472f2046.js b/assets/js/c10365f3.472f2046.js new file mode 100644 index 00000000000..097251c2175 --- /dev/null +++ b/assets/js/c10365f3.472f2046.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7783],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>d});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,r,a=function(e,t){if(null==e)return{};var i,r,a={},n=Object.keys(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(i),c=a,d=s["".concat(p,".").concat(c)]||s[c]||m[c]||n;return i?r.createElement(d,o(o({ref:t},h),{},{components:i})):r.createElement(d,o({ref:t},h))}));function d(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,i)}c.displayName="MDXCreateElement"},3827:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-04-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-04-20-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-20-mithril.md",source:"@site/blog/2023-04-20-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-04-20T00:00:00.000Z",formattedDate:"April 20, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.245,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-04-20-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-04-21-ledger"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-20-node-cli-api"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...i}=e;return(0,a.kt)(s,(0,r.Z)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team released a new ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2315.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2315.0"))," distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures."),(0,a.kt)("p",null,"Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2315.0"},(0,a.kt)("inlineCode",{parentName:"a"},"2315.0"))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic that implements a relational store in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/779"},"#779"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signed_entity")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/816"},"#816")),(0,a.kt)("li",{parentName:"ul"},"Completed the creation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"signer")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/814"},"#814")),(0,a.kt)("li",{parentName:"ul"},"Completed the migration/adaptation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"single_signature")," table ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/829"},"#829")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implement generic signing/verification of entity services ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the definition of the interface of the generic entity service for signing ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/847"},"#847")),(0,a.kt)("li",{parentName:"ul"},"Worked on the implementation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"Certifier")," service in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/850"},"#850")),(0,a.kt)("li",{parentName:"ul"},"Completed the extension of the ",(0,a.kt)("inlineCode",{parentName:"li"},"SignedEntityType")," type ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/848"},"#848")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"Tick")," service in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/849"},"#849")),(0,a.kt)("li",{parentName:"ul"},"Worked on implementing the signable builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Mithril Stake Distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/851"},"#851"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c178b56c.3e187747.js b/assets/js/c178b56c.3e187747.js new file mode 100644 index 00000000000..ebf998dc8ac --- /dev/null +++ b/assets/js/c178b56c.3e187747.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92255],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=p(n),c=o,m=d["".concat(l,".").concat(c)]||d[c]||h[c]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:o,i[1]=s;for(var p=2;p<a;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}c.displayName="MDXCreateElement"},80883:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var r=n(87462),o=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-09-01-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-09-01-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-network.md",source:"@site/blog/2023-09-01-network.md",title:"Network Team Update",description:"High-level overview of sprint 43",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.765,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-09-01-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-01-ledger"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-01-sre"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level overview of sprint 43",id:"high-level-overview-of-sprint-43",level:2},{value:"Progress on P2P addoption",id:"progress-on-p2p-addoption",level:3},{value:"SPO relays",id:"spo-relays",level:4},{value:"IOG relays",id:"iog-relays",level:4},{value:"Detailed description",id:"detailed-description",level:2},{value:"Peer Sharing",id:"peer-sharing",level:2},{value:"Async Demotion Test Fix",id:"async-demotion-test-fix",level:2}],u={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,o.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-overview-of-sprint-43"},"High-level overview of ",(0,o.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+43%22"},"sprint 43")),(0,o.kt)("p",null,"In this sprint, we received contributions from ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF")," & ",(0,o.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois"),". Karl Knutsson\n(",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF"),") has addressed various issues regarding peer churning in P2P, timeouts\nand our ",(0,o.kt)("inlineCode",{parentName:"p"},"WireShark")," dissector. While the ",(0,o.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois")," developers focused on\naddressing issues from their review last year. See below for more details."),(0,o.kt)("p",null,"We continued working on bootstrap peers ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661"),"."),(0,o.kt)("p",null,"We refactored our test suites: they are split into ",(0,o.kt)("inlineCode",{parentName:"p"},"io-tests")," which require to\nbe run natively on all platforms (these tests mostly contain tests that\nrequire ",(0,o.kt)("inlineCode",{parentName:"p"},"IO")," system calls) and ",(0,o.kt)("inlineCode",{parentName:"p"},"sim-tests")," which are platform independent. We\nrun ",(0,o.kt)("inlineCode",{parentName:"p"},"io-tests")," on all supported platforms (e.g. ",(0,o.kt)("inlineCode",{parentName:"p"},"x86_64-linux"),",\n",(0,o.kt)("inlineCode",{parentName:"p"},"x86-64-darwin"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"aarch64-darwin")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"x86_64-w64-mingw32")," (Windows)) natively.\nThe ",(0,o.kt)("inlineCode",{parentName:"p"},"sim-tests")," are not executed on ",(0,o.kt)("inlineCode",{parentName:"p"},"Windows")," due to memory limitations on\nGitHub Actions runners. ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4653"},"ouroboros-network-#4653")),(0,o.kt)("p",null,"We also started rebasing ",(0,o.kt)("inlineCode",{parentName:"p"},"typed-protocols")," refactoring branches."),(0,o.kt)("p",null,"Marcin was appointed as the ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," release engineer for the ",(0,o.kt)("inlineCode",{parentName:"p"},"8.4.0-pre"),"\nversion. So far he integrated ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger-conway-1.8")," and\n",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.9.1.0")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-cli")," and\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-api"),". Once we will have an integration branch for ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node"),",\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ledger-conway-1.8")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," packages can be released\nto ",(0,o.kt)("inlineCode",{parentName:"p"},"CHaP")," and PRs can be merged once they go through review & CI."),(0,o.kt)("p",null,"We also fixed some smaller issues regarding peer sharing (both were discovered\nby Karl from ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF"),"). More details are included below."),(0,o.kt)("h3",{id:"progress-on-p2p-addoption"},"Progress on P2P addoption"),(0,o.kt)("h4",{id:"spo-relays"},"SPO relays"),(0,o.kt)("p",null,"There are currently ~2000 relays running P2P\nenabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On\n16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil\nAda."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"P2P relays",src:n(86597).Z,width:"2034",height:"1588"})),(0,o.kt)("p",null,"The following graphs show several different versions of relays running on the mainnet. The\ngreen line ",(0,o.kt)("inlineCode",{parentName:"p"},"NodeToNodeVersionV10.True")," denotes P2P relays, which slowly\nincrease over time. The ",(0,o.kt)("inlineCode",{parentName:"p"},"V9")," and earlier versions of the ",(0,o.kt)("inlineCode",{parentName:"p"},"node-to-node"),"\nthe protocol indicates nodes version ",(0,o.kt)("inlineCode",{parentName:"p"},"1.35.x")," or earlier.\n",(0,o.kt)("img",{alt:"node versions",src:n(31567).Z,width:"2038",height:"1594"})),(0,o.kt)("p",null,"Data has been kindly provided by ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF")," and their mainnet monitoring\ninfrastructure."),(0,o.kt)("h4",{id:"iog-relays"},"IOG relays"),(0,o.kt)("p",null,"As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all\nIOG relays will be running P2P."),(0,o.kt)("h2",{id:"detailed-description"},"Detailed description"),(0,o.kt)("p",null,"In this sprint, we got a few contributions from ",(0,o.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"CF"),":"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Karl made peer churning mechanism less aggressive ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4656"},"ouroboros-network-#4656"),"; and"),(0,o.kt)("li",{parentName:"ul"},"he added timeouts for idle states in ",(0,o.kt)("inlineCode",{parentName:"li"},"ChainSync")," & ",(0,o.kt)("inlineCode",{parentName:"li"},"KeepAlive"),"\nminiprotocols. These timeouts help a node remove idle connections from the\nresponder (server) side ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4648"},"ouroboros-network-#4648"),"."),(0,o.kt)("li",{parentName:"ul"},"he improved the ",(0,o.kt)("inlineCode",{parentName:"li"},"WireShark")," dissector by adding support for the ",(0,o.kt)("inlineCode",{parentName:"li"},"peer-sharing")," mini-protocol ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4656"},"ouroboros-network-#4656"),".")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois")," has been making progress in addressing some of the issues they raised in their review (last year):"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Mark Tullsen (",(0,o.kt)("a",{parentName:"li",href:"https://galois.com/"},"Galois"),") has been working on refactoring the main entry function of P2P ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661")," (in review);"),(0,o.kt)("li",{parentName:"ul"},"Sam Cowger (",(0,o.kt)("a",{parentName:"li",href:"https://galois.com/"},"Galois"),") has been reviewing all use cases of ",(0,o.kt)("inlineCode",{parentName:"li"},"error")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"unsafe")," calls\n",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4661"},"ouroboros-network-#4661")," (in review).")),(0,o.kt)("h2",{id:"peer-sharing"},"Peer Sharing"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Light peer sharing is only enabled when peer sharing is turned on ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4652"},"ouroboros-network-#4652"),";"),(0,o.kt)("li",{parentName:"ul"},"Handshake incorrectly reports peer sharing value. It's supposed to relay the\nremote value, but instead, it returns the local value. ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4642"},"ouroboros-network-#4642")," (in review).")),(0,o.kt)("h2",{id:"async-demotion-test-fix"},"Async Demotion Test Fix"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We fixed an async demotion test failure which turned out to be a weakness of\nthe test itself rather than a bug in the connection manager. ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4655"},"ouroboros-network-#4655"))))}h.isMDXComponent=!0},86597:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/2023-08-31-p2p-relays-8e5be189ad8437375c5067026c003556.png"},31567:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/2023-08-31-relay-versions-0a8d445e1b0f3a793ccdd94f4aacd421.png"}}]); \ No newline at end of file diff --git a/assets/js/c1c5c6f5.bba09171.js b/assets/js/c1c5c6f5.bba09171.js new file mode 100644 index 00000000000..84036e13b36 --- /dev/null +++ b/assets/js/c1c5c6f5.bba09171.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95569],{9564:a=>{a.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"quarterly"}')}}]); \ No newline at end of file diff --git a/assets/js/c2b4dd94.778afa9a.js b/assets/js/c2b4dd94.778afa9a.js new file mode 100644 index 00000000000..6fed4e577da --- /dev/null +++ b/assets/js/c2b4dd94.778afa9a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43020],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),m=s(n),p=a,h=m["".concat(l,".").concat(p)]||m[p]||d[p]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:a,i[1]=c;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},79021:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-07-12-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-07-12-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-12-performance-and-tracing.md",source:"@site/blog/2023-07-12-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-07-12T00:00:00.000Z",formattedDate:"July 12, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.29,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-07-12-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-12-consensus"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-07-07-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:s},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Optimization of the new tracing system is ongoing and yielding good performance results."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"Our analysis of the GHC9 build of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation. "),(0,a.kt)("p",null,"In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),". This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run. "),(0,a.kt)("p",null,"Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c2eec07f.f7406fac.js b/assets/js/c2eec07f.f7406fac.js new file mode 100644 index 00000000000..d82b11029b4 --- /dev/null +++ b/assets/js/c2eec07f.f7406fac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35388],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function o(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,c=o(t,["components","mdxType","originalType","parentName"]),d=u(a),h=r,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||i;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,l=new Array(i);l[0]=h;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[d]="string"==typeof t?t:r,l[1]=o;for(var u=2;u<i;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},6988:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-07-04-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-07-04-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-04-node-cli-api.md",source:"@site/blog/2023-07-04-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-07-04T00:00:00.000Z",formattedDate:"July 4, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.495,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-07-04-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-07-04-db-sync"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-30-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},d="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-06-21---2023-07-04"},"2023-06-21 - 2023-07-04"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Started integration of conway era into the cardano-api,"),(0,r.kt)("li",{parentName:"ul"},'Pre-release of cardano-cli 8.2.1 which enables creating goveranance "Update constitution" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.'),(0,r.kt)("li",{parentName:"ul"},"Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities."),(0,r.kt)("li",{parentName:"ul"},"Continue refactoring cardano-testnet"),(0,r.kt)("li",{parentName:"ul"},"CI and docs house keeping on the new cardnao-cli and cardano-api repositories")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/60"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.7.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/44"},"Release 8.2.1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/39"},"Use new function-based API instead of using query data types directly"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/94"},"Release cardano-api 8.7")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/92"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.6.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/90"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.2.0.0.1.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/88"},"Backport: Add era phantom type parameter to Certificate")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/86"},"Parameterise ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate")," type with phantom ",(0,r.kt)("inlineCode",{parentName:"a"},"era")," type argument")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/85"},"Voting procedure and proposal procedure updates")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/84"},"Parameterise ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate")," with ",(0,r.kt)("inlineCode",{parentName:"a"},"era"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/83"},"Parameterise ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate")," type with phantom ",(0,r.kt)("inlineCode",{parentName:"a"},"era")," type argument")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/79"},"Add contributing guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/77"},"Unified ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra")," constraint summoning")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/70"},"Update CHaP index")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/41"},"CIP-1694 API - Part 1"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5356"},"cardano-node top level error handler")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5353"},"Turn on some traces by default"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5364"},"Report payment address and UTxOs in testnets")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5362"},"New Conway ",(0,r.kt)("inlineCode",{parentName:"a"},"stake-snapshot")," tests"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/79"},"Add contributing guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/33"},"Release workflow description")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5353"},"Turn on some traces by default"))),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/75"},"Add PR changelog check")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/71"},"Fix stylish haskell in github action workflow")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/62"},"Enable CI on PRs from forks")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/53"},"Remove merge_group trigger from changelog check CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/46"},"Add PR changelog check. Add core-tech group to GHA description codeowners.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/41"},"Fix stylish haskell in github action workflow")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/40"},"Enable CI in PRs from forks")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/48"},"Add contributing guide"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c315164d.90ef02cc.js b/assets/js/c315164d.90ef02cc.js new file mode 100644 index 00000000000..ac856b47bc7 --- /dev/null +++ b/assets/js/c315164d.90ef02cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43194],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),m=a,d=h["".concat(s,".").concat(m)]||h[m]||c[m]||i;return r?n.createElement(d,o(o({ref:t},u),{},{components:r})):n.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<i;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},64268:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const i={title:"Mithril Team Update",slug:"2023-01-12-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-12-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-12-mithril.md",source:"@site/blog/2023-01-12-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-01-12T00:00:00.000Z",formattedDate:"January 12, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.165,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-01-12-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-01-13-system-test"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-11-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ",(0,a.kt)("a",{parentName:"p",href:"https://mithril.network/doc/adr/4"},"ADR"),". They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible."),(0,a.kt)("p",null,"Finally, they have worked on upgrading the ",(0,a.kt)("inlineCode",{parentName:"p"},"devnet")," and fixing some flakiness in the end to end tests of the CI."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Implemented the redaction of an ADR for handling graceful updates of the Mithril Network ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/671"},"#671")),(0,a.kt)("li",{parentName:"ul"},"Worked on a proof of concept to handle backward compatibilty of exchanged messages with ",(0,a.kt)("inlineCode",{parentName:"li"},"protobuf")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/677"},"#677")),(0,a.kt)("li",{parentName:"ul"},"Worked on a proof of concept to handle backward compatibilty of exchanged messages with ",(0,a.kt)("inlineCode",{parentName:"li"},"avro")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/678"},"#678")),(0,a.kt)("li",{parentName:"ul"},"Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/672"},"#672")),(0,a.kt)("li",{parentName:"ul"},"Worked on upgrading the Cardano node of the Mithril ",(0,a.kt)("inlineCode",{parentName:"li"},"devnet"),", as well as fixing flakiness of the CI ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/523"},"#523")),(0,a.kt)("li",{parentName:"ul"},"Prepared and tested the new ",(0,a.kt)("inlineCode",{parentName:"li"},"2302")," distribution pre-release ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2302.0-prerelease"},"2302.0-prerelease")),(0,a.kt)("li",{parentName:"ul"},"Updated the documentation for SPO to build a signer node in order to better reflect the new release process ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/681"},"#681"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c4479859.8309a90c.js b/assets/js/c4479859.8309a90c.js new file mode 100644 index 00000000000..3886439b70f --- /dev/null +++ b/assets/js/c4479859.8309a90c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73321],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),u=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=u(e.components);return n.createElement(o.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),d=u(a),k=r,h=d["".concat(o,".").concat(k)]||d[k]||c[k]||l;return a?n.createElement(h,i(i({ref:t},m),{},{components:a})):n.createElement(h,i({ref:t},m))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p[d]="string"==typeof e?e:r,i[1]=p;for(var u=2;u<l;u++)i[u]=a[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},92606:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const l={title:"Node API & CLI Team Update",slug:"2023-06-07-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},i="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-06-07-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-07-node-cli-api.md",source:"@site/blog/2023-06-07-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-06-07T00:00:00.000Z",formattedDate:"June 7, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.37,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-06-07-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-06-08-system-test"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-02-hydra"}},o={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],m={toc:u},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-06-07---2023-06-20"},"2023-06-07 - 2023-06-20"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Completed cardano-cli migration to input-output-hk/cardano-cli"),(0,r.kt)("li",{parentName:"ul"},"cardano-cli ping now uses cardano-ping-0.2.0.5"),(0,r.kt)("li",{parentName:"ul"},"New queries on API:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryCurrentEpochState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryDebugLedgerState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryGenesisParameters")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryPoolDistribution")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryPoolState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryProtocolParameters")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryProtocolParametersUpdate")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryProtocolState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakeAddresses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakeDistribution")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakePoolParameters")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakeSnapshot")))),(0,r.kt)("li",{parentName:"ul"},"Deprecate:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryPparams")))),(0,r.kt)("li",{parentName:"ul"},"Export query API as functions",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"genFeatureValueInEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"featureInShelleyBasedEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"isFeatureValue")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"valueOrDefault")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"asFeatureValue")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"asFeatureValueInShelleyBasedEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryEpoch")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"requireShelleyBasedEra")))),(0,r.kt)("li",{parentName:"ul"},"Restructure cardano-testnet (WIP)")),(0,r.kt)("hr",null),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5328"},"update network dependency and versions"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5326"},"Updated cardano-cli to use ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-ping-0.2.0.5"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5316"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli")," from CHaP"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5315"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"Updated cardano-cli ping command"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5311"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30"},"Use cardano-ping-0.2.0.5"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/28"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"--protocol-params-file")," option of the ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction build")," command more thoroughly"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/25"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Api.Query.Expr")," module"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/24"},"Use simplified ",(0,r.kt)("inlineCode",{parentName:"a"},"queryStateForBalancedTx")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/20"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/59"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.5.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/58"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"requireShelleyBasedEra")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/57"},"New version cardano-api-8.5.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/56"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"queryEpoch")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/55"},"New version 8.5.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/54"},"Error on ",(0,r.kt)("inlineCode",{parentName:"a"},"hlint")," warnings in CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/53"},"Additional query expression functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/52"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.4.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/49"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.3.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/48"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Api.Query.Expr")," module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/47"},"Simplify ",(0,r.kt)("inlineCode",{parentName:"a"},"queryStateForBalancedTx"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/46"},"Revert to use ",(0,r.kt)("inlineCode",{parentName:"a"},"testProperty")," now that it isn't deprecated anymore"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.1.1"},"cardano-node 8.1.1 release")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5328"},"update network dependency and versions"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5340"},"Add ability to retry tests with DISABLE_RETRIES=1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5339"},"Move golden files to proper location")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5336"},"Conway testnet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5335"},"Don't retry testnet when failed")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5321"},"Remove YAML filepath record from data Conf")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5315"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5311"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5309"},"Remove duplicate --testnet-magic flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5307"},"Restructure cardano testnet "))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/18"},"Fix Windows CI issues"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c511c40f.0dd3f662.js b/assets/js/c511c40f.0dd3f662.js new file mode 100644 index 00000000000..311bc97d929 --- /dev/null +++ b/assets/js/c511c40f.0dd3f662.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94922],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},c),{},{components:n})):r.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var u=2;u<o;u++)s[u]=n[u];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},63417:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-05-17-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-05-17-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-consensus.md",source:"@site/blog/2023-05-17-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-05-17T00:00:00.000Z",formattedDate:"May 17, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.285,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-05-17-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-19-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-17-mithril"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the ","[Genesis][#genesis]"," section for more details."),(0,a.kt)("p",null,"Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our ",(0,a.kt)("inlineCode",{parentName:"p"},"main")," branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain."),(0,a.kt)("p",null,"We improved our tooling by releasing an ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/68"},"immutable DB server"),", which can be used for testing and benchmarking purposes, and a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/70"},(0,a.kt)("inlineCode",{parentName:"a"},"db-truncater"))," program, which can be used in disaster recovery and benchmarking scenarios."),(0,a.kt)("h2",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"The consensus team working on Genesis:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Improved the genesis selection rule as a result of our interaction with IO Research."),(0,a.kt)("li",{parentName:"ul"},"Studied how the hard-fork combinator handles forecasting at era transitions, and ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/89"},"improved our documentation"),"."),(0,a.kt)("li",{parentName:"ul"},"Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP."),(0,a.kt)("li",{parentName:"ul"},"Elaborated concrete proposal for the Genesis State Machine."),(0,a.kt)("li",{parentName:"ul"},"Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).")),(0,a.kt)("p",null,"The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c5858ebd.c70ee4f9.js b/assets/js/c5858ebd.c70ee4f9.js new file mode 100644 index 00000000000..0a59944f47d --- /dev/null +++ b/assets/js/c5858ebd.c70ee4f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95199],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function p(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?p(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):p(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function u(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},p=Object.keys(e);for(n=0;n<p.length;n++)a=p[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(n=0;n<p.length;n++)a=p[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),i=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},h=function(e){var t=i(e.components);return n.createElement(o.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,p=e.originalType,o=e.parentName,h=u(e,["components","mdxType","originalType","parentName"]),d=i(a),c=r,m=d["".concat(o,".").concat(c)]||d[c]||s[c]||p;return a?n.createElement(m,l(l({ref:t},h),{},{components:a})):n.createElement(m,l({ref:t},h))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var p=a.length,l=new Array(p);l[0]=c;var u={};for(var o in t)hasOwnProperty.call(t,o)&&(u[o]=t[o]);u.originalType=e,u[d]="string"==typeof e?e:r,l[1]=u;for(var i=2;i<p;i++)l[i]=a[i];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},16011:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>s,frontMatter:()=>p,metadata:()=>u,toc:()=>i});var n=a(87462),r=(a(67294),a(3905));const p={title:"Ledger Team Update",slug:"2023-04-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,u={permalink:"/cardano-updates/quarterly/2023-04-03-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-03-ledger.md",source:"@site/quarterly/2023-04-03-ledger.md",title:"Ledger Team Update",description:"Ledger Quarterly Update",date:"2023-04-03T00:00:00.000Z",formattedDate:"April 3, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/quarterly/tags/ledger"}],readingTime:6.405,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-04-03-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Network Q1 2023 Update",permalink:"/cardano-updates/quarterly/2023-04-04-network"},nextItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-18-consensus"}},o={authorsImageUrls:[void 0]},i=[{value:"Ledger Quarterly Update",id:"ledger-quarterly-update",level:2},{value:"2023-01 - 2023-03",id:"2023-01---2023-03",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"CIPs",id:"cips",level:4},{value:"Formal ledger model",id:"formal-ledger-model",level:4},{value:"Conway ledger era",id:"conway-ledger-era",level:4},{value:"DRep stake distribution computation",id:"drep-stake-distribution-computation",level:4},{value:"Integration work",id:"integration-work",level:4},{value:"Deposit tracking",id:"deposit-tracking",level:4},{value:"New ledger API",id:"new-ledger-api",level:4},{value:"Constraint-based generators",id:"constraint-based-generators",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Critical fixes",id:"critical-fixes",level:5},{value:"Next steps",id:"next-steps",level:3},{value:"More details",id:"more-details",level:3}],h={toc:i},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"ledger-quarterly-update"},"Ledger Quarterly Update"),(0,r.kt)("h2",{id:"2023-01---2023-03"},"2023-01 - 2023-03"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"cips"},"CIPs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Entering the Voltaire phase")," -\nCIP-1694 received a major update after participation in the design has expanded to\nmore and more people, including those who attended the Colorado workshop.\nSee ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Ledger CIP category")," -\nThe ledger team continues to embrace the CIP process, and has begun the process of\nregistering the ledger as an official CIP category.\nSee ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/456"},"CIP-84"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Ledger serialization")," -\nA CIP for the ledger serialization deprecation cycle has been accepted.\nSee ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/tree/master/CIP-0080"},"CIP-80"),".")),(0,r.kt)("h4",{id:"formal-ledger-model"},"Formal ledger model"),(0,r.kt)("p",null,"Our new formal specifications backed by Agda have seen a lot of progress.\nThe majority of the ideas in CIP-1694 are now present, and we have made enough progress\nthat we can now safely say that the PDF produced by the Agda model will be the\nofficial ledger specification for the Conway ledger era.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"the repository"),"."),(0,r.kt)("h4",{id:"conway-ledger-era"},"Conway ledger era"),(0,r.kt)("p",null,"Progress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model.\nThe major component still missing is the DRep stake distribution, which still presents some\ntechnical challenges."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3176"},"pull-3176"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3216"},"pull-3216"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3226"},"pull-3226"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3291"},"pull-3291"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3326"},"pull-3326"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3330"},"pull-3330"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3339"},"pull-3339"),"]"),(0,r.kt)("h4",{id:"drep-stake-distribution-computation"},"DRep stake distribution computation"),(0,r.kt)("p",null,"Adding another large stake distribution to the ledger state must proceed with caution.\nWe do not want the memory used by the node to increase too much,\nand performance problems can lead to reduced block production.\nWe have prototyped, tested, and benchmarked several approaches that could give us\nthe current DRep stake distribution at each epoch boundary.\nThis has very important implications, since we want every ADA holder to be able to at any\ntime (such as during a contentious vote) register themselves as a DRep and still have time\nto vote themselves on the issue."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3344"},"pull-3344"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3353"},"pull-3353"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3364"},"pull-3364"),"]"),(0,r.kt)("h4",{id:"integration-work"},"Integration work"),(0,r.kt)("p",null,"The ledger has made some wonderful improvements over the past six months,\nbut which entail a significant amount of integration efforts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Our new versioned CBOR schemes"),(0,r.kt)("li",{parentName:"ul"},"Individual deposit tracking"),(0,r.kt)("li",{parentName:"ul"},"An improved cross-era interface utilizing lenses"),(0,r.kt)("li",{parentName:"ul"},"A new ledger API"),(0,r.kt)("li",{parentName:"ul"},"Re-arranging the ledger stake in preparation for CIP-1694"),(0,r.kt)("li",{parentName:"ul"},"Versioning our Haskell packages\nusing ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaPs"),"."),(0,r.kt)("li",{parentName:"ul"},"Consistent conventions for variable names")),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3279"},"pull-3279"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3282"},"pull-3282"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3288"},"pull-3288"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3289"},"pull-3289"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3292"},"pull-3292"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3297"},"pull-3297"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3298"},"pull-3298"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3299"},"pull-3299"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3300"},"pull-3300"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3302"},"pull-3302"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3303"},"pull-3303"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3308"},"pull-3308"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3342"},"pull-3342"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3345"},"pull-3345"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3356"},"pull-3356"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3357"},"pull-3357"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3360"},"pull-3360"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3361"},"pull-3361"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3363"},"pull-3363"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4349"},"pull-4349"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/378"},"pull-378"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/376"},"pull-376"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/373"},"pull-373"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/370"},"pull-370"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/361"},"pull-361"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4976"},"pull-4976"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5013"},"pull-5013"),"]"),(0,r.kt)("h4",{id:"deposit-tracking"},"Deposit tracking"),(0,r.kt)("p",null,"Individual deposits (for stake credential and stake pool registrations) were not tracked by the ledger.\nDeposits were returned according to the current protocol parameters.\nWhen the values of these two protocol parameters change, the deposit pot\nis adjusted by adding to, or removing from, the reserves."),(0,r.kt)("p",null,"This has several problems:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Most people expect a deposit to be paid back exactly."),(0,r.kt)("li",{parentName:"ul"},"We cannot increase the deposit amount once the reserves hits zero."),(0,r.kt)("li",{parentName:"ul"},"If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials."),(0,r.kt)("li",{parentName:"ul"},"Because of the problems above, it is going to be incredibly hard to ever change the values."),(0,r.kt)("li",{parentName:"ul"},"There is a serious issue involving hard forks.\nThe consensus layer makes the decision about whether or not to enact a hard fork based on\nthe protocol parameter update state two stability windows before the end of the epoch.\nHowever, the ledger will reject a protocol parameter update on the epoch boundary\nif the deposit pot adjustments cannot be reconciled with the reseve pot.\nThis means that if quorum is met regarding changing the major protocol version,\nbut the update is rejected on the epoch boundary, consensus will change the era but the\nledger will not change the major protocol version, leaving the ledger in a split-brain state.")),(0,r.kt)("p",null,"Because we never actually changed the values of the two deposits amounts in the protocol parameters\non mainnet, we were able to retroactively change the behavior.\nWe made the following changes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Individual deposits are tracked in the ",(0,r.kt)("inlineCode",{parentName:"li"},"DState"),"."),(0,r.kt)("li",{parentName:"ul"},"The amount deposited is always returned.")),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3195"},"pull-3195"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3202"},"pull-3202"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3217"},"pull-3217"),"]"),(0,r.kt)("h4",{id:"new-ledger-api"},"New ledger API"),(0,r.kt)("p",null,"We have significantly built up the ledger API.\nWe will eventually replace much of the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-api")," in the node repository with this ledger API."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3242"},"pull-3242"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3248"},"pull-3248"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3328"},"pull-3328"),"]"),(0,r.kt)("h4",{id:"constraint-based-generators"},"Constraint-based generators"),(0,r.kt)("p",null,"Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks\nwhich span several epochs, mimicking a real network.\nThese tests are, in theory, excellent for checking properties.\nThey are, however, very difficult to maintain and are not as random as we would like\n(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks)."),(0,r.kt)("p",null,"We have a new declaritive infrastructure for building constraint-based generators,\nwhich instead generate a random ledger state representative of not just an initial state,\nbut also those representative of the end result of a long sequence of valid blocks.\nMoreover, these generators are very fast and are much more random than our old generators.\nBefore we can start using them for our existing property tests, however, we still need to\nexpand them to generate a valid block for a given ledger state."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"),"]"),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"We continued to address technical debt as much as we can."),(0,r.kt)("p",null,"[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3167"},"pull-3167"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3170"},"pull-3170"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3172"},"pull-3172"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3175"},"pull-3175"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3184"},"pull-3184"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3205"},"pull-3205"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3208"},"pull-3208"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3210"},"pull-3210"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3212"},"pull-3212"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3218"},"pull-3218"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3222"},"pull-3222"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3223"},"pull-3223"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3224"},"pull-3224"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3225"},"pull-3225"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3229"},"pull-3229"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3239"},"pull-3239"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3241"},"pull-3241"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3244"},"pull-3244"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3245"},"pull-3245"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3249"},"pull-3249"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3260"},"pull-3260"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3263"},"pull-3263"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3264"},"pull-3264"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3268"},"pull-3268"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3269"},"pull-3269"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3270"},"pull-3270"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3274"},"pull-3274"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3276"},"pull-3276"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3277"},"pull-3277"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3286"},"pull-3286"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3290"},"pull-3290"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3295"},"pull-3295"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3296"},"pull-3296"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3306"},"pull-3306"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3307"},"pull-3307"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3310"},"pull-3310"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3311"},"pull-3311"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3316"},"pull-3316"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3320"},"pull-3320"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3323"},"pull-3323"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3327"},"pull-3327"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3331"},"pull-3331"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3332"},"pull-3332"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3333"},"pull-3333"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3338"},"pull-3338"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3341"},"pull-3341"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3347"},"pull-3347"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3350"},"pull-3350"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3351"},"pull-3351"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3352"},"pull-3352"),"]\n[",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3354"},"pull-3354"),"]"),(0,r.kt)("h5",{id:"critical-fixes"},"Critical fixes"),(0,r.kt)("p",null,"We fixed two critical issues:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Growing block production delay on the epoch boundary: [",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3209"},"pull-3209"),"]"),(0,r.kt)("li",{parentName:"ul"},"Unexpected node shutdown from ",(0,r.kt)("inlineCode",{parentName:"li"},"balanceR"),": [",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3343"},"pull-3343"),"]")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Conway spec")," -\nComplete the first version of the conway formal specification."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"DRep stake distribution")," -\nHave the ledger compute the DRep stake distribution with acceptible performance."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Devnet ready")," -\nHave the Haskell implementation of the conway era in sync with the formal specification,\nand integrate the changes with consensus and node.\nAll the details might not be finalized, but the wire specification and the API should\nbe stable so that conway can be placed on a devnet for tool builders to start integrating with."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Plutus V3")," -\nIntegrate Plutus V3 into the ledger, including a new script context which supports DReps.")),(0,r.kt)("h3",{id:"more-details"},"More details"),(0,r.kt)("p",null,"This quarterly report was based off of the following fortnightly ones:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-01-05-ledger"},"2023-01-05")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-01-19-ledger"},"2023-01-19")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-02-02-ledger"},"2023-02-02")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-02-17-ledger"},"2023-02-17")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-03-03-ledger"},"2023-03-03")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-03-17-ledger"},"2023-03-17")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"2023-03-31-ledger"},"2023-03-31"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c60581f2.f0c60a3a.js b/assets/js/c60581f2.f0c60a3a.js new file mode 100644 index 00000000000..e981d7cf0c0 --- /dev/null +++ b/assets/js/c60581f2.f0c60a3a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97094],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(n),h=r,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||a;return n?o.createElement(m,s(s({ref:t},u),{},{components:n})):o.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var p=2;p<a;p++)s[p]=n[p];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},84718:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-02-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-02-08-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-consensus.md",source:"@site/blog/2023-02-08-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-02-08T00:00:00.000Z",formattedDate:"February 8, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.5,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-02-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-09-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-08-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3},{value:"Support",id:"support",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"We continue refactoring the UTxO HD prototype while we wait for the system level\nbenchmarks. We have created a new repository that contains the ",(0,r.kt)("inlineCode",{parentName:"p"},"anti-diff"),"\npackages used in this prototype."),(0,r.kt)("p",null,"On the Genesis front, we are preparing another meeting with the researchers to\naudit the implementation design, and we continued working on basic tests and\nsimplifications."),(0,r.kt)("p",null,"During the past two weeks we also introduced two new tools. One for dumping CBOR\nencoded blocks to JSON, and another to serve a local immutable DB."),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,r.kt)("p",null,"We are in the process of refactoring the UTxO HD prototype, while we wait for\nthe system level benchmarks to confirm if the performance of the prototype is\nsatisfactory."),(0,r.kt)("p",null,"We also set up a repository for the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/anti-diffs"},(0,r.kt)("inlineCode",{parentName:"a"},"anti-diff"))," package, which\nrequired us to refactor the code, write documentation, and prepare a release to\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP"),"."),(0,r.kt)("h3",{id:"genesis"},"Genesis"),(0,r.kt)("p",null,"We worked on ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4347"},"basic tests")," for the ",(0,r.kt)("em",{parentName:"p"},"Limit on Eagerness")," property of\nGenesis. We also introduced further robustness and simplifications in the\nGenesis Density governor. Finally, we developed a presentation to engage again\nwith the researchers on our Genesis implementation design."),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("p",null,"We are in the process of ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/6"},"polishing")," the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),"\ndocumentation site, which we will use a the entry point for Consensus related\ndocumentation. The first version will not be complete, but we plan on\nsystematically improving it."),(0,r.kt)("h3",{id:"support"},"Support"),(0,r.kt)("p",null,"We ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4335"},"added a tool")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-cardano-tools")," which allows\nto dump the Chain DB blocks or any given CBOR encoded blocks as JSON."),(0,r.kt)("p",null,"We also added ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4339"},"another tool")," that serves an existing immutable DB via\nBlockFetch and ChainSync. This tool can help in assisting our local benchmarking\nefforts (for instance Genesis' ChainSync jumping prototype)."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c6259fbb.fdd3fb9d.js b/assets/js/c6259fbb.fdd3fb9d.js new file mode 100644 index 00000000000..7ceef1e8420 --- /dev/null +++ b/assets/js/c6259fbb.fdd3fb9d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2506],{63415:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/8","page":8,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/7","nextPage":"/cardano-updates/tags/hydra/page/9","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/c63933b3.19137cb7.js b/assets/js/c63933b3.19137cb7.js new file mode 100644 index 00000000000..300be0da9fa --- /dev/null +++ b/assets/js/c63933b3.19137cb7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[11727],{3905:(t,e,n)=>{n.d(e,{Zo:()=>p,kt:()=>d});var a=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,a)}return n}function l(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?o(Object(n),!0).forEach((function(e){r(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function i(t,e){if(null==t)return{};var n,a,r=function(t,e){if(null==t)return{};var n,a,r={},o=Object.keys(t);for(a=0;a<o.length;a++)n=o[a],e.indexOf(n)>=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(a=0;a<o.length;a++)n=o[a],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var u=a.createContext({}),s=function(t){var e=a.useContext(u),n=e;return t&&(n="function"==typeof t?t(e):l(l({},e),t)),n},p=function(t){var e=s(t.components);return a.createElement(u.Provider,{value:e},t.children)},m="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},h=a.forwardRef((function(t,e){var n=t.components,r=t.mdxType,o=t.originalType,u=t.parentName,p=i(t,["components","mdxType","originalType","parentName"]),m=s(n),h=r,d=m["".concat(u,".").concat(h)]||m[h]||c[h]||o;return n?a.createElement(d,l(l({ref:e},p),{},{components:n})):a.createElement(d,l({ref:e},p))}));function d(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=n.length,l=new Array(o);l[0]=h;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i[m]="string"==typeof t?t:r,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},27502:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-03-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-22-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-consensus.md",source:"@site/blog/2023-03-22-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-03-22T00:00:00.000Z",formattedDate:"March 22, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.63,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-03-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-23-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-22-node-cli-api"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low-level details",id:"low-level-details",level:2}],p={toc:s},m="wrapper";function c(t){let{components:e,...n}=t;return(0,r.kt)(m,(0,a.Z)({},p,n,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This week the consensus team continued working on the refactoring of the UTxO HD\nprototype, and design and testing of Genesis. We also extracted the ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-sim"),"\npackage, which provides a file-system abstraction layer that can be used for\ntesting and simulation. This makes the Consensus code base smaller, while\nproviding a package that the community can reuse and contribute to. We also\nfixed a failing property test related to iterators. We are also working on\nmempool and VRF improvements."),(0,r.kt)("h2",{id:"low-level-details"},"Low-level details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Extraction of ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim")," code from ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-network"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4425"},"https://github.com/input-output-hk/ouroboros-network/pull/4425")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/1"},"https://github.com/input-output-hk/fs-sim/pull/1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/2"},"https://github.com/input-output-hk/fs-sim/pull/2")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4460"},"https://github.com/input-output-hk/ouroboros-network/pull/4460")))),(0,r.kt)("li",{parentName:"ul"},"Smaller changes in ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim")," code (some required by ",(0,r.kt)("inlineCode",{parentName:"li"},"UTxO-HD"),"):",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/5"},"https://github.com/input-output-hk/fs-sim/pull/5")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/6"},"https://github.com/input-output-hk/fs-sim/pull/6")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/7"},"https://github.com/input-output-hk/fs-sim/pull/7")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fs-sim/pull/8"},"https://github.com/input-output-hk/fs-sim/pull/8")))),(0,r.kt)("li",{parentName:"ul"},"Released cardano-lmdb-simple-0.6.0.0",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/20"},"https://github.com/input-output-hk/lmdb-simple/pull/20")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/150"},"https://github.com/input-output-hk/cardano-haskell-packages/pull/150"))))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c6ae40c2.fcdab135.js b/assets/js/c6ae40c2.fcdab135.js new file mode 100644 index 00000000000..c2f5b86a4f4 --- /dev/null +++ b/assets/js/c6ae40c2.fcdab135.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17693],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},l=Object.keys(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),s=p(r),c=n,h=s["".concat(u,".").concat(c)]||s[c]||m[c]||l;return r?a.createElement(h,i(i({ref:t},d),{},{components:r})):a.createElement(h,i({ref:t},d))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,i=new Array(l);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[s]="string"==typeof e?e:n,i[1]=o;for(var p=2;p<l;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},68680:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"SRE Team Update",slug:"2023-01-20-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-01-20-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-sre.md",source:"@site/blog/2023-01-20-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:1.13,hasTruncateMarker:!1,authors:[{name:"Michael Fellinger",title:"SRE Team Lead",url:"https://github.com/manveru",imageURL:"https://github.com/manveru.png",key:"manveru"}],frontMatter:{title:"SRE Team Update",slug:"2023-01-20-sre",authors:"manveru",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-01-20-network"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-01-19-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cicero",id:"cicero",level:3},{value:"Tullia",id:"tullia",level:3},{value:"Bitte",id:"bitte",level:3},{value:"cardano-world",id:"cardano-world",level:3},{value:"bitte-world",id:"bitte-world",level:3},{value:"ci-world",id:"ci-world",level:3}],d={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing\nsupport for cardano-world."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cicero"},"Cicero"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixed various race conditions around transformers."),(0,n.kt)("li",{parentName:"ul"},"Brought our CI up to date."),(0,n.kt)("li",{parentName:"ul"},"Migrated to the Nomad exec driver with Nix support for many actions."),(0,n.kt)("li",{parentName:"ul"},"Moved Nix builds to the Nomad clients for much better cache locality."),(0,n.kt)("li",{parentName:"ul"},"Ongoing work on vastly improving the action matching and evaluation speed."),(0,n.kt)("li",{parentName:"ul"})),(0,n.kt)("h3",{id:"tullia"},"Tullia"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Made it easier to support cloning from a PR's fork"),(0,n.kt)("li",{parentName:"ul"},"Update to latest std"),(0,n.kt)("li",{parentName:"ul"},"Add workaround for cgroup issue: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/hashicorp/nomad/issues/12877"},"nomad#12877")),(0,n.kt)("li",{parentName:"ul"},"github preset: add ",(0,n.kt)("inlineCode",{parentName:"li"},"github.ci.remote")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"(read|get)Repository")," functions"),(0,n.kt)("li",{parentName:"ul"},"Fix various issues around CUE handling")),(0,n.kt)("h3",{id:"bitte"},"Bitte"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Upgrade to NixOS 22.11"),(0,n.kt)("li",{parentName:"ul"},"Prototype usage of ",(0,n.kt)("a",{parentName:"li",href:"https://colmena.cli.rs"},"Colmena")," for deploys instead of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/serokell/deploy-rs"},"deploy-rs")),(0,n.kt)("li",{parentName:"ul"},"Finalized work on Equinix Metal support"),(0,n.kt)("li",{parentName:"ul"},"Prototype better secrets management with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/yaxitech/ragenix"},"ragenix")," instead of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/Mic92/sops-nix"},"sops-nix")),(0,n.kt)("li",{parentName:"ul"},"Improve CI and bring it up to date")),(0,n.kt)("h3",{id:"cardano-world"},"cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixd various OOM issues on preview and preprod"),(0,n.kt)("li",{parentName:"ul"},"Rotated KES keys on preview and preprod"),(0,n.kt)("li",{parentName:"ul"},"Optimize mainnet db-sync to cope with higher load"),(0,n.kt)("li",{parentName:"ul"},"Fix an issue where PostgreSQL would fail after a reboot")),(0,n.kt)("h3",{id:"bitte-world"},"bitte-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated to NixOS 22.11")),(0,n.kt)("h3",{id:"ci-world"},"ci-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated to NixOS 22.11"),(0,n.kt)("li",{parentName:"ul"},"Added Equnix cluster"),(0,n.kt)("li",{parentName:"ul"},"Improve caching of Nix builds")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c6f90b29.8b77bc39.js b/assets/js/c6f90b29.8b77bc39.js new file mode 100644 index 00000000000..30e3844f462 --- /dev/null +++ b/assets/js/c6f90b29.8b77bc39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39080],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),u=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=u(e.components);return n.createElement(o.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),d=u(a),k=r,h=d["".concat(o,".").concat(k)]||d[k]||c[k]||l;return a?n.createElement(h,i(i({ref:t},m),{},{components:a})):n.createElement(h,i({ref:t},m))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p[d]="string"==typeof e?e:r,i[1]=p;for(var u=2;u<l;u++)i[u]=a[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}k.displayName="MDXCreateElement"},9762:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const l={title:"Node API & CLI Team Update",slug:"2023-06-07-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},i="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-06-07-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-07-node-cli-api.md",source:"@site/blog/2023-06-07-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-06-07T00:00:00.000Z",formattedDate:"June 7, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.37,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-06-07-node-cli-api",tags:["cli-api"],authors:"carlos",hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-06-08-system-test"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-02-hydra"}},o={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],m={toc:u},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-06-07---2023-06-20"},"2023-06-07 - 2023-06-20"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Completed cardano-cli migration to input-output-hk/cardano-cli"),(0,r.kt)("li",{parentName:"ul"},"cardano-cli ping now uses cardano-ping-0.2.0.5"),(0,r.kt)("li",{parentName:"ul"},"New queries on API:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryCurrentEpochState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryDebugLedgerState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryGenesisParameters")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryPoolDistribution")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryPoolState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryProtocolParameters")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryProtocolParametersUpdate")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryProtocolState")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakeAddresses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakeDistribution")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakePoolParameters")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryStakeSnapshot")))),(0,r.kt)("li",{parentName:"ul"},"Deprecate:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryPparams")))),(0,r.kt)("li",{parentName:"ul"},"Export query API as functions",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"genFeatureValueInEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"featureInShelleyBasedEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"isFeatureValue")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"valueOrDefault")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"asFeatureValue")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"asFeatureValueInShelleyBasedEra")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"queryEpoch")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"requireShelleyBasedEra")))),(0,r.kt)("li",{parentName:"ul"},"Restructure cardano-testnet (WIP)")),(0,r.kt)("hr",null),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5328"},"update network dependency and versions"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5326"},"Updated cardano-cli to use ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-ping-0.2.0.5"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5316"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli")," from CHaP"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5315"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5313"},"Updated cardano-cli ping command"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5311"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/30"},"Use cardano-ping-0.2.0.5"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/28"},"Deprecate ",(0,r.kt)("inlineCode",{parentName:"a"},"--protocol-params-file")," option of the ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction build")," command more thoroughly"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/25"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Api.Query.Expr")," module"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/24"},"Use simplified ",(0,r.kt)("inlineCode",{parentName:"a"},"queryStateForBalancedTx")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-cli/pull/20"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/59"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.5.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/58"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"requireShelleyBasedEra")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/57"},"New version cardano-api-8.5.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/56"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"queryEpoch")," function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/55"},"New version 8.5.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/54"},"Error on ",(0,r.kt)("inlineCode",{parentName:"a"},"hlint")," warnings in CI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/53"},"Additional query expression functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/52"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.4.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/49"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.3.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/48"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.Api.Query.Expr")," module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/47"},"Simplify ",(0,r.kt)("inlineCode",{parentName:"a"},"queryStateForBalancedTx"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/46"},"Revert to use ",(0,r.kt)("inlineCode",{parentName:"a"},"testProperty")," now that it isn't deprecated anymore"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.1.1"},"cardano-node 8.1.1 release")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5328"},"update network dependency and versions"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5340"},"Add ability to retry tests with DISABLE_RETRIES=1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5339"},"Move golden files to proper location")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5336"},"Conway testnet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5335"},"Don't retry testnet when failed")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5321"},"Remove YAML filepath record from data Conf")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5315"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5311"},"Add ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5309"},"Remove duplicate --testnet-magic flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5307"},"Restructure cardano testnet "))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/18"},"Fix Windows CI issues"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c7337d4e.6cea3bb1.js b/assets/js/c7337d4e.6cea3bb1.js new file mode 100644 index 00000000000..ea9859704e3 --- /dev/null +++ b/assets/js/c7337d4e.6cea3bb1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91151],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(n),h=r,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||o;return n?a.createElement(m,s(s({ref:t},p),{},{components:n})):a.createElement(m,s({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var u=2;u<o;u++)s[u]=n[u];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},82469:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Quarterly Update",slug:"2023-04-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/quarterly/2023-04-25-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-04-25-consensus.md",source:"@site/quarterly/2023-04-25-consensus.md",title:"Consensus Quarterly Update",description:"Consensus Quarterly Update",date:"2023-04-25T00:00:00.000Z",formattedDate:"April 25, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:2.3,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Quarterly Update",slug:"2023-04-25-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"SRE Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-sre"},nextItem:{title:"Network Q1 2023 Update",permalink:"/cardano-updates/quarterly/2023-04-04-network"}},l={authorsImageUrls:[void 0]},u=[{value:"Consensus Quarterly Update",id:"consensus-quarterly-update",level:2},{value:"2023-01 - 2023-03",id:"2023-01---2023-03",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Support",id:"support",level:4},{value:"Conway era",id:"conway-era",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4},{value:"Support",id:"support-1",level:4},{value:"Tech debt",id:"tech-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration-1",level:4}],p={toc:u},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"consensus-quarterly-update"},"Consensus Quarterly Update"),(0,r.kt)("h2",{id:"2023-01---2023-03"},"2023-01 - 2023-03"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We finished the testing activities for the prototype, which involved adding\nnew tests, and fixing and enabling temporarily disabled tests."),(0,r.kt)("li",{parentName:"ul"},"We spent a substantial amount of effort refactoring and cleaning the\nprototype."),(0,r.kt)("li",{parentName:"ul"},"We audited the UTxO HD prototype to make sure it can accommodate the migration\nof other tables (eg stake-keys registration) from memory to disk. The result\nof the audit was positive."),(0,r.kt)("li",{parentName:"ul"},"We ran ad-hoc benchmarks for reading keys and flushing values to disk. No\nunexpected costs found."),(0,r.kt)("li",{parentName:"ul"},"We ran the first system level benchmarks. The performance regressions reported\nwere due to an unrealistic snapshotting rate. We need to re-run them again\nafter we design a more fine grained locking mechanism.")),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We elaborated a roadmap of the remaining work for Genesis."),(0,r.kt)("li",{parentName:"ul"},"We presented the design to the IOG Researchers and PNSol on February 20. The\ndesign was well received. We updated the Genesis design with the researcher's\nfeedback.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We plugged the new DoS vector identified during the aforementioned\npresentation."))),(0,r.kt)("li",{parentName:"ul"},"We developed a generator for adversarial leader schedules that satisfy key\nOuroboros properties, which will be used to test the Genesis design.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The generator enables use of smaller Ouroboros parameters, which makes\nextrema more likely and counterxamples easier interpret."))),(0,r.kt)("li",{parentName:"ul"},"We wrote up the latest design iteration."),(0,r.kt)("li",{parentName:"ul"},"We continued benchmarking the Chain Sync Jumping prototype. In particular:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We debugged the prototype's performance regression, and unmasked the\nactual cause by patching our initial theory (bad queuing behavior)"),(0,r.kt)("li",{parentName:"ul"},"We identified and validated the actual cause (a pathological case in\nBlockFetch tiebreaker).")))),(0,r.kt)("h4",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother\nto serve a local immutable DB.")),(0,r.kt)("h4",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We integrated the Conway era into consensus.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We fixed a bug with followers, which was discovered by property tests."),(0,r.kt)("li",{parentName:"ul"},"We developed a DSL for specifying and running ChainDB test cases."),(0,r.kt)("li",{parentName:"ul"},"We fixed failing tests with iterators."),(0,r.kt)("li",{parentName:"ul"},"We created micro-benchmarks for adding transactions to the mempool.")),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We released a new technical documentation site for consensus."),(0,r.kt)("li",{parentName:"ul"},"We factored out several packages to external repositories. Some of this work\noriginated in the UTxO HD workstream.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/28"},"https://github.com/input-output-hk/ouroboros-consensus/issues/28"))),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/33"},"https://github.com/input-output-hk/ouroboros-consensus/issues/33")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/32"},"https://github.com/input-output-hk/ouroboros-consensus/issues/32")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/31"},"https://github.com/input-output-hk/ouroboros-consensus/issues/31"))),(0,r.kt)("h4",{id:"support-1"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Design Consensus side of hardfork-enactment in the Voltaire phase\n(",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4180"},"#4180"),")."),(0,r.kt)("li",{parentName:"ul"},"Estimate the number of file descriptors Consensus needs\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/20"},"#20"),".")),(0,r.kt)("h4",{id:"tech-debt"},"Tech debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define\nfor consensus. Pick one and implement benchmarks for it.")),(0,r.kt)("h4",{id:"fostering-collaboration-1"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Onboard a new team member.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c7e43a05.c308de8a.js b/assets/js/c7e43a05.c308de8a.js new file mode 100644 index 00000000000..effc131892d --- /dev/null +++ b/assets/js/c7e43a05.c308de8a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65956],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),c=n,d=m["".concat(p,".").concat(c)]||m[c]||h[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<a;s++)o[s]=r[s];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},75265:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-10-25-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-25-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-25-mithril.md",source:"@site/blog/2023-10-25-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-25T00:00:00.000Z",formattedDate:"October 25, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.125,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-25-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-27-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-24-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},m="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team released a new distribution ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2342.0"},(0,n.kt)("inlineCode",{parentName:"a"},"2342.0")),". This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes."),(0,n.kt)("p",null,"They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files. "),(0,n.kt)("p",null,"Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the ",(0,n.kt)("inlineCode",{parentName:"p"},"release-mainnet")," aggregator, and enhanced the Mithril explorer UI."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P Networking - Proof of Concept")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate a library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1141"},"#1141")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano UTxO set PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"ProtocolKeyRegistration")," creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1187"},"#1187")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Fix ",(0,n.kt)("inlineCode",{parentName:"strong"},"devnet")," Mithril Docker images")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1272"},"#1272")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Build ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-common")," and ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," in WASM PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1284"},"#1284")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Display a summary of signers before the full list in explorer")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1133"},"#1133")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Add certificates list in explorer")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1184"},"#1184")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"CoreVerifier")," setup does not compute ",(0,n.kt)("inlineCode",{parentName:"strong"},"total_stake")," correctly")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1306"},"#1306"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c831575d.33f5874b.js b/assets/js/c831575d.33f5874b.js new file mode 100644 index 00000000000..9e38a5cff40 --- /dev/null +++ b/assets/js/c831575d.33f5874b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42677],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c<o;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},20519:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-02-21-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-02-21-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-21-db-sync.md",source:"@site/blog/2023-02-21-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-02-21T00:00:00.000Z",formattedDate:"February 21, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.75,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-02-21-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-22-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-17-crypto"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The db-sync team created a new tag ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.2")," which is ready to release.\nWe also investigated and had the first working UTxO-HD integration which is one\nof the potential future risks for db-sync."),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Integrated the UTxO-HD feauture branch in ",(0,a.kt)("inlineCode",{parentName:"li"},"kderme/utxo-hd-1"),". This doesn't\nuse the full on disk storage but keeps things in memory and the plan is to keep\nit this way for the first iteration. The integration still has some performance\nissues which we investigate"),(0,a.kt)("li",{parentName:"ul"},"Created tag ",(0,a.kt)("inlineCode",{parentName:"li"},"13.1.0.2")," which upgrades the dependencies of db-sync"),(0,a.kt)("li",{parentName:"ul"},"Fixed an issue related to errors appearing in SMASH\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1353"},"#1353")),(0,a.kt)("li",{parentName:"ul"},"Continued with ghc-9.2 integration\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1339"},"#1339")),(0,a.kt)("li",{parentName:"ul"},"Worked on an new fixing procedure for\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1348"},"#1348"),".\nWe try to make these procedures work also on older schema version, without the\nneed to migrate to newer schema, which can be very useful for fixing existing\nsnapshots.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c90fb258.9c89e222.js b/assets/js/c90fb258.9c89e222.js new file mode 100644 index 00000000000..28fc9aefc8b --- /dev/null +++ b/assets/js/c90fb258.9c89e222.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26584],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=s(n),m=r,h=p["".concat(u,".").concat(m)]||p[m]||d[m]||i;return n?a.createElement(h,o(o({ref:t},c),{},{components:n})):a.createElement(h,o({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var s=2;s<i;s++)o[s]=n[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},44389:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const i={title:"DB-sync Team Update",slug:"2023-06-08-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-08-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-db-sync.md",source:"@site/blog/2023-06-08-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.745,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-06-08-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-09-hydra"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-08-goedel"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],c={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"We've made progress in all high level objectives"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"CIP-1694 integration design"),(0,r.kt)("li",{parentName:"ul"},"UTxO-HD integration proof of concept"),(0,r.kt)("li",{parentName:"ul"},"schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2"),(0,r.kt)("li",{parentName:"ul"},"A new hire will help us with devx issues.")),(0,r.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We have an initial design for the Conway integration in db-sync"),(0,r.kt)("li",{parentName:"ul"},"The initial UTxO-HD integration resulted in a requested feuture that\nthe consensus team is working on\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/88"},"#88"),"."),(0,r.kt)("li",{parentName:"ul"},"Added two optional migrations that speed up querying UTxO\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1416"},"#1416")),(0,r.kt)("li",{parentName:"ul"},"Work on improving the above feauture by adding tests and fixing tech debt\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1429"},"#1429"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1419"},"#1419")),(0,r.kt)("li",{parentName:"ul"},"Fixed issue with ada_pots being wrong\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/1ad4521a5601e8e98dc06bba2826d6b2f9b4fcf4"},"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/1ad4521a5601e8e98dc06bba2826d6b2f9b4fcf4")),(0,r.kt)("li",{parentName:"ul"},"Added a process which fixes in place scripts with wrong CBOR serialisation.\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/8792f72e2485b320de26c02dacc4d504d377ba17"},"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/8792f72e2485b320de26c02dacc4d504d377ba17")),(0,r.kt)("li",{parentName:"ul"},"Prepared a tag ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/releases"},(0,r.kt)("inlineCode",{parentName:"a"},"13.1.1.2")),"\nwhich is tested and ready to release. It contains many of the above.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c9210b26.f9c92b06.js b/assets/js/c9210b26.f9c92b06.js new file mode 100644 index 00000000000..d22e5b356d2 --- /dev/null +++ b/assets/js/c9210b26.f9c92b06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97959],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>d});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,r,a=function(e,t){if(null==e)return{};var i,r,a={},n=Object.keys(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(i),c=a,d=s["".concat(p,".").concat(c)]||s[c]||m[c]||n;return i?r.createElement(d,o(o({ref:t},h),{},{components:i})):r.createElement(d,o({ref:t},h))}));function d(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,i)}c.displayName="MDXCreateElement"},31535:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-05-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-04-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-04-mithril.md",source:"@site/blog/2023-05-04-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-05-04T00:00:00.000Z",formattedDate:"May 4, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.56,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-05-04-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-05-node-cli-api"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-03-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...i}=e;return(0,a.kt)(s,(0,r.Z)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.7"),"."),(0,a.kt)("p",null,"Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implements generic signing/verification of entity services ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the ",(0,a.kt)("inlineCode",{parentName:"li"},"Certifier")," service in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/850"},"#850")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the signable builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Mithril Stake Distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/851"},"#851")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the artifact builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Mithril Stake Distribution")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/870"},"#870")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the signable builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Full Immutables Snapshot")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/852"},"#852")),(0,a.kt)("li",{parentName:"ul"},"Completed the implementation of the artifact builder for the ",(0,a.kt)("inlineCode",{parentName:"li"},"Full Immutables Snapshot")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/871"},"#871")),(0,a.kt)("li",{parentName:"ul"},"Completed the adaptation of the aggregator runtime to use the signable builder service ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/853"},"#853")),(0,a.kt)("li",{parentName:"ul"},"Worked on the adaptation of the signer runtime to use the signable builder service ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/854"},"#854")),(0,a.kt)("li",{parentName:"ul"},"Completed the definition of the entity service interface for verification/restoration ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/868"},"#868")),(0,a.kt)("li",{parentName:"ul"},"Completed the refactoring of the ",(0,a.kt)("inlineCode",{parentName:"li"},"OpenMessage")," type ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/878"},"#878")))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic that simplifies the multi-signer in the aggregator ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/398"},"#398"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the extraction of the single signature registration from the multi-signer ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/643"},"#643")))),(0,a.kt)("li",{parentName:"ul"},"Completed the upgrade of the Cardano node to version ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35.7")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/881"},"#881")),(0,a.kt)("li",{parentName:"ul"},"Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/873"},"#873"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c94f306d.475fec2b.js b/assets/js/c94f306d.475fec2b.js new file mode 100644 index 00000000000..212303b0f64 --- /dev/null +++ b/assets/js/c94f306d.475fec2b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[98727],{29127:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/ca3b5bc8.d750be9f.js b/assets/js/ca3b5bc8.d750be9f.js new file mode 100644 index 00000000000..0c41a151493 --- /dev/null +++ b/assets/js/ca3b5bc8.d750be9f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96140],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=r,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?a.createElement(h,s(s({ref:t},c),{},{components:n})):a.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:r,s[1]=i;for(var u=2;u<o;u++)s[u]=n[u];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},92861:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-08-09-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-08-09-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-09-consensus.md",source:"@site/blog/2023-08-09-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-08-09T00:00:00.000Z",formattedDate:"August 9, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.46,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-08-09-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-10-mithril"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-08-04-crypto"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Fostering collaboration",id:"fostering-collaboration",level:2},{value:"Support",id:"support",level:2}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-sim")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"fs-api"),", and released ",(0,r.kt)("inlineCode",{parentName:"p"},"strict-checked-vars"),"."),(0,r.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Rebased UTxO-HD on top of node 8.2 (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/256"},"issue"),")"),(0,r.kt)("li",{parentName:"ul"},"Address new ",(0,r.kt)("inlineCode",{parentName:"li"},"Maybe")," translations for UTxOs in Conway 1.6. (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/261"},"PR"),")."),(0,r.kt)("li",{parentName:"ul"},"Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/compare/96e92351ad35cfce1b0c2c47c4ed05792bf81fad..90d4c93af0846c9b027d530c042180c51aeee4fd"},"Fixed")," an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully."),(0,r.kt)("li",{parentName:"ul"},"Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running ",(0,r.kt)("inlineCode",{parentName:"li"},"QueryUTxOByAddress")," (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/273"},"PR"),")."),(0,r.kt)("li",{parentName:"ul"},"Measured the speed of ",(0,r.kt)("inlineCode",{parentName:"li"},"QueryUTxOByAddress")," under different ",(0,r.kt)("inlineCode",{parentName:"li"},"queryBatchSize")," values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution."),(0,r.kt)("li",{parentName:"ul"},"Refactored and implemented ledgertable-related classes for the general ",(0,r.kt)("inlineCode",{parentName:"li"},"HardforkBlock"),".")),(0,r.kt)("h2",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Frisby")," and ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/amesgen"},"Esgen")," continue to engage with the Researchers on grinding against the Genesis design.")),(0,r.kt)("h2",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Drafted a document explaining versioning of local state queries ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/273"},"#273"),".")),(0,r.kt)("h2",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Frisby")," is the release engineer this cycle."),(0,r.kt)("li",{parentName:"ul"},"Successfully created work-in-progress ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-api")," commits that integrate the 2023 Aug 7 tip of ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-ledger"),". This will require a release of ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus"),", which hasn't happened yet.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ca6829cb.00bb58af.js b/assets/js/ca6829cb.00bb58af.js new file mode 100644 index 00000000000..e9d84995645 --- /dev/null +++ b/assets/js/ca6829cb.00bb58af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[41153],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=s(a),c=n,m=d["".concat(p,".").concat(c)]||d[c]||h[c]||o;return a?r.createElement(m,i(i({ref:t},u),{},{components:a})):r.createElement(m,i({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},14193:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-10-20-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-10-20-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-20-hydra.md",source:"@site/blog/2023-10-20-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-20T00:00:00.000Z",formattedDate:"October 20, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.84,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-20-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-24-node-cli-api"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-18-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:s},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023."),(0,n.kt)("p",null,"In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON.\nThis improvement offers users greater flexibility and ease of interaction with the API."),(0,n.kt)("p",null,"Finally, the team has followed up on the TUI brick upgrade to version 1.10.\nThis effort has resulted in addressing minor details and enhancing the overall user experience with the TUI."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Prepare presentation and workshop for Cardano Summit."),(0,n.kt)("li",{parentName:"ul"},"More TUI fixes and improvements.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1127"},"#1127")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1120"},"#1120")))),(0,n.kt)("li",{parentName:"ul"},"Upgrade GHC from 9.2.8 -> 9.6.2 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1105"},"#1105")),(0,n.kt)("li",{parentName:"ul"},"Solved user issue related to submitting transactions in cbor format ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1111"},"#1111"),"."),(0,n.kt)("li",{parentName:"ul"},"Fix hydraw connection issue making it more stable ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1121"},"#1121"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work on hydra-poll dApp for Cardano summit."),(0,n.kt)("li",{parentName:"ul"},"Start the work on packaging hydra-node and related services.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/caab1e2e.790da899.js b/assets/js/caab1e2e.790da899.js new file mode 100644 index 00000000000..9e73cb3d86f --- /dev/null +++ b/assets/js/caab1e2e.790da899.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93570],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),c=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return n?r.createElement(f,l(l({ref:t},s),{},{components:n})):r.createElement(f,l({ref:t},s))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},74145:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-07-20-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-20-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-20-goedel.md",source:"@site/blog/2023-07-20-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-07-20T00:00:00.000Z",formattedDate:"July 20, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.47,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-07-20-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-21-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-18-node-cli-api"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is working on formalising mini protocols, the performance\nmodelling prototype and also finishing off their ICE papers."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Formalization of the chain synchronization mini-protocol in the\nthorn calculus")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Final pre-publication steps for ICE 2023 papers")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Developing approach for specification and verification of\nmini-protocols")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Started work on porting the DeltaQ framework to a new, more concrete\nbackend based on piecewise-polynomials"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cb7a1a0b.fc91c3ee.js b/assets/js/cb7a1a0b.fc91c3ee.js new file mode 100644 index 00000000000..7c4c1d7a3cf --- /dev/null +++ b/assets/js/cb7a1a0b.fc91c3ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90934],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),s=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(r),d=n,h=c["".concat(l,".").concat(d)]||c[d]||m[d]||a;return r?o.createElement(h,i(i({ref:t},u),{},{components:r})):o.createElement(h,i({ref:t},u))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:n,i[1]=p;for(var s=2;s<a;s++)i[s]=r[s];return o.createElement.apply(null,i)}return o.createElement.apply(null,r)}d.displayName="MDXCreateElement"},62094:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var o=r(87462),n=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-11-16-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-11-16-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-16-network.md",source:"@site/blog/2023-11-16-network.md",title:"Network Team Update",description:"High-level overview of sprint 48",date:"2023-11-16T00:00:00.000Z",formattedDate:"November 16, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.545,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-11-16-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-11-17-performance-and-tracing"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-15-consensus"}},l={authorsImageUrls:[void 0]},s=[{value:"High-level overview of sprint 48",id:"high-level-overview-of-sprint-48",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"IOClasses / IOSim",id:"ioclasses--iosim",level:3},{value:"Tech debt",id:"tech-debt",level:3}],u={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-48"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+48%22"},"sprint 48")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We continued reviewing bootstrap peers, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4555"},"ouroboros-network#4555"),"."),(0,n.kt)("h3",{id:"ioclasses--iosim"},"IOClasses / IOSim"),(0,n.kt)("p",null,"We prepared slides for a Haskell meetup were we presented a talk on ",(0,n.kt)("inlineCode",{parentName:"p"},"IOSimPOR"),".\nThe recording will be availble on ",(0,n.kt)("inlineCode",{parentName:"p"},"YouTube"),"."),(0,n.kt)("p",null,"We also used the opportunity to do some refactoring of the ",(0,n.kt)("inlineCode",{parentName:"p"},"IOSim")," code base: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/117"},"io-sim#117"),".\nWe released ",(0,n.kt)("inlineCode",{parentName:"p"},"io-sim-1.3.0.0")," on ",(0,n.kt)("inlineCode",{parentName:"p"},"Hackage"),": ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/119"},"io-sim#119"),"."),(0,n.kt)("p",null,"We also added ",(0,n.kt)("inlineCode",{parentName:"p"},"forkFinally")," to ",(0,n.kt)("inlineCode",{parentName:"p"},"MonadFork")," (not included in ",(0,n.kt)("inlineCode",{parentName:"p"},"1.3.0.0")," release): ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/123"},"io-sim#123"),"."),(0,n.kt)("h3",{id:"tech-debt"},"Tech debt"),(0,n.kt)("p",null,"We refactored ",(0,n.kt)("inlineCode",{parentName:"p"},"Resource")," used by the DNS subsystem: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4707"},"ouroboros-network#4707"),".\nWe continued reviewing the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4625"},"ouroboros-network#4625")," PR, which refactors\n",(0,n.kt)("inlineCode",{parentName:"p"},"RootPeersDNS")," module."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cc267639.9995a73a.js b/assets/js/cc267639.9995a73a.js new file mode 100644 index 00000000000..9fe118f023e --- /dev/null +++ b/assets/js/cc267639.9995a73a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[81214],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},m=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=p(r),c=a,y=u["".concat(i,".").concat(c)]||u[c]||d[c]||s;return r?n.createElement(y,o(o({ref:t},m),{},{components:r})):n.createElement(y,o({ref:t},m))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=c;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<s;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}c.displayName="MDXCreateElement"},27582:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const s={title:"System Test Team Update",slug:"2023-01-13-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-13-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-system-test.md",source:"@site/blog/2023-01-13-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.91,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"System Test Team Update",slug:"2023-01-13-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2023-01-13-release"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-01-12-mithril"}},i={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"Node:",id:"node",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],m={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the ",(0,a.kt)("em",{parentName:"p"},"P2P Single\nRelay")," functionality."),(0,a.kt)("p",null,"We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"extended the ",(0,a.kt)("em",{parentName:"li"},"cardano-node-tests")," with the ability for anybody to fork the repo and ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/readme.html"},"run all our System Tests on GitHub Actions")),(0,a.kt)("li",{parentName:"ul"},"added 2 new nightly pipelines - nightly-mixed and nightly-p2p - ",(0,a.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/nightly_system_tests.html"},"details here")),(0,a.kt)("li",{parentName:"ul"},"some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"}," === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) ===\n to\n === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===")),(0,a.kt)("h3",{id:"node"},"Node:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled"),(0,a.kt)("li",{parentName:"ul"},"started the preparations for testing the next tag - ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node-tests/blob/tag_test_1.35.5_rc1/src_docs/source/test_results/node/tag_1_35_5_rc1.rst"},"details here"))),(0,a.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"some improvements on db-sync sync tests")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cc30e037.47fc6eda.js b/assets/js/cc30e037.47fc6eda.js new file mode 100644 index 00000000000..b61754a3050 --- /dev/null +++ b/assets/js/cc30e037.47fc6eda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31421],{9353:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/cc5c2602.db9902d7.js b/assets/js/cc5c2602.db9902d7.js new file mode 100644 index 00000000000..de58efc41a3 --- /dev/null +++ b/assets/js/cc5c2602.db9902d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78761],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>k});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=u(n),c=o,k=d["".concat(s,".").concat(c)]||d[c]||m[c]||i;return n?a.createElement(k,r(r({ref:t},p),{},{components:n})):a.createElement(k,r({ref:t},p))}));function k(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:o,r[1]=l;for(var u=2;u<i;u++)r[u]=n[u];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}c.displayName="MDXCreateElement"},54230:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(87462),o=(n(67294),n(3905));const i={title:"Network Quarterly Update",slug:"2023-01-13-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},r=void 0,l={permalink:"/cardano-updates/quarterly/2023-01-13-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-13-network.md",source:"@site/quarterly/2023-01-13-network.md",title:"Network Quarterly Update",description:"Network Quarterly Update",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:4.125,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Quarterly Update",slug:"2023-01-13-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-18-consensus"},nextItem:{title:"Open-Source Update",permalink:"/cardano-updates/quarterly/2023-01-13-open-source"}},s={authorsImageUrls:[void 0]},u=[{value:"Network Quarterly Update",id:"network-quarterly-update",level:2},{value:"2022-11 - 2023-01",id:"2022-11---2023-01",level:2},{value:"Summary",id:"summary",level:3},{value:"Next steps",id:"next-steps",level:3},{value:"Risks",id:"risks",level:3},{value:"Detailed log",id:"detailed-log",level:3},{value:"Contributions to Ouroboros-Network",id:"contributions-to-ouroboros-network",level:4},{value:"Contributions to Cardano-Node",id:"contributions-to-cardano-node",level:4},{value:"Contributions to IOSim",id:"contributions-to-iosim",level:4}],p={toc:u},d="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"network-quarterly-update"},"Network Quarterly Update"),(0,o.kt)("h2",{id:"2022-11---2023-01"},"2022-11 - 2023-01"),(0,o.kt)("h3",{id:"summary"},"Summary"),(0,o.kt)("p",null,"The primary goal of the networking team was to focus on the single relay\nrelease of P2P. We fixed a number of small late bugs, and concluded QA\n& performance testing. Although it was discovered a regression in performance\nof block production when P2P is enabled, relaying with P2P performs better\ncomparing to a non p2p. We concluded that this is not a blocker for the Single\nRelay Release which is planned shortly."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"Peer sharing")," has gone through review and final review is\njust being done right now. After merging it will still be disabled (hidden\nbehind a flag) as it's not safe without eclipse evasion. We started\nimplementing light peer sharing (i.e. include inbound peers into known peer set\nof the outbound governor)."),(0,o.kt)("p",null,"We started a detailed eclipse evasion design, it will continue in the next\nquarter."),(0,o.kt)("p",null,"We also made a major revision of package structure of the network packages. We\nended up with a very clean dependency graph (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4155"},"pr #4155"),")."),(0,o.kt)("p",null,"Armando Santos delivered a talk at the ",(0,o.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/armando-details.html"},"ODOPIS 2022")," conference on principles\nof distributed systems in Brussels. The slides are available ",(0,o.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/slides/OPODIS2022-slides-Santos.pdf"},"here"),"."),(0,o.kt)("p",null,"Neil Davies gave an invited seminar on ",(0,o.kt)("inlineCode",{parentName:"p"},"DeltaQ")," at Universit\xe9 Catholique de\nLouvain."),(0,o.kt)("p",null,"We also found and fixed a few of bugs:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"a bug in keep alive mini-protocol which resulted in warm to cold transitions\nto be always executed through a timeout path rather than do a clean demotion\n(","[pr #4168]",").")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"fixed an assetion failure in the outbound governor (",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177"),") "))),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"we fixed DNS test failure ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4191"},"issue #4191"))),(0,o.kt)("h3",{id:"next-steps"},"Next steps"),(0,o.kt)("p",null,"We will work towards the next release of P2P for block producer nodes. This includes:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"analysing performance regression for BP nodes when using P2P"),(0,o.kt)("li",{parentName:"ul"},"finish the work on controlling the block forger through node kernel (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3800"},"pr #3800"),")"),(0,o.kt)("li",{parentName:"ul"},"address ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3907"},"issue #3907")," and write a script to analyse deployment of P2P relays")),(0,o.kt)("p",null,"We would like also to push forward eclipse evasion. Although most of the work\nhas be done already the release of ",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim")," on ",(0,o.kt)("inlineCode",{parentName:"p"},"Hackage")," will happen in the\nnext quarter."),(0,o.kt)("p",null,"We would also like to address ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4244"},"chain-sync timeout issue")," recently\ndiagnosed by Karl Knutsson."),(0,o.kt)("p",null,"If time permits we would also like to address some technical debt, especially:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3387"},"enable nothunk in diffusion tests")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4085"},"refactor diffusion testnet simulation"))),(0,o.kt)("h3",{id:"risks"},"Risks"),(0,o.kt)("p",null,"The performance regression for block producer with P2P needs to be investigated\nin the near future. This is blocker for the release of P2P on BP nodes."),(0,o.kt)("h3",{id:"detailed-log"},"Detailed log"),(0,o.kt)("h4",{id:"contributions-to-ouroboros-network"},"Contributions to Ouroboros-Network"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We added ",(0,o.kt)("inlineCode",{parentName:"li"},"TraceDemoteLocalAsynchronous"),", which enables notification of critical issues for SPOs"),(0,o.kt)("li",{parentName:"ul"},"We fixed ",(0,o.kt)("inlineCode",{parentName:"li"},"cardano-ping")," compatibility with ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToNodeV_10")," (P2P, ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4165"},"pr #4165"),")"),(0,o.kt)("li",{parentName:"ul"},"We fixed a bug in demotion peers to cold which affected P2P nodes (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4170/commits/61058aa5c28a144d723aae183d1745552d757334"},"commit-61058aa5c2"),")"),(0,o.kt)("li",{parentName:"ul"},"Karl Knutsson enhanced ",(0,o.kt)("inlineCode",{parentName:"li"},"SendFetchRequest")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4170/commits/bb1c3dddeea78949f531c144bb4f2669eddf7f47"},"commit-bb1c3dddee"),"), open-source contribution)"),(0,o.kt)("li",{parentName:"ul"},"We turned ",(0,o.kt)("inlineCode",{parentName:"li"},"SizeInBytes")," into a newtype."),(0,o.kt)("li",{parentName:"ul"},"We extended ",(0,o.kt)("inlineCode",{parentName:"li"},"CONTRIBUTING.md"),", ",(0,o.kt)("inlineCode",{parentName:"li"},"README.md"),", added ",(0,o.kt)("inlineCode",{parentName:"li"},"CODE_OF_CONDUCT"),"."),(0,o.kt)("li",{parentName:"ul"},"We fixed DNS test failure ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4191"},"issue #4191")),(0,o.kt)("li",{parentName:"ul"},"We fixed a simulation bug found in ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4258"},"issue #4258")),(0,o.kt)("li",{parentName:"ul"},"[pr #4168]"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177"))),(0,o.kt)("h4",{id:"contributions-to-cardano-node"},"Contributions to Cardano-Node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We maintained the Single Relay Release ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4612"},"pr #4612"),", (e.g. fixing CI issues,\nRebasing it when necessary, publishing packages to Cardano Haskell Packages);"),(0,o.kt)("li",{parentName:"ul"},"We enhanced ",(0,o.kt)("inlineCode",{parentName:"li"},"JSON")," serialisation / deserialisation of ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToNodeVersion")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToClientVersion"),";")),(0,o.kt)("h4",{id:"contributions-to-iosim"},"Contributions to IOSim"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"We started to use Cardano Haskell Packages for ",(0,o.kt)("inlineCode",{parentName:"li"},"IOSim")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/48"},"pr #48"),")"),(0,o.kt)("li",{parentName:"ul"},"We updated change log files"),(0,o.kt)("li",{parentName:"ul"},"We added support of ",(0,o.kt)("inlineCode",{parentName:"li"},"ghc-9.4")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/50"},"pr #50"),")")),(0,o.kt)("p",null,"We also addressed the following issues in ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"pr #57")," in order to prepare the package for publication on Hackage:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"refactored ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," timers API (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/issues/46"},"issue #46"),");"),(0,o.kt)("li",{parentName:"ul"},"created a new package ",(0,o.kt)("inlineCode",{parentName:"li"},"si-timers")," which exposes an interface using SI units\nand is safe on 32-bit systems (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/issues/59"},"issue #59"),");"),(0,o.kt)("li",{parentName:"ul"},"added monad transformers instances for classes defined in ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/issues/58"},"issue #58"),");"),(0,o.kt)("li",{parentName:"ul"},"created ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes-mtl")," package which includes (experimental) instances for monad transformers;"),(0,o.kt)("li",{parentName:"ul"},"provide ",(0,o.kt)("inlineCode",{parentName:"li"},"MonadMonotonicTimeNSec")," in ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"MonadMonotonicTime")," in ",(0,o.kt)("inlineCode",{parentName:"li"},"si-timers")," (so that ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes")," follow the ",(0,o.kt)("inlineCode",{parentName:"li"},"base")," package);"),(0,o.kt)("li",{parentName:"ul"},"added ",(0,o.kt)("inlineCode",{parentName:"li"},"registerCancellableDelay")," in ",(0,o.kt)("inlineCode",{parentName:"li"},"si-timers")," (which allowed us to hide fancy timer api and clean ",(0,o.kt)("inlineCode",{parentName:"li"},"io-classes"),")"),(0,o.kt)("li",{parentName:"ul"},"added support for ",(0,o.kt)("inlineCode",{parentName:"li"},"js_HOST_ARCH")," (the new GHC JS backend)")),(0,o.kt)("p",null,"Note the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"pr #57")," contains almost 40 commits, and was a major step forward for\n",(0,o.kt)("inlineCode",{parentName:"p"},"io-sim")," ecosystem. We also prepared a draft ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4281"},"pr #4281")," which updates\n",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"."),(0,o.kt)("p",null,"Other changes for ",(0,o.kt)("inlineCode",{parentName:"p"},"1.0.0.0")," release on Hackage:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Refactored test suite (",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/47"},"pr #47"),")"),(0,o.kt)("li",{parentName:"ul"},"Updated documentation, cabal files, ",(0,o.kt)("inlineCode",{parentName:"li"},"CONTRIBUTING"),", ",(0,o.kt)("inlineCode",{parentName:"li"},"SECURITY")," documents, etc in ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/60"},"pr #60"),", currently under review.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccb7a847.7e3751a5.js b/assets/js/ccb7a847.7e3751a5.js new file mode 100644 index 00000000000..602c2b5a660 --- /dev/null +++ b/assets/js/ccb7a847.7e3751a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22469],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),d=o,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||a;return n?r.createElement(h,s(s({ref:t},p),{},{components:n})):r.createElement(h,s({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:o,s[1]=i;for(var l=2;l<a;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},17352:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(87462),o=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-11-01-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-11-01-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-01-consensus.md",source:"@site/blog/2023-11-01-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-11-01T00:00:00.000Z",formattedDate:"November 1, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.44,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-11-01-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-08-mithril"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-01-mithril"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2}],p={toc:l},c="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"This week the Consensus team made progress on two fronts: the question of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/422"},"survivable eclipse duration"),", which is part of our work ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/427"},"supporting Genesis delivery"),", and how to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4251"},"improve the handling of blocks from the future"),".\nRegarding the UTxO-HD branch, we managed to run a node with ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"legacy blocks"),", which is syncing with mainnet, up to including Alonzo.\nWe also ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/465#issuecomment-1788685122"},"investigated")," a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.66cad8e9.js b/assets/js/ccc49370.66cad8e9.js new file mode 100644 index 00000000000..45fd6b4717b --- /dev/null +++ b/assets/js/ccc49370.66cad8e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46103],{65203:(e,t,n)=>{n.r(t),n.d(t,{default:()=>h});var a=n(67294),l=n(86010),r=n(1944),o=n(35281),i=n(9460),c=n(39058),s=n(30390),m=n(87462),d=n(95999),u=n(32244);function g(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,d.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(u.Z,(0,m.Z)({},n,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(u.Z,(0,m.Z)({},t,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function f(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:l,date:o,tags:c,authors:s,frontMatter:m}=t,{keywords:d}=m,u=e.image??m.image;return a.createElement(r.d,{title:n,description:l,keywords:d,image:u},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:o}),s.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:s.map((e=>e.url)).filter(Boolean).join(",")}),c.length>0&&a.createElement("meta",{property:"article:tag",content:c.map((e=>e.label)).join(",")}))}var v=n(39407);function p(e){let{sidebar:t,children:n}=e;const{metadata:l,toc:r}=(0,i.C)(),{nextItem:o,prevItem:m,frontMatter:d}=l,{hide_table_of_contents:u,toc_min_heading_level:f,toc_max_heading_level:p}=d;return a.createElement(c.Z,{sidebar:t,toc:!u&&r.length>0?a.createElement(v.Z,{toc:r,minHeadingLevel:f,maxHeadingLevel:p}):void 0},a.createElement(s.Z,null,n),(o||m)&&a.createElement(g,{nextItem:o,prevItem:m}))}function h(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(r.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogPostPage)},a.createElement(f,null),a.createElement(p,{sidebar:e.sidebar},a.createElement(t,null))))}},39407:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(87462),l=n(67294),r=n(86010),o=n(93743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function m(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(i.tableOfContents,"thin-scrollbar",t)},l.createElement(o.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:s})))}},93743:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(87462),l=n(67294),r=n(86668);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(c(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,r.L)();return(0,l.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,l.useRef)(void 0),n=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:o}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:o}),c=s(i,{anchorTopOffset:n.current}),m=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const g=l.memo(u);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...f}=e;const v=(0,r.L)(),p=m??v.tableOfContents.minHeadingLevel,h=u??v.tableOfContents.maxHeadingLevel,b=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:h});return d((0,l.useMemo)((()=>{if(c&&s)return{linkClassName:c,linkActiveClassName:s,minHeadingLevel:p,maxHeadingLevel:h}}),[c,s,p,h])),l.createElement(g,(0,a.Z)({toc:b,className:n,linkClassName:c},f))}}}]); \ No newline at end of file diff --git a/assets/js/cced6026.061e2055.js b/assets/js/cced6026.061e2055.js new file mode 100644 index 00000000000..00ee057b4bb --- /dev/null +++ b/assets/js/cced6026.061e2055.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48818],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=p(a),m=n,f=s["".concat(u,".").concat(m)]||s[m]||d[m]||i;return a?r.createElement(f,o(o({ref:t},c),{},{components:a})):r.createElement(f,o({ref:t},c))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},52869:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2022-10-07-node-cli-api",authors:"Jimbo4350",tags:["cli-api-quarterly"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/quarterly/2022-10-07-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-07-nod-api-cli.md",source:"@site/quarterly/2022-11-07-nod-api-cli.md",title:"Node API & CLI Team Update",description:"Node-Api-Cli Quarterly Update",date:"2022-11-07T00:00:00.000Z",formattedDate:"November 7, 2022",tags:[{label:"cli-api-quarterly",permalink:"/cardano-updates/quarterly/tags/cli-api-quarterly"}],readingTime:1.355,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-10-07-node-cli-api",authors:"Jimbo4350",tags:["cli-api-quarterly"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2022-11-07-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"Node-Api-Cli Quarterly Update",id:"node-api-cli-quarterly-update",level:2},{value:"2022-09 - 2022-11-04",id:"2022-09---2022-11-04",level:2}],c={toc:p},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"node-api-cli-quarterly-update"},"Node-Api-Cli Quarterly Update"),(0,n.kt)("h2",{id:"2022-09---2022-11-04"},"2022-09 - 2022-11-04"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0"),(0,n.kt)("li",{parentName:"ul"},"Major clean up of stale iusses + PRs."),(0,n.kt)("li",{parentName:"ul"},"Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs"),(0,n.kt)("li",{parentName:"ul"},"cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node."),(0,n.kt)("li",{parentName:"ul"},"cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation."),(0,n.kt)("li",{parentName:"ul"},"General documentation updates and improvements"),(0,n.kt)("li",{parentName:"ul"},"Addition of tx-mempool command which allows users to:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Query the node about the current mempool's capacity and sizes"),(0,n.kt)("li",{parentName:"ul"},"Request the next transaction from the mempool's current list"),(0,n.kt)("li",{parentName:"ul"},"Query if a particular transaction exists in the mempool"))),(0,n.kt)("li",{parentName:"ul"},"Initial refactoring of cardano-testnet")),(0,n.kt)("p",null,"Next quarter"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-api",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately."))),(0,n.kt)("li",{parentName:"ul"},"cardano-testnet",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Working with Marc Fontaine to create an easy to use executable to deploy testnets locally - ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/4598"},"https://github.com/input-output-hk/cardano-node/issues/4598")))),(0,n.kt)("li",{parentName:"ul"},"Serenity",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above."))),(0,n.kt)("li",{parentName:"ul"},"General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccf451f9.7efe9c4d.js b/assets/js/ccf451f9.7efe9c4d.js new file mode 100644 index 00000000000..11f76e3d891 --- /dev/null +++ b/assets/js/ccf451f9.7efe9c4d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[5237],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=s(a),c=n,m=d["".concat(p,".").concat(c)]||d[c]||h[c]||o;return a?r.createElement(m,i(i({ref:t},u),{},{components:a})):r.createElement(m,i({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},81451:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-10-20-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-10-20-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-20-hydra.md",source:"@site/blog/2023-10-20-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-20T00:00:00.000Z",formattedDate:"October 20, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.84,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-20-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-24-node-cli-api"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-18-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:s},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023."),(0,n.kt)("p",null,"In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON.\nThis improvement offers users greater flexibility and ease of interaction with the API."),(0,n.kt)("p",null,"Finally, the team has followed up on the TUI brick upgrade to version 1.10.\nThis effort has resulted in addressing minor details and enhancing the overall user experience with the TUI."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Prepare presentation and workshop for Cardano Summit."),(0,n.kt)("li",{parentName:"ul"},"More TUI fixes and improvements.",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1127"},"#1127")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1120"},"#1120")))),(0,n.kt)("li",{parentName:"ul"},"Upgrade GHC from 9.2.8 -> 9.6.2 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1105"},"#1105")),(0,n.kt)("li",{parentName:"ul"},"Solved user issue related to submitting transactions in cbor format ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1111"},"#1111"),"."),(0,n.kt)("li",{parentName:"ul"},"Fix hydraw connection issue making it more stable ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1121"},"#1121"),".")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Work on hydra-poll dApp for Cardano summit."),(0,n.kt)("li",{parentName:"ul"},"Start the work on packaging hydra-node and related services.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ccfc9222.e04c413b.js b/assets/js/ccfc9222.e04c413b.js new file mode 100644 index 00000000000..6c45e81ee68 --- /dev/null +++ b/assets/js/ccfc9222.e04c413b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87233],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),c=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(h,i(i({ref:t},u),{},{components:a})):n.createElement(h,i({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var c=2;c<o;c++)i[c]=a[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},86986:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-03-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-03-22-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-node-cli-api.md",source:"@site/blog/2023-03-22-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-03-22T00:00:00.000Z",formattedDate:"March 22, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.645,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-03-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-03-22-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-22-performance-and-tracing"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],u={toc:c},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-03-22---2023-04-05"},"2023-03-22 - 2023-04-05"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Added new cardano-cli ping command which allows users to ping remote cardano-nodes."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"transaction build")," command now can automatically balance multiassets"),(0,r.kt)("li",{parentName:"ul"},"New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5041"},"Remove unused error constructors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4909"},"Fix qKesKesKeyExpiry to not always be null")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"New cardano-cli ping command.")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5040"},"Remove use of AcquireFailure type")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5038"},"Simplify implementation of executeQueryAnyMode")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5002"},"Script data serialisation")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4956"},"Guard against overflows in Shelley TxIns")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4941"},"Combinators for TxBodyContent and related types")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5011"},"Use Haskell variables for passing values.")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4879"},"Re-enable kes-period-info test."))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd0ded60.0db37d65.js b/assets/js/cd0ded60.0db37d65.js new file mode 100644 index 00000000000..fa468cc3988 --- /dev/null +++ b/assets/js/cd0ded60.0db37d65.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[27668],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(a),m=n,c=u["".concat(p,".").concat(m)]||u[m]||d[m]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},72238:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-06-30-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-30-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-30-hydra.md",source:"@site/blog/2023-06-30-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-30T00:00:00.000Z",formattedDate:"June 30, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.925,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-30-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-07-04-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-29-mithril"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:s},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team wrote and published the monthly report for June,\nimplemented the end-to-end functionality for external commits, and tested it on\nthe preview environment. They also listed Hydra as a tool on the Cardano\ndeveloper portal, providing more visibility for the project. The team clarified\nthe path forward for L2 protocol improvements and explored an alternative CI\napproach using cabal instead of nix. Additionally, they released version 0.11.0,\nmarking another milestone in the project","\u2019","s development."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Written and published the monthly report for ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-06"},"June")),(0,n.kt)("li",{parentName:"ul"},"Implemented external commits end-to-end incl. tested it on preview ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215")),(0,n.kt)("li",{parentName:"ul"},"Listed Hydra as a tool on cardano ",(0,n.kt)("a",{parentName:"li",href:"https://developers.cardano.org/tools/"},"developer portal")),(0,n.kt)("li",{parentName:"ul"},"Cleared up path forward on L2 protocol improvements ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Established an alternative CI using more cabal tools ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/923"},"#923")),(0,n.kt)("li",{parentName:"ul"},"Release version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.10.0"},"0.11.0"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Spike on performance improvements of event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/913"},"#913")),(0,n.kt)("li",{parentName:"ul"},"Complete ReqSn only sends transaction ids ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Groom and plan last items for 0.12.0 (remove internal commit)"),(0,n.kt)("li",{parentName:"ul"},"Improve reliability of benchmarks")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd612773.d9b87bb0.js b/assets/js/cd612773.d9b87bb0.js new file mode 100644 index 00000000000..dca7ef8cbd4 --- /dev/null +++ b/assets/js/cd612773.d9b87bb0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67205],{3905:(t,e,a)=>{a.d(e,{Zo:()=>s,kt:()=>d});var r=a(67294);function n(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function i(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?o(Object(a),!0).forEach((function(e){n(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function u(t,e){if(null==t)return{};var a,r,n=function(t,e){if(null==t)return{};var a,r,n={},o=Object.keys(t);for(r=0;r<o.length;r++)a=o[r],e.indexOf(a)>=0||(n[a]=t[a]);return n}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(r=0;r<o.length;r++)a=o[r],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(n[a]=t[a])}return n}var l=r.createContext({}),p=function(t){var e=r.useContext(l),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.createElement(l.Provider,{value:e},t.children)},c="mdxType",h={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var a=t.components,n=t.mdxType,o=t.originalType,l=t.parentName,s=u(t,["components","mdxType","originalType","parentName"]),c=p(a),m=n,d=c["".concat(l,".").concat(m)]||c[m]||h[m]||o;return a?r.createElement(d,i(i({ref:e},s),{},{components:a})):r.createElement(d,i({ref:e},s))}));function d(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var o=a.length,i=new Array(o);i[0]=m;var u={};for(var l in e)hasOwnProperty.call(e,l)&&(u[l]=e[l]);u.originalType=t,u[c]="string"==typeof t?t:n,i[1]=u;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},26169:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Crypto Team Update",slug:"2023-05-12-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,u={permalink:"/cardano-updates/2023-05-12-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-crypto.md",source:"@site/blog/2023-05-12-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.095,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-05-12-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-17-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-12-goedel"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"cardano-base",id:"cardano-base",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},c="wrapper";function h(t){let{components:e,...a}=t;return(0,n.kt)(c,(0,r.Z)({},s,a,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"cardano-base: Include final tests for BLS signature. Further adaptations for KES agent. "),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"RawBearer API in ouroboros-network-framework (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395)"},"https://github.com/input-output-hk/ouroboros-network/pull/4395)"),"; this is needed for KES Agent. Review ongoing."),(0,n.kt)("li",{parentName:"ul"},"Facilitate BLS test vectors in Haskell test suite (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/408"},"https://github.com/input-output-hk/cardano-base/pull/408"),")"),(0,n.kt)("li",{parentName:"ul"},"Add the SignKeyWithKES type to cardano-base (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/389"},"https://github.com/input-output-hk/cardano-base/pull/389"),")"),(0,n.kt)("li",{parentName:"ul"},"Restructuring and simplifying the MLocking code in cardano-base (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/404"},"https://github.com/input-output-hk/cardano-base/pull/404"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/405"},"https://github.com/input-output-hk/cardano-base/pull/405"),"), getting rid of the purpose-built MonadMLock etc. typeclasses in the process"),(0,n.kt)("li",{parentName:"ul"},"Merging the DSIGN and DSIGNM APIs such that the same phantom type can be used to select both the pure and mlocked versions of the same DSIGN algorithm (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/411"},"https://github.com/input-output-hk/cardano-base/pull/411"),")"),(0,n.kt)("li",{parentName:"ul"},"Simplifying the KES API into a single KESAlgorithm typeclass, merging the KESSignAlgorithm class into it (this is possible due to the simplifications from #404). (Same PR as above: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/411"},"https://github.com/input-output-hk/cardano-base/pull/411"),")."),(0,n.kt)("li",{parentName:"ul"},"Update CIP-0381 with new plutus built-in functions, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/506"},"#506"),". In particular hash_to_curve now takes as input a secon input for the Domain Separation Tag (DST), and we limit to have a maximu size of 255 bytes. ")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Opened PR in halo2curves to include BLS12-381 and JubJub, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/privacy-scaling-explorations/halo2curves/pull/38"},"#38")),(0,n.kt)("li",{parentName:"ul"},"Addition constraint over JubJub merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sidechains-zk/pull/10"},"#10"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce17d78b.b895a29b.js b/assets/js/ce17d78b.b895a29b.js new file mode 100644 index 00000000000..8e64cfe3115 --- /dev/null +++ b/assets/js/ce17d78b.b895a29b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[77533],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},c),{},{components:n})):r.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},9586:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"SRE Q2 2023 Update",slug:"2023-Q2-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2023-Q2-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-sre.md",source:"@site/quarterly/2023-Q2-sre.md",title:"SRE Q2 2023 Update",description:"2023-04 - 2023-06",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"sre",permalink:"/cardano-updates/quarterly/tags/sre"}],readingTime:.68,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Q2 2023 Update",slug:"2023-Q2-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Network Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-network"},nextItem:{title:"Performance & Tracing Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"2023-04 - 2023-06",id:"2023-04---2023-06",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Next steps",id:"next-steps",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"2023-04---2023-06"},"2023-04 - 2023-06"),(0,a.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,a.kt)("p",null,"In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Expanding the darwin CI cluster and adding aarch64 builder support"),(0,a.kt)("li",{parentName:"ul"},"Adding bare metal capability to bitte clusters"),(0,a.kt)("li",{parentName:"ul"},"Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality"),(0,a.kt)("li",{parentName:"ul"},"Creation of pool performance analysis queries and scripting"),(0,a.kt)("li",{parentName:"ul"},"Migration of testnet metadata server to cardano-world"),(0,a.kt)("li",{parentName:"ul"},"Cardano shelley qa migration to cardano-world"),(0,a.kt)("li",{parentName:"ul"},"Cardano sanchonet environment spin up to test Conway era functionality"),(0,a.kt)("li",{parentName:"ul"},"Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature")),(0,a.kt)("h3",{id:"next-steps"},"Next steps"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Continue with the conversion of mainnet to using p2p topology")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce6dcc9e.38a5e04e.js b/assets/js/ce6dcc9e.38a5e04e.js new file mode 100644 index 00000000000..7fc4b20aa6c --- /dev/null +++ b/assets/js/ce6dcc9e.38a5e04e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[77644],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},l=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=r,m=d["".concat(p,".").concat(h)]||d[h]||u[h]||o;return n?a.createElement(m,s(s({ref:t},l),{},{components:n})):a.createElement(m,s({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=h;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,s[1]=i;for(var c=2;c<o;c++)s[c]=n[c];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},56737:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={title:"DB Sync Team Update",slug:"2022-09-19-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-09-19-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-19-db-sync.md",source:"@site/blog/2022-09-19-db-sync.md",title:"DB Sync Team Update",description:"DBSync Update",date:"2022-09-19T00:00:00.000Z",formattedDate:"September 19, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:1.525,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB Sync Team Update",slug:"2022-09-19-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-09-20-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-16-ledger"}},p={authorsImageUrls:[void 0]},c=[{value:"DBSync Update",id:"dbsync-update",level:2},{value:"New Tag",id:"new-tag",level:3},{value:"Open source",id:"open-source",level:3},{value:"Progress on tech debt and new features",id:"progress-on-tech-debt-and-new-features",level:3}],l={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"dbsync-update"},"DBSync Update"),(0,r.kt)("h3",{id:"new-tag"},"New Tag"),(0,r.kt)("p",null,"We created a new db-sync tag 13.0.5 which addresses shortcomings of the last\nrelease 13.0.4. It is currently under testing.\nThe Changelog is\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/blob/8ad98d48e0068f3768d48e18fdcbe254037cba3b/cardano-db-sync/CHANGELOG.md#1305"},"here")," and in more details:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed fees for tx with phase 2 failure that didn't include a total collateral field.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1248"},"1248"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed an issue that could cause db-sync to crash if a specific rollback occured.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1247"},"1247"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but\ncould result in the wrong CBOR encoding being inserted.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1217"},"1217"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"All the fixes above come with unit tests which validates the fix.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Added support for preprod and preview from docker. DBSync no longer needs to include the configs\nfor different networks, these are directly fetched from the cardano world.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1254"},"1254"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We added better support from docker for the new disable options and the overall documentation.\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1260"},"1260")))),(0,r.kt)("p",null,"All the above were also backported to the master branch"),(0,r.kt)("h3",{id:"open-source"},"Open source"),(0,r.kt)("p",null,"We made the db-sync ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/52/views/1"},"board public"),", so\neveryone can have access on the issues we prioritise.\nWe also added new tasks to the board, some of them could be approachable to newcomers or people who\nwant to contribute."),(0,r.kt)("h3",{id:"progress-on-tech-debt-and-new-features"},"Progress on tech debt and new features"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1223"},"1223")," was merged, which removes the\nforeign keys from the db schema. This opens the road to a number of optimizations.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"An additional fix on top of the previous work was added\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1250"},"1250"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"An initial version where DBSync does not rollback on restart is done here\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1266"},"1266"),".\nThis allows db-sync to restart much faster, without the need to delete data and reinsert them. In\nthe future it can also facilitate migrations in cases where the ledger snapshots have a breaking\nchange, without the need to resync everything from genesis."))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce7ed51f.8bdb2215.js b/assets/js/ce7ed51f.8bdb2215.js new file mode 100644 index 00000000000..1d3ce2d003f --- /dev/null +++ b/assets/js/ce7ed51f.8bdb2215.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30830],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),s=u(a),m=n,h=s["".concat(p,".").concat(m)]||s[m]||c[m]||o;return a?r.createElement(h,i(i({ref:t},d),{},{components:a})):r.createElement(h,i({ref:t},d))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},71367:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-04-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-14-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-14-hydra.md",source:"@site/blog/2023-04-14-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-14T00:00:00.000Z",formattedDate:"April 14, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.98,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-14-goedel"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-07-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team focused on improving the smoke test, fixing developer\ntooling, and improving the API for voting use cases. They reviewed progress on\nauction, payments, and voting projects and made worked on reproducing a bug with\nhandling rollbacks. Moving forward, the team plans to update dependencies,\nimplement a dirt road fix for the rollbacks bug, and explore adding Hydra\nsupport to kupo."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Reviewed progress on auction, payments and voting projects"),(0,n.kt)("li",{parentName:"ul"},"Improved smoke tests so they can run on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Fixed a regression in the development environment and updated cardano-node\nused in tests"),(0,n.kt)("li",{parentName:"ul"},"Improved API with more configurability to unblock voting use case",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Exclude utxo in ",(0,n.kt)("inlineCode",{parentName:"li"},"SnapshotConfirmed")," outputs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/808"},"#808")),(0,n.kt)("li",{parentName:"ul"},"Addressed a user request by only sending ",(0,n.kt)("inlineCode",{parentName:"li"},"Greetings")," once ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/813"},"#813")))),(0,n.kt)("li",{parentName:"ul"},"Reproduced the rollback bug by improving our model-based test suite ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies to match ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node")," master"),(0,n.kt)("li",{parentName:"ul"},"Dirt road fix for rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Update Hydraw to maintain state locally"),(0,n.kt)("li",{parentName:"ul"},"Explore adding Hydra support to kupo"),(0,n.kt)("li",{parentName:"ul"},"Put disclaimer texts and closing mainnet compatibility feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cf1bc381.4cd9437b.js b/assets/js/cf1bc381.4cd9437b.js new file mode 100644 index 00000000000..bb461c3a4ad --- /dev/null +++ b/assets/js/cf1bc381.4cd9437b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[84773],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>f});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=r.createContext({}),s=function(e){var n=r.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=s(e.components);return r.createElement(c.Provider,{value:n},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},p=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),m=s(t),p=a,f=m["".concat(c,".").concat(p)]||m[p]||u[p]||i;return t?r.createElement(f,o(o({ref:n},d),{},{components:t})):r.createElement(f,o({ref:n},d))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=p;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var s=2;s<i;s++)o[s]=t[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,t)}p.displayName="MDXCreateElement"},77907:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=t(87462),a=(t(67294),t(3905));const i={title:"Performance & tracing update",slug:"2023-06-14-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-14-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-14-performance-and-tracing.md",source:"@site/blog/2023-06-14-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-06-14T00:00:00.000Z",formattedDate:"June 14, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.515,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-06-14-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-14-consensus"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-12-network"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},m="wrapper";function u(e){let{components:n,...t}=e;return(0,a.kt)(m,(0,r.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've continued release benchmarking and established a new baseline for ",(0,a.kt)("inlineCode",{parentName:"li"},"8.0.0"),"."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"In our release benchmarking cycle, we established a new performance baseline for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0.0"),". Additionally, we've measured\nperformance under various workloads for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.1.1-pre"),"; the results look promising and validate the optimization efforts\ndone on several system components. "),(0,a.kt)("p",null,"In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for\nbenchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be\nmeaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific\ntrace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles. "),(0,a.kt)("p",null,"Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs. "),(0,a.kt)("p",null,"This means the backend is entering validation phase, where we systematically compare all metrics taken from the new\ninfrastructure to the existing ones, including determining reproducibility and variance."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cfb82551.e63304fb.js b/assets/js/cfb82551.e63304fb.js new file mode 100644 index 00000000000..2a57f245ead --- /dev/null +++ b/assets/js/cfb82551.e63304fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6036],{85146:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/cfdb38ee.97cf8400.js b/assets/js/cfdb38ee.97cf8400.js new file mode 100644 index 00000000000..6780dc096ba --- /dev/null +++ b/assets/js/cfdb38ee.97cf8400.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59736],{91779:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/24","page":24,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/23","nextPage":"/cardano-updates/page/25","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/d0639dee.f18be2c7.js b/assets/js/d0639dee.f18be2c7.js new file mode 100644 index 00000000000..7f58ec69c65 --- /dev/null +++ b/assets/js/d0639dee.f18be2c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[52506],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),p=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),l=p(n),m=a,h=l["".concat(u,".").concat(m)]||l[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},c),{},{components:n})):r.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[l]="string"==typeof e?e:a,s[1]=i;for(var p=2;p<o;p++)s[p]=n[p];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},84505:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-11-29-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-11-29-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-29-consensus.md",source:"@site/blog/2023-11-29-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-11-29T00:00:00.000Z",formattedDate:"November 29, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.51,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-11-29-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-12-01-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-29-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:p},l="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(l,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The Consensus team implemented and tested a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/525"},"patch")," that does not propagate future headers.\nIt is under review, and we expect it can be released in the next Cardano node version.\nOn the UTxO-HD front, we ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/510"},"finished")," prototyping the ",(0,a.kt)("inlineCode",{parentName:"p"},"LedgerDB")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"BackingStore")," redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend.\nWith this prototype finished we can start integrating the rest of the code.\nWe ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/513"},"investigated")," the unexpected performance degradation observed when acquiring the block context.\nWe also ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.7.0-pre"},"released Cardano node 8.7.0")," and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3893"},"moved")," ",(0,a.kt)("inlineCode",{parentName:"p"},"tree-diff")," outside ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-ledger")," libraries."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d077dadd.9fa7f5a1.js b/assets/js/d077dadd.9fa7f5a1.js new file mode 100644 index 00000000000..30c2579586d --- /dev/null +++ b/assets/js/d077dadd.9fa7f5a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88862],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(l,".").concat(d)]||p[d]||m[d]||o;return n?a.createElement(h,s(s({ref:t},u),{},{components:n})):a.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:r,s[1]=i;for(var c=2;c<o;c++)s[c]=n[c];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},4491:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-06-28-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-06-28-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-28-consensus.md",source:"@site/blog/2023-06-28-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-06-28T00:00:00.000Z",formattedDate:"June 28, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.85,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-06-28-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-29-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-06-28-performance-and-tracing"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:3},{value:"UTxO-HD",id:"utxo-hd",level:3}],u={toc:c},p="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team. "),(0,r.kt)("p",null,"The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components."),(0,r.kt)("p",null,"Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node. "),(0,r.kt)("h3",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/101#issuecomment-1607767722"},"decided on an approach")," of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team."))),(0,r.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We merged the last of the PRs that were part of UTxO-HD improvements for version ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/149"},"0.1"),": expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size."),(0,r.kt)("li",{parentName:"ul"},"We ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/87"},"added"),' a new "legacy" cardano block in a new ',(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-consensus-cardano-legacy-block")," package that should ease the transition for some downstream packages to UTxO-HD, like ",(0,r.kt)("inlineCode",{parentName:"li"},"db-sync"),". This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block."),(0,r.kt)("li",{parentName:"ul"},"We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d0a351c0.258067ed.js b/assets/js/d0a351c0.258067ed.js new file mode 100644 index 00000000000..01287cc07b7 --- /dev/null +++ b/assets/js/d0a351c0.258067ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51934],{298:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/ledger/page/3","page":3,"postsPerPage":5,"totalPages":6,"totalCount":30,"previousPage":"/cardano-updates/tags/ledger/page/2","nextPage":"/cardano-updates/tags/ledger/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/d0e182b9.835c5b63.js b/assets/js/d0e182b9.835c5b63.js new file mode 100644 index 00000000000..aae5d6e73ef --- /dev/null +++ b/assets/js/d0e182b9.835c5b63.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32627],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var r=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function l(e,t){if(null==e)return{};var i,r,a=function(e,t){if(null==e)return{};var i,r,a={},n=Object.keys(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)i=n[r],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=r.createContext({}),u=function(e){var t=r.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),m=u(i),d=a,c=m["".concat(p,".").concat(d)]||m[d]||h[d]||n;return i?r.createElement(c,o(o({ref:t},s),{},{components:i})):r.createElement(c,o({ref:t},s))}));function c(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var u=2;u<n;u++)o[u]=i[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,i)}d.displayName="MDXCreateElement"},81065:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(87462),a=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-06-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-29-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-29-mithril.md",source:"@site/blog/2023-06-29-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-06-29T00:00:00.000Z",formattedDate:"June 29, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:2.205,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-06-29-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-30-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-28-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},m="wrapper";function h(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,r.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano ",(0,a.kt)("inlineCode",{parentName:"p"},"mainnet")," infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator."),(0,a.kt)("p",null,"Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,a.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add infrastructure monitoring")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/987"},"#987")))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Prepare Mithril Signer deployment model for SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/862"},"#862"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/961"},"#961")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Adapt infrastructure to use Mithril Relay")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1018"},"#1018")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Announce the new signer deployment model in a dev blog post")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1017"},"#1017")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,a.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Aggregator does not exit on critical error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/993"},"#993")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Computation of master certificate of an epoch is incorrect")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1006"},"#1006")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"End to end tests are flaky")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/954"},"#954")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"'testing-preview' network does not create certificates")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1015"},"#1015")))),(0,a.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Dates format is not standardized")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/946"},"#946")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add 'recompute-certificates-hash' command to aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1001"},"#1001")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Add a retry mechanism for artifact creation in aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/984"},"#984")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Log node version at startup in Aggregator/Signer")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/944"},"#944")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Reactivate Publish Results job in CI")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/978"},"#978")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Clean 'pending_snapshot' directory of aggregator")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/983"},"#983")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update OpenAPI spec examples")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1000"},"#1000")))),(0,a.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor 'MithrilStakeDistribution' entity")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/967"},"#967")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactoring client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/982"},"#982")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor download code in client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1010"},"#1010")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Factorize protocol crypto operations")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/669"},"#669")))),(0,a.kt)("li",{parentName:"ul"},"Worked on dependencies:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Upgrade Cardano node to '8.1.1'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/973"},"#973"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d10ad4a6.af42a029.js b/assets/js/d10ad4a6.af42a029.js new file mode 100644 index 00000000000..116862a6df6 --- /dev/null +++ b/assets/js/d10ad4a6.af42a029.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[6166],{9785:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/30","page":30,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/29","nextPage":"/cardano-updates/page/31","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/d124c703.15587654.js b/assets/js/d124c703.15587654.js new file mode 100644 index 00000000000..3a160f559a8 --- /dev/null +++ b/assets/js/d124c703.15587654.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[15152],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),l=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(r),m=n,d=c["".concat(p,".").concat(m)]||c[m]||h[m]||o;return r?a.createElement(d,i(i({ref:t},u),{},{components:r})):a.createElement(d,i({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:n,i[1]=s;for(var l=2;l<o;l++)i[l]=r[l];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}m.displayName="MDXCreateElement"},54219:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=r(87462),n=(r(67294),r(3905));const o={title:"Open-Source Team",slug:"2022-10-31-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-10-31-open-source",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-open-source.md",source:"@site/blog/2022-11-04-open-source.md",title:"Open-Source Team",description:"High Level Summary",date:"2022-11-04T00:00:00.000Z",formattedDate:"November 4, 2022",tags:[{label:"open-source",permalink:"/cardano-updates/tags/open-source"}],readingTime:1.465,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Open-Source Team",slug:"2022-10-31-open-source",authors:"coot",tags:["open-source"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-04-mithril"},nextItem:{title:"Embedding Quality Workstream",permalink:"/cardano-updates/2022-11-03-embedding-quality"}},p={authorsImageUrls:[void 0]},l=[{value:"High Level Summary",id:"high-level-summary",level:2},{value:"Detailed description",id:"detailed-description",level:2}],u={toc:l},c="wrapper";function h(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High Level Summary"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We've been working toward publishing ",(0,n.kt)("em",{parentName:"li"},"Cardano Backlog"),", currently its in\nreview by the IOG communication team."),(0,n.kt)("li",{parentName:"ul"},"We identified a number of libraries which can be published."),(0,n.kt)("li",{parentName:"ul"},"We setup and enhanced ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-updates"},"cardano-updates"),".")),(0,n.kt)("h2",{id:"detailed-description"},"Detailed description"),(0,n.kt)("p",null,"I am glad to announce that I was given the role of open-source advocate for\ncardano project. In last few weeks we were making steps towards publishing our\nbacklog. It's currently under review by the communication team, although most\nof the issues are already visible across various repositories."),(0,n.kt)("p",null,"The open-source initiatives have their own\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/60"},"project"),". It is set up\nto help us track our major open-source activities. Right now there are two\nwork streams:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"the work on ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-engineering-handbook/"},(0,n.kt)("em",{parentName:"a"},"Cardano Engineering Handbook")),";"),(0,n.kt)("li",{parentName:"ul"},"libraries to be release on ",(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/"},"Hackage")," or ",(0,n.kt)("a",{parentName:"li",href:"https://crates.io"},"crates.io"),".")),(0,n.kt)("p",null,"We identifies a number of libraries across all the teams which contribute to\n",(0,n.kt)("em",{parentName:"p"},"Cardano")," which we would like publish to publish, see the following\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/60/views/3"},"link"),". Arnauld Bailly recently published\n",(0,n.kt)("a",{parentName:"p",href:"https://hackage.haskell.org/package/quickcheck-dynamic"},(0,n.kt)("inlineCode",{parentName:"a"},"quickcheck-dynamic")),"\nlibrary on Hackage. The networking team is slowly progressing towards\npublishing ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim"},"io-sim")," and related packages, checkout the progress\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/19/views/24"},"here"),"."),(0,n.kt)("p",null,"Thanks to Arnaud Bailly our ",(0,n.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/cardano-updates"},"Cardano Updates")," website has\na new look & feel! It's using ",(0,n.kt)("a",{parentName:"p",href:"https://docusaurus.io"},"docusaurus.io"),"."),(0,n.kt)("p",null,"Christian Taylor carried recently a detailed analysis of our open-source\nrepositories. He collected many interesting metrics, which allows us to see\nwhere we need to improve as an open-source project to make the Cardano project\nand many smaller related libraries which we maintain be more open and available\nfor open-source contributors."),(0,n.kt)("p",null,"The graph below shows which documents the 55 most important Cardano\nrepositories are missing the most:\n",(0,n.kt)("img",{alt:"Documentation Adoption",src:r(59380).Z,width:"1493",height:"716"}),"\nYou can expect we will improve in these metrics in the coming weeks."))}h.isMDXComponent=!0},59380:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/doc-adoption-cd944582f02809777c58be53e13453c5.png"}}]); \ No newline at end of file diff --git a/assets/js/d15a0787.33318e9f.js b/assets/js/d15a0787.33318e9f.js new file mode 100644 index 00000000000..66ac9073aff --- /dev/null +++ b/assets/js/d15a0787.33318e9f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89548],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=p(a),s=n,m=d["".concat(u,".").concat(s)]||d[s]||h[s]||i;return a?r.createElement(m,l(l({ref:t},c),{},{components:a})):r.createElement(m,l({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=s;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,l[1]=o;for(var p=2;p<i;p++)l[p]=a[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}s.displayName="MDXCreateElement"},20257:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-09-29-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-09-29-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-hydra.md",source:"@site/blog/2023-09-29-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.49,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-29-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-29-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-29-ledger"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],c={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team mainly focused on having a working new reliability\nnetwork layer; and specified its expected behavior in a new ADR."),(0,n.kt)("p",null,'They also revisited the security policy and vulnerability disclosure policy on\nhow to handle security vulnerability within Hydra, and in particular how to\nhandle so-called "Silent fixes".'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated security policy and vulnerability disclosure policy ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1088"},"#1088")),(0,n.kt)("li",{parentName:"ul"},"Adr/network reliability ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1082"},"#1082"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Introduce reliability network layer ","[#1074]"," (",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1074"},"https://github.com/input-output-hk/hydra/pull/1074"),")"),(0,n.kt)("li",{parentName:"ul"},"Refactor the vCommit validator in Aiken ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1072"},"#1072"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d19a344f.3d64c4eb.js b/assets/js/d19a344f.3d64c4eb.js new file mode 100644 index 00000000000..d52214cdbf0 --- /dev/null +++ b/assets/js/d19a344f.3d64c4eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20387],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),c=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(a),d=n,g=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return a?r.createElement(g,l(l({ref:t},s),{},{components:a})):r.createElement(g,l({ref:t},s))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c<o;c++)l[c]=a[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},3568:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-04-14-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-04-14-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-14-goedel.md",source:"@site/blog/2023-04-14-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-04-14T00:00:00.000Z",formattedDate:"April 14, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.415,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-04-14-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Incident Report",permalink:"/cardano-updates/2023-04-17-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-14-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team has submitted two papers for publication, carried\nout consultancy with other teams and has an opening for an intern."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Finalised and submitted two papers to ICE 2023")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Studying Praos paper.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/"))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Design exploration for congestion management."))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d1d47ba3.c8bfd78a.js b/assets/js/d1d47ba3.c8bfd78a.js new file mode 100644 index 00000000000..bfd26222fce --- /dev/null +++ b/assets/js/d1d47ba3.c8bfd78a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65319],{62205:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/11","page":11,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/10","nextPage":"/cardano-updates/page/12","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/d200e7a4.e30d362a.js b/assets/js/d200e7a4.e30d362a.js new file mode 100644 index 00000000000..ab7f2bd73b2 --- /dev/null +++ b/assets/js/d200e7a4.e30d362a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20738],{32771:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/41","page":41,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/40","nextPage":"/cardano-updates/page/42","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/d2ab2776.0b7a25c4.js b/assets/js/d2ab2776.0b7a25c4.js new file mode 100644 index 00000000000..b77a0d99373 --- /dev/null +++ b/assets/js/d2ab2776.0b7a25c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16360],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=s(a),u=r,h=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:r,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}u.displayName="MDXCreateElement"},40090:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-06-08-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-08-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-goedel.md",source:"@site/blog/2023-06-08-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.605,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-06-08-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-06-08-db-sync"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-08-sre"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint the team has been working on giving and preparing public\ntalks, also on preparing final versions of their ICE 2023 papers, and\non analysing chain selection."),(0,r.kt)("p",null,"This sprint the team has been working on final revisions for the\npre-proceedings versions of two ICE 2023 papers."),(0,r.kt)("h2",{id:"details"},"Details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Lambda Days keynote by Kevin Hammond:\n",(0,r.kt)("a",{parentName:"p",href:"https://www.lambdadays.org/lambdadays2023"},"https://www.lambdadays.org/lambdadays2023"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Codebeam keynote by Peter Van Roy: ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"},"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"),"; ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"},"https://www.youtube.com/watch?v=h8sE3Ai8Dsk"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing talks and final versions for two ICE 2023 contributions:\n",(0,r.kt)("a",{parentName:"p",href:"https://www.discotec.org/2023/ice"},"https://www.discotec.org/2023/ice"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Analysing chain selection.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,r.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d2aca35e.86129eca.js b/assets/js/d2aca35e.86129eca.js new file mode 100644 index 00000000000..4babe42f276 --- /dev/null +++ b/assets/js/d2aca35e.86129eca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[13412],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(u,".").concat(c)]||d[c]||h[c]||i;return a?r.createElement(m,l(l({ref:t},s),{},{components:a})):r.createElement(m,l({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,l[1]=o;for(var p=2;p<i;p++)l[p]=a[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},62337:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-10-06-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-10-06-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-06-hydra.md",source:"@site/blog/2023-10-06-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-06T00:00:00.000Z",formattedDate:"October 6, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.88,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-06-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-10-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-10-06-performance-and-tracing"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},d="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums."),(0,n.kt)("p",null,"The team also delivered the first version of the network resilience layer, significantly increasing head availability."),(0,n.kt)("p",null,"Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra."),(0,n.kt)("p",null,"Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Release ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.13.0"},"0.13.0")),(0,n.kt)("li",{parentName:"ul"},"Published vulnerability reports ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1088"},"#1088")),(0,n.kt)("li",{parentName:"ul"},"Merged network resilience work part I ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1074"},"#1074")),(0,n.kt)("li",{parentName:"ul"},"Planning for Cardano Summit participation "),(0,n.kt)("li",{parentName:"ul"},"Discussions with funded Catalyst projects wanting to build on Hydra for support"),(0,n.kt)("li",{parentName:"ul"},"Merged typos fix PR from @omahs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1095"},"#1095"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete Aiken commit validator script ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1072"},"#1072")),(0,n.kt)("li",{parentName:"ul"},"Complete Kupo integration ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1078"},"#1078")),(0,n.kt)("li",{parentName:"ul"},"Brick upgrade on TUI ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1103"},"#1103")),(0,n.kt)("li",{parentName:"ul"},"Clean backlog"),(0,n.kt)("li",{parentName:"ul"},"Prepare and rehearse demo and talk for Cardano Summit")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d2ea5af2.447b9563.js b/assets/js/d2ea5af2.447b9563.js new file mode 100644 index 00000000000..87715eceb3c --- /dev/null +++ b/assets/js/d2ea5af2.447b9563.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91984],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?n(Object(a),!0).forEach((function(t){l(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):n(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function u(e,t){if(null==e)return{};var a,r,l=function(e,t){if(null==e)return{};var a,r,l={},n=Object.keys(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),i=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=i(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,d=u(e,["components","mdxType","originalType","parentName"]),c=i(a),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||n;return a?r.createElement(h,o(o({ref:t},d),{},{components:a})):r.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=s;var u={};for(var p in t)hasOwnProperty.call(t,p)&&(u[p]=t[p]);u.originalType=e,u[c]="string"==typeof e?e:l,o[1]=u;for(var i=2;i<n;i++)o[i]=a[i];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}s.displayName="MDXCreateElement"},15042:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>u,toc:()=>i});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-04-21-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,u={permalink:"/cardano-updates/2023-04-21-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-21-ledger.md",source:"@site/blog/2023-04-21-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-04-21T00:00:00.000Z",formattedDate:"April 21, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:.905,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-04-21-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-21-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-20-mithril"}},p={authorsImageUrls:[void 0]},i=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway ledger era",id:"conway-ledger-era",level:3},{value:"Haddocks hosted on github pages",id:"haddocks-hosted-on-github-pages",level:3},{value:"Small improvements to the API",id:"small-improvements-to-the-api",level:3},{value:"Technical Debt",id:"technical-debt",level:3}],d={toc:i},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"We continued to make progress on CIP-1694 and the conway ledger era.\nIn particular, the conway era now supports Plutus V3.\nFinally, we made small improvements to the ledger API and now host\nour Haskell code documentation (haddocks) on github pages."),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway-ledger-era"},"Conway ledger era"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3365"},"pull-3365"),"] - Support for Plutus V3."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3368"},"pull-3368"),"] - Conway genesis fix."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3369"},"pull-3369"),"] - Added some governance ledger state."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3372"},"pull-3372"),"] - Work on the conway delegation certificates."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3384"},"pull-3384"),"] - Rename.")),(0,l.kt)("h3",{id:"haddocks-hosted-on-github-pages"},"Haddocks hosted on github pages"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3385"},"pull-3385"),"] ")),(0,l.kt)("h3",{id:"small-improvements-to-the-api"},"Small improvements to the API"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3366"},"pull-3366"),"]")),(0,l.kt)("h3",{id:"technical-debt"},"Technical Debt"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3367"},"pull-3367"),"] Fix cost model json instances."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3371"},"pull-3371"),"] UMap cleanup."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3373"},"pull-3373"),"] Upgrade to ghc 9.2.7 and cabal 3.10.1."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3375"},"pull-3375"),"] Sadly, we had to revert the ",(0,l.kt)("inlineCode",{parentName:"li"},"TICKF")," optimizations. There was a regression we do not yet understand."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3377"},"pull-3377"),"] Fix cabal warnings."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3383"},"pull-3383"),"] Fix multi-asset test.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d343e3e1.3cb5767a.js b/assets/js/d343e3e1.3cb5767a.js new file mode 100644 index 00000000000..93a856a0a7c --- /dev/null +++ b/assets/js/d343e3e1.3cb5767a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[8033],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(a),d=n,m=s["".concat(p,".").concat(d)]||s[d]||c[d]||o;return a?r.createElement(m,i(i({ref:t},h),{},{components:a})):r.createElement(m,i({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},26796:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-09-15-hydra",authors:["v0d1ch","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-09-15-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-15-hydra.md",source:"@site/blog/2023-09-15-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-15T00:00:00.000Z",formattedDate:"September 15, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.94,hasTruncateMarker:!1,authors:[{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"},{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-15-hydra",authors:["v0d1ch","ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-15-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-15-ledger"}},p={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, most of the Hydra team was attending a cardano scaling workshop in\nNantes, France. They used this oportunity to meet fellow mithril team and spend\nsome time together to hack on some code and, as always, reflect on the past work\nand find optimal path forward for both projects. They also fixed a bug that\ncaused hydra-node to crash when querying L1, worked on a new network resillience\nproof-of-concept and accepted a new ADR related to stateless transaction\nobservation."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano scaling workshop with members of hydra and mithril teams "),(0,n.kt)("li",{parentName:"ul"},"Accepted user contribution for possible new use-case ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1048"},"#1048")),(0,n.kt)("li",{parentName:"ul"},"Fix for the hydra-node crash related to internal wallet query ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1053"},"#1053")),(0,n.kt)("li",{parentName:"ul"},"Collected experimental CI findings ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1070"},"#1070")),(0,n.kt)("li",{parentName:"ul"},"Propose first POC for the network resilience ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1074"},"#1074"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting & report including updates from Mithril"),(0,n.kt)("li",{parentName:"ul"},"Review POC and discuss our options for the network resilience"),(0,n.kt)("li",{parentName:"ul"},"Update cardano-api to version 8.20"),(0,n.kt)("li",{parentName:"ul"},"Address TODOs on aiken commit validator ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1072"},"#1072")),(0,n.kt)("li",{parentName:"ul"},"Complete hydra-support in kupo ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/CardanoSolutions/kupo/pull/117"},"kupo#117"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d3a595c1.813f9114.js b/assets/js/d3a595c1.813f9114.js new file mode 100644 index 00000000000..7d55406694b --- /dev/null +++ b/assets/js/d3a595c1.813f9114.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1537],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?o(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},o=Object.keys(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var u=n.createContext({}),p=function(t){var e=n.useContext(u),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},d=function(t){var e=p(t.components);return n.createElement(u.Provider,{value:e},t.children)},c="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,u=t.parentName,d=i(t,["components","mdxType","originalType","parentName"]),c=p(a),s=r,h=c["".concat(u,".").concat(s)]||c[s]||m[s]||o;return a?n.createElement(h,l(l({ref:e},d),{},{components:a})):n.createElement(h,l({ref:e},d))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i[c]="string"==typeof t?t:r,l[1]=i;for(var p=2;p<o;p++)l[p]=a[p];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},698:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-10-19-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-10-19-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-19-node-cli-api.md",source:"@site/blog/2022-10-19-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-10-19T00:00:00.000Z",formattedDate:"October 19, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.57,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-10-19-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-21-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-18-consensus"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-submit-api",id:"cardano-submit-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],d={toc:p},c="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(c,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-10-19---2022-11-01"},"2022-10-19 - 2022-11-01"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ask the node about the current mempool's capacity and sizes"),(0,r.kt)("li",{parentName:"ul"},"Request the next transaction from the mempool's current list"),(0,r.kt)("li",{parentName:"ul"},"Query if a particular transaction exists in the mempool")),(0,r.kt)("p",null,"Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric ",(0,r.kt)("inlineCode",{parentName:"p"},"tx_submit_fail_count")," has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Documentation improvments"),(0,r.kt)("li",{parentName:"ul"},"Release 1.35.4 was merged & released"),(0,r.kt)("li",{parentName:"ul"},"Exported various types from cardano-api that were requested by community members")),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4508"},"Release 1.35.4"))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4276"},"Add tx-mempool command to CLI")),(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4538"},"Fix query era mismatch bug in transaction build command")),(0,r.kt)("li",{parentName:"ul"},"[Serenity]"," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4516"},"Condense Read and Validation modules in cardano-cli"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4482"},"Return Lovelace for calculateMinimumUTxO")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4554"},"Export IsPlutusScriptLanguage from cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4546"},"Reduce exposed modules in cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4568"},"Add ToJSON and FromJSON instances for Address")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4565"},"Export TxIns type alias from Cardano.Api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4534"},"Export more generators from cardano-api"))),(0,r.kt)("h3",{id:"cardano-submit-api"},"cardano-submit-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4566"},"Add tx_submit_fail_count metric"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4549"},"Upgrade to cabal-3.8.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4613"},"Update building-the-node-using-nix.md"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"None")),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d3f3f546.88297ed1.js b/assets/js/d3f3f546.88297ed1.js new file mode 100644 index 00000000000..fe1f6957796 --- /dev/null +++ b/assets/js/d3f3f546.88297ed1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[13764],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=s(r),h=n,d=c["".concat(u,".").concat(h)]||c[h]||m[h]||i;return r?a.createElement(d,l(l({ref:t},p),{},{components:r})):a.createElement(d,l({ref:t},p))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=h;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var s=2;s<i;s++)l[s]=r[s];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}h.displayName="MDXCreateElement"},54994:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2022-11-25-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2022-11-25-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-25-crypto.md",source:"@site/blog/2022-11-25-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2022-11-25T00:00:00.000Z",formattedDate:"November 25, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.705,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-11-25-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-28-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-25-hydra"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"MuSig2",id:"musig2",level:3},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:2}],p={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The four open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team. "),(0,n.kt)("li",{parentName:"ul"},"Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes"),(0,n.kt)("li",{parentName:"ul"},"cardano-base: The VRF and BLS branchs are still open and in progress"),(0,n.kt)("li",{parentName:"ul"},"KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent. ")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/31"},"PR#31")),(0,n.kt)("li",{parentName:"ul"},"We are introducing a more granular error handling mechanism ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/33"},"PR#33")),(0,n.kt)("li",{parentName:"ul"},"We rethought the API and made it more consistent with the underlying secp256k1 library ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/35"},"PR#35"))),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The mithril crates in general will be published in crates.io, and we adapted the core library's README ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/616"},"PR#616")," "),(0,n.kt)("li",{parentName:"ul"},"We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/620"},"PR#620"))),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#341")),(0,n.kt)("li",{parentName:"ul"},"SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/344"},"PR#344")),(0,n.kt)("li",{parentName:"ul"},"Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"))),(0,n.kt)("h2",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"We keep progressing in the secure forgetting PR and resolving some bugs on memory handling ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"PR#255")),(0,n.kt)("li",{parentName:"ul"},"Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d442e1d8.854196c8.js b/assets/js/d442e1d8.854196c8.js new file mode 100644 index 00000000000..7ce3689ad11 --- /dev/null +++ b/assets/js/d442e1d8.854196c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[9821],{8678:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/57","page":57,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/56","nextPage":"/cardano-updates/page/58","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/d5676bf9.f90c55bb.js b/assets/js/d5676bf9.f90c55bb.js new file mode 100644 index 00000000000..e21778f56e0 --- /dev/null +++ b/assets/js/d5676bf9.f90c55bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3270],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),u=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),p=u(a),m=n,d=p["".concat(s,".").concat(m)]||p[m]||c[m]||o;return a?r.createElement(d,i(i({ref:t},h),{},{components:a})):r.createElement(d,i({ref:t},h))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},82850:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-07-07-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-07-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-hydra.md",source:"@site/blog/2023-07-07-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.865,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-07-hydra",authors:["ffakenz","v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-07-goedel"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-07-sre"}},s={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},p="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week the Hydra team accomplished some nice progress. They secured the\nnetwork layer further by implementing authentication of the messages between the\npeers in the Head protocol. In the process they also managed to separate\nHeartBeat messages from the protocol ones which somewhat improved the quality of\ncode in Hydra. The team also finished work related to sending only transaction\nids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark\npublishing on the website."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"Implemented")," authenticated messages"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"Implemented")," send only transaction ids in ReqSn messages"),(0,n.kt)("li",{parentName:"ul"},"Separate ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/969"},"HeartBeat")," messages from the core network protocol messages"),(0,n.kt)("li",{parentName:"ul"},"Publish multiple pre-defined ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/947"},"benchmarks")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/967"},"Fixed")," a smoke-test issue where funds would not be returned to the faucet"),(0,n.kt)("li",{parentName:"ul"},"Found a bug in the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-ghsa-c8qp-cv4h-vcc4/pull/1"},"off-chain signature\nverification"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Spike on performance improvements of event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/913"},"#913")),(0,n.kt)("li",{parentName:"ul"},"Add new endpoint for submitting client transactions"),(0,n.kt)("li",{parentName:"ul"},"Remove commit from internal wallet")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d5cc3122.33b4ba11.js b/assets/js/d5cc3122.33b4ba11.js new file mode 100644 index 00000000000..8bb9484ca8a --- /dev/null +++ b/assets/js/d5cc3122.33b4ba11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[28669],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),s=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=s(n),m=r,h=p["".concat(u,".").concat(m)]||p[m]||d[m]||i;return n?a.createElement(h,o(o({ref:t},c),{},{components:n})):a.createElement(h,o({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var s=2;s<i;s++)o[s]=n[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},3047:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const i={title:"DB-sync Team Update",slug:"2023-06-08-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-08-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-08-db-sync.md",source:"@site/blog/2023-06-08-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-06-08T00:00:00.000Z",formattedDate:"June 8, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.745,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-06-08-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-09-hydra"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-08-goedel"}},u={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],c={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"We've made progress in all high level objectives"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"CIP-1694 integration design"),(0,r.kt)("li",{parentName:"ul"},"UTxO-HD integration proof of concept"),(0,r.kt)("li",{parentName:"ul"},"schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2"),(0,r.kt)("li",{parentName:"ul"},"A new hire will help us with devx issues.")),(0,r.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We have an initial design for the Conway integration in db-sync"),(0,r.kt)("li",{parentName:"ul"},"The initial UTxO-HD integration resulted in a requested feuture that\nthe consensus team is working on\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/88"},"#88"),"."),(0,r.kt)("li",{parentName:"ul"},"Added two optional migrations that speed up querying UTxO\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1416"},"#1416")),(0,r.kt)("li",{parentName:"ul"},"Work on improving the above feauture by adding tests and fixing tech debt\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1429"},"#1429"),(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1419"},"#1419")),(0,r.kt)("li",{parentName:"ul"},"Fixed issue with ada_pots being wrong\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/1ad4521a5601e8e98dc06bba2826d6b2f9b4fcf4"},"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/1ad4521a5601e8e98dc06bba2826d6b2f9b4fcf4")),(0,r.kt)("li",{parentName:"ul"},"Added a process which fixes in place scripts with wrong CBOR serialisation.\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/8792f72e2485b320de26c02dacc4d504d377ba17"},"https://github.com/input-output-hk/cardano-db-sync/pull/1407/commits/8792f72e2485b320de26c02dacc4d504d377ba17")),(0,r.kt)("li",{parentName:"ul"},"Prepared a tag ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/releases"},(0,r.kt)("inlineCode",{parentName:"a"},"13.1.1.2")),"\nwhich is tested and ready to release. It contains many of the above.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d5f27176.938b3c42.js b/assets/js/d5f27176.938b3c42.js new file mode 100644 index 00000000000..a9c67a136dd --- /dev/null +++ b/assets/js/d5f27176.938b3c42.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95558],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>k});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function l(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},m="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,o=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),m=u(a),h=r,k=m["".concat(o,".").concat(h)]||m[h]||d[h]||i;return a?n.createElement(k,p(p({ref:e},c),{},{components:a})):n.createElement(k,p({ref:e},c))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,p=new Array(i);p[0]=h;var l={};for(var o in e)hasOwnProperty.call(e,o)&&(l[o]=e[o]);l.originalType=t,l[m]="string"==typeof t?t:r,p[1]=l;for(var u=2;u<i;u++)p[u]=a[u];return n.createElement.apply(null,p)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},45623:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>p,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-10-10-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},p="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-10-10-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-10-node-cli-api.md",source:"@site/blog/2023-10-10-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-10-10T00:00:00.000Z",formattedDate:"October 10, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.985,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-10-10-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-11-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-06-hydra"}},o={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-09-27---2023-10-10"},"2023-09-27 - 2023-10-10"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CARDANO-NODE"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.5.0-pre"},"Pre-release of cardano-node 8.5.0-pre"))),(0,r.kt)("p",null,"CARDANO-CLI"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Depracated governance query commands and moved all governance related queries to ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-cli <era> query")),(0,r.kt)("li",{parentName:"ul"},"Drep registration certificates now allow to include an anchor"),(0,r.kt)("li",{parentName:"ul"},"Integrated Drep retirement ceriticates"),(0,r.kt)("li",{parentName:"ul"},"clean up of Drep registration certificates.")),(0,r.kt)("p",null,"CARDANO-API"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Add support for committee hot key witnesses"),(0,r.kt)("li",{parentName:"ul"},"Require conway onwards for voting"),(0,r.kt)("li",{parentName:"ul"},"Conway drep registration: expose ledger anchor parameter"),(0,r.kt)("li",{parentName:"ul"},"Add certs to txbody of Conway transactions")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/347"},"Move ",(0,r.kt)("inlineCode",{parentName:"a"},"governance query")," commands to ",(0,r.kt)("inlineCode",{parentName:"a"},"query")," command group")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/344"},"Rename create-new-committee into update-committee")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/341"},"New version cardano-cli-8.12.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/338"},"Add support for committee hot key witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/337"},"conway governance vote create: make it possible to use cc hot keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/331"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.11.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/330"},"Drep certification registration: add parameters for anchor")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/329"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.25.0.1"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/327"},"Move files that are not golden files into ",(0,r.kt)("inlineCode",{parentName:"a"},"input")," directory")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/324"},"Update to cardano-api-8.24")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/323"},"Fix #311 - Add Cold Committee Key text envelope")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/322"},"create-poll, answer-poll, verify-poll: move to 'babbage governance' block")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/320"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.23.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/319"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction view")," emit JSON")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/318"},"Tidy up query command structure")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/317"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"caseShelleyToBabbageOrConwayEraOnwards")," from ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/316"},"Add DRep Retirement Certificate command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/310"},"Update to cardano api 8.22.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/309"},"drep registration-certificate: remove mix with SPO registration"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/307"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"EraCast")," instance for ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/306"},"Add certs to txbody of Conway transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/305"},"Move DRep reg certificate anchor types from cardano-cli to cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/304"},"Add BabbageEraOnly")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/303"},"New version cardano-api-8.25.2.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/300"},"Add support for committee hot key witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/299"},"Reduce constraint usage with eons")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/297"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"withShelleyBasedEraConstraintsForLedger"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/296"},"Simplify ",(0,r.kt)("inlineCode",{parentName:"a"},"DebugLedgerState")," with eons")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/294"},"New version cardano-api-8.25.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/293"},"Require conway onwards for voting")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/292"},"Add witness committee cold key")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/291"},"Fix CHaP failure due to haddock issue")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/290"},"Amend cardano-api/pull/284 to use ReexposeLedger")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/289"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEraInEon")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"EraInEon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/288"},"Release 8.24.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/287"},"Parameterize ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEraInEon"),". Add ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/286"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.23.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/284"},"conway drep registration: expose ledger anchor parameter")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/282"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"caseAlonzoOnlyOrBabbageEraOnwards")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"alonzoEraOnlyToAlonzoEraOnwards")," functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/281"},"Rename eon functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/280"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEraInEon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/279"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"ValidityLowerBoundSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/278"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"TxExtraKeyWitnessesSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/277"},"Explicit pattern match on all ledger certificates constructors. Remove redundant module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/276"},"Release 8.22.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/275"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"TxTotalAndReturnCollateralSupportedInEra")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5490"},"Integrate upstream libraries for 8.5"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5497"},"bump cardano-api to 8.25.2")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5491"},"Remove unused code in cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5490"},"Integrate upstream libraries for 8.5"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d65b9dd2.7da8dd3d.js b/assets/js/d65b9dd2.7da8dd3d.js new file mode 100644 index 00000000000..edb0cd75307 --- /dev/null +++ b/assets/js/d65b9dd2.7da8dd3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93108],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>d});var r=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function s(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?a(Object(o),!0).forEach((function(t){n(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):a(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function i(e,t){if(null==e)return{};var o,r,n=function(e,t){if(null==e)return{};var o,r,n={},a=Object.keys(e);for(r=0;r<a.length;r++)o=a[r],t.indexOf(o)>=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)o=a[r],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var l=r.createContext({}),p=function(e){var t=r.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):s(s({},t),e)),o},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(o),h=n,d=c["".concat(l,".").concat(h)]||c[h]||m[h]||a;return o?r.createElement(d,s(s({ref:t},u),{},{components:o})):r.createElement(d,s({ref:t},u))}));function d(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,s=new Array(a);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:n,s[1]=i;for(var p=2;p<a;p++)s[p]=o[p];return r.createElement.apply(null,s)}return r.createElement.apply(null,o)}h.displayName="MDXCreateElement"},59513:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var r=o(87462),n=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-10-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-10-27-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-network.md",source:"@site/blog/2023-10-27-network.md",title:"Network Team Update",description:"High-level overview of sprint 47",date:"2023-10-27T00:00:00.000Z",formattedDate:"October 27, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.765,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-10-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-27-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-27-sre"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level overview of sprint 47",id:"high-level-overview-of-sprint-47",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"CI / Tests",id:"ci--tests",level:3},{value:"KeepAlive client",id:"keepalive-client",level:3},{value:"Galois",id:"galois",level:3},{value:"Cardano Network Service Assurance (CNSA)",id:"cardano-network-service-assurance-cnsa",level:3},{value:"New CHaP Release",id:"new-chap-release",level:3},{value:"More details",id:"more-details",level:2},{value:"CI / Tests",id:"ci--tests-1",level:3},{value:"Release Process",id:"release-process",level:3}],u={toc:p},c="wrapper";function m(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-47"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+47%22"},"sprint 47")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We continued to review the process of bootstrap peers, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4555"},"ouroboros-network#4555")),(0,n.kt)("h3",{id:"ci--tests"},"CI / Tests"),(0,n.kt)("p",null,"We investigated our CI issues. We found a memory leak in ",(0,n.kt)("inlineCode",{parentName:"p"},"typed-protocols"),"\nfunction used for testing codecs which triggered out of memory manager (OOM) on\nsome platforms (",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/typed-protocols/pull/43"},"typed-protocols#43"),"); we also found a bug in the connection manager which resulted in CI\n",(0,n.kt)("inlineCode",{parentName:"p"},"timeouts")," (see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4696/commits/010d9b2bd76356373d8c139eaedd8aea7ad90680"},"connection-manager-fix"),"). "),(0,n.kt)("h3",{id:"keepalive-client"},"KeepAlive client"),(0,n.kt)("p",null,"We found two small issues with the keep-alive client, which were addressed\nby Karl Knutsson (",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/"},"Cardano Foundation"),"), ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4689"},"ouroboros-network#4689"),"."),(0,n.kt)("h3",{id:"galois"},"Galois"),(0,n.kt)("p",null,"We merged two large PRs prepared by ",(0,n.kt)("a",{parentName:"p",href:"https://galois.com/"},"Galois"),":"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4660"},"inspect ",(0,n.kt)("inlineCode",{parentName:"a"},"error")," call sites")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4663"},"implement micro benchmarks for ",(0,n.kt)("inlineCode",{parentName:"a"},"PeerMetrics")))),(0,n.kt)("h3",{id:"cardano-network-service-assurance-cnsa"},"Cardano Network Service Assurance (CNSA)"),(0,n.kt)("p",null,"Galois made the following progress on CNSA:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a simple ","[InfuxDB]"," database backend has been added;"),(0,n.kt)("li",{parentName:"ul"},"the documentation has been updated;"),(0,n.kt)("li",{parentName:"ul"},"internal improvements to the code;"),(0,n.kt)("li",{parentName:"ul"},'progress on a new "CSNA analysis" that provides, for each sampler node, the\nblock download throughput in bytes over time.')),(0,n.kt)("h3",{id:"new-chap-release"},"New CHaP Release"),(0,n.kt)("p",null,"We cut a new release of ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-netowrk")," packages to ",(0,n.kt)("inlineCode",{parentName:"p"},"CHaP"),": ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/547"},"chap#547")),(0,n.kt)("h2",{id:"more-details"},"More details"),(0,n.kt)("h3",{id:"ci--tests-1"},"CI / Tests"),(0,n.kt)("p",null,"We improved the memory footprint of some of our tests by analysing a stream of\n",(0,n.kt)("inlineCode",{parentName:"p"},"IOSim")," traces without retaining them, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4696"},"ouroboros-network#4696")),(0,n.kt)("p",null,"As a safety measure, we introduced an upper bound for heap memory used by test\nartefacts in our ",(0,n.kt)("inlineCode",{parentName:"p"},"nix")," tests. We use ",(0,n.kt)("inlineCode",{parentName:"p"},"200MB")," limit for all tests except for\n",(0,n.kt)("inlineCode",{parentName:"p"},"network-mux")," tests which use ",(0,n.kt)("inlineCode",{parentName:"p"},"350MB")," limit, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4702"},"ouroboros-network#4702"),"."),(0,n.kt)("p",null,"We refactored one of our tests to use ephemeral ports thus allowing it to\nrun concurrently, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4702"},"ouroboros-network#4702"),"."),(0,n.kt)("p",null,"We merged ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4623"},"ouroboros-network#4623")," which fixes a bunch of test failures."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4694"},"inbound-governor: connection leak")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4607"},"connection-manager: assertion failure")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4605"},"not released connection"))),(0,n.kt)("p",null,"All of them were due to a bug in test logic rather than a bug in production\ncode."),(0,n.kt)("h3",{id:"release-process"},"Release Process"),(0,n.kt)("p",null,"We updated our release process & associated scripts, see\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4705"},"ouroboros-network#4705"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6a3b4a5.0e85b9f0.js b/assets/js/d6a3b4a5.0e85b9f0.js new file mode 100644 index 00000000000..94ca69def56 --- /dev/null +++ b/assets/js/d6a3b4a5.0e85b9f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30482],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=o.createContext({}),u=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return o.createElement(p.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(n),m=r,h=s["".concat(p,".").concat(m)]||s[m]||d[m]||a;return n?o.createElement(h,l(l({ref:t},c),{},{components:n})):o.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<a;u++)l[u]=n[u];return o.createElement.apply(null,l)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},19301:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-07-31-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-31-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-31-network.md",source:"@site/blog/2023-07-31-network.md",title:"Network Team Update",description:"Network Update (Sprints 39 & 40)",date:"2023-07-31T00:00:00.000Z",formattedDate:"July 31, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.18,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-07-31-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-01-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-28-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"Network Update (Sprints 39 & 40)",id:"network-update-sprints-39--40",level:2},{value:"Sprint 39 (Jun 26 - Jul 09)",id:"sprint-39-jun-26---jul-09",level:3},{value:"Major changes",id:"major-changes",level:4},{value:"<code>node-to-client</code> protocol",id:"node-to-client-protocol",level:5},{value:"<code>node-to-node</code> protocol",id:"node-to-node-protocol",level:5},{value:"Minor changes",id:"minor-changes",level:4},{value:"Sprint 40 (Jul 09 - Jul 23)",id:"sprint-40-jul-09---jul-23",level:3},{value:"Major changes",id:"major-changes-1",level:4}],c={toc:u},s="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(s,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"network-update-sprints-39--40"},"Network Update (Sprints 39 & 40)"),(0,r.kt)("p",null,"The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away.\nIt was great to see and talk to so many of the community members."),(0,r.kt)("h3",{id:"sprint-39-jun-26---jul-09"},"Sprint 39 (Jun 26 - Jul 09)"),(0,r.kt)("h4",{id:"major-changes"},"Major changes"),(0,r.kt)("p",null,"Now the following ",(0,r.kt)("strong",{parentName:"p"},"list of traces will be turned on by default"),":"),(0,r.kt)("h5",{id:"node-to-client-protocol"},(0,r.kt)("inlineCode",{parentName:"h5"},"node-to-client")," protocol"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalConnectionManagerTracer")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalInboundGovernor")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalHandshake")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"LocalServer"))),(0,r.kt)("h5",{id:"node-to-node-protocol"},(0,r.kt)("inlineCode",{parentName:"h5"},"node-to-node")," protocol"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"Server"))),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5353"},"cardano-node#5353"),". This will be released in ",(0,r.kt)("inlineCode",{parentName:"p"},"node-8.2.0"),"."),(0,r.kt)("p",null,"We made sure that ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-client-0.1.0.x")," library (which is ",(0,r.kt)("inlineCode",{parentName:"p"},"db-sync"),") is not using the experimental ",(0,r.kt)("inlineCode",{parentName:"p"},"node-to-client")," protocol.\nThe ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-client-0.2.0.0")," was not affected.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4612"},"ouroboros-network#4612"),"."),(0,r.kt)("p",null,"We merged the ",(0,r.kt)("strong",{parentName:"p"},"dynamic block production feature")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," (also available in the ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-8.2.0")," release).\nDynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3159"},"ouroboros-network#3159"),", ","[ouroboros-consensu#140]","."),(0,r.kt)("p",null,"We continued to review the implementation of big ledger peers for eclipse evasion, see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"ouroboros-network#4462"),"."),(0,r.kt)("h4",{id:"minor-changes"},"Minor changes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We refactored the top level ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node")," error handler: ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5356"},"cardano-node#5356"))),(0,r.kt)("h3",{id:"sprint-40-jul-09---jul-23"},"Sprint 40 (Jul 09 - Jul 23)"),(0,r.kt)("h4",{id:"major-changes-1"},"Major changes"),(0,r.kt)("p",null,"We integrated ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.8.2.0")," with the ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch of ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," for the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.0")," release (the version match between ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," is purely accidental).\nThis includes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"integration with ",(0,r.kt)("strong",{parentName:"li"},"dynamic block production")," feature.\nThis feature is documented in the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5399"},"following PR"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Warm valency")," for local root peers (see below).")),(0,r.kt)("p",null,"For the full list of features included in the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.2.0")," release from the network side, please take a look at the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.2.0-pre"},"pre-release nodes"),"."),(0,r.kt)("p",null,"We ",(0,r.kt)("strong",{parentName:"p"},"improved the memory footprint")," of peer metrics measured by the P2P stack.\nPeer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation).\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4620"},"ouroboros-network#4620"),".\nThe improvement will be available in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-8.2.0"),"."),(0,r.kt)("p",null,"We added an ",(0,r.kt)("strong",{parentName:"p"},"optional explicit warm valency")," to local root peers of the ",(0,r.kt)("strong",{parentName:"p"},"P2P topology file"),".\nPreviously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to.\nThe hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones.\nWarm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses.\nSee ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4575"},"ouroboros-network#4575"),", ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5409"},"cardano-node#5409"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6a93ba7.2190ecb6.js b/assets/js/d6a93ba7.2190ecb6.js new file mode 100644 index 00000000000..7ff15b99181 --- /dev/null +++ b/assets/js/d6a93ba7.2190ecb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31349],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>y});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),m=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},p=function(e){var t=m(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=m(r),d=a,y=u["".concat(l,".").concat(d)]||u[d]||c[d]||o;return r?n.createElement(y,s(s({ref:t},p),{},{components:r})):n.createElement(y,s({ref:t},p))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:a,s[1]=i;for(var m=2;m<o;m++)s[m]=r[m];return n.createElement.apply(null,s)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},61256:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>m});var n=r(87462),a=(r(67294),r(3905));const o={title:"System Test Team Update",slug:"2022-12-01-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-12-01-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-system-test.md",source:"@site/blog/2022-12-01-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2022-12-01T00:00:00.000Z",formattedDate:"December 1, 2022",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.765,hasTruncateMarker:!1,authors:[{name:"Dorin Solomon",title:"System Test Team Lead",url:"https://github.com/dorin100",imageURL:"https://github.com/dorin100.png",key:"dorin100"}],frontMatter:{title:"System Test Team Update",slug:"2022-12-01-system-test",authors:"dorin100",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-01-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-30-consensus"}},l={authorsImageUrls:[void 0]},m=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],p={toc:m},u="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the ",(0,a.kt)("em",{parentName:"p"},"P2P Single\nRelay")," functionality, and also tested some DB-Sync tags."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"moved the System Test CLI Pipelines from BuildKite to Github Actions"),(0,a.kt)("li",{parentName:"ul"},"improved the reporting tools to support the rerun of the failled tests and update of the reports "),(0,a.kt)("li",{parentName:"ul"},"added support for Github API in ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/mkoura/report-aggregator"},"report-aggregator"),", so reports will be generated from the GitHub nightly jobs from now on"),(0,a.kt)("li",{parentName:"ul"},"added support for mixed topology - P2P, legacy, mixed topologies"),(0,a.kt)("li",{parentName:"ul"},"planned the P2P Single Relay system test activities "),(0,a.kt)("li",{parentName:"ul"},"added support to start regression tests with PV8 + better selection of tests")),(0,a.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)"),(0,a.kt)("li",{parentName:"ul"},"tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6b66cf4.24242dbb.js b/assets/js/d6b66cf4.24242dbb.js new file mode 100644 index 00000000000..9a5a9dc7d99 --- /dev/null +++ b/assets/js/d6b66cf4.24242dbb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95516],{1673:a=>{a.exports=JSON.parse('{"title":"Recent Posts","items":[{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-12-06-ledger"},{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-12-06-mithril"},{"title":"Performance & Tracing Update","permalink":"/cardano-updates/2023-12-04-performance-and-tracing"},{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-12-01-hydra"},{"title":"Consensus Team Update","permalink":"/cardano-updates/2023-11-29-consensus"},{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-29-mithril"},{"title":"Hydra Team Update","permalink":"/cardano-updates/2023-11-24-hydra"},{"title":"SRE Team Update","permalink":"/cardano-updates/2023-11-24-sre"},{"title":"Ledger Team Update","permalink":"/cardano-updates/2023-11-22-ledger"},{"title":"Mithril Team Update","permalink":"/cardano-updates/2023-11-22-mithril"}]}')}}]); \ No newline at end of file diff --git a/assets/js/d6c09ac2.62736fde.js b/assets/js/d6c09ac2.62736fde.js new file mode 100644 index 00000000000..0aa1b1577db --- /dev/null +++ b/assets/js/d6c09ac2.62736fde.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[22393],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),c=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(a),d=n,m=u["".concat(p,".").concat(d)]||u[d]||h[d]||o;return a?r.createElement(m,i(i({ref:t},s),{},{components:a})):r.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var c=2;c<o;c++)i[c]=a[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},98294:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-07-21-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-21-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-hydra.md",source:"@site/blog/2023-07-21-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.7,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-07-21-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-26-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-07-21-ledger"}},p={authorsImageUrls:[void 0]},c=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team updated the specification to align with recent\noff-chain protocol changes, completed refactoring the snapshot emission\nin preparation for event-sourced protocol logic, and updated to GHC\n9.2.7, resulting in improved compile times and slightly smaller Plutus\nscripts."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Updated the specification to match the recent off-chain protocol\nchanges to complete\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Refactored the snapshot emission logic in preparation for event\nsourced protocol logic."),(0,n.kt)("li",{parentName:"ul"},"Updated to GHC 9.2.7, which led to improved compile times and\nslightly smaller plutus scripts.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting next wednesday and July report"),(0,n.kt)("li",{parentName:"ul"},"Reflect latest information onto our roadmap."),(0,n.kt)("li",{parentName:"ul"},"Actual implemention of event-sourced persistence\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/913"},"#913"),"."),(0,n.kt)("li",{parentName:"ul"},"Update the use cases section on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family"},"https://hydra.family")),(0,n.kt)("li",{parentName:"ul"},"Remove deprecated internal commit\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/954"},"#954"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6f20405.d88dddb4.js b/assets/js/d6f20405.d88dddb4.js new file mode 100644 index 00000000000..486c8e8cbeb --- /dev/null +++ b/assets/js/d6f20405.d88dddb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23599],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),s=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return r.createElement(d.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(a),h=n,m=u["".concat(d,".").concat(h)]||u[h]||p[h]||o;return a?r.createElement(m,i(i({ref:t},c),{},{components:a})):r.createElement(m,i({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},73363:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-09-01-hydra",authors:["v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-09-01-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-hydra.md",source:"@site/blog/2023-09-01-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.93,hasTruncateMarker:!1,authors:[{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-01-hydra",authors:["v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-01-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-01-ledger"}},d={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],c={toc:s},u="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team focused primarily on changes needed in the network\nlayer and have the first draft document related to needed design. They also\nimproved the user experience by allowing a commit using inline datums.\nDiscussed the off-chain governance with researchers and improved internal model\ntests. "),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report published"),(0,n.kt)("li",{parentName:"ul"},"Small changes to hydraw and tutorial in light of the Masterclass"),(0,n.kt)("li",{parentName:"ul"},"Investigated a bug and saw it was solved by recent developments"),(0,n.kt)("li",{parentName:"ul"},"Improved the model tests by fully validating L1 transactions"),(0,n.kt)("li",{parentName:"ul"},"Enhanced the /commit API to also allow commit from scripts with inline datums (user request)"),(0,n.kt)("li",{parentName:"ul"},"Discussed off-chain governance with IOG and CF researchers"),(0,n.kt)("li",{parentName:"ul"},"Drafted a first network specification document in the context of Network resilience")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},'Have a clear understanding of the changes we need for the "Improve network resiliency" feature'),(0,n.kt)("li",{parentName:"ul"},"Groomed and agreed plan on incremental commits/decommits"),(0,n.kt)("li",{parentName:"ul"},"Updated tutorials including CI workflows to check consistency"),(0,n.kt)("li",{parentName:"ul"},"Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d70b4c5f.9e25feed.js b/assets/js/d70b4c5f.9e25feed.js new file mode 100644 index 00000000000..5d20f2ae85b --- /dev/null +++ b/assets/js/d70b4c5f.9e25feed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[71870],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),d=c(n),p=a,h=d["".concat(l,".").concat(p)]||d[p]||u[p]||i;return n?r.createElement(h,o(o({ref:t},m),{},{components:n})):r.createElement(h,o({ref:t},m))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,o[1]=s;for(var c=2;c<i;c++)o[c]=n[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},39446:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-10-06-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/2023-10-06-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-06-performance-and-tracing.md",source:"@site/blog/2023-10-06-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-10-06T00:00:00.000Z",formattedDate:"October 6, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.625,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-10-06-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-06-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-04-consensus"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Consensus QTAs",id:"consensus-qtas",level:3},{value:"Development",id:"development",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system."),(0,a.kt)("li",{parentName:"ul"},"Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7."),(0,a.kt)("li",{parentName:"ul"},"Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store."),(0,a.kt)("li",{parentName:"ul"},"Tracing: The machine-readable tracer configuration has been merged. Optimization of ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-tracer")," started."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Ongoing variance analysis and refined cluster topology.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the\nperformance of the in-memory backing store and evaluate possible optimizations (or regressions) for it. "),(0,a.kt)("p",null,"Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results\nshow all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," service."),(0,a.kt)("h3",{id:"consensus-qtas"},"Consensus QTAs"),(0,a.kt)("p",null,"The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The\nfeedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype."),(0,a.kt)("h3",{id:"development"},"Development"),(0,a.kt)("p",null,"Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort. "),(0,a.kt)("p",null,"PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time,\nwe'd like to validate the many improvements that have gone into the Plutus evaluator."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The focus for further optimization of the new tracing system has shifted to ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," - the service\nreceiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," is\nmore performance critical, the receiving service must still minimize its resource footprint. Moreover, it can\ngenerate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated\nthe same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d7836792.8920f6e8.js b/assets/js/d7836792.8920f6e8.js new file mode 100644 index 00000000000..460ff413537 --- /dev/null +++ b/assets/js/d7836792.8920f6e8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42126],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(a),h=n,m=d["".concat(u,".").concat(h)]||d[h]||c[h]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},82217:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-25-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-25-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-25-hydra.md",source:"@site/blog/2023-08-25-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-25T00:00:00.000Z",formattedDate:"August 25, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.875,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-25-hydra",authors:["ffakenz"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-08-28-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-24-performance-and-tracing"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},d="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team conducted the monthly review meeting for Agust,which\ncontinously ensures transparent communication and project evaluation."),(0,n.kt)("p",null,"In terms of community engagement, the Hydra team gave a Hydra master-class at\nRareEvo workshop as an educational initiative for the community.\nAdditionally, the team updated the Hydra demo and tutorial to include Mithril\nand latest release changes."),(0,n.kt)("p",null,"They also focused on exploring the Hydra network resiliance in order to improve\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," availability, as it becomes stuck very easily and that leads to a\nbad user experience."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hydra master-class at RareEvo workshop!"),(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting"),(0,n.kt)("li",{parentName:"ul"},"Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff"),(0,n.kt)("li",{parentName:"ul"},"Groomed network resilience and explorer features ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"New ADR for \u201cResourced based API\u201d ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1028"},"#1028"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Have a poc on network resilience working ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"Fix issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/931"},"#931"),": \u201cChain state in head state not updated on replayed observation\u201d"),(0,n.kt)("li",{parentName:"ul"},"Fix issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1039"},"#1039"),': "Close transaction dropped from cardano-node"')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d7899fea.8822e22a.js b/assets/js/d7899fea.8822e22a.js new file mode 100644 index 00000000000..3e43c34440d --- /dev/null +++ b/assets/js/d7899fea.8822e22a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17285],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(r),d=n,h=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return r?a.createElement(h,i(i({ref:t},s),{},{components:r})):a.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=r[u];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},59997:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2022-11-11-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-11-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-11-crypto.md",source:"@site/blog/2022-11-11-crypto.md",title:"Crypto Team Update",description:"High level overview",date:"2022-11-11T00:00:00.000Z",formattedDate:"November 11, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.305,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-11-11-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-16-performance-and-tracing"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-11-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The SECP primitives AC has been met, and the test-vectors ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/320"},"PR")," has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/336"},"PR")," has been merged, and we've adapted the KES secure ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/255"},"PR")," to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/pull/341"},"PR#"),"). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork. "),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation. "),(0,n.kt)("li",{parentName:"ul"},"We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool. "),(0,n.kt)("li",{parentName:"ul"},"In parallel, we keep progressing on the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent"},"KES agent")),(0,n.kt)("li",{parentName:"ul"},"VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification. "),(0,n.kt)("li",{parentName:"ul"},"Our libsodium fork now links directly to upstream libsodium.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d79a4bb7.a815c560.js b/assets/js/d79a4bb7.a815c560.js new file mode 100644 index 00000000000..82016e08b32 --- /dev/null +++ b/assets/js/d79a4bb7.a815c560.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90206],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=d(a),m=n,h=c["".concat(s,".").concat(m)]||c[m]||u[m]||o;return a?r.createElement(h,i(i({ref:t},p),{},{components:a})):r.createElement(h,i({ref:t},p))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},25790:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-11-25-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-11-25-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-25-hydra.md",source:"@site/blog/2022-11-25-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2022-11-25T00:00:00.000Z",formattedDate:"November 25, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.73,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-25-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-25-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-23-ledger"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:d},c="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(c,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a ",(0,n.kt)("a",{parentName:"p",href:"https://summit.cardano.org/agenda-day-2/cardano-ballot-speaker-winner-presentation-6/"},"presentation")," about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Attended the Cardano Summit in Lausanne. Hydra was topic of one talk: ",(0,n.kt)("a",{parentName:"li",href:"https://summit.cardano.org/agenda-day-2/cardano-ballot-speaker-winner-presentation-6/"},"https://summit.cardano.org/agenda-day-2/cardano-ballot-speaker-winner-presentation-6/")),(0,n.kt)("li",{parentName:"ul"},"Had a team workshop / hackathon after the summit:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Retrospective"),(0,n.kt)("li",{parentName:"ul"},"Impact mapping session"),(0,n.kt)("li",{parentName:"ul"},"Hacked on smaller things"))),(0,n.kt)("li",{parentName:"ul"},"Got a PR for tullia/cicero things by @kdermetfan")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting"),(0,n.kt)("li",{parentName:"ul"},"Tie up several loose ends / branches."),(0,n.kt)("li",{parentName:"ul"},"Resolve Tx validity discussions & PRs."),(0,n.kt)("li",{parentName:"ul"},"Review cicero PR & try it out.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d7c69167.06afceb4.js b/assets/js/d7c69167.06afceb4.js new file mode 100644 index 00000000000..621138ba0d5 --- /dev/null +++ b/assets/js/d7c69167.06afceb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24288],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),d=a,f=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return r?n.createElement(f,l(l({ref:t},s),{},{components:r})):n.createElement(f,l({ref:t},s))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},15983:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-09-29-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-09-29-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-29-goedel.md",source:"@site/blog/2023-09-29-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-09-29T00:00:00.000Z",formattedDate:"September 29, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.42,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-09-29-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-02-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-29-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The team is currently formalising mini protocols and testing the\nperformance analysis tool"),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"drafting processs calculus semantics of mini protocol programs")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"testing the new performance modelling tool")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"further work on specification of mini protocols")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"extension of mini protocol framework to support communication of\nprograms with local environments via synchronous channels"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d7d2f3e9.262520e6.js b/assets/js/d7d2f3e9.262520e6.js new file mode 100644 index 00000000000..6685464afe3 --- /dev/null +++ b/assets/js/d7d2f3e9.262520e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[97363],{93901:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/quarterly/tags/cli-api-quarterly","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d83d9042.fc0ecb0d.js b/assets/js/d83d9042.fc0ecb0d.js new file mode 100644 index 00000000000..4a8411549da --- /dev/null +++ b/assets/js/d83d9042.fc0ecb0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[8580],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),h=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=h(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=h(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||p[c]||i;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var h=2;h<i;h++)o[h]=a[h];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},42611:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-05-12-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-12-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-hydra.md",source:"@site/blog/2023-05-12-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.145,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-05-12-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-05-12-goedel"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-12-network"}},s={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:h},u="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team achieved a number of milestones, including the release\nof the first mainnet compatible version. Besides this they also addressed\ninconsistencies in rollback handling, added an architecture page to the website,\nreducing the size of logs using event IDs. They also had productive discussions\nwith researchers on plans for incremental commits/decommits and had a whiteboard\nsession on DeFi and lending protocols. The goals for next week include\ncompleting the validation of the timed transactions feature, exploring stateless\nobservation, refining the Hydra explorer ticket, writing ops instructions and\ntroubleshooting, and implementing the first end-to-end journey for external\ncommits."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released first mainnnet compatible version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.10.0"},"0.10.0")),(0,n.kt)("li",{parentName:"ul"},"Addressed inconsist handling of rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/core-concepts/architecture/"},"architecture page")," and fixed haddock links on our website ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/838"},"#838")),(0,n.kt)("li",{parentName:"ul"},"Opened a new hydra head on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Talked with researchers on initial plan for incremental commits/decommits"),(0,n.kt)("li",{parentName:"ul"},"Had a Whiteboard session on DeFi and lending protocols"),(0,n.kt)("li",{parentName:"ul"},"Reduced size of logs using event ids ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/859"},"#859")),(0,n.kt)("li",{parentName:"ul"},"Published the ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-04"},"monthly report for April"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete validation of timed transactions feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/196"},"#196")),(0,n.kt)("li",{parentName:"ul"},"Explored stateless observation and refined hydra explorer ticket ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/696"},"#696")),(0,n.kt)("li",{parentName:"ul"},"Write ","\u201c","ops","\u201d"," instructions and troubleshooting ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/569"},"#569")," and improve logs"),(0,n.kt)("li",{parentName:"ul"},"Have a first end-to-end journey for external commits implemented ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d857251e.5d7f7fca.js b/assets/js/d857251e.5d7f7fca.js new file mode 100644 index 00000000000..6d14c81676d --- /dev/null +++ b/assets/js/d857251e.5d7f7fca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75698],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),u=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(l,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},c),{},{components:a})):n.createElement(h,i({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[d]="string"==typeof e?e:r,i[1]=p;for(var u=2;u<o;u++)i[u]=a[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},14394:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-05-24-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-05-24-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-24-node-cli-api.md",source:"@site/blog/2023-05-24-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-05-24T00:00:00.000Z",formattedDate:"May 24, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-05-24-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-26-network"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-19-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-05-24---2023-06-06"},"2023-05-24 - 2023-06-06"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released. "),(0,r.kt)("li",{parentName:"ul"},"We provided assitance where needed in the release"),(0,r.kt)("li",{parentName:"ul"},"An integration repository ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/fusion-flamingo"},"https://github.com/input-output-hk/fusion-flamingo")," was created to enable my team to more easily work on cardano-cli and cardano-api")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5290"},"Update ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli")," changelog")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5197"},"Propagate protocol parameters conversion errors")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5149"},"Command line option for parsing UTC time to slot number")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/31"},"Switch to ",(0,r.kt)("inlineCode",{parentName:"a"},"tasty-discover"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/30"},"Move tests to standard locations")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/26"},"Make cardano-api:internal component public")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/24"},"update chaps index")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/18"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"ErrorSpec")," check for all constructors, move golden tests together")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/17"},"Expose toAlonzoCostModels")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/9"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"ErrorsSpec")," use generated types and constructors names")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/32"},"Check changelog in tag script")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/34"},"Use tag script from ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-dev")," repository instead")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/38"},"Use .x suffix for release branches")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5291"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"cryptoInit")," instead of ",(0,r.kt)("inlineCode",{parentName:"a"},"sodiumInit"))," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5284"},"Move configuration tests to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-node")," tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5243"},"update chaps & integration")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5240"},"#5222 Remove ",(0,r.kt)("inlineCode",{parentName:"a"},"ApplicationName")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"ApplicationVersion")," config parameters")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d863ede2.11363200.js b/assets/js/d863ede2.11363200.js new file mode 100644 index 00000000000..66cfa5a56cb --- /dev/null +++ b/assets/js/d863ede2.11363200.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45766],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),h=r,m=d["".concat(l,".").concat(h)]||d[h]||c[h]||a;return n?o.createElement(m,s(s({ref:t},u),{},{components:n})):o.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:r,s[1]=i;for(var p=2;p<a;p++)s[p]=n[p];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},48709:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-02-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-02-22-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-22-consensus.md",source:"@site/blog/2023-02-22-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-02-22T00:00:00.000Z",formattedDate:"February 22, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.45,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-02-22-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-02-23-performance-and-tracing"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-22-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Support",id:"support",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the past two weeks we got the results from the system level benchmarks\nfor UTxO HD. They showed a substantial performance regression, so we spent some\ntime analyzing the results. We found out the frequency at which ledger snapshots\nwere taken was too high, so we requested the benchmarking team a new run with a\nmore realistic snapshotting policy. We continued refactoring and improving the\nprototype, and we released UTxO-HD related packages to CHaP."),(0,r.kt)("p",null,"We met with IOG researchers and networking specialists to discuss the Genesis\ndesign, which was well received. We continued working on testing and\nbenchmarking different Genesis prototypes."),(0,r.kt)("p",null,"We are also working on solving a test failure related to iterators. This work\nderived in several improvements such as better documentation, a framework for\nwriting unit (and regression) tests, and the possibility of debugging\n",(0,r.kt)("inlineCode",{parentName:"p"},"QuickCheck")," counter examples in the REPL."),(0,r.kt)("p",null,"Finally, we released ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," 0.2.0.0 and\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-cardano")," 0.3.0.0 to CHaP"),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,r.kt)("p",null,"We got the results of the first system level benchmarks for UTxO HD. They seemed\nto indicate a significant regression in performance. After looking into the\nbenchmark logs we found that the benchmark runs took ledger state snapshots too\noften, due to the default snapshotting policy depending on ",(0,r.kt)("inlineCode",{parentName:"p"},"k"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"k")," being so\nsmall in the benchmark runs. Therefore, the next step is to re-run the\nbenchmarks with a snapshotting policy that more closely resembles the one from\nmainnet."),(0,r.kt)("p",null,"At the same time, we continued refactoring and cleaning up the prototype. "),(0,r.kt)("p",null,"Also, we prepared the ",(0,r.kt)("inlineCode",{parentName:"p"},"anti-diff")," packages (",(0,r.kt)("inlineCode",{parentName:"p"},"fingertree-rm"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"diff-containers"),",\n",(0,r.kt)("inlineCode",{parentName:"p"},"simple-semigroupoids"),") and the ",(0,r.kt)("inlineCode",{parentName:"p"},"lmdb")," related packages (",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-lmdb")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-lmdb-simple"),") to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP"),"."),(0,r.kt)("h3",{id:"genesis"},"Genesis"),(0,r.kt)("p",null,"The Genesis design was presented to the IOG researchers and Peter Thompson from\nNSol. It was well received. They pointed out one blindspot, but we think it'll\nbe relatively simple to mitigate."),(0,r.kt)("p",null,"In parallel, we continued developing test and benchmarks for the Genesis\nprototypes. I particular we tested and implemented a potential fix for\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4037#issuecomment-1439708022"},"increased ChainDB dequeue timings"),", which partly\nbehaved as we expected, but still needs further investigation. Also we obtained\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4037#issuecomment-1434745031"},"new benchmarking data")," for the prototype."),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"Related to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4183"},"#4183"),", we developed a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4379"},"DSL")," for specifying\n",(0,r.kt)("inlineCode",{parentName:"p"},"ChainDB")," unit tests. This will allow us to better understand the\ncounter-examples returned by QuickCheck tests, and to write ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4383"},"regression\ntests")," for them. Also, we ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4358"},"added a module")," to enable\nQuickCheck counter-examples to be run on the REPL, allowing for faster debugging\nfeedback. Also, we improved the documentation related to followers\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4372"},"#4372"),")."),(0,r.kt)("p",null,"We are also working on a design for optimizing the way we handle blocks from the\nfuture."),(0,r.kt)("h3",{id:"support"},"Support"),(0,r.kt)("p",null,"We released ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," 0.2.0.0 and ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-cardano"),"\n0.3.0.0 to CHaP. Remember that we decided to split the packages related to\nConsensus into two bundles, one with the core functionality, Cardano-agnostic\ncode, and another bundle with instantiations specific to Cardano."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d8668f0c.be2330b5.js b/assets/js/d8668f0c.be2330b5.js new file mode 100644 index 00000000000..3185a172aa3 --- /dev/null +++ b/assets/js/d8668f0c.be2330b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1821],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,l(l({ref:t},u),{},{components:n})):r.createElement(h,l({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},94658:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2023-03-23-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-23-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-23-db-sync.md",source:"@site/blog/2023-03-23-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2023-03-23T00:00:00.000Z",formattedDate:"March 23, 2023",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.755,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2023-03-23-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-24-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-23-mithril"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DBSync team worked in performance enhancements issues, on providing new db-sync options and on\ntechnical debt and bug fixing. The DBSync team also on boarded a new member."),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Worked on an issue which causes ",(0,a.kt)("inlineCode",{parentName:"li"},"ada_pots")," tables to include the values related not only to an\nepoch, but also the first epoch of the last epoch.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1367"},"#1367")),(0,a.kt)("li",{parentName:"ul"},"Fixed an issue where the ",(0,a.kt)("inlineCode",{parentName:"li"},"epoch")," table didn't rollback and caused wrong values\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1370"},"#1370")),(0,a.kt)("li",{parentName:"ul"},"Fixed an issue were users with ",(0,a.kt)("inlineCode",{parentName:"li"},"disable-ledger")," option had to provide the state dir option, even\nthough it was never used. Also refactored the no ledger part of the codebase.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1378"},"#1378")),(0,a.kt)("li",{parentName:"ul"},"Improved the perforance by using the cache more. Also provided many new options which enables or\ndisables parts of db-sync. In addition a new ",(0,a.kt)("inlineCode",{parentName:"li"},"--turbo")," mode is enables which allows db-sync to sync\nmainnet in hours.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1379"},"#1379"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d8c4fe87.808f0700.js b/assets/js/d8c4fe87.808f0700.js new file mode 100644 index 00000000000..38f545e8641 --- /dev/null +++ b/assets/js/d8c4fe87.808f0700.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24671],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},s=Object.keys(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(n),m=a,d=c["".concat(l,".").concat(m)]||c[m]||h[m]||s;return n?r.createElement(d,o(o({ref:t},p),{},{components:n})):r.createElement(d,o({ref:t},p))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,o=new Array(s);o[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:a,o[1]=i;for(var u=2;u<s;u++)o[u]=n[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},48221:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const s={title:"Consensus Team Update",slug:"2023-09-06-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-09-06-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-06-consensus.md",source:"@site/blog/2023-09-06-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-09-06T00:00:00.000Z",formattedDate:"September 6, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.22,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-09-06-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-07-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-01-goedel"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Tech debt",id:"tech-debt",level:2},{value:"Support",id:"support",level:2}],p={toc:u},c="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation.\nOn the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers.\nThe Consensus release engineer finished his rotation: version ",(0,a.kt)("inlineCode",{parentName:"p"},"8.3.0-pre")," of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," is releasing 2023 September 5."),(0,a.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We ran the first successful system-level benchmarks for UTxO-HD (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/203"},"#203"),") using the ",(0,a.kt)("em",{parentName:"li"},"in-memory")," backend.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot."),(0,a.kt)("li",{parentName:"ul"},"After the mempool regression is fixed the benchmarks need to be ran again."),(0,a.kt)("li",{parentName:"ul"},"System-level UTxO-HD benchmarks with the LMDB are still pending."))),(0,a.kt)("li",{parentName:"ul"},"UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"#344"),")."),(0,a.kt)("li",{parentName:"ul"},"We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in ",(0,a.kt)("inlineCode",{parentName:"li"},"GetUTxOByAddress")," (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/205#issuecomment-1706878418"},"this comment"),"). Preliminary results are promising."),(0,a.kt)("li",{parentName:"ul"},"Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/344"},"#344"),"), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.")),(0,a.kt)("h2",{id:"tech-debt"},"Tech debt"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We added tests that Consensus emits valid CBOR (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3099"},"#3099"),"). This helped us detect a couple of serialization bugs. The tests still need to be merged into the ",(0,a.kt)("inlineCode",{parentName:"li"},"main")," branch (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/323"},"#323"),").")),(0,a.kt)("h2",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Nick Frisby")," finished his release engineer rotation; ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node 8.3.0-pre")," is releasing 2023 September 5."),(0,a.kt)("li",{parentName:"ul"},"We helped to investigate a protocol version bug in Sanchonet (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3491"},"#3491"),")."),(0,a.kt)("li",{parentName:"ul"},"We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/91"},"#91"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d92df848.9daf110c.js b/assets/js/d92df848.9daf110c.js new file mode 100644 index 00000000000..e5cbcfa19d0 --- /dev/null +++ b/assets/js/d92df848.9daf110c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[2578],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),m=a,d=h["".concat(s,".").concat(m)]||h[m]||c[m]||i;return r?n.createElement(d,o(o({ref:t},u),{},{components:r})):n.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<i;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},61895:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const i={title:"Mithril Team Update",slug:"2023-01-12-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-01-12-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-12-mithril.md",source:"@site/blog/2023-01-12-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-01-12T00:00:00.000Z",formattedDate:"January 12, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.165,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-01-12-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-01-13-system-test"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-01-11-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(h,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ",(0,a.kt)("a",{parentName:"p",href:"https://mithril.network/doc/adr/4"},"ADR"),". They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible."),(0,a.kt)("p",null,"Finally, they have worked on upgrading the ",(0,a.kt)("inlineCode",{parentName:"p"},"devnet")," and fixing some flakiness in the end to end tests of the CI."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Implemented the redaction of an ADR for handling graceful updates of the Mithril Network ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/671"},"#671")),(0,a.kt)("li",{parentName:"ul"},"Worked on a proof of concept to handle backward compatibilty of exchanged messages with ",(0,a.kt)("inlineCode",{parentName:"li"},"protobuf")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/677"},"#677")),(0,a.kt)("li",{parentName:"ul"},"Worked on a proof of concept to handle backward compatibilty of exchanged messages with ",(0,a.kt)("inlineCode",{parentName:"li"},"avro")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/678"},"#678")),(0,a.kt)("li",{parentName:"ul"},"Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/672"},"#672")),(0,a.kt)("li",{parentName:"ul"},"Worked on upgrading the Cardano node of the Mithril ",(0,a.kt)("inlineCode",{parentName:"li"},"devnet"),", as well as fixing flakiness of the CI ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/523"},"#523")),(0,a.kt)("li",{parentName:"ul"},"Prepared and tested the new ",(0,a.kt)("inlineCode",{parentName:"li"},"2302")," distribution pre-release ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2302.0-prerelease"},"2302.0-prerelease")),(0,a.kt)("li",{parentName:"ul"},"Updated the documentation for SPO to build a signer node in order to better reflect the new release process ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/681"},"#681"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d957ac34.2fafdb70.js b/assets/js/d957ac34.2fafdb70.js new file mode 100644 index 00000000000..d673fe99dd6 --- /dev/null +++ b/assets/js/d957ac34.2fafdb70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[57772],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||h[c]||i;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},66001:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-03-24-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-24-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-24-hydra.md",source:"@site/blog/2023-03-24-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-24T00:00:00.000Z",formattedDate:"March 24, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.95,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-24-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2023-03-27-system-test"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-03-23-db-sync"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:p},u="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra had a team workshop and conducted the monthly review\nmeeting for March. They demonstrated a Hydra Head on mainnet, which was running\nthe hydraw demo application. While this marks an important milestone, they also\nemphasized that more features are still to be added as needed for applications\nto run on Hydra. Besides this, the roadmap is getting cleaned up to encourage\ndiscussions and provide more space for user requests."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting ",(0,n.kt)("a",{parentName:"li",href:"https://docs.google.com/presentation/d/1yZ4AqUQ8OBMG9ARMYvj3IOjaIAqglf7kZei4vsLMrbs/edit#slide=id.g1f87a7454a5_0_1392"},"slides"),"/",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/1krzM8VN-gpKTtpVdC2JQx-lGti-4gKQS/view?ts=641b3c1c"},"recording"),", full report of March next week",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Opened a head on mainnet with hydraw demonstration"),(0,n.kt)("li",{parentName:"ul"},"Hydra pay updates"))),(0,n.kt)("li",{parentName:"ul"},"Team workshop in Austria",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Hydra presentation at the Cardano Foundation in Zurich"),(0,n.kt)("li",{parentName:"ul"},"In-person grooming session, marked many items as candidates to be rather :idea: dicussions"),(0,n.kt)("li",{parentName:"ul"},"Improved head protocol ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/786"},"#786")," and investigated a potential bug in rollback handling ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Team building and retrospective")))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Follow-up on backlog and roadmap clean-up"),(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature (documentation updates)"),(0,n.kt)("li",{parentName:"ul"},"Make API more configurable ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/380"},"#380")),(0,n.kt)("li",{parentName:"ul"},"Integrate Hydra specification into repository ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/693"},"#693"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d967308c.4b0b548a.js b/assets/js/d967308c.4b0b548a.js new file mode 100644 index 00000000000..70a20b4bcab --- /dev/null +++ b/assets/js/d967308c.4b0b548a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20957],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=n,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<a;s++)o[s]=r[s];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},12811:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-10-18-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-18-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-18-mithril.md",source:"@site/blog/2023-10-18-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-18T00:00:00.000Z",formattedDate:"October 18, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.07,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-18-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-10-18-consensus"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-15-network"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay."),(0,n.kt)("p",null,"Finally, they enhanced the CI/CD to publish multiple packages to ",(0,n.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io")," and started improving the developer experience with the Mithril devnet."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published the security advisory ",(0,n.kt)("strong",{parentName:"li"},"Mithril relay could expose Cardano block producer internal IP when updated")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/security/advisories/GHSA-9m3h-72xj-x2gq"},"#GHSA-9m3h-72xj-x2gq")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P Networking - Proof of Concept")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate a library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1141"},"#1141")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano transactions history PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"ProtocolKeyRegistration")," creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1187"},"#1187")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Publish multiple packages to ",(0,n.kt)("inlineCode",{parentName:"strong"},"crates.io"))," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1298"},"#1298")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Rename public key published in releases")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1292"},"#1292")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Mithril networks infrastructure maintenance")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1218"},"#1218")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Fix ",(0,n.kt)("inlineCode",{parentName:"strong"},"devnet")," Mithril Docker images")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1272"},"#1272"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d96cfa54.2939f4b2.js b/assets/js/d96cfa54.2939f4b2.js new file mode 100644 index 00000000000..05b2b61decb --- /dev/null +++ b/assets/js/d96cfa54.2939f4b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[16171],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>f});var a=t(67294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,r=function(e,n){if(null==e)return{};var t,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)t=i[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=s(t),m=r,f=p["".concat(c,".").concat(m)]||p[m]||u[m]||i;return t?a.createElement(f,o(o({ref:n},d),{},{components:t})):a.createElement(f,o({ref:n},d))}));function f(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=m;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var s=2;s<i;s++)o[s]=t[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,t)}m.displayName="MDXCreateElement"},21351:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=t(87462),r=(t(67294),t(3905));const i={title:"Performance & tracing update",slug:"2023-05-03-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-05-03-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-03-performance-and-tracing.md",source:"@site/blog/2023-05-03-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.",date:"2023-05-03T00:00:00.000Z",formattedDate:"May 3, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.76,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-05-03-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-03-consensus"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-05-01-db-sync"}},c={authorsImageUrls:[void 0]},s=[{value:"Dataflow documentation",id:"dataflow-documentation",level:3},{value:"Remove redundant Plutus flake input",id:"remove-redundant-plutus-flake-input",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},p="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(p,(0,a.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Benchmarking: The benchmarks and performance investigations for the new ",(0,r.kt)("inlineCode",{parentName:"li"},"8.0")," release branch are ongoing."),(0,r.kt)("li",{parentName:"ul"},"New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint."),(0,r.kt)("li",{parentName:"ul"},"Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on."),(0,r.kt)("li",{parentName:"ul"},"Infrastructure: The ",(0,r.kt)("inlineCode",{parentName:"li"},"plutus-apps")," flake input for ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-node")," has finally been removed."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: A PR implementing placement of benchmarking clusters has been merged.")),(0,r.kt)("h1",{id:"benchmarking"},"Benchmarking"),(0,r.kt)("p",null,"The performance investigations on the ",(0,r.kt)("inlineCode",{parentName:"p"},"8.0")," release branch have lead to pinpointing and addressing incosistent behaviour. For that,\nwe created yet another local reproduction with the workbench's ",(0,r.kt)("inlineCode",{parentName:"p"},"forge-stress")," benchmark. "),(0,r.kt)("p",null,"Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into ",(0,r.kt)("inlineCode",{parentName:"p"},"8.0")," and\nsubsequent releases. "),(0,r.kt)("p",null,"Additionally, we've refined the ",(0,r.kt)("inlineCode",{parentName:"p"},"trace-bench")," family of profiles that target benchmarking our own new tracing system. "),(0,r.kt)("h1",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally\nintended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant\nconversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system."),(0,r.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,r.kt)("h3",{id:"dataflow-documentation"},"Dataflow documentation"),(0,r.kt)("p",null,"The LogObject CLI ",(0,r.kt)("inlineCode",{parentName:"p"},"locli")," is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate\nfurther development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting. "),(0,r.kt)("h3",{id:"remove-redundant-plutus-flake-input"},"Remove redundant Plutus flake input"),(0,r.kt)("p",null,"This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input,\nwe simplify the dependency graph for ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),", as well as enable immediate feedback when developing Plutus benchmarks."),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking.\nThis capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along\nwith various quality-of-life improvements, has been merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d988d084.3a371a78.js b/assets/js/d988d084.3a371a78.js new file mode 100644 index 00000000000..58b9953b852 --- /dev/null +++ b/assets/js/d988d084.3a371a78.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85138],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=s(n),p=a,f=u["".concat(l,".").concat(p)]||u[p]||m[p]||o;return n?r.createElement(f,i(i({ref:t},d),{},{components:n})):r.createElement(f,i({ref:t},d))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:a,i[1]=c;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},56663:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Performance & tracing update",slug:"2023-06-28-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2023-06-28-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-28-performance-and-tracing.md",source:"@site/blog/2023-06-28-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-06-28T00:00:00.000Z",formattedDate:"June 28, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.885,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-06-28-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-28-consensus"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-23-goedel"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: The first batch of refactoring and documentation for our ",(0,a.kt)("inlineCode",{parentName:"li"},"tx-generator")," has been merged to ",(0,a.kt)("inlineCode",{parentName:"li"},"master"),"."),(0,a.kt)("li",{parentName:"ul"},"Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"The compiler switch to GHC9 as the default build platform for ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard. "),(0,a.kt)("p",null,"Using the ",(0,a.kt)("inlineCode",{parentName:"p"},"forge-stress")," approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"tx-generator")," is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),". Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress."),(0,a.kt)("p",null,"Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d99d594e.0abb20d4.js b/assets/js/d99d594e.0abb20d4.js new file mode 100644 index 00000000000..42cadcbc0cb --- /dev/null +++ b/assets/js/d99d594e.0abb20d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46521],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(r),d=a,f=m["".concat(c,".").concat(d)]||m[d]||p[d]||o;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},43933:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2023-02-23-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i="High level summary",l={permalink:"/cardano-updates/2023-02-23-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-23-performance-and-tracing.md",source:"@site/blog/2023-02-23-performance-and-tracing.md",title:"Performance & tracing update",description:"* SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.",date:"2023-02-23T00:00:00.000Z",formattedDate:"February 23, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.245,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-02-23-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-23-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-22-consensus"}},c={authorsImageUrls:[void 0]},s=[{value:"SECP",id:"secp",level:3},{value:"UTxO-HD",id:"utxo-hd",level:3},{value:"1.35.6 release",id:"1356-release",level:3},{value:"Nomad backend",id:"nomad-backend",level:3},{value:"NixOps backend",id:"nixops-backend",level:3}],u={toc:s},m="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork."),(0,a.kt)("li",{parentName:"ul"},"Release benchmarking: we performed a round of benchmarks for the 1.35.6 release."),(0,a.kt)("li",{parentName:"ul"},"UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup."),(0,a.kt)("li",{parentName:"ul"},"New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.")),(0,a.kt)("h1",{id:"performance"},"Performance"),(0,a.kt)("h3",{id:"secp"},"SECP"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead."),(0,a.kt)("li",{parentName:"ol"},"The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run."),(0,a.kt)("li",{parentName:"ol"},"The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking. ")),(0,a.kt)("h3",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop."),(0,a.kt)("li",{parentName:"ol"},"We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.")),(0,a.kt)("h3",{id:"1356-release"},"1.35.6 release"),(0,a.kt)("p",null,"Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible."),(0,a.kt)("h1",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients."),(0,a.kt)("li",{parentName:"ol"},"Locality assumptions were removed and job monitoring was refactored."),(0,a.kt)("li",{parentName:"ol"},"To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster."),(0,a.kt)("li",{parentName:"ol"},"We're currently evaluating different options for genesis distribution in said cluster.")),(0,a.kt)("h3",{id:"nixops-backend"},"NixOps backend"),(0,a.kt)("p",null,"The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d9b708eb.a7b8ca27.js b/assets/js/d9b708eb.a7b8ca27.js new file mode 100644 index 00000000000..ac81dd349cd --- /dev/null +++ b/assets/js/d9b708eb.a7b8ca27.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67463],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),c=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,i(i({ref:t},u),{},{components:a})):n.createElement(h,i({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var c=2;c<o;c++)i[c]=a[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},49915:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-04-20-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},i="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-04-20-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-20-node-cli-api.md",source:"@site/blog/2023-04-20-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-04-20T00:00:00.000Z",formattedDate:"April 20, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.4,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-04-20-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-20-mithril"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-19-consensus"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],u={toc:c},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-04-20---2023-05-04"},"2023-04-20 - 2023-05-04"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Various fixes and improvements")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5136"},"Modify golden test functions to automatically create parent directories")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5132"},"SPO on-chain poll commands adjustments")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5119"},"New environment variable CARDANO_NODE_NETWORK_ID")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5172"},(0,r.kt)("inlineCode",{parentName:"a"},"--out-file")," option for governance commands")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5130"},"UTC Time to slots conversion function")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5157"},"Update CHaP to get latest ledger with performance fix")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4854"},"Integration with Peer Sharing")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d9ccb35d.cea6c556.js b/assets/js/d9ccb35d.cea6c556.js new file mode 100644 index 00000000000..48e1e05d294 --- /dev/null +++ b/assets/js/d9ccb35d.cea6c556.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3136],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function p(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),s=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(n),m=r,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:r,i[1]=p;for(var s=2;s<a;s++)i[s]=n[s];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},62438:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-03-21-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-03-21-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-21-network.md",source:"@site/blog/2023-03-21-network.md",title:"Network Team Update",description:"High level summary",date:"2023-03-21T00:00:00.000Z",formattedDate:"March 21, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.315,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-03-21-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-22-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-17-crypto"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2}],u={toc:s},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"In the last spring we released ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node-1.35.6")," with dynamic P2P\nfunctionality."),(0,r.kt)("p",null,"We received reports from some SPOs who encountered problems with their non\nP2P block producing nodes not being able to connect to their P2P relay. Karl\nKnutsson (from Cardano Foundation) reproduced this issue between two nodes (a\nnon P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed\nit and found a bug in the legacy non p2p code. The bug is only possible to\ntrigger with a P2P node which is binding its outbound connection port to\na fixed IP address and port (default in p2p). A possible solution was found.\nFor more information see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4465"},"#4465"),"."),(0,r.kt)("p",null,"We released ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-ping-0.1.0.0")," package to ",(0,r.kt)("inlineCode",{parentName:"p"},"CHaP"),". ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-ping")," is no\nlonger available as a standalone binary, but instead it will become part of\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-cli")," (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"#4664"),")"),(0,r.kt)("p",null,"We are testing ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," with peer sharing functionality (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"#4019"),")."),(0,r.kt)("p",null,"We are working on ",(0,r.kt)("em",{parentName:"p"},"eclipse evasion"),". We added new class of peers: big ledger\npeers to the outbound governor, implemented tests and fixed found issues\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4462"},"#4462"),"). We also made the information if a given peer plays the role of\na big ledger peer to the mini-protocols. This will allow to modify\nmini-protocol applications for such peers. As part of this functionality we\nrefactored some core types in the network code which simplifies exposed API."),(0,r.kt)("p",null,"Together with Moritz Angerman we started to update ",(0,r.kt)("inlineCode",{parentName:"p"},"io-sim")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ghc-9.6.1")," (see\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/73"},"#73"),")."),(0,r.kt)("p",null,"We merged a fix of configuration of accepted connections limit in\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," (see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4902"},"#4902"),")."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d9e42018.8af86b03.js b/assets/js/d9e42018.8af86b03.js new file mode 100644 index 00000000000..0c6ea56af52 --- /dev/null +++ b/assets/js/d9e42018.8af86b03.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70170],{65246:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/cli-api/page/4","page":4,"postsPerPage":5,"totalPages":6,"totalCount":27,"previousPage":"/cardano-updates/tags/cli-api/page/3","nextPage":"/cardano-updates/tags/cli-api/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/da04b7b0.390ca13a.js b/assets/js/da04b7b0.390ca13a.js new file mode 100644 index 00000000000..5b257bb3346 --- /dev/null +++ b/assets/js/da04b7b0.390ca13a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[78101],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function o(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},m="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,c=o(t,["components","mdxType","originalType","parentName"]),m=u(a),s=r,h=m["".concat(p,".").concat(s)]||m[s]||d[s]||i;return a?n.createElement(h,l(l({ref:e},c),{},{components:a})):n.createElement(h,l({ref:e},c))}));function h(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,l=new Array(i);l[0]=s;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[m]="string"==typeof t?t:r,l[1]=o;for(var u=2;u<i;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},12804:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-08-15-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",o={permalink:"/cardano-updates/2023-08-15-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-15-node-cli-api.md",source:"@site/blog/2023-08-15-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-08-15T00:00:00.000Z",formattedDate:"August 15, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.29,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-08-15-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"SECP bindings Security Issue Report",permalink:"/cardano-updates/2023-08-17-secp-issue"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-11-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-08-02---2023-08-15"},"2023-08-02 - 2023-08-15"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"cardano-node 8.2.1 (pre-release) to SanchoNet"),(0,r.kt)("li",{parentName:"ul"},"Continue moving CLI into era-based top level command structure"),(0,r.kt)("li",{parentName:"ul"},"Wire-up DREP key generation,"),(0,r.kt)("li",{parentName:"ul"},"Fix DREP deregistration certificates"),(0,r.kt)("li",{parentName:"ul"},"Implement Constitutional Committee Key generation on the CLI"),(0,r.kt)("li",{parentName:"ul"},"Introducing era-based protocol parameters on the API"),(0,r.kt)("li",{parentName:"ul"},"Removing depracated functions and types on the API")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/169"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.13.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/164"},"Reenable golden tests")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/163"},"#128 DRep key generation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/160"},"Bump index states")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/159"},"Fix deregistration-certificate: generate deregistration instead of registration certs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/158"},"Structuring legacy code so that era-based code does not depend on it")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/151"},"Plural for command groups")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/144"},"Implement ",(0,r.kt)("inlineCode",{parentName:"a"},"conway governance committee key-hash")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/142"},"Wire up constitution creation in the new era based cli commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/140"},"cardano-cli 8.5.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/137"},"Wire up remaining DReps")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/136"},"Implement ",(0,r.kt)("inlineCode",{parentName:"a"},"conway governance committee hot-key-gen")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/127"},"Convert to use ",(0,r.kt)("inlineCode",{parentName:"a"},"tasty-discover")))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/189"},"Release cardano-api 8.13.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/187"},"Fix build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/185"},"cardano-api 8.13.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/181"},"Modify ",(0,r.kt)("inlineCode",{parentName:"a"},"queryGenesisParameters")," so that its type advertises it only returns genesis parameters for the Shelley era")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/180"},"Introduce EraBasedProtocolParametersUpdate")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/173"},"Delete deprecated functions and types")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/171"},"Simplify code with new constraints functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/170"},"Fix ",(0,r.kt)("inlineCode",{parentName:"a"},"EraCast Certificate"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/168"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.12.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/167"},"Fix committee hot keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/164"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.11.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/163"},"Fix typo Constitional -> Constitutional"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5430"},"cardano-git-rev: New version for CHaP")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5427"},"Fix broken links in docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5423"},"cardano-node 8.2.1"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5427"},"Fix broken links in docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5423"},"cardano-node 8.2.1"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/5427"},"Fix broken links in docs")),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/127"},"Convert to use ",(0,r.kt)("inlineCode",{parentName:"a"},"tasty-discover")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/da7937f0.7cc22aaa.js b/assets/js/da7937f0.7cc22aaa.js new file mode 100644 index 00000000000..d7727b37d27 --- /dev/null +++ b/assets/js/da7937f0.7cc22aaa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62083],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(n),h=a,d=c["".concat(l,".").concat(h)]||c[h]||m[h]||o;return n?r.createElement(d,i(i({ref:t},p),{},{components:n})):r.createElement(d,i({ref:t},p))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var u=2;u<o;u++)i[u]=n[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}h.displayName="MDXCreateElement"},52445:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-10-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-10-05-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-05-consensus.md",source:"@site/blog/2022-10-05-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2022-10-05T00:00:00.000Z",formattedDate:"October 5, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.825,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-10-05-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-10-14-ledger"},nextItem:{title:"DB Sync Team Update",permalink:"/cardano-updates/2022-10-04-db-sync"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Executive summary",id:"executive-summary",level:2},{value:"Additional information",id:"additional-information",level:2},{value:"Genesis",id:"genesis",level:3}],p={toc:u},c="wrapper";function m(e){let{components:t,...o}=e;return(0,a.kt)(c,(0,r.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks, the consensus team worked on improving the\nperformance of the ChainSync jumping logic, which is needed for Genesis. We also\nrewrote the implementation of the mempool in the UTxO HD prototype which solved\nthe issues that prevented us from running system level benchmarks. Also on the\nUTxO HD front, we have an improved implementation of the sequence-of-differences\n(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for\nthe UTxO HD feature."),(0,a.kt)("h2",{id:"executive-summary"},"Executive summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"With the latest implementation of ChainSync jumping we are closer to the\nbaseline performance. In particular, the prototype seems to benefit from the\nextra concurrency provided by additional capabilities."),(0,a.kt)("li",{parentName:"ul"},"We rewrote the implementation of the mempool in the UTxO HD prototype. This\nrewrite was required due to performance problems we observed when running the\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/blob/master/Makefile#L51"},"workbench"),".\nThese performance problems prevented us from running system level benchmarks.\nThe rewrite solved these issues. After the ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4049"},"UTxO-HD: mempool\nrewrite")," PR is\nmerged, we will contact the Benchmarking team so that they run the system\nlevel benchmarks."),(0,a.kt)("li",{parentName:"ul"},"The implementation of sequences of differences based on anti-diffs was\nintegrated into the UTxO HD prototype. It is pending\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4036"},"review")," and\nwe also need to run replay and syncing benchmarks to confirm that this will\ndeliver a performance improvement, as observed in our micro-benchmarks."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3944"},"The UTxO HD prototype\ninspection"),"\nresulted in a ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4045"},"list of\ntests"),"\nneeded for consensus to consider the UTxO HD prototype as fully tested.")),(0,a.kt)("h2",{id:"additional-information"},"Additional information"),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"Benchmarking setup: 50MBit/s, 50ms latency"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Red: baseline"),(0,a.kt)("li",{parentName:"ul"},"Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.")),(0,a.kt)("p",null,"As ChainSync Jumping involves many concurrent network operations at every jump,\nwe tried to run the node with 6 instead of the default 2 capabilties."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Orange: baseline with 6 capabilities"),(0,a.kt)("li",{parentName:"ul"},"Blue: CSJ prototype with 6 capabilities")),(0,a.kt)("p",null,"This diagram shows the respective syncing progress, starting at Genesis and\ncontinuing a good part into Shelley (with the dashed line indicating the\nByron-to-Shelley transition)."),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(36276).Z,width:"654",height:"459"})),(0,a.kt)("p",null,"Further work includes whether we can tune the prototype to better handle few\ncapabilities, or to adapt the default number of capabilities (potentially just\nwhile syncing)."))}m.isMDXComponent=!0},36276:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/happy-path-csj-prototype-bench-1-2c33ba45f44a086415e703fe8f0f7ad1.svg"}}]); \ No newline at end of file diff --git a/assets/js/daa3e20a.f1391e79.js b/assets/js/daa3e20a.f1391e79.js new file mode 100644 index 00000000000..c65c73cb20c --- /dev/null +++ b/assets/js/daa3e20a.f1391e79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[29177],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},s=Object.keys(e);for(a=0;a<s.length;a++)r=s[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a<s.length;a++)r=s[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=a.createContext({}),m=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=m(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,s=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=m(r),c=n,h=u["".concat(i,".").concat(c)]||u[c]||d[c]||s;return r?a.createElement(h,o(o({ref:t},p),{},{components:r})):a.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=r.length,o=new Array(s);o[0]=c;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var m=2;m<s;m++)o[m]=r[m];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},34169:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>m});var a=r(87462),n=(r(67294),r(3905));const s={title:"System Test Team Update",slug:"2023-03-27-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-27-system-test",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-27-system-test.md",source:"@site/blog/2023-03-27-system-test.md",title:"System Test Team Update",description:"High level summary",date:"2023-03-27T00:00:00.000Z",formattedDate:"March 27, 2023",tags:[{label:"system-test",permalink:"/cardano-updates/tags/system-test"}],readingTime:.785,hasTruncateMarker:!1,authors:[{name:"Martin Kourim",title:"System Test Engineer",url:"https://github.com/mkoura",imageURL:"https://github.com/mkoura.png",key:"mkoura"}],frontMatter:{title:"System Test Team Update",slug:"2023-03-27-system-test",authors:"mkoura",tags:["system-test"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-31-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-24-hydra"}},i={authorsImageUrls:[void 0]},m=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Framework improvements:",id:"framework-improvements",level:3},{value:"Node:",id:"node",level:3},{value:"DB-Sync:",id:"db-sync",level:3}],p={toc:m},u="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the ",(0,n.kt)("em",{parentName:"p"},"1.35.5")," and ",(0,n.kt)("em",{parentName:"p"},"1.35.6")," releases (and their predecessing release candidates) and ran tests on branch with the ",(0,n.kt)("em",{parentName:"p"},"UTxO-HD")," functionality."),(0,n.kt)("h2",{id:"workstreams"},"Workstreams"),(0,n.kt)("h3",{id:"framework-improvements"},"Framework improvements:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"improvements in searching for unexpected error messages in log files during test run"),(0,n.kt)("li",{parentName:"ul"},"added support for UTxO-HD testing"),(0,n.kt)("li",{parentName:"ul"},"added support for the new P2P topology format"),(0,n.kt)("li",{parentName:"ul"},"added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)"),(0,n.kt)("li",{parentName:"ul"},"added preliminary support for the Conway era"),(0,n.kt)("li",{parentName:"ul"},"added support for running tests on the ",(0,n.kt)("em",{parentName:"li"},"Preview")," testnet")),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node-tests/pulls?q=is%3Apr+is%3Aclosed+updated%3A2023-01-13..2023-03-26"},"Full list of closed PRs")),(0,n.kt)("h3",{id:"node"},"Node:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"ran tests on node branch with the UTxO-HD functionality"),(0,n.kt)("li",{parentName:"ul"},"tested the ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_5.html"},"1.35.5")," release"),(0,n.kt)("li",{parentName:"ul"},"tested the ",(0,n.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/cardano-node-tests/test_results/node/tag_1_35_6.html"},"1.35.6")," release")),(0,n.kt)("h3",{id:"db-sync"},"DB-Sync:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"improvements in db-sync sync tests"),(0,n.kt)("li",{parentName:"ul"},"improvements in db-sync functional tests")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/daace409.1ea8e0b2.js b/assets/js/daace409.1ea8e0b2.js new file mode 100644 index 00000000000..ba615c0e08d --- /dev/null +++ b/assets/js/daace409.1ea8e0b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89008],{23947:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>u,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var n=o(87462),a=(o(67294),o(3905)),i=o(22004);const r={title:"Network Team Update",slug:"2022-09-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},u=void 0,s={permalink:"/cardano-updates/2022-09-27-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-09-27-network.md",source:"@site/blog/2022-09-27-network.md",title:"Network Team Update",description:"Network Update",date:"2022-09-27T00:00:00.000Z",formattedDate:"September 27, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.24,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-09-27-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-09-30-ledger"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-09-20-consensus"}},l={authorsImageUrls:[void 0]},p=[{value:"Network Update",id:"network-update",level:2},{value:"Ouroboros Network",id:"ouroboros-network",level:3},{value:"Ouroboros Consensus",id:"ouroboros-consensus",level:3},{value:"Some older items, which were not announced",id:"some-older-items-which-were-not-announced",level:4},{value:"Cardano Node",id:"cardano-node",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"Typed Protocols",id:"typed-protocols",level:3},{value:"Input Endorsers Simulation",id:"input-endorsers-simulation",level:3}],k={toc:p},h="wrapper";function d(e){let{components:t,...o}=e;return(0,a.kt)(h,(0,n.Z)({},k,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"network-update"},"Network Update"),(0,a.kt)("h3",{id:"ouroboros-network"},"Ouroboros Network"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We finished high and low level ",(0,a.kt)("em",{parentName:"li"},"peer sharing")," design. See\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/wiki/Peer-Sharing-Implementation-Plan"},"Peer Sharing Implementation Plan")),(0,a.kt)("li",{parentName:"ul"},"We started working on low-level design of ",(0,a.kt)("em",{parentName:"li"},"eclipse evasion")," (work in\nprogress)."),(0,a.kt)("li",{parentName:"ul"},"We decided to use ",(0,a.kt)("strong",{parentName:"li"},"peer sharing")," instead of overloaded and ambiguous ",(0,a.kt)("em",{parentName:"li"},"gossip")," term.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3980"},"PR input-output-hk/ouroboros-network#3980")),(0,a.kt)("li",{parentName:"ul"},"We fixed technical dept\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3905"},"issue input-output-hk/cardano-node#3905")," in\nthe simulation testing of diffusion\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4004"},"PR input-output-hk/cardano-node#4004")),(0,a.kt)("li",{parentName:"ul"},"We deployed all our nodes using our new nix based deployment architecture.\nWhen deploying we found an issue in the\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/issues/3752"},(0,a.kt)("inlineCode",{parentName:"a"},"RTView")),".")),(0,a.kt)("h3",{id:"ouroboros-consensus"},"Ouroboros Consensus"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Recently we found out that the consensus does not log exceptions thrown during\nintiialisation. This was fixed in\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4015"},"PR input-output-hk/ouroboros-network#4015"),"\nAs part of this pull request we also changed that all exceptions rethrown by\nthe connection handler thread are wrapped in ",(0,a.kt)("inlineCode",{parentName:"li"},"ExceptionInHandler"),".")),(0,a.kt)("h4",{id:"some-older-items-which-were-not-announced"},"Some older items, which were not announced"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We identified and fixed an issue related to socket activation (socket options\nwhere not set for sockets passed through socket activation).\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3979"},"PR input-output-hk/cardano-node#3979"),"\nThis fix will be released in the next ",(0,a.kt)("inlineCode",{parentName:"li"},"cardano-node")," release.")),(0,a.kt)("h3",{id:"cardano-node"},"Cardano Node"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We extended the NixOs service module so that one can modify ",(0,a.kt)("inlineCode",{parentName:"li"},"socketPath"),",\n",(0,a.kt)("inlineCode",{parentName:"li"},"runtimeDir"),", ",(0,a.kt)("inlineCode",{parentName:"li"},"databasePath"),", ",(0,a.kt)("inlineCode",{parentName:"li"},"traceSocketPathAccept"),",\n",(0,a.kt)("inlineCode",{parentName:"li"},"traceSocketPathConnect")," and ",(0,a.kt)("inlineCode",{parentName:"li"},"stateDir")," options.\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4196"},"PR input-output-hk/cardano-node#4196"))),(0,a.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,a.kt)("p",null,"We resolved a number of issues before release of ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," on hackage:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2797"},"issue input-output-hk/ouroboros-network#2797")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2650"},"issue input-output-hk/ouroboros-network#2650")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3436"},"issue input-output-hk/ouroboros-network#3436")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2588"},"issue input-output-hk/ouroboros-network#2588")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2587"},"issue input-output-hk/ouroboros-network#2587")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/2586"},"issue input-output-hk/ouroboros-network#2586"))),(0,a.kt)("p",null,"See ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/24"},"PR #24"),"."),(0,a.kt)("p",null,"We also improved experience for contributors of ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"typed-protocols")," by adding issue templates:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/25"},"PR input-output-hk/io-sim#25"))),(0,a.kt)("h3",{id:"typed-protocols"},"Typed Protocols"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We pushed a branch which identifies a GHC quirk:\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/tree/coot/typed-protocols-rewrite-StateToken-problem"},"coot/typed-protocols-rewrite-StateToken-problem"),".\nThat's too be resolved in order to push forward review of the redesign in\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/3"},"PR input-output-hk/typed-protocols#3"),"."),(0,a.kt)("li",{parentName:"ul"},"As for ",(0,a.kt)("inlineCode",{parentName:"li"},"io-sim"),", we wrote issue templates:\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/11"},"PR input-output-hk/typed-protocols#11"))),(0,a.kt)("h3",{id:"input-endorsers-simulation"},"Input Endorsers Simulation"),(0,a.kt)("p",null,"New features include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Histograms of block arrival frequency, for both network (inbound) and CPU\n(block validation). This is interesting to check that we're not overloading\nthe CPU block validation capacity, or network link capacity. Or alternatively\nto observe the behaviour in an overload situation if we set the block\ngeneration rate high enough.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},'Pie chart of utilisation of TCP links. This shows how small a fraction of\nlinks are being used at any one time, and shows that once the system "warms\nup" and is operating stably, most block delivery is ballistic.')),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Showing off the new screen layout combinators, that let us put multiple\ncharts, titles etc on screen at once and scale them to whatever screen or\nvideo resolution we like without having to tweak numbers (this example is\nscaled to fit 1080HD video resolution)."))),(0,a.kt)(i.Z,{playing:!0,controls:!0,url:"/p2p-relay-5.mp4",mdxType:"ReactPlayer"}))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db138d7c.1b8b9080.js b/assets/js/db138d7c.1b8b9080.js new file mode 100644 index 00000000000..c2db8a9f2c4 --- /dev/null +++ b/assets/js/db138d7c.1b8b9080.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18634],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=u(n),h=r,m=d["".concat(l,".").concat(h)]||d[h]||c[h]||o;return n?a.createElement(m,i(i({ref:t},p),{},{components:n})):a.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var u=2;u<o;u++)i[u]=n[u];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},78238:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Quarterly Update",slug:"2023-01-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/quarterly/2023-01-18-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-01-18-consensus.md",source:"@site/quarterly/2023-01-18-consensus.md",title:"Consensus Quarterly Update",description:"Consensus Quarterly Update",date:"2023-01-18T00:00:00.000Z",formattedDate:"January 18, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:3.205,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Quarterly Update",slug:"2023-01-18-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2023-04-03-ledger"},nextItem:{title:"Network Quarterly Update",permalink:"/cardano-updates/quarterly/2023-01-13-network"}},l={authorsImageUrls:[void 0]},u=[{value:"Consensus Quarterly Update",id:"consensus-quarterly-update",level:2},{value:"2022-12 - 2023-01",id:"2022-12---2023-01",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Support",id:"support",level:4},{value:"Conway era",id:"conway-era",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4},{value:"Support",id:"support-1",level:4},{value:"Tech debt",id:"tech-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration-1",level:4},{value:"Risks",id:"risks",level:3},{value:"UTxO HD",id:"utxo-hd-2",level:4}],p={toc:u},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"consensus-quarterly-update"},"Consensus Quarterly Update"),(0,r.kt)("h2",{id:"2022-12---2023-01"},"2022-12 - 2023-01"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("p",null,"The prototype is feature complete and thoroughly tested at the consensus level.\nIn particular, we invested a lot of time in writing property-test for the\nmempool, and other crucial new parts of the prototype. Now we are ready to run\nintegration tests and system-level benchmarks."),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("p",null,"We identified and fixed a slowdown in cross-era forecasting that was inhibiting\nour efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7%\nspeedup in full sync times in the baseline."),(0,r.kt)("p",null,"We also started prototyping a self-contained implementation of the Genesis\ndynamics (in particular of the parts intentionally not part of the ChainSync\nJumping prototype) that furthered our understanding of subtleties and edge\ncases."),(0,r.kt)("h4",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We worked on designing integration of new VRF and KES crypto into consensus.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"Crypto")," class was split into two parts: ",(0,r.kt)("inlineCode",{parentName:"li"},"Crypto")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"HeaderCrypto"),"."),(0,r.kt)("li",{parentName:"ul"},"With the Ledger team's help, we refactored ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-ledger")," to use a proxy\ntype for VRF.")))),(0,r.kt)("h4",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"PR went through its second review round. It is about to be merged, but it got\ndelayed due to people's availability during Christmas break.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We improved the capabilities of our ",(0,r.kt)("inlineCode",{parentName:"li"},"io-sim")," library, which is key for testing\nand simulating Cardano components."),(0,r.kt)("li",{parentName:"ul"},"We removed thunks from epoch translations in the ledger, which is important\nfor reducing memory consumption of the Cardano node.")),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We added a tutorial on how to instantiate the Consensus layer to run custom\nledgers. This should be a valuable resource to people looking to roll their\nown custom blockchain (either for commercial or research purposes)."),(0,r.kt)("li",{parentName:"ul"},"We added an overview of consensus to the ",(0,r.kt)("a",{parentName:"li",href:"https://input-output-hk.github.io/ouroboros-network/"},"top level\ndocumentation")," of\nouroboros-network. This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Evaluate the extensibility of the prototype. Moving the UTxO to disk is only\nthe first step towards reducing the memory requirements of Cardano node, and\nensuring its long term sustainability. In the future, we plan on moving other\nlarge maps, such as delegation maps. The prototype should be able to\naccommodate these changes without any major modifications."),(0,r.kt)("li",{parentName:"ul"},"Start the integration with other downstream components, such as the wallet and\ndb-sync. The idea is to identify and address any potential pain points that\nmight arise during this integration."),(0,r.kt)("li",{parentName:"ul"},"Run integration tests and system-level benchmarks.")),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish benchmarking and tuning the fast-path ChainSync Jumping prototype"),(0,r.kt)("li",{parentName:"ul"},"Expand and optimize the self-contained implementation of the Disconnect Rule\n(including density comparisons and the LoE)"),(0,r.kt)("li",{parentName:"ul"},"Develop documentation and smoke tests for these components."),(0,r.kt)("li",{parentName:"ul"},"Start modifying the ChainSync Client for the LoP and LoR.")),(0,r.kt)("h4",{id:"support-1"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Help the Network team with diagnosing performance regression in block\nproduction.")),(0,r.kt)("h4",{id:"tech-debt"},"Tech debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fix property-test failures concerning iterators (",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3999"},"#3999")," and\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4183"},"#4183"),").")),(0,r.kt)("h4",{id:"fostering-collaboration-1"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4145"},"mapping consensus"),".")),(0,r.kt)("h3",{id:"risks"},"Risks"),(0,r.kt)("h4",{id:"utxo-hd-2"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Moving other parts of the ledger state to disk might require a major redesign\nof the prototype. For instance, if it turns out that the epoch change rules\nrequire access to the ",(0,r.kt)("em",{parentName:"li"},"full")," ledger state. If this is the case, we might\naccept this risk and do the redesign after the initial release of UTxO-HD."),(0,r.kt)("li",{parentName:"ul"},"Integration with downstream clients might require more work than we\nanticipate."),(0,r.kt)("li",{parentName:"ul"},"Access to the benchmarking's team time and resources."),(0,r.kt)("li",{parentName:"ul"},"Benchmarking results might show significant performance degradation, which\nwill require additional work if such performance degradation is not accepted\nby other stakeholders."),(0,r.kt)("li",{parentName:"ul"},"The prototype's performance might not be accepted by other stakeholders. Here\nwe need to clearly communicate that this is necessary to ensure that as the\nblockchain size grows, the node can operate within reasonable memory\nconstraints.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db50202c.71a9a110.js b/assets/js/db50202c.71a9a110.js new file mode 100644 index 00000000000..2649951c929 --- /dev/null +++ b/assets/js/db50202c.71a9a110.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[63566],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>g});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),d=n,g=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return r?a.createElement(g,l(l({ref:t},s),{},{components:r})):a.createElement(g,l({ref:t},s))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},99900:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-05-26-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-26-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-goedel.md",source:"@site/blog/2023-05-26-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.39,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-05-26-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-31-performance-and-tracing"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-26-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team has been working on final revisions for the\npre-proceedings versions of two ICE 2023 papers."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Porting Ouroboros Praos formalisation to new application layer.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Preparing pre-proceedings version of two ICE 2023 papers.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db5663d1.a1ed76f8.js b/assets/js/db5663d1.a1ed76f8.js new file mode 100644 index 00000000000..cad2a4cc6d9 --- /dev/null +++ b/assets/js/db5663d1.a1ed76f8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[14348],{45422:a=>{a.exports=JSON.parse('{"label":"network","permalink":"/cardano-updates/tags/network","allTagsPath":"/cardano-updates/tags","count":24}')}}]); \ No newline at end of file diff --git a/assets/js/dceb6e64.eb5e94a8.js b/assets/js/dceb6e64.eb5e94a8.js new file mode 100644 index 00000000000..ba938368e0d --- /dev/null +++ b/assets/js/dceb6e64.eb5e94a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[18242],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||c[m]||i;return n?a.createElement(h,o(o({ref:t},p),{},{components:n})):a.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,o[1]=s;for(var u=2;u<i;u++)o[u]=n[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},22300:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const i={title:"Consensus Quarterly Update",slug:"2022-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},o=void 0,s={permalink:"/cardano-updates/quarterly/2022-11-15-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-15-consensus.md",source:"@site/quarterly/2022-11-15-consensus.md",title:"Consensus Quarterly Update",description:"Consensus Quarterly Update",date:"2022-11-15T00:00:00.000Z",formattedDate:"November 15, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:3.655,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Quarterly Update",slug:"2022-11-15-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Open-Source Update",permalink:"/cardano-updates/quarterly/2023-01-13-open-source"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/quarterly/2022-11-09-network"}},l={authorsImageUrls:[void 0]},u=[{value:"Consensus Quarterly Update",id:"consensus-quarterly-update",level:2},{value:"2022-09 - 2022-11",id:"2022-09---2022-11",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Conway era",id:"conway-era",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4},{value:"Tech debt",id:"tech-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration-1",level:4}],p={toc:u},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"consensus-quarterly-update"},"Consensus Quarterly Update"),(0,r.kt)("h2",{id:"2022-09---2022-11"},"2022-09 - 2022-11"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"As a consequence of the errors observed when running distributed mempool\nbenchmarks, we re-designed the UTxO HD mempool integration, which fixed these\nerrors and lead to a simpler and more maintainable design.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We focused on increasing test coverage for the UTxO-HD prototype. In\nparticular, we added property tests for:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Backing store (work ongoing)"),(0,r.kt)("li",{parentName:"ul"},"Era transitions"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"The property tests we added uncovered several bugs, which is a great result\ngiven the exponential increase in the cost of finding bugs as they are closer\nto deployment.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"One of the errors found by our tests required us to work on improvements in\nthe Haskell bindings for LMDB. This work is ongoing.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We started working on the mempool property tests that will exercise the new\ncode paths that UTxO HD introduced.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'We developed, benchmarked and tested an implementation of sequences of\ndifferences based on "anti-diffs". Performance results of diff sequence\noperations show that we achieved a speedup of about ',(0,r.kt)("inlineCode",{parentName:"p"},"4x")," across several\nscenarios. Note: this speedup is taking into account diff sequence operations\nonly, so the consensus-wide speedup is less than ",(0,r.kt)("inlineCode",{parentName:"p"},"4x"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},'We integrated the "anti-diff" prototype into the UTxO HD feature branch.'))),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We wrote a simulator that demonstrates soundness of an abstract implementation\nof the new chain selection rule."),(0,r.kt)("li",{parentName:"ul"},"We elaborated a draft specification for the Genesis implementation (currently\nawaiting feedback from other architects)."),(0,r.kt)("li",{parentName:"ul"},"We elaborated a draft specification for the ChainSync Jumping optimization. In\nparticular, this includes a proof sketch that the latter preserves liveness\nand safety in all cases."),(0,r.kt)("li",{parentName:"ul"},"With the Networking team, we co-designed the eclipse avoidance mechanism,\nspecifically its coherence with the Genesis implementation plan's security\nand its dependence on the new ChainSync Jumping optimization."),(0,r.kt)("li",{parentName:"ul"},"We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a\nperformance degradation wrt the baseline. Our optimization attempts so far\nhave brought the performance closer to the baseline, but not yet to parity.")),(0,r.kt)("h4",{id:"conway-era"},"Conway era"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We did most of the heavy lifting required to integrate the Conway era into the\nConsensus layer.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We started working on enabling CI nightly tests, which revealed several test\nfailures due to thunks being found it data structures used by the ledger and\nconsensus. We made a lot of progress fixing those thunk errors, but some\nerrors still remain.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We elaborated a ",(0,r.kt)("inlineCode",{parentName:"p"},"db-analyser")," benchmark for the ledger operations. This led us\nto the identification of high processing time at epoch boundaries, and we\ncould not observe any performance degradation that can be attributed to era\nchanges.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed a source of flakiness in the ChainDB QSM test.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We clarified a common source of confusion around VRF tie-breaking and\ncross-era chain selection.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"We fixed a bug in the maximum-allowed ledger major protocol version."))),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We spent time making ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-updates")," the central source of information for\nthe core teams stakeholders."),(0,r.kt)("li",{parentName:"ul"},"We went through the Galois gap analysis and extracted actionable points to\ntake on next."),(0,r.kt)("li",{parentName:"ul"},"Bart and Yogesh continued with their onboarding and stated making substantial\ncontributions to consensus.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish the mempool property tests."),(0,r.kt)("li",{parentName:"ul"},"Benchmark the latest version of the prototype."),(0,r.kt)("li",{parentName:"ul"},"Elaborate a document that describes new integration test scenarios and pass it\nto the SDET team."),(0,r.kt)("li",{parentName:"ul"},"Bring query UTxO by address command performance on par with the baseline\nversion.")),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Receive and incorporate Duncan's feedback on the first draft specification for\nthe Genesis implementation."),(0,r.kt)("li",{parentName:"ul"},"Begin prototyping the first genesis implementation, unless the first draft\nneeds major changes."),(0,r.kt)("li",{parentName:"ul"},"Draft a second revision of the Genesis report."),(0,r.kt)("li",{parentName:"ul"},"Review the second revision with a wider audience, which includes at least\nAlexander Russell. That feedback will drive a third and hopefully final\nrevision."),(0,r.kt)("li",{parentName:"ul"},"Investigate how to mitigate the ~30% slowdown we have observed so far in the\nChainSync jumping prototype, and try to mitigate it. In particular, we might\nneed to optimize the existing BlockFetch logic.")),(0,r.kt)("h4",{id:"tech-debt"},"Tech debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Enabling nightly CI tests.")),(0,r.kt)("h4",{id:"fostering-collaboration-1"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Merge the tutorial document Galois wrote; requires CI integration."),(0,r.kt)("li",{parentName:"ul"},"Come up with our own documentation improvements, many of which were suggested\nin the Galois gap analysis."),(0,r.kt)("li",{parentName:"ul"},"Try to hire a new team member.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddcb8bff.0be505e0.js b/assets/js/ddcb8bff.0be505e0.js new file mode 100644 index 00000000000..b71a6b78e83 --- /dev/null +++ b/assets/js/ddcb8bff.0be505e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54642],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=i.createContext({}),s=function(e){var t=i.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return i.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=n,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<a;s++)o[s]=r[s];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},15811:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-11-22-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-22-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-22-mithril.md",source:"@site/blog/2023-11-22-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-22T00:00:00.000Z",formattedDate:"November 22, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.895,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-22-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-22-ledger"},nextItem:{title:"Initial CIP 1694 Security Analysis and Responses",permalink:"/cardano-updates/2023-11-20-cip1694"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer."),(0,n.kt)("p",null,"Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Prototype a P2P relay with ",(0,n.kt)("inlineCode",{parentName:"strong"},"libp2p"))," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1326"},"#1326")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Enhance aggregator REST API performances")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1327"},"#1327")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Signer runtime is stuck for some SPO")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1312"},"#1312")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Manually deploy a test Mithril network")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1356"},"#1356")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Make Cardano node version custom in CI/CD")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1355"},"#1355")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Support P2P relay in infrastructure")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1361"},"#1361")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"mithril-client fails to extract archive")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1352"},"#1352"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddce0bff.2c93fa43.js b/assets/js/ddce0bff.2c93fa43.js new file mode 100644 index 00000000000..3731c5af8bd --- /dev/null +++ b/assets/js/ddce0bff.2c93fa43.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[31005],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?r.createElement(h,l(l({ref:t},c),{},{components:a})):r.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},59319:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-07-21-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-07-21-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-sre.md",source:"@site/blog/2023-07-21-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:.685,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-07-21-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-07-21-ledger"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-20-goedel"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-ops",id:"cardano-ops",level:3},{value:"Cardano-world",id:"cardano-world",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Re-spin sanchonet for testing a new node version followed by fork to Conway"),(0,n.kt)("li",{parentName:"ul"},"Deploying a sanchonet compatible faucet to sanchonet"),(0,n.kt)("li",{parentName:"ul"},"Migrate shelley qa legacy environment to cardano-world")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Bump iohk-nix for sanchonet and shelley qa environment updates: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5406"},"cardano-node-pull-5406"))),(0,n.kt)("h3",{id:"cardano-ops"},"Cardano-ops"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ops/compare/31cce1a...496f085"},"cardano-ops-compare"))),(0,n.kt)("h3",{id:"cardano-world"},"Cardano-world"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-node p2p all local roots entrypoint option was added: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/102"},"cardano-world-pull-102")),(0,n.kt)("li",{parentName:"ul"},"Migrate shelley qa legacy environment to cardano-world: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/103"},"cardano-world-pull-103")),(0,n.kt)("li",{parentName:"ul"},"Create a sanchonet compatible faucet: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-world/pull/91"},"cardano-world-pull-91"))),(0,n.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migrate shelley qa legacy environment to cardano-world: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/549"},"iohk-nix-pull-549")),(0,n.kt)("li",{parentName:"ul"},"Drop legacy byron environment parameters: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/550"},"iohk-nix-pull-550"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/de5b481b.565b362c.js b/assets/js/de5b481b.565b362c.js new file mode 100644 index 00000000000..8e2b8a37351 --- /dev/null +++ b/assets/js/de5b481b.565b362c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72317],{12630:a=>{a.exports=JSON.parse('{"label":"open-source","permalink":"/cardano-updates/quarterly/tags/open-source","allTagsPath":"/cardano-updates/quarterly/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/de790939.74e01666.js b/assets/js/de790939.74e01666.js new file mode 100644 index 00000000000..7bc042e7976 --- /dev/null +++ b/assets/js/de790939.74e01666.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[42185],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?n(Object(a),!0).forEach((function(t){l(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):n(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function u(e,t){if(null==e)return{};var a,r,l=function(e,t){if(null==e)return{};var a,r,l={},n=Object.keys(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=r.createContext({}),i=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=i(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},s=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,d=u(e,["components","mdxType","originalType","parentName"]),c=i(a),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||n;return a?r.createElement(h,o(o({ref:t},d),{},{components:a})):r.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=s;var u={};for(var p in t)hasOwnProperty.call(t,p)&&(u[p]=t[p]);u.originalType=e,u[c]="string"==typeof e?e:l,o[1]=u;for(var i=2;i<n;i++)o[i]=a[i];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}s.displayName="MDXCreateElement"},99073:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>u,toc:()=>i});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-04-21-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,u={permalink:"/cardano-updates/2023-04-21-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-21-ledger.md",source:"@site/blog/2023-04-21-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-04-21T00:00:00.000Z",formattedDate:"April 21, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:.905,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-04-21-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-21-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-04-20-mithril"}},p={authorsImageUrls:[void 0]},i=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway ledger era",id:"conway-ledger-era",level:3},{value:"Haddocks hosted on github pages",id:"haddocks-hosted-on-github-pages",level:3},{value:"Small improvements to the API",id:"small-improvements-to-the-api",level:3},{value:"Technical Debt",id:"technical-debt",level:3}],d={toc:i},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(c,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"We continued to make progress on CIP-1694 and the conway ledger era.\nIn particular, the conway era now supports Plutus V3.\nFinally, we made small improvements to the ledger API and now host\nour Haskell code documentation (haddocks) on github pages."),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway-ledger-era"},"Conway ledger era"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3365"},"pull-3365"),"] - Support for Plutus V3."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3368"},"pull-3368"),"] - Conway genesis fix."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3369"},"pull-3369"),"] - Added some governance ledger state."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3372"},"pull-3372"),"] - Work on the conway delegation certificates."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3384"},"pull-3384"),"] - Rename.")),(0,l.kt)("h3",{id:"haddocks-hosted-on-github-pages"},"Haddocks hosted on github pages"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3385"},"pull-3385"),"] ")),(0,l.kt)("h3",{id:"small-improvements-to-the-api"},"Small improvements to the API"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3366"},"pull-3366"),"]")),(0,l.kt)("h3",{id:"technical-debt"},"Technical Debt"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3367"},"pull-3367"),"] Fix cost model json instances."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3371"},"pull-3371"),"] UMap cleanup."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3373"},"pull-3373"),"] Upgrade to ghc 9.2.7 and cabal 3.10.1."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3375"},"pull-3375"),"] Sadly, we had to revert the ",(0,l.kt)("inlineCode",{parentName:"li"},"TICKF")," optimizations. There was a regression we do not yet understand."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3377"},"pull-3377"),"] Fix cabal warnings."),(0,l.kt)("li",{parentName:"ul"},"[",(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3383"},"pull-3383"),"] Fix multi-asset test.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/decc8fa8.03de18e2.js b/assets/js/decc8fa8.03de18e2.js new file mode 100644 index 00000000000..62ddc3841fa --- /dev/null +++ b/assets/js/decc8fa8.03de18e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[57918],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(a),d=n,m=h["".concat(s,".").concat(d)]||h[d]||c[d]||i;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},43654:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-12-01-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-12-01-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-01-hydra.md",source:"@site/blog/2023-12-01-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-12-01T00:00:00.000Z",formattedDate:"December 1, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.865,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-12-01-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-12-04-performance-and-tracing"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-29-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],u={toc:p},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team conducted a packed Monthly Review meeting,\nfeaturing demonstrations and the preparation of the monthly report. They\naddressed flakiness in tests and enhanced the logs json schema,\nimproving overall test reliability. Additionally, the team successfully\nbuilt MacOS ARM64 (",(0,n.kt)("inlineCode",{parentName:"p"},"aarch64-darwin"),") binaries in CI, expanding platform\nsupport. They further improved the network configuration by detecting\nincompatible persisted states, contributing to overall system\nrobustness. Finally, the team released version 0.14.0, highlighting\ntheir commitment to delivering regular updates and improvements."),(0,n.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly Review\n",(0,n.kt)("a",{parentName:"li",href:"https://drive.google.com/file/d/1-iv8IveUzA2KrJV_Kqrgx4ts05Ow0zjM"},"meeting"),"\npacked with demonstrations and prepared monthly report\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1189"},"#","1189")),(0,n.kt)("li",{parentName:"ul"},"Fixed several flaky tests and improved the logs json schema\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1188"},"#","1188"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1190"},"#","1190"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1192"},"#","1192")),(0,n.kt)("li",{parentName:"ul"},"Built MacOS ARM64 (",(0,n.kt)("inlineCode",{parentName:"li"},"aarch64-darwin"),") binaries in CI\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1182"},"#","1182")),(0,n.kt)("li",{parentName:"ul"},"Improved network configuration by detecting incompatible persisted\nstates ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1174"},"#","1174")),(0,n.kt)("li",{parentName:"ul"},"Released version 0.14.0")),(0,n.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Start work on incremental decommit"),(0,n.kt)("li",{parentName:"ul"},"Continue shepherding contributed PRs to completion"),(0,n.kt)("li",{parentName:"ul"},"Finish stateless-observation work"),(0,n.kt)("li",{parentName:"ul"},"Open a head on a Conway network")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dee5d2d9.044804a9.js b/assets/js/dee5d2d9.044804a9.js new file mode 100644 index 00000000000..6c4895b0b91 --- /dev/null +++ b/assets/js/dee5d2d9.044804a9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[52560],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>k});var r=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function i(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?a(Object(o),!0).forEach((function(t){n(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):a(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function s(e,t){if(null==e)return{};var o,r,n=function(e,t){if(null==e)return{};var o,r,n={},a=Object.keys(e);for(r=0;r<a.length;r++)o=a[r],t.indexOf(o)>=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)o=a[r],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var p=r.createContext({}),l=function(e){var t=r.useContext(p),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(o),h=n,k=c["".concat(p,".").concat(h)]||c[h]||d[h]||a;return o?r.createElement(k,i(i({ref:t},u),{},{components:o})):r.createElement(k,i({ref:t},u))}));function k(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:n,i[1]=s;for(var l=2;l<a;l++)i[l]=o[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,o)}h.displayName="MDXCreateElement"},46159:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=o(87462),n=(o(67294),o(3905));const a={title:"Network Team Update",slug:"2023-08-18-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-08-18-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-network.md",source:"@site/blog/2023-08-18-network.md",title:"Network Team Update",description:"High-level overview of sprint 42",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.09,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-08-18-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-18-ledger"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-18-sre"}},p={authorsImageUrls:[void 0]},l=[{value:"High-level overview of sprint 42",id:"high-level-overview-of-sprint-42",level:2},{value:"Eclipse Evasion",id:"eclipse-evasion",level:3},{value:"CDDL specs for protocol codecs",id:"cddl-specs-for-protocol-codecs",level:3},{value:"Ouroboros-Network-Framework API changes",id:"ouroboros-network-framework-api-changes",level:3},{value:"Nix setup (CI)",id:"nix-setup-ci",level:3},{value:"Other contributions",id:"other-contributions",level:2},{value:"Cardano Network Service Assurance",id:"cardano-network-service-assurance",level:3},{value:"Galois Review",id:"galois-review",level:3},{value:"CI",id:"ci",level:3},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3}],u={toc:l},c="wrapper";function d(e){let{components:t,...o}=e;return(0,n.kt)(c,(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-42"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+42%22"},"sprint 42")),(0,n.kt)("h3",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,n.kt)("p",null,"We merged and released a new version of the ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," package (version\n",(0,n.kt)("inlineCode",{parentName:"p"},"0.9.0.0"),") which includes ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3886"},"big ledger peers feature"),".\nThis is the primary peer selection mechanism to defend against eclipses. We\nalso prepared a PR to updated ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/165"},(0,n.kt)("inlineCode",{parentName:"a"},"ouroboros-cosnensus")),"\nand ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ekg-forward/pull/30"},(0,n.kt)("inlineCode",{parentName:"a"},"ekg-forward"))," packages."),(0,n.kt)("h3",{id:"cddl-specs-for-protocol-codecs"},"CDDL specs for protocol codecs"),(0,n.kt)("p",null,"We made the ",(0,n.kt)("inlineCode",{parentName:"p"},"cddl")," spec for network codec more inline with the implementation\nwhich is highly polymorphic. ",(0,n.kt)("inlineCode",{parentName:"p"},"cddl")," doesn't have the notion of polymorphism,\nbut has ",(0,n.kt)("inlineCode",{parentName:"p"},"any")," which can generate any valid cbor term. We matched it with an\n",(0,n.kt)("inlineCode",{parentName:"p"},"Any")," type on the Haskell side and made all remaining tests & specs use it.\nThis simplified the specifications and made it easier to understand which parts\nare defined in the spec, and which parts are left unspecified. See\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4595"},"ouroboros-network#4595"),"."),(0,n.kt)("h3",{id:"ouroboros-network-framework-api-changes"},"Ouroboros-Network-Framework API changes"),(0,n.kt)("p",null,"We also released ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network-framework")," and other network components.\nThe ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network-framework")," package contains a redesign of API exposed to\n",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),". We consolidated, cleaned it and made it easier to\nextend in the future if there will be new arguments that need to be passed to\nmini-protocol initiator and responders which comes from the low-level network\nlayer."),(0,n.kt)("h3",{id:"nix-setup-ci"},"Nix setup (CI)"),(0,n.kt)("p",null,"We also made a major review of our ",(0,n.kt)("inlineCode",{parentName:"p"},"nix")," setup. With help from our DevX team\nwe ended up with a clean ",(0,n.kt)("inlineCode",{parentName:"p"},"flake.nix")," file which can:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"compile & test the code on ",(0,n.kt)("inlineCode",{parentName:"li"},"x86_64-linux"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"x86_64-darwin")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"aarch64-darwin")),(0,n.kt)("li",{parentName:"ul"},"cross-compile to ",(0,n.kt)("inlineCode",{parentName:"li"},"Windows")," on ",(0,n.kt)("inlineCode",{parentName:"li"},"x86_64-linux")," ")),(0,n.kt)("p",null,"And provides a shell which contains all the build tools, including ",(0,n.kt)("inlineCode",{parentName:"p"},"ghc-9.6"),",\n",(0,n.kt)("inlineCode",{parentName:"p"},"hls"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"cddl"),", and more. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4640"},"ouroboros-network#4640"),",\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4643"},"ouroboros-network#4643"),"."),(0,n.kt)("h2",{id:"other-contributions"},"Other contributions"),(0,n.kt)("h3",{id:"cardano-network-service-assurance"},"Cardano Network Service Assurance"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The work and writeup in finishing up the CNSA, first stage (first\ncontract)."),(0,n.kt)("li",{parentName:"ul"},"Getting Sam Cowger (Galois Inc) up to speed."),(0,n.kt)("li",{parentName:"ul"},"The IOG Networking team carried a reivew of CNSA project progress: a limitted\ncode & design review.")),(0,n.kt)("h3",{id:"galois-review"},"Galois Review"),(0,n.kt)("p",null,"Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3832"},"ouroboros-network#3832"),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3834"},"ouroboros-network#3834"),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3835"},"ouroboros-network#3835"),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/3836"},"ouroboros-network#3836"),";")),(0,n.kt)("p",null,"scoping, requirements, and getting started."),(0,n.kt)("h3",{id:"ci"},"CI"),(0,n.kt)("p",null,"We added a nightly run for GitHub actions and made the GitHub actions test be\nexecuted with extra concurrency ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4637"},"ouroboros-network#4637"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4649"},"ouroboros-network#4649"),"."),(0,n.kt)("p",null,"We also added GitHub's dependabot ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4650"},"ouroboros-network#4650"),"."),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We settled on implementation design of bootstrap peers which is being\nimplemented, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4615"},"ouroboros-network#4615"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/df778edc.6398e671.js b/assets/js/df778edc.6398e671.js new file mode 100644 index 00000000000..0ab0f4ffb6f --- /dev/null +++ b/assets/js/df778edc.6398e671.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79036],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>d});var a=o(67294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function i(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?r(Object(o),!0).forEach((function(t){n(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):r(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function l(e,t){if(null==e)return{};var o,a,n=function(e,t){if(null==e)return{};var o,a,n={},r=Object.keys(e);for(a=0;a<r.length;a++)o=r[a],t.indexOf(o)>=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)o=r[a],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",k={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,r=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(o),c=n,d=m["".concat(p,".").concat(c)]||m[c]||k[c]||r;return o?a.createElement(d,i(i({ref:t},u),{},{components:o})):a.createElement(d,i({ref:t},u))}));function d(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=o.length,i=new Array(r);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<r;s++)i[s]=o[s];return a.createElement.apply(null,i)}return a.createElement.apply(null,o)}c.displayName="MDXCreateElement"},65687:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>k,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var a=o(87462),n=(o(67294),o(3905));const r={title:"Network Team Update",slug:"2023-04-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-28-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-28-network.md",source:"@site/blog/2023-04-28-network.md",title:"Network Team Update",description:"High level summary",date:"2023-04-28T00:00:00.000Z",formattedDate:"April 28, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:1.21,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-04-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-28-goedel"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-27-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Detailed log",id:"detailed-log",level:2},{value:"Ouroboros-Network",id:"ouroboros-network",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"Typed Protocols",id:"typed-protocols",level:3}],u={toc:s},m="wrapper";function k(e){let{components:t,...o}=e;return(0,n.kt)(m,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The networking team has released the following packages to ",(0,n.kt)("inlineCode",{parentName:"p"},"Hackage"),":"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/io-classes"},(0,n.kt)("inlineCode",{parentName:"a"},"io-classes")),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/io-classes-mtl"},(0,n.kt)("inlineCode",{parentName:"a"},"io-classes-mtl"))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/io-sim"},(0,n.kt)("inlineCode",{parentName:"a"},"io-sim")),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/strict-stm"},(0,n.kt)("inlineCode",{parentName:"a"},"strict-stm")),","),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/strict-mvar"},(0,n.kt)("inlineCode",{parentName:"a"},"strict-mvar")))),(0,n.kt)("p",null,"We published an announcement ",(0,n.kt)("a",{parentName:"p",href:"https://engineering.iog.io/2023-04-14-io-sim-annoucement"},"blog post"),". We made progress\nalso on another blog post which will describes the design of the P2P networking\nlayer."),(0,n.kt)("p",null,"After moving ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," to its own repository, we made\n",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," compatible with ",(0,n.kt)("inlineCode",{parentName:"p"},"GHC")," ",(0,n.kt)("inlineCode",{parentName:"p"},"9.4")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"9.6"),"."),(0,n.kt)("p",null,"We made ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-client")," library independent of\n",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-diffusion"),"."),(0,n.kt)("p",null,"We prepared release of network packages for ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-node-8.0"),"."),(0,n.kt)("h2",{id:"detailed-log"},"Detailed log"),(0,n.kt)("h3",{id:"ouroboros-network"},"Ouroboros-Network"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Compatibility with ",(0,n.kt)("inlineCode",{parentName:"li"},"io-classes-1.1.0.0"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4281"},"ouroboros-network#4281"),"."),(0,n.kt)("li",{parentName:"ul"},"Compatibility with ",(0,n.kt)("inlineCode",{parentName:"li"},"GHC")," ",(0,n.kt)("inlineCode",{parentName:"li"},"9.4")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"9.6"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4527"},"ouroboros-network#4527"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"cardano-client")," independent of ",(0,n.kt)("inlineCode",{parentName:"li"},"ouroboros-cosnensus-diffusion"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4526"},"ouroboros-network#4526"),"."),(0,n.kt)("li",{parentName:"ul"},"Release new versions of packages for ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node-8.0"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4532"},"ouroboros-network#4532"),"."),(0,n.kt)("li",{parentName:"ul"},"Galois Inc, has been making progress towards merging ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"ouroboros-network#4256"),".")),(0,n.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"io-classes-1.0.0.0"),", and following up releases: ",(0,n.kt)("inlineCode",{parentName:"li"},"1.0.0.1")," (",(0,n.kt)("inlineCode",{parentName:"li"},"ghc-9.6"),"\nsupport), ",(0,n.kt)("inlineCode",{parentName:"li"},"1.1.0.0")," (documentation fix)."),(0,n.kt)("li",{parentName:"ul"},"Fixed timeouts and delays in ",(0,n.kt)("inlineCode",{parentName:"li"},"io-sim")," in a series of PRs: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/81"},"io-sim#81"),",\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/82"},"io-sim#82"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/86"},"io-sim#86"),", ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/87"},"io-sim#87"),"."),(0,n.kt)("li",{parentName:"ul"},"Renamed a module: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/88"},"io-sim#88"),"."),(0,n.kt)("li",{parentName:"ul"},"Fixed a failing ",(0,n.kt)("inlineCode",{parentName:"li"},"registerDelayCancellable")," test: ","[io-sim#80]","."),(0,n.kt)("li",{parentName:"ul"},"Use GitHub merge queue in ",(0,n.kt)("inlineCode",{parentName:"li"},"io-sim")," repository."),(0,n.kt)("li",{parentName:"ul"},"CI: download ",(0,n.kt)("inlineCode",{parentName:"li"},"stylish-haskell"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/83"},"io-sim#83"),".")),(0,n.kt)("h3",{id:"typed-protocols"},"Typed Protocols"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released ",(0,n.kt)("inlineCode",{parentName:"li"},"typed-protocols-0.1.0.4")," which support ",(0,n.kt)("inlineCode",{parentName:"li"},"io-classes-1.1.0.0"),":\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages/pull/227"},"typed-protocols#227"),"."),(0,n.kt)("li",{parentName:"ul"},"Use GitHub merge queue in ",(0,n.kt)("inlineCode",{parentName:"li"},"typed-protocols"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/30"},"typed-protocols#30"),"."),(0,n.kt)("li",{parentName:"ul"},"CI: download ",(0,n.kt)("inlineCode",{parentName:"li"},"stylish-haskell"),": ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/typed-protocols/pull/29"},"typed-protocols#29"),".")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dfd49ee8.8d5945b5.js b/assets/js/dfd49ee8.8d5945b5.js new file mode 100644 index 00000000000..5ae127b00d1 --- /dev/null +++ b/assets/js/dfd49ee8.8d5945b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[60247],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),m=s(r),d=a,f=m["".concat(l,".").concat(d)]||m[d]||u[d]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:a,i[1]=c;for(var s=2;s<o;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},72396:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & Tracing Team Update",slug:"2022-10-28-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,c={permalink:"/cardano-updates/2022-10-28-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-performance-and-tracing.md",source:"@site/blog/2022-10-28-performance-and-tracing.md",title:"Performance & Tracing Team Update",description:"High level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.155,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & Tracing Team Update",slug:"2022-10-28-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-10-28-network"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2022-08-12-sre"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Executive summary",id:"executive-summary",level:2}],p={toc:s},m="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline."),(0,a.kt)("p",null,"On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario."),(0,a.kt)("h2",{id:"executive-summary"},"Executive summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale."),(0,a.kt)("li",{parentName:"ul"},"The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment."),(0,a.kt)("li",{parentName:"ul"},"The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dff1c289.c8e36228.js b/assets/js/dff1c289.c8e36228.js new file mode 100644 index 00000000000..5e954678acc --- /dev/null +++ b/assets/js/dff1c289.c8e36228.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[3792],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>v});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),d=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=d(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=d(n),m=o,v=p["".concat(l,".").concat(m)]||p[m]||u[m]||a;return n?r.createElement(v,s(s({ref:t},c),{},{components:n})):r.createElement(v,s({ref:t},c))}));function v(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:o,s[1]=i;for(var d=2;d<a;d++)s[d]=n[d];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},30089:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var r=n(87462),o=(n(67294),n(3905));const a={sidebar_position:1},s="Manage Docs Versions",i={unversionedId:"tutorial-extras/manage-docs-versions",id:"tutorial-extras/manage-docs-versions",title:"Manage Docs Versions",description:"Docusaurus can manage multiple versions of your docs.",source:"@site/docs/tutorial-extras/manage-docs-versions.md",sourceDirName:"tutorial-extras",slug:"/tutorial-extras/manage-docs-versions",permalink:"/cardano-updates/docs/tutorial-extras/manage-docs-versions",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"defaultSidebar",previous:{title:"Tutorial - Extras",permalink:"/cardano-updates/docs/category/tutorial---extras"},next:{title:"Translate your site",permalink:"/cardano-updates/docs/tutorial-extras/translate-your-site"}},l={},d=[{value:"Create a docs version",id:"create-a-docs-version",level:2},{value:"Add a Version Dropdown",id:"add-a-version-dropdown",level:2},{value:"Update an existing version",id:"update-an-existing-version",level:2}],c={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,o.kt)(p,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"manage-docs-versions"},"Manage Docs Versions"),(0,o.kt)("p",null,"Docusaurus can manage multiple versions of your docs."),(0,o.kt)("h2",{id:"create-a-docs-version"},"Create a docs version"),(0,o.kt)("p",null,"Release a version 1.0 of your project:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"npm run docusaurus docs:version 1.0\n")),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"docs")," folder is copied into ",(0,o.kt)("inlineCode",{parentName:"p"},"versioned_docs/version-1.0")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"versions.json")," is created."),(0,o.kt)("p",null,"Your docs now have 2 versions:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"1.0")," at ",(0,o.kt)("inlineCode",{parentName:"li"},"http://localhost:3000/docs/")," for the version 1.0 docs"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"current")," at ",(0,o.kt)("inlineCode",{parentName:"li"},"http://localhost:3000/docs/next/")," for the ",(0,o.kt)("strong",{parentName:"li"},"upcoming, unreleased docs"))),(0,o.kt)("h2",{id:"add-a-version-dropdown"},"Add a Version Dropdown"),(0,o.kt)("p",null,"To navigate seamlessly across versions, add a version dropdown."),(0,o.kt)("p",null,"Modify the ",(0,o.kt)("inlineCode",{parentName:"p"},"docusaurus.config.js")," file:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config.js"',title:'"docusaurus.config.js"'},"module.exports = {\n themeConfig: {\n navbar: {\n items: [\n // highlight-start\n {\n type: 'docsVersionDropdown',\n },\n // highlight-end\n ],\n },\n },\n};\n")),(0,o.kt)("p",null,"The docs version dropdown appears in your navbar:"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Docs Version Dropdown",src:n(76868).Z,width:"370",height:"302"})),(0,o.kt)("h2",{id:"update-an-existing-version"},"Update an existing version"),(0,o.kt)("p",null,"It is possible to edit versioned docs in their respective folder:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"versioned_docs/version-1.0/hello.md")," updates ",(0,o.kt)("inlineCode",{parentName:"li"},"http://localhost:3000/docs/hello")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"docs/hello.md")," updates ",(0,o.kt)("inlineCode",{parentName:"li"},"http://localhost:3000/docs/next/hello"))))}u.isMDXComponent=!0},76868:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/docsVersionDropdown-35e13cbe46c9923327f30a76a90bff3b.png"}}]); \ No newline at end of file diff --git a/assets/js/dff84d74.7af6b65c.js b/assets/js/dff84d74.7af6b65c.js new file mode 100644 index 00000000000..7d2bd3f5e00 --- /dev/null +++ b/assets/js/dff84d74.7af6b65c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65421],{3905:(e,t,r)=>{r.d(t,{Zo:()=>h,kt:()=>d});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},h=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(r),c=i,d=u["".concat(p,".").concat(c)]||u[c]||m[c]||a;return r?n.createElement(d,o(o({ref:t},h),{},{components:r})):n.createElement(d,o({ref:t},h))}));function d(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var s=2;s<a;s++)o[s]=r[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}c.displayName="MDXCreateElement"},812:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(87462),i=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-11-04-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},o="High level overview",l={permalink:"/cardano-updates/2022-11-04-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-mithril.md",source:"@site/blog/2022-11-04-mithril.md",title:"Mithril Team Update",description:"This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.",date:"2022-11-04T00:00:00.000Z",formattedDate:"November 4, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.015,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Mithril Team Update",slug:"2022-11-04-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-04-hydra"},nextItem:{title:"Open-Source Team",permalink:"/cardano-updates/2022-10-31-open-source"}},p={authorsImageUrls:[void 0]},s=[],h={toc:s},u="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(u,(0,n.Z)({},h,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates."),(0,i.kt)("h1",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"We have been moving forward on the implementation of the release process ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/500"},"#500"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Setup of the new hosted environments for ",(0,i.kt)("inlineCode",{parentName:"li"},"testing-preview"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"pre-release-preview")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"release-preprod")," with their terraform and GitHub environments ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/542"},"#542")),(0,i.kt)("li",{parentName:"ul"},"Adapted the CI workflows to work with the new release process ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/543"},"#543")),(0,i.kt)("li",{parentName:"ul"},"Publication of an ",(0,i.kt)("a",{parentName:"li",href:"https://mithril.network/doc/adr/3"},"ADR3")),(0,i.kt)("li",{parentName:"ul"},"Publication of a ",(0,i.kt)("a",{parentName:"li",href:"https://mithril.network/doc/dev-blog/2022/10/28/updated-environments"},"dev blog post")," about Mithril networks evolution "),(0,i.kt)("li",{parentName:"ul"},"Releasing our first Mithril distribution ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2244.0"},"2244.0")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the API versioning mechanism ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/565"},"#565")),(0,i.kt)("li",{parentName:"ul"},"Worked on the implementation of the stores migration process for the signer and aggregator nodes ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/562"},"#562")),(0,i.kt)("li",{parentName:"ul"},"Prepared a Mithril ",(0,i.kt)("inlineCode",{parentName:"li"},"devnet")," video demo ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/526"},"#526")),(0,i.kt)("li",{parentName:"ul"},"Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/484"},"#484"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e06746c7.a59320ce.js b/assets/js/e06746c7.a59320ce.js new file mode 100644 index 00000000000..baa4037385e --- /dev/null +++ b/assets/js/e06746c7.a59320ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64410],{81981:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/consensus/page/2","page":2,"postsPerPage":5,"totalPages":7,"totalCount":32,"previousPage":"/cardano-updates/tags/consensus","nextPage":"/cardano-updates/tags/consensus/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/e0a90ddc.a29272eb.js b/assets/js/e0a90ddc.a29272eb.js new file mode 100644 index 00000000000..ca64cfd5e40 --- /dev/null +++ b/assets/js/e0a90ddc.a29272eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24891],{44348:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/consensus","page":1,"postsPerPage":5,"totalPages":7,"totalCount":32,"nextPage":"/cardano-updates/tags/consensus/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/e0b45b46.004f9296.js b/assets/js/e0b45b46.004f9296.js new file mode 100644 index 00000000000..e4939ff5cab --- /dev/null +++ b/assets/js/e0b45b46.004f9296.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55135],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){i(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,i=function(e,t){if(null==e)return{};var a,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)a=r[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=u(a),s=i,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||r;return a?n.createElement(h,o(o({ref:t},d),{},{components:a})):n.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,o=new Array(r);o[0]=s;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var u=2;u<r;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},23826:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var n=a(87462),i=(a(67294),a(3905));const r={title:"Node API & CLI Team Update",slug:"2023-09-12-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-09-12-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-12-node-cli-api.md",source:"@site/blog/2023-09-12-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-09-12T00:00:00.000Z",formattedDate:"September 12, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:2.605,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-09-12-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-09-14-db-sync"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-08-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],d={toc:u},c="wrapper";function m(e){let{components:t,...a}=e;return(0,i.kt)(c,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"2023-08-30---2023-09-12"},"2023-08-30 - 2023-09-12"),(0,i.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,i.kt)("p",null,"Release of ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.3.0-pre"},"Cardano-node 8.3.0-pre")," for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs.\nThis release completes ",(0,i.kt)("a",{parentName:"p",href:"https://sancho.network/get-started#sanchonet-feature-rollout"},"phase 2 of SanchoNet feature roll out plan")),(0,i.kt)("p",null,"CLI continues on its migration to a era-based top-level commands. This sprint we moved ",(0,i.kt)("inlineCode",{parentName:"p"},"text-view"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"key"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"query"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"genesis"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"node"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"address")," into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints."),(0,i.kt)("p",null,"We are moving the ",(0,i.kt)("inlineCode",{parentName:"p"},"drep delegation-certificate")," to the stake-address command so delegating to a drep is done via ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-addres vote-delegation-certificate"),". Along the same lines, we are renaming\n",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address delegation-certificate")," (delagating to a stake pool) to ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address stake-delegation-certificate")," to distinguish between stake delegation to a pool and votes delegation to a drep. On top\nof that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly ",(0,i.kt)("inlineCode",{parentName:"p"},"stake-address stake-and-vote-delegation-certificate"),". Note that change is not included on 8.3 but will come on 8.4.\nRemoving ",(0,i.kt)("inlineCode",{parentName:"p"},"--conway-era")," flag from all the ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction")," sub-commands."),(0,i.kt)("p",null,"Update description fields in delegation certificates from ",(0,i.kt)("inlineCode",{parentName:"p"},"Stake Address Delegation Certificate")," to respectively (Conway onwards):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stake Delegation Certificate")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Vote Delegation Certificate")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stake and Vote Delegation Certificate"))),(0,i.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/261"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address vote-delegation-certificate")," command")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/257"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address stake-and-vote-delegation-certificate")," command")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/260"},"Change ",(0,i.kt)("inlineCode",{parentName:"a"},"TreasuryWithdrawalCmd")," to a record")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/256"},"Simplify ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address stake-delegation-certificate")," command across eras")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/254"},"Remove ",(0,i.kt)("inlineCode",{parentName:"a"},"EraBased")," prefix and add ",(0,i.kt)("inlineCode",{parentName:"a"},"Cmd")," suffix")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/250"},"#221 Update description fields on delegation certificates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/249"},"Update error message for eras mismatch between node and cli")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/248"},"Era based ",(0,i.kt)("inlineCode",{parentName:"a"},"address")," commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/246"},"Consistent naming for ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-pool")," command related types, functions and modules")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/245"},"Disable ",(0,i.kt)("inlineCode",{parentName:"a"},"redundant-constraints")," warning only on ",(0,i.kt)("inlineCode",{parentName:"a"},"ghc-8.10.7"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/244"},"Remove ",(0,i.kt)("inlineCode",{parentName:"a"},"EraBased")," prefix from era-based commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/243"},"Rename ",(0,i.kt)("inlineCode",{parentName:"a"},"delegation-certificate")," to ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-delegation-certificate")," only in era-based command structure")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/242"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"node")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/241"},"Era-based ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address")," command group")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/240"},"Remove duplicate instances and add new ",(0,i.kt)("inlineCode",{parentName:"a"},"FeatureInEra ShelleyBasedEra")," instance")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/239"},"Remove ",(0,i.kt)("inlineCode",{parentName:"a"},"EraBased")," prefix from errors")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/238"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"text-view")," run commands implementation into era-based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/237"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"key")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/236"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"query")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/235"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"genesis")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/234"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"pool")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/233"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"stake-address")," run commands implementation into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/232"},"Move ",(0,i.kt)("inlineCode",{parentName:"a"},"address")," run command implementation into era-based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/231"},"Delete legacy ",(0,i.kt)("inlineCode",{parentName:"a"},"conway governance")," commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/230"},"Era sensitive transaction run commands")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/229"},"Move transaction command code into era based")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/228"},"Fix query ",(0,i.kt)("inlineCode",{parentName:"a"},"key-period-info"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/227"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"hprop_golden_shelleyStakeAddressRegistrationCertificateWithBuildRaw")," test")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/225"},"Prefix complex delegation certificate option"))),(0,i.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/233"},"Fix test constraints functions")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/231"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"caseShelleyToBabbageAndConwayEraOnwards")," function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/230"},"Delete deprecated functions and types")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/228"},"Release 8.19.0.0")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/226"},(0,i.kt)("inlineCode",{parentName:"a"},"FeatureInEra")," instances for ",(0,i.kt)("inlineCode",{parentName:"a"},"CardanoEra")," and ",(0,i.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/225"},"New ",(0,i.kt)("inlineCode",{parentName:"a"},"mapSomeAddressVerification")," key function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/224"},"Fix type signature of ",(0,i.kt)("inlineCode",{parentName:"a"},"queryGenesisParameters")," so that it can be queried in any era")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/222"},"Release 8.18.0.0")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/221"},"Fix exception when executing drep queries"))),(0,i.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.3.0-pre"},"Cardano-node 8.3.0-pre")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5460"},"Fix deadlock issue with stdout tracer in tx-generator")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5453"},"nix: workbench tracing configuration"))),(0,i.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,i.kt)("h3",{id:"docs"},"docs"),(0,i.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e135bd86.35a0a708.js b/assets/js/e135bd86.35a0a708.js new file mode 100644 index 00000000000..227e9713986 --- /dev/null +++ b/assets/js/e135bd86.35a0a708.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[69791],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,d=c["".concat(l,".").concat(m)]||c[m]||h[m]||a;return n?o.createElement(d,s(s({ref:t},u),{},{components:n})):o.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var p=2;p<a;p++)s[p]=n[p];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},96223:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2022-11-30-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-11-30-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-consensus.md",source:"@site/blog/2022-11-30-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2022-11-30T00:00:00.000Z",formattedDate:"November 30, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.4,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-11-30-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-12-01-system-test"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-30-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD prototype",id:"utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:3},{value:"CSJ prototype",id:"csj-prototype",level:3},{value:"New VRF and KES crypto integration",id:"new-vrf-and-kes-crypto-integration",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],u={toc:p},c="wrapper";function h(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the past two weeks, the consensus team merged improvements to the monadic\ncursor API that was needed to implement LMDB range reads, which is in turn\nrequired for the implementation of the UTxO HD feature. We added tables to\nseveral tests in for the UTxO HD feature, which increases our confidence in the\ncorrectness of the prototype. The mempool property tests are close to being\ncompleted. Also, we finished the LSM tree tuning algorithm."),(0,r.kt)("p",null,"On the Genesis front we started simplifying the BlockFetch logic with\nCSJ-specific workloads in mind. "),(0,r.kt)("p",null,"We are also documenting the Block Diffusion Pipelining feature, and added a\nhigh-level overview of consensus to the top level documentation of\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"."),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD prototype"),(0,r.kt)("p",null,"We merged the implementation of a monadic cursor API (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"#1"),")) which was\nneeded to solve a bug with LMDB range-reads. After this PR was merged, we focused on\nbridging the gap between the ",(0,r.kt)("inlineCode",{parentName:"p"},"lmdb-simple")," interface and consensus by facilitating\nusing ",(0,r.kt)("inlineCode",{parentName:"p"},"lmdb-simple"),"'s cursor API without ",(0,r.kt)("inlineCode",{parentName:"p"},"Serialise")," constraints (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/3"},"#3"),")."),(0,r.kt)("p",null,"We refactored the backing store property tests to use ",(0,r.kt)("inlineCode",{parentName:"p"},"quickcheck-lockstep"),"\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4081"},"#4081"),")."),(0,r.kt)("p",null,"We added tables to the mock ledger in the UTxO-HD feature branch\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4184"},"#4184"),"). Every test that used to run with ",(0,r.kt)("inlineCode",{parentName:"p"},"SimpleBlocks")," now uses\ntables. This will enable us to exercise the UTxO HD mempool integration by\nleveraging the existing mempool property-tests. The new state-machine\nproperty-tests are still needed for testing the parallel behaviour of the\nmempool."),(0,r.kt)("p",null,"Our work on the mempool state-machine tests revealed the need for improvements\nin the ",(0,r.kt)("inlineCode",{parentName:"p"},"quickcheck-state-machine")," library. Parallel testing assumed that the\nstate machine did not have access to mutable references. However, the mempool\ntests require the use of such mutable references for mocking the ledger\ninterface. As a result, our parallel tests were failing with rather obscure\nmessages. @Jasagredo submitted a pull request (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/stevana/quickcheck-state-machine/pull/12"},"#12"),") that allows for\nnew mutable references to be created at each run of the state machine."),(0,r.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,r.kt)("h3",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,r.kt)("p",null,"We finished the LSM Tree tuning algorithm. We are currently tidying up the code\nand gathering results (i.e., plots and their interpretation)."),(0,r.kt)("h3",{id:"csj-prototype"},"CSJ prototype"),(0,r.kt)("p",null,"We started simplifying the BlockFetch logic with CSJ-specific workloads in mind."),(0,r.kt)("h3",{id:"new-vrf-and-kes-crypto-integration"},"New VRF and KES crypto integration"),(0,r.kt)("p",null,"Started working on supporting new version of ",(0,r.kt)("inlineCode",{parentName:"p"},"StandardCrypto")," which uses compact\nKES and batched VRF (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4151"},"#4151"),")."),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,'We reviewed the existing state of the Block Diffusion Pipelining document. We\nare now working on the "Implementation" section (',(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4020"},"#4020"),")."),(0,r.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("p",null,"We cleared up our understanding of the error dynamics of forecasting\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4146"},"#4146")," and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4174"},"#4174"),")."),(0,r.kt)("p",null,"We submitted a pull request that adds an overview of consensus to the ",(0,r.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/ouroboros-network/"},"top level\ndocumentation")," of\nouroboros-network (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4197"},"#4197"),"). This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4197"},"https://github.com/input-output-hk/ouroboros-network/pull/4197")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e158fd47.041cd656.js b/assets/js/e158fd47.041cd656.js new file mode 100644 index 00000000000..dc22b924440 --- /dev/null +++ b/assets/js/e158fd47.041cd656.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88829],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),u=a,f=d["".concat(p,".").concat(u)]||d[u]||m[u]||o;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},64964:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(87462),a=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-03-31-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-31-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-goedel.md",source:"@site/blog/2023-03-31-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.455,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-03-31-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-31-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-31-hydra"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:s},d="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"This sprint the team has been working on final drafts of two papers\nfor internal review and planning next steps of analysis of consensus\ndesign refiniments."),(0,a.kt)("h2",{id:"details"},"Details"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Preparing final draft of DeltaQSD algebra paper for internal review")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Preparing final draft of verifying design refinements for\ndistributed system design for internal review")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Planning next phase of consensus design refinement analysis"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e1f21c3f.7f2072d9.js b/assets/js/e1f21c3f.7f2072d9.js new file mode 100644 index 00000000000..06916479788 --- /dev/null +++ b/assets/js/e1f21c3f.7f2072d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58680],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},l=Object.keys(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)a=l[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),s=u(a),d=r,h=s["".concat(p,".").concat(d)]||s[d]||m[d]||l;return a?n.createElement(h,o(o({ref:t},c),{},{components:a})):n.createElement(h,o({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[s]="string"==typeof e?e:r,o[1]=i;for(var u=2;u<l;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}d.displayName="MDXCreateElement"},32235:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const l={title:"Node API & CLI Team Update",slug:"2023-11-14-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-11-14-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-14-node-cli-api.md",source:"@site/blog/2023-11-14-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-11-14T00:00:00.000Z",formattedDate:"November 14, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.155,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-11-14-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-15-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-10-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},s="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(s,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-11-01---2023-11-14"},"2023-11-01 - 2023-11-14"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CARDANO-NODE"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.6.0-pre"},"Pre-release of Cardano Node 8.6.0-pre"))),(0,r.kt)("p",null,"CARDANO-CLI"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improve golden tests"),(0,r.kt)("li",{parentName:"ul"},"Clean-up of conway era commands")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/451"},"Replace usages of assertFileOccurences (6/6)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/448"},"Replace usages of assertFileOccurences (5/6)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/444"},"Replace usages of assertFileOccurences by usage of new functions \u2728 (4/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/443"},"put n shelley/byron key witnesses arguments in correct order")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/441"},"Replace usages of assertFileOccurences by comparisons with golden files (3/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/436"},"Replace usages of assertFileOccurences by comparisons with golden files (2/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/435"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-8.31.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/434"},"Remove remaining uses of ",(0,r.kt)("inlineCode",{parentName:"a"},"IsCardanoEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/432"},"Release 8.14.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/430"},"Upgrade cardano-api to 8.30")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/428"},"Command types for ",(0,r.kt)("inlineCode",{parentName:"a"},"node")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/427"},"Split governance ",(0,r.kt)("inlineCode",{parentName:"a"},"MIRTransferConstructor"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/426"},"Replace usages of assertFileOccurences by comparisons with golden files (1/n)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/425"},"Command argument types for ",(0,r.kt)("inlineCode",{parentName:"a"},"drep")," commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/421"},"Add golden test for ",(0,r.kt)("inlineCode",{parentName:"a"},"governance action create-no-confidence"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/419"},"Command arguments types for stake-pool commands"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/364"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.31.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/360"},"Use ledger presentation of multi-asset values directly. Lens to make this uniform over ",(0,r.kt)("inlineCode",{parentName:"a"},"ShelleyBasedEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/358"},"Protocol version change is not common to all versions anymore")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/355"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"ByronAndAllegraEraOnwards"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/354"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"IsCardanoEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"IsShelleyBasedEra")," contraints in GADT constructors with ",(0,r.kt)("inlineCode",{parentName:"a"},"Typeable"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/353"},"Modify foldBlocks to recurse on ledger events ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/352"},"Add generators for ",(0,r.kt)("inlineCode",{parentName:"a"},"EraBasedProtocolParametersUpdate"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/351"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.30.0.0")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.6.0-pre"},"Pre-release of Cardano Node 8.6.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5525"},"cardano-node: use ouroboros-network-protocols-0.5.2"))))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e2011657.8d35be8c.js b/assets/js/e2011657.8d35be8c.js new file mode 100644 index 00000000000..62362433519 --- /dev/null +++ b/assets/js/e2011657.8d35be8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[30849],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,c=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},51505:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-17-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-17-hydra.md",source:"@site/blog/2023-03-17-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-17T00:00:00.000Z",formattedDate:"March 17, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.015,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-17-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-17-crypto"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-17-ledger"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has continued work on the mainnet compatibility of the\nhydra-node. They added a golden test suite for ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts, added\nsome detection of ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," misconfiguration, established a limit of 100 ADA\nper commit and other smaller tasks to prepare for a mainnet beta release."),(0,n.kt)("p",null,"Next week there will be a small team workshop to push for demonstrating a Hydra\nHead on the Cardano mainnet, ideally just in time for the monthly review\nmeeting. See the hydra channels on the IOG Technical Community discord server\nfor details."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement a 100 ADA hard-coded commit limit in the hydra-node\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/763"},"#763")),(0,n.kt)("li",{parentName:"ul"},"Pay back funds to faucet after smoke-test run\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/773"},"#773")),(0,n.kt)("li",{parentName:"ul"},"Setup custom github runner for smoke-tests on mainnet\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/775"},"#775")),(0,n.kt)("li",{parentName:"ul"},"Created golden tests to assure the script hash stays the same between\nchanges ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/772"},"#772")),(0,n.kt)("li",{parentName:"ul"},"Removed hardcoded error codes in plutus scripts\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/768"},"#768")),(0,n.kt)("li",{parentName:"ul"},"Detect misconfiguration of a hydra-node given persistent state\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/767"},"#767")),(0,n.kt)("li",{parentName:"ul"},"Met with potential users for hydra-pay"),(0,n.kt)("li",{parentName:"ul"},"Prepared hydra workshop")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hydra monthly meeting"),(0,n.kt)("li",{parentName:"ul"},"Open a multi-party head on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e25ae581.b6c5260b.js b/assets/js/e25ae581.b6c5260b.js new file mode 100644 index 00000000000..a0269bb2301 --- /dev/null +++ b/assets/js/e25ae581.b6c5260b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1929],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(a),d=n,c=s["".concat(p,".").concat(d)]||s[d]||m[d]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},4890:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-06-23-hydra",authors:["ffakenz","pgrange"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-23-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-hydra.md",source:"@site/blog/2023-06-23-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.79,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Pascal Grange",title:"Hydra Software Engineer",url:"https://github.com/pgrange",imageURL:"https://github.com/pgrange.png",key:"pgrange"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-23-hydra",authors:["ffakenz","pgrange"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-23-goedel"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-23-network"}},p={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team shared progress updates during the monthly review\nmeeting (monthly report and video recording available soon) and started\nexperimenting on preview network with the new commit from external wallet\nfeature."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting, demonstrating ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/887"},"commit from external\nwallet")),(0,n.kt)("li",{parentName:"ul"},"Published regular ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/benchmarks/end-to-end-benchmarks"},"benchmarks for\nHydra")),(0,n.kt)("li",{parentName:"ul"},"Moved forward the journey for external commits using multiple script UTxOs\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"Changed the API to only put transaction id in snapshots, instead of the full\ntransactions ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/922"},"#922")," -> this\nis now evolved into fully addressing ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Fuel marking is now optional as one can now commit from an external wallet\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/924"},"#924")),(0,n.kt)("li",{parentName:"ul"},"Add flag option to display node version on tui\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/934"},"#934"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete external commits using multiple script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"New release 0.11.0"),(0,n.kt)("li",{parentName:"ul"},"Dirtroad solution of improved persistence performance ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/913"},"#913"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e2a7c340.17f426f9.js b/assets/js/e2a7c340.17f426f9.js new file mode 100644 index 00000000000..d6e7946c3a7 --- /dev/null +++ b/assets/js/e2a7c340.17f426f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48622],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=d(a),c=n,m=h["".concat(s,".").concat(c)]||h[c]||u[c]||o;return a?r.createElement(m,i(i({ref:t},p),{},{components:a})):r.createElement(m,i({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},36391:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-01-13-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-01-13-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-13-hydra.md",source:"@site/blog/2023-01-13-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-01-13T00:00:00.000Z",formattedDate:"January 13, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.56,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-01-13-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-01-14-db-sync"},nextItem:{title:"Node Release Team Update",permalink:"/cardano-updates/2023-01-13-release"}},s={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:d},h="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"Since last weekly update before christmas, the Hydra team worked on the\ntechnical specification, closed gaps in ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts, made the unique\n",(0,n.kt)("inlineCode",{parentName:"p"},"headId")," available to Hydra clients through the API, allow the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," to\nexplicitly synchronize from genesis (if configured), and fixed smaller log and\nbuild issues reported by new users."),(0,n.kt)("p",null,"Besides this, a retrospective ",(0,n.kt)("a",{parentName:"p",href:"https://cardanofoundation.org/en/news/hydra-head-protocol-an-open-source-solution-for-scalability/"},"blog\npost"),"\nwas published by Matthias Benkort (CF) on Hydra, summarizing our progress made\nin 2022 also an outlook where Hydra is headed for in 2023. Also, the team had\nsome first sessions on the voting project with Catalyst and the CF."),(0,n.kt)("p",null,"A full digest monthly digest for December 2022 can be found on the ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2022-12"},"hydra\nwebsite"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Had some first sessions on the voting project with Catalyst and CF"),(0,n.kt)("li",{parentName:"ul"},"Published retrospective ",(0,n.kt)("a",{parentName:"li",href:"https://cardanofoundation.org/en/news/hydra-head-protocol-an-open-source-solution-for-scalability/"},"blog\npost"),"\nby Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also\nan outlook where Hydra is headed for in 2023."),(0,n.kt)("li",{parentName:"ul"},"Worked on the LaTeX spec for HydraHeadV1, not final or published yet - ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/ch1bo/hydra-spec"},"latest\nversion in this repository"),"."),(0,n.kt)("li",{parentName:"ul"},"Add unique ",(0,n.kt)("inlineCode",{parentName:"li"},"headId")," to API and hence make it available to clients."),(0,n.kt)("li",{parentName:"ul"},"Allow ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")," to explicitly synchronize from genesis using ",(0,n.kt)("inlineCode",{parentName:"li"},"--start-chain-from 0"),"."),(0,n.kt)("li",{parentName:"ul"},"Closed gaps in ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-plutus")," scripts",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"bounded transaction validity (",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/adr/21/"},"ADR21"),")"),(0,n.kt)("li",{parentName:"ul"},"enforcing contract continuity via state token in output"))),(0,n.kt)("li",{parentName:"ul"},"Fixed JSON for some logs and smaller build issues reported by new users.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Reach out to have ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tutorial")," integrated."),(0,n.kt)("li",{parentName:"ul"},"Plan the next couple of months."),(0,n.kt)("li",{parentName:"ul"},"Complete checking reimbursing of commits in head validator."),(0,n.kt)("li",{parentName:"ul"},"Align plutus scripts to spec and simplify them (identified some simplifications)"),(0,n.kt)("li",{parentName:"ul"},"Improve mutation framework to be sure we fail tests for the right reasons"),(0,n.kt)("li",{parentName:"ul"},"Complete the spec except the open points (<5) and also discuss them with researchers.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e2c8baed.fe76b678.js b/assets/js/e2c8baed.fe76b678.js new file mode 100644 index 00000000000..7e4e0879cc3 --- /dev/null +++ b/assets/js/e2c8baed.fe76b678.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36721],{80615:a=>{a.exports=JSON.parse('{"label":"crypto","permalink":"/cardano-updates/tags/crypto","allTagsPath":"/cardano-updates/tags","count":18}')}}]); \ No newline at end of file diff --git a/assets/js/e3067ecd.64e66e32.js b/assets/js/e3067ecd.64e66e32.js new file mode 100644 index 00000000000..2c0edf93ff4 --- /dev/null +++ b/assets/js/e3067ecd.64e66e32.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[84599],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function u(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),h=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=h(e.components);return r.createElement(l.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,p=u(e,["components","mdxType","originalType","parentName"]),s=h(a),c=n,m=s["".concat(l,".").concat(c)]||s[c]||d[c]||i;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var u={};for(var l in t)hasOwnProperty.call(t,l)&&(u[l]=t[l]);u.originalType=e,u[s]="string"==typeof e?e:n,o[1]=u;for(var h=2;h<i;h++)o[h]=a[h];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},11113:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>u,toc:()=>h});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-09-22-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,u={permalink:"/cardano-updates/2023-09-22-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-22-hydra.md",source:"@site/blog/2023-09-22-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-22T00:00:00.000Z",formattedDate:"September 22, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.035,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-22-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-26-node-cli-api"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-09-22-performance-and-tracing"}},l={authorsImageUrls:[void 0]},h=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:h},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team conducted the monthly review meeting in\ncollaboration with Mithril, enhancing project coordination."),(0,n.kt)("p",null,"The team improved the gen-hydra-key node command for smoother usability\nand identified concrete steps to enhance network resiliency in feature\nitems ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188"),",\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1080"},"#1080"),", and\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/1079"},"#1079"),".\nAdditionally, they contributed the aiken-mode editor integration to the\naiken-lang organization, updated dependencies to utilize cardano-api\n8.20, and published the Hydra security advisory CVE-2023-42806 with a\nworkaround available for users."),(0,n.kt)("p",null,"These efforts demonstrate the team\\'s commitment to project improvement,\nsecurity, and open-source community collaboration."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Conducted the monthly review meeting together with Mithril"),(0,n.kt)("li",{parentName:"ul"},"Improved gen-hydra-key node command\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1077"},"#1077")),(0,n.kt)("li",{parentName:"ul"},"Established a clear plan to improve resiliency of network and manifested\nfeature items ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188"),",\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1080"},"#1080")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1079"},"#1079")),(0,n.kt)("li",{parentName:"ul"},"Moved ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/aiken-lang/aiken-mode"},"aiken-mode")," (created by SN)\nto aiken-lang organization"),(0,n.kt)("li",{parentName:"ul"},"Updated dependencies to using cardano-api 8.20\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1075"},"#1075")),(0,n.kt)("li",{parentName:"ul"},"Published security advisory\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq"},"CVE-2023-42806"),"\n(workaround available)")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Write-up the monthly report for September"),(0,n.kt)("li",{parentName:"ul"},'Finish "network resilience to disconnects"\n',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"Finish kupo integration with hydra\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1078"},"#1078")),(0,n.kt)("li",{parentName:"ul"},"Discuss and decide on using aiken or not"),(0,n.kt)("li",{parentName:"ul"},"Address the published security advisory\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/security/advisories/GHSA-gr36-mc6v-72qq"},"CVE-2023-42806"),"\n(to not require workaround)"),(0,n.kt)("li",{parentName:"ul"},"Ideally, release 0.13.0")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e356bfd0.a7639fa4.js b/assets/js/e356bfd0.a7639fa4.js new file mode 100644 index 00000000000..7bb7e69a5f9 --- /dev/null +++ b/assets/js/e356bfd0.a7639fa4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90083],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(r),h=a,m=u["".concat(s,".").concat(h)]||u[h]||d[h]||o;return r?n.createElement(m,i(i({ref:t},c),{},{components:r})):n.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},96391:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2022-10-27-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-27-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-27-crypto.md",source:"@site/blog/2022-10-27-crypto.md",title:"Crypto Team Update",description:"High level overview",date:"2022-10-27T00:00:00.000Z",formattedDate:"October 27, 2022",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.095,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2022-10-27-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2022-08-12-sre"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-21-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"SECP built-ins",id:"secp-built-ins",level:3},{value:"KES agent",id:"kes-agent",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to\nmeeting the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-base/issues/315"},"acceptance criteria")," in cardano-base,\nwhich lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and\nwe are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution,\nbut also progressing on the implementation."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"secp-built-ins"},"SECP built-ins"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"(missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/313"},"PR 313")),(0,a.kt)("li",{parentName:"ul"},"CIP-0049 was addressed in the editors meeting, and ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/250"},"PR 250")," was merged"),(0,a.kt)("li",{parentName:"ul"},"The unit-tests ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/320"},"PR 320")," is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.")),(0,a.kt)("h3",{id:"kes-agent"},"KES agent"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them."),(0,a.kt)("li",{parentName:"ul"},"We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e38c8545.52bffd2c.js b/assets/js/e38c8545.52bffd2c.js new file mode 100644 index 00000000000..ef2f24f40e3 --- /dev/null +++ b/assets/js/e38c8545.52bffd2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51092],{50047:a=>{a.exports=JSON.parse('{"label":"system-test","permalink":"/cardano-updates/tags/system-test","allTagsPath":"/cardano-updates/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/e3c3ef1c.61c2b7ed.js b/assets/js/e3c3ef1c.61c2b7ed.js new file mode 100644 index 00000000000..d05611f7ceb --- /dev/null +++ b/assets/js/e3c3ef1c.61c2b7ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[9107],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),s=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),h=s(a),m=n,d=h["".concat(l,".").concat(m)]||h[m]||c[m]||o;return a?r.createElement(d,i(i({ref:t},u),{},{components:a})):r.createElement(d,i({ref:t},u))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[h]="string"==typeof e?e:n,i[1]=p;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},4394:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2022-11-04-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2022-11-04-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-04-hydra.md",source:"@site/blog/2022-11-04-hydra.md",title:"Hydra Team Update",description:"High level summary",date:"2022-11-04T00:00:00.000Z",formattedDate:"November 4, 2022",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.935,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2022-11-04-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-11-11-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-11-04-mithril"}},l={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],u={toc:s},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun ",(0,n.kt)("inlineCode",{parentName:"p"},"preview")," network, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},"0.8.0 release notes"),". They also completed implementation of ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/adr/18/"},"ADR18")," and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-poc/issues/195#issuecomment-1300503557"},"#195")," and alignment of the specification document with auditors."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete and merge ADR18 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/579"},"#579")),(0,n.kt)("li",{parentName:"ul"},"Re-deploy hydra scripts to respun ",(0,n.kt)("inlineCode",{parentName:"li"},"preview")," network, see ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/releases/tag/0.8.0"},"0.8.0 release notes")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/595"},"#595")),(0,n.kt)("li",{parentName:"ul"},"Have first gap of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/452"},"#452")," in review."),(0,n.kt)("li",{parentName:"ul"},"Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot."),(0,n.kt)("li",{parentName:"ul"},"Engineering meeting to discuss hard forks and protocol parameter updates ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/195#issuecomment-1300503557"},"#195")),(0,n.kt)("li",{parentName:"ul"},"Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions."),(0,n.kt)("li",{parentName:"ul"},"Drafted project scope for an external audit RFP.")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement event-sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/issues/580"},"#580")),(0,n.kt)("li",{parentName:"ul"},"Answer the internal auditor","\u2019","s questions"),(0,n.kt)("li",{parentName:"ul"},"Have a draft RFP ready for a first review internally"),(0,n.kt)("li",{parentName:"ul"},"Close some gaps ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra-poc/pull/452"},"#452"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e406e44d.c4e96dd4.js b/assets/js/e406e44d.c4e96dd4.js new file mode 100644 index 00000000000..c121c9d6d6e --- /dev/null +++ b/assets/js/e406e44d.c4e96dd4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23531],{30099:a=>{a.exports=JSON.parse('{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing","allTagsPath":"/cardano-updates/tags","count":25}')}}]); \ No newline at end of file diff --git a/assets/js/e44a2883.8da70635.js b/assets/js/e44a2883.8da70635.js new file mode 100644 index 00000000000..0af1e59da00 --- /dev/null +++ b/assets/js/e44a2883.8da70635.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96755],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,l[1]=i;for(var u=2;u<o;u++)l[u]=n[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},80740:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={sidebar_position:2},l="Translate your site",i={unversionedId:"tutorial-extras/translate-your-site",id:"tutorial-extras/translate-your-site",title:"Translate your site",description:"Let's translate docs/intro.md to French.",source:"@site/docs/tutorial-extras/translate-your-site.md",sourceDirName:"tutorial-extras",slug:"/tutorial-extras/translate-your-site",permalink:"/cardano-updates/docs/tutorial-extras/translate-your-site",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"defaultSidebar",previous:{title:"Manage Docs Versions",permalink:"/cardano-updates/docs/tutorial-extras/manage-docs-versions"}},s={},u=[{value:"Configure i18n",id:"configure-i18n",level:2},{value:"Translate a doc",id:"translate-a-doc",level:2},{value:"Start your localized site",id:"start-your-localized-site",level:2},{value:"Add a Locale Dropdown",id:"add-a-locale-dropdown",level:2},{value:"Build your localized site",id:"build-your-localized-site",level:2}],c={toc:u},d="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(d,(0,r.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"translate-your-site"},"Translate your site"),(0,a.kt)("p",null,"Let's translate ",(0,a.kt)("inlineCode",{parentName:"p"},"docs/intro.md")," to French."),(0,a.kt)("h2",{id:"configure-i18n"},"Configure i18n"),(0,a.kt)("p",null,"Modify ",(0,a.kt)("inlineCode",{parentName:"p"},"docusaurus.config.js")," to add support for the ",(0,a.kt)("inlineCode",{parentName:"p"},"fr")," locale:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config.js"',title:'"docusaurus.config.js"'},"module.exports = {\n i18n: {\n defaultLocale: 'en',\n locales: ['en', 'fr'],\n },\n};\n")),(0,a.kt)("h2",{id:"translate-a-doc"},"Translate a doc"),(0,a.kt)("p",null,"Copy the ",(0,a.kt)("inlineCode",{parentName:"p"},"docs/intro.md")," file to the ",(0,a.kt)("inlineCode",{parentName:"p"},"i18n/fr")," folder:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"mkdir -p i18n/fr/docusaurus-plugin-content-docs/current/\n\ncp docs/intro.md i18n/fr/docusaurus-plugin-content-docs/current/intro.md\n")),(0,a.kt)("p",null,"Translate ",(0,a.kt)("inlineCode",{parentName:"p"},"i18n/fr/docusaurus-plugin-content-docs/current/intro.md")," in French."),(0,a.kt)("h2",{id:"start-your-localized-site"},"Start your localized site"),(0,a.kt)("p",null,"Start your site on the French locale:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npm run start -- --locale fr\n")),(0,a.kt)("p",null,"Your localized site is accessible at ",(0,a.kt)("a",{parentName:"p",href:"http://localhost:3000/fr/"},"http://localhost:3000/fr/")," and the ",(0,a.kt)("inlineCode",{parentName:"p"},"Getting Started")," page is translated."),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"In development, you can only use one locale at a same time.")),(0,a.kt)("h2",{id:"add-a-locale-dropdown"},"Add a Locale Dropdown"),(0,a.kt)("p",null,"To navigate seamlessly across languages, add a locale dropdown."),(0,a.kt)("p",null,"Modify the ",(0,a.kt)("inlineCode",{parentName:"p"},"docusaurus.config.js")," file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-js",metastring:'title="docusaurus.config.js"',title:'"docusaurus.config.js"'},"module.exports = {\n themeConfig: {\n navbar: {\n items: [\n // highlight-start\n {\n type: 'localeDropdown',\n },\n // highlight-end\n ],\n },\n },\n};\n")),(0,a.kt)("p",null,"The locale dropdown now appears in your navbar:"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Locale Dropdown",src:n(4911).Z,width:"370",height:"302"})),(0,a.kt)("h2",{id:"build-your-localized-site"},"Build your localized site"),(0,a.kt)("p",null,"Build your site for a specific locale:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npm run build -- --locale fr\n")),(0,a.kt)("p",null,"Or build your site to include all the locales at once:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npm run build\n")))}p.isMDXComponent=!0},4911:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/localeDropdown-f0d995e751e7656a1b0dbbc1134e49c2.png"}}]); \ No newline at end of file diff --git a/assets/js/e4619b9c.0e5fd447.js b/assets/js/e4619b9c.0e5fd447.js new file mode 100644 index 00000000000..e1cd9c044f6 --- /dev/null +++ b/assets/js/e4619b9c.0e5fd447.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56482],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),u=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=u(r),m=a,h=d["".concat(p,".").concat(m)]||d[m]||c[m]||o;return r?n.createElement(h,i(i({ref:t},s),{},{components:r})):n.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var u=2;u<o;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},70761:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={title:"Developer Experience Update",slug:"2023-07-06-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-06-developer-experience",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-06-developer-experience.md",source:"@site/blog/2023-07-06-developer-experience.md",title:"Developer Experience Update",description:"High level summary",date:"2023-07-06T00:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"devx",permalink:"/cardano-updates/tags/devx"}],readingTime:1.145,hasTruncateMarker:!1,authors:[{name:"Moritz Angermann",title:"Head of Developer Experience",url:"https://github.com/angerman",imageURL:"https://github.com/angerman.png",key:"angerman"}],frontMatter:{title:"Developer Experience Update",slug:"2023-07-06-developer-experience",authors:"angerman",tags:["devx"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-07-sre"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-07-04-db-sync"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"build support & maintainance",id:"build-support--maintainance",level:3},{value:"compiler upgrades",id:"compiler-upgrades",level:3},{value:"Hydra Tools",id:"hydra-tools",level:3},{value:"haskell.nix",id:"haskellnix",level:3},{value:"devx",id:"devx",level:3},{value:"upstream tooling",id:"upstream-tooling",level:3}],s={toc:u},d="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("h3",{id:"build-support--maintainance"},"build support & maintainance"),(0,a.kt)("p",null,"The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions."),(0,a.kt)("h3",{id:"compiler-upgrades"},"compiler upgrades"),(0,a.kt)("p",null,"Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests."),(0,a.kt)("h3",{id:"hydra-tools"},"Hydra Tools"),(0,a.kt)("p",null,"Our repository, ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra-tools"},"input-output-hk/actions"),", has seen quite some improvements to facility the hydra <-> github integration."),(0,a.kt)("h3",{id:"haskellnix"},"haskell.nix"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/haskell.nix"},"Haskell.nix")," has been maintained and updated with the addition of preliminary GHC 9.8 support."),(0,a.kt)("h3",{id:"devx"},"devx"),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/devx"},"devx")," repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/actions"},"actions/devx")," GitHub Actions, we have a consistent set of tooling for"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"nix develop shells"),(0,a.kt)("li",{parentName:"ul"},"GitHub CodeSpaces integration"),(0,a.kt)("li",{parentName:"ul"},"VSCode DevContainer support"),(0,a.kt)("li",{parentName:"ul"},"GitHub Actions integration")),(0,a.kt)("h3",{id:"upstream-tooling"},"upstream tooling"),(0,a.kt)("p",null,"Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e4a61baa.347ef4cf.js b/assets/js/e4a61baa.347ef4cf.js new file mode 100644 index 00000000000..e49e99f1108 --- /dev/null +++ b/assets/js/e4a61baa.347ef4cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53121],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var a=r(67294);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){l(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function u(e,t){if(null==e)return{};var r,a,l=function(e,t){if(null==e)return{};var r,a,l={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var p=a.createContext({}),i=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=i(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},s=a.forwardRef((function(e,t){var r=e.components,l=e.mdxType,n=e.originalType,p=e.parentName,d=u(e,["components","mdxType","originalType","parentName"]),c=i(r),s=l,h=c["".concat(p,".").concat(s)]||c[s]||m[s]||n;return r?a.createElement(h,o(o({ref:t},d),{},{components:r})):a.createElement(h,o({ref:t},d))}));function h(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=r.length,o=new Array(n);o[0]=s;var u={};for(var p in t)hasOwnProperty.call(t,p)&&(u[p]=t[p]);u.originalType=e,u[c]="string"==typeof e?e:l,o[1]=u;for(var i=2;i<n;i++)o[i]=r[i];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}s.displayName="MDXCreateElement"},32288:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>u,toc:()=>i});var a=r(87462),l=(r(67294),r(3905));const n={title:"Ledger Team Update",slug:"2023-05-26-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,u={permalink:"/cardano-updates/2023-05-26-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-26-ledger.md",source:"@site/blog/2023-05-26-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-05-26T00:00:00.000Z",formattedDate:"May 26, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.565,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-05-26-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-26-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-26-network"}},p={authorsImageUrls:[void 0]},i=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway progress",id:"conway-progress",level:3},{value:"Improve testing",id:"improve-testing",level:3},{value:"Integration work",id:"integration-work",level:3},{value:"Technical debt",id:"technical-debt",level:3}],d={toc:i},c="wrapper";function m(e){let{components:t,...r}=e;return(0,l.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"The ledger team made progress on the conway ledger era. In particular, the design and implementation\nof the new certificates is near complete, we refactored some of our data structures\nto be able to support DReps, we cleaned up the serialization format, and renamed things to make\nclearer the differences with Shelley."),(0,l.kt)("p",null,"The team also completed integration work for the next node release, namely 8.1.0.\nAnd, as always, we continue to address technical debt."),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway-progress"},"Conway progress"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3408"},"pull-3408")," - Improve conway delegation certificates"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3428"},"pull-3428")," - Get rid of Constitutional in favor of Genesis and Committee"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3426"},"pull-3426")," - Add DRep to internal data struture (UMap)"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3425"},"pull-3425")," - Improve witness logic needed for conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3423"},"pull-3423")," - Rename ShelleyDelegCerts constructors to distinguish them from Conway"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3421"},"pull-3421")," - Rename DCert -> TxCert"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3454"},"pull-3454")," - conway CDDL minor fixes")),(0,l.kt)("h3",{id:"improve-testing"},"Improve testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3403"},"pull-3403")," - Add Plutus script context golden tests")),(0,l.kt)("h3",{id:"integration-work"},"Integration work"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3410"},"pull-3410")," - Update chaps index"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3416"},"pull-3416")," - Bump cardano-ledger-alonzo-test version"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3414"},"pull-3414")," - Bump cardano-ledger-shelley-test minor version"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3420"},"pull-3420")," - Bump cardano-ledger-shelley-ma-test version"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3441"},"pull-3441")," - Release cardano-ledger-","[alonzo|babbage]","-1.2.1")),(0,l.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3409"},"pull-3409")," - Unit test - no such thing as a reference datum"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3407"},"pull-3407")," - Fixup release process documentation"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3404"},"pull-3404")," - Create TotalDeposits events during all eras"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3402"},"pull-3402")," - Fix broken references in the Shelley spec"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3424"},"pull-3424")," - Remove no longer used cardano-ledger-shelley-ma package"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3432"},"pull-3432")," - Add an example on how to bump up versions in the changelog "),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3440"},"pull-3440")," - Revert back to the group serialization for ProtVer for PParams ")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e54fb861.dc652803.js b/assets/js/e54fb861.dc652803.js new file mode 100644 index 00000000000..042890ebb9a --- /dev/null +++ b/assets/js/e54fb861.dc652803.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[89248],{35997:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/9","page":9,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/8","nextPage":"/cardano-updates/tags/hydra/page/10","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/e56a9a29.d1d0f3d4.js b/assets/js/e56a9a29.d1d0f3d4.js new file mode 100644 index 00000000000..3acb515cbbe --- /dev/null +++ b/assets/js/e56a9a29.d1d0f3d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43412],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>g});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=r.createContext({}),s=function(e){var n=r.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=s(e.components);return r.createElement(c.Provider,{value:n},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=s(t),d=a,g=m["".concat(c,".").concat(d)]||m[d]||u[d]||o;return t?r.createElement(g,i(i({ref:n},p),{},{components:t})):r.createElement(g,i({ref:n},p))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=d;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var s=2;s<o;s++)i[s]=t[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}d.displayName="MDXCreateElement"},43937:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=t(87462),a=(t(67294),t(3905));const o={title:"Performance & tracing update",slug:"2023-08-24-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-08-24-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-24-performance-and-tracing.md",source:"@site/blog/2023-08-24-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-08-24T00:00:00.000Z",formattedDate:"August 24, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.7,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-08-24-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-25-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-23-consensus"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],p={toc:s},m="wrapper";function u(e){let{components:n,...t}=e;return(0,a.kt)(m,(0,r.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: Benchmarking node version ",(0,a.kt)("inlineCode",{parentName:"li"},"8.2.1")," has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Our analysis pipeline has received improvements reducing memory footprint."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"We've performed and analysed the benchmarks for the ",(0,a.kt)("inlineCode",{parentName:"p"},"8.2.1")," version of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node")," as part of our release benchmarking cycle. "),(0,a.kt)("p",null,"Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held\nin memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The next portion of optimizations has been completed and merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),", getting rid of Haskell's native ",(0,a.kt)("inlineCode",{parentName:"p"},"String")," representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),". "),(0,a.kt)("p",null,"The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster\nand porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e57d1f62.5be8a504.js b/assets/js/e57d1f62.5be8a504.js new file mode 100644 index 00000000000..bfbcd85d7ac --- /dev/null +++ b/assets/js/e57d1f62.5be8a504.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79362],{29042:a=>{a.exports=JSON.parse('{"label":"consensus","permalink":"/cardano-updates/tags/consensus","allTagsPath":"/cardano-updates/tags","count":32}')}}]); \ No newline at end of file diff --git a/assets/js/e5a8e689.c5c3df95.js b/assets/js/e5a8e689.c5c3df95.js new file mode 100644 index 00000000000..478e4b94476 --- /dev/null +++ b/assets/js/e5a8e689.c5c3df95.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25946],{88019:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/16","page":16,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/15","nextPage":"/cardano-updates/page/17","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/e5b737ed.3fd1fabf.js b/assets/js/e5b737ed.3fd1fabf.js new file mode 100644 index 00000000000..12e04d9ac82 --- /dev/null +++ b/assets/js/e5b737ed.3fd1fabf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54750],{1879:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/system-test","page":1,"postsPerPage":5,"totalPages":1,"totalCount":5,"blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/e5dd9161.eed06922.js b/assets/js/e5dd9161.eed06922.js new file mode 100644 index 00000000000..b83dcfd7e77 --- /dev/null +++ b/assets/js/e5dd9161.eed06922.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[37329],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},h=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=p(a),m=n,c=s["".concat(u,".").concat(m)]||s[m]||d[m]||i;return a?r.createElement(c,o(o({ref:t},h),{},{components:a})):r.createElement(c,o({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},16036:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-02-24-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-24-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-24-hydra.md",source:"@site/blog/2023-02-24-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-24T00:00:00.000Z",formattedDate:"February 24, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.93,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-24-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-02-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-23-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team continue closing many gaps and aligning the\nimplementation with the specification. More over, they have groomed a plan to\nmake Hydra Mainnet compatible. Also, they continue moving forward with the\ninternal auditing and have published some auditing guidelines to receive\ncontributions from the community."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/452"},"#452")," (what is\nremaining in there)"),(0,n.kt)("li",{parentName:"ul"},"Aligned the Head protocol logic implementation with the specification"),(0,n.kt)("li",{parentName:"ul"},"Completed full minting policy implementation and spec\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/720"},"#720")),(0,n.kt)("li",{parentName:"ul"},"Clarified message authentication with researchers"),(0,n.kt)("li",{parentName:"ul"},"Groomed what is left to do for Mainnet compatibility\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713")," and drafted a\n0.10.0 version"),(0,n.kt)("li",{parentName:"ul"},"Added a tutorial by ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/perturbing/"},"@perturbing")," to the\nwebsite ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/docs/tutorial/"},"LINK")),(0,n.kt)("li",{parentName:"ul"},"Published auditing guidelines\n",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/audit-guidelines"},"LINK")),(0,n.kt)("li",{parentName:"ul"},"Made hydra-node work for macos\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/746"},"#746")," and added support\nfor building on aarch64\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/673"},"#673")),(0,n.kt)("li",{parentName:"ul"},"Met with a potential customer of Hydra for Payments")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Have the monthly review meeting incl. the report"),(0,n.kt)("li",{parentName:"ul"},"Have smoke tests fixed and running regularly"),(0,n.kt)("li",{parentName:"ul"},"Release 0.9.0 with updated scripts"),(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs for specification")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e6402687.8934f415.js b/assets/js/e6402687.8934f415.js new file mode 100644 index 00000000000..08519d5dd28 --- /dev/null +++ b/assets/js/e6402687.8934f415.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93524],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(n),m=o,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||r;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var p=2;p<r;p++)i[p]=n[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},26879:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=n(87462),o=(n(67294),n(3905));const r={title:"Network Team Update",slug:"2022-11-28-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-11-28-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-28-network.md",source:"@site/blog/2022-11-28-network.md",title:"Network Team Update",description:"Stake-Driven Data Diffusion Release for Relays",date:"2022-11-28T00:00:00.000Z",formattedDate:"November 28, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"},{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:3.675,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-11-28-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-30-performance-and-tracing"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2022-11-25-crypto"}},l={authorsImageUrls:[void 0]},p=[{value:"Stake-Driven Data Diffusion Release for Relays",id:"stake-driven-data-diffusion-release-for-relays",level:2},{value:"Peer Sharing",id:"peer-sharing",level:3},{value:"DeltaQ",id:"deltaq",level:3},{value:"What have we achieve last sprint",id:"what-have-we-achieve-last-sprint",level:2},{value:"DeltaQ",id:"deltaq-1",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"stake-driven-data-diffusion-release-for-relays"},"Stake-Driven Data Diffusion Release for Relays"),(0,o.kt)("p",null,"IOG networking team decided to release the ",(0,o.kt)("em",{parentName:"p"},"Stake-Driven Data Diffusion with\nRobust Optimised Peer Selection")," also more commonly known as ",(0,o.kt)("em",{parentName:"p"},"P2P"),". In the\nlast update, we informed about a performance regression, but it turns out it\nonly affects block producers, and thus we highly advise against running it on\nsuch nodes. Further investigation is required to find the cause of it."),(0,o.kt)("p",null,"On IOG's benchmarking cluster we have seen quite a good performance improvement\non block propagation itself. The cluster is running a static topology with\nvalency 6 (each node is connected to 6 other nodes). In which every of the 50\nnodes are block producers. The setup of this network is the same as mainnet.\nWe've seen 40-50% performance improvement on block propagation comparing to the\nsame cluster deployed with the same topology but using non-P2P nodes. We think\nthis performance improvement is caused by using full duplex connections. Quite\nlikely the transaction traffic floating in both directions on the same TCP\nconnection helps to keep the TCP window open. Note that in a cluster of 50\nnodes with valency 6 the probability of having at least one duplex connection\nis more than 50%. We don't expect the same improvement on mainnet because the\nnetwork is much wider and the transaction traffic is not as large."),(0,o.kt)("p",null,"Just before the release we squashed two small bugs:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4163"},"issue #4163")," - top level integration bug in ",(0,o.kt)("inlineCode",{parentName:"li"},"keep-alive"),";"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177")," - a bug in ",(0,o.kt)("inlineCode",{parentName:"li"},"outbound-governor"),";"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4165"},"PR #4165")," - a fix ",(0,o.kt)("inlineCode",{parentName:"li"},"cardano-ping")," support of ",(0,o.kt)("inlineCode",{parentName:"li"},"NodeToNodeV_10"),".")),(0,o.kt)("h3",{id:"peer-sharing"},"Peer Sharing"),(0,o.kt)("p",null,"We were carrying a review of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"peer sharing PR"),"."),(0,o.kt)("h3",{id:"deltaq"},"DeltaQ"),(0,o.kt)("p",null,"Neil Davies was invited to give a guest lecture entitled ",(0,o.kt)("inlineCode",{parentName:"p"},"Avoiding System Catastrophes")," at ",(0,o.kt)("a",{parentName:"p",href:"https://uclouvain.be/en/index.html"},"UCLouvain"),"."),(0,o.kt)("h2",{id:"what-have-we-achieve-last-sprint"},"What have we achieve last sprint"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4163"},"issue #4163"),": we found out that a control message is not passed to the\n",(0,o.kt)("inlineCode",{parentName:"p"},"keep-alive")," mini-protocol, this results in every demotion executing demotion\ntimeout rather than a graceful termination. With the fix the node will no longer log:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-json"},'{ "kind": "PeerStatusChangeFailure"\n, "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"\n, "reason": "TimeoutError"\n}\n'))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4177"},"issue #4177"),": we fixed an assertion failure in the ",(0,o.kt)("inlineCode",{parentName:"p"},"outbound-governor"),"; now\nwe don't try demoted peers which are being demoted already.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4155"},"PR #4155"),": we refactored ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," packages. There's a top level\n",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-diffusion")," package which integrates ",(0,o.kt)("inlineCode",{parentName:"p"},"network"),"\n& ",(0,o.kt)("inlineCode",{parentName:"p"},"consensus")," code. We also introduced:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ouroboros-network-api")," package which contains the API shared between\n",(0,o.kt)("inlineCode",{parentName:"li"},"network")," & ",(0,o.kt)("inlineCode",{parentName:"li"},"conensus"),";"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ouroboros-network-mock")," package which contains mock API used for testing\n(e.g. a mock chain & chain producer, etc.)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"ouroboros-network-protocols")," package which contains implementation of all\n(but ",(0,o.kt)("inlineCode",{parentName:"li"},"handshake"),") mini-protocols, exposes a ",(0,o.kt)("inlineCode",{parentName:"li"},"testlib")," and contains ",(0,o.kt)("inlineCode",{parentName:"li"},"test"),"\nand ",(0,o.kt)("inlineCode",{parentName:"li"},"cddl")," components.")),(0,o.kt)("p",{parentName:"li"},"This made the dependency tree of ",(0,o.kt)("inlineCode",{parentName:"p"},"network")," & ",(0,o.kt)("inlineCode",{parentName:"p"},"consensus")," packages much\ncleaner.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4169"},"PR #4169"),": we described the usage of release branches in ",(0,o.kt)("inlineCode",{parentName:"p"},"CONTRIBUTING.md"),"\ndoc.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4165"},"PR #4165"),": we fixed ",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-ping")," support of ",(0,o.kt)("inlineCode",{parentName:"p"},"NodeToNodeV_10")," protocol."))),(0,o.kt)("h3",{id:"deltaq-1"},"DeltaQ"),(0,o.kt)("p",null,"The abstract of the talk:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"An essential step to ensuring that distributed systems are fit for\npurpose."),(0,o.kt)("p",{parentName:"blockquote"},"Distributed systems have become an integral part of our society and\ndaily lives. We are, both implicitly and explicitly, individually as well as\ncollectively, placing ever more trust in them."),(0,o.kt)("p",{parentName:"blockquote"},"Are they worthy of this trust? Our need for them to be \u2018fit-for-purpose\u2019 goes\nwell beyond notions of functional correctness (i.e. never getting the wrong\nanswer). We need them to deliver the desired outcomes in a timely, robust,\nreliable, resilient fashion, at scale and in a sustainable way (both\neconomically and environmentally)."),(0,o.kt)("p",{parentName:"blockquote"},"This all sounds like a worthy aspiration, but what would be a practical\napproach to capturing and reasoning about these issues? How can we ensure that\nsystems can meet their fit-for-purpose objectives, not just in their design but\nas they are deployed, encounter the imperfect world, are scaled to become\neconomic, and proceed into ongoing maintenance?"),(0,o.kt)("p",{parentName:"blockquote"},"This talk will illustrate how the notions of Outcomes and Quality Attenuation\n(as captured by \u2018\u2206Q\u2019) are being used to both frame the necessary notions and\nprovide a basis for assuring the refinement and reification of such systems,\nfrom initial concept to operational infrastructure.")),(0,o.kt)("p",null,"You can download the slides from ",(0,o.kt)("a",{target:"_blank",href:n(98946).Z},"here"),"."))}d.isMDXComponent=!0},98946:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/files/2022-11-24-UCL-60c46564c5dee25b0060304c060ab1cf.pdf"}}]); \ No newline at end of file diff --git a/assets/js/e695f231.2dfaf583.js b/assets/js/e695f231.2dfaf583.js new file mode 100644 index 00000000000..e82ab60a8be --- /dev/null +++ b/assets/js/e695f231.2dfaf583.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26540],{9562:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/performance-tracing/page/3","page":3,"postsPerPage":5,"totalPages":5,"totalCount":25,"previousPage":"/cardano-updates/tags/performance-tracing/page/2","nextPage":"/cardano-updates/tags/performance-tracing/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/e6ea9b03.a0904c0a.js b/assets/js/e6ea9b03.a0904c0a.js new file mode 100644 index 00000000000..866541ecb82 --- /dev/null +++ b/assets/js/e6ea9b03.a0904c0a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[88869],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=p(r),d=n,h=s["".concat(u,".").concat(d)]||s[d]||m[d]||i;return r?a.createElement(h,o(o({ref:t},c),{},{components:r})):a.createElement(h,o({ref:t},c))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=r[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},53187:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-03-31-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-03-31-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-31-crypto.md",source:"@site/blog/2023-03-31-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-03-31T00:00:00.000Z",formattedDate:"March 31, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.105,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-03-31-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-05-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-31-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3},{value:"MuSig2",id:"musig2",level:3}],c={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: Started looking into full-node verifier"),(0,n.kt)("li",{parentName:"ul"},"cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties."),(0,n.kt)("li",{parentName:"ul"},"KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent. "),(0,n.kt)("li",{parentName:"ul"},"Sidechains: Included BLS12-381 & JubJub to halo2curves"),(0,n.kt)("li",{parentName:"ul"},"MuSig2: Final modifs to C version.")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started designing how a full-node verifier would work. Issue comming in the next couple of weeks. ")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"BLS12-381 branch merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"),". "),(0,n.kt)("li",{parentName:"ul"},"Testing strategy for BLS bindings:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Test-vectors for Groth16, and simple BLS signatures ready."),(0,n.kt)("li",{parentName:"ul"},"Test-vectors with different library, and created by different engineer. ")))),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Resolved issues of circular dependency"),(0,n.kt)("li",{parentName:"ul"},"Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same. "),(0,n.kt)("li",{parentName:"ul"},"Opened a PR for raw bearer branch in ouroboros network ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395"},"PR4395")),(0,n.kt)("li",{parentName:"ul"},"Resolved a bug where the agent node did not properly closed connections"),(0,n.kt)("li",{parentName:"ul"},"Updated version of ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/io-sim/pull/70"},"IOSim")," allowed us to finish a first version of KES agent.")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Included ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/iquerejeta/halo2curves/commit/1ccf987b772dcfaa3c1e3439a4a28f23fcf07c7a"},"BLS12-381")," curve to our branch of halo2curves"),(0,n.kt)("li",{parentName:"ul"},"Included ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/iquerejeta/halo2curves/commit/3f20edb2ed112733a0a0986b0a0386c1b9bc439f"},"JubJub")," to our branch of halo2curves ")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Minor reorg ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/42"},"PR#42")),(0,n.kt)("li",{parentName:"ul"},"Started including fuzz testing for deserialisation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/musig2/pull/43"},"PR#"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e70f68c6.0a94e2cb.js b/assets/js/e70f68c6.0a94e2cb.js new file mode 100644 index 00000000000..12066840dbf --- /dev/null +++ b/assets/js/e70f68c6.0a94e2cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[72815],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=c(r),u=n,f=d["".concat(p,".").concat(u)]||d[u]||m[u]||o;return r?a.createElement(f,l(l({ref:t},s),{},{components:r})):a.createElement(f,l({ref:t},s))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}u.displayName="MDXCreateElement"},80684:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-03-16-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-03-16-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-16-goedel.md",source:"@site/blog/2023-03-16-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-03-16T00:00:00.000Z",formattedDate:"March 16, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.55,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-03-16-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-17-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-03-10-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},d="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team has been working on drafts of two papers\nimproving the deltaQ tutorial, consulting on performance design, and\nthe final version of the Djed paper."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Preparing draft of DeltaQSD algebra paper for ICE 2023")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Successful outcome of Marlowe consultancy leading to substantial\nimprovement in performance")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Preparing sections on the communication language and bisimulation\nproofs for draft paper about verifying design refinements for\ndistributed system design")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Camera ready version of Djed paper under preparation"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e716e5b6.99afaa36.js b/assets/js/e716e5b6.99afaa36.js new file mode 100644 index 00000000000..5e4b5fe50ef --- /dev/null +++ b/assets/js/e716e5b6.99afaa36.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[94379],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(n),d=r,h=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},13179:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const o={title:"SRE Q3 2023 Update",slug:"2023-Q3-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2023-Q3-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q3-sre.md",source:"@site/quarterly/2023-Q3-sre.md",title:"SRE Q3 2023 Update",description:"2023-07 - 2023-09",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"sre",permalink:"/cardano-updates/quarterly/tags/sre"}],readingTime:.905,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Q3 2023 Update",slug:"2023-Q3-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Q3 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q3-performance-and-tracing"},nextItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2023-04-25-consensus"}},p={authorsImageUrls:[void 0]},s=[{value:"2023-07 - 2023-09",id:"2023-07---2023-09",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"Next steps",id:"next-steps",level:3}],u={toc:s},c="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-07---2023-09"},"2023-07 - 2023-09"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("p",null,"In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Completion of mainnet relay networking conversion to p2p topology"),(0,r.kt)("li",{parentName:"ul"},"Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality"),(0,r.kt)("li",{parentName:"ul"},"Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines"),(0,r.kt)("li",{parentName:"ul"},"Creation of a nix content addressed packages repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs"},"capkgs"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a cardano performance benchmarking cluster, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-perf"},"cardano-perf"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"To replace legacy cluster benchmark tooling"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a cardano cluster composition repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts"},"cardano-parts"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"For enabling multi-cluster, multi-role cardano network deployments"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a cardano testnets repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Utilizing cardano-parts for testnet deployments"))),(0,r.kt)("li",{parentName:"ul"},"Creation of a sanchonet demo repository, ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo"},"sanchonet-demo"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Utilizing cardano-parts for fast sanchonet test environment and demo purposes")))),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Continue with migration of cardano-world testnets to cardano-playground"),(0,r.kt)("li",{parentName:"ul"},"Proceed with spinup of mainnet p2p bootstrap cluster"),(0,r.kt)("li",{parentName:"ul"},"Scale down mainnet non-p2p legacy cluster at the appropriate time")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e7486169.d066da59.js b/assets/js/e7486169.d066da59.js new file mode 100644 index 00000000000..66e64180ecc --- /dev/null +++ b/assets/js/e7486169.d066da59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45237],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(n),c=a,h=m["".concat(s,".").concat(c)]||m[c]||d[c]||o;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}c.displayName="MDXCreateElement"},74349:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(87462),a=(n(67294),n(3905));const o={title:"Network Team Update",slug:"2022-11-09-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/quarterly/2022-11-09-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2022-11-09-network.md",source:"@site/quarterly/2022-11-09-network.md",title:"Network Team Update",description:"Network Quarterly Update",date:"2022-11-09T00:00:00.000Z",formattedDate:"November 9, 2022",tags:[{label:"network",permalink:"/cardano-updates/quarterly/tags/network"}],readingTime:3.87,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-11-09-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Consensus Quarterly Update",permalink:"/cardano-updates/quarterly/2022-11-15-consensus"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/quarterly/2022-11-07-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"Network Quarterly Update",id:"network-quarterly-update",level:2},{value:"2022-09 - 2022-11",id:"2022-09---2022-11",level:2},{value:"Summary of most important improvements",id:"summary-of-most-important-improvements",level:3},{value:"Detailed log",id:"detailed-log",level:3},{value:"Next quarter",id:"next-quarter",level:2}],u={toc:p},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"network-quarterly-update"},"Network Quarterly Update"),(0,a.kt)("h2",{id:"2022-09---2022-11"},"2022-09 - 2022-11"),(0,a.kt)("h3",{id:"summary-of-most-important-improvements"},"Summary of most important improvements"),(0,a.kt)("p",null,"During this quarter the networking team delivered low level specification of\npeer sharing & eclipse evasion. We held a session with the consensus & the\nscientists; we got a positive feedback on the design."),(0,a.kt)("p",null,"Further we focused on implementation of peer sharing. We produced a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/wiki/Peer-Sharing-Implementation-Plan"},"detail\ndesign")," and an ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"early implementation"),"."),(0,a.kt)("p",null,"We prepared the ",(0,a.kt)("em",{parentName:"p"},"P2P Single Relay Release")," (",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node-1.35.5"),"). It\nincludes over ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4120"},"130 patches")," of network stack improvements over the\nprevious version ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.4"),", which were accomplished over a longer period of\ntime. Among them are both bug fixes and UX improvements for stake pool\noperators like simplified format of the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4563"},"topology file"),", or\nimprovements in the logged messages:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4015"},"tracing of early consensus exceptions")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4127"},"tracing of demotion of local root peers")," (traced with\n",(0,a.kt)("inlineCode",{parentName:"li"},"Warning")," severity), the trace is called ",(0,a.kt)("inlineCode",{parentName:"li"},"TraceDemoteLocalAsynchronous"),", in\n",(0,a.kt)("inlineCode",{parentName:"li"},"json")," format it is encoded as ",(0,a.kt)("inlineCode",{parentName:"li"},"DemoteLocalAsynchronous"),". For an SPO\ntracking these demotion is vital (such demotion could indicate that a block\nproducer is no longer connected to its relays or vice versa)")),(0,a.kt)("p",null,"We also provide better integration with ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3979"},"systemd")," (socket\nactivation improvements) or improvements in the networking stack:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3785"},"exit policies"),","),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3915"},"peer metrics improvements"),","),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4106"},"DNS TTL")," improvements (which make it harder to misconfigure the\nsystem, an issue discovered by the performance & monitoring team),"),(0,a.kt)("li",{parentName:"ul"},"do not trigger inbound idle timeout for ",(0,a.kt)("inlineCode",{parentName:"li"},"node-to-client")," connections (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/3844"},"pr\n#3844"),"), an issue reported to us by Matthias Benkort from\nCardano Foundation.")),(0,a.kt)("p",null,"Duncan has been making progress with the input endorsers demo. His simulation\nprovides a useful animated visualisation and live quantification of behaviour\nof the modeled design."),(0,a.kt)("p",null,"We also improved our e2e diffusion simulation by implementing header-body\nsplit, similar to what the real implementation does."),(0,a.kt)("p",null,"We also made some advances towards our future goals of P2P release for block\nproducer nodes (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/3800"},"pr #3800")," - in review) & for Daedalus users\n(",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3968"},"pr #3690")," - merged)."),(0,a.kt)("h3",{id:"detailed-log"},"Detailed log"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We expanded diffusion simulation with block-fetch protocol bringing it closer\nto the production system.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We addressed some additional technical depth in diffusion simulation")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We slightly improved documentation & CI of io-sim and typed-protocols\nrepositories for open-source contributors.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We closed a number of issues towards publishing io-sim on Hackage (only two\nessential issues are left open).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We pushed a branch of typed-protocols which captures one of the developer UX\nproblems in the API which we need to solve.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified and fixed an issue related to systemd sockets.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified and fixed an issue in consensus initialisation not giving\nfeedback on early errors.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We deployed RT View, identified a number of issues which were communicated to\nthe performance & monitoring team.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We finished high level & detailed design of peer sharing, very early\nimplementation of peer sharing is done (note that peer sharing cannot be\nsafely deployed without eclipse evasion & genesis).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We finished high level design of eclipse evasion, and started working on\na detailed design.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We were assigned the role of release engineer for 1.35.5 release (the P2P\nsingle relay release); we prepared a cardano-node for 1.35.5 release which\ncontains more than 130 patches of just network stack improvements done over\nlast few months.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We diagnosed and fixed an tricky bug in the peer state actions (a component\nwhich sits between outbound governor and connection manager). That bug was\nintroduced earlier this year and never released. It was caught by the QA\ntesting framework. We expanded our diffusion simulation to cover such case and\nalso mitigated a chance for reintroducing such a bug in future.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We identified and quite likely mitigated a misconfiguration in the\nbenchmarking cluster (next benchmarking run will confirm our hypothesis).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We simplified the format of p2p topology file, we got positive feedback from\nSPOs.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We raised severities of some of the logging messages, which is an important\nimprovement for SPOs, exchanges and other users of the system.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"We worked on input endorsers simulation which gives both animated and\nquantified live feedback on network operation, using a simplified model of\na TCP/IP network. "))),(0,a.kt)("h2",{id:"next-quarter"},"Next quarter"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Release the Single Relay P2P Release ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.5"),".")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Carry on with Peer Sharing (review, testing).")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Deliver a talk at ",(0,a.kt)("a",{parentName:"p",href:"https://sites.uclouvain.be/OPODIS2022/"},"Conference on Principles of Distributed Systems 2022")," in Brussels, Belgium.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Present Detailed Design of Eclipse Evasion and start implementation phase.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Work on P2P Block Producer release.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Carry on with publishing of ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim")," on ",(0,a.kt)("inlineCode",{parentName:"p"},"Hackage"),"."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e7a72da0.d7b2d45e.js b/assets/js/e7a72da0.d7b2d45e.js new file mode 100644 index 00000000000..935e4e5581a --- /dev/null +++ b/assets/js/e7a72da0.d7b2d45e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46846],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>h});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)t=i[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},u=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(t),u=a,h=p["".concat(s,".").concat(u)]||p[u]||m[u]||i;return t?r.createElement(h,o(o({ref:n},d),{},{components:t})):r.createElement(h,o({ref:n},d))}));function h(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=u;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[p]="string"==typeof e?e:a,o[1]=l;for(var c=2;c<i;c++)o[c]=t[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,t)}u.displayName="MDXCreateElement"},66876:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(87462),a=(t(67294),t(3905));const i={title:"Performance & tracing update",slug:"2023-04-19-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-04-19-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-19-performance-and-tracing.md",source:"@site/blog/2023-04-19-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.",date:"2023-04-19T00:00:00.000Z",formattedDate:"April 19, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.575,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-04-19-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-19-consensus"},nextItem:{title:"Incident Report",permalink:"/cardano-updates/2023-04-17-ledger"}},s={authorsImageUrls:[void 0]},c=[{value:"Detailed manifest",id:"detailed-manifest",level:3},{value:"GHC profiling inside workbench",id:"ghc-profiling-inside-workbench",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],d={toc:c},p="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We performed a series of benchmarks aimed at the new ",(0,a.kt)("inlineCode",{parentName:"li"},"8.0")," release branch and built a timeline from the ",(0,a.kt)("inlineCode",{parentName:"li"},"1.35")," releases to that branch."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.")),(0,a.kt)("h1",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"We have performed various cluster runs targeting the ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0")," release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile ",(0,a.kt)("inlineCode",{parentName:"p"},"epoch-transition")," for local reproduction of what we observed on the benchmarking cluster. "),(0,a.kt)("p",null,"Furthermore, we bridged the gap between the run data from the ",(0,a.kt)("inlineCode",{parentName:"p"},"1.35.x")," releases to the the new ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0.x")," release branch. This included walking the\n",(0,a.kt)("inlineCode",{parentName:"p"},"master")," branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial\nin locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of\nbenchmarks."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still\nongoing. "),(0,a.kt)("p",null,"In coordination with Galois, who are developing a system assurance service by observing a number of ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),"s, we're working with the implementation\nof data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational\nburden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," could be extended with a richer\nfeature set to that end."),(0,a.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,a.kt)("h3",{id:"detailed-manifest"},"Detailed manifest"),(0,a.kt)("p",null,"A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with.\nThese dependencies come from different package sources, have different versioning policies, and an identical package version might provide different\nperformance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated\nby making all component bumps visible and accessible."),(0,a.kt)("h3",{id:"ghc-profiling-inside-workbench"},"GHC profiling inside workbench"),(0,a.kt)("p",null,"The workbench has been equipped with a new ",(0,a.kt)("inlineCode",{parentName:"p"},"-profnix")," profile flavour. This enforces a ",(0,a.kt)("inlineCode",{parentName:"p"},"-fprof-auto")," build for all node-related packages. The type of\nprofiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already\nbeen merged to ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances.\nThis results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e80f56fd.6510f040.js b/assets/js/e80f56fd.6510f040.js new file mode 100644 index 00000000000..b1d4165e4f2 --- /dev/null +++ b/assets/js/e80f56fd.6510f040.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73336],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),s=u(a),m=n,h=s["".concat(p,".").concat(m)]||s[m]||c[m]||o;return a?r.createElement(h,i(i({ref:t},d),{},{components:a})):r.createElement(h,i({ref:t},d))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},78673:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-04-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-04-14-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-14-hydra.md",source:"@site/blog/2023-04-14-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-04-14T00:00:00.000Z",formattedDate:"April 14, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.98,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-04-14-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-04-14-goedel"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-07-hydra"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team focused on improving the smoke test, fixing developer\ntooling, and improving the API for voting use cases. They reviewed progress on\nauction, payments, and voting projects and made worked on reproducing a bug with\nhandling rollbacks. Moving forward, the team plans to update dependencies,\nimplement a dirt road fix for the rollbacks bug, and explore adding Hydra\nsupport to kupo."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Reviewed progress on auction, payments and voting projects"),(0,n.kt)("li",{parentName:"ul"},"Improved smoke tests so they can run on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Fixed a regression in the development environment and updated cardano-node\nused in tests"),(0,n.kt)("li",{parentName:"ul"},"Improved API with more configurability to unblock voting use case",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Exclude utxo in ",(0,n.kt)("inlineCode",{parentName:"li"},"SnapshotConfirmed")," outputs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/808"},"#808")),(0,n.kt)("li",{parentName:"ul"},"Addressed a user request by only sending ",(0,n.kt)("inlineCode",{parentName:"li"},"Greetings")," once ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/813"},"#813")))),(0,n.kt)("li",{parentName:"ul"},"Reproduced the rollback bug by improving our model-based test suite ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies to match ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-node")," master"),(0,n.kt)("li",{parentName:"ul"},"Dirt road fix for rollbacks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/784"},"#784")),(0,n.kt)("li",{parentName:"ul"},"Update Hydraw to maintain state locally"),(0,n.kt)("li",{parentName:"ul"},"Explore adding Hydra support to kupo"),(0,n.kt)("li",{parentName:"ul"},"Put disclaimer texts and closing mainnet compatibility feature ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e84709f6.bffbbe4e.js b/assets/js/e84709f6.bffbbe4e.js new file mode 100644 index 00000000000..d4944d0c6f7 --- /dev/null +++ b/assets/js/e84709f6.bffbbe4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46033],{90005:a=>{a.exports=JSON.parse('{"label":"hydra","permalink":"/cardano-updates/tags/hydra","allTagsPath":"/cardano-updates/tags","count":55}')}}]); \ No newline at end of file diff --git a/assets/js/e86dcd26.125084b6.js b/assets/js/e86dcd26.125084b6.js new file mode 100644 index 00000000000..f9b2be5eecf --- /dev/null +++ b/assets/js/e86dcd26.125084b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[162],{12200:a=>{a.exports=JSON.parse('{"label":"performance-tracing","permalink":"/cardano-updates/tags/performance-tracing","allTagsPath":"/cardano-updates/tags","count":25}')}}]); \ No newline at end of file diff --git a/assets/js/e8d4d6c0.20140c19.js b/assets/js/e8d4d6c0.20140c19.js new file mode 100644 index 00000000000..14ec7045b5a --- /dev/null +++ b/assets/js/e8d4d6c0.20140c19.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[52818],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(h,i(i({ref:t},c),{},{components:n})):r.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p<a;p++)i[p]=n[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},32340:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var r=n(87462),o=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2023-02-17-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-17-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-network.md",source:"@site/blog/2023-02-17-network.md",title:"Network Team Update",description:"High level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.865,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-02-17-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-17-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-10-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"Recently QA found a bug in P2P code, which results in busy loops. We added one\nfix to ",(0,o.kt)("inlineCode",{parentName:"p"},"1.35.6")," release, another one will likely be part of next release. The\nfirst one is already included in ",(0,o.kt)("inlineCode",{parentName:"p"},"ouroboros-network-0.3.0.1")," release. These\nbugs could only affect nodes which are out of sync and thus should not impose\nrisk on well maintained nodes on mainnet. We also advertise to deploy at most\none of the relays as a P2P node, which shields from possible consequences."),(0,o.kt)("p",null,"We recently finished design phase of eclipse evasion and we started\nimplementing it (see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?pane=issue&itemId=19819205"},"issue #3886")," for progress)."),(0,o.kt)("p",null,"Galois finished implementing Handshake extension which will allow to query\nnetwork protocol versions (see ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"pr #4256"),")."),(0,o.kt)("p",null,"We also recently released a newer set of network packages to be integrated with\n",(0,o.kt)("inlineCode",{parentName:"p"},"cardano-node")," ",(0,o.kt)("inlineCode",{parentName:"p"},"master")," branch, this includes:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"* monoidal-synchronisation-0.1.0.2\n* cardano-client-0.1.0.2\n* network-mux-0.3.0.0\n* ouroboros-network-api-0.1.0.0\n* ouroboros-network-protocols-0.2.0.0\n* ouroboros-network-testing-0.2.0.1\n* ouroboros-network-mock-0.1.0.0\n* ouroboros-network-framework-0.3.0.0\n* ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included\n in `0.3.0.1`)\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e8f5afda.eb7f2404.js b/assets/js/e8f5afda.eb7f2404.js new file mode 100644 index 00000000000..021adc17773 --- /dev/null +++ b/assets/js/e8f5afda.eb7f2404.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25540],{8990:a=>{a.exports=JSON.parse('{"label":"ledger","permalink":"/cardano-updates/tags/ledger","allTagsPath":"/cardano-updates/tags","count":30}')}}]); \ No newline at end of file diff --git a/assets/js/e90b2ff0.7fbed957.js b/assets/js/e90b2ff0.7fbed957.js new file mode 100644 index 00000000000..bb6f98ef823 --- /dev/null +++ b/assets/js/e90b2ff0.7fbed957.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[96840],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var a=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function l(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?n(Object(i),!0).forEach((function(t){r(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function o(e,t){if(null==e)return{};var i,a,r=function(e,t){if(null==e)return{};var i,a,r={},n=Object.keys(e);for(a=0;a<n.length;a++)i=n[a],t.indexOf(i)>=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)i=n[a],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var p=a.createContext({}),u=function(e){var t=a.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):l(l({},t),e)),i},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var i=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),h=u(i),d=r,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return i?a.createElement(c,l(l({ref:t},s),{},{components:i})):a.createElement(c,l({ref:t},s))}));function c(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=i.length,l=new Array(n);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[h]="string"==typeof e?e:r,l[1]=o;for(var u=2;u<n;u++)l[u]=i[u];return a.createElement.apply(null,l)}return a.createElement.apply(null,i)}d.displayName="MDXCreateElement"},99480:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>n,metadata:()=>o,toc:()=>u});var a=i(87462),r=(i(67294),i(3905));const n={title:"Mithril Team Update",slug:"2023-07-13-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-07-13-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-13-mithril.md",source:"@site/blog/2023-07-13-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-07-13T00:00:00.000Z",formattedDate:"July 13, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.92,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-07-13-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-14-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-07-12-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(h,(0,a.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,r.kt)("p",null,"The Mithril team created a new ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2327.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2327.0"))," distribution. They focused on preparing the beta launch on the ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet"),": they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the ",(0,r.kt)("inlineCode",{parentName:"p"},"mainnet")," infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library. "),(0,r.kt)("p",null,"Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs."),(0,r.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Released the new distribution ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2327.0"},(0,r.kt)("inlineCode",{parentName:"a"},"2327.0"))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,r.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add infrastructure monitoring")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/987"},"#987")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Deploy 'mainnet' infrastructure")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/988"},"#988")),(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Handle Secrets management")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/989"},"#989")))),(0,r.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,r.kt)("inlineCode",{parentName:"li"},"Benchmark performances of Mithril Aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/904"},"#904"),":",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Design & implement basic stress test tool for aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/991"},"#991")))),(0,r.kt)("li",{parentName:"ul"},"Worked on optimizations:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Remove certificate hash from Artifact")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/932"},"#932")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Check vulnerabilities in CI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1037"},"#1037")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add 'created_at' in Mithril Stake Distribution messages")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1030"},"#1030")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add a 'run-only' option in end to end test")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1048"},"#1048")))),(0,r.kt)("li",{parentName:"ul"},"Worked on refactoring:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Factorize protocol crypto operations")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/669"},"#669")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Refactor aggregator dependency injection and services")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1058"},"#1058")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Build static binaries in CI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/874"},"#874")))),(0,r.kt)("li",{parentName:"ul"},"Worked on documentation:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Prepare SPO on-boarding guide")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1049"},"#1049")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Add instructions to set firewall using iptables")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1040"},"#1040")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Update ufw command to set firewall on Mithril Signer installation instructions")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1041"},"#1041")))),(0,r.kt)("li",{parentName:"ul"},"Worked on bugs:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Aggregator does not detect certificate chain epoch gap")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/952"},"#952")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"'testing-preview' network does not create certificates")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1015"},"#1015")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"SQLite compatibility in aggregator")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/837"},"#837")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"Q&A followup fixes")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1035"},"#1035")),(0,r.kt)("li",{parentName:"ul"},"Completed the issue ",(0,r.kt)("inlineCode",{parentName:"li"},"E2E tests are flaky in CI")," ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1023"},"#1023"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e9310706.e46f5ee8.js b/assets/js/e9310706.e46f5ee8.js new file mode 100644 index 00000000000..1e8286021d4 --- /dev/null +++ b/assets/js/e9310706.e46f5ee8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[43363],{90133:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/performance-tracing/page/2","page":2,"postsPerPage":5,"totalPages":5,"totalCount":25,"previousPage":"/cardano-updates/tags/performance-tracing","nextPage":"/cardano-updates/tags/performance-tracing/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ea2603ff.ae5b22eb.js b/assets/js/ea2603ff.ae5b22eb.js new file mode 100644 index 00000000000..89eb936cebe --- /dev/null +++ b/assets/js/ea2603ff.ae5b22eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86326],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?n(Object(a),!0).forEach((function(t){l(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):n(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,l=function(e,t){if(null==e)return{};var a,r,l={},n=Object.keys(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=r.createContext({}),u=function(e){var t=r.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(o.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,o=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),d=u(a),h=l,c=d["".concat(o,".").concat(h)]||d[h]||m[h]||n;return a?r.createElement(c,i(i({ref:t},s),{},{components:a})):r.createElement(c,i({ref:t},s))}));function c(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,i=new Array(n);i[0]=h;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p[d]="string"==typeof e?e:l,i[1]=p;for(var u=2;u<n;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},28380:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>m,frontMatter:()=>n,metadata:()=>p,toc:()=>u});var r=a(87462),l=(a(67294),a(3905));const n={title:"Ledger Team Update",slug:"2023-11-08-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-11-08-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-08-ledger.md",source:"@site/blog/2023-11-08-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-11-08T00:00:00.000Z",formattedDate:"November 8, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.685,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-11-08-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-11-09-db-sync"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-08-mithril"}},o={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway",id:"conway",level:3},{value:"Testing",id:"testing",level:3},{value:"Improvements and releasing",id:"improvements-and-releasing",level:3}],s={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,l.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,l.kt)("p",null,"This update contains mostly improvements to quality of Conway era implementation and\ntooling that we use for testing Ledger. Major Conway bugs that were discovered and\nsquashed are:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"PParamsUpdate proposals will now correctly use DRep thresholds for ratification"),(0,l.kt)("li",{parentName:"ul"},"Treasury withdrawals are now properly enacted."),(0,l.kt)("li",{parentName:"ul"},"Corrected snapshotting and DRep Stake Distribution Pulser initialization"),(0,l.kt)("li",{parentName:"ul"},"Delegation to non-existent Stake pool is no longer possible")),(0,l.kt)("p",null,"Other important quality of life improvements are addition of reusable interfaces for an\nordered set ",(0,l.kt)("inlineCode",{parentName:"p"},"OSet")," and ordered map ",(0,l.kt)("inlineCode",{parentName:"p"},"OMap"),". Which allowed us to disable duplicate\ncertificates and proposals in a transaction. As a precursor to ",(0,l.kt)("inlineCode",{parentName:"p"},"PlutusV3")," integration, a\nserious reorganization of Plutus related functionality was performed."),(0,l.kt)("p",null,"Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on\nexpired proposals, addition of Anchor to Constitutional Committee resignation proposals."),(0,l.kt)("p",null,'Significant improvements have been made to a specialized "Imp" test library that allows us\nwriting concise stateful unit tests for verifying the Ledger logic. Serious progress has\nbeen made on the conformance testing, where we can now interface with Haskell generated\ncode from the Agda specification. Serialization testing has been extended to increase\nbinary conformance coverage.'),(0,l.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,l.kt)("h3",{id:"conway"},"Conway"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3808"},"pull-3808")," - Enhance ",(0,l.kt)("inlineCode",{parentName:"li"},"CommitteeMembersState")," query to return quorum and NoConfidence"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3801"},"pull-3801")," - Fix epoch rule and tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3803"},"pull-3803")," - Fix delegation validation"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3759"},"pull-3759")," - Reshuffle things to the DRepPulser incorporates some snap shot things"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3779"},"pull-3779")," - Prevent duplicate certs and proposals"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3794"},"pull-3794")," - Added anchor to resign certs"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3797"},"pull-3797")," - Cleanup JSON instances for Conway governance"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3848"},"pull-3848")," - Plutus modules restructure"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3840"},"pull-3840")," - Fix anomalies in Deposits in the Conway Era"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3856"},"pull-3856")," - Add governance related ledger events"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3825"},"pull-3825")," - Prevent voting on expired GovActions"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3831"},"pull-3831")," - Treasury withdrawal fix"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3791"},"pull-3791")," - Use a Data.OMap.Strict to replace ProposalsSnapshot"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3836"},"pull-3836")," - PParamsUpdate enactment fix"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3846"},"pull-3846")," - Revert argument order swap.")),(0,l.kt)("h3",{id:"testing"},"Testing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3782"},"pull-3782")," - Move ",(0,l.kt)("inlineCode",{parentName:"li"},"ImpTest")," to Shelley testlib"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3842"},"pull-3842")," - Imp improvements"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3844"},"pull-3844")," - Add mappings to Agda types"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3853"},"pull-3853")," - Fix strange assertion failure, which hides real Block too big problem."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3809"},"pull-3809")," - CDDL roundtrip testing"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3832"},"pull-3832")," - Treasury withdrawals tests"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3839"},"pull-3839")," - Added ",(0,l.kt)("inlineCode",{parentName:"li"},"cardano-ledger-conformance")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3841"},"pull-3841")," - Add ",(0,l.kt)("inlineCode",{parentName:"li"},"sha256")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"cardano-ledger-executable-spec"))),(0,l.kt)("h3",{id:"improvements-and-releasing"},"Improvements and releasing"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3843"},"pull-3843")," - Add ...WithLogs versions of evalScripts and friends"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3795"},"pull-3795")," - Bump plutus to 1.15"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3798"},"pull-3798")," - Bump urllib3 from 1.26.17 to 1.26.18 in /doc"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3799"},"pull-3799")," - Changes needed for 8.6 release"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3807"},"pull-3807")," - Add invalidBeforeL and invalidHereAfterL functions"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3819"},"pull-3819")," - Fixups needed for a release"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3829"},"pull-3829")," - Post release CHANGELOG version bumps"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3830"},"pull-3830")," - Bump aeson to 2.2"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3833"},"pull-3833")," - Backport release cardano-ledger-conway-1.10.1.0"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3828"},"pull-3828")," - Add changelog for node release 8.6")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ea5726b6.2672f5db.js b/assets/js/ea5726b6.2672f5db.js new file mode 100644 index 00000000000..7c65c2e73ea --- /dev/null +++ b/assets/js/ea5726b6.2672f5db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35846],{88675:a=>{a.exports=JSON.parse('{"label":"cip1694","permalink":"/cardano-updates/tags/cip-1694","allTagsPath":"/cardano-updates/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/ea7f8016.7c07b525.js b/assets/js/ea7f8016.7c07b525.js new file mode 100644 index 00000000000..12ebaf104be --- /dev/null +++ b/assets/js/ea7f8016.7c07b525.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67820],{35602:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/consensus/page/4","page":4,"postsPerPage":5,"totalPages":7,"totalCount":32,"previousPage":"/cardano-updates/tags/consensus/page/3","nextPage":"/cardano-updates/tags/consensus/page/5","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ea84a009.36271ad3.js b/assets/js/ea84a009.36271ad3.js new file mode 100644 index 00000000000..e72579c3457 --- /dev/null +++ b/assets/js/ea84a009.36271ad3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92501],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=n,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?a.createElement(h,i(i({ref:t},s),{},{components:r})):a.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},602:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Crypto Team Update",slug:"2023-03-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-03-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-crypto.md",source:"@site/blog/2023-03-03-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:1.155,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-03-03-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-03-08-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-03-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"cardano-base",id:"cardano-base",level:3},{value:"KES agent",id:"kes-agent",level:3},{value:"Sidechains",id:"sidechains",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit."),(0,n.kt)("li",{parentName:"ul"},"cardano-base: BLS branch is now ready for review. We are workign forward its merge. "),(0,n.kt)("li",{parentName:"ul"},"KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase."),(0,n.kt)("li",{parentName:"ul"},"Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Bumped to version ",(0,n.kt)("a",{parentName:"li",href:"https://crates.io/crates/kes-summed-ed25519/0.2.0"},"0.2.0")," the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using ",(0,n.kt)("inlineCode",{parentName:"li"},"mlock"),"."),(0,n.kt)("li",{parentName:"ul"},"Opened ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/783"},"PR#783")," to update dependency"),(0,n.kt)("li",{parentName:"ul"},"Improved testing for batch opening of mtree, ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/773"},"PR#773")),(0,n.kt)("li",{parentName:"ul"},"Improved testing for batch verification of STM sigs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/774"},"PR#774")),(0,n.kt)("li",{parentName:"ul"},"RFP for crypto audit almost ready.")),(0,n.kt)("h3",{id:"cardano-base"},"cardano-base"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"BLS12-381 branch finally ready for review ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/266"},"PR#266"))),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("p",null,"Team off for one week. Other progress:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Learning about raw direct-bearer abstraction. An interface for sockets in consensus."),(0,n.kt)("li",{parentName:"ul"},"use that for direct ser/deser"),(0,n.kt)("li",{parentName:"ul"},"written those syntaxes for ouroboros (coming PR)"),(0,n.kt)("li",{parentName:"ul"},"the kes agent will depend on that. \t")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("p",null,"Progress with familiarisation of Halo2 library to write circuits."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eab6de32.8354251c.js b/assets/js/eab6de32.8354251c.js new file mode 100644 index 00000000000..9838187ac04 --- /dev/null +++ b/assets/js/eab6de32.8354251c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[7891],{80771:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/consensus/page/6","page":6,"postsPerPage":5,"totalPages":7,"totalCount":32,"previousPage":"/cardano-updates/tags/consensus/page/5","nextPage":"/cardano-updates/tags/consensus/page/7","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/eac6bb0a.1aa24d10.js b/assets/js/eac6bb0a.1aa24d10.js new file mode 100644 index 00000000000..a1862270c14 --- /dev/null +++ b/assets/js/eac6bb0a.1aa24d10.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87445],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},97940:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>s,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2022-11-16-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2022-11-16-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-16-node-cli-api.md",source:"@site/blog/2022-11-16-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2022-11-16T00:00:00.000Z",formattedDate:"November 16, 2022",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:.68,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2022-11-16-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-16-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2022-11-16-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3}],c={toc:u},d="wrapper";function s(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2022-11-16---2022-11-29"},"2022-11-16 - 2022-11-29"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("h2",{id:"completed"},"Completed"),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4562"},"Add a native tokens tutorial and exercises"))),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4674"},"Update cardano-cli's help")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4644"},"Remove error calls in renderShelleyTxCmdError"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4639"},"Implement Cardano.Api.DeserialiseAnyOf"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4650"},"Fix windows CI"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("h2",{id:"in-progress"},"In Progress"),(0,r.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"[BUGFIX]","- ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4431"},"Infer protocol params in transaction build")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4408"},"Allow assembling transactions with no witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4279"},"Multiple pools support in query stake snapshot")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4250"},"Optimise query leadership schedule command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4179"},"Optimise query stake snapshot command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli"))),(0,r.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4458"},"Make TxBodyContent an instance of Monoid")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions"))),(0,r.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eac9cf07.e77df8c6.js b/assets/js/eac9cf07.e77df8c6.js new file mode 100644 index 00000000000..6131a8c40dd --- /dev/null +++ b/assets/js/eac9cf07.e77df8c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[59037],{89207:a=>{a.exports=JSON.parse('{"label":"sre","permalink":"/cardano-updates/quarterly/tags/sre","allTagsPath":"/cardano-updates/quarterly/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/eb0e2fb1.07255769.js b/assets/js/eb0e2fb1.07255769.js new file mode 100644 index 00000000000..75fdbd9db6e --- /dev/null +++ b/assets/js/eb0e2fb1.07255769.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[80622],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=p(r),d=n,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||i;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,l=new Array(i);l[0]=d;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var p=2;p<i;p++)l[p]=r[p];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},19040:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-08-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-08-17-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-17-crypto.md",source:"@site/blog/2023-08-17-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-08-17T00:00:00.000Z",formattedDate:"August 17, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.65,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-08-17-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-08-18-sre"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-08-17-db-sync"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Mithril",id:"mithril",level:3},{value:"MuSig2",id:"musig2",level:3},{value:"Sidechains",id:"sidechains",level:3},{value:"KES agent",id:"kes-agent",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation"),(0,n.kt)("li",{parentName:"ul"},"mithril: Full node verifier"),(0,n.kt)("li",{parentName:"ul"},"musig2: Include MuSig2 description in cryptography handbook"),(0,n.kt)("li",{parentName:"ul"},"kes_agent: Finilising test and CI. Working on KES binary")),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"mithril"},"Mithril"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Full Node Verifier merged ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"),".")),(0,n.kt)("h3",{id:"musig2"},"MuSig2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Started describing MuSig2 to include it as part of the cryptography handbook ")),(0,n.kt)("h3",{id:"sidechains"},"Sidechains"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/alexandroszacharakis8/halo2/tree/iquerejeta"},"this")," fork.")),(0,n.kt)("h3",{id:"kes-agent"},"KES agent"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"KES agent is ready:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"CI ready ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/19"},"#19")),(0,n.kt)("li",{parentName:"ul"},"Receipt confirmation message ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/20"},"#20")),(0,n.kt)("li",{parentName:"ul"},"KES agent binary ready ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/21"},"#21")),(0,n.kt)("li",{parentName:"ul"},"Control client implemented ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/11"},"#11"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ebf8adea.dcda8491.js b/assets/js/ebf8adea.dcda8491.js new file mode 100644 index 00000000000..718dcb891b0 --- /dev/null +++ b/assets/js/ebf8adea.dcda8491.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54669],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var a=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?n(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):n(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,i=function(e,t){if(null==e)return{};var r,a,i={},n=Object.keys(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a<n.length;a++)r=n[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),d=i,c=h["".concat(p,".").concat(d)]||h[d]||m[d]||n;return r?a.createElement(c,o(o({ref:t},u),{},{components:r})):a.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:i,o[1]=l;for(var s=2;s<n;s++)o[s]=r[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},45668:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=r(87462),i=(r(67294),r(3905));const n={title:"Mithril Team Update",slug:"2023-05-17-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-05-17-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-17-mithril.md",source:"@site/blog/2023-05-17-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-05-17T00:00:00.000Z",formattedDate:"May 17, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.555,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-05-17-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-05-17-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-17-performance-and-tracing"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(h,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,i.kt)("p",null,"The Mithril team released a new ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2318.0"},(0,i.kt)("inlineCode",{parentName:"a"},"2318.0"))," distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types."),(0,i.kt)("p",null,"Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node ",(0,i.kt)("inlineCode",{parentName:"p"},"8.0.0")," (along with the backward compatibility for previous ",(0,i.kt)("inlineCode",{parentName:"p"},"1.35.x")," versions)."),(0,i.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that designs and implements generic signing/verification of entity services ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the handling of multiple types of signed entity in the aggregator runtime ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/907"},"#907")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the signer runtime to use the signable builder service ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/854"},"#854")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the aggregator runtime to use the artifact builder service ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/869"},"#869")),(0,i.kt)("li",{parentName:"ul"},"Completed the appending of the next AVK to all protocol messages ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/888"},"#888")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/893"},"#893")),(0,i.kt)("li",{parentName:"ul"},"Completed the adaptation of the explorer to handle new artifact routes of the aggregator ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/927"},"#927")))),(0,i.kt)("li",{parentName:"ul"},"Worked on the epic that implements the computation of the stake distribution for ",(0,i.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/880"},"#880"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Completed the implementation of the new stake distribution computation in the chain observer ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/919"},"#919")),(0,i.kt)("li",{parentName:"ul"},"Worked on upgrading the Cardano node to ",(0,i.kt)("inlineCode",{parentName:"li"},"8.0.0")," ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/920"},"#920"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ec06fa8a.8d919f1b.js b/assets/js/ec06fa8a.8d919f1b.js new file mode 100644 index 00000000000..d368c26516f --- /dev/null +++ b/assets/js/ec06fa8a.8d919f1b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46271],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>k});var n=a(67294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function i(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function p(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?i(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function l(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},i=Object.keys(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)a=i[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var o=n.createContext({}),u=function(t){var e=n.useContext(o),a=e;return t&&(a="function"==typeof t?t(e):p(p({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(o.Provider,{value:e},t.children)},m="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,i=t.originalType,o=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),m=u(a),h=r,k=m["".concat(o,".").concat(h)]||m[h]||d[h]||i;return a?n.createElement(k,p(p({ref:e},c),{},{components:a})):n.createElement(k,p({ref:e},c))}));function k(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=a.length,p=new Array(i);p[0]=h;var l={};for(var o in e)hasOwnProperty.call(e,o)&&(l[o]=e[o]);l.originalType=t,l[m]="string"==typeof t?t:r,p[1]=l;for(var u=2;u<i;u++)p[u]=a[u];return n.createElement.apply(null,p)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},1091:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>p,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-10-10-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},p="Node-Api-Cli Update",l={permalink:"/cardano-updates/2023-10-10-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-10-node-cli-api.md",source:"@site/blog/2023-10-10-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-10-10T00:00:00.000Z",formattedDate:"October 10, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.985,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-10-10-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-10-11-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-06-hydra"}},o={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-09-27---2023-10-10"},"2023-09-27 - 2023-10-10"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"CARDANO-NODE"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.5.0-pre"},"Pre-release of cardano-node 8.5.0-pre"))),(0,r.kt)("p",null,"CARDANO-CLI"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Depracated governance query commands and moved all governance related queries to ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-cli <era> query")),(0,r.kt)("li",{parentName:"ul"},"Drep registration certificates now allow to include an anchor"),(0,r.kt)("li",{parentName:"ul"},"Integrated Drep retirement ceriticates"),(0,r.kt)("li",{parentName:"ul"},"clean up of Drep registration certificates.")),(0,r.kt)("p",null,"CARDANO-API"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Add support for committee hot key witnesses"),(0,r.kt)("li",{parentName:"ul"},"Require conway onwards for voting"),(0,r.kt)("li",{parentName:"ul"},"Conway drep registration: expose ledger anchor parameter"),(0,r.kt)("li",{parentName:"ul"},"Add certs to txbody of Conway transactions")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/347"},"Move ",(0,r.kt)("inlineCode",{parentName:"a"},"governance query")," commands to ",(0,r.kt)("inlineCode",{parentName:"a"},"query")," command group")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/344"},"Rename create-new-committee into update-committee")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/341"},"New version cardano-cli-8.12.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/338"},"Add support for committee hot key witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/337"},"conway governance vote create: make it possible to use cc hot keys")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/331"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.11.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/330"},"Drep certification registration: add parameters for anchor")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/329"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.25.0.1"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/327"},"Move files that are not golden files into ",(0,r.kt)("inlineCode",{parentName:"a"},"input")," directory")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/324"},"Update to cardano-api-8.24")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/323"},"Fix #311 - Add Cold Committee Key text envelope")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/322"},"create-poll, answer-poll, verify-poll: move to 'babbage governance' block")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/320"},"Update to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.23.1.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/319"},"Make ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction view")," emit JSON")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/318"},"Tidy up query command structure")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/317"},"Use ",(0,r.kt)("inlineCode",{parentName:"a"},"caseShelleyToBabbageOrConwayEraOnwards")," from ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/316"},"Add DRep Retirement Certificate command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/310"},"Update to cardano api 8.22.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/309"},"drep registration-certificate: remove mix with SPO registration"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/307"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"EraCast")," instance for ",(0,r.kt)("inlineCode",{parentName:"a"},"Certificate"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/306"},"Add certs to txbody of Conway transactions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/305"},"Move DRep reg certificate anchor types from cardano-cli to cardano-api")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/304"},"Add BabbageEraOnly")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/303"},"New version cardano-api-8.25.2.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/300"},"Add support for committee hot key witnesses")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/299"},"Reduce constraint usage with eons")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/297"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"withShelleyBasedEraConstraintsForLedger"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/296"},"Simplify ",(0,r.kt)("inlineCode",{parentName:"a"},"DebugLedgerState")," with eons")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/294"},"New version cardano-api-8.25.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/293"},"Require conway onwards for voting")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/292"},"Add witness committee cold key")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/291"},"Fix CHaP failure due to haddock issue")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/290"},"Amend cardano-api/pull/284 to use ReexposeLedger")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/289"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEraInEon")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"EraInEon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/288"},"Release 8.24.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/287"},"Parameterize ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEraInEon"),". Add ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/286"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.23.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/284"},"conway drep registration: expose ledger anchor parameter")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/282"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"caseAlonzoOnlyOrBabbageEraOnwards")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"alonzoEraOnlyToAlonzoEraOnwards")," functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/281"},"Rename eon functions")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/280"},"New ",(0,r.kt)("inlineCode",{parentName:"a"},"AnyEraInEon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/279"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"ValidityLowerBoundSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/278"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"TxExtraKeyWitnessesSupportedInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/277"},"Explicit pattern match on all ledger certificates constructors. Remove redundant module")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/276"},"Release 8.22.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/275"},"Replace ",(0,r.kt)("inlineCode",{parentName:"a"},"TxTotalAndReturnCollateralSupportedInEra")))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5490"},"Integrate upstream libraries for 8.5"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5497"},"bump cardano-api to 8.25.2")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5491"},"Remove unused code in cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5490"},"Integrate upstream libraries for 8.5"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ec344652.83a054ec.js b/assets/js/ec344652.83a054ec.js new file mode 100644 index 00000000000..c2f5d0129d2 --- /dev/null +++ b/assets/js/ec344652.83a054ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[68580],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||i;return r?n.createElement(h,o(o({ref:t},s),{},{components:r})):n.createElement(h,o({ref:t},s))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<i;p++)o[p]=r[p];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},13231:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const i={title:"Crypto Team Update",slug:"2023-07-07-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-07-07-crypto",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-crypto.md",source:"@site/blog/2023-07-07-crypto.md",title:"Crypto Team Update",description:"High level summary",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"crypto",permalink:"/cardano-updates/tags/crypto"}],readingTime:.795,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Crypto Team Update",slug:"2023-07-07-crypto",authors:"iquerejeta",tags:["crypto"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-07-12-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-07-07-goedel"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"kes_agent",id:"kes_agent",level:3},{value:"Mithril",id:"mithril",level:3},{value:"Sidechains",id:"sidechains",level:3},{value:"CIPs and community",id:"cips-and-community",level:3}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The open fronts that the crypto team is working on are:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Sidechains: First version of snark-based ATMS"),(0,a.kt)("li",{parentName:"ul"},"mithril: Full node verifier"),(0,a.kt)("li",{parentName:"ul"},"kes_agent: Keep progress, and prepare CIP and CPS"),(0,a.kt)("li",{parentName:"ul"},"CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP")),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("h3",{id:"kes_agent"},"kes_agent"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"KES Agent CIP/CSP. Preparing documents. Will become public in the future."),(0,a.kt)("li",{parentName:"ul"},"KES Agent testsuite (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/kes-agent/issues/14"},"https://github.com/input-output-hk/kes-agent/issues/14"),")"),(0,a.kt)("li",{parentName:"ul"},"RawBearer abstraction in ouroboros-network-framework (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4395"},"https://github.com/input-output-hk/ouroboros-network/pull/4395"),")"),(0,a.kt)("li",{parentName:"ul"},"Maintaining required changes to cardano-base for KES Agent (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-base/pull/317"},"https://github.com/input-output-hk/cardano-base/pull/317"),")")),(0,a.kt)("h3",{id:"mithril"},"Mithril"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Final review of the implementation of Full Node Verifier ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/pull/939"},"#939"),".\nIncluded benchmarks and further tests.")),(0,a.kt)("h3",{id:"sidechains"},"Sidechains"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Schnorr signature implemented"),(0,a.kt)("li",{parentName:"ul"},"ATMS signature implemented"),(0,a.kt)("li",{parentName:"ul"},"First benchmarks show that for the committe size we expect, we need 2^21 constraints. ")),(0,a.kt)("h3",{id:"cips-and-community"},"CIPs and community"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Addressed some review comments in ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/506"},"#PR506")),(0,a.kt)("li",{parentName:"ul"},"Worked with the communityt on ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/524"},"#PR524")," to include Keccak as part of the next Plutus release.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ec53298b.c7e575ce.js b/assets/js/ec53298b.c7e575ce.js new file mode 100644 index 00000000000..b5c21c16f5c --- /dev/null +++ b/assets/js/ec53298b.c7e575ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[21129],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(s,".").concat(m)]||p[m]||d[m]||i;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:a,o[1]=l;for(var c=2;c<i;c++)o[c]=n[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},94656:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-04-05-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-04-05-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-performance-and-tracing.md",source:"@site/blog/2023-04-05-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.",date:"2023-04-05T00:00:00.000Z",formattedDate:"April 5, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.33,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-04-05-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-04-05-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-31-crypto"}},s={authorsImageUrls:[void 0]},c=[{value:"General",id:"general",level:3},{value:"Plutus library",id:"plutus-library",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We worked on adjusting our infrastructure to the new ",(0,a.kt)("inlineCode",{parentName:"li"},"8.0")," release branch and performed a (very) early run."),(0,a.kt)("li",{parentName:"ul"},"New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.")),(0,a.kt)("h1",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"We have adapted our benchmarking cluster to the requirements of the ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0")," release branch. Testing runs of a very early feature branch for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0"),"\nhelped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for ",(0,a.kt)("inlineCode",{parentName:"p"},"8.0")," soon."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very\ndetailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing\nthe highest possible throughput of data for forwarding to ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer"),". "),(0,a.kt)("p",null,"Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions\nfor tunneling trace forwarding from a node to ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-tracer")," via an easy to manage system service, which will match the production setup of most users."),(0,a.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,a.kt)("h3",{id:"general"},"General"),(0,a.kt)("p",null,"Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance\nanalysis can be fed back and serve as an additional point of comparison."),(0,a.kt)("p",null,"Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations."),(0,a.kt)("h3",{id:"plutus-library"},"Plutus library"),(0,a.kt)("p",null,"We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles.\nThis will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile.\nIt is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is\nbeing improved to minimize any friction for the backend user."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ed730a1d.19e36255.js b/assets/js/ed730a1d.19e36255.js new file mode 100644 index 00000000000..5c1cff1ba06 --- /dev/null +++ b/assets/js/ed730a1d.19e36255.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[61137],{87638:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/consensus/page/5","page":5,"postsPerPage":5,"totalPages":7,"totalCount":32,"previousPage":"/cardano-updates/tags/consensus/page/4","nextPage":"/cardano-updates/tags/consensus/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ed930750.a3d3ae4d.js b/assets/js/ed930750.a3d3ae4d.js new file mode 100644 index 00000000000..be3dde99370 --- /dev/null +++ b/assets/js/ed930750.a3d3ae4d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[23318],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=a,h=d["".concat(l,".").concat(m)]||d[m]||p[m]||r;return n?o.createElement(h,s(s({ref:t},u),{},{components:n})):o.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,s=new Array(r);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c<r;c++)s[c]=n[c];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},64185:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var o=n(87462),a=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2023-05-03-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-05-03-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-03-consensus.md",source:"@site/blog/2023-05-03-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-05-03T00:00:00.000Z",formattedDate:"May 3, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.755,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-05-03-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-05-04-mithril"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-05-03-performance-and-tracing"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Fostering collaboration",id:"fostering-collaboration",level:2}],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"During the past two weeks we made some important progress in the Genesis design.\nIt seems the ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch")," logic need not be modified for Genesis, although this\nneeds to be confirmed. We started a DoS mitigation handbook and updated our\nconceptual component diagram to guide the Genesis design. We engaged with the\nIOG researchers to work on the Limit on Patience attack vector, work in this\narea is still ongoing. We sketched a design to decouple the CPU load of the node\nfrom its responsiveness to the socket. Finally, we discussed with Networking our\napproach to lower the performance impact of the BlockFetch decision logic, and\ngot green light from them."),(0,a.kt)("p",null,"We migrated the consensus code to a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus"},"new\nrepository"),", splitting\nit from the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," repository, and released version 0.6 of\nConsensus."),(0,a.kt)("p",null,"We also merged the mempool fairness improvement to main branch."),(0,a.kt)("p",null,"Another significant enhancement to our documentation was the addition of an\nexplanation of the hardfork combinator forecast horizon."),(0,a.kt)("p",null,"See the sections below for more details."),(0,a.kt)("h2",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"We reviewed the ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch")," design documentation, and added some source-code\ncomments that emphasize certain properties of the decisions the ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch"),"\nlogic makes that are helping us confirm that Genesis does not require any\nchanges to ",(0,a.kt)("inlineCode",{parentName:"p"},"BlockFetch"),". We are waiting on input from our former system\narchitect to verify this."),(0,a.kt)("p",null,"We migrated and updated the conceptual component diagram in the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),"\nrepository which helps us situate the Genesis design and argument."),(0,a.kt)("p",null,"We engaged with the IOG researchers about the Genesis design. We sketched out a\nway to address the concern that the Limit on Patiente (LoP) attack vector duty\ncycle is indeed low, but it's still non-trivial to ultimately conclude it's\nsufficiently low."),(0,a.kt)("p",null,"We also sketched a design to decouple the CPU load of the node from its\nresponsiveness to the socket, since the LoP is a relatively tight timeout, and\nnode performance bugs inducing seconds-worth of latency are unfortunately\nfamiliar phenomena."),(0,a.kt)("h2",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/62"},"added an\nexplanation")," of\na question that we had to explain many times about the exact behavior of the\nhardfork combinator forecast horizon."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ed99d55f.e3582b94.js b/assets/js/ed99d55f.e3582b94.js new file mode 100644 index 00000000000..1924d6d5fc8 --- /dev/null +++ b/assets/js/ed99d55f.e3582b94.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[65318],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),s=u(a),m=n,c=s["".concat(p,".").concat(m)]||s[m]||h[m]||i;return a?r.createElement(c,o(o({ref:t},d),{},{components:a})):r.createElement(c,o({ref:t},d))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},73437:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-10-27-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-27-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-27-hydra.md",source:"@site/blog/2023-10-27-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-10-27T00:00:00.000Z",formattedDate:"October 27, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.895,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-10-27-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-11-01-mithril"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-10-27-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:3},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:3},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:3}],d={toc:u},s="wrapper";function h(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h3",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team fixed the ",(0,n.kt)("inlineCode",{parentName:"p"},"gen-hydra-keys")," command to avoid\noverwriting existing keys, and resolved issues related to the rewritten\n",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-tui"),'. They also worked on a \\"dirt road\\" implementation for the\n\\"Ignored init tx\\" notification, improving the robustness of the system.'),(0,n.kt)("p",null,"The team finalized preparations for the Cardano Summit presentation, including\nimplementation of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-poll")," example DApp."),(0,n.kt)("p",null,'If you happen to read this and attend the Summit in Dubai, make sure to check\nout our Masterclass about \\"Developing Hydra + Mithril for Scaling Cardano\\" on\nFriday, November 3 at 14:00-15:30 local time in the \\"Al Dar\\" room!'),(0,n.kt)("h3",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"gen-hydra-keys")," command to not overwrite existing keys\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1136"},"#1136")),(0,n.kt)("li",{parentName:"ul"},"Fixed the rewritten ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-tui"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1113"},"#1113"),(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1137"},"#1137")),(0,n.kt)("li",{parentName:"ul"},"Finalized cardano summit preparation\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1109"},"#1109")),(0,n.kt)("li",{parentName:"ul"},"Implemented the ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-poll")," example DApp ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-scaling/hydra-poll"},"link to\nrepository")),(0,n.kt)("li",{parentName:"ul"},'Dirt road implementation for \\"Ignored init tx\\" notification\n',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/529"},"#529"))),(0,n.kt)("h3",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Attend cardano summit and deliver presentation"),(0,n.kt)("li",{parentName:"ul"},"Clarify / close user created issues"),(0,n.kt)("li",{parentName:"ul"},"Build ",(0,n.kt)("inlineCode",{parentName:"li"},"aarch64-darwin")," binaries in CI")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eda7cf83.e9a49dd3.js b/assets/js/eda7cf83.e9a49dd3.js new file mode 100644 index 00000000000..4d15a473cf6 --- /dev/null +++ b/assets/js/eda7cf83.e9a49dd3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48423],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>d});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),h=p(a),m=n,d=h["".concat(u,".").concat(m)]||h[m]||c[m]||i;return a?r.createElement(d,o(o({ref:t},s),{},{components:a})):r.createElement(d,o({ref:t},s))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},10725:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-02-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-10-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-10-hydra.md",source:"@site/blog/2023-02-10-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-10T00:00:00.000Z",formattedDate:"February 10, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.14,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-02-17-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-09-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},h="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,'This week, the Hydra team closed several gaps to align the Hydra scripts\nimplementation further with the specification. This also resulted in a slight\nimprovement on Hydra script size and costs. They consequently analysed the\nasymptotic complexity of collect and fanout and how they relate. Also plutus-tx\nprofiling toolchain was evaluated and set up for future improvements on Hydra\non-chain performance. In discussions with researchers and internal auditors,\nthey also uncovered next steps on further securing the Head protocl using a\n"full" minting policy.'),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Closed several gaps to align script implementation with specification ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/452"},"#452"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Allow contest only once ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/680"},"#680")),(0,n.kt)("li",{parentName:"ul"},"Optimization through head output at index 0 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/700"},"#700")),(0,n.kt)("li",{parentName:"ul"},"Value is preserved ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/702"},"#702")," + optimized exact value equality ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/709"},"#709")))),(0,n.kt)("li",{parentName:"ul"},"Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/721"},"#721"),(0,n.kt)("img",{parentName:"li",src:"https://user-images.githubusercontent.com/2621189/218124686-7a85b40d-12f7-4b00-ad16-128c99f5b707.png",alt:null})),(0,n.kt)("li",{parentName:"ul"},"Fixed our tooling around the Haskell language server"),(0,n.kt)("li",{parentName:"ul"},"Discussed full minting policy with researchers"),(0,n.kt)("li",{parentName:"ul"},"Started grooming \u201cwhat we need for mainnet\u201d on ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"this")," idea ticket and ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/milestone/8"},"milestone"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implement full minting policy"),(0,n.kt)("li",{parentName:"ul"},"All remaining protocol discrepancies are implemented or groomed as individual features"),(0,n.kt)("li",{parentName:"ul"},"Ideally release 0.9.0 with updated scripts"),(0,n.kt)("li",{parentName:"ul"},"Discuss what we need for mainnet (milestone planning)"),(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs for specification (upon feedback)")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/edca0251.665a94cd.js b/assets/js/edca0251.665a94cd.js new file mode 100644 index 00000000000..458ac537515 --- /dev/null +++ b/assets/js/edca0251.665a94cd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39066],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(r),m=a,h=d["".concat(c,".").concat(m)]||d[m]||u[m]||i;return r?n.createElement(h,o(o({ref:t},p),{},{components:r})):n.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var s=2;s<i;s++)o[s]=r[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},22704:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const i={title:"Performance & tracing update",slug:"2023-02-08-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-08-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-performance-and-tracing.md",source:"@site/blog/2023-02-08-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-02-08T00:00:00.000Z",formattedDate:"February 8, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.445,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2023-02-08-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-08-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-03-crypto"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions."),(0,a.kt)("li",{parentName:"ol"},"Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks."),(0,a.kt)("li",{parentName:"ol"},"New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node."),(0,a.kt)("li",{parentName:"ol"},"New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,"),(0,a.kt)("li",{parentName:"ul"},"after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,"),(0,a.kt)("li",{parentName:"ul"},"finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.")),(0,a.kt)("p",null,"In addition, we started benchmarks of the 1.35.6 release."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way."),(0,a.kt)("p",null,"Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders."),(0,a.kt)("p",null,"The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment."),(0,a.kt)("p",null,"The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ee0b7a59.f2d5e972.js b/assets/js/ee0b7a59.f2d5e972.js new file mode 100644 index 00000000000..0dd732f0e0f --- /dev/null +++ b/assets/js/ee0b7a59.f2d5e972.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26544],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},c),{},{components:n})):r.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var u=2;u<o;u++)s[u]=n[u];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},1679:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-07-26-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-07-26-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-26-consensus.md",source:"@site/blog/2023-07-26-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-07-26T00:00:00.000Z",formattedDate:"July 26, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:.85,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-07-26-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-07-27-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-21-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Genesis liaising",id:"genesis-liaising",level:3}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"db-sync")," team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now.\nWe also focused on completing tracing support for UTxO-HD in ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node"),".\nCurrently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further. "),(0,a.kt)("p",null,"The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"ChainSync")," client as part of the onboarding efforts for the team that will implement Genesis."),(0,a.kt)("p",null,"The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team."),(0,a.kt)("h3",{id:"genesis-liaising"},"Genesis liaising"),(0,a.kt)("p",null,"Improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"ChainSync")," client:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/222"},"#222"),"."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/233"},"#233"),".")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ee94a44f.72450e08.js b/assets/js/ee94a44f.72450e08.js new file mode 100644 index 00000000000..cee87d4e223 --- /dev/null +++ b/assets/js/ee94a44f.72450e08.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[56815],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),c=n,d=h["".concat(s,".").concat(c)]||h[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},6855:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-12-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-12-15-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-15-mithril.md",source:"@site/blog/2022-12-15-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2022-12-15T00:00:00.000Z",formattedDate:"December 15, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.11,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2022-12-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-16-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-12-14-consensus"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team has released the new distribution ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2248.1"},(0,n.kt)("inlineCode",{parentName:"a"},"2248.1"))," of their nodes. They have published the first version of the Mithril cryptographic library on ",(0,n.kt)("a",{parentName:"p",href:"https://crates.io/crates/mithril-stm"},(0,n.kt)("inlineCode",{parentName:"a"},"crates.io")),", the Rust community\u2019s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots."),(0,n.kt)("p",null,"Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Implemented removing verification key and stake from single signatures ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/619"},"#619")),(0,n.kt)("li",{parentName:"ul"},"Completed the extraction of the signer registration from the multi-signer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/642"},"#642")),(0,n.kt)("li",{parentName:"ul"},"Completed the extraction of the certificate creation from the multi-signer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/638"},"#638")),(0,n.kt)("li",{parentName:"ul"},"Implemented a workflow to test client binaries (Linux / MacOS / Windows) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/601"},"#601")),(0,n.kt)("li",{parentName:"ul"},"Completed the signature of the artifacts produced by the CI ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/587"},"#587")),(0,n.kt)("li",{parentName:"ul"},"Fixed the protocol parameters transition ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/627"},"#627")),(0,n.kt)("li",{parentName:"ul"},"Worked on optimizing the snapshot digest computation ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/510"},"#510")),(0,n.kt)("li",{parentName:"ul"},"Worked on enforcing the API protocol versions in the client and signer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/633"},"#633")),(0,n.kt)("li",{parentName:"ul"},"Worked on deactivating the non certified signer registration mode ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/621"},"#621")),(0,n.kt)("li",{parentName:"ul"},"Worked on the re-genesis of the test networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/651"},"#651"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ef2b1d07.41206daf.js b/assets/js/ef2b1d07.41206daf.js new file mode 100644 index 00000000000..52199cf98d2 --- /dev/null +++ b/assets/js/ef2b1d07.41206daf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70729],{91102:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/hydra/page/3","page":3,"postsPerPage":5,"totalPages":11,"totalCount":55,"previousPage":"/cardano-updates/tags/hydra/page/2","nextPage":"/cardano-updates/tags/hydra/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/ef2b6a3f.276cebb0.js b/assets/js/ef2b6a3f.276cebb0.js new file mode 100644 index 00000000000..b3c8c79ee42 --- /dev/null +++ b/assets/js/ef2b6a3f.276cebb0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1338],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(h,s(s({ref:t},u),{},{components:n})):r.createElement(h,s({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c<o;c++)s[c]=n[c];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},50818:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={title:"DB-sync Team Update",slug:"2022-12-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-12-14-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-db-sync.md",source:"@site/blog/2022-12-14-db-sync.md",title:"DB-sync Team Update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.73,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB-sync Team Update",slug:"2022-12-14-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-12-14-consensus"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-14-node-cli-api"}},l={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DBSync team continued testing release ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.0"),". The QA team has reported that no issues have\nbeen found. The DBSync team also worked on cherry-picks back to master and on fixing bugs."),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Release is cherry-picked back to master, which uses the new rollback mechanism which uses\nreverse indexes, same as the release\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1320"},"#1320"),"\nThis also fixes a bug number of issues on master."),(0,a.kt)("li",{parentName:"ul"},"Depenencies upgrade and CHaP integration\n",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1324"},"#1324")),(0,a.kt)("li",{parentName:"ul"},"AdaPots fix ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-db-sync/pull/1323"},"#1323"),". This\nfixes an issue where the per epoch AdaPots didn't match the epoch boundary, but\nthey also included changes from the first block of the epoch."),(0,a.kt)("li",{parentName:"ul"},"Deposits Event fix ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3212"},"#3212"),". This pr\nadjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the\nnumber of queries that db-sync does during syncing an make syncing faster.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ef4801f7.5d3fc9af.js b/assets/js/ef4801f7.5d3fc9af.js new file mode 100644 index 00000000000..b86b7499094 --- /dev/null +++ b/assets/js/ef4801f7.5d3fc9af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75394],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(r),m=a,h=d["".concat(c,".").concat(m)]||d[m]||u[m]||i;return r?n.createElement(h,o(o({ref:t},p),{},{components:r})):n.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var s=2;s<i;s++)o[s]=r[s];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},45443:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const i={title:"Performance & tracing update",slug:"2023-02-08-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-08-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-performance-and-tracing.md",source:"@site/blog/2023-02-08-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2023-02-08T00:00:00.000Z",formattedDate:"February 8, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.445,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2023-02-08-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-08-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-02-03-crypto"}},c={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],p={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions."),(0,a.kt)("li",{parentName:"ol"},"Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks."),(0,a.kt)("li",{parentName:"ol"},"New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node."),(0,a.kt)("li",{parentName:"ol"},"New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,"),(0,a.kt)("li",{parentName:"ul"},"after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,"),(0,a.kt)("li",{parentName:"ul"},"finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.")),(0,a.kt)("p",null,"In addition, we started benchmarks of the 1.35.6 release."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way."),(0,a.kt)("p",null,"Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders."),(0,a.kt)("p",null,"The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment."),(0,a.kt)("p",null,"The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ef4f60e7.f66551bc.js b/assets/js/ef4f60e7.f66551bc.js new file mode 100644 index 00000000000..901deeb78cf --- /dev/null +++ b/assets/js/ef4f60e7.f66551bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55531],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),c=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(a),d=n,g=m["".concat(p,".").concat(d)]||m[d]||u[d]||o;return a?r.createElement(g,l(l({ref:t},s),{},{components:a})):r.createElement(g,l({ref:t},s))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c<o;c++)l[c]=a[c];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},86601:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-04-14-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-04-14-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-14-goedel.md",source:"@site/blog/2023-04-14-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-04-14T00:00:00.000Z",formattedDate:"April 14, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.415,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-04-14-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Incident Report",permalink:"/cardano-updates/2023-04-17-ledger"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-04-14-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(m,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team has submitted two papers for publication, carried\nout consultancy with other teams and has an opening for an intern."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Finalised and submitted two papers to ICE 2023")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Studying Praos paper.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/"))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Design exploration for congestion management."))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/efad53df.45dcc7a1.js b/assets/js/efad53df.45dcc7a1.js new file mode 100644 index 00000000000..fdbc62ee7d6 --- /dev/null +++ b/assets/js/efad53df.45dcc7a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53426],{84260:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/cli-api/page/3","page":3,"postsPerPage":5,"totalPages":6,"totalCount":27,"previousPage":"/cardano-updates/tags/cli-api/page/2","nextPage":"/cardano-updates/tags/cli-api/page/4","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/eff08811.39187769.js b/assets/js/eff08811.39187769.js new file mode 100644 index 00000000000..1b56965dc5a --- /dev/null +++ b/assets/js/eff08811.39187769.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[95816],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),d=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=d(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=d(a),h=r,m=c["".concat(p,".").concat(h)]||c[h]||u[h]||o;return a?n.createElement(m,i(i({ref:t},s),{},{components:a})):n.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},72837:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-02-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-03-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-hydra.md",source:"@site/blog/2023-02-03-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-03T00:00:00.000Z",formattedDate:"February 3, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.12,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-03-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-02-ledger"}},p={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:d},c="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"This week, the Hydra team completed the Hydra specification with a section about\nrollbacks and updated graphs\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/448"},"#448"),"). In a next step,\nthe specification will be made more approachable and an open standard. They\nimproved their ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-cluster")," tool to launch a local ",(0,r.kt)("inlineCode",{parentName:"p"},"--devnet")," sandbox\nenvironment and continued aligning the ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts with the\nspecification by hardening the checks on ",(0,r.kt)("inlineCode",{parentName:"p"},"close")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"contest")," transactions."),(0,r.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Completed the specification with a section about rollbacks and updated graphs\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/448"},"#448"),", with a follow-up on making it more approachable and an open standard."),(0,r.kt)("li",{parentName:"ul"},"Continued spec review with internal auditor and incorporated changes."),(0,r.kt)("li",{parentName:"ul"},"Talked to TxPipe about how Demeter and Hydra could work together"),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"hydra-cluster")," executable can be used to launch a local ",(0,r.kt)("inlineCode",{parentName:"li"},"--devnet")," sandbox environment."),(0,r.kt)("li",{parentName:"ul"},"Reproduced the \u201chead being stuck on network outage\u201d bug",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed."))),(0,r.kt)("li",{parentName:"ul"},"Progressed with higher velocity by addressing more and more gaps ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/677"},"#677"))),(0,r.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Upstream our JSON instances to the ledger"),(0,r.kt)("li",{parentName:"ul"},"Close all transaction security related on-chain gaps"),(0,r.kt)("li",{parentName:"ul"},"Ideally release 0.9.0 with updated scripts"),(0,r.kt)("li",{parentName:"ul"},"Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f0418a99.2c34ef4d.js b/assets/js/f0418a99.2c34ef4d.js new file mode 100644 index 00000000000..4d37c8fc930 --- /dev/null +++ b/assets/js/f0418a99.2c34ef4d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73799],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var o=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),s=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),c=s(r),d=n,h=c["".concat(l,".").concat(d)]||c[d]||m[d]||a;return r?o.createElement(h,i(i({ref:t},u),{},{components:r})):o.createElement(h,i({ref:t},u))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[c]="string"==typeof e?e:n,i[1]=p;for(var s=2;s<a;s++)i[s]=r[s];return o.createElement.apply(null,i)}return o.createElement.apply(null,r)}d.displayName="MDXCreateElement"},25770:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>p,toc:()=>s});var o=r(87462),n=(r(67294),r(3905));const a={title:"Network Team Update",slug:"2023-11-16-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,p={permalink:"/cardano-updates/2023-11-16-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-16-network.md",source:"@site/blog/2023-11-16-network.md",title:"Network Team Update",description:"High-level overview of sprint 48",date:"2023-11-16T00:00:00.000Z",formattedDate:"November 16, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:.545,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-11-16-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Performance & Tracing Update",permalink:"/cardano-updates/2023-11-17-performance-and-tracing"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-15-consensus"}},l={authorsImageUrls:[void 0]},s=[{value:"High-level overview of sprint 48",id:"high-level-overview-of-sprint-48",level:2},{value:"Bootstrap Peers",id:"bootstrap-peers",level:3},{value:"IOClasses / IOSim",id:"ioclasses--iosim",level:3},{value:"Tech debt",id:"tech-debt",level:3}],u={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview-of-sprint-48"},"High-level overview of ",(0,n.kt)("a",{parentName:"h2",href:"https://github.com/orgs/input-output-hk/projects/19/views/16?filterQuery=sprint%3A%22sprint+48%22"},"sprint 48")),(0,n.kt)("h3",{id:"bootstrap-peers"},"Bootstrap Peers"),(0,n.kt)("p",null,"We continued reviewing bootstrap peers, ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4555"},"ouroboros-network#4555"),"."),(0,n.kt)("h3",{id:"ioclasses--iosim"},"IOClasses / IOSim"),(0,n.kt)("p",null,"We prepared slides for a Haskell meetup were we presented a talk on ",(0,n.kt)("inlineCode",{parentName:"p"},"IOSimPOR"),".\nThe recording will be availble on ",(0,n.kt)("inlineCode",{parentName:"p"},"YouTube"),"."),(0,n.kt)("p",null,"We also used the opportunity to do some refactoring of the ",(0,n.kt)("inlineCode",{parentName:"p"},"IOSim")," code base: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/117"},"io-sim#117"),".\nWe released ",(0,n.kt)("inlineCode",{parentName:"p"},"io-sim-1.3.0.0")," on ",(0,n.kt)("inlineCode",{parentName:"p"},"Hackage"),": ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/119"},"io-sim#119"),"."),(0,n.kt)("p",null,"We also added ",(0,n.kt)("inlineCode",{parentName:"p"},"forkFinally")," to ",(0,n.kt)("inlineCode",{parentName:"p"},"MonadFork")," (not included in ",(0,n.kt)("inlineCode",{parentName:"p"},"1.3.0.0")," release): ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/123"},"io-sim#123"),"."),(0,n.kt)("h3",{id:"tech-debt"},"Tech debt"),(0,n.kt)("p",null,"We refactored ",(0,n.kt)("inlineCode",{parentName:"p"},"Resource")," used by the DNS subsystem: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4707"},"ouroboros-network#4707"),".\nWe continued reviewing the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4625"},"ouroboros-network#4625")," PR, which refactors\n",(0,n.kt)("inlineCode",{parentName:"p"},"RootPeersDNS")," module."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f117ec90.7fad2391.js b/assets/js/f117ec90.7fad2391.js new file mode 100644 index 00000000000..8847fc0f25f --- /dev/null +++ b/assets/js/f117ec90.7fad2391.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51522],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),s=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=s(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=s(r),d=n,m=c["".concat(u,".").concat(d)]||c[d]||h[d]||i;return r?a.createElement(m,o(o({ref:t},p),{},{components:r})):a.createElement(m,o({ref:t},p))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<i;s++)o[s]=r[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}d.displayName="MDXCreateElement"},64385:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Hydra Team Update",slug:"2023-09-08-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-08-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-08-hydra.md",source:"@site/blog/2023-09-08-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-08T00:00:00.000Z",formattedDate:"September 8, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.06,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-08-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-12-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-07-mithril"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},c="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team improved the commit process with support for inline\ndatums. They simplified the chain layer by refactoring how the chain state is\npersisted. Updates to the Hydra tutorial were completed, including CI workflows\nto keep it up-to-date. The team engaged in discussions with researchers about\nincremental commits & decommits, and drafted an architectural decision record\nfor a resource-based API. They also explored simpler solutions for the upcoming\nnetwork resilience feature."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Support InlineScriptDatum in commit\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1043"},"#1043")),(0,n.kt)("li",{parentName:"ul"},"Refactored chain state persistency\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1049"},"#1049")),(0,n.kt)("li",{parentName:"ul"},"Completed tutorial updates (by adding CI and some cleanup)\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/997"},"#997")),(0,n.kt)("li",{parentName:"ul"},"Intersect Open Source committee meeting"),(0,n.kt)("li",{parentName:"ul"},'Experimented with various models to better express the \\"Network\nresilience problem\\" to find a KISS solution for\n',(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/188"},"#188")),(0,n.kt)("li",{parentName:"ul"},"Drafted and discussed incremental de-/commit features within team\nand with researchers\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/199"},"#199")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/1057"},"#1057")),(0,n.kt)("li",{parentName:"ul"},"Created ADR for a resource based overhaul of the API\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1028"},"#1028"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Meetup of Hydra & Mithril contributors in Nantes, France"),(0,n.kt)("li",{parentName:"ul"},"Integrated cardano-api 8.15 to have GHC 9.6 support"),(0,n.kt)("li",{parentName:"ul"},"A clear design for incremental commits (decommits are already\nunderstood)"),(0,n.kt)("li",{parentName:"ul"},"An ADR for improving tx construction & observation to not need chain\nstate")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f13a89c7.c87b817b.js b/assets/js/f13a89c7.c87b817b.js new file mode 100644 index 00000000000..38df13db2a9 --- /dev/null +++ b/assets/js/f13a89c7.c87b817b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[86582],{17825:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/sre/page/2","page":2,"postsPerPage":5,"totalPages":3,"totalCount":15,"previousPage":"/cardano-updates/tags/sre","nextPage":"/cardano-updates/tags/sre/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/f1bfc30d.4bc1270e.js b/assets/js/f1bfc30d.4bc1270e.js new file mode 100644 index 00000000000..6dc1e19c380 --- /dev/null +++ b/assets/js/f1bfc30d.4bc1270e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[35877],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(r),h=n,d=c["".concat(s,".").concat(h)]||c[h]||m[h]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}h.displayName="MDXCreateElement"},30394:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-10-11-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-10-11-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-11-mithril.md",source:"@site/blog/2023-10-11-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-10-11T00:00:00.000Z",formattedDate:"October 11, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.77,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-10-11-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-13-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-10-10-node-cli-api"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on ",(0,n.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io"),", the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures."),(0,n.kt)("p",null,"Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Make ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," crate a library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1141"},"#1141")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano transactions history PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"ProtocolKeyRegistration")," creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1187"},"#1187")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Update ",(0,n.kt)("inlineCode",{parentName:"strong"},"Rust")," compiler in ",(0,n.kt)("inlineCode",{parentName:"strong"},"nix")," CI")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1282"},"#1282")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Mithril networks infrastructure maintenance")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1218"},"#1218")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Activate Cloudflare protection of infrastructure")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1230"},"#1230"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f1df5007.afbfc914.js b/assets/js/f1df5007.afbfc914.js new file mode 100644 index 00000000000..f2ca49956c2 --- /dev/null +++ b/assets/js/f1df5007.afbfc914.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[53288],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(r),m=n,c=h["".concat(s,".").concat(m)]||h[m]||d[m]||a;return r?i.createElement(c,o(o({ref:t},u),{},{components:r})):i.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}m.displayName="MDXCreateElement"},80999:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-08-28-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-08-28-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-28-mithril.md",source:"@site/blog/2023-08-28-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-08-28T00:00:00.000Z",formattedDate:"August 28, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-08-28-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-08-29-node-cli-api"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-25-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},h="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of ",(0,n.kt)("inlineCode",{parentName:"p"},"zstandard")," compression of the snapshot archive, and streaming its download and decompression in the client."),(0,n.kt)("p",null,"Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer. "),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Create explorer page with registered signers")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1097"},"#1097")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Simplify logs on the Signer/Aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1106"},"#1106")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Refactor (de)serialization of crypto entities")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/668"},"#668")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Mithril client last snapshot download")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1078"},"#1078")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Use the '/signers/registered' route to verify if a signer is registered")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1152"},"#1152")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Provide progress information with '--json' option in Client")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1095"},"#1095")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Use 'zstandard' compression for snapshot archives")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/876"},"#876")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("inlineCode",{parentName:"li"},"Make client download and extract the archive simultaneously")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1115"},"#1115"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f210b4b5.8690c2eb.js b/assets/js/f210b4b5.8690c2eb.js new file mode 100644 index 00000000000..9ead2de0770 --- /dev/null +++ b/assets/js/f210b4b5.8690c2eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[24745],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(r),m=a,h=u["".concat(c,".").concat(m)]||u[m]||d[m]||s;return r?n.createElement(h,o(o({ref:t},p),{},{components:r})):n.createElement(h,o({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,o=new Array(s);o[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:a,o[1]=i;for(var l=2;l<s;l++)o[l]=r[l];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},68831:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var n=r(87462),a=(r(67294),r(3905));const s={title:"DB sync Team Update",slug:"2022-12-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2022-12-01-db-sync",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-01-db-sync.md",source:"@site/blog/2022-12-01-db-sync.md",title:"DB sync Team Update",description:"High level summary",date:"2022-12-01T00:00:00.000Z",formattedDate:"December 1, 2022",tags:[{label:"db-sync",permalink:"/cardano-updates/tags/db-sync"}],readingTime:.78,hasTruncateMarker:!1,authors:[{name:"Kostas Dermentzis",title:"Cardano DB-Sync Software Engineer",url:"https://github.com/kderme",imageURL:"https://github.com/kderme.png",key:"kderme"}],frontMatter:{title:"DB sync Team Update",slug:"2022-12-01-db-sync",authors:"kderme",tags:["db-sync"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-02-hydra"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2022-12-01-mithril"}},c={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2}],p={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The DB Sync team prepared a release ",(0,a.kt)("inlineCode",{parentName:"p"},"13.1.0.0-rc2")," which includes many improvements for db-sync,\nit makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces\nmigrations. This release finalises the objectives that were set for db-sync for the previous\n3 months period and part of the syncing speed objective set for the next period\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/blob/3640e5aa00b8bada61e5d4b6eee063749866711b/cardano-db-sync/CHANGELOG.md#13100"},"Changelog")),(0,a.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Branch ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/compare/release/13.0.x..3640e5aa00b8bada61e5d4b6eee063749866711b"},"release/13.1.0.x"),"\nincludes all the improvements related to the release. The release is passing through the testing\nphase and a number of bugs and issues have been fixed, like\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1312"},"#1312"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1311"},"#1311"),".\nAlso many new unit tests have been added.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Part of the release branch is cherry-picked back into master, in a way that it respects the new\nrelease and development process, so that it takes into account migrations\n",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-db-sync/issues/1305"},"release process"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"The DB Sync team has also tagged release ",(0,a.kt)("inlineCode",{parentName:"p"},"13.0.6")," which better supports preview and preprod for\ndocker."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2180c0a.2c802d5e.js b/assets/js/f2180c0a.2c802d5e.js new file mode 100644 index 00000000000..514e829d621 --- /dev/null +++ b/assets/js/f2180c0a.2c802d5e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[17433],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),c=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=c(a),m=n,g=s["".concat(u,".").concat(m)]||s[m]||d[m]||l;return a?r.createElement(g,o(o({ref:t},p),{},{components:a})):r.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var c=2;c<l;c++)o[c]=a[c];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},9304:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-05-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-05-05-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-05-ledger.md",source:"@site/blog/2023-05-05-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-05-05T00:00:00.000Z",formattedDate:"May 5, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.235,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-05-05-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-05-12-network"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-05-05-node-cli-api"}},u={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway certificates",id:"conway-certificates",level:2},{value:"Constraint based testing",id:"constraint-based-testing",level:2},{value:"Integration work",id:"integration-work",level:2},{value:"Technical debt",id:"technical-debt",level:2}],p={toc:c},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The ledger team focused mainly on the conway ledger era and node integration.\nFor conway, we completed a large structural change that now allows\nfor delegation certificates to be parameterized by era, and introducing\nnew certificates for the first time since Shelley.\nWe also continue to build out our contraint based generators that we will\nuse to property test the conway era.\nIn particular, we can now generate an entire ledger state and a\ntransaction which is balanced with respect to the ledger state."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h2",{id:"conway-certificates"},"Conway certificates"),(0,n.kt)("p",null,"Certificiates are now abstracted as a type family in the ledger codebase.\nMoreover, there are new certificates in the Conway era to support CIP-1694,\nand MIR certificates have been removed."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3387"},"pull-3387"))),(0,n.kt)("h2",{id:"constraint-based-testing"},"Constraint based testing"),(0,n.kt)("p",null,"Our plan for property testing in the conway era is to no longer use the trace generators,\nbut instead generate ledger states and transactions based on constraints.\nWe hit a milestone this week, namely the ability to generate a balanced transaction in the context\nof a ledger state, all based on our ever growing constaint language."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3374"},"pull-3374")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3386"},"pull-3386"))),(0,n.kt)("h2",{id:"integration-work"},"Integration work"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3393"},"pull-3393")," - Performance improvements"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3395"},"pull-3395")," - Conway instances"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3398"},"pull-3398")," - Fix mint translation in the script context")),(0,n.kt)("h2",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3389"},"pull-3389")," - Reduce github pages size"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3390"},"pull-3390")," - Reinstate the tickf optimizations")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2423430.bec1d3ae.js b/assets/js/f2423430.bec1d3ae.js new file mode 100644 index 00000000000..c8360378c6c --- /dev/null +++ b/assets/js/f2423430.bec1d3ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1321],{3905:(e,n,r)=>{r.d(n,{Zo:()=>u,kt:()=>g});var t=r(67294);function a(e,n,r){return n in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function i(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),r.push.apply(r,t)}return r}function o(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?i(Object(r),!0).forEach((function(n){a(e,n,r[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}))}return e}function c(e,n){if(null==e)return{};var r,t,a=function(e,n){if(null==e)return{};var r,t,a={},i=Object.keys(e);for(t=0;t<i.length;t++)r=i[t],n.indexOf(r)>=0||(a[r]=e[r]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)r=i[t],n.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=t.createContext({}),l=function(e){var n=t.useContext(s),r=n;return e&&(r="function"==typeof e?e(n):o(o({},n),e)),r},u=function(e){var n=l(e.components);return t.createElement(s.Provider,{value:n},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},m=t.forwardRef((function(e,n){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(r),m=a,g=d["".concat(s,".").concat(m)]||d[m]||p[m]||i;return r?t.createElement(g,o(o({ref:n},u),{},{components:r})):t.createElement(g,o({ref:n},u))}));function g(e,n){var r=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var c={};for(var s in n)hasOwnProperty.call(n,s)&&(c[s]=n[s]);c.originalType=e,c[d]="string"==typeof e?e:a,o[1]=c;for(var l=2;l<i;l++)o[l]=r[l];return t.createElement.apply(null,o)}return t.createElement.apply(null,r)}m.displayName="MDXCreateElement"},28149:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var t=r(87462),a=(r(67294),r(3905));const i={title:"Performance & tracing update",slug:"2023-03-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",c={permalink:"/cardano-updates/2023-03-22-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-22-performance-and-tracing.md",source:"@site/blog/2023-03-22-performance-and-tracing.md",title:"Performance & tracing update",description:"* Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.",date:"2023-03-22T00:00:00.000Z",formattedDate:"March 22, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.5,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-03-22-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-22-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-21-network"}},s={authorsImageUrls:[void 0]},l=[{value:"New tracing",id:"new-tracing",level:3},{value:"GHC RTS parametrization",id:"ghc-rts-parametrization",level:3},{value:"Open Sourcing",id:"open-sourcing",level:3},{value:"General",id:"general",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],u={toc:l},d="wrapper";function p(e){let{components:n,...r}=e;return(0,a.kt)(d,(0,t.Z)({},u,r,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations."),(0,a.kt)("li",{parentName:"ul"},"New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users."),(0,a.kt)("li",{parentName:"ul"},"Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks."),(0,a.kt)("li",{parentName:"ul"},"Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing."),(0,a.kt)("li",{parentName:"ul"},"Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.")),(0,a.kt)("h1",{id:"performance"},"Performance"),(0,a.kt)("h3",{id:"new-tracing"},"New tracing"),(0,a.kt)("p",null,"The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe\na slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use."),(0,a.kt)("h3",{id:"ghc-rts-parametrization"},"GHC RTS parametrization"),(0,a.kt)("p",null,"We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies\non different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use."),(0,a.kt)("h3",{id:"open-sourcing"},"Open Sourcing"),(0,a.kt)("p",null,"Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases."),(0,a.kt)("h1",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well\nas a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points\nfor users of the new system, depending on their wants and needs. "),(0,a.kt)("h1",{id:"infrastructure--analysis"},"Infrastructure & Analysis"),(0,a.kt)("h3",{id:"general"},"General"),(0,a.kt)("p",null,"Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will\nincrease confidence in specific metrics."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis\nis patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2b32cff.39abae3b.js b/assets/js/f2b32cff.39abae3b.js new file mode 100644 index 00000000000..ed950bdf938 --- /dev/null +++ b/assets/js/f2b32cff.39abae3b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58566],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},l=Object.keys(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),u=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),h=u(r),c=n,m=h["".concat(p,".").concat(c)]||h[c]||d[c]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[h]="string"==typeof e?e:n,o[1]=i;for(var u=2;u<l;u++)o[u]=r[u];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},59485:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-02-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-02-17-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-17-ledger.md",source:"@site/blog/2023-02-17-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-02-17T00:00:00.000Z",formattedDate:"February 17, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.33,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2023-02-17-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-02-17-hydra"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-02-17-network"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Integration work",id:"integration-work",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Small documentation improvements",id:"small-documentation-improvements",level:3},{value:"Specifying CIP-1694",id:"specifying-cip-1694",level:3},{value:"Constraint based testing",id:"constraint-based-testing",level:3}],s={toc:u},h="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This past two weeks saw many months worth of ledger changes integrated with the ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-base"),"\nand ",(0,n.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," repositories.\nThe vast majority of the effort involved all the changes to the ledger serialization libraries\n(and the interplay with ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-base"),") which now support proper versioning.\nSupporting the conway ledger era, and in particular allowing the ledger state to transition\nto a whole new system of governance, also played a noticeable part in the integration."),(0,n.kt)("p",null,"Besides the integration work, the team continues to address technical debt, improve the\ndocumentation, make our testing infrastructure better (such as experimenting with better\nnightly tests), and formally specifying more parts of CIP-1694."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"integration-work"},"Integration work"),(0,n.kt)("p",null,"Below is all the integration work completed, which will enable a release to node from\nthe current ledger master. Many thanks to\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/lehins"},"Alexey")," for this colossal undertaking!"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3303"},"pull-3303")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3302"},"pull-3302")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3300"},"pull-3300")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3299"},"pull-3299")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3298"},"pull-3298")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3297"},"pull-3297")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3292"},"pull-3292")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3289"},"pull-3289")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3288"},"pull-3288")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3279"},"pull-3279")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3282"},"pull-3282")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4349"},"pull-4349"))),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("p",null,"Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted\nin the CBOR specification. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3241"},"pull-3241"),"."),(0,n.kt)("p",null,"We now have our ",(0,n.kt)("inlineCode",{parentName:"p"},".cabal")," files being checked for a consistent formatting given by\n",(0,n.kt)("inlineCode",{parentName:"p"},"cabal format")," in our CI. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3286"},"pull-3286"),"."),(0,n.kt)("p",null,"We are still experimenting with better nightly tests for our long running\nproperty based tests. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3276"},"pull-3276")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3296"},"pull-3296"),"."),(0,n.kt)("h3",{id:"small-documentation-improvements"},"Small documentation improvements"),(0,n.kt)("p",null,"The hand proofs of the preservation ADA property have been added back to the\nShelley ledger specification. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3295"},"pull-3295"),"."),(0,n.kt)("p",null,"We have clarified how the script integrity hash is computed in the CDDL description.\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3290"},"pull-3290"),"."),(0,n.kt)("h3",{id:"specifying-cip-1694"},"Specifying CIP-1694"),(0,n.kt)("p",null,"Our new formal specifications backed by Agda have seen a lot of progress!\nUpgrading to Agda 2.6.3 fixed our main build infrastructure problems,\nand we no longer have to rely on our custom fork. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/50"},"pull-50"),"."),(0,n.kt)("p",null,"Our progress on formally specifying CIP-1694 can be followed here:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"in Agda: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/40"},"pull-40")),(0,n.kt)("li",{parentName:"ul"},"the corresponding Haskell: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3291"},"pull-3291"))),(0,n.kt)("h3",{id:"constraint-based-testing"},"Constraint based testing"),(0,n.kt)("p",null,"We are still actively working on our new constraint based property testing framework.\nWe have nearly all of the constraints for an entire ledger state\nhooked into generators, and tests that the generators do indeed obey the constraints.\nThe variable count in the constraints is over 100!\nThere is still much work to do on shrinking, making the generators faster,\nand writing actual property tests for the ledger, but the approach still seems viable and\nwe are hopeful that it could replace our trace generators.\nThe WIP can be followed here: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3219"},"pull-3219"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2deb2f1.b1733abd.js b/assets/js/f2deb2f1.b1733abd.js new file mode 100644 index 00000000000..c8b9d00307c --- /dev/null +++ b/assets/js/f2deb2f1.b1733abd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[82164],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,h=d["".concat(p,".").concat(m)]||d[m]||c[m]||o;return a?r.createElement(h,l(l({ref:t},u),{},{components:a})):r.createElement(h,l({ref:t},u))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var s=2;s<o;s++)l[s]=a[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},80599:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"SRE Team Update",slug:"2023-11-10-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-11-10-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-10-sre.md",source:"@site/blog/2023-11-10-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-11-10T00:00:00.000Z",formattedDate:"November 10, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:2.225,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-11-10-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-10-hydra"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-11-09-db-sync"}},p={authorsImageUrls:[void 0]},s=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Iohk-nix",id:"iohk-nix",level:3},{value:"Sanchonet-demo",id:"sanchonet-demo",level:3}],u={toc:s},d="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,n.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground"},"cardano-playground")," stack")),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"capkgs"},"Capkgs"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Minor bug fix and db-sync sanchonet package update: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/b1f1cbd...994696f"},"capkgs-compare"))),(0,n.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"General migration support PR for cardano-world to cardano-playground ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/18"},"cardano-parts-pull-18"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground"),(0,n.kt)("li",{parentName:"ul"},"Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes"),(0,n.kt)("li",{parentName:"ul"},"Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains"),(0,n.kt)("li",{parentName:"ul"},"The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state"),(0,n.kt)("li",{parentName:"ul"},"The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable"),(0,n.kt)("li",{parentName:"ul"},"Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0"),(0,n.kt)("li",{parentName:"ul"},"For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true"),(0,n.kt)("li",{parentName:"ul"},"Template updates include:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds optional TF AZ declaration on ec2 resources"),(0,n.kt)("li",{parentName:"ul"},"Adds a cardano node p2p dashboard to the grafana cloud stack"),(0,n.kt)("li",{parentName:"ul"},"Adds a dbsync pool performance analysis query"),(0,n.kt)("li",{parentName:"ul"},"Updates python distribute and delegation scripts from world for playground compatibility"),(0,n.kt)("li",{parentName:"ul"},"Starts a python script lib to reduce shared code among the python scripts"),(0,n.kt)("li",{parentName:"ul"},"Several justfile improvements and new recipes"))),(0,n.kt)("li",{parentName:"ul"},"More detail is available in the PR description"))),(0,n.kt)("li",{parentName:"ul"},"Update submit action script for 8.6 ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/19"},"cardano-parts-pull-19")),(0,n.kt)("li",{parentName:"ul"},"Update scripts for 8.6.0-pre ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/21"},"cardano-parts-pull-21"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Fixes subcommand names based on ERA_CMD"),(0,n.kt)("li",{parentName:"ul"},"Adds deposits to some commands"),(0,n.kt)("li",{parentName:"ul"},"Separates CC cold/hot key generation as host authorization has to occur after action is approved"),(0,n.kt)("li",{parentName:"ul"},"CC voting enabled in vote job")))),(0,n.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migration PR to largely complete the network migration from cardano-world to cardano-playground: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/5"},"cardano-playground-pull-5"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Adds re-spun private chain network"),(0,n.kt)("li",{parentName:"ul"},"Migrates shelley-qa chain network from world"),(0,n.kt)("li",{parentName:"ul"},"Justfile improvements and new recipes"),(0,n.kt)("li",{parentName:"ul"},"Improve concurrent environment chain support"),(0,n.kt)("li",{parentName:"ul"},"More detail is available in the PR description")))),(0,n.kt)("h3",{id:"iohk-nix"},"Iohk-nix"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migration to play: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/iohk-nix/pull/561"},"iohk-nix-pull-561"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org"),(0,n.kt)("li",{parentName:"ul"},"Remove deprecated cardano-lib p2p network environment"),(0,n.kt)("li",{parentName:"ul"},"Update sanchonet chain with respin changes"),(0,n.kt)("li",{parentName:"ul"},"Update private chain with respin changes"),(0,n.kt)("li",{parentName:"ul"},"Bump private and shelley-qa chains to sanchonet equivalent conway genesis"),(0,n.kt)("li",{parentName:"ul"},"Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing")))),(0,n.kt)("h3",{id:"sanchonet-demo"},"Sanchonet-demo"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update for cardano-node 8.6.0-pre demo: ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/sanchonet-demo/commit/b54da94057ac0949421918208fd04795d029447d"},"sanchonet-demo-commit"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f302e248.841b73d3.js b/assets/js/f302e248.841b73d3.js new file mode 100644 index 00000000000..b3e2bb2d5d4 --- /dev/null +++ b/assets/js/f302e248.841b73d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83214],{3905:(t,e,a)=>{a.d(e,{Zo:()=>c,kt:()=>s});var n=a(67294);function o(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function r(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function l(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?r(Object(a),!0).forEach((function(e){o(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function i(t,e){if(null==t)return{};var a,n,o=function(t,e){if(null==t)return{};var a,n,o={},r=Object.keys(t);for(n=0;n<r.length;n++)a=r[n],e.indexOf(a)>=0||(o[a]=t[a]);return o}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(n=0;n<r.length;n++)a=r[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(o[a]=t[a])}return o}var p=n.createContext({}),u=function(t){var e=n.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},c=function(t){var e=u(t.components);return n.createElement(p.Provider,{value:e},t.children)},d="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var a=t.components,o=t.mdxType,r=t.originalType,p=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),d=u(a),h=o,s=d["".concat(p,".").concat(h)]||d[h]||m[h]||r;return a?n.createElement(s,l(l({ref:e},c),{},{components:a})):n.createElement(s,l({ref:e},c))}));function s(t,e){var a=arguments,o=e&&e.mdxType;if("string"==typeof t||o){var r=a.length,l=new Array(r);l[0]=h;var i={};for(var p in e)hasOwnProperty.call(e,p)&&(i[p]=e[p]);i.originalType=t,i[d]="string"==typeof t?t:o,l[1]=i;for(var u=2;u<r;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},31079:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(87462),o=(a(67294),a(3905));const r={title:"Node API & CLI Team Update",slug:"2023-02-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-02-22-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-22-node-cli-api.md",source:"@site/blog/2023-02-22-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-02-22T00:00:00.000Z",formattedDate:"February 22, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.385,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-02-22-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-02-22-consensus"},nextItem:{title:"DB-sync Team Update",permalink:"/cardano-updates/2023-02-21-db-sync"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Completed",id:"completed",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"In Progress",id:"in-progress",level:2},{value:"Documentation",id:"documentation",level:2},{value:"CI & project mainteance",id:"ci--project-mainteance",level:2},{value:"cardano-cli",id:"cardano-cli-1",level:3},{value:"cardano-api",id:"cardano-api-1",level:3},{value:"cardano-node",id:"cardano-node-1",level:3},{value:"cardano-testnet",id:"cardano-testnet-1",level:3}],c={toc:u},d="wrapper";function m(t){let{components:e,...a}=t;return(0,o.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"2023-02-22---2023-03-07"},"2023-02-22 - 2023-03-07"),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"General bug fixes "),(0,o.kt)("h2",{id:"completed"},"Completed"),(0,o.kt)("h3",{id:"docs"},"docs"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4882"},"Fix some markdown links")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4881"},"Update changelog with PR4788 changes"))),(0,o.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,o.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,o.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4761"},"Fix bug in hash computation in cardano-cli genesis create-cardano")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4636"},"Cleanup exports of cardano-testnet")),(0,o.kt)("li",{parentName:"ul"},"[BUGFIX]"," - ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4537"},"Stop the cli from changing the bytes in user-supplied data")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4625"},"Handle pipes in cardano-cli")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4753"},"Export SubmitResult from Cardano.Api"))),(0,o.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4901"},"Remove pattern Tx"))),(0,o.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4263"},"Stop running CI when the only changes are to docs"))),(0,o.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,o.kt)("h2",{id:"in-progress"},"In Progress"),(0,o.kt)("h2",{id:"documentation"},"Documentation"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4949"},"Fix path to mkfiles.sh script in documentation"))),(0,o.kt)("h2",{id:"ci--project-mainteance"},"CI & project mainteance"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4932"},"New build complete job")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4764"},"Update ouroboros-network"))),(0,o.kt)("h3",{id:"cardano-cli-1"},"cardano-cli"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3819"},"Debug output for transaction submit")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4713"},"Fully remove the cli intermediate TxBody format")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4659"},"Render consistent plutus script failure output")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4666"},"Read network ID from environment")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4647"},"CLI option to append additional signatures to a transactions")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"Cardano ping")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4777"},"Better error message for query utxo on oops")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4910"},"New --node-socket-path cli option")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4909"},"Fix qKesKesKeyExpiry to not always be null")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4880"},"Detect invalid counter and certificate")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4823"},"Straight line code for tx commands")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4664"},"New cardano-cli ping command.")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4655"},"Move cardano-ping from ouroboros-network to cardano-node project"))),(0,o.kt)("h3",{id:"cardano-api-1"},"cardano-api"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4450"},"Auto-balance multiasset transactions")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4763"},"Remove simple script distinction")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4941"},"Combinators for TxBodyCon\u017btent and related types")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4903"},"Reduce number of calls to toLedgerPParams")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4825"},"Better error message for query utxo without oops 2"))),(0,o.kt)("h3",{id:"cardano-node-1"},"cardano-node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4911"},"Less verbose node-to-client and node-to-node version logging"))),(0,o.kt)("h3",{id:"cardano-testnet-1"},"cardano-testnet"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4845"},"Use Haskell variables for passing values")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4879"},"Re-enable kes-period-info test")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/3783"},"Transaction debug script command"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f3c06362.96ecb4f3.js b/assets/js/f3c06362.96ecb4f3.js new file mode 100644 index 00000000000..345a5bbba37 --- /dev/null +++ b/assets/js/f3c06362.96ecb4f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[34985],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),m=r,d=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var u=2;u<o;u++)i[u]=n[u];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},22460:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Q2 2023 Update",slug:"2023-Q2-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/quarterly/2023-Q2-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/quarterly/2023-Q2-consensus.md",source:"@site/quarterly/2023-Q2-consensus.md",title:"Consensus Q2 2023 Update",description:"2023-04 -- 2023-06",date:"2023-12-07T21:19:58.000Z",formattedDate:"December 7, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/quarterly/tags/consensus"}],readingTime:4.47,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Q2 2023 Update",slug:"2023-Q2-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},nextItem:{title:"Network Q2 2023 Update",permalink:"/cardano-updates/quarterly/2023-Q2-network"}},l={authorsImageUrls:[void 0]},u=[{value:"2023-04 -- 2023-06",id:"2023-04----2023-06",level:2},{value:"Main achievements",id:"main-achievements",level:3},{value:"UTxO HD",id:"utxo-hd",level:4},{value:"Genesis",id:"genesis",level:4},{value:"Support",id:"support",level:4},{value:"Technical debt",id:"technical-debt",level:4},{value:"Fostering collaboration",id:"fostering-collaboration",level:4},{value:"Next steps",id:"next-steps",level:3},{value:"UTxO HD",id:"utxo-hd-1",level:4},{value:"Genesis",id:"genesis-1",level:4}],c={toc:u},p="wrapper";function h(e){let{components:t,...o}=e;return(0,r.kt)(p,(0,a.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"2023-04----2023-06"},"2023-04 -- 2023-06"),(0,r.kt)("h3",{id:"main-achievements"},"Main achievements"),(0,r.kt)("h4",{id:"utxo-hd"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We finished a major prototype refactoring, which includes:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"A better and finer grained DB lock mechanism."),(0,r.kt)("li",{parentName:"ul"},"Elimination of race conditions."),(0,r.kt)("li",{parentName:"ul"},"Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance."),(0,r.kt)("li",{parentName:"ul"},"Architectural simplifications and performance improvements."))),(0,r.kt)("li",{parentName:"ul"},"We implemented a new package to support db-sync integration with UTxO-HD."),(0,r.kt)("li",{parentName:"ul"},"We ran another set of ad-hoc benchmarks:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We uncovered a performance regression on the Network component when using ",(0,r.kt)("inlineCode",{parentName:"li"},"GHC-9.2/9.4"),"."),(0,r.kt)("li",{parentName:"ul"},"The synchronization and replay speed are as expected."),(0,r.kt)("li",{parentName:"ul"},"However, we uncovered memory consumption issues (see figure below).",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The in-memory backend is consuming more memory than the baseline."),(0,r.kt)("li",{parentName:"ul"},"The LMDB backend shows an unexpected memory usage peak."),(0,r.kt)("li",{parentName:"ul"},"Investigation on these issues is ongoing."))))),(0,r.kt)("li",{parentName:"ul"},"We integrated the latest changes in ",(0,r.kt)("inlineCode",{parentName:"li"},"main")," branch.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This required a re-design of the mempool to include the mempool fairness\nimprovement.")))),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(49718).Z,width:"2500",height:"1700"})),(0,r.kt)("h4",{id:"genesis"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Genesis work for this PI focused on an high-priority issue from the IOG Researchers' feedback on the proposal.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This particular question was not anticipated when the Q2 PI was planned."),(0,r.kt)("li",{parentName:"ul"},"As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized."),(0,r.kt)("li",{parentName:"ul"},"That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package."))),(0,r.kt)("li",{parentName:"ul"},"The IOG Researchers' feedback on the design was very valuable. It had two primary effects."),(0,r.kt)("li",{parentName:"ul"},'Outcome 1: We re-introduced distinct behaviors when the node is "syncing" versus when it is "caught up".',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated."),(0,r.kt)("li",{parentName:"ul"},"The additional design complexity is relatively small."))),(0,r.kt)("li",{parentName:"ul"},"Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era."),(0,r.kt)("li",{parentName:"ul"},"All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras."),(0,r.kt)("li",{parentName:"ul"},"Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later."),(0,r.kt)("li",{parentName:"ul"},"The primary invention was a model for bounding how much benefit the adversary's long-range attack could possibly gain from Praos's natural short forks."))),(0,r.kt)("li",{parentName:"ul"},"Relevant questions that the IOG Researchers are still assessing.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"These do not block the Genesis implementation, but do affect the ultimate values of specific parameters."),(0,r.kt)("li",{parentName:"ul"},"Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?"),(0,r.kt)("li",{parentName:"ul"},"Question 2: what is the upper bound on how much grinding can improve the adversary's leader schedule within some Genesis window?")))),(0,r.kt)("h4",{id:"support"},"Support"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We performed an analysis on number of file descriptors used by Consensus, this\ninformation can be used by the node operators to check if the number of file\ndescriptors they want to support are enough, thus improving the user (eg node\noperator) experience."),(0,r.kt)("li",{parentName:"ul"},"We implemented a mempool fairness improvement, by which transactions are\nguaranteed to be processed irrespective of their size.")),(0,r.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We fixed a bug in followers logic, which was discovered by our ",(0,r.kt)("inlineCode",{parentName:"li"},"QuickCheck"),"\nproperty tests."),(0,r.kt)("li",{parentName:"ul"},"We created an ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/68"},"immutable DB\nserver"),". This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results."),(0,r.kt)("li",{parentName:"ul"},"We created a ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/70"},(0,r.kt)("inlineCode",{parentName:"a"},"db-truncater"))," tool, which can be used in disaster recovery and benchmarking scenarios."),(0,r.kt)("li",{parentName:"ul"},"We created a ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/161"},"benchmarks comparison tool")," that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance ",(0,r.kt)("em",{parentName:"li"},"improvements")," introduced by the Ledger team in version ",(0,r.kt)("inlineCode",{parentName:"li"},"0.6.0.0")," of Consensus wrt version ",(0,r.kt)("inlineCode",{parentName:"li"},"0.5.0.0"),".")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(23425).Z,width:"1840",height:"1372"})),(0,r.kt)("h4",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We released ",(0,r.kt)("inlineCode",{parentName:"li"},"fs-sim")," as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project."),(0,r.kt)("li",{parentName:"ul"},"We migrated the consensus code to a ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus"},"new repository"),", splitting\nit from the ",(0,r.kt)("inlineCode",{parentName:"li"},"ouroboros-network")," repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases)."),(0,r.kt)("li",{parentName:"ul"},"We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users)."),(0,r.kt)("li",{parentName:"ul"},"We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.")),(0,r.kt)("h3",{id:"next-steps"},"Next steps"),(0,r.kt)("h4",{id:"utxo-hd-1"},"UTxO HD"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We will ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/28"},"get UTxO-HD ready for handover"),".")),(0,r.kt)("h4",{id:"genesis-1"},"Genesis"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work.")))}h.isMDXComponent=!0},23425:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2023-Q2-beacon-graph-ded65e814bfe6d927faa1c5c66bbbfad.png"},49718:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks-74f9d76c2602f09652f584cc4d6a0962.png"}}]); \ No newline at end of file diff --git a/assets/js/f452efc5.b66888d2.js b/assets/js/f452efc5.b66888d2.js new file mode 100644 index 00000000000..120d79d1b31 --- /dev/null +++ b/assets/js/f452efc5.b66888d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[44281],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return n?a.createElement(f,i(i({ref:t},s),{},{components:n})):a.createElement(f,i({ref:t},s))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var c=2;c<o;c++)i[c]=n[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},89556:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=n(87462),r=(n(67294),n(3905));const o={title:"Goedel Team Update",slug:"2023-07-07-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-07-07-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-07-goedel.md",source:"@site/blog/2023-07-07-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-07-07T00:00:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.42,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-07-07-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-07-07-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-07-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"This sprint the teams have been working on finalising their ICE papers\nfor publication in EPTCS, formalising concensus, and investigating chain\nsync."),(0,r.kt)("h2",{id:"details"},"Details"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Preparing final versions of ICE papers")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Reviewing the chain sync design and documentation")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Refactoring the thorn calculus")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"First draft of Praos specification")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Developing bounding factors on timeouts"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4548430.7eb98ed2.js b/assets/js/f4548430.7eb98ed2.js new file mode 100644 index 00000000000..4c47bccaaa5 --- /dev/null +++ b/assets/js/f4548430.7eb98ed2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[93789],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},i=Object.keys(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)r=i[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=s(r),c=n,d=h["".concat(p,".").concat(c)]||h[c]||m[c]||i;return r?a.createElement(d,o(o({ref:t},u),{},{components:r})):a.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<i;s++)o[s]=r[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},84374:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=r(87462),n=(r(67294),r(3905));const i={title:"Mithril Team Update",slug:"2023-09-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-09-27-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-27-mithril.md",source:"@site/blog/2023-09-27-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-09-27T00:00:00.000Z",formattedDate:"September 27, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.975,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-09-27-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-09-29-sre"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-09-26-node-cli-api"}},p={authorsImageUrls:[void 0]},s=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:s},h="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(h,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team has released a new distribution ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/mithril/releases/tag/2337.0"},(0,n.kt)("inlineCode",{parentName:"a"},"2337.0")),", which includes the following enhancements: support for ",(0,n.kt)("inlineCode",{parentName:"p"},"zstandard")," compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator."),(0,n.kt)("p",null,"They also completed the refactoring and standardization of the errors in the Mithril nodes and published an ",(0,n.kt)("a",{parentName:"p",href:"https://mithril.network/doc/adr/6"},"Architectural decision record")," on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure."),(0,n.kt)("p",null,"Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Release new ",(0,n.kt)("inlineCode",{parentName:"strong"},"2337")," distribution")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1219"},"#1219")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Errors refactoring")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/798"},"#798")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Client traffic creates performance bottleneck in aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1207"},"#1207")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Record statistics about the downloaded snapshot in the aggregator")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1127"},"#1127")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Create a SPO checklist for KES keys update")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1267"},"#1267")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Spike: Run client in browser WASM PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1254"},"#1254")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Benchmark aggregator performances")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1220"},"#1220")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Activate Cloudflare protection of infrastructure")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1230"},"#1230"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f47d214c.7885e24c.js b/assets/js/f47d214c.7885e24c.js new file mode 100644 index 00000000000..3a037c7f03d --- /dev/null +++ b/assets/js/f47d214c.7885e24c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[55791],{52078:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/cip-1694","page":1,"postsPerPage":5,"totalPages":1,"totalCount":1,"blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/f48535bf.29fcdfb3.js b/assets/js/f48535bf.29fcdfb3.js new file mode 100644 index 00000000000..47ecad4d22a --- /dev/null +++ b/assets/js/f48535bf.29fcdfb3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[45821],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),s=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},h="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=s(a),c=n,m=h["".concat(u,".").concat(c)]||h[c]||d[c]||i;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var s=2;s<i;s++)o[s]=a[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},99684:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-06-16-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-06-16-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-16-hydra.md",source:"@site/blog/2023-06-16-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-16T00:00:00.000Z",formattedDate:"June 16, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.815,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-16-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-06-23-sre"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-15-mithril"}},u={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],p={toc:s},h="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team focused their efforts on continuing to investigate and\nexperiment operating a head on mainnet. They collected several bugs and issues\nand worked on fixing them. Now the team is soon to release a new version,\n0.11.0, which comes with a lot of improvements and bug fixes."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Restored and fixed a bug which stalled our head on mainnet ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/927"},"#927")),(0,n.kt)("li",{parentName:"ul"},"Solved one user issue ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/914"},"#914")),(0,n.kt)("li",{parentName:"ul"},"Reduced significantly local state size and logs by removing the full scripts from it ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/928"},"#928")),(0,n.kt)("li",{parentName:"ul"},"(pending review) Reduced snapshot size in the API, by only including tx ids ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/922"},"#922"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New release 0.11.0"),(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting."),(0,n.kt)("li",{parentName:"ul"},"Fix some minor bugs discovered when operating our head on mainnet"),(0,n.kt)("li",{parentName:"ul"},"Complete journey for external commits using multiple script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"Publish benchmarks and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4cb7e87.0c2f8fe1.js b/assets/js/f4cb7e87.0c2f8fe1.js new file mode 100644 index 00000000000..68736d4f49d --- /dev/null +++ b/assets/js/f4cb7e87.0c2f8fe1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70085],{76777:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/mithril/page/2","page":2,"postsPerPage":5,"totalPages":7,"totalCount":34,"previousPage":"/cardano-updates/tags/mithril","nextPage":"/cardano-updates/tags/mithril/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/f51bb76d.7f54a00b.js b/assets/js/f51bb76d.7f54a00b.js new file mode 100644 index 00000000000..8cd3a397e7d --- /dev/null +++ b/assets/js/f51bb76d.7f54a00b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[12626],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>g});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),s=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=s(n),u=r,g=d["".concat(c,".").concat(u)]||d[u]||p[u]||i;return n?a.createElement(g,o(o({ref:t},m),{},{components:n})):a.createElement(g,o({ref:t},m))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=u;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var s=2;s<i;s++)o[s]=n[s];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},21772:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var a=n(87462),r=(n(67294),n(3905));const i={title:"Performance & tracing update",slug:"2023-03-08-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},o="High level summary",l={permalink:"/cardano-updates/2023-03-08-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-performance-and-tracing.md",source:"@site/blog/2023-03-08-performance-and-tracing.md",title:"Performance & tracing update",description:"* Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.",date:"2023-03-08T00:00:00.000Z",formattedDate:"March 8, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:1.805,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & tracing update",slug:"2023-03-08-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-08-node-cli-api"},nextItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-03-03-crypto"}},c={authorsImageUrls:[void 0]},s=[{value:"1.35.6 release",id:"1356-release",level:3},{value:"Analysis pipeline",id:"analysis-pipeline",level:3},{value:"Open Sourcing",id:"open-sourcing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:s},d="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate."),(0,r.kt)("li",{parentName:"ul"},"New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users."),(0,r.kt)("li",{parentName:"ul"},"Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination."),(0,r.kt)("li",{parentName:"ul"},"Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation."),(0,r.kt)("li",{parentName:"ul"},"Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.")),(0,r.kt)("h1",{id:"performance"},"Performance"),(0,r.kt)("h3",{id:"1356-release"},"1.35.6 release"),(0,r.kt)("p",null,"Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health."),(0,r.kt)("h3",{id:"analysis-pipeline"},"Analysis pipeline"),(0,r.kt)("p",null,"Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better\ndifferentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance.\nAdditionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking\ndata more easily accessible."),(0,r.kt)("h3",{id:"open-sourcing"},"Open Sourcing"),(0,r.kt)("p",null,"As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable\nthird parties to make use of that data much more easily, by having reliable guidelines and a working example."),(0,r.kt)("h1",{id:"tracing"},"Tracing"),(0,r.kt)("p",null,"The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make\nthe switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process."),(0,r.kt)("h1",{id:"infrastructure"},"Infrastructure"),(0,r.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,r.kt)("p",null,"The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f522921c.3a805440.js b/assets/js/f522921c.3a805440.js new file mode 100644 index 00000000000..a1aabd35076 --- /dev/null +++ b/assets/js/f522921c.3a805440.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[75556],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),u=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),h=u(a),d=n,c=h["".concat(l,".").concat(d)]||h[d]||m[d]||i;return a?r.createElement(c,o(o({ref:t},s),{},{components:a})):r.createElement(c,o({ref:t},s))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[h]="string"==typeof e?e:n,o[1]=p;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},55660:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-06-02-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,p={permalink:"/cardano-updates/2023-06-02-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-02-hydra.md",source:"@site/blog/2023-06-02-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-02T00:00:00.000Z",formattedDate:"June 2, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.215,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-02-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-06-07-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-01-mithril"}},l={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has put their effort on finding solutions on many\ndifferent problems, such as our broken head on mainnet\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/897"},"#897"),", our fragile monthly\nreport publications on the website and implementing ","\u201c","Option A","\u201d"," for\nexternal commits ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),".\nAlthough most of these items are still open, huge progress has been made. To\naccelerate the investigation, they improved their logging to give more precise\nerrors when a transition requirement fails, and to reduce duplication on effets\nlogged content. Last but not least, the team is exploring formal methods and\nattended a workshop on formalizing cryptographic protocols in Agda."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Continued investigating broken head and opened an issue to keep track ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/897"},"#897"),"."),(0,n.kt)("p",{parentName:"li"},"As part of this issue, improvements were made to the node logs:"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Give a precise error when a transition requirement fails ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/895"},"#895"),".")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Reduce duplication for effects logged content by using sequential eventId and effectId pair ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/896"},"#896"),".")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Fixed references in the hydra specification ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/893"},"#893"),".")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Attended a workshop on formal methods and crypto in Agda."))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Investigate and re-open our team-internal head on mainnet."),(0,n.kt)("li",{parentName:"ul"},"Improve and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete journey for external commits implementing ","\u201c","Option A","\u201d"," and start implementing ","\u201c","Option B","\u201d"," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),"."),(0,n.kt)("li",{parentName:"ul"},"Authenticate network messages ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"#727"),"."),(0,n.kt)("li",{parentName:"ul"},"Add hydra as tool to developr platform ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/872"},"#872"),"."),(0,n.kt)("li",{parentName:"ul"},"Fix monthly report publication on docs website.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f530b85c.90d61588.js b/assets/js/f530b85c.90d61588.js new file mode 100644 index 00000000000..b58582fe757 --- /dev/null +++ b/assets/js/f530b85c.90d61588.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[49605],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>h});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(a),s=r,h=d["".concat(p,".").concat(s)]||d[s]||m[s]||o;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}s.displayName="MDXCreateElement"},35118:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const o={title:"Node API & CLI Team Update",slug:"2023-04-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},l="Node-Api-Cli Update",i={permalink:"/cardano-updates/2023-04-05-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-04-05-node-cli-api.md",source:"@site/blog/2023-04-05-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-04-05T00:00:00.000Z",formattedDate:"April 5, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.315,hasTruncateMarker:!1,authors:[{name:"Jordan Millar",title:"Node Team Lead",url:"https://github.com/Jimbo4350",imageURL:"https://github.com/Jimbo4350.png",key:"Jimbo4350"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-04-05-node-cli-api",authors:"Jimbo4350",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-04-05-consensus"},nextItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-04-05-performance-and-tracing"}},p={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3},{value:"Developer experience",id:"developer-experience",level:3},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3}],c={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-04-05---2023-04-19"},"2023-04-05 - 2023-04-19"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Introduce new governance commands create, answer and verify. This allows us to have onchain polls."),(0,r.kt)("li",{parentName:"ul"},"Begin making changes in cardano-api to accomodate for CIP-1694"),(0,r.kt)("li",{parentName:"ul"},"Rename ",(0,r.kt)("inlineCode",{parentName:"li"},"TestEnableDevelopmentHardForkEras")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"ExperimentalHardForksEnabled")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"TestEnableDevelopmentNetworkProtocols")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"ExperimentalProtocolsEnabled")),(0,r.kt)("li",{parentName:"ul"},"Various bug fixes and improvements ")),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"),(0,r.kt)("h3",{id:"developer-experience"},"Developer experience"),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5112"},"Add new interim governance commands: {create, answer, verify}-poll")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5061"},"Remove --stake-address option from stake-address build")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5059"},"Frozen callstack for checkTextEnvelopeFormat function")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5053"},"#5052 Remove reading protocol parameters from Shelley genesis file")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5046"},"Move parsers to reusable location")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4910"},"New --socket-path cli option")," ")),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5108"},"CIP-1694 make space for DRep certificates")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5105"},"File type to track the content and direction of files")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5087"},"Fix import warning")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5086"},"Expose UsingRawBytes et al types")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5085"},"Expose SerialiseAsRawBytesError in Cardano.Api")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5072"},"Introduce new AnyShelleyBasedEra type and simplify CDDL tests.")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5071"},"New genCardanoKeyWitness function")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5069"},"Replace roundtripCBOR with trippingCbor")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5064"},"Remove non-round-trippable value TxInsReferenceNone for babbage onwards in generator")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5063"},"Improve roundtrip functions to report annotations on callsite")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5057"},"Define Functor instance for FileError")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5049"},"Split serialisation from IO")," ")),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5115"},"Master build failure fixes")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5106"},"Allow renamed fields to exist if values the same")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5091"},"workbench: updates")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5084"},"Delete duplicate packages sort packages and imports")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4341"},"Rename TestEnableDevelopmentHardForkEras and TestEnableDevelopmentNetworkProtocols")," ")),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5110"},"Additional check for not-leader slots in LeadershipSchedule tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5099"},"Fix epochLength and securityParam to conform to the formula 10 * k / f")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5083"},"Ergonomic directory creation code in tests")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5036"},"Default Cardano.Testnet to NodeLoggingFormatAsJson")," "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5013"},"Integrate latest ledger dependencies"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f55d3e7a.f786acd2.js b/assets/js/f55d3e7a.f786acd2.js new file mode 100644 index 00000000000..3bc9b87ddb2 --- /dev/null +++ b/assets/js/f55d3e7a.f786acd2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[54193],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=u(r),y=a,m=c["".concat(l,".").concat(y)]||c[y]||d[y]||o;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=y;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,i[1]=s;for(var u=2;u<o;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}y.displayName="MDXCreateElement"},78030:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var n=r(87462),a=(r(67294),r(3905));const o={sidebar_position:5},i="Deploy your site",s={unversionedId:"tutorial-basics/deploy-your-site",id:"tutorial-basics/deploy-your-site",title:"Deploy your site",description:"Docusaurus is a static-site-generator (also called Jamstack).",source:"@site/docs/tutorial-basics/deploy-your-site.md",sourceDirName:"tutorial-basics",slug:"/tutorial-basics/deploy-your-site",permalink:"/cardano-updates/docs/tutorial-basics/deploy-your-site",draft:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"defaultSidebar",previous:{title:"Markdown Features",permalink:"/cardano-updates/docs/tutorial-basics/markdown-features"},next:{title:"Congratulations!",permalink:"/cardano-updates/docs/tutorial-basics/congratulations"}},l={},u=[{value:"Build your site",id:"build-your-site",level:2},{value:"Deploy your site",id:"deploy-your-site-1",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deploy-your-site"},"Deploy your site"),(0,a.kt)("p",null,"Docusaurus is a ",(0,a.kt)("strong",{parentName:"p"},"static-site-generator")," (also called ",(0,a.kt)("strong",{parentName:"p"},(0,a.kt)("a",{parentName:"strong",href:"https://jamstack.org/"},"Jamstack")),")."),(0,a.kt)("p",null,"It builds your site as simple ",(0,a.kt)("strong",{parentName:"p"},"static HTML, JavaScript and CSS files"),"."),(0,a.kt)("h2",{id:"build-your-site"},"Build your site"),(0,a.kt)("p",null,"Build your site ",(0,a.kt)("strong",{parentName:"p"},"for production"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npm run build\n")),(0,a.kt)("p",null,"The static files are generated in the ",(0,a.kt)("inlineCode",{parentName:"p"},"build")," folder."),(0,a.kt)("h2",{id:"deploy-your-site-1"},"Deploy your site"),(0,a.kt)("p",null,"Test your production build locally:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npm run serve\n")),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"build")," folder is now served at ",(0,a.kt)("a",{parentName:"p",href:"http://localhost:3000/"},"http://localhost:3000/"),"."),(0,a.kt)("p",null,"You can now deploy the ",(0,a.kt)("inlineCode",{parentName:"p"},"build")," folder ",(0,a.kt)("strong",{parentName:"p"},"almost anywhere")," easily, ",(0,a.kt)("strong",{parentName:"p"},"for free")," or very small cost (read the ",(0,a.kt)("strong",{parentName:"p"},(0,a.kt)("a",{parentName:"strong",href:"https://docusaurus.io/docs/deployment"},"Deployment Guide")),")."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f59c978c.51f789b1.js b/assets/js/f59c978c.51f789b1.js new file mode 100644 index 00000000000..32570aa26f8 --- /dev/null +++ b/assets/js/f59c978c.51f789b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46545],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,d=c["".concat(l,".").concat(m)]||c[m]||h[m]||a;return n?o.createElement(d,s(s({ref:t},u),{},{components:n})):o.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var p=2;p<a;p++)s[p]=n[p];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},22053:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2022-11-30-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2022-11-30-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-30-consensus.md",source:"@site/blog/2022-11-30-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2022-11-30T00:00:00.000Z",formattedDate:"November 30, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.4,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-11-30-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"System Test Team Update",permalink:"/cardano-updates/2022-12-01-system-test"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-11-30-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD prototype",id:"utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:3},{value:"CSJ prototype",id:"csj-prototype",level:3},{value:"New VRF and KES crypto integration",id:"new-vrf-and-kes-crypto-integration",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3}],u={toc:p},c="wrapper";function h(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"During the past two weeks, the consensus team merged improvements to the monadic\ncursor API that was needed to implement LMDB range reads, which is in turn\nrequired for the implementation of the UTxO HD feature. We added tables to\nseveral tests in for the UTxO HD feature, which increases our confidence in the\ncorrectness of the prototype. The mempool property tests are close to being\ncompleted. Also, we finished the LSM tree tuning algorithm."),(0,r.kt)("p",null,"On the Genesis front we started simplifying the BlockFetch logic with\nCSJ-specific workloads in mind. "),(0,r.kt)("p",null,"We are also documenting the Block Diffusion Pipelining feature, and added a\nhigh-level overview of consensus to the top level documentation of\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"."),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD prototype"),(0,r.kt)("p",null,"We merged the implementation of a monadic cursor API (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"#1"),")) which was\nneeded to solve a bug with LMDB range-reads. After this PR was merged, we focused on\nbridging the gap between the ",(0,r.kt)("inlineCode",{parentName:"p"},"lmdb-simple")," interface and consensus by facilitating\nusing ",(0,r.kt)("inlineCode",{parentName:"p"},"lmdb-simple"),"'s cursor API without ",(0,r.kt)("inlineCode",{parentName:"p"},"Serialise")," constraints (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/3"},"#3"),")."),(0,r.kt)("p",null,"We refactored the backing store property tests to use ",(0,r.kt)("inlineCode",{parentName:"p"},"quickcheck-lockstep"),"\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4081"},"#4081"),")."),(0,r.kt)("p",null,"We added tables to the mock ledger in the UTxO-HD feature branch\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4184"},"#4184"),"). Every test that used to run with ",(0,r.kt)("inlineCode",{parentName:"p"},"SimpleBlocks")," now uses\ntables. This will enable us to exercise the UTxO HD mempool integration by\nleveraging the existing mempool property-tests. The new state-machine\nproperty-tests are still needed for testing the parallel behaviour of the\nmempool."),(0,r.kt)("p",null,"Our work on the mempool state-machine tests revealed the need for improvements\nin the ",(0,r.kt)("inlineCode",{parentName:"p"},"quickcheck-state-machine")," library. Parallel testing assumed that the\nstate machine did not have access to mutable references. However, the mempool\ntests require the use of such mutable references for mocking the ledger\ninterface. As a result, our parallel tests were failing with rather obscure\nmessages. @Jasagredo submitted a pull request (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/stevana/quickcheck-state-machine/pull/12"},"#12"),") that allows for\nnew mutable references to be created at each run of the state machine."),(0,r.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,r.kt)("h3",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,r.kt)("p",null,"We finished the LSM Tree tuning algorithm. We are currently tidying up the code\nand gathering results (i.e., plots and their interpretation)."),(0,r.kt)("h3",{id:"csj-prototype"},"CSJ prototype"),(0,r.kt)("p",null,"We started simplifying the BlockFetch logic with CSJ-specific workloads in mind."),(0,r.kt)("h3",{id:"new-vrf-and-kes-crypto-integration"},"New VRF and KES crypto integration"),(0,r.kt)("p",null,"Started working on supporting new version of ",(0,r.kt)("inlineCode",{parentName:"p"},"StandardCrypto")," which uses compact\nKES and batched VRF (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4151"},"#4151"),")."),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,'We reviewed the existing state of the Block Diffusion Pipelining document. We\nare now working on the "Implementation" section (',(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4020"},"#4020"),")."),(0,r.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("p",null,"We cleared up our understanding of the error dynamics of forecasting\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4146"},"#4146")," and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4174"},"#4174"),")."),(0,r.kt)("p",null,"We submitted a pull request that adds an overview of consensus to the ",(0,r.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/ouroboros-network/"},"top level\ndocumentation")," of\nouroboros-network (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4197"},"#4197"),"). This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4197"},"https://github.com/input-output-hk/ouroboros-network/pull/4197")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f5a24224.d169d439.js b/assets/js/f5a24224.d169d439.js new file mode 100644 index 00000000000..9c9377a8a05 --- /dev/null +++ b/assets/js/f5a24224.d169d439.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[71844],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),h=n,m=c["".concat(u,".").concat(h)]||c[h]||d[h]||o;return r?a.createElement(m,i(i({ref:t},s),{},{components:r})):a.createElement(m,i({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=h;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}h.displayName="MDXCreateElement"},66255:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-10-14-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-14-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-14-ledger.md",source:"@site/blog/2022-10-14-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-10-14T00:00:00.000Z",formattedDate:"October 14, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.03,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-10-14-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-14-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-10-05-consensus"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Completed Technical Debt",id:"completed-technical-debt",level:3},{value:"In-progress Technical Debt",id:"in-progress-technical-debt",level:3}],s={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The ledger team is still primarily focused on addressing\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues?q=is%3Aissue+is%3Aopen+label%3A%22%3Acredit_card%3A+technical-debt%22"},"technical"),"\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/3"},"debt"),".\nWe now have the infrastructure for versioning our serialization schemes,\nwhich we continue to put into action.\nWe have made first steps towards getting proper support for the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger repository"),"\n(in particular, we've added nix builds and\ncontinuous integration support).\nWe are wrapping up an investigation of the performance of a critical\nfunction used by the consensus layer for leader checks.\nFinally, we are improving the packaging and versioning of our code."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"completed-technical-debt"},"Completed Technical Debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of\nour code lives in the ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-ledger-shelley")," package, though with hindsight we can say that\nmuch of it should live in ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-ledger-core"),".\nWe continue to move things to ",(0,n.kt)("inlineCode",{parentName:"li"},"cardano-ledger-core"),", and have much more to come. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3059"},"pull-3059"),"]"),(0,n.kt)("li",{parentName:"ul"},"We now have the infrastructure to support ",(0,n.kt)("strong",{parentName:"li"},"versioned")," serialization schemes.\nThe inability to do this has caused us a lot difficulties,\nsuch as [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3003"},"issue-3003"),"], [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2965"},"issue-2965"),"] and [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2444"},"issue-2444"),"].\nWe are still in the process of switching to the versioned serialization scheme\n(such as [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3078"},"pull-3078"),"]),\nbut the infrastructure was completed in [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3063"},"pull-3063"),"]."),(0,n.kt)("li",{parentName:"ul"},"We now have proper nix and CI support for the formal ledger project. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/19"},"pull-19"),"]"),(0,n.kt)("li",{parentName:"ul"},"A separate team is helping bring support for\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP"),"\nto all the cardano-node repositories.\nWe have been helping out with this effort.")),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"A separate team continues working on upgrading all the\ncardano-node repositories to work with ghc 9.2.4.\nWe have been helping out with this effort.")),(0,n.kt)("h3",{id:"in-progress-technical-debt"},"In-progress Technical Debt"),(0,n.kt)("p",null,"We also have several fairly large pull-requests in review\nthat we are working on."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"In an on-going attempt to build out a more user-friendly API,\nwe continue to remove ",(0,n.kt)("inlineCode",{parentName:"li"},"HasField")," instances in place of using micro-lenses.\nThe protocol parameters, in particular, are being worked on. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3045"},"pull-3045"),"]"),(0,n.kt)("li",{parentName:"ul"},"We are also renaming record fields to be consistent across the repository. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3062"},"pull-3062"),"]"),(0,n.kt)("li",{parentName:"ul"},"We are now cleaning up all the work we did to understand the performance\nof the TICKF transition. We have some improvements to the computatation\nas well. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3068"},"pull-3068"),"]"),(0,n.kt)("li",{parentName:"ul"},"We are adding more documentation, in particular to our ",(0,n.kt)("inlineCode",{parentName:"li"},"Twiddler")," functionality. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3073"},"pull-3073"),"]"),(0,n.kt)("li",{parentName:"ul"},"The formal ledger is adding support for finite set theory. [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/formal-ledger-specifications/pull/20"},"pull-20"),"]")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f5b1250e.5a405e64.js b/assets/js/f5b1250e.5a405e64.js new file mode 100644 index 00000000000..91a8652173b --- /dev/null +++ b/assets/js/f5b1250e.5a405e64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[1129],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},h=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,h=i(e,["components","mdxType","originalType","parentName"]),u=p(a),c=n,m=u["".concat(s,".").concat(c)]||u[c]||d[c]||o;return a?r.createElement(m,l(l({ref:t},h),{},{components:a})):r.createElement(m,l({ref:t},h))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=c;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:n,l[1]=i;for(var p=2;p<o;p++)l[p]=a[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},25013:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-08-04-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-04-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-04-hydra.md",source:"@site/blog/2023-08-04-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-08-04T00:00:00.000Z",formattedDate:"August 4, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.06,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-08-04-hydra",authors:["ch1bo"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-04-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-08-04-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team achieved notable progress in various aspects of the\nproject. The team updated the use case section for auctions on the ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/unstable/use-cases/"},"/unstable"),"\nbranch of the website, improving the understanding of Hydra","\u2019","s applicability."),(0,n.kt)("p",null,"From the development side, the team successfully completed event-sourced\npersistence, a key enhancement in the project","\u2019","s architecture which improves\noff-chain transaction processing performance. They also added a\n","\u201c","submit-transaction","\u201d"," endpoint to the API."),(0,n.kt)("p",null,"In addition to project-related progress, the team actively engaged in community\nreviews for several catalyst proposals related to Hydra and Mithril,\ncontributing to the wider Cardano ecosystem."),(0,n.kt)("p",null,"Finally, the full report for the month of July was also published ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2023-07"},"here"),"."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Published the ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-07"},"monthly report for July")),(0,n.kt)("li",{parentName:"ul"},"Updated the use case section for auctions (published on ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/use-cases/"},"/unstable")," branch)"),(0,n.kt)("li",{parentName:"ul"},"Completed event sourced persistence ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/913"},"#913")),(0,n.kt)("li",{parentName:"ul"},"Added a ","\u201c","submit-transaction","\u201d"," endpoint to the API ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/966"},"#966")),(0,n.kt)("li",{parentName:"ul"},"Community reviews for several catalyst proposals related to Hydra and Mithril"),(0,n.kt)("li",{parentName:"ul"},"Created a network testing tool (hydra-net) ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/1006"},"#1006"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update hydra-node to work with cardano-node version 8.x"),(0,n.kt)("li",{parentName:"ul"},"Remove the internal commit functionality"),(0,n.kt)("li",{parentName:"ul"},"Release version 0.12.0"),(0,n.kt)("li",{parentName:"ul"},"Update & streamline tutorial to work with latest version of hydra-node")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f5d27437.a48dcb5c.js b/assets/js/f5d27437.a48dcb5c.js new file mode 100644 index 00000000000..aeb287af41e --- /dev/null +++ b/assets/js/f5d27437.a48dcb5c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[85351],{71522:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/51","page":51,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/50","nextPage":"/cardano-updates/page/52","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/f5e5d1cf.409624be.js b/assets/js/f5e5d1cf.409624be.js new file mode 100644 index 00000000000..b8178ae4ff8 --- /dev/null +++ b/assets/js/f5e5d1cf.409624be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[51410],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),h=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=h(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=h(r),c=n,d=p["".concat(s,".").concat(c)]||p[c]||m[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var h=2;h<a;h++)o[h]=r[h];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},45256:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>h});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2022-11-18-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2022-11-18-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-18-mithril.md",source:"@site/blog/2022-11-18-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2022-11-18T00:00:00.000Z",formattedDate:"November 18, 2022",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.35,hasTruncateMarker:!1,authors:[{name:"I\xf1igo Querejeta Azurmendi",title:"Cardano Lead Cryptography Engineer",url:"https://github.com/iquerejeta",imageURL:"https://github.com/iquerejeta.png",key:"iquerejeta"}],frontMatter:{title:"Mithril Team Update",slug:"2022-11-18-mithril",authors:"iquerejeta",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-18-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2022-11-16-consensus"}},s={authorsImageUrls:[void 0]},h=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:h},p="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks. "),(0,n.kt)("p",null,"Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Released a new Mithril distribution ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/releases/tag/2246.1"},"2246.1")),(0,n.kt)("li",{parentName:"ul"},"Completed the first stage of the store migrations process ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/562"},"#562")),(0,n.kt)("li",{parentName:"ul"},"Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/565"},"#565")),(0,n.kt)("li",{parentName:"ul"},"Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/576"},"#576")),(0,n.kt)("li",{parentName:"ul"},"Prepared a Daedalus synchronization benchmark video with/without Mithril ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/606"},"#606")),(0,n.kt)("li",{parentName:"ul"},"Upgraded the Cardano nodes of the testing Mithril networks to ",(0,n.kt)("inlineCode",{parentName:"li"},"1.35.4")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/594"},"#594")),(0,n.kt)("li",{parentName:"ul"},"Worked on implementing SPO tests nodes on testing Mithril networks ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/563"},"#563")),(0,n.kt)("li",{parentName:"ul"},"Worked on the CIP design for Mithril piggybacked on the Cardano network layer ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/588"},"#588")),(0,n.kt)("li",{parentName:"ul"},"Worked on the refactorizaton of the aggregator multi signer engine ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/398"},"#398"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f5f103cc.b1cf07d2.js b/assets/js/f5f103cc.b1cf07d2.js new file mode 100644 index 00000000000..571e2139c38 --- /dev/null +++ b/assets/js/f5f103cc.b1cf07d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67170],{53162:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/5","page":5,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/4","nextPage":"/cardano-updates/page/6","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/f63b6b72.003220d2.js b/assets/js/f63b6b72.003220d2.js new file mode 100644 index 00000000000..994d93e1081 --- /dev/null +++ b/assets/js/f63b6b72.003220d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87389],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},l=Object.keys(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)r=l[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=a.createContext({}),p=function(e){var t=a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=p(r),c=n,m=d["".concat(u,".").concat(c)]||d[c]||h[c]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=c;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var p=2;p<l;p++)o[p]=r[p];return a.createElement.apply(null,o)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},36793:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const l={title:"Ledger Team Update",slug:"2023-07-21-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2023-07-21-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-07-21-ledger.md",source:"@site/blog/2023-07-21-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-07-21T00:00:00.000Z",formattedDate:"July 21, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:1.715,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-07-21-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-07-21-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-07-21-sre"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"What we achieved",id:"what-we-achieved",level:2},{value:"What is currently in progress",id:"what-is-currently-in-progress",level:2}],s={toc:p},d="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet.\nAll members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era.\nWe also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release).\nAdditionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available.\nWe also made progress on the constraint-based generators, which can now generate valid transactions and ledger states. "),(0,n.kt)("h2",{id:"what-we-achieved"},"What we achieved"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3521"},"pull-3521"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3554"},"pull-3554"),"] Improved Governance model (GovernanceProcedures, ProposalProcedure)"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3520"},"pull-3520"),"] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert ) "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3531"},"pull-3531"),"] Refactored and simplified code interacting with Plutus"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3558"},"pull-3558"),"] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix. "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3550"},"pull-3550"),"] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed."),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3551"},"pull-3551"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3546"},"pull-3546"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3472"},"pull-3472"),"] Updated tools and added some small improvements "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3146"},"issue-3146"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3498"},"pull-3498"),"] Introduced Conway protocol parameters "),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/2948"},"issue-2948"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3499"},"pull-3499"),"] Implemented ConwayGenesis with the new protocol parameters")),(0,n.kt)("h2",{id:"what-is-currently-in-progress"},"What is currently in progress"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3494"},"issue-3494"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3495"},"pull-3495"),"] Implement returning of proposal deposits"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3436"},"issue-3436"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3523"},"pull-3523"),"] Implement transferring lovelace from UTxO to treasury"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3509"},"issue-3509"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3552"},"pull-3552"),"] Add script-support for the committee hot key"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3532"},"issue-3532"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3556"},"pull-3556"),"] Add script-support for the constitution"),(0,n.kt)("li",{parentName:"ul"},"[",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/issues/3543"},"issue-3543"),"] [",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3557"},"pull-3557"),"] Improve the 'new committee' governance action by specifying the members to be replaced, expiration epoch of new members and adding script-support")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f6a3ab66.dd8c87cc.js b/assets/js/f6a3ab66.dd8c87cc.js new file mode 100644 index 00000000000..4f60b812b42 --- /dev/null +++ b/assets/js/f6a3ab66.dd8c87cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[12634],{2832:a=>{a.exports=JSON.parse('{"label":"mithril","permalink":"/cardano-updates/tags/mithril","allTagsPath":"/cardano-updates/tags","count":34}')}}]); \ No newline at end of file diff --git a/assets/js/f6aa5556.97793938.js b/assets/js/f6aa5556.97793938.js new file mode 100644 index 00000000000..0dc2c74f2b3 --- /dev/null +++ b/assets/js/f6aa5556.97793938.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[376],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),u=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(d.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,d=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=u(a),h=n,m=s["".concat(d,".").concat(h)]||s[h]||c[h]||l;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=h;var i={};for(var d in t)hasOwnProperty.call(t,d)&&(i[d]=t[d]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var u=2;u<l;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},86936:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2022-12-09-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2022-12-09-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-ledger.md",source:"@site/blog/2022-12-09-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-12-09T00:00:00.000Z",formattedDate:"December 9, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.87,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-12-09-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-09-hydra"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-02-hydra"}},d={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano ledger API",id:"cardano-ledger-api",level:4},{value:"Architectural Decision Records (ADRs)",id:"architectural-decision-records-adrs",level:4},{value:"Tracking individual deposits",id:"tracking-individual-deposits",level:4},{value:"Removing pointer addresses",id:"removing-pointer-addresses",level:4},{value:"Technical debt",id:"technical-debt",level:4}],p={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The Plutus tools team at IOG has started helping the ledger team to build out a user friendly\n",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-ledger-api")," package!\nA ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/5"},"GitHub project"),"\nwill be filled out in the days ahead,\npeople interested in the API can use it to follow along and join in on the conversations."),(0,n.kt)("p",null,"The ledger team has started using\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/blob/6fc0e198560fb4169d435da882394930789a8af8/docs/adr/2022-12-01_001-record-architectural-decisions.md"},"architectural decision records"),"\nto leave a record of important decisions that the team makes.\nWe will retroactively go back through past decisions and make ADRs for them."),(0,n.kt)("p",null,"The logic to track individual deposits is now nearly in place.\nWe are prioritizing correctness with our first pull request, and will follow up with\nperformance optimizations and general cleanup next."),(0,n.kt)("p",null,"Pointer addresses are being deprecated with the Cardano major protocol version 8.\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/374"},"CPS-0002"),"\nfor more context."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h4",{id:"cardano-ledger-api"},"Cardano ledger API"),(0,n.kt)("p",null,"The ",(0,n.kt)("strong",{parentName:"p"},"Plutus tools team")," has taken our minimal ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-ledger-api")," package and started filling it\nout and adding much needed documentation.\nThey have also added doctests!\nIn the days to come, the Plutus tools team will map out a lot more work for the API and record\nit in this\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/5"},"GitHub project"),"."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3182"},"pull-3182")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3188"},"pull-3188"))),(0,n.kt)("h4",{id:"architectural-decision-records-adrs"},"Architectural Decision Records (ADRs)"),(0,n.kt)("p",null,"We are now providing more context and leaving a record of important decisions that are made\nin the ledger. The first ADR explains the very lightweight process."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3177"},"pull-3177")," (rendered ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/blob/6fc0e198560fb4169d435da882394930789a8af8/docs/adr/2022-12-01_001-record-architectural-decisions.md"},"here"),")")),(0,n.kt)("h4",{id:"tracking-individual-deposits"},"Tracking individual deposits"),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3190/files"},"ADR-3"),"\nfor background.\nWe now have the logic in place to track individual deposits, and a host of property tests\nto make sure that the logic is correct.\nThe current implementation uses more memory than it needs to, and we will address that next,\nwith our hope being to only use one word (8 bytes) per registered stake credential.\nThere is a fair amount of other cleanup needed for general maintainability."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3127"},"pull-3127")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3195"},"pull-3195")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3202"},"pull-3202"))),(0,n.kt)("h4",{id:"removing-pointer-addresses"},"Removing pointer addresses"),(0,n.kt)("p",null,"Pointer addresses, which have never seen any real use\n(there are something like eleven on mainnet), are being deprecated starting at Cardano major\nversion 9.\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/374"},"CPS-0002")," gives the context.\nWe are disabling them by first preventing transaction outputs containing them\nfrom being serialized by the node at the moment we switch to version 9.\nAt the hard fork after that, we will translate the existing few pointer addresses\nto enterprise addresses."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3174"},"pull-3174"))),(0,n.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3162"},"pull-3162")," - Sometimes we have to put safeguards in place for hard forks which may never\nbe exercised. After we have passed the given hardfork, we are able to clean up the code\nand simplify our logic. We removed all of the ones that we are currently easily able to."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3165"},"pull-3165")," - We improved the type safety of our code while also discovering and fixing\na serialization bug."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3172"},"pull-3172")," - We removed dead code."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3175"},"pull-3175")," - The Allegra and the Mary code used to be coupled in a particular way the we grew to\ndislike. We made these two ledger eras now uniform with the rest of our code base."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3184"},"pull-3184")," - We organized our property testing code."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3200"},"pull-3200")," - The Plutus tools teams fixed an outstanding bug in the translation from the\nledger state to the Plutus script context.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f6b8faad.decb8bc1.js b/assets/js/f6b8faad.decb8bc1.js new file mode 100644 index 00000000000..07d9d1daa37 --- /dev/null +++ b/assets/js/f6b8faad.decb8bc1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[83584],{28460:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/35","page":35,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/34","nextPage":"/cardano-updates/page/36","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/f6ec1152.c2043e3a.js b/assets/js/f6ec1152.c2043e3a.js new file mode 100644 index 00000000000..9a7630c8e81 --- /dev/null +++ b/assets/js/f6ec1152.c2043e3a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[11254],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>g});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,g=d["".concat(u,".").concat(c)]||d[c]||m[c]||l;return a?r.createElement(g,i(i({ref:t},s),{},{components:a})):r.createElement(g,i({ref:t},s))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[d]="string"==typeof e?e:n,i[1]=o;for(var p=2;p<l;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},53954:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2023-10-13-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},i=void 0,o={permalink:"/cardano-updates/2023-10-13-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-10-13-ledger.md",source:"@site/blog/2023-10-13-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2023-10-13T00:00:00.000Z",formattedDate:"October 13, 2023",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:.965,hasTruncateMarker:!1,authors:[{name:"Alexey Kuleshevich",title:"Ledger Team Software Engineer",url:"https://github.com/lehins",imageURL:"https://github.com/lehins.png",key:"lehins"}],frontMatter:{title:"Ledger Team Update",slug:"2023-10-13-ledger",authors:"lehins",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-13-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-10-13-sre"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2},{value:"Conway era",id:"conway-era",level:3},{value:"Integration and releasing",id:"integration-and-releasing",level:3},{value:"Testing",id:"testing",level:3}],s={toc:p},d="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The Ledger team has been shifting focus from implementing Conway related features to\ntesting. For this reason there is a very little amount features that are reported this\ntime aorund. Notable Conway related changes are a specialized ledger query for getting\nConstitutional Committee state and prevention of submitting proposal procedures that have\nno valid path to enactment."),(0,n.kt)("p",null,"Testing related work was mainly on a constraint base system as well as on roundtrip\nserialization. As a result of this extra testing a bug in Conway Genesis serialization\nwas eliminated."),(0,n.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,n.kt)("h3",{id:"conway-era"},"Conway era"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3768"},"pull-3768")," - Fail proposal on invalid prevGovActionId"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3781"},"pull-3781")," - CommitteeState query")),(0,n.kt)("h3",{id:"integration-and-releasing"},"Integration and releasing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3774"},"pull-3774")," - Bump urllib3 from 1.26.10 to 1.26.17 in /doc"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3770"},"pull-3770")," - cabal.project: Bump index states"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3778"},"pull-3778")," - Bump plutus to 1.14")),(0,n.kt)("h3",{id:"testing"},"Testing"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3769"},"pull-3769")," - Add roundtrip testing by validating FlatTerm"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3783"},"pull-3783")," - Update TranslationInstance.hs"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3775"},"pull-3775")," - Refactor and improve constraint based STS tests"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3793"},"pull-3793")," - Fix sums with negative RHS.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f7e5e70a.061609b3.js b/assets/js/f7e5e70a.061609b3.js new file mode 100644 index 00000000000..80cc6b8eb43 --- /dev/null +++ b/assets/js/f7e5e70a.061609b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[48909],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var i=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,i,n=function(e,t){if(null==e)return{};var r,i,n={},a=Object.keys(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)r=a[i],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),p=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(r),c=n,d=m["".concat(s,".").concat(c)]||m[c]||h[c]||a;return r?i.createElement(d,o(o({ref:t},u),{},{components:r})):i.createElement(d,o({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<a;p++)o[p]=r[p];return i.createElement.apply(null,o)}return i.createElement.apply(null,r)}c.displayName="MDXCreateElement"},78370:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var i=r(87462),n=(r(67294),r(3905));const a={title:"Mithril Team Update",slug:"2023-11-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-11-01-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-01-mithril.md",source:"@site/blog/2023-11-01-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-11-01T00:00:00.000Z",formattedDate:"November 1, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:.895,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-11-01-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-11-01-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-10-27-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],u={toc:p},m="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,n.kt)("p",null,"This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the ",(0,n.kt)("inlineCode",{parentName:"p"},"release-mainnet")," aggregator."),(0,n.kt)("p",null,"Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI."),(0,n.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"P2P Networking - Proof of Concept")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1300"},"#1300")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Build ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-common")," and ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," in WASM PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1284"},"#1284")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Fix ",(0,n.kt)("inlineCode",{parentName:"strong"},"devnet")," Mithril Docker images")," ","[#1272]","(",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1272"},"https://github.com/input-output-hk/mithril/issues/1272")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Light Wallet: Release ",(0,n.kt)("inlineCode",{parentName:"strong"},"mithril-client")," library")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1311"},"#1311")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},"Compute deterministic Cardano UTxO set PoC")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1283"},"#1283")),(0,n.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,n.kt)("strong",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"strong"},"release-mainnet")," aggregator is unreachable")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1310"},"#1310")),(0,n.kt)("li",{parentName:"ul"},"Completed the issue ",(0,n.kt)("strong",{parentName:"li"},"Client regressions in snapshot list and download")," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/1321"},"#1321"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f850a5f3.536e35f2.js b/assets/js/f850a5f3.536e35f2.js new file mode 100644 index 00000000000..7702c8f6f3c --- /dev/null +++ b/assets/js/f850a5f3.536e35f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25403],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,h=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(h,i(i({ref:t},s),{},{components:r})):n.createElement(h,i({ref:t},s))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var p=2;p<o;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},23498:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const o={title:"Network Team Update",slug:"2023-01-20-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-01-20-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-01-20-network.md",source:"@site/blog/2023-01-20-network.md",title:"Network Team Update",description:"High level summary",date:"2023-01-20T00:00:00.000Z",formattedDate:"January 20, 2023",tags:[{label:"network",permalink:"/cardano-updates/tags/network"},{label:"release",permalink:"/cardano-updates/tags/release"}],readingTime:1.045,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2023-01-20-network",authors:"coot",tags:["network","release"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-01-20-hydra"},nextItem:{title:"SRE Team Update",permalink:"/cardano-updates/2023-01-20-sre"}},u={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level summary",id:"low-level-summary",level:2}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"We have been working towards ",(0,a.kt)("inlineCode",{parentName:"p"},"cardano-node-1.35.5")," release. QA & benchmarking\nteams gave a green light for the release, and we made decent progress with some\nCI problem which we encountered on the way (",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4612"},"PR #4612"),"). We are also working on\npeer sharing, making improvements in our testing infrastructure, reducing\ntechnical debt and making progress towards ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim-1.0.0.0"),". Galois is making\nprogress on Handshake improvements."),(0,a.kt)("h2",{id:"low-level-summary"},"Low level summary"),(0,a.kt)("p",null,"Our diffusion simulation network now includes a mixed network of ",(0,a.kt)("inlineCode",{parentName:"p"},"initiator\nonly")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"initiator and responder")," nodes. ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4222"},"issue #4222")),(0,a.kt)("p",null,"We are now reviewing the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"peer sharing pull request"),"."),(0,a.kt)("p",null,"We are also reviewing pull request which introduces handshake query flag. ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4256"},"PR #4256")),(0,a.kt)("p",null,"We fixed a bug in our network simulator. The bug was triggered when a node\ndied when performing a simultaneous TCP open (a corner case of a corner case!). ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4265"},"PR #4265")),(0,a.kt)("p",null,"We also refactored ",(0,a.kt)("inlineCode",{parentName:"p"},"Snocket")," interface and removed the bearer construction from\nits methods. ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4260"},"PR #4260")),(0,a.kt)("p",null,"We are working towards releasing ",(0,a.kt)("inlineCode",{parentName:"p"},"io-sim-1.0.0.0")," on Hackage, which includes\nreviewing two PRs: ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/57"},"PR #57")," and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/60"},"PR #60")," as well as writing an announcement\nblog post. "))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f8681695.f50d9273.js b/assets/js/f8681695.f50d9273.js new file mode 100644 index 00000000000..f13bc0f0f5d --- /dev/null +++ b/assets/js/f8681695.f50d9273.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32464],{3905:(e,t,i)=>{i.d(t,{Zo:()=>s,kt:()=>c});var n=i(67294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function l(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?r(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function o(e,t){if(null==e)return{};var i,n,a=function(e,t){if(null==e)return{};var i,n,a={},r=Object.keys(e);for(n=0;n<r.length;n++)i=r[n],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)i=r[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var p=n.createContext({}),u=function(e){var t=n.useContext(p),i=t;return e&&(i="function"==typeof e?e(t):l(l({},t),e)),i},s=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var i=e.components,a=e.mdxType,r=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=u(i),d=a,c=m["".concat(p,".").concat(d)]||m[d]||h[d]||r;return i?n.createElement(c,l(l({ref:t},s),{},{components:i})):n.createElement(c,l({ref:t},s))}));function c(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=i.length,l=new Array(r);l[0]=d;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:a,l[1]=o;for(var u=2;u<r;u++)l[u]=i[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,i)}d.displayName="MDXCreateElement"},67885:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var n=i(87462),a=(i(67294),i(3905));const r={title:"Mithril Team Update",slug:"2023-06-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},l=void 0,o={permalink:"/cardano-updates/2023-06-15-mithril",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-15-mithril.md",source:"@site/blog/2023-06-15-mithril.md",title:"Mithril Team Update",description:"High level overview",date:"2023-06-15T00:00:00.000Z",formattedDate:"June 15, 2023",tags:[{label:"mithril",permalink:"/cardano-updates/tags/mithril"}],readingTime:1.795,hasTruncateMarker:!1,authors:[{name:"Jean-Philippe Raynaud",title:"Mithril Tech Lead",url:"https://github.com/jpraynaud",imageURL:"https://github.com/jpraynaud.png",key:"jpraynaud"}],frontMatter:{title:"Mithril Team Update",slug:"2023-06-15-mithril",authors:"jpraynaud",tags:["mithril"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-06-16-hydra"},nextItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-06-14-consensus"}},p={authorsImageUrls:[void 0]},u=[{value:"High level overview",id:"high-level-overview",level:2},{value:"Low level overview",id:"low-level-overview",level:2}],s={toc:u},m="wrapper";function h(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,n.Z)({},s,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-overview"},"High level overview"),(0,a.kt)("p",null,"The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client\u2019s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet."),(0,a.kt)("p",null,"Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI."),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Completed on the epic that designs and implements generic signing/verification of entity services ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/780"},"#780"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Create the sub-command for 'Mithril Stake Distribution' in client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/896"},"#896")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Adapt end to end tests to handle new types of data")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/899"},"#899")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update client documentation")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/897"},"#897")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Update architecture documentations for new types of data")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/898"},"#898")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactoring client")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/960"},"#960")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic that prepares the Mithril infrastructure for ",(0,a.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/767"},"#767"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Enhance terraform infrastructure")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/930"},"#930")))),(0,a.kt)("li",{parentName:"ul"},"Completed the epic that implements the computation of the stake distribution for ",(0,a.kt)("inlineCode",{parentName:"li"},"mainnet")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/880"},"#880"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Check performance impact of new stake distribution command on the 'mainnet'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/962"},"#962")))),(0,a.kt)("li",{parentName:"ul"},"Worked on the epic ",(0,a.kt)("inlineCode",{parentName:"li"},"Prepare Mithril Signer deployment model for SPO")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/862"},"#862"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/961"},"#961")))),(0,a.kt)("li",{parentName:"ul"},"Worked on bugs and optimizations:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Aggregator does not always detect new immutable file")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/953"},"#953")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"CI tests fail with Rust '1.70.0'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/958"},"#958")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"End to end tests are flaky")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/954"},"#954")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Certificate dates in metadata are not on the same timezone")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/946"},"#946")),(0,a.kt)("li",{parentName:"ul"},"Worked on the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Refactor 'MithrilStakeDistribution' entity")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/967"},"#967")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Fix 'Mithril Client multi-platform test' with new client interface")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/956"},"#956")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Enhance 'ImmutableDigesterError::NotEnoughImmutable' error")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/969"},"#969")),(0,a.kt)("li",{parentName:"ul"},"Completed the issue ",(0,a.kt)("inlineCode",{parentName:"li"},"Client 'snapshot download' command fails with option '--download-dir'")," ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/mithril/issues/979"},"#979"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f872275a.dbdfeb4f.js b/assets/js/f872275a.dbdfeb4f.js new file mode 100644 index 00000000000..8bd37c9e23c --- /dev/null +++ b/assets/js/f872275a.dbdfeb4f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[46922],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},h="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),h=p(n),m=a,d=h["".concat(l,".").concat(m)]||h[m]||c[m]||r;return n?o.createElement(d,i(i({ref:t},u),{},{components:n})):o.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[h]="string"==typeof e?e:a,i[1]=s;for(var p=2;p<r;p++)i[p]=n[p];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}m.displayName="MDXCreateElement"},87739:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var o=n(87462),a=(n(67294),n(3905));const r={title:"Consensus Team Update",slug:"2023-03-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2023-03-08-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-08-consensus.md",source:"@site/blog/2023-03-08-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-03-08T00:00:00.000Z",formattedDate:"March 8, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:2.46,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-03-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-09-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-03-08-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3},{value:"Support",id:"support",level:3}],u={toc:p},h="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(h,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"The Consensus team continued working on refactoring and improving the UTxO-HD\nprototype, and introducing improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"lmdb")," related packages. In\nparticular we identified an opportunity to gain performance by handling locks in\na more optimal way."),(0,a.kt)("p",null,"On the Genesis front, we sketched a mitigation for an issue that ",(0,a.kt)("inlineCode",{parentName:"p"},"PNSol")," and\nResearchers caught. We also came op with a road map for not only testing the\nGenesis prototypes, but also for enriching the tests we already have."),(0,a.kt)("p",null,"Regarding technical debt, next to some minor improvements, we created\ncomponent-level micro-benchmarks for adding transactions to the mempool. The\nresults of these benchmarks will be published in the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," ",(0,a.kt)("a",{parentName:"p",href:"https://input-output-hk.github.io/ouroboros-consensus/"},"web\npage"),"."),(0,a.kt)("p",null,"We also finished moving the Consensus documentation to the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),"\nrepository, released ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus")," ",(0,a.kt)("inlineCode",{parentName:"p"},"0.3.0.0"),", and reduced the time\nGitHub actions take in ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"."),(0,a.kt)("h2",{id:"workstreams"},"Workstreams"),(0,a.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,a.kt)("p",null,"We continued working on refactoring and improving the UTxO-HD prototype. As a\nresult of the first round of sytem-level benchmarks, we identified an\nopportunity to optimise the way we handle locks to improve performance\n(",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4393"},"#4393"),")."),(0,a.kt)("p",null,"Also, we introduced several improvements to the ",(0,a.kt)("inlineCode",{parentName:"p"},"lmdb")," related packages:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/19"},"New tests")," for read-only transaction handles."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/18"},"New functions")," and ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/13"},"data types"),"."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/lmdb-simple/pull/11"},"Updates")," to support improved type safety and smaller constraints in\nthe UTxO HD prototype."),(0,a.kt)("li",{parentName:"ul"},"Windows and MacOS ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/haskell-lmdb/pull/8"},"CI support"),".")),(0,a.kt)("h3",{id:"genesis"},"Genesis"),(0,a.kt)("p",null,"We sketched out a mitigation of the issue that ",(0,a.kt)("inlineCode",{parentName:"p"},"PNSol")," and Researchers caught in\nthe Genesis design."),(0,a.kt)("p",null,"We came up with a road map for testing the Genesis prototypes, including early\nmilestones that are applicable to today's master branch, ie tests that are\nuseful before Genesis, and that will be nicely enriched when we do add Genesis."),(0,a.kt)("p",null,"We developed the aforementioned tests, specifically a ",(0,a.kt)("inlineCode",{parentName:"p"},"QuickCheck")," generator for\nthe Honest leader schedule and one as-aggressive-as-possible Adversarial\nleader schedule that together satisfy the Praos properties that the Consensus\ndesign takes as invariants."),(0,a.kt)("p",null,"We investigated why the improved ",(0,a.kt)("inlineCode",{parentName:"p"},"ChainDB")," queueing implementation behaves\ndifferently in the baseline compared to the prototype, and we are close to\nhaving a full picture of how the Consensus components interact during bulk sync."),(0,a.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4400"},"created")," component-level micro-benchmarks for adding transactions\nto the mempool. We plan on extending this to more mempool actions and different\ntypes of blocks. We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4422"},"store")," the benchmark data to make it available\nto the GitHub action that ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/12"},"publishes")," the benchmarks results."),(0,a.kt)("p",null,"Other minor improvements include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4429"},"Removal")," of ",(0,a.kt)("inlineCode",{parentName:"li"},"Test.Util.Classify")," in favour of ",(0,a.kt)("inlineCode",{parentName:"li"},"Test.StateMachine.Labelling"),"."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4423"},"Addition")," of ",(0,a.kt)("inlineCode",{parentName:"li"},"-Wunused-packages")," to the default ",(0,a.kt)("inlineCode",{parentName:"li"},"ghc-options")," for Consensus\npackages.")),(0,a.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,a.kt)("p",null,"We finished moving the Consensus documentation ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4374"},"from"),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/haskell-lmdb/pull/8"},"to")," ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),", in preparation for\nmigrating the code to the latter repository."),(0,a.kt)("h3",{id:"support"},"Support"),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4412"},"released")," ouroboros-consensus 0.3.0.0."),(0,a.kt)("p",null,"We ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4421"},"reduced")," the load in the ",(0,a.kt)("inlineCode",{parentName:"p"},"ouroboros-network")," GitHub actions,\nthereby reducing the time CI jobs take."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f89a4337.d99ad3e6.js b/assets/js/f89a4337.d99ad3e6.js new file mode 100644 index 00000000000..066c5084a0a --- /dev/null +++ b/assets/js/f89a4337.d99ad3e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[25189],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>s});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),u=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),m=u(a),h=r,s=m["".concat(l,".").concat(h)]||m[h]||d[h]||i;return a?n.createElement(s,o(o({ref:t},c),{},{components:a})):n.createElement(s,o({ref:t},c))}));function s(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=h;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[m]="string"==typeof e?e:r,o[1]=p;for(var u=2;u<i;u++)o[u]=a[u];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},54416:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var n=a(87462),r=(a(67294),a(3905));const i={title:"Node API & CLI Team Update",slug:"2023-09-26-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},o="Node-Api-Cli Update",p={permalink:"/cardano-updates/2023-09-26-node-cli-api",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-26-node-cli-api.md",source:"@site/blog/2023-09-26-node-cli-api.md",title:"Node API & CLI Team Update",description:"High level summary",date:"2023-09-26T00:00:00.000Z",formattedDate:"September 26, 2023",tags:[{label:"cli-api",permalink:"/cardano-updates/tags/cli-api"}],readingTime:1.68,hasTruncateMarker:!1,authors:[{name:"Carlos LopezDeLara",title:"Node Product Owner",url:"https://github.com/CarlosLopezDeLara",imageURL:"https://github.com/CarlosLopezDeLara.png",key:"carlos"}],frontMatter:{title:"Node API & CLI Team Update",slug:"2023-09-26-node-cli-api",authors:"carlos",tags:["cli-api"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-09-27-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-09-22-hydra"}},l={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"cardano-cli",id:"cardano-cli",level:3},{value:"cardano-api",id:"cardano-api",level:3},{value:"cardano-node",id:"cardano-node",level:3},{value:"cardano-testnet",id:"cardano-testnet",level:3},{value:"docs",id:"docs",level:3},{value:"CI & project maintenance",id:"ci--project-maintenance",level:3}],c={toc:u},m="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"2023-09-13---2023-09-26"},"2023-09-13 - 2023-09-26"),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/releases/tag/8.4.0-pre"},"cardano-node 8.4.0-pre")," release suitable for SanchoNet."),(0,r.kt)("li",{parentName:"ul"},"CLI continues making progress integrating governance features. During this sprint we integrated the ",(0,r.kt)("strong",{parentName:"li"},"info")," and ",(0,r.kt)("strong",{parentName:"li"},"new-committee")," governance actions."),(0,r.kt)("li",{parentName:"ul"},"The team continued moving to the ERA top-level commands structure. Removed ",(0,r.kt)("inlineCode",{parentName:"li"},"--conway-era")," flag from the legacy commands making conway era commands only accessible via ",(0,r.kt)("inlineCode",{parentName:"li"},"cardano-cli conway"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"stake-pool")," command is now under the ERA top level structure."),(0,r.kt)("li",{parentName:"ul"},"API continues integration with governance features, it is worth to higlight that now ",(0,r.kt)("em",{parentName:"li"},"ProposeNewCommitee")," uses the right key type (cc-cold)")),(0,r.kt)("h3",{id:"cardano-cli"},"cardano-cli"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/302"},"Disambiguate 2-n flags in governance new-committee action")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/298"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-cli-8.10.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/295"},"Upgrade to ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.20.2"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/292"},"cardano-cli: add governance create-info command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/287"},"Release 8.9.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/286"},"Export ",(0,r.kt)("inlineCode",{parentName:"a"},"Cardano.CLI.Legacy.Options.pLegacyCardanoEra")," for cardano-testnet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/284"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"SomeWitness")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"SomeSigningWitness"),". Rename constructors to avoid name conflicts.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/283"},"Update cardano-api to 8.20.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/282"},"Remove unused governance-related code")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/281"},"Fix typo in stake-pool help text and clarify drep queries arguments")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/280"},"Remove redundant conversions in JSON friendly instances ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/279"},"Regularise era based command structure")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/277"},"Simplify era handling")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/276"},"Remove ",(0,r.kt)("inlineCode",{parentName:"a"},"--conway-era")," flag")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/275"},"Era-based ",(0,r.kt)("inlineCode",{parentName:"a"},"stake-pool")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/274"},"Fix git revision in ",(0,r.kt)("inlineCode",{parentName:"a"},"version")," command")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-cli/pull/273"},"cardano-cli-8.8.0.0"))),(0,r.kt)("h3",{id:"cardano-api"},"cardano-api"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/265"},"Organise eon re-exports. Export ",(0,r.kt)("inlineCode",{parentName:"a"},"MaryEraOnwards"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/264"},"cardano-api-internal: ProposeNewCommittee: StakeKey -> CommitteeColdKey")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/262"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.21.0.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/256"},"Delete unused eon constraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/255"},"Export ByronEraOnly")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/254"},"Replace only ",(0,r.kt)("inlineCode",{parentName:"a"},"AdaSupportedInEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"MultiAssetSupportedInEra")," with eons")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/250"},"New version ",(0,r.kt)("inlineCode",{parentName:"a"},"cardano-api-8.20.2.0"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/249"},"Add JSON instance for Hash GenesisKey ")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/248"},"Support more ledger constraints")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/247"},"Rename ",(0,r.kt)("inlineCode",{parentName:"a"},"FeatureInEra")," to ",(0,r.kt)("inlineCode",{parentName:"a"},"Eon"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/246"},"Release 8.20.1.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/245"},"Fix DRep Stake and DRep Stake queries for empty lists")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/244"},"Delete ",(0,r.kt)("inlineCode",{parentName:"a"},"TxFeesExplicitInEra")," and ",(0,r.kt)("inlineCode",{parentName:"a"},"TxFeesImplicitInEra"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/243"},"Fix typos in some deserialization error messages")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/pull/240"},"Fix querying for dreps in ",(0,r.kt)("inlineCode",{parentName:"a"},"transaction build")," in eras before conway"))),(0,r.kt)("h3",{id:"cardano-node"},"cardano-node"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5480"},"Trace Configuration Trace Message Enhancement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5474"},"Bump versions for cardano-node-8.4.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5467"},"Updated dependencies for cardano-node-8.4.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5466"},"cardano-node: reduce orphan instances"))),(0,r.kt)("h3",{id:"cardano-testnet"},"cardano-testnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5474"},"Bump versions for cardano-node-8.4.0-pre")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5471"},"Update to cardano-cli 8.9.0.0")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5467"},"Updated dependencies for cardano-node-8.4.0-pre"))),(0,r.kt)("h3",{id:"docs"},"docs"),(0,r.kt)("h3",{id:"ci--project-maintenance"},"CI & project maintenance"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f96c80d6.4ce4cb71.js b/assets/js/f96c80d6.4ce4cb71.js new file mode 100644 index 00000000000..2cea2e0e329 --- /dev/null +++ b/assets/js/f96c80d6.4ce4cb71.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90288],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>g});var r=t(67294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){a(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,a=function(e,n){if(null==e)return{};var t,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},p=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=c(t),p=a,g=u["".concat(s,".").concat(p)]||u[p]||d[p]||o;return t?r.createElement(g,i(i({ref:n},m),{},{components:t})):r.createElement(g,i({ref:n},m))}));function g(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=p;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=t[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}p.displayName="MDXCreateElement"},75947:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=t(87462),a=(t(67294),t(3905));const o={title:"Performance & Tracing Update",slug:"2023-12-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-12-04-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-12-04-performance-and-tracing.md",source:"@site/blog/2023-12-04-performance-and-tracing.md",title:"Performance & Tracing Update",description:"High level summary",date:"2023-12-04T00:00:00.000Z",formattedDate:"December 4, 2023",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:2.085,hasTruncateMarker:!1,authors:[{name:"Michael Karg",title:"Performance and Tracing Team Lead",url:"https://github.com/mgmeier",imageURL:"https://github.com/mgmeier.png",key:"mgmeier"}],frontMatter:{title:"Performance & Tracing Update",slug:"2023-12-04-performance-and-tracing",authors:"mgmeier",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-12-06-mithril"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-12-01-hydra"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Low level overview",id:"low-level-overview",level:2},{value:"Benchmarking",id:"benchmarking",level:3},{value:"Development",id:"development",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Tracing",id:"tracing",level:3},{value:"Nomad backend",id:"nomad-backend",level:3}],m={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,a.kt)(u,(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Benchmarking: Release benchmarking for node ",(0,a.kt)("inlineCode",{parentName:"li"},"8.7.0"),". Also, we performed the first-ever Conway benchmarks."),(0,a.kt)("li",{parentName:"ul"},"Development: Conway capability of our workload generator has been implemented and merged to ",(0,a.kt)("inlineCode",{parentName:"li"},"master"),"."),(0,a.kt)("li",{parentName:"ul"},"Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data."),(0,a.kt)("li",{parentName:"ul"},"Tracing: Quality-of-life improvements to tracing output and addition of a test suite."),(0,a.kt)("li",{parentName:"ul"},"Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.")),(0,a.kt)("h2",{id:"low-level-overview"},"Low level overview"),(0,a.kt)("h3",{id:"benchmarking"},"Benchmarking"),(0,a.kt)("p",null,"A full set of benchmarks for node ",(0,a.kt)("inlineCode",{parentName:"p"},"8.7.0")," has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of ",(0,a.kt)("inlineCode",{parentName:"p"},"8.7.0")," over ",(0,a.kt)("inlineCode",{parentName:"p"},"8.6.0"),", and can confirm no regressions have been introduced."),(0,a.kt)("p",null,"Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version.\nOnly Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty."),(0,a.kt)("h3",{id:"development"},"Development"),(0,a.kt)("p",null,"Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era.\nCurrently, we're looking into adding Conway-exclusive features, such as ",(0,a.kt)("inlineCode",{parentName:"p"},"DRep")," registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining ",(0,a.kt)("inlineCode",{parentName:"p"},"DRep")," sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying."),(0,a.kt)("h3",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've\nimproved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data."),(0,a.kt)("h3",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages.\nAdditionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system."),(0,a.kt)("h3",{id:"nomad-backend"},"Nomad backend"),(0,a.kt)("p",null,"We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f96c80dc.85f32d0b.js b/assets/js/f96c80dc.85f32d0b.js new file mode 100644 index 00000000000..d53e7a6b7a5 --- /dev/null +++ b/assets/js/f96c80dc.85f32d0b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[70641],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),s=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return r.createElement(d.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(a),h=n,m=u["".concat(d,".").concat(h)]||u[h]||p[h]||o;return a?r.createElement(m,i(i({ref:t},c),{},{components:a})):r.createElement(m,i({ref:t},c))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},9022:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-09-01-hydra",authors:["v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-09-01-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-09-01-hydra.md",source:"@site/blog/2023-09-01-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-09-01T00:00:00.000Z",formattedDate:"September 1, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.93,hasTruncateMarker:!1,authors:[{name:"Sasha Bogicevic",title:"Hydra Software Engineer",url:"https://github.com/v0d1ch",imageURL:"https://github.com/v0d1ch.png",key:"v0d1ch"}],frontMatter:{title:"Hydra Team Update",slug:"2023-09-01-hydra",authors:["v0d1ch"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-09-01-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-09-01-ledger"}},d={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],c={toc:s},u="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team focused primarily on changes needed in the network\nlayer and have the first draft document related to needed design. They also\nimproved the user experience by allowing a commit using inline datums.\nDiscussed the off-chain governance with researchers and improved internal model\ntests. "),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report published"),(0,n.kt)("li",{parentName:"ul"},"Small changes to hydraw and tutorial in light of the Masterclass"),(0,n.kt)("li",{parentName:"ul"},"Investigated a bug and saw it was solved by recent developments"),(0,n.kt)("li",{parentName:"ul"},"Improved the model tests by fully validating L1 transactions"),(0,n.kt)("li",{parentName:"ul"},"Enhanced the /commit API to also allow commit from scripts with inline datums (user request)"),(0,n.kt)("li",{parentName:"ul"},"Discussed off-chain governance with IOG and CF researchers"),(0,n.kt)("li",{parentName:"ul"},"Drafted a first network specification document in the context of Network resilience")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},'Have a clear understanding of the changes we need for the "Improve network resiliency" feature'),(0,n.kt)("li",{parentName:"ul"},"Groomed and agreed plan on incremental commits/decommits"),(0,n.kt)("li",{parentName:"ul"},"Updated tutorials including CI workflows to check consistency"),(0,n.kt)("li",{parentName:"ul"},"Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fa00d705.cb0aaed6.js b/assets/js/fa00d705.cb0aaed6.js new file mode 100644 index 00000000000..c33f061d7e9 --- /dev/null +++ b/assets/js/fa00d705.cb0aaed6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[26710],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>f});var r=a(67294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?n(Object(a),!0).forEach((function(t){o(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):n(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,o=function(e,t){if(null==e)return{};var a,r,o={},n=Object.keys(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r<n.length;r++)a=n[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,o=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=p(a),m=o,f=u["".concat(s,".").concat(m)]||u[m]||c[m]||n;return a?r.createElement(f,l(l({ref:t},d),{},{components:a})):r.createElement(f,l({ref:t},d))}));function f(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=a.length,l=new Array(n);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,l[1]=i;for(var p=2;p<n;p++)l[p]=a[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},94828:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var r=a(87462),o=(a(67294),a(3905));const n={title:"SRE Team Update",slug:"2023-11-24-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-11-24-sre",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-11-24-sre.md",source:"@site/blog/2023-11-24-sre.md",title:"SRE Team Update",description:"High level summary",date:"2023-11-24T00:00:00.000Z",formattedDate:"November 24, 2023",tags:[{label:"sre",permalink:"/cardano-updates/tags/sre"}],readingTime:3.115,hasTruncateMarker:!1,authors:[{name:"John Lotoski",title:"Service Reliability Engineer",url:"https://github.com/johnalotoski",imageURL:"https://github.com/johnalotoski.png",key:"johnalotoski"}],frontMatter:{title:"SRE Team Update",slug:"2023-11-24-sre",authors:"johnalotoski",tags:["sre"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-11-24-hydra"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-11-22-ledger"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Capkgs",id:"capkgs",level:3},{value:"Cardano-node",id:"cardano-node",level:3},{value:"Cardano-parts",id:"cardano-parts",level:3},{value:"Cardano-playground",id:"cardano-playground",level:3},{value:"Offchain-metadata-tools",id:"offchain-metadata-tools",level:3}],d={toc:p},u="wrapper";function c(e){let{components:t,...a}=e;return(0,o.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,o.kt)("p",null,"The SRE team continues work on cardano environment improvements and general environment maintenance."),(0,o.kt)("p",null,"Some notable recent changes, updates or improvements include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The cardano-node nixos service now supports SIGHUP p2p topology reloading when the ",(0,o.kt)("inlineCode",{parentName:"li"},"useSystemdReload")," option is enabled")),(0,o.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,o.kt)("h3",{id:"capkgs"},"Capkgs"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Update cardano-db-sync and offchain-metadata-tools package paths and/or references: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/capkgs/compare/994696f...3ce364f"},"capkgs-compare"))),(0,o.kt)("h3",{id:"cardano-node"},"Cardano-node"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/5537"},"cardano-node-pull-5537"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Creates a useSystemdReload bool option for the cardano-node nixos service"),(0,o.kt)("li",{parentName:"ul"},"This will move the topology file(s) to ",(0,o.kt)("inlineCode",{parentName:"li"},"/etc/cardano-node/topology-$i.yaml")," and inject systemd reload hooks for p2p configured cardano-node instances"),(0,o.kt)("li",{parentName:"ul"},"Moving topology files to ",(0,o.kt)("inlineCode",{parentName:"li"},"/etc")," also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired")))),(0,o.kt)("h3",{id:"cardano-parts"},"Cardano-parts"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Adds a metadata server profile and a number of other features and improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-parts/pull/20"},"cardano-parts-pull-20"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Adds a new metadata-service profile"),(0,o.kt)("li",{parentName:"ul"},"Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile"),(0,o.kt)("li",{parentName:"ul"},"Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish"),(0,o.kt)("li",{parentName:"ul"},"Adds extra node list producers and public producers for cardano-node-topology profile"),(0,o.kt)("li",{parentName:"ul"},"Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch"),(0,o.kt)("li",{parentName:"ul"},"Adds select systemd metrics reporting to grafana-agent profile"),(0,o.kt)("li",{parentName:"ul"},"Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS"),(0,o.kt)("li",{parentName:"ul"},"Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it"),(0,o.kt)("li",{parentName:"ul"},"Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo"),(0,o.kt)("li",{parentName:"ul"},"Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation"),(0,o.kt)("li",{parentName:"ul"},"Adds support for grafana recording rules in the template files"),(0,o.kt)("li",{parentName:"ul"},"Improves cardano-group profile handling of producers with respect to multiple instance nodes"),(0,o.kt)("li",{parentName:"ul"},"Improves grafana-agent profile metrics handling for multi-instance cardano-node servers"),(0,o.kt)("li",{parentName:"ul"},"Improves smash service preStart handling while waiting for a node socket"),(0,o.kt)("li",{parentName:"ul"},"Updates Justfile for ERA_CMD demo support"),(0,o.kt)("li",{parentName:"ul"},"Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates"),(0,o.kt)("li",{parentName:"ul"},"Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile"),(0,o.kt)("li",{parentName:"ul"},"Defaults cardano-postgres profile psqlrc use to false")))),(0,o.kt)("h3",{id:"cardano-playground"},"Cardano-playground"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Adds a new testnet metadata server, cluster webserver, and other improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-playground/pull/6"},"cardano-playground-pull-6"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Adds a new metadata server"),(0,o.kt)("li",{parentName:"ul"},"Adds a new webserver for the cluster's static virtualhost needs"),(0,o.kt)("li",{parentName:"ul"},"Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo"),(0,o.kt)("li",{parentName:"ul"},"Adds systemd metrics monitoring to the cluster"),(0,o.kt)("li",{parentName:"ul"},"Resizes sanchonet machines to support the growing chain"),(0,o.kt)("li",{parentName:"ul"},"Completes migration of preprod from world"),(0,o.kt)("li",{parentName:"ul"},"Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes"),(0,o.kt)("li",{parentName:"ul"},"Updates Justfile for ERA_CMD demo support"),(0,o.kt)("li",{parentName:"ul"},"Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile"),(0,o.kt)("li",{parentName:"ul"},"Migrates book static code to playground from world, with refactor, cleanup and updates"),(0,o.kt)("li",{parentName:"ul"},"Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules")))),(0,o.kt)("h3",{id:"offchain-metadata-tools"},"Offchain-metadata-tools"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Adds db password option with obfuscation plus misc improvements: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/offchain-metadata-tools/pull/61"},"offchain-metadata-tools-pull-61"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services"),(0,o.kt)("li",{parentName:"ul"},"Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile"),(0,o.kt)("li",{parentName:"ul"},"Moves from std use in the nix flake to standard flake schema"),(0,o.kt)("li",{parentName:"ul"},"Fixes hydra CI failures"),(0,o.kt)("li",{parentName:"ul"},"Builds update-docs in hydra to avoid long local build times"),(0,o.kt)("li",{parentName:"ul"},"Removes deprecated tullia"),(0,o.kt)("li",{parentName:"ul"},"Removes deprecated check-hydra from pkgs"),(0,o.kt)("li",{parentName:"ul"},"Removes deprecated bors files and references")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fa0b1b5d.f62143b4.js b/assets/js/fa0b1b5d.f62143b4.js new file mode 100644 index 00000000000..df404f57aa8 --- /dev/null +++ b/assets/js/fa0b1b5d.f62143b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[90056],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>h});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),c=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=c(r),u=n,h=m["".concat(p,".").concat(u)]||m[u]||d[u]||o;return r?a.createElement(h,l(l({ref:t},s),{},{components:r})):a.createElement(h,l({ref:t},s))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}u.displayName="MDXCreateElement"},62140:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(87462),n=(r(67294),r(3905));const o={title:"Goedel Team Update",slug:"2023-05-12-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-05-12-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-05-12-goedel.md",source:"@site/blog/2023-05-12-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-05-12T00:00:00.000Z",formattedDate:"May 12, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.445,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-05-12-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Crypto Team Update",permalink:"/cardano-updates/2023-05-12-crypto"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-05-12-hydra"}},p={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],s={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"This sprint the team had two paper accepted for ICE 2023\n(",(0,n.kt)("a",{parentName:"p",href:"https://www.discotec.org/2023/ice"},"https://www.discotec.org/2023/ice"),"). The event will be held in Lisbon\non 19th June 2023. The papers will be published in EPTCS."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Application layer for Praos formalisation in review.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Participating in interactive peer review process for ICE 2023.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"The team is hiring a performance engineering intern - ",(0,n.kt)("a",{parentName:"p",href:"https://apply.workable.com/io-global/j/BFEC5B0AFF/"},"https://apply.workable.com/io-global/j/BFEC5B0AFF/")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fa57bfdd.f14710cf.js b/assets/js/fa57bfdd.f14710cf.js new file mode 100644 index 00000000000..861ba3bd49f --- /dev/null +++ b/assets/js/fa57bfdd.f14710cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92149],{64665:a=>{a.exports=JSON.parse('{"label":"network","permalink":"/cardano-updates/tags/network","allTagsPath":"/cardano-updates/tags","count":24}')}}]); \ No newline at end of file diff --git a/assets/js/fa5dce7e.e833700b.js b/assets/js/fa5dce7e.e833700b.js new file mode 100644 index 00000000000..41ebb7482cb --- /dev/null +++ b/assets/js/fa5dce7e.e833700b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[73001],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(a),d=n,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return a?r.createElement(f,l(l({ref:t},c),{},{components:a})):r.createElement(f,l({ref:t},c))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:n,l[1]=i;for(var p=2;p<o;p++)l[p]=a[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},20486:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Goedel Team Update",slug:"2023-08-18-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2023-08-18-goedel",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-18-goedel.md",source:"@site/blog/2023-08-18-goedel.md",title:"Goedel Team Update",description:"The team works on applied research and consulting in formal methods",date:"2023-08-18T00:00:00.000Z",formattedDate:"August 18, 2023",tags:[{label:"goedel",permalink:"/cardano-updates/tags/goedel"}],readingTime:.72,hasTruncateMarker:!1,authors:[{name:"James Chapman",title:"Head of Formal Methods",url:"https://github.com/jmchapman",imageURL:"https://github.com/jmchapman.png",key:"jmchapman"}],frontMatter:{title:"Goedel Team Update",slug:"2023-08-18-goedel",authors:"jmchapman",tags:["goedel"],hide_table_of_contents:!1},prevItem:{title:"Consensus Team Update",permalink:"/cardano-updates/2023-08-23-consensus"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2023-08-18-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Details",id:"details",level:2}],c={toc:p},u="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond."),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype."),(0,n.kt)("h2",{id:"details"},"Details"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Development of an automated prover for showing conformance of\nprograms to state machines (as part of the mini-protocol framework)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Completion of the documentation of the (current state of the)\nmini-protocol framework")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Discussion about two DeltaQ lectures with two practical sessions as part\nof 4th year masters course on distributed systemsby colleagues at UC\nLouvain in the Autumn")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Discussion about four DeltaQ lectures by colleagues at U. Bergen as part\nof a 5th year Masters course in the Autumn")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Adapted original DeltaQ implementation to the new typeclasses and\nwrote property tests for its algebraic laws"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/faece773.2d8cf6c5.js b/assets/js/faece773.2d8cf6c5.js new file mode 100644 index 00000000000..0e4d900894f --- /dev/null +++ b/assets/js/faece773.2d8cf6c5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[32023],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),d=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=d(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=d(a),h=r,m=c["".concat(p,".").concat(h)]||c[h]||u[h]||o;return a?n.createElement(m,i(i({ref:t},s),{},{components:a})):n.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var d=2;d<o;d++)i[d]=a[d];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}h.displayName="MDXCreateElement"},58910:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=a(87462),r=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-02-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-02-03-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-03-hydra.md",source:"@site/blog/2023-02-03-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-03T00:00:00.000Z",formattedDate:"February 3, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.12,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-02-03-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-02-02-ledger"}},p={authorsImageUrls:[void 0]},d=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:d},c="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"This week, the Hydra team completed the Hydra specification with a section about\nrollbacks and updated graphs\n(",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/448"},"#448"),"). In a next step,\nthe specification will be made more approachable and an open standard. They\nimproved their ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-cluster")," tool to launch a local ",(0,r.kt)("inlineCode",{parentName:"p"},"--devnet")," sandbox\nenvironment and continued aligning the ",(0,r.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts with the\nspecification by hardening the checks on ",(0,r.kt)("inlineCode",{parentName:"p"},"close")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"contest")," transactions."),(0,r.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Completed the specification with a section about rollbacks and updated graphs\n",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/448"},"#448"),", with a follow-up on making it more approachable and an open standard."),(0,r.kt)("li",{parentName:"ul"},"Continued spec review with internal auditor and incorporated changes."),(0,r.kt)("li",{parentName:"ul"},"Talked to TxPipe about how Demeter and Hydra could work together"),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"hydra-cluster")," executable can be used to launch a local ",(0,r.kt)("inlineCode",{parentName:"li"},"--devnet")," sandbox environment."),(0,r.kt)("li",{parentName:"ul"},"Reproduced the \u201chead being stuck on network outage\u201d bug",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed."))),(0,r.kt)("li",{parentName:"ul"},"Progressed with higher velocity by addressing more and more gaps ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/677"},"#677"))),(0,r.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Upstream our JSON instances to the ledger"),(0,r.kt)("li",{parentName:"ul"},"Close all transaction security related on-chain gaps"),(0,r.kt)("li",{parentName:"ul"},"Ideally release 0.9.0 with updated scripts"),(0,r.kt)("li",{parentName:"ul"},"Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb0b9e22.7e06c8d0.js b/assets/js/fb0b9e22.7e06c8d0.js new file mode 100644 index 00000000000..0b136f0dba6 --- /dev/null +++ b/assets/js/fb0b9e22.7e06c8d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[92522],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=u(a),d=n,c=s["".concat(p,".").concat(d)]||s[d]||m[d]||o;return a?r.createElement(c,i(i({ref:t},h),{},{components:a})):r.createElement(c,i({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u<o;u++)i[u]=a[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},20214:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-06-23-hydra",authors:["ffakenz","pgrange"],tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-06-23-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-23-hydra.md",source:"@site/blog/2023-06-23-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-23T00:00:00.000Z",formattedDate:"June 23, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.79,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"},{name:"Pascal Grange",title:"Hydra Software Engineer",url:"https://github.com/pgrange",imageURL:"https://github.com/pgrange.png",key:"pgrange"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-23-hydra",authors:["ffakenz","pgrange"],tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-06-23-goedel"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-06-23-network"}},p={authorsImageUrls:[void 0,void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:u},s="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team shared progress updates during the monthly review\nmeeting (monthly report and video recording available soon) and started\nexperimenting on preview network with the new commit from external wallet\nfeature."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly report & review meeting, demonstrating ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/887"},"commit from external\nwallet")),(0,n.kt)("li",{parentName:"ul"},"Published regular ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/unstable/benchmarks/end-to-end-benchmarks"},"benchmarks for\nHydra")),(0,n.kt)("li",{parentName:"ul"},"Moved forward the journey for external commits using multiple script UTxOs\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"Changed the API to only put transaction id in snapshots, instead of the full\ntransactions ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/922"},"#922")," -> this\nis now evolved into fully addressing ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/728"},"#728")),(0,n.kt)("li",{parentName:"ul"},"Fuel marking is now optional as one can now commit from an external wallet\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/924"},"#924")),(0,n.kt)("li",{parentName:"ul"},"Add flag option to display node version on tui\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/934"},"#934"))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete external commits using multiple script UTxOs ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/903"},"#903")),(0,n.kt)("li",{parentName:"ul"},"New release 0.11.0"),(0,n.kt)("li",{parentName:"ul"},"Dirtroad solution of improved persistence performance ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/913"},"#913"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb63aa20.850437a9.js b/assets/js/fb63aa20.850437a9.js new file mode 100644 index 00000000000..ef64af01161 --- /dev/null +++ b/assets/js/fb63aa20.850437a9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[58470],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(r),p=a,h=m["".concat(s,".").concat(p)]||m[p]||d[p]||o;return r?n.createElement(h,i(i({ref:t},u),{},{components:r})):n.createElement(h,i({ref:t},u))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var c=2;c<o;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}p.displayName="MDXCreateElement"},62389:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(87462),a=(r(67294),r(3905));const o={title:"Performance & tracing update",slug:"2022-12-14-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-12-14-performance-and-tracing",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-14-performance-and-tracing.md",source:"@site/blog/2022-12-14-performance-and-tracing.md",title:"Performance & tracing update",description:"High level summary",date:"2022-12-14T00:00:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"performance-tracing",permalink:"/cardano-updates/tags/performance-tracing"}],readingTime:3.095,hasTruncateMarker:!1,authors:[{name:"Serge Kosyrev",title:"Performance and Tracing Team Lead",url:"https://github.com/deepfire",imageURL:"https://github.com/deepfire.png",key:"deepfire"}],frontMatter:{title:"Performance & tracing update",slug:"2022-12-14-performance-and-tracing",authors:"deepfire",tags:["performance-tracing"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2022-12-14-node-cli-api"},nextItem:{title:"Network Team Update",permalink:"/cardano-updates/2022-12-12-network"}},s={authorsImageUrls:[void 0]},c=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Performance",id:"performance",level:2},{value:"Tracing",id:"tracing",level:2},{value:"Infrastructure",id:"infrastructure",level:2}],u={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment."),(0,a.kt)("li",{parentName:"ol"},"A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals."),(0,a.kt)("li",{parentName:"ol"},"Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started."),(0,a.kt)("li",{parentName:"ol"},"Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.")),(0,a.kt)("h2",{id:"performance"},"Performance"),(0,a.kt)("p",null,"The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload."),(0,a.kt)("p",null,"We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling."),(0,a.kt)("h2",{id:"tracing"},"Tracing"),(0,a.kt)("p",null,"After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical."),(0,a.kt)("p",null,"To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration."),(0,a.kt)("li",{parentName:"ol"},"The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.")),(0,a.kt)("p",null,"All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further."),(0,a.kt)("p",null,"In addition, we're still pursuing our performance-enhancing rework of the new tracing internals."),(0,a.kt)("h2",{id:"infrastructure"},"Infrastructure"),(0,a.kt)("p",null,"After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends."),(0,a.kt)("p",null,"Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it.\nThis means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis.\nThis will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports."),(0,a.kt)("p",null,"A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches.\nPreviously we only had automation for two aspects separately, so we only could either:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"compare individual runs (used for different node configurations / versions)"),(0,a.kt)("li",{parentName:"ul"},"collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version)\nNaturally, combining these two capabilities was a long-desired feature of our analysis pipeline.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb793160.b4e7853d.js b/assets/js/fb793160.b4e7853d.js new file mode 100644 index 00000000000..8d1b311e96e --- /dev/null +++ b/assets/js/fb793160.b4e7853d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[87411],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),c=p(n),h=r,m=c["".concat(l,".").concat(h)]||c[h]||d[h]||a;return n?o.createElement(m,s(s({ref:t},u),{},{components:n})):o.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,s=new Array(a);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[c]="string"==typeof e?e:r,s[1]=i;for(var p=2;p<a;p++)s[p]=n[p];return o.createElement.apply(null,s)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},48089:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Consensus Team Update",slug:"2023-02-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-02-08-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-08-consensus.md",source:"@site/blog/2023-02-08-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-02-08T00:00:00.000Z",formattedDate:"February 8, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.5,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-02-08-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-09-mithril"},nextItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-02-08-node-cli-api"}},l={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"UTxO HD Prototype",id:"utxo-hd-prototype",level:3},{value:"Genesis",id:"genesis",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Fostering collaboration",id:"fostering-collaboration",level:3},{value:"Support",id:"support",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,r.kt)("p",null,"We continue refactoring the UTxO HD prototype while we wait for the system level\nbenchmarks. We have created a new repository that contains the ",(0,r.kt)("inlineCode",{parentName:"p"},"anti-diff"),"\npackages used in this prototype."),(0,r.kt)("p",null,"On the Genesis front, we are preparing another meeting with the researchers to\naudit the implementation design, and we continued working on basic tests and\nsimplifications."),(0,r.kt)("p",null,"During the past two weeks we also introduced two new tools. One for dumping CBOR\nencoded blocks to JSON, and another to serve a local immutable DB."),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"utxo-hd-prototype"},"UTxO HD Prototype"),(0,r.kt)("p",null,"We are in the process of refactoring the UTxO HD prototype, while we wait for\nthe system level benchmarks to confirm if the performance of the prototype is\nsatisfactory."),(0,r.kt)("p",null,"We also set up a repository for the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/anti-diffs"},(0,r.kt)("inlineCode",{parentName:"a"},"anti-diff"))," package, which\nrequired us to refactor the code, write documentation, and prepare a release to\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-haskell-packages"},"CHaP"),"."),(0,r.kt)("h3",{id:"genesis"},"Genesis"),(0,r.kt)("p",null,"We worked on ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4347"},"basic tests")," for the ",(0,r.kt)("em",{parentName:"p"},"Limit on Eagerness")," property of\nGenesis. We also introduced further robustness and simplifications in the\nGenesis Density governor. Finally, we developed a presentation to engage again\nwith the researchers on our Genesis implementation design."),(0,r.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,r.kt)("h3",{id:"fostering-collaboration"},"Fostering collaboration"),(0,r.kt)("p",null,"We are in the process of ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/6"},"polishing")," the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus"),"\ndocumentation site, which we will use a the entry point for Consensus related\ndocumentation. The first version will not be complete, but we plan on\nsystematically improving it."),(0,r.kt)("h3",{id:"support"},"Support"),(0,r.kt)("p",null,"We ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4335"},"added a tool")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-consensus-cardano-tools")," which allows\nto dump the Chain DB blocks or any given CBOR encoded blocks as JSON."),(0,r.kt)("p",null,"We also added ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4339"},"another tool")," that serves an existing immutable DB via\nBlockFetch and ChainSync. This tool can help in assisting our local benchmarking\nefforts (for instance Genesis' ChainSync jumping prototype)."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb8d4667.f082283b.js b/assets/js/fb8d4667.f082283b.js new file mode 100644 index 00000000000..53160e22cb1 --- /dev/null +++ b/assets/js/fb8d4667.f082283b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[57161],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),p=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(n),h=r,m=d["".concat(s,".").concat(h)]||d[h]||c[h]||a;return n?o.createElement(m,i(i({ref:t},u),{},{components:n})):o.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var p=2;p<a;p++)i[p]=n[p];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},31241:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var o=n(87462),r=(n(67294),n(3905));const a={title:"Network Team Update",slug:"2022-10-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2022-10-28-network",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-10-28-network.md",source:"@site/blog/2022-10-28-network.md",title:"Network Team Update",description:"High-level summary",date:"2022-10-28T00:00:00.000Z",formattedDate:"October 28, 2022",tags:[{label:"network",permalink:"/cardano-updates/tags/network"}],readingTime:2.665,hasTruncateMarker:!1,authors:[{name:"Marcin Szamotulski",title:"Network Team Lead",url:"https://github.com/coot",imageURL:"https://github.com/coot.png",key:"coot"}],frontMatter:{title:"Network Team Update",slug:"2022-10-28-network",authors:"coot",tags:["network"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-10-28-hydra"},nextItem:{title:"Performance & Tracing Team Update",permalink:"/cardano-updates/2022-10-28-performance-and-tracing"}},s={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"Detailed description",id:"detailed-description",level:2},{value:"P2P Network Stack",id:"p2p-network-stack",level:3},{value:"Consensus",id:"consensus",level:3},{value:"Cardano Node",id:"cardano-node",level:3},{value:"Peer Sharing",id:"peer-sharing",level:3},{value:"Eclipse Evasion",id:"eclipse-evasion",level:3},{value:"IO-Sim",id:"io-sim",level:3},{value:"Open Source",id:"open-source",level:3},{value:"Mithril Cardano Integration",id:"mithril-cardano-integration",level:3}],u={toc:p},d="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"The team has focused on debuging & fixing bugs for the ",(0,r.kt)("strong",{parentName:"p"},"P2P single relay release"),", which included"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"diagnosing, fixing and writing tests for a bug in ",(0,r.kt)("inlineCode",{parentName:"li"},"peer-state-actions")," which\nfortunately hasn't been released;"),(0,r.kt)("li",{parentName:"ul"},"diagnosing & preventing misconfiguration of DNS")),(0,r.kt)("p",null,"We also focused on developing ",(0,r.kt)("strong",{parentName:"p"},"peer sharing"),". We also held a session with\nthe scientists on eclipse evasion."),(0,r.kt)("h2",{id:"detailed-description"},"Detailed description"),(0,r.kt)("h3",{id:"p2p-network-stack"},"P2P Network Stack"),(0,r.kt)("p",null,"During the past two weeks the team focused on p2p single relay release and peer\nsharing. We found and fixed an important bug recently introduced in one of the\ncomponents of p2p networking stack (fortunately never released). Together with\na fix, we designed a unit test diffusion simulation as well as quickcheck\nproperty test (both could reproduce it). We also changed the code in a way that\nif such a bug is reintroduced in the future, it will be obvious to diagnose.\nFor more see:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4067"},"ouroboros-network#4067")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4086"},"ouroboros-network#4086"))),(0,r.kt)("p",null,"Initial benchmarking run of the P2P code was executed. The results where\nunlike what we see on the mainnet. We found a possible misconfiguration of the\ncluster (caused by 0 TTL on domain names), which could be the direct cause of\nit. We wrote a PR which rules out such misconfiguration. We are awaiting on\nthe next benchmarking results. See more at:"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4106"},"ouroboros-network#4106")),(0,r.kt)("p",null,"We also started working on P2P single relay release. The PR\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4120"},"ouroboros-network#4120"),"\nincludes ",(0,r.kt)("em",{parentName:"p"},"108")," patches cherry-picked from the ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch. We started\nworking toward integration these changes against the release branch of\n",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),". Early next week we ought to be able to have an early version\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," with ",(0,r.kt)("em",{parentName:"p"},"non experimental P2P support"),"!"),(0,r.kt)("p",null,"For more detailed release plan please see ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/3888"},"P2P - Single\nRelay"),"\nissue."),(0,r.kt)("h3",{id:"consensus"},"Consensus"),(0,r.kt)("p",null,"We identified and fixed missing error reporting in consensus\ninitialisation phase. See more at\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4015"},"ouroboros-network#4015")),(0,r.kt)("h3",{id:"cardano-node"},"Cardano Node"),(0,r.kt)("p",null,"We also made changes in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," in order to give better experience for\nnode operators. This includes updating severities of some of the traces as\nwell as implementing new format of the p2p topology file. For more see:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4563"},"cardano-node#4563"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-node/pull/4561"},"cardano-node#4561"))),(0,r.kt)("h3",{id:"peer-sharing"},"Peer Sharing"),(0,r.kt)("p",null,"We continued working on implementation of peer sharing. We have an early\nimplementation which will be reviewed and analysed in next weeks. We started\nworking on ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," integration. We need\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4392"},"PR #4392")," to be merged\nbefore such integration will be able to land in ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node"),", although this\nis ",(0,r.kt)("em",{parentName:"p"},"not blocking")," us currently. See more at:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-network/pull/4019"},"ouroboros-network#4019"))),(0,r.kt)("h3",{id:"eclipse-evasion"},"Eclipse Evasion"),(0,r.kt)("p",null,"We held a session which included Alexander Russel, Sandro Coretti-Drayton and\nNick Frisby from the consensus team. We discussed high lever design of the\neclipse evasion scheme, which is important for the design and implementation of\n",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-genesis"),". We got a positive feedback from the researchers."),(0,r.kt)("h3",{id:"io-sim"},"IO-Sim"),(0,r.kt)("p",null,"In this period we made little progress towards releasing ",(0,r.kt)("inlineCode",{parentName:"p"},"IO-Sim")," on Hackage.\nA single ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/io-sim/pull/32"},"PR")," which added\na few missing instances of the ",(0,r.kt)("inlineCode",{parentName:"p"},"STM")," monad."),(0,r.kt)("h3",{id:"open-source"},"Open Source"),(0,r.kt)("p",null,"We made sure the CI runs for PRs which comes from forks (which is important to\naccept contributions from 3rd parties)."),(0,r.kt)("h3",{id:"mithril-cardano-integration"},"Mithril Cardano Integration"),(0,r.kt)("p",null,"We held initial discussions with Arnaud Bailly about possible path to integrate\nmithril to ",(0,r.kt)("inlineCode",{parentName:"p"},"cardano-node")," and take advantage of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ouroboros-network"),"\ndiffusion layer."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fba052bd.92a16ec4.js b/assets/js/fba052bd.92a16ec4.js new file mode 100644 index 00000000000..602ffba5162 --- /dev/null +++ b/assets/js/fba052bd.92a16ec4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[36171],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),h=p(n),d=r,m=h["".concat(l,".").concat(d)]||h[d]||u[d]||o;return n?a.createElement(m,i(i({ref:t},c),{},{components:n})):a.createElement(m,i({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[h]="string"==typeof e?e:r,i[1]=s;for(var p=2;p<o;p++)i[p]=n[p];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},54664:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(87462),r=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2022-10-02-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},i=void 0,s={permalink:"/cardano-updates/2022-10-02-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-02-consensus.md",source:"@site/blog/2022-11-02-consensus.md",title:"Consensus Team Update",description:"High-level summary",date:"2022-11-02T00:00:00.000Z",formattedDate:"November 2, 2022",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:3.53,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2022-10-02-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Embedding Quality Workstream",permalink:"/cardano-updates/2022-11-03-embedding-quality"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2022-11-02-ledger"}},l={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"High-level status report",id:"high-level-status-report",level:2},{value:"Workstreams",id:"workstreams",level:2},{value:"Finish the UTxO HD prototype",id:"finish-the-utxo-hd-prototype",level:3},{value:"Backing store property tests",id:"backing-store-property-tests",level:4},{value:"LSM tree implementation",id:"lsm-tree-implementation",level:2},{value:"Benchmarking the CSJ prototype",id:"benchmarking-the-csj-prototype",level:3},{value:"Technical debt",id:"technical-debt",level:2}],c={toc:p},h="wrapper";function u(e){let{components:t,...o}=e;return(0,r.kt)(h,(0,a.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,r.kt)("p",null,"During the past two weeks, the consensus team continued its work on testing the\nUTxO HD prototype. We completed the era-transition and backing store tests, and\nthe mempool tests are advancing at a steady pace. Regarding our work in the\nGenesis design, we continued our collaboration with the research and networking\nteams, and we continue investigating strategies for making the chain-sync\njumping prototype faster."),(0,r.kt)("h2",{id:"high-level-status-report"},"High-level status report"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Finish the UTxO HD prototype: on track.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We worked on state-machine tests for the mempool, and spotted potential bugs\nin the implementation. Investigation is ongoing."),(0,r.kt)("li",{parentName:"ul"},"We have a set of property tests for the backing store. We still need to\nincorporate the improvements to the LMDB cursor API that these tests\nmade possible."),(0,r.kt)("li",{parentName:"ul"},"We merged the era-transition tests PR."))),(0,r.kt)("li",{parentName:"ul"},"Genesis: on track.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Design work around Genesis continues in collaboration with researchers and\nthe networking team."),(0,r.kt)("li",{parentName:"ul"},"We continued trying to improve the performance of the chain-sync jumping\nprototype. We gained additional insight on which parameters to tweak next.\nIn spite of the baseline still being faster, the current prototype already\nachieves a significant speedup when compared to the naive approach of simply\nrunning full chain-sync with all peers."))),(0,r.kt)("li",{parentName:"ul"},"Tech debt: on track.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"We clarified a common source of confusion around VRF tie-breaking and\ncross-era chain selection.")))),(0,r.kt)("h2",{id:"workstreams"},"Workstreams"),(0,r.kt)("h3",{id:"finish-the-utxo-hd-prototype"},"Finish the UTxO HD prototype"),(0,r.kt)("p",null,"We continued working on property-tests for the UTxO HD prototype. In particular\nwe merged the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4073"},"era-transition tests\nPR"),"."),(0,r.kt)("h4",{id:"backing-store-property-tests"},"Backing store property tests"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4081"},"backing store property tests\nPR")," has been\nreviewed. The next steps are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improve error handling and command generation."),(0,r.kt)("li",{parentName:"ul"},"Add coverage testing to check that we are not failing to cover interesting\ntest cases.")),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/lmdb-simple/pull/1"},"monadic cursor API"),"\nwent through its first review round. The API is in a relatively stable state.\nThis PR also unifies the ",(0,r.kt)("inlineCode",{parentName:"p"},"cborg")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"serialise"),"-based interfaces to LMDB\noperations. The next steps are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Write\n",(0,r.kt)("a",{parentName:"li",href:"https://hackage.haskell.org/package/quickcheck-dynamic"},(0,r.kt)("inlineCode",{parentName:"a"},"quickcheck-dynamic")),"\nstate-machine tests for this API."),(0,r.kt)("li",{parentName:"ul"},"Adapt the changes in the serialisation interface in the backing store property\ntests. This will involve adding boilerplate code in consensus to make up for\nthe removal of the ",(0,r.kt)("inlineCode",{parentName:"li"},"cborg"),"-based interface.")),(0,r.kt)("h2",{id:"lsm-tree-implementation"},"LSM tree implementation"),(0,r.kt)("p",null,"We worked on the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/issues/4121"},"LSM tree\nprototype"),". In\nparticular, we focused on tuning the LSM tree design to the different workloads\nthat consensus has (eg syncing, normal node operation, etc)."),(0,r.kt)("h3",{id:"benchmarking-the-csj-prototype"},"Benchmarking the CSJ prototype"),(0,r.kt)("p",null,'Work on improving the chain-sync jumping performance is ongoing. In particular\nwe compared the performance of different jump intervals, which, somewhat\nsurprisingly, do not make a significant difference. In particular, we are seeing\nperiodic "plateaus" where the chain-sync tip does not progress, but they are\nmuch longer for the prototype. Our hypothesis is that this seem to be due to a\ncombination of the garbage collector (GC) pauses, and the actual time it takes\nthe non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo\nfragment.'),(0,r.kt)("p",null,"In the coming weeks we will try to shorten these plateaus via a combination of\ntweaking GC options and less synchronisation in the CSJ governor."),(0,r.kt)("p",null,"The following plot shows the performance of the chain-sync jumping prototype\nusing different jumping intervals. It compares the syncing progress by plotting\nthe slots of adopted blocks against time. The baseline is still faster, however\nit is worth noting that the current prototype already achieves a significant\nspeedup when compared to the naive approach of simply running full chain-sync\nwith all peers."),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(39294).Z,width:"998",height:"445"})),(0,r.kt)("p",null,'The second plot shows the syncing progress sliced to a chosen ~5min interval,\nand includes, in addition to the slots of adopted blocks, the slots of the tip\nof the ChainSync fragment. This allows us to see how far ahead of the selected\ntip the CS dynamo is, i.e. how much room we have for BlockFetch not to get\nstalled. It shows periodic behaviour (due to the forecasting limit), and shows\nthat the CS fragment tip is not progressing for significant periods\n("plateaus").'),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(96185).Z,width:"998",height:"445"})),(0,r.kt)("h2",{id:"technical-debt"},"Technical debt"),(0,r.kt)("p",null,"We ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/ouroboros-network/pull/4098"},"clarified")," a\ncommon source of confusion around VRF tie-breaking and cross-era chain\nselection. This PR involved correcting potentially misleading names of\nVRF-related functions, and providing context for a particular VRF value is\nused for tie-breaking."))}u.isMDXComponent=!0},96185:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-02-csj-vs-baseline-sliced-77ff018af70191b4122b1e7cf56c79b8.svg"},39294:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/2022-11-02-csj-vs-baseline-9fd0e0e080975cc6cfbe035731b4f38d.svg"}}]); \ No newline at end of file diff --git a/assets/js/fbdc54bf.80a293fa.js b/assets/js/fbdc54bf.80a293fa.js new file mode 100644 index 00000000000..d3143847969 --- /dev/null +++ b/assets/js/fbdc54bf.80a293fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[63824],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),u=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),h=u(a),d=n,c=h["".concat(l,".").concat(d)]||h[d]||m[d]||i;return a?r.createElement(c,o(o({ref:t},s),{},{components:a})):r.createElement(c,o({ref:t},s))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[h]="string"==typeof e?e:n,o[1]=p;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},40671:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-06-02-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,p={permalink:"/cardano-updates/2023-06-02-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-06-02-hydra.md",source:"@site/blog/2023-06-02-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-06-02T00:00:00.000Z",formattedDate:"June 2, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.215,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-06-02-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Node API & CLI Team Update",permalink:"/cardano-updates/2023-06-07-node-cli-api"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-06-01-mithril"}},l={authorsImageUrls:[void 0]},u=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:u},h="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team has put their effort on finding solutions on many\ndifferent problems, such as our broken head on mainnet\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/897"},"#897"),", our fragile monthly\nreport publications on the website and implementing ","\u201c","Option A","\u201d"," for\nexternal commits ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),".\nAlthough most of these items are still open, huge progress has been made. To\naccelerate the investigation, they improved their logging to give more precise\nerrors when a transition requirement fails, and to reduce duplication on effets\nlogged content. Last but not least, the team is exploring formal methods and\nattended a workshop on formalizing cryptographic protocols in Agda."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Continued investigating broken head and opened an issue to keep track ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/issues/897"},"#897"),"."),(0,n.kt)("p",{parentName:"li"},"As part of this issue, improvements were made to the node logs:"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Give a precise error when a transition requirement fails ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/895"},"#895"),".")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Reduce duplication for effects logged content by using sequential eventId and effectId pair ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/896"},"#896"),".")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Fixed references in the hydra specification ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/pull/893"},"#893"),".")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Attended a workshop on formal methods and crypto in Agda."))),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Investigate and re-open our team-internal head on mainnet."),(0,n.kt)("li",{parentName:"ul"},"Improve and provide regular benchmarks for Hydra ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/186"},"#186"),"."),(0,n.kt)("li",{parentName:"ul"},"Complete journey for external commits implementing ","\u201c","Option A","\u201d"," and start implementing ","\u201c","Option B","\u201d"," ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/215"},"#215"),"."),(0,n.kt)("li",{parentName:"ul"},"Authenticate network messages ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/727"},"#727"),"."),(0,n.kt)("li",{parentName:"ul"},"Add hydra as tool to developr platform ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/872"},"#872"),"."),(0,n.kt)("li",{parentName:"ul"},"Fix monthly report publication on docs website.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fc0eac3b.320a4227.js b/assets/js/fc0eac3b.320a4227.js new file mode 100644 index 00000000000..805b9e3520d --- /dev/null +++ b/assets/js/fc0eac3b.320a4227.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[67927],{49063:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/10","page":10,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/9","nextPage":"/cardano-updates/page/11","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/fc8c3309.746176a0.js b/assets/js/fc8c3309.746176a0.js new file mode 100644 index 00000000000..55661fcf204 --- /dev/null +++ b/assets/js/fc8c3309.746176a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[77642],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(n),d=a,m=c["".concat(u,".").concat(d)]||c[d]||h[d]||o;return n?r.createElement(m,s(s({ref:t},p),{},{components:n})):r.createElement(m,s({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,s[1]=i;for(var l=2;l<o;l++)s[l]=n[l];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},64267:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=n(87462),a=(n(67294),n(3905));const o={title:"Consensus Team Update",slug:"2023-08-23-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/cardano-updates/2023-08-23-consensus",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-08-23-consensus.md",source:"@site/blog/2023-08-23-consensus.md",title:"Consensus Team Update",description:"High level summary",date:"2023-08-23T00:00:00.000Z",formattedDate:"August 23, 2023",tags:[{label:"consensus",permalink:"/cardano-updates/tags/consensus"}],readingTime:1.42,hasTruncateMarker:!1,authors:[{name:"Damian Nadales",title:"Consensus Team Lead",url:"https://github.com/dnadales",imageURL:"https://github.com/dnadales.png",key:"dnadales"}],frontMatter:{title:"Consensus Team Update",slug:"2023-08-23-consensus",authors:"dnadales",tags:["consensus"],hide_table_of_contents:!1},prevItem:{title:"Performance & tracing update",permalink:"/cardano-updates/2023-08-24-performance-and-tracing"},nextItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-08-18-goedel"}},u={authorsImageUrls:[void 0]},l=[{value:"High level summary",id:"high-level-summary",level:2},{value:"UTxO-HD",id:"utxo-hd",level:2},{value:"Tech debt",id:"tech-debt",level:2},{value:"Support",id:"support",level:2}],p={toc:l},c="wrapper";function h(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,a.kt)("p",null,"On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests.\nOn the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base."),(0,a.kt)("h2",{id:"utxo-hd"},"UTxO-HD"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We addressed the issues that came from the benchmarking and testing phase (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/314"},"#314"),").",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"We fixed the operational-certificate update exception (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/305"},"#305"),").")))),(0,a.kt)("h2",{id:"tech-debt"},"Tech debt"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-api/tree/jasagredo/consensus-api"},"this branch"),")."),(0,a.kt)("li",{parentName:"ul"},"We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/tree/jasagredo/test-sop"},"this branch"),")."),(0,a.kt)("li",{parentName:"ul"},"We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/issues/275"},"#275"),")."),(0,a.kt)("li",{parentName:"ul"},"We decreased the flakiness for our test suite (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/284"},"#284"),")."),(0,a.kt)("li",{parentName:"ul"},"We incorporated and merged the pull-request on query versioning (",(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/273"},"#273"),")."),(0,a.kt)("li",{parentName:"ul"},"We started working on new performance-based regression tests for mempool operations.")),(0,a.kt)("h2",{id:"support"},"Support"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/nfrisby"},"Nick Frisby")," continues with his engineer responsibilities. Notably getting the Consensus release out for node ",(0,a.kt)("inlineCode",{parentName:"li"},"pre-release 8.3"),". Nick also began integrating it into downstream branches (",(0,a.kt)("inlineCode",{parentName:"li"},"cardano{-api,-cli,-node}"),"). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/283"},"#283")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/301"},"#301")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/304"},"#304")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/ouroboros-consensus/pull/308"},"#308"))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fce7e268.e65bf999.js b/assets/js/fce7e268.e65bf999.js new file mode 100644 index 00000000000..48bb54ab73c --- /dev/null +++ b/assets/js/fce7e268.e65bf999.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[62140],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var h=r.createContext({}),p=function(e){var t=r.useContext(h),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(h.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,h=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=p(a),c=n,m=d["".concat(h,".").concat(c)]||d[c]||u[c]||o;return a?r.createElement(m,i(i({ref:t},s),{},{components:a})):r.createElement(m,i({ref:t},s))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=c;var l={};for(var h in t)hasOwnProperty.call(t,h)&&(l[h]=t[h]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var p=2;p<o;p++)i[p]=a[p];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}c.displayName="MDXCreateElement"},50153:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-03-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-03-hydra.md",source:"@site/blog/2023-03-03-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-03T00:00:00.000Z",formattedDate:"March 3, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:1.19,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-03-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-03-goedel"},nextItem:{title:"Ledger Team Update",permalink:"/cardano-updates/2023-03-03-ledger"}},h={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],s={toc:p},d="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(d,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team released version\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/hydra/releases/tag/0.9.0"},"0.9.0")," - a version\nof the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," with fully specified behavior of on-chain scripts and\noff-chain head-logic, decreased costs for opening/closing a Head and scalable\ncontestation deadline semantics. Check out the full release notes for details."),(0,n.kt)("p",null,"Furthermore, they published the ",(0,n.kt)("a",{parentName:"p",href:"https://hydra.family/head-protocol/monthly/2023-03"},"monthly\nreport")," of the Hydra project\nand conducted a review meeting with an increasingly wider audience. The team\nplans to extend invitations through the new Hydra\n",(0,n.kt)("a",{parentName:"p",href:"https://discord.gg/Bwdy2jNdm2"},"#announcements")," discord channel for the next\nmonths, stay tuned!"),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Monthly review meeting with report published ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/monthly/2023-03"},"on website")),(0,n.kt)("li",{parentName:"ul"},"Fixed smoke tests ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/726"},"#726")),(0,n.kt)("li",{parentName:"ul"},"Reduced the cost of opening/closing a Head (error codes ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/748"},"#748")," + head reference script ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/701"},"#701"),")"),(0,n.kt)("li",{parentName:"ul"},"Released version ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/releases/tag/0.9.0"},"0.9.0")),(0,n.kt)("li",{parentName:"ul"},"Conducted a first experiment on mainnet compatibility ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713")),(0,n.kt)("li",{parentName:"ul"},"New discord category with ",(0,n.kt)("a",{parentName:"li",href:"https://discord.gg/Bwdy2jNdm2"},"#announcements")," channel"),(0,n.kt)("li",{parentName:"ul"},"Received a demo about the Hydra for Voting project"),(0,n.kt)("li",{parentName:"ul"},"Lightning talk on mutation-based testing (to be shared)"),(0,n.kt)("li",{parentName:"ul"},"New ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/orgs/input-output-hk/projects/21/views/26"},"themes view")," in on our roadmap and some rearranging as we align it with high-level objectives"),(0,n.kt)("li",{parentName:"ul"},"Clarified things with researchers, but mostly identified action items for them")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs and address TODOs specification"),(0,n.kt)("li",{parentName:"ul"},"Run hydraw with 0.9.0 on preprod"),(0,n.kt)("li",{parentName:"ul"},"Make smoke tests on mainnet possible"),(0,n.kt)("li",{parentName:"ul"},"Groom the explorer item"),(0,n.kt)("li",{parentName:"ul"},"Unblock the auctions projecth with ","\u201c","commit from script","\u201d"," a solution")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd6fd4a3.1f94006f.js b/assets/js/fd6fd4a3.1f94006f.js new file mode 100644 index 00000000000..45389a9bc84 --- /dev/null +++ b/assets/js/fd6fd4a3.1f94006f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[37495],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),p=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(r),c=n,m=d["".concat(s,".").concat(c)]||d[c]||h[c]||o;return r?a.createElement(m,l(l({ref:t},u),{},{components:r})):a.createElement(m,l({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=c;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:n,l[1]=i;for(var p=2;p<o;p++)l[p]=r[p];return a.createElement.apply(null,l)}return a.createElement.apply(null,r)}c.displayName="MDXCreateElement"},66366:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=r(87462),n=(r(67294),r(3905));const o={title:"Ledger Team Update",slug:"2022-11-23-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},l=void 0,i={permalink:"/cardano-updates/2022-11-23-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-11-23-ledger.md",source:"@site/blog/2022-11-23-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-11-23T00:00:00.000Z",formattedDate:"November 23, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.19,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-11-23-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-25-hydra"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-11-18-hydra"}},s={authorsImageUrls:[void 0]},p=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"The Conway ledger era",id:"the-conway-ledger-era",level:3},{value:"Versioned CBOR",id:"versioned-cbor",level:3},{value:"Deposit tracking",id:"deposit-tracking",level:3},{value:"Technical debt",id:"technical-debt",level:3},{value:"Node release",id:"node-release",level:3}],u={toc:p},d="wrapper";function h(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"We released ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694"),",\nour proposal for entering the ",(0,n.kt)("a",{parentName:"p",href:"https://roadmap.cardano.org/en/voltaire/"},"Voltaire phase"),".\n",(0,n.kt)("strong",{parentName:"p"},"Please come join the discussion"),", this will be an incredibly exciting transition for\nCardano and we want everyone to participate!"),(0,n.kt)("p",null,"We now have a sensible way to version all of the serialization schemes used in the ledger.\nThe draft pull request was polished, reviewed, and merged this week.\nThis solves many problems that have vexed us since the beginning of the Shelley ledger era."),(0,n.kt)("p",null,"Everyone working on the Cardano node is working together to improve our release process,\nand the ledger team in particular dedicated one engineer to help with these efforts\nfor the next release."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h3",{id:"the-conway-ledger-era"},"The Conway ledger era"),(0,n.kt)("p",null,"The current proposal in ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694")," encompasses two new ledger eras.\nThe first era will be called Conway, after the English mathematician John Horton Conway.\nThe community facing aspects of the Conway ledger era will be very minimal,\nbut it will pave the way for introducing liquid democracy.\nThe details can be viewed ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/4"},"here"),".\nWe do not yet have a formal specification for the Conway era.\nOur plan is to debut the\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/formal-ledger-specifications"},"formal ledger model"),".\nBriefly, the Conway ledger era will:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"introduce SPO voting for hard forks (in the spirit of the now abandoned ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/318"},"CIP-47"),")"),(0,n.kt)("li",{parentName:"ul"},"provide an on-chain mechanism for rotating the governance keys"),(0,n.kt)("li",{parentName:"ul"},"re-plumb the ledger rules involving governance to be in line with ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/cardano-foundation/CIPs/pull/380"},"CIP-1694"))),(0,n.kt)("h3",{id:"versioned-cbor"},"Versioned CBOR"),(0,n.kt)("p",null,"We now have the ability to easily tie our serialization schemes to the Cardano\nmajor protocol version.\nWe still aim to preserve backwards compatibility as much as possible, but we now have a principled\nplan for resolving problems (see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/372"},"CIP-ledger-cbor"),").\nIn particular, we can now address several long standing issues, such as\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/2444"},"issue-2444"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/2965"},"issue-2965"),", and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/3003"},"issue-3003"),". "),(0,n.kt)("p",null,"The final (and massive!) pull request which brought us the versioning is ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3138"},"pull-3138"),"."),(0,n.kt)("h3",{id:"deposit-tracking"},"Deposit tracking"),(0,n.kt)("p",null,"The draft pull request which was exploring how best to track individual deposits\nis much closer now to being ready to take out of draft (",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3127"},"pull-3127"),").\nFor background on the issue, see ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/issues/3113"},"issue-3113"),".\nThis is quite an invasive change which effects many of our tests, which we are now addressing."),(0,n.kt)("h3",{id:"technical-debt"},"Technical debt"),(0,n.kt)("p",null,"As always, we keep working on technical debt.\nWe have deduplicated a some things: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3129"},"pull-3129"),", ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3162"},"pull-3162"),".\nWe have memoized a problematic computation (though more due diligence is needed before we can\nmerge): ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3141"},"pull-3141"),"."),(0,n.kt)("h3",{id:"node-release"},"Node release"),(0,n.kt)("p",null,"We have been helping with the node release efforts. See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-node/pull/4608"},"pull-4608"),"."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fdba8f98.8aadb32b.js b/assets/js/fdba8f98.8aadb32b.js new file mode 100644 index 00000000000..4dfe035d7ed --- /dev/null +++ b/assets/js/fdba8f98.8aadb32b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79224],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)a=o[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=s(a),h=n,m=u["".concat(p,".").concat(h)]||u[h]||c[h]||o;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:n,i[1]=l;for(var s=2;s<o;s++)i[s]=a[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},1814:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=a(87462),n=(a(67294),a(3905));const o={title:"Hydra Team Update",slug:"2023-03-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},i=void 0,l={permalink:"/cardano-updates/2023-03-10-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-03-10-hydra.md",source:"@site/blog/2023-03-10-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-03-10T00:00:00.000Z",formattedDate:"March 10, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.825,hasTruncateMarker:!1,authors:[{name:"Sebastian Nagel",title:"Hydra Team Lead",url:"https://github.com/ch1bo",imageURL:"https://github.com/ch1bo.png",key:"ch1bo"}],frontMatter:{title:"Hydra Team Update",slug:"2023-03-10-hydra",authors:"ch1bo",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Goedel Team Update",permalink:"/cardano-updates/2023-03-16-goedel"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-03-09-mithril"}},p={authorsImageUrls:[void 0]},s=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],d={toc:s},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team addressed issues with committing complex UTxOs into a\nHydra Head, prepared the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-node")," to be run on mainnet (soon) and improved\nthe test suite of the ",(0,n.kt)("inlineCode",{parentName:"p"},"hydra-plutus")," scripts. The specification is constantly\ngetting improved upon reviewer feedback on overleaf - this week the graphical\nnotation was refined to be more transaction-focused."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Clarified ","\u201c","bug","\u201d"," of committing UTxOs with reference scripts to a Hydra head ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/737"},"#737")),(0,n.kt)("li",{parentName:"ul"},"Prepare usage of ",(0,n.kt)("inlineCode",{parentName:"li"},"hydra-node")," on mainnet by updating command line options ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/pull/715"},"#715")),(0,n.kt)("li",{parentName:"ul"},"Improved our mutation test suite to all expected errors ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/705"},"#705")),(0,n.kt)("li",{parentName:"ul"},"Re-opened our persistent hydraw demo head on ",(0,n.kt)("inlineCode",{parentName:"li"},"preprod")," using version ",(0,n.kt)("inlineCode",{parentName:"li"},"0.9.0")),(0,n.kt)("li",{parentName:"ul"},"Updated on-chain graphs to be more transaction-focused in the specification")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Complete mainnet compatibility feature"),(0,n.kt)("li",{parentName:"ul"},"Prepare the Hydra workshop"),(0,n.kt)("li",{parentName:"ul"},"Address all todo\u2019s in the Hydra specification"),(0,n.kt)("li",{parentName:"ul"},"Unblock the auctions project with ","\u201c","commit from script","\u201d"," a solution")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fdfeff52.d2d4df98.js b/assets/js/fdfeff52.d2d4df98.js new file mode 100644 index 00000000000..d0c9e60b022 --- /dev/null +++ b/assets/js/fdfeff52.d2d4df98.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[81030],{49771:e=>{e.exports=JSON.parse('{"permalink":"/cardano-updates/tags/goedel/page/2","page":2,"postsPerPage":5,"totalPages":4,"totalCount":18,"previousPage":"/cardano-updates/tags/goedel","nextPage":"/cardano-updates/tags/goedel/page/3","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/fe184e91.4c2cc153.js b/assets/js/fe184e91.4c2cc153.js new file mode 100644 index 00000000000..5cbb57505e7 --- /dev/null +++ b/assets/js/fe184e91.4c2cc153.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[79967],{51034:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/tags/cli-api","page":1,"postsPerPage":5,"totalPages":6,"totalCount":27,"nextPage":"/cardano-updates/tags/cli-api/page/2","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/fee99998.1c695705.js b/assets/js/fee99998.1c695705.js new file mode 100644 index 00000000000..14abb131bef --- /dev/null +++ b/assets/js/fee99998.1c695705.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[91760],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>c});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),p=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},h=function(e){var t=p(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,u=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),s=p(a),m=n,c=s["".concat(u,".").concat(m)]||s[m]||d[m]||i;return a?r.createElement(c,o(o({ref:t},h),{},{components:a})):r.createElement(c,o({ref:t},h))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:n,o[1]=l;for(var p=2;p<i;p++)o[p]=a[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}m.displayName="MDXCreateElement"},49627:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=a(87462),n=(a(67294),a(3905));const i={title:"Hydra Team Update",slug:"2023-02-24-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},o=void 0,l={permalink:"/cardano-updates/2023-02-24-hydra",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2023-02-24-hydra.md",source:"@site/blog/2023-02-24-hydra.md",title:"Hydra Team Update",description:"High-level summary",date:"2023-02-24T00:00:00.000Z",formattedDate:"February 24, 2023",tags:[{label:"hydra",permalink:"/cardano-updates/tags/hydra"}],readingTime:.93,hasTruncateMarker:!1,authors:[{name:"Franco Testagrossa",title:"Hydra Software Engineer",url:"https://github.com/ffakenz",imageURL:"https://github.com/ffakenz.png",key:"ffakenz"}],frontMatter:{title:"Hydra Team Update",slug:"2023-02-24-hydra",authors:"ffakenz",tags:["hydra"],hide_table_of_contents:!1},prevItem:{title:"Network Team Update",permalink:"/cardano-updates/2023-03-02-network"},nextItem:{title:"Mithril Team Update",permalink:"/cardano-updates/2023-02-23-mithril"}},u={authorsImageUrls:[void 0]},p=[{value:"High-level summary",id:"high-level-summary",level:2},{value:"What did the team achieve this week",id:"what-did-the-team-achieve-this-week",level:2},{value:"What are the goals of next week",id:"what-are-the-goals-of-next-week",level:2}],h={toc:p},s="wrapper";function d(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High-level summary"),(0,n.kt)("p",null,"This week, the Hydra team continue closing many gaps and aligning the\nimplementation with the specification. More over, they have groomed a plan to\nmake Hydra Mainnet compatible. Also, they continue moving forward with the\ninternal auditing and have published some auditing guidelines to receive\ncontributions from the community."),(0,n.kt)("h2",{id:"what-did-the-team-achieve-this-week"},"What did the team achieve this week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Completed ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/452"},"#452")," (what is\nremaining in there)"),(0,n.kt)("li",{parentName:"ul"},"Aligned the Head protocol logic implementation with the specification"),(0,n.kt)("li",{parentName:"ul"},"Completed full minting policy implementation and spec\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/720"},"#720")),(0,n.kt)("li",{parentName:"ul"},"Clarified message authentication with researchers"),(0,n.kt)("li",{parentName:"ul"},"Groomed what is left to do for Mainnet compatibility\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/713"},"#713")," and drafted a\n0.10.0 version"),(0,n.kt)("li",{parentName:"ul"},"Added a tutorial by ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/perturbing/"},"@perturbing")," to the\nwebsite ",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/docs/tutorial/"},"LINK")),(0,n.kt)("li",{parentName:"ul"},"Published auditing guidelines\n",(0,n.kt)("a",{parentName:"li",href:"https://hydra.family/head-protocol/audit-guidelines"},"LINK")),(0,n.kt)("li",{parentName:"ul"},"Made hydra-node work for macos\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/746"},"#746")," and added support\nfor building on aarch64\n",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/hydra/issues/673"},"#673")),(0,n.kt)("li",{parentName:"ul"},"Met with a potential customer of Hydra for Payments")),(0,n.kt)("h2",{id:"what-are-the-goals-of-next-week"},"What are the goals of next week"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Have the monthly review meeting incl. the report"),(0,n.kt)("li",{parentName:"ul"},"Have smoke tests fixed and running regularly"),(0,n.kt)("li",{parentName:"ul"},"Release 0.9.0 with updated scripts"),(0,n.kt)("li",{parentName:"ul"},"Redraw transaction graphs for specification")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ff276f6a.72f5da9b.js b/assets/js/ff276f6a.72f5da9b.js new file mode 100644 index 00000000000..f0e455ee425 --- /dev/null +++ b/assets/js/ff276f6a.72f5da9b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[39969],{20040:a=>{a.exports=JSON.parse('{"label":"network","permalink":"/cardano-updates/tags/network","allTagsPath":"/cardano-updates/tags","count":24}')}}]); \ No newline at end of file diff --git a/assets/js/ff8cfcf7.83f44d88.js b/assets/js/ff8cfcf7.83f44d88.js new file mode 100644 index 00000000000..7ad9eb2f325 --- /dev/null +++ b/assets/js/ff8cfcf7.83f44d88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[20203],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var r=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var d=r.createContext({}),u=function(e){var t=r.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(d.Provider,{value:t},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,d=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=u(a),h=n,m=s["".concat(d,".").concat(h)]||s[h]||c[h]||l;return a?r.createElement(m,o(o({ref:t},p),{},{components:a})):r.createElement(m,o({ref:t},p))}));function m(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=h;var i={};for(var d in t)hasOwnProperty.call(t,d)&&(i[d]=t[d]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var u=2;u<l;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}h.displayName="MDXCreateElement"},98149:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var r=a(87462),n=(a(67294),a(3905));const l={title:"Ledger Team Update",slug:"2022-12-09-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},o=void 0,i={permalink:"/cardano-updates/2022-12-09-ledger",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/blog/2022-12-09-ledger.md",source:"@site/blog/2022-12-09-ledger.md",title:"Ledger Team Update",description:"High level summary",date:"2022-12-09T00:00:00.000Z",formattedDate:"December 9, 2022",tags:[{label:"ledger",permalink:"/cardano-updates/tags/ledger"}],readingTime:2.87,hasTruncateMarker:!1,authors:[{name:"Jared Corduan",title:"Ledger Team Lead",url:"https://github.com/JaredCorduan",imageURL:"https://github.com/JaredCorduan.png",key:"JaredCorduan"}],frontMatter:{title:"Ledger Team Update",slug:"2022-12-09-ledger",authors:"JaredCorduan",tags:["ledger"],hide_table_of_contents:!1},prevItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-09-hydra"},nextItem:{title:"Hydra Team Update",permalink:"/cardano-updates/2022-12-02-hydra"}},d={authorsImageUrls:[void 0]},u=[{value:"High level summary",id:"high-level-summary",level:2},{value:"Lower level summary",id:"lower-level-summary",level:2},{value:"Cardano ledger API",id:"cardano-ledger-api",level:4},{value:"Architectural Decision Records (ADRs)",id:"architectural-decision-records-adrs",level:4},{value:"Tracking individual deposits",id:"tracking-individual-deposits",level:4},{value:"Removing pointer addresses",id:"removing-pointer-addresses",level:4},{value:"Technical debt",id:"technical-debt",level:4}],p={toc:u},s="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"high-level-summary"},"High level summary"),(0,n.kt)("p",null,"The Plutus tools team at IOG has started helping the ledger team to build out a user friendly\n",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-ledger-api")," package!\nA ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/5"},"GitHub project"),"\nwill be filled out in the days ahead,\npeople interested in the API can use it to follow along and join in on the conversations."),(0,n.kt)("p",null,"The ledger team has started using\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/blob/6fc0e198560fb4169d435da882394930789a8af8/docs/adr/2022-12-01_001-record-architectural-decisions.md"},"architectural decision records"),"\nto leave a record of important decisions that the team makes.\nWe will retroactively go back through past decisions and make ADRs for them."),(0,n.kt)("p",null,"The logic to track individual deposits is now nearly in place.\nWe are prioritizing correctness with our first pull request, and will follow up with\nperformance optimizations and general cleanup next."),(0,n.kt)("p",null,"Pointer addresses are being deprecated with the Cardano major protocol version 8.\nSee ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/374"},"CPS-0002"),"\nfor more context."),(0,n.kt)("h2",{id:"lower-level-summary"},"Lower level summary"),(0,n.kt)("h4",{id:"cardano-ledger-api"},"Cardano ledger API"),(0,n.kt)("p",null,"The ",(0,n.kt)("strong",{parentName:"p"},"Plutus tools team")," has taken our minimal ",(0,n.kt)("inlineCode",{parentName:"p"},"cardano-ledger-api")," package and started filling it\nout and adding much needed documentation.\nThey have also added doctests!\nIn the days to come, the Plutus tools team will map out a lot more work for the API and record\nit in this\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/projects/5"},"GitHub project"),"."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3182"},"pull-3182")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3188"},"pull-3188"))),(0,n.kt)("h4",{id:"architectural-decision-records-adrs"},"Architectural Decision Records (ADRs)"),(0,n.kt)("p",null,"We are now providing more context and leaving a record of important decisions that are made\nin the ledger. The first ADR explains the very lightweight process."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3177"},"pull-3177")," (rendered ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/blob/6fc0e198560fb4169d435da882394930789a8af8/docs/adr/2022-12-01_001-record-architectural-decisions.md"},"here"),")")),(0,n.kt)("h4",{id:"tracking-individual-deposits"},"Tracking individual deposits"),(0,n.kt)("p",null,"See ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/input-output-hk/cardano-ledger/pull/3190/files"},"ADR-3"),"\nfor background.\nWe now have the logic in place to track individual deposits, and a host of property tests\nto make sure that the logic is correct.\nThe current implementation uses more memory than it needs to, and we will address that next,\nwith our hope being to only use one word (8 bytes) per registered stake credential.\nThere is a fair amount of other cleanup needed for general maintainability."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3127"},"pull-3127")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3195"},"pull-3195")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3202"},"pull-3202"))),(0,n.kt)("h4",{id:"removing-pointer-addresses"},"Removing pointer addresses"),(0,n.kt)("p",null,"Pointer addresses, which have never seen any real use\n(there are something like eleven on mainnet), are being deprecated starting at Cardano major\nversion 9.\n",(0,n.kt)("a",{parentName:"p",href:"https://github.com/cardano-foundation/CIPs/pull/374"},"CPS-0002")," gives the context.\nWe are disabling them by first preventing transaction outputs containing them\nfrom being serialized by the node at the moment we switch to version 9.\nAt the hard fork after that, we will translate the existing few pointer addresses\nto enterprise addresses."),(0,n.kt)("p",null,"See"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3174"},"pull-3174"))),(0,n.kt)("h4",{id:"technical-debt"},"Technical debt"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3162"},"pull-3162")," - Sometimes we have to put safeguards in place for hard forks which may never\nbe exercised. After we have passed the given hardfork, we are able to clean up the code\nand simplify our logic. We removed all of the ones that we are currently easily able to."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3165"},"pull-3165")," - We improved the type safety of our code while also discovering and fixing\na serialization bug."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3172"},"pull-3172")," - We removed dead code."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3175"},"pull-3175")," - The Allegra and the Mary code used to be coupled in a particular way the we grew to\ndislike. We made these two ledger eras now uniform with the rest of our code base."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3184"},"pull-3184")," - We organized our property testing code."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/input-output-hk/cardano-ledger/pull/3200"},"pull-3200")," - The Plutus tools teams fixed an outstanding bug in the translation from the\nledger state to the Plutus script context.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ffbc2281.bed0db17.js b/assets/js/ffbc2281.bed0db17.js new file mode 100644 index 00000000000..d7a7b316ac1 --- /dev/null +++ b/assets/js/ffbc2281.bed0db17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[64906],{21299:a=>{a.exports=JSON.parse('{"permalink":"/cardano-updates/page/46","page":46,"postsPerPage":5,"totalPages":61,"totalCount":303,"previousPage":"/cardano-updates/page/45","nextPage":"/cardano-updates/page/47","blogDescription":"Regular updates from Cardano Development Teams","blogTitle":"Cardano Development Updates"}')}}]); \ No newline at end of file diff --git a/assets/js/main.bc51b93f.js b/assets/js/main.bc51b93f.js new file mode 100644 index 00000000000..af293849c15 --- /dev/null +++ b/assets/js/main.bc51b93f.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bc51b93f.js.LICENSE.txt */ +(self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[]).push([[40179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(67294),r=n(87462),o=n(68356),c=n.n(o),i=n(16887);const d={"0048047b":[()=>n.e(38518).then(n.bind(n,79682)),"@site/blog/2022-12-28-node-cli-api.md?truncated=true",79682],"007e4c05":[()=>n.e(73800).then(n.bind(n,65907)),"@site/blog/2023-07-18-node-cli-api.md",65907],"00bb8269":[()=>n.e(51257).then(n.t.bind(n,69088,19)),"~blog/updates/cardano-updates-tags-mithril-page-3-b18.json",69088],"015be621":[()=>n.e(80613).then(n.bind(n,77613)),"@site/blog/2022-09-20-consensus.md",77613],"017cd6b7":[()=>n.e(3649).then(n.bind(n,14286)),"@site/blog/2022-11-18-hydra.md",14286],"019bb279":[()=>n.e(83167).then(n.bind(n,86627)),"@site/blog/2022-08-31-consensus.md?truncated=true",86627],"01a85c17":[()=>Promise.all([n.e(40532),n.e(64013)]).then(n.bind(n,91223)),"@theme/BlogTagsListPage",91223],"0281a492":[()=>n.e(79503).then(n.bind(n,69998)),"@site/blog/2023-06-08-sre.md",69998],"034a14a6":[()=>n.e(95018).then(n.bind(n,10437)),"@site/blog/2023-06-28-performance-and-tracing.md?truncated=true",10437],"03d856aa":[()=>n.e(6413).then(n.bind(n,17040)),"@site/blog/2022-11-11-network.md",17040],"042169f6":[()=>n.e(27449).then(n.bind(n,7841)),"@site/blog/2022-12-01-mithril.md",7841],"0431617f":[()=>n.e(68153).then(n.bind(n,33018)),"@site/blog/2023-04-28-goedel.md?truncated=true",33018],"04326247":[()=>n.e(25759).then(n.bind(n,2327)),"@site/blog/2023-01-25-node-cli-api.md?truncated=true",2327],"046dd16d":[()=>n.e(49237).then(n.bind(n,55442)),"@site/blog/2023-09-15-network.md?truncated=true",55442],"04c3317f":[()=>n.e(83050).then(n.bind(n,10313)),"@site/blog/2023-03-27-system-test.md?truncated=true",10313],"04cbd10c":[()=>n.e(97245).then(n.t.bind(n,4032,19)),"~blog/updates/cardano-updates-tags-hydra-page-5-62d.json",4032],"05f2862f":[()=>n.e(18479).then(n.bind(n,88989)),"@site/blog/2023-04-07-hydra.md",88989],"0645cd02":[()=>n.e(46982).then(n.bind(n,57276)),"@site/blog/2023-07-21-ledger.md?truncated=true",57276],"06a283ef":[()=>n.e(2307).then(n.bind(n,15889)),"@site/blog/2022-10-04-db-sync.md?truncated=true",15889],"07541956":[()=>n.e(39419).then(n.t.bind(n,95884,19)),"~blog/updates/cardano-updates-page-15-d79.json",95884],"07fdf123":[()=>n.e(39439).then(n.bind(n,86757)),"@site/blog/2023-01-13-release.md?truncated=true",86757],"0801ba5a":[()=>n.e(19644).then(n.bind(n,26870)),"@site/blog/2023-05-26-hydra.md?truncated=true",26870],"089154c4":[()=>n.e(72344).then(n.bind(n,83365)),"@site/blog/2022-11-02-node-cli-api.md",83365],"08c82b6d":[()=>n.e(81).then(n.t.bind(n,7232,19)),"/home/runner/work/cardano-updates/cardano-updates/.docusaurus/docusaurus-plugin-content-blog/updates/plugin-route-context-module-100.json",7232],"09abc415":[()=>n.e(416).then(n.t.bind(n,15546,19)),"~blog/updates/cardano-updates-tags-devx-3a5.json",15546],"0a44a251":[()=>n.e(63565).then(n.bind(n,51604)),"@site/blog/2022-12-14-node-cli-api.md?truncated=true",51604],"0ade4266":[()=>n.e(16227).then(n.bind(n,27126)),"@site/blog/2023-11-17-hydra.md",27126],"0af81f82":[()=>n.e(10114).then(n.bind(n,61640)),"@site/blog/2023-03-31-ledger.md?truncated=true",61640],"0b0bfceb":[()=>n.e(60903).then(n.bind(n,27558)),"@site/blog/2023-10-13-sre.md",27558],"0b1b72af":[()=>n.e(26276).then(n.bind(n,23329)),"@site/blog/2022-12-09-crypto.md?truncated=true",23329],"0b5e25e7":[()=>n.e(23621).then(n.bind(n,17681)),"@site/blog/2023-11-01-consensus.md?truncated=true",17681],"0c10bcf4":[()=>n.e(72872).then(n.bind(n,10221)),"@site/blog/2023-05-19-hydra.md",10221],"0c11045c":[()=>n.e(39745).then(n.bind(n,56996)),"@site/blog/2023-02-03-goedel.md?truncated=true",56996],"0c48efb1":[()=>n.e(41794).then(n.bind(n,35468)),"@site/blog/2023-02-17-hydra.md",35468],"0d671897":[()=>n.e(29059).then(n.bind(n,75396)),"@site/blog/2022-11-01-db-sync.md?truncated=true",75396],"0d7612e9":[()=>n.e(95739).then(n.t.bind(n,1844,19)),"~blog/updates/cardano-updates-tags-db-sync-page-3-7db.json",1844],"0d889cfb":[()=>n.e(27237).then(n.bind(n,30309)),"@site/blog/2023-03-17-hydra.md",30309],"0db650db":[()=>n.e(74607).then(n.bind(n,49165)),"@site/blog/2023-03-22-consensus.md?truncated=true",49165],"0dc0e43e":[()=>n.e(29614).then(n.t.bind(n,67195,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-3-d14.json",67195],"0de82e28":[()=>n.e(66743).then(n.t.bind(n,37624,19)),"~docs/default/category-cardano-updatesdocs-defaultsidebar-category-tutorial-extras-741.json",37624],"0dea9a3b":[()=>n.e(4910).then(n.bind(n,96597)),"@site/quarterly/2023-01-13-open-source.md",96597],"0dfea636":[()=>n.e(21200).then(n.bind(n,81038)),"@site/blog/2023-07-04-db-sync.md?truncated=true",81038],"0e0c98f4":[()=>n.e(60280).then(n.bind(n,91321)),"@site/blog/2023-08-18-network.md?truncated=true",91321],"0e384e19":[()=>n.e(59671).then(n.bind(n,59881)),"@site/docs/intro.md",59881],"0e717c32":[()=>n.e(26397).then(n.bind(n,40284)),"@site/blog/2023-11-29-mithril.md",40284],"0e828f3a":[()=>n.e(77338).then(n.bind(n,2105)),"@site/blog/2023-09-15-ledger.md?truncated=true",2105],"0ee9866d":[()=>n.e(87314).then(n.t.bind(n,25206,19)),"~blog/updates/cardano-updates-page-27-9a2.json",25206],"0fa2fd29":[()=>n.e(83646).then(n.bind(n,83216)),"@site/blog/2023-06-16-hydra.md",83216],10532414:[()=>n.e(6890).then(n.bind(n,97835)),"@site/blog/2023-08-04-goedel.md?truncated=true",97835],"10659ce5":[()=>n.e(40400).then(n.bind(n,62471)),"@site/blog/2022-11-16-node-cli-api.md?truncated=true",62471],"113fed8c":[()=>n.e(33215).then(n.bind(n,2073)),"@site/blog/2023-07-12-consensus.md?truncated=true",2073],11423591:[()=>n.e(96410).then(n.bind(n,73677)),"@site/blog/2023-06-08-sre.md?truncated=true",73677],"1147f4da":[()=>n.e(21463).then(n.bind(n,75148)),"@site/blog/2022-11-03-embedding-quality.md",75148],"120c0b00":[()=>n.e(59955).then(n.bind(n,33276)),"@site/blog/2022-11-30-node-cli-api.md",33276],"12208c5e":[()=>n.e(32852).then(n.bind(n,32458)),"@site/blog/2023-07-21-hydra.md",32458],"12525f14":[()=>n.e(46207).then(n.bind(n,96725)),"@site/quarterly/2023-04-03-ledger.md?truncated=true",96725],"12637b23":[()=>n.e(32706).then(n.bind(n,24879)),"@site/blog/2023-05-24-node-cli-api.md?truncated=true",24879],"126e82e6":[()=>n.e(96871).then(n.bind(n,67870)),"@site/blog/2022-11-02-ledger.md?truncated=true",67870],"12a1613f":[()=>n.e(4615).then(n.bind(n,65518)),"@site/blog/2023-08-11-performance-and-tracing.md?truncated=true",65518],"12c83d8a":[()=>n.e(58774).then(n.bind(n,77470)),"@site/blog/2023-07-28-hydra.md",77470],"12d5d907":[()=>n.e(16348).then(n.bind(n,37534)),"@site/blog/2023-04-07-hydra.md?truncated=true",37534],"12ef8706":[()=>n.e(61039).then(n.t.bind(n,91703,19)),"~blog/updates/cardano-updates-tags-hydra-page-6-174-list.json",91703],"1377d1fa":[()=>n.e(79841).then(n.bind(n,92927)),"@site/blog/2022-10-19-node-cli-api.md",92927],"144cea98":[()=>n.e(50881).then(n.bind(n,86528)),"@site/blog/2023-02-22-node-cli-api.md",86528],"144cf255":[()=>n.e(55553).then(n.bind(n,34167)),"@site/blog/2022-11-04-mithril.md?truncated=true",34167],"14eb3368":[()=>Promise.all([n.e(40532),n.e(9817)]).then(n.bind(n,34228)),"@theme/DocCategoryGeneratedIndexPage",34228],"14fc0a72":[()=>n.e(43686).then(n.t.bind(n,52256,19)),"~blog/updates/cardano-updates-tags-performance-tracing-52e-list.json",52256],"14ffac04":[()=>n.e(59494).then(n.bind(n,16801)),"@site/blog/2023-09-01-ledger.md",16801],"15072f11":[()=>n.e(83129).then(n.bind(n,49702)),"@site/quarterly/2022-11-07-ledger.md?truncated=true",49702],"154dea53":[()=>n.e(45542).then(n.t.bind(n,46622,19)),"~blog/updates/cardano-updates-tags-ledger-page-3-db1.json",46622],"15691c1d":[()=>n.e(43729).then(n.bind(n,19289)),"@site/blog/2023-08-17-secp-security-issue-report.md",19289],"15dc596d":[()=>n.e(6962).then(n.bind(n,487)),"@site/blog/2022-11-02-system-test.md?truncated=true",487],"166775fd":[()=>n.e(99847).then(n.t.bind(n,39399,19)),"~blog/updates/cardano-updates-tags-ledger-page-2-c49-list.json",39399],"16a93549":[()=>n.e(4307).then(n.bind(n,68546)),"@site/blog/2023-07-07-sre.md",68546],"1752e4e5":[()=>n.e(770).then(n.bind(n,9131)),"@site/blog/2023-10-18-consensus.md?truncated=true",9131],17630979:[()=>n.e(93724).then(n.bind(n,22903)),"@site/blog/2022-11-02-system-test.md",22903],"177280a4":[()=>n.e(95447).then(n.bind(n,67686)),"@site/blog/2022-11-11-hydra.md?truncated=true",67686],17896441:[()=>Promise.all([n.e(40532),n.e(80210),n.e(27918)]).then(n.bind(n,15154)),"@theme/DocItem",15154],"17e76f05":[()=>n.e(64966).then(n.bind(n,24065)),"@site/blog/2023-05-12-hydra.md?truncated=true",24065],"17f4ca64":[()=>n.e(37426).then(n.t.bind(n,32942,19)),"~blog/updates/cardano-updates-tags-mithril-page-3-b18-list.json",32942],"187056c8":[()=>n.e(40430).then(n.bind(n,1377)),"@site/blog/2022-11-11-crypto.md",1377],"18c41134":[()=>n.e(82859).then(n.bind(n,43494)),"@site/docs/tutorial-basics/markdown-features.mdx",43494],"1a21d6a2":[()=>n.e(18694).then(n.t.bind(n,98253,19)),"~blog/updates/cardano-updates-tags-crypto-b1b-list.json",98253],"1a657a20":[()=>n.e(97382).then(n.t.bind(n,26170,19)),"~blog/updates/cardano-updates-tags-cli-api-page-2-8d5.json",26170],"1a932c01":[()=>n.e(2348).then(n.bind(n,48897)),"@site/blog/2023-08-17-db-sync.md?truncated=true",48897],"1afca88e":[()=>n.e(49835).then(n.bind(n,3693)),"@site/blog/2023-10-02-network.md",3693],"1b0bebd5":[()=>n.e(97801).then(n.t.bind(n,17169,19)),"~blog/updates/cardano-updates-page-61-ee7.json",17169],"1b2a226f":[()=>n.e(88782).then(n.bind(n,67497)),"@site/blog/2023-09-07-mithril.md",67497],"1b2c892c":[()=>n.e(53210).then(n.t.bind(n,69530,19)),"~blog/quarterly/cardano-updates-quarterly-tags-performance-tracing-bbf-list.json",69530],"1b2c8e6e":[()=>n.e(36303).then(n.t.bind(n,43673,19)),"~blog/updates/cardano-updates-tags-cli-api-page-6-f69.json",43673],"1b34f23d":[()=>n.e(91990).then(n.bind(n,91179)),"@site/blog/2023-11-20-cip1694.md",91179],"1be78505":[()=>Promise.all([n.e(40532),n.e(29514)]).then(n.bind(n,19963)),"@theme/DocPage",19963],"1be923a7":[()=>n.e(47658).then(n.bind(n,43079)),"@site/blog/2023-06-12-network.md?truncated=true",43079],"1c192ca4":[()=>n.e(23146).then(n.bind(n,31697)),"@site/blog/2023-11-15-mithril.md?truncated=true",31697],"1caacab6":[()=>n.e(85442).then(n.bind(n,89790)),"@site/blog/2023-03-10-hydra.md?truncated=true",89790],"1d10bd9e":[()=>n.e(5978).then(n.bind(n,66143)),"@site/blog/2023-03-08-node-cli-api.md",66143],"1da92289":[()=>n.e(22954).then(n.bind(n,49363)),"@site/blog/2022-11-03-embedding-quality.md?truncated=true",49363],"1e0f95a7":[()=>n.e(65123).then(n.t.bind(n,85782,19)),"~blog/updates/cardano-updates-page-17-faf.json",85782],"1e24dd00":[()=>n.e(11652).then(n.t.bind(n,42664,19)),"~blog/quarterly/cardano-updates-quarterly-tags-open-source-e7c-list.json",42664],"1e4232ab":[()=>n.e(88818).then(n.bind(n,6193)),"@site/docs/tutorial-basics/create-a-document.md",6193],"1e57c0e2":[()=>n.e(64313).then(n.bind(n,45222)),"@site/blog/2023-08-18-goedel.md?truncated=true",45222],"1f391b9e":[()=>Promise.all([n.e(40532),n.e(80210),n.e(13085)]).then(n.bind(n,14247)),"@theme/MDXPage",14247],"1f965afe":[()=>n.e(20635).then(n.t.bind(n,1948,19)),"~blog/updates/cardano-updates-tags-network-page-3-643-list.json",1948],"1f9c0c9c":[()=>n.e(28323).then(n.bind(n,3315)),"@site/blog/2023-09-20-mithril.md",3315],"2073b851":[()=>Promise.all([n.e(51068),n.e(47704)]).then(n.bind(n,3529)),"@site/blog/2022-09-27-network.md?truncated=true",3529],"209bf559":[()=>n.e(80367).then(n.bind(n,73937)),"@site/blog/2023-10-02-network.md?truncated=true",73937],"20bc6fcd":[()=>n.e(4093).then(n.bind(n,46994)),"@site/blog/2023-06-09-developer-experience.md",46994],"20ca2c37":[()=>n.e(38516).then(n.bind(n,12772)),"@site/blog/2023-07-04-db-sync.md",12772],"2154b8e4":[()=>n.e(28480).then(n.bind(n,39253)),"@site/blog/2023-05-26-ledger.md?truncated=true",39253],"21735eff":[()=>n.e(64156).then(n.t.bind(n,60430,19)),"~blog/updates/cardano-updates-tags-network-page-2-514-list.json",60430],"21857c8f":[()=>n.e(85417).then(n.bind(n,7484)),"@site/blog/2022-12-01-system-test.md",7484],"219856ee":[()=>n.e(2109).then(n.bind(n,47873)),"@site/blog/2023-04-28-goedel.md",47873],"2276e554":[()=>n.e(28843).then(n.bind(n,6380)),"@site/blog/2023-08-04-network.md",6380],"237aa4d6":[()=>n.e(98918).then(n.bind(n,71014)),"@site/blog/2023-07-20-goedel.md",71014],"23a95b4f":[()=>n.e(94583).then(n.t.bind(n,56372,19)),"~blog/updates/cardano-updates-tags-consensus-page-4-6d0.json",56372],"2455acc4":[()=>n.e(21642).then(n.bind(n,36107)),"@site/blog/2023-08-15-node-cli-api.md",36107],"245ecae9":[()=>n.e(65356).then(n.bind(n,27417)),"@site/blog/2023-09-15-hydra.md",27417],"246d9f04":[()=>n.e(7966).then(n.bind(n,52531)),"@site/blog/2023-08-04-crypto.md?truncated=true",52531],"2494f6fc":[()=>n.e(57583).then(n.t.bind(n,4452,19)),"~blog/quarterly/cardano-updates-quarterly-tags-tags-a76.json",4452],"24d5a6d9":[()=>n.e(98698).then(n.bind(n,35142)),"@site/blog/2023-09-27-mithril.md?truncated=true",35142],"255b72b4":[()=>n.e(22109).then(n.t.bind(n,42018,19)),"~blog/updates/cardano-updates-tags-ledger-page-6-e5e.json",42018],"26678b7e":[()=>n.e(47724).then(n.bind(n,32447)),"@site/blog/2022-12-02-hydra.md",32447],"26a4b8b3":[()=>n.e(47669).then(n.bind(n,39448)),"@site/blog/2023-12-04-performance-and-tracing.md?truncated=true",39448],"274d7200":[()=>n.e(26565).then(n.bind(n,38189)),"@site/blog/2022-11-11-ledger.md?truncated=true",38189],"27c15961":[()=>n.e(73798).then(n.t.bind(n,32264,19)),"~blog/updates/cardano-updates-tags-goedel-page-2-248.json",32264],"27c463c7":[()=>n.e(24327).then(n.t.bind(n,83769,19)),"/home/runner/work/cardano-updates/cardano-updates/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],28874657:[()=>n.e(28592).then(n.bind(n,68472)),"@site/blog/2023-03-08-consensus.md",68472],"28bc1d1b":[()=>n.e(1285).then(n.bind(n,41578)),"@site/blog/2023-06-08-system-test.md?truncated=true",41578],"28d85025":[()=>n.e(5214).then(n.bind(n,85773)),"@site/blog/2023-12-06-ledger.md",85773],"29801efc":[()=>n.e(50307).then(n.t.bind(n,22660,19)),"~blog/updates/cardano-updates-page-45-d2f.json",22660],"2a8f0182":[()=>n.e(57227).then(n.bind(n,82749)),"@site/blog/2023-03-22-node-cli-api.md",82749],"2b637fd9":[()=>n.e(69376).then(n.bind(n,75477)),"@site/blog/2023-09-14-db-sync.md",75477],"2bc04bf6":[()=>n.e(56010).then(n.bind(n,16010)),"@site/blog/2023-06-01-mithril.md",16010],"2c045882":[()=>n.e(98777).then(n.t.bind(n,52488,19)),"~blog/updates/cardano-updates-tags-performance-tracing-52e.json",52488],"2d0da244":[()=>n.e(26299).then(n.bind(n,91989)),"@site/blog/2023-04-28-crypto.md?truncated=true",91989],"2d52a685":[()=>n.e(20553).then(n.bind(n,7623)),"@site/blog/2023-05-31-performance-and-tracing.md?truncated=true",7623],"2d72833d":[()=>n.e(18303).then(n.bind(n,22472)),"@site/blog/2023-02-17-hydra.md?truncated=true",22472],"2d91c21f":[()=>n.e(30335).then(n.bind(n,27810)),"@site/blog/2023-04-17-incident.md",27810],"2dd2949a":[()=>n.e(6996).then(n.t.bind(n,64145,19)),"~blog/updates/cardano-updates-page-58-02b.json",64145],"2e28eb6b":[()=>n.e(46576).then(n.bind(n,74929)),"@site/blog/2023-08-10-mithril.md?truncated=true",74929],"2e2abe90":[()=>n.e(69467).then(n.bind(n,18367)),"@site/blog/2023-01-19-ledger.md?truncated=true",18367],"2e52ad4e":[()=>n.e(66840).then(n.bind(n,80401)),"@site/blog/2023-03-17-crypto.md",80401],"2e69cd33":[()=>n.e(45662).then(n.t.bind(n,15238,19)),"~blog/updates/cardano-updates-tags-ledger-cda.json",15238],"2eba0b82":[()=>n.e(43898).then(n.bind(n,92134)),"@site/blog/2023-01-20-sre.md",92134],"2ebccc4d":[()=>n.e(98370).then(n.t.bind(n,18194,19)),"~blog/updates/cardano-updates-page-47-ed7.json",18194],"2f97c20a":[()=>n.e(15677).then(n.t.bind(n,8806,19)),"~blog/updates/cardano-updates-page-32-9a7.json",8806],"2fa57f55":[()=>n.e(47176).then(n.bind(n,52901)),"@site/blog/2022-09-01-ledger.md?truncated=true",52901],"2fd426fa":[()=>n.e(36016).then(n.bind(n,89488)),"@site/blog/2023-01-11-consensus.md",89488],"301cd1f4":[()=>n.e(11952).then(n.bind(n,30886)),"@site/blog/2023-08-23-consensus.md",30886],"31025fde":[()=>n.e(22519).then(n.bind(n,53320)),"@site/blog/2023-09-08-hydra.md?truncated=true",53320],"3143eb67":[()=>n.e(7204).then(n.bind(n,57574)),"@site/blog/2023-01-11-performance-and-tracing.md?truncated=true",57574],"31889a8f":[()=>n.e(96446).then(n.bind(n,59591)),"@site/blog/2022-11-02-consensus.md?truncated=true",59591],"324138c8":[()=>n.e(95613).then(n.bind(n,42554)),"@site/blog/2023-02-22-consensus.md",42554],"32d4ad41":[()=>n.e(42575).then(n.bind(n,17402)),"@site/blog/2022-11-11-hydra.md",17402],"3328a3bf":[()=>n.e(86393).then(n.bind(n,44495)),"@site/blog/2022-10-04-db-sync.md",44495],"335868d9":[()=>n.e(45480).then(n.bind(n,98404)),"@site/blog/2023-11-29-consensus.md",98404],"3399a664":[()=>n.e(70950).then(n.bind(n,36908)),"@site/blog/2023-09-12-node-cli-api.md?truncated=true",36908],34012593:[()=>n.e(86809).then(n.bind(n,22555)),"@site/blog/2023-03-03-goedel.md",22555],"347c3e4d":[()=>n.e(23271).then(n.bind(n,43292)),"@site/blog/2022-12-01-db-sync.md",43292],"34c17ec8":[()=>n.e(91902).then(n.t.bind(n,52219,19)),"~blog/quarterly/cardano-updates-quarterly-b07.json",52219],"35369e36":[()=>n.e(74433).then(n.t.bind(n,54137,19)),"~blog/updates/cardano-updates-tags-goedel-page-3-ef0.json",54137],"354f96c6":[()=>n.e(78580).then(n.bind(n,21287)),"@site/blog/2023-10-04-consensus.md",21287],"35785fae":[()=>n.e(7233).then(n.bind(n,56031)),"@site/blog/2023-01-27-hydra.md?truncated=true",56031],35961293:[()=>n.e(6115).then(n.bind(n,69047)),"@site/blog/2023-11-22-mithril.md",69047],"359aa856":[()=>n.e(97317).then(n.t.bind(n,2112,19)),"~blog/updates/cardano-updates-tags-embedding-quality-232-list.json",2112],"35c3586e":[()=>n.e(2789).then(n.bind(n,70373)),"@site/blog/2023-10-06-hydra.md?truncated=true",70373],"35e2a0c5":[()=>n.e(90999).then(n.bind(n,53873)),"@site/blog/2023-09-29-ledger.md",53873],"35ef34ae":[()=>n.e(44966).then(n.bind(n,6768)),"@site/blog/2023-08-04-sre.md?truncated=true",6768],"35f1ce0d":[()=>n.e(35400).then(n.t.bind(n,80299,19)),"~blog/updates/cardano-updates-tags-crypto-b1b.json",80299],"36a96f5a":[()=>n.e(92160).then(n.bind(n,5083)),"@site/blog/2023-11-09-db-sync.md",5083],"370c5287":[()=>n.e(32438).then(n.bind(n,24475)),"@site/blog/2022-10-28-network.md",24475],"372219b0":[()=>n.e(24251).then(n.t.bind(n,13598,19)),"~blog/updates/cardano-updates-tags-tags-fe2.json",13598],"376dd8e8":[()=>n.e(55413).then(n.t.bind(n,36140,19)),"~blog/updates/cardano-updates-tags-consensus-page-5-ec6.json",36140],"37b247a8":[()=>n.e(21080).then(n.bind(n,46172)),"@site/blog/2023-12-06-mithril.md?truncated=true",46172],"37b2e4a4":[()=>n.e(83051).then(n.t.bind(n,94819,19)),"~blog/updates/cardano-updates-tags-consensus-page-7-7b5-list.json",94819],"38284ae5":[()=>n.e(49105).then(n.bind(n,66756)),"@site/blog/2023-11-17-performance-and-tracing.md",66756],"387f3426":[()=>n.e(34719).then(n.bind(n,78509)),"@site/blog/2023-11-10-hydra.md",78509],"388f6888":[()=>n.e(96394).then(n.t.bind(n,24279,19)),"~blog/updates/cardano-updates-page-54-61e.json",24279],"391126a1":[()=>n.e(80542).then(n.bind(n,71720)),"@site/blog/2023-03-17-ledger.md?truncated=true",71720],"393be207":[()=>n.e(87414).then(n.bind(n,53123)),"@site/src/pages/markdown-page.md",53123],"393cd824":[()=>n.e(65773).then(n.bind(n,14686)),"@site/blog/2023-04-05-node-cli-api.md?truncated=true",14686],"397686d4":[()=>n.e(89756).then(n.bind(n,54922)),"@site/blog/2023-08-11-performance-and-tracing.md",54922],"3a3a2602":[()=>n.e(20974).then(n.bind(n,17330)),"@site/blog/2023-07-14-hydra.md",17330],"3a40f46b":[()=>n.e(36337).then(n.bind(n,9213)),"@site/blog/2023-11-22-ledger.md",9213],"3a493dd8":[()=>n.e(39071).then(n.bind(n,17741)),"@site/blog/2023-05-26-hydra.md",17741],"3ab5f4e0":[()=>n.e(4376).then(n.bind(n,33684)),"@site/blog/2023-03-23-db-sync.md?truncated=true",33684],"3ac14561":[()=>n.e(79765).then(n.t.bind(n,30455,19)),"~blog/updates/cardano-updates-page-12-58d.json",30455],"3ac610ff":[()=>n.e(15091).then(n.bind(n,79647)),"@site/blog/2023-03-16-goedel.md?truncated=true",79647],"3bb06773":[()=>n.e(65029).then(n.bind(n,36825)),"@site/blog/2023-08-29-node-cli-api.md",36825],"3bb415e3":[()=>n.e(94900).then(n.bind(n,83813)),"@site/blog/2023-06-23-goedel.md?truncated=true",83813],"3bc8fe23":[()=>n.e(12029).then(n.bind(n,3902)),"@site/blog/2023-10-11-mithril.md?truncated=true",3902],"3be95f92":[()=>n.e(9140).then(n.t.bind(n,72016,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-5-215-list.json",72016],"3c2e75b4":[()=>n.e(30843).then(n.t.bind(n,7697,19)),"~blog/updates/cardano-updates-tags-ledger-page-6-e5e-list.json",7697],"3c3d2bff":[()=>n.e(49706).then(n.bind(n,46019)),"@site/blog/2023-08-17-secp-security-issue-report.md?truncated=true",46019],"3c8518bb":[()=>n.e(86983).then(n.t.bind(n,45088,19)),"~blog/updates/cardano-updates-page-25-9c7.json",45088],"3cb4be67":[()=>n.e(96774).then(n.t.bind(n,40264,19)),"~blog/updates/cardano-updates-page-28-2d0.json",40264],"3cb9fdac":[()=>n.e(55638).then(n.bind(n,92191)),"@site/blog/2023-04-20-node-cli-api.md",92191],"3ce290cc":[()=>n.e(18654).then(n.bind(n,64938)),"@site/blog/2023-02-17-goedel.md?truncated=true",64938],"3dbbac8a":[()=>n.e(16855).then(n.bind(n,22358)),"@site/blog/2023-07-13-mithril.md",22358],"3e93a65d":[()=>n.e(51164).then(n.t.bind(n,35089,19)),"~blog/updates/cardano-updates-page-20-c05.json",35089],"3eae7101":[()=>n.e(69399).then(n.t.bind(n,44659,19)),"~blog/quarterly/cardano-updates-quarterly-tags-network-8e3.json",44659],"3ede3d79":[()=>n.e(2221).then(n.t.bind(n,4562,19)),"~blog/updates/cardano-updates-archive-e9d.json",4562],"3ee2c73a":[()=>n.e(50506).then(n.bind(n,71126)),"@site/blog/2023-05-01-db-sync.md",71126],"3f2108ba":[()=>n.e(99610).then(n.bind(n,48560)),"@site/blog/2023-08-10-mithril.md",48560],"3f64a4c5":[()=>n.e(78397).then(n.t.bind(n,16233,19)),"~blog/updates/cardano-updates-page-53-c45.json",16233],"3f9060c3":[()=>n.e(36398).then(n.bind(n,37709)),"@site/blog/2023-04-05-consensus.md?truncated=true",37709],40367786:[()=>n.e(47406).then(n.t.bind(n,88444,19)),"~blog/updates/cardano-updates-tags-hydra-page-8-f0c.json",88444],"40718b14":[()=>n.e(43980).then(n.t.bind(n,71967,19)),"~blog/quarterly/cardano-updates-quarterly-tags-sre-aa0-list.json",71967],"40a4cbba":[()=>n.e(66458).then(n.t.bind(n,43602,19)),"~blog/updates/cardano-updates-tags-embedding-quality-232.json",43602],"40e498fa":[()=>n.e(23092).then(n.bind(n,72311)),"@site/blog/2022-11-02-node-cli-api.md?truncated=true",72311],"41244b80":[()=>n.e(22496).then(n.t.bind(n,43985,19)),"~blog/updates/cardano-updates-tags-ledger-cda-list.json",43985],"415f2cd9":[()=>n.e(21198).then(n.t.bind(n,62989,19)),"~blog/updates/cardano-updates-page-42-4d8.json",62989],41606842:[()=>n.e(88101).then(n.bind(n,79031)),"@site/blog/2022-12-02-hydra.md?truncated=true",79031],"417fc4b4":[()=>n.e(57271).then(n.bind(n,30336)),"@site/blog/2023-01-20-hydra.md?truncated=true",30336],"41d087d7":[()=>n.e(71972).then(n.bind(n,97898)),"@site/blog/2022-11-18-hydra.md?truncated=true",97898],"425dfc0f":[()=>n.e(85349).then(n.bind(n,95911)),"@site/blog/2023-08-04-crypto.md",95911],"42ad0ca4":[()=>n.e(80309).then(n.bind(n,33044)),"@site/blog/2023-03-31-hydra.md",33044],"43289e4d":[()=>n.e(458).then(n.bind(n,54048)),"@site/blog/2023-08-18-hydra.md",54048],"435d8b4c":[()=>n.e(88697).then(n.bind(n,21135)),"@site/blog/2023-04-27-hydra.md",21135],"437db4bf":[()=>n.e(81587).then(n.bind(n,25180)),"@site/blog/2023-02-03-crypto.md",25180],"439b9a57":[()=>n.e(96121).then(n.bind(n,11519)),"@site/blog/2022-11-02-release.md?truncated=true",11519],"43aa4824":[()=>n.e(98347).then(n.bind(n,13379)),"@site/blog/2023-03-17-ledger.md",13379],"43ab8474":[()=>n.e(5106).then(n.bind(n,99276)),"@site/blog/2023-10-15-network.md?truncated=true",99276],"43bbbae7":[()=>n.e(24310).then(n.bind(n,2530)),"@site/blog/2022-10-28-sre.md",2530],"444dad87":[()=>n.e(33815).then(n.bind(n,87921)),"@site/blog/2023-08-04-ledger.md",87921],"44642b2f":[()=>n.e(43108).then(n.bind(n,10798)),"@site/blog/2023-02-10-hydra.md",10798],"44e33f80":[()=>n.e(31636).then(n.bind(n,56423)),"@site/blog/2023-11-08-mithril.md",56423],"459dd1ef":[()=>n.e(67825).then(n.t.bind(n,41867,19)),"~blog/updates/cardano-updates-tags-consensus-330.json",41867],"45a10ae8":[()=>n.e(22206).then(n.bind(n,33786)),"@site/blog/2023-07-07-sre.md?truncated=true",33786],"469935bd":[()=>n.e(47605).then(n.bind(n,74340)),"@site/blog/2023-09-01-network.md?truncated=true",74340],"46c51ef6":[()=>n.e(28298).then(n.bind(n,88673)),"@site/quarterly/2022-11-09-network.md?truncated=true",88673],"46d9aab0":[()=>n.e(40373).then(n.t.bind(n,25545,19)),"~blog/updates/cardano-updates-tags-hydra-page-7-81d.json",25545],"4735cd81":[()=>n.e(15529).then(n.bind(n,68428)),"@site/blog/2023-01-20-network.md?truncated=true",68428],"47658b82":[()=>n.e(60263).then(n.bind(n,64472)),"@site/blog/2023-04-05-performance-and-tracing.md",64472],"47cae651":[()=>n.e(68352).then(n.t.bind(n,81765,19)),"~blog/updates/cardano-updates-page-2-aef.json",81765],"47da279e":[()=>n.e(6236).then(n.bind(n,32978)),"@site/blog/2023-06-23-sre.md",32978],"48292e37":[()=>n.e(18367).then(n.t.bind(n,8448,19)),"~blog/updates/cardano-updates-tags-ledger-page-5-2c6-list.json",8448],"485c7377":[()=>n.e(7322).then(n.bind(n,73200)),"@site/blog/2022-11-04-open-source.md",73200],"4883d618":[()=>n.e(5337).then(n.t.bind(n,3757,19)),"~blog/updates/cardano-updates-tags-db-sync-page-3-7db-list.json",3757],"4906b8e6":[()=>n.e(34070).then(n.t.bind(n,77544,19)),"~blog/updates/cardano-updates-tags-cli-api-page-5-88e.json",77544],"492dc159":[()=>n.e(75748).then(n.bind(n,4)),"@site/blog/2023-07-06-developer-experience.md",4],"496cb9ef":[()=>n.e(60852).then(n.bind(n,5306)),"@site/blog/2023-04-19-consensus.md",5306],"49d642c9":[()=>n.e(80575).then(n.bind(n,93731)),"@site/blog/2023-11-15-consensus.md",93731],"49d88be4":[()=>n.e(73343).then(n.bind(n,18820)),"@site/blog/2023-10-13-hydra.md?truncated=true",18820],"49db7061":[()=>n.e(60183).then(n.t.bind(n,853,19)),"~blog/updates/cardano-updates-tags-ledger-page-5-2c6.json",853],"4aaac366":[()=>n.e(97535).then(n.bind(n,17682)),"@site/blog/2022-11-30-performance-and-tracing.md",17682],"4ab012ff":[()=>n.e(7555).then(n.bind(n,90789)),"@site/blog/2023-06-28-consensus.md",90789],"4b62dc40":[()=>n.e(10335).then(n.bind(n,91534)),"@site/blog/2023-02-21-db-sync.md",91534],"4b90674f":[()=>n.e(92308).then(n.bind(n,7811)),"@site/blog/2023-09-01-goedel.md",7811],"4b996e44":[()=>n.e(7897).then(n.bind(n,92942)),"@site/blog/2023-06-23-network.md",92942],"4be9a3a6":[()=>n.e(25480).then(n.bind(n,47519)),"@site/blog/2023-03-03-ledger.md",47519],"4bed0e48":[()=>n.e(34631).then(n.bind(n,21290)),"@site/blog/2023-02-17-crypto.md",21290],"4c4f8ee1":[()=>n.e(80113).then(n.bind(n,10331)),"@site/blog/2022-10-04-node-cli-api.md?truncated=true",10331],"4c7d0c08":[()=>n.e(40682).then(n.t.bind(n,52595,19)),"~blog/updates/cardano-updates-tags-security-898.json",52595],"4c91b9ee":[()=>n.e(76705).then(n.t.bind(n,5324,19)),"~blog/updates/cardano-updates-page-6-24a.json",5324],"4ce06e64":[()=>n.e(46318).then(n.bind(n,30792)),"@site/blog/2023-01-27-hydra.md",30792],"4cecd320":[()=>n.e(72311).then(n.t.bind(n,77048,19)),"~blog/updates/cardano-updates-tags-cli-api-4f5.json",77048],"4d3eb7e7":[()=>n.e(64827).then(n.bind(n,71235)),"@site/blog/2023-07-07-goedel.md?truncated=true",71235],"4d7c8e78":[()=>n.e(45389).then(n.bind(n,58435)),"@site/blog/2023-03-24-hydra.md?truncated=true",58435],"4da01d42":[()=>n.e(17903).then(n.bind(n,99538)),"@site/quarterly/2023-04-04-network.md",99538],"4dc3be72":[()=>n.e(76074).then(n.bind(n,75804)),"@site/blog/2023-01-26-mithril.md?truncated=true",75804],"4de4e659":[()=>n.e(53662).then(n.bind(n,64703)),"@site/blog/2023-11-29-mithril.md?truncated=true",64703],"4df30499":[()=>n.e(51951).then(n.bind(n,6909)),"@site/blog/2023-01-11-performance-and-tracing.md",6909],"4e45b006":[()=>n.e(63089).then(n.bind(n,11442)),"@site/blog/2023-09-15-ledger.md",11442],"4ed83391":[()=>n.e(22838).then(n.bind(n,50994)),"@site/blog/2023-09-22-performance-and-tracing.md",50994],"4ef71b5f":[()=>n.e(59749).then(n.t.bind(n,28331,19)),"~blog/quarterly/cardano-updates-quarterly-page-2-0af.json",28331],"4fb1471a":[()=>n.e(42347).then(n.t.bind(n,16186,19)),"~blog/updates/cardano-updates-tags-consensus-page-2-fa9.json",16186],"4fd8c72a":[()=>n.e(76294).then(n.t.bind(n,8513,19)),"~blog/updates/cardano-updates-tags-network-page-4-5dc.json",8513],"4fe12b4b":[()=>n.e(48837).then(n.bind(n,91525)),"@site/blog/2023-03-31-goedel.md",91525],"4fe88e48":[()=>n.e(82214).then(n.t.bind(n,17849,19)),"~blog/updates/cardano-updates-tags-db-sync-39c-list.json",17849],"4febca42":[()=>n.e(16349).then(n.bind(n,6690)),"@site/blog/2023-05-05-node-cli-api.md",6690],"50135b75":[()=>n.e(54176).then(n.bind(n,87628)),"@site/blog/2023-06-15-mithril.md",87628],"50d0e663":[()=>n.e(30670).then(n.bind(n,6403)),"@site/blog/2023-03-17-crypto.md?truncated=true",6403],"51457b0b":[()=>n.e(59576).then(n.t.bind(n,67576,19)),"~blog/updates/cardano-updates-tags-hydra-page-5-62d-list.json",67576],"51bf60d9":[()=>n.e(62901).then(n.bind(n,71365)),"@site/blog/2023-05-12-network.md?truncated=true",71365],"51cf8946":[()=>n.e(6324).then(n.bind(n,83753)),"@site/blog/2022-11-25-hydra.md",83753],"5226ad4f":[()=>n.e(17214).then(n.bind(n,45302)),"@site/blog/2023-08-18-ledger.md",45302],"5296f864":[()=>n.e(6255).then(n.bind(n,7408)),"@site/quarterly/2023-Q2-sre.md?truncated=true",7408],"52b8fa8a":[()=>n.e(19516).then(n.bind(n,74143)),"@site/blog/2023-08-25-hydra.md",74143],"533a09ca":[()=>n.e(54607).then(n.bind(n,95802)),"@site/docs/tutorial-basics/create-a-blog-post.md",95802],"533bb9dc":[()=>n.e(70022).then(n.bind(n,44508)),"@site/blog/2022-11-28-network.md?truncated=true",44508],"53f26dca":[()=>n.e(4775).then(n.t.bind(n,92006,19)),"~blog/updates/cardano-updates-page-44-091.json",92006],54597942:[()=>n.e(33596).then(n.t.bind(n,64660,19)),"~blog/updates/cardano-updates-tags-network-page-3-643.json",64660],"548ef7ca":[()=>n.e(25578).then(n.t.bind(n,8960,19)),"~blog/updates/cardano-updates-page-21-527.json",8960],"54a7c81e":[()=>n.e(16878).then(n.bind(n,10396)),"@site/blog/2023-10-24-node-cli-api.md?truncated=true",10396],"550cdc1d":[()=>n.e(75730).then(n.bind(n,70133)),"@site/blog/2023-02-03-goedel.md",70133],"551db1ac":[()=>n.e(86074).then(n.t.bind(n,62085,19)),"~blog/updates/cardano-updates-tags-mithril-page-2-0fe.json",62085],"55b9667a":[()=>n.e(75506).then(n.bind(n,73833)),"@site/blog/2023-03-02-network.md?truncated=true",73833],"55e35eab":[()=>n.e(6249).then(n.bind(n,64911)),"@site/blog/2023-12-06-mithril.md",64911],"563fcf2e":[()=>n.e(94560).then(n.bind(n,54332)),"@site/blog/2023-01-05-ledger.md?truncated=true",54332],"565f686e":[()=>n.e(3445).then(n.t.bind(n,18618,19)),"~blog/quarterly/cardano-updates-quarterly-tags-consensus-562.json",18618],"5668eccd":[()=>n.e(3918).then(n.bind(n,42)),"@site/blog/2022-12-09-hydra.md",42],"5674f153":[()=>n.e(14392).then(n.bind(n,8247)),"@site/blog/2023-09-15-sre.md",8247],"56b3fab8":[()=>n.e(36434).then(n.t.bind(n,71645,19)),"~blog/updates/cardano-updates-tags-goedel-page-3-ef0-list.json",71645],"56f35d85":[()=>n.e(5485).then(n.bind(n,98803)),"@site/blog/2023-03-03-ledger.md?truncated=true",98803],57008883:[()=>n.e(33399).then(n.bind(n,50417)),"@site/blog/2023-11-24-sre.md",50417],"5733c82d":[()=>n.e(94184).then(n.bind(n,97630)),"@site/blog/2022-09-16-ledger.md",97630],57700755:[()=>n.e(13276).then(n.t.bind(n,15745,19)),"/home/runner/work/cardano-updates/cardano-updates/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],"5778ca6b":[()=>n.e(51727).then(n.bind(n,86516)),"@site/quarterly/2022-11-07-nod-api-cli.md",86516],"578d3f15":[()=>n.e(26614).then(n.t.bind(n,7571,19)),"~blog/updates/cardano-updates-tags-goedel-page-4-a08.json",7571],"57e0ab98":[()=>n.e(20779).then(n.bind(n,49514)),"@site/quarterly/2023-Q2-network.md?truncated=true",49514],"5889a844":[()=>n.e(68184).then(n.bind(n,69282)),"@site/blog/2022-10-28-hydra.md",69282],"588e4efd":[()=>n.e(50097).then(n.bind(n,58022)),"@site/blog/2023-05-26-network.md",58022],"59a262d5":[()=>n.e(42198).then(n.bind(n,87547)),"@site/blog/2023-05-17-consensus.md?truncated=true",87547],"5a843cd2":[()=>n.e(37221).then(n.bind(n,73760)),"@site/blog/2023-07-27-mithril.md",73760],"5af0f4f9":[()=>n.e(16165).then(n.bind(n,81057)),"@site/blog/2023-09-01-sre.md",81057],"5c5c653f":[()=>n.e(34828).then(n.t.bind(n,53028,19)),"~blog/updates/cardano-updates-tags-sre-page-3-aa0.json",53028],"5c868d36":[()=>n.e(15589).then(n.bind(n,90187)),"@site/docs/tutorial-basics/create-a-page.md",90187],"5c8fca76":[()=>n.e(44003).then(n.bind(n,2907)),"@site/blog/2023-10-27-sre.md?truncated=true",2907],"5cc32405":[()=>n.e(65562).then(n.bind(n,83838)),"@site/blog/2023-10-13-hydra.md",83838],"5cf7c214":[()=>n.e(20681).then(n.t.bind(n,57654,19)),"~blog/updates/cardano-updates-tags-db-sync-39c.json",57654],"5d0266be":[()=>n.e(33671).then(n.bind(n,56787)),"@site/blog/2023-10-13-ledger.md",56787],"5d5964ec":[()=>n.e(53931).then(n.bind(n,66734)),"@site/blog/2023-04-05-consensus.md",66734],"5df8a536":[()=>n.e(30374).then(n.t.bind(n,92817,19)),"~blog/updates/cardano-updates-tags-release-0fa-list.json",92817],"5e3dc99b":[()=>n.e(67272).then(n.bind(n,56893)),"@site/blog/2022-12-16-hydra.md",56893],"5e730d4f":[()=>n.e(76762).then(n.bind(n,63341)),"@site/blog/2023-05-12-network.md",63341],"5e9a4be9":[()=>n.e(11748).then(n.bind(n,26518)),"@site/blog/2023-11-22-ledger.md?truncated=true",26518],"6004d2a4":[()=>n.e(57193).then(n.bind(n,57610)),"@site/blog/2023-08-04-network.md?truncated=true",57610],"600e4190":[()=>n.e(80599).then(n.bind(n,15191)),"@site/quarterly/2023-04-04-network.md?truncated=true",15191],"60a77258":[()=>n.e(83160).then(n.t.bind(n,72327,19)),"~blog/updates/cardano-updates-page-52-e03.json",72327],"60c9cc01":[()=>n.e(72744).then(n.t.bind(n,36901,19)),"~blog/updates/cardano-updates-page-4-922.json",36901],"60e1630c":[()=>n.e(31831).then(n.bind(n,48895)),"@site/blog/2023-02-08-node-cli-api.md",48895],"60fae5f4":[()=>n.e(40705).then(n.t.bind(n,75293,19)),"~blog/quarterly/cardano-updates-quarterly-tags-ledger-2d0.json",75293],"611f3a9e":[()=>n.e(25351).then(n.bind(n,9434)),"@site/blog/2023-09-15-sre.md?truncated=true",9434],"6190b2fb":[()=>n.e(48600).then(n.bind(n,35996)),"@site/blog/2023-06-09-developer-experience.md?truncated=true",35996],"61d299e1":[()=>n.e(5552).then(n.t.bind(n,88947,19)),"~blog/updates/cardano-updates-tags-release-0fa.json",88947],"61e62d68":[()=>n.e(81169).then(n.bind(n,49569)),"@site/blog/2023-09-01-goedel.md?truncated=true",49569],"61f1e7c8":[()=>n.e(70883).then(n.t.bind(n,63732,19)),"~blog/updates/cardano-updates-tags-consensus-page-3-682.json",63732],"6226ba71":[()=>n.e(70644).then(n.bind(n,88151)),"@site/blog/2022-11-23-ledger.md?truncated=true",88151],"622f92df":[()=>n.e(17923).then(n.t.bind(n,40294,19)),"~blog/updates/cardano-updates-tags-cli-api-page-3-7d2.json",40294],"62422ab6":[()=>n.e(55855).then(n.bind(n,29632)),"@site/blog/2023-02-17-ledger.md?truncated=true",29632],"62a53033":[()=>n.e(24215).then(n.t.bind(n,39252,19)),"~blog/updates/cardano-updates-page-39-32d.json",39252],"62dc90a1":[()=>n.e(86003).then(n.t.bind(n,31371,19)),"~blog/updates/cardano-updates-tags-consensus-page-3-682-list.json",31371],"62ec9f43":[()=>n.e(8694).then(n.bind(n,67097)),"@site/blog/2023-06-01-mithril.md?truncated=true",67097],"62f46a38":[()=>n.e(2681).then(n.bind(n,14066)),"@site/blog/2023-02-17-goedel.md",14066],"632979e8":[()=>n.e(32831).then(n.bind(n,26902)),"@site/blog/2023-06-29-mithril.md",26902],"637356df":[()=>n.e(95979).then(n.bind(n,29388)),"@site/blog/2022-09-19-db-sync.md",29388],"63fae4f0":[()=>n.e(39898).then(n.bind(n,5383)),"@site/blog/2023-03-21-network.md",5383],"65d0391b":[()=>n.e(88572).then(n.bind(n,87655)),"@site/blog/2023-08-17-crypto.md?truncated=true",87655],"65ecf6d5":[()=>n.e(64112).then(n.bind(n,22207)),"@site/blog/2023-08-04-sre.md",22207],"6610396c":[()=>n.e(84340).then(n.t.bind(n,30594,19)),"~blog/updates/cardano-updates-page-31-0d1.json",30594],"66326f4e":[()=>n.e(17837).then(n.t.bind(n,16524,19)),"~blog/updates/cardano-updates-page-8-42b.json",16524],"66345e96":[()=>n.e(48983).then(n.bind(n,1037)),"@site/blog/2023-06-23-goedel.md",1037],"66be9998":[()=>n.e(36186).then(n.t.bind(n,19894,19)),"~blog/updates/cardano-updates-tags-security-898-list.json",19894],"67ce4884":[()=>n.e(86830).then(n.bind(n,31549)),"@site/blog/2023-05-12-goedel.md",31549],"684a796f":[()=>n.e(32871).then(n.t.bind(n,83127,19)),"~blog/updates/cardano-updates-tags-open-source-9d0.json",83127],"68585f67":[()=>n.e(14274).then(n.bind(n,3278)),"@site/blog/2023-07-21-sre.md?truncated=true",3278],"6875c492":[()=>Promise.all([n.e(40532),n.e(80210),n.e(2529),n.e(48610)]).then(n.bind(n,41714)),"@theme/BlogTagsPostsPage",41714],"68fb9d2f":[()=>n.e(80048).then(n.bind(n,33281)),"@site/blog/2022-09-16-ledger.md?truncated=true",33281],"691b1ed7":[()=>n.e(4944).then(n.bind(n,18980)),"@site/blog/2023-01-25-consensus.md",18980],"692497e1":[()=>n.e(92214).then(n.bind(n,29578)),"@site/blog/2023-08-09-consensus.md",29578],"6927f7c4":[()=>n.e(60019).then(n.bind(n,45798)),"@site/blog/2023-10-25-mithril.md",45798],"69c7a5a7":[()=>n.e(56950).then(n.bind(n,91002)),"@site/blog/2023-09-22-performance-and-tracing.md?truncated=true",91002],"6a2140b3":[()=>n.e(88845).then(n.t.bind(n,18702,19)),"~blog/updates/cardano-updates-tags-mithril-page-6-db9-list.json",18702],"6a75c57a":[()=>n.e(88592).then(n.bind(n,50202)),"@site/blog/2023-08-04-performance-and-tracing.md?truncated=true",50202],"6b16e156":[()=>n.e(52650).then(n.bind(n,2133)),"@site/blog/2023-05-01-db-sync.md?truncated=true",2133],"6b51f988":[()=>n.e(24384).then(n.bind(n,99968)),"@site/quarterly/2023-Q2-consensus.md?truncated=true",99968],"6b553c5c":[()=>n.e(93784).then(n.t.bind(n,90804,19)),"~blog/updates/cardano-updates-tags-mithril-page-6-db9.json",90804],"6b6054d2":[()=>n.e(30584).then(n.t.bind(n,75433,19)),"~blog/updates/cardano-updates-page-34-f5d.json",75433],"6bae8700":[()=>n.e(35703).then(n.bind(n,84195)),"@site/blog/2023-08-11-hydra.md",84195],"6c658908":[()=>n.e(73875).then(n.t.bind(n,18860,19)),"~blog/updates/cardano-updates-tags-sre-d43-list.json",18860],"6c8b7ad4":[()=>n.e(28577).then(n.bind(n,55749)),"@site/quarterly/2023-Q3-sre.md",55749],"6d22e028":[()=>n.e(29750).then(n.bind(n,38784)),"@site/blog/2023-11-14-node-cli-api.md?truncated=true",38784],"6d25229c":[()=>n.e(91879).then(n.bind(n,36845)),"@site/blog/2023-06-08-goedel.md?truncated=true",36845],"6d371395":[()=>n.e(97730).then(n.bind(n,73547)),"@site/blog/2022-09-01-ledger.md",73547],"6d826f51":[()=>n.e(7729).then(n.bind(n,87439)),"@site/blog/2022-10-18-consensus.md",87439],"6da0a796":[()=>n.e(80567).then(n.bind(n,41701)),"@site/blog/2022-11-25-crypto.md?truncated=true",41701],"6e43d302":[()=>n.e(59747).then(n.bind(n,3666)),"@site/blog/2023-09-29-ledger.md?truncated=true",3666],"6e743f1b":[()=>n.e(42686).then(n.bind(n,47088)),"@site/blog/2023-01-11-consensus.md?truncated=true",47088],"6e7b669d":[()=>n.e(96799).then(n.bind(n,19258)),"@site/blog/2023-09-15-network.md",19258],"6eecfaae":[()=>n.e(84069).then(n.bind(n,62566)),"@site/blog/2023-06-09-crypto.md?truncated=true",62566],"6f700e99":[()=>n.e(60459).then(n.t.bind(n,90442,19)),"~blog/updates/cardano-updates-tags-mithril-page-4-98c.json",90442],"6fb45133":[()=>n.e(79260).then(n.bind(n,42305)),"@site/blog/2023-03-08-node-cli-api.md?truncated=true",42305],"7030fa2f":[()=>n.e(39640).then(n.bind(n,88752)),"@site/blog/2022-08-31-consensus.md",88752],70372002:[()=>n.e(52703).then(n.bind(n,78155)),"@site/blog/2023-10-06-performance-and-tracing.md",78155],"70396aa3":[()=>n.e(92517).then(n.bind(n,27198)),"@site/blog/2023-10-04-mithril.md?truncated=true",27198],"704e5bb8":[()=>n.e(56733).then(n.bind(n,50085)),"@site/blog/2023-08-04-ledger.md?truncated=true",50085],"709abed9":[()=>n.e(85362).then(n.t.bind(n,92776,19)),"~blog/updates/cardano-updates-page-55-2f8.json",92776],"71d215be":[()=>n.e(74390).then(n.bind(n,87182)),"@site/blog/2023-07-14-hydra.md?truncated=true",87182],"71e4641a":[()=>Promise.all([n.e(51068),n.e(53940)]).then(n.bind(n,16528)),"@site/blog/2022-08-12-network.md",16528],"7221b837":[()=>n.e(90045).then(n.bind(n,45165)),"@site/blog/2023-11-20-cip1694.md?truncated=true",45165],"72c81964":[()=>n.e(94590).then(n.bind(n,25418)),"@site/blog/2023-01-26-mithril.md",25418],"7312b66d":[()=>n.e(3403).then(n.t.bind(n,39898,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-4-7d2-list.json",39898],"7325235b":[()=>n.e(99873).then(n.t.bind(n,50767,19)),"~blog/updates/cardano-updates-tags-hydra-page-11-1e1-list.json",50767],"733f2214":[()=>n.e(947).then(n.bind(n,67719)),"@site/blog/2022-10-14-hydra.md",67719],"73a1bc7a":[()=>n.e(44379).then(n.t.bind(n,32801,19)),"~blog/updates/cardano-updates-tags-ledger-page-4-98a-list.json",32801],"73a96f39":[()=>n.e(95845).then(n.bind(n,70943)),"@site/blog/2023-04-21-hydra.md",70943],"73bbd4d7":[()=>n.e(25590).then(n.bind(n,26293)),"@site/blog/2022-09-20-consensus.md?truncated=true",26293],"73f0dde0":[()=>n.e(30101).then(n.bind(n,94885)),"@site/blog/2023-05-05-node-cli-api.md?truncated=true",94885],"7439ef37":[()=>n.e(20433).then(n.bind(n,31145)),"@site/blog/2023-11-08-ledger.md",31145],"74d66224":[()=>n.e(40767).then(n.bind(n,4793)),"@site/blog/2022-12-14-consensus.md?truncated=true",4793],"752b6ead":[()=>n.e(50165).then(n.bind(n,4691)),"@site/blog/2023-05-31-performance-and-tracing.md",4691],"7574ff34":[()=>n.e(34891).then(n.bind(n,73908)),"@site/blog/2023-09-01-sre.md?truncated=true",73908],"76794a21":[()=>n.e(29071).then(n.bind(n,54861)),"@site/blog/2023-02-23-mithril.md?truncated=true",54861],"769eb34c":[()=>n.e(6919).then(n.bind(n,5102)),"@site/blog/2023-07-26-consensus.md",5102],"76c61a3b":[()=>n.e(91192).then(n.bind(n,6540)),"@site/blog/2022-11-16-performance-and-tracing.md?truncated=true",6540],"771f29e6":[()=>n.e(56674).then(n.bind(n,27064)),"@site/blog/2023-03-31-ledger.md",27064],"77215fb3":[()=>n.e(13680).then(n.bind(n,22549)),"@site/blog/2022-10-21-hydra.md?truncated=true",22549],"77550e96":[()=>n.e(62227).then(n.bind(n,68441)),"@site/blog/2023-08-29-node-cli-api.md?truncated=true",68441],"778ef860":[()=>n.e(96838).then(n.bind(n,92977)),"@site/blog/2023-09-15-goedel.md",92977],"77d69aed":[()=>n.e(29399).then(n.bind(n,60006)),"@site/blog/2023-05-31-consensus.md",60006],"77d820b6":[()=>n.e(76413).then(n.bind(n,88538)),"@site/blog/2023-05-03-performance-and-tracing.md",88538],"77e9cceb":[()=>n.e(54868).then(n.bind(n,19157)),"@site/blog/2023-08-17-db-sync.md",19157],"789f2cca":[()=>n.e(43261).then(n.bind(n,15659)),"@site/blog/2023-08-18-ledger.md?truncated=true",15659],"78c763b8":[()=>n.e(96944).then(n.bind(n,66974)),"@site/blog/2023-10-24-node-cli-api.md",66974],"78d554ba":[()=>n.e(61980).then(n.bind(n,99956)),"@site/blog/2023-05-26-goedel.md",99956],"78d8ce1d":[()=>n.e(73320).then(n.bind(n,82826)),"@site/blog/2022-11-01-db-sync.md",82826],"78df8d65":[()=>n.e(29537).then(n.bind(n,52713)),"@site/blog/2023-04-28-network.md?truncated=true",52713],79239208:[()=>n.e(35748).then(n.t.bind(n,61778,19)),"~blog/updates/cardano-updates-tags-hydra-page-2-af6-list.json",61778],"795480a5":[()=>n.e(78446).then(n.bind(n,14366)),"@site/blog/2023-01-05-ledger.md",14366],79730245:[()=>n.e(61596).then(n.bind(n,57102)),"@site/blog/2023-02-17-network.md?truncated=true",57102],"798d160f":[()=>n.e(82358).then(n.bind(n,66525)),"@site/blog/2023-10-18-consensus.md",66525],"79d76848":[()=>n.e(75379).then(n.bind(n,71256)),"@site/quarterly/2023-01-13-open-source.md?truncated=true",71256],"7a263bfa":[()=>n.e(98450).then(n.bind(n,56210)),"@site/blog/2023-10-27-network.md?truncated=true",56210],"7a4b421f":[()=>n.e(67452).then(n.bind(n,36234)),"@site/blog/2023-04-19-performance-and-tracing.md?truncated=true",36234],"7a6174e7":[()=>n.e(44377).then(n.bind(n,85666)),"@site/blog/2023-08-28-mithril.md?truncated=true",85666],"7a7e39bb":[()=>n.e(61660).then(n.bind(n,88637)),"@site/blog/2023-05-17-mithril.md",88637],"7aaa65e3":[()=>n.e(98882).then(n.t.bind(n,2632,19)),"~blog/updates/cardano-updates-tags-network-page-4-5dc-list.json",2632],"7b73b4cd":[()=>n.e(60881).then(n.t.bind(n,25184,19)),"~blog/updates/cardano-updates-page-19-308.json",25184],"7c359f4d":[()=>n.e(77696).then(n.bind(n,60515)),"@site/blog/2023-01-13-system-test.md?truncated=true",60515],"7c815b5e":[()=>n.e(59318).then(n.bind(n,97771)),"@site/blog/2022-10-05-consensus.md?truncated=true",97771],"7c895c96":[()=>n.e(83036).then(n.bind(n,93424)),"@site/blog/2023-09-06-consensus.md?truncated=true",93424],"7d4ab4f9":[()=>n.e(54007).then(n.t.bind(n,90958,19)),"~blog/updates/cardano-updates-page-9-6db.json",90958],"7d6aa09c":[()=>n.e(18058).then(n.t.bind(n,18069,19)),"~blog/updates/cardano-updates-tags-goedel-5b9.json",18069],"7de7ce98":[()=>n.e(9828).then(n.bind(n,95271)),"@site/quarterly/2023-Q3-performance-and-tracing.md?truncated=true",95271],"7de83161":[()=>n.e(7968).then(n.bind(n,91578)),"@site/blog/2023-11-15-consensus.md?truncated=true",91578],"7e644b1f":[()=>n.e(60375).then(n.bind(n,16503)),"@site/blog/2023-08-04-hydra.md",16503],"7e87972d":[()=>n.e(2432).then(n.bind(n,8671)),"@site/blog/2022-11-30-performance-and-tracing.md?truncated=true",8671],"7e8e081f":[()=>n.e(49238).then(n.t.bind(n,37418,19)),"~blog/updates/cardano-updates-tags-network-page-5-19d-list.json",37418],"7fa9de70":[()=>n.e(38938).then(n.bind(n,65004)),"@site/blog/2023-11-17-hydra.md?truncated=true",65004],"7faccef9":[()=>n.e(75064).then(n.bind(n,37006)),"@site/blog/2022-10-28-performance-and-tracing.md?truncated=true",37006],"7ff27d5d":[()=>n.e(16091).then(n.t.bind(n,97270,19)),"~blog/updates/cardano-updates-tags-cli-api-page-5-88e-list.json",97270],"7ff38eb4":[()=>n.e(19105).then(n.t.bind(n,25873,19)),"~blog/updates/cardano-updates-page-43-bff.json",25873],"80057f85":[()=>n.e(83377).then(n.t.bind(n,13147,19)),"~blog/quarterly/cardano-updates-quarterly-tags-network-8e3-list.json",13147],80537537:[()=>n.e(43140).then(n.bind(n,88265)),"@site/blog/2023-08-01-node-cli-api.md",88265],"805fc822":[()=>n.e(53165).then(n.bind(n,7581)),"@site/blog/2022-12-12-network.md?truncated=true",7581],80617771:[()=>n.e(23427).then(n.bind(n,22977)),"@site/blog/2023-09-29-hydra.md?truncated=true",22977],"8084428b":[()=>n.e(31724).then(n.t.bind(n,16813,19)),"~blog/updates/cardano-updates-tags-cli-api-page-4-e6c.json",16813],"80c54634":[()=>n.e(99808).then(n.bind(n,57809)),"@site/blog/2023-08-11-hydra.md?truncated=true",57809],"81528b00":[()=>n.e(50471).then(n.bind(n,67938)),"@site/blog/2022-12-01-mithril.md?truncated=true",67938],"81bb24c9":[()=>n.e(46003).then(n.bind(n,94887)),"@site/blog/2022-11-18-mithril.md",94887],82209890:[()=>n.e(30141).then(n.bind(n,25680)),"@site/blog/2023-06-14-performance-and-tracing.md",25680],"822bd8ab":[()=>n.e(36504).then(n.bind(n,27428)),"@site/docs/tutorial-basics/congratulations.md",27428],"82c38436":[()=>n.e(36229).then(n.t.bind(n,47683,19)),"~blog/updates/cardano-updates-tags-sre-page-2-3cd.json",47683],"82db709e":[()=>n.e(27647).then(n.bind(n,10627)),"@site/blog/2023-11-10-sre.md?truncated=true",10627],"82ed4471":[()=>n.e(58312).then(n.t.bind(n,9933,19)),"~blog/updates/cardano-updates-page-7-413.json",9933],"82f24945":[()=>n.e(33724).then(n.bind(n,11607)),"@site/blog/2023-01-20-crypto.md?truncated=true",11607],"830ba2c4":[()=>n.e(99726).then(n.t.bind(n,49778,19)),"~blog/updates/cardano-updates-tags-hydra-page-10-f84.json",49778],"831d95cb":[()=>n.e(75319).then(n.bind(n,69346)),"@site/blog/2023-01-13-hydra.md",69346],"8395f67d":[()=>n.e(16934).then(n.t.bind(n,55035,19)),"~blog/updates/cardano-updates-tags-crypto-page-2-57e-list.json",55035],"83e7e4db":[()=>n.e(68102).then(n.bind(n,85321)),"@site/quarterly/2022-11-15-consensus.md",85321],84189288:[()=>n.e(48863).then(n.bind(n,59071)),"@site/blog/2023-07-12-consensus.md",59071],"84677cf0":[()=>n.e(54415).then(n.bind(n,70789)),"@site/blog/2022-12-09-hydra.md?truncated=true",70789],"8470e3c7":[()=>n.e(38141).then(n.bind(n,75734)),"@site/blog/2023-01-06-crypto.md?truncated=true",75734],84823557:[()=>n.e(94771).then(n.t.bind(n,53381,19)),"~blog/updates/cardano-updates-page-36-2f1.json",53381],"8534c2dd":[()=>n.e(39987).then(n.bind(n,88128)),"@site/blog/2023-11-24-hydra.md?truncated=true",88128],"859b6012":[()=>n.e(85173).then(n.t.bind(n,96249,19)),"~blog/updates/cardano-updates-tags-db-sync-page-2-4f6.json",96249],"86c4d158":[()=>n.e(46831).then(n.bind(n,3439)),"@site/blog/2023-06-08-system-test.md",3439],"86cc1b5f":[()=>n.e(62034).then(n.t.bind(n,12783,19)),"~blog/updates/cardano-updates-page-60-066.json",12783],"86e0423a":[()=>n.e(69778).then(n.t.bind(n,6118,19)),"~blog/updates/cardano-updates-tags-mithril-7d9-list.json",6118],87088759:[()=>n.e(90047).then(n.t.bind(n,32425,19)),"~blog/quarterly/blog-post-list-prop-quarterly.json",32425],"871691d4":[()=>n.e(2136).then(n.bind(n,78081)),"@site/blog/2023-06-23-network.md?truncated=true",78081],"876c34e9":[()=>n.e(85369).then(n.bind(n,94306)),"@site/blog/2023-04-27-hydra.md?truncated=true",94306],"878c8163":[()=>n.e(45932).then(n.bind(n,91329)),"@site/blog/2023-09-14-db-sync.md?truncated=true",91329],"884eee03":[()=>n.e(54975).then(n.bind(n,99054)),"@site/blog/2023-12-06-ledger.md?truncated=true",99054],"8864b77b":[()=>n.e(61908).then(n.bind(n,21318)),"@site/blog/2023-03-08-performance-and-tracing.md?truncated=true",21318],"8914fa7e":[()=>n.e(15347).then(n.bind(n,17177)),"@site/blog/2022-11-16-consensus.md?truncated=true",17177],89211367:[()=>n.e(97421).then(n.t.bind(n,89635,19)),"~blog/updates/cardano-updates-page-33-e20.json",89635],89931013:[()=>n.e(10173).then(n.bind(n,34101)),"@site/blog/2023-04-06-mithril.md?truncated=true",34101],"89a43a90":[()=>n.e(82939).then(n.t.bind(n,76907,19)),"~blog/updates/cardano-updates-tags-sre-page-3-aa0-list.json",76907],"8a6fc2ec":[()=>n.e(22154).then(n.bind(n,82391)),"@site/blog/2023-01-19-ledger.md",82391],"8a766cbb":[()=>n.e(24212).then(n.t.bind(n,4627,19)),"~blog/updates/cardano-updates-tags-consensus-page-6-107.json",4627],"8b4d9039":[()=>n.e(55202).then(n.bind(n,81007)),"@site/blog/2023-04-19-consensus.md?truncated=true",81007],"8bfc66fb":[()=>n.e(15623).then(n.bind(n,69907)),"@site/blog/2023-07-07-crypto.md?truncated=true",69907],"8c574ba2":[()=>n.e(78183).then(n.t.bind(n,60540,19)),"~blog/quarterly/cardano-updates-quarterly-tags-performance-tracing-bbf.json",60540],"8c6dbeca":[()=>n.e(96162).then(n.bind(n,32688)),"@site/blog/2023-02-17-crypto.md?truncated=true",32688],"8c75942c":[()=>n.e(3530).then(n.bind(n,6905)),"@site/blog/2023-02-09-mithril.md",6905],"8ccf5d9f":[()=>n.e(66649).then(n.bind(n,78367)),"@site/blog/2022-10-14-ledger.md",78367],"8cd47ea9":[()=>n.e(58628).then(n.bind(n,31550)),"@site/blog/2022-10-21-hydra.md",31550],"8d0075ff":[()=>n.e(99750).then(n.bind(n,65389)),"@site/blog/2023-09-20-consensus.md",65389],"8d209506":[()=>n.e(32936).then(n.bind(n,58373)),"@site/blog/2023-01-20-crypto.md",58373],"8d306cf9":[()=>n.e(18144).then(n.bind(n,9865)),"@site/blog/2023-11-01-mithril.md",9865],"8d3da32e":[()=>n.e(84877).then(n.bind(n,92122)),"@site/blog/2022-11-02-release.md",92122],"8e410d22":[()=>n.e(25272).then(n.bind(n,54212)),"@site/blog/2023-03-23-mithril.md",54212],"8ed15298":[()=>n.e(9928).then(n.bind(n,5378)),"@site/blog/2023-07-04-node-cli-api.md",5378],"8f7e10a3":[()=>n.e(72033).then(n.t.bind(n,79573,19)),"~docs/default/category-cardano-updatesdocs-defaultsidebar-category-tutorial-basics-e06.json",79573],"8fddd37c":[()=>n.e(25778).then(n.t.bind(n,55797,19)),"~blog/updates/cardano-updates-page-26-467.json",55797],"8fe062a7":[()=>n.e(21597).then(n.bind(n,17331)),"@site/blog/2023-10-27-sre.md",17331],"8fea44ca":[()=>n.e(97517).then(n.bind(n,11611)),"@site/blog/2023-01-25-consensus.md?truncated=true",11611],"90bf9c2d":[()=>n.e(32035).then(n.bind(n,91041)),"@site/blog/2023-05-04-mithril.md",91041],"90cc522f":[()=>n.e(75696).then(n.bind(n,73887)),"@site/blog/2023-04-21-hydra.md?truncated=true",73887],"90f359c5":[()=>n.e(66891).then(n.bind(n,83762)),"@site/blog/2022-10-28-sre.md?truncated=true",83762],"9136968b":[()=>n.e(4986).then(n.bind(n,99124)),"@site/blog/2023-03-31-crypto.md?truncated=true",99124],"913aac40":[()=>n.e(92846).then(n.bind(n,97344)),"@site/blog/2023-03-23-mithril.md?truncated=true",97344],91595845:[()=>n.e(51268).then(n.bind(n,3573)),"@site/blog/2023-05-12-crypto.md?truncated=true",3573],91831590:[()=>n.e(29121).then(n.t.bind(n,50864,19)),"~blog/updates/cardano-updates-tags-hydra-page-2-af6.json",50864],"91b05c51":[()=>n.e(17490).then(n.bind(n,34691)),"@site/blog/2022-12-12-network.md",34691],"924be064":[()=>n.e(21798).then(n.bind(n,93825)),"@site/blog/2023-01-06-crypto.md",93825],"925feafa":[()=>n.e(19773).then(n.bind(n,67358)),"@site/blog/2023-02-23-mithril.md",67358],"9291df2e":[()=>n.e(62302).then(n.bind(n,32194)),"@site/blog/2023-10-04-mithril.md",32194],"934a8f8d":[()=>n.e(36370).then(n.bind(n,81779)),"@site/blog/2023-11-09-db-sync.md?truncated=true",81779],"935f2afb":[()=>n.e(80053).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],93729337:[()=>n.e(85845).then(n.bind(n,82597)),"@site/blog/2023-01-14-db-sync.md",82597],"93b15a8c":[()=>n.e(14582).then(n.bind(n,34989)),"@site/blog/2022-10-27-crypto.md",34989],94133299:[()=>n.e(48275).then(n.bind(n,87687)),"@site/blog/2022-09-30-ledger.md",87687],"9440f007":[()=>n.e(98254).then(n.bind(n,59255)),"@site/blog/2022-12-14-consensus.md",59255],"9450fd8f":[()=>n.e(45410).then(n.t.bind(n,9804,19)),"~blog/updates/cardano-updates-page-18-352.json",9804],"94780c38":[()=>n.e(58925).then(n.bind(n,99178)),"@site/blog/2023-01-14-db-sync.md?truncated=true",99178],"948ff80d":[()=>n.e(88767).then(n.t.bind(n,31306,19)),"~blog/updates/cardano-updates-tags-hydra-page-10-f84-list.json",31306],"94a907c9":[()=>n.e(23941).then(n.bind(n,44751)),"@site/blog/2023-03-03-goedel.md?truncated=true",44751],"94c6d911":[()=>n.e(44501).then(n.bind(n,14130)),"@site/blog/2022-11-16-performance-and-tracing.md",14130],"94dc91d7":[()=>n.e(6683).then(n.t.bind(n,59277,19)),"~blog/updates/cardano-updates-page-56-3ca.json",59277],"95f12e12":[()=>n.e(84727).then(n.bind(n,67975)),"@site/quarterly/2023-01-18-consensus.md?truncated=true",67975],"960e3390":[()=>n.e(24913).then(n.t.bind(n,57070,19)),"~blog/updates/cardano-updates-tags-mithril-page-4-98c-list.json",57070],"965e9e9a":[()=>n.e(37595).then(n.t.bind(n,27622,19)),"~blog/quarterly/cardano-updates-quarterly-tags-ledger-2d0-list.json",27622],"9668e24b":[()=>n.e(68044).then(n.bind(n,14624)),"@site/blog/2023-09-20-mithril.md?truncated=true",14624],"97407dee":[()=>n.e(47263).then(n.bind(n,53615)),"@site/quarterly/2023-04-25-consensus.md?truncated=true",53615],"97cbe67b":[()=>n.e(48221).then(n.bind(n,70314)),"@site/blog/2023-04-06-mithril.md",70314],"97daee08":[()=>n.e(32070).then(n.bind(n,43729)),"@site/blog/2023-03-09-mithril.md",43729],98277053:[()=>n.e(66602).then(n.t.bind(n,16938,19)),"~blog/updates/cardano-updates-tags-hydra-18a-list.json",16938],"986e43da":[()=>n.e(6807).then(n.bind(n,61934)),"@site/blog/2023-02-02-ledger.md",61934],"98b2ca25":[()=>n.e(1435).then(n.t.bind(n,27627,19)),"~blog/updates/cardano-updates-tags-cli-api-page-6-f69-list.json",27627],"98e6984f":[()=>n.e(19861).then(n.bind(n,80648)),"@site/blog/2022-12-15-mithril.md?truncated=true",80648],"9945c128":[()=>n.e(89325).then(n.t.bind(n,41340,19)),"~blog/updates/cardano-updates-tags-mithril-page-5-446-list.json",41340],"996aa714":[()=>n.e(70594).then(n.bind(n,73172)),"@site/blog/2022-12-14-performance-and-tracing.md?truncated=true",73172],99881079:[()=>n.e(53004).then(n.bind(n,38772)),"@site/blog/2023-05-17-performance-and-tracing.md?truncated=true",38772],"999e2b46":[()=>n.e(76433).then(n.bind(n,25360)),"@site/blog/2023-06-14-consensus.md?truncated=true",25360],"99b0bd12":[()=>n.e(59798).then(n.bind(n,17110)),"@site/blog/2023-06-12-network.md",17110],"9a01d9b0":[()=>n.e(21158).then(n.t.bind(n,78905,19)),"~blog/updates/cardano-updates-page-23-9f5.json",78905],"9a03c440":[()=>n.e(16959).then(n.bind(n,66401)),"@site/blog/2023-02-23-performance-and-tracing.md",66401],"9a4c05df":[()=>n.e(68077).then(n.t.bind(n,23401,19)),"~blog/updates/cardano-updates-tags-cli-api-page-2-8d5-list.json",23401],"9b5ce5fa":[()=>n.e(75501).then(n.bind(n,64213)),"@site/blog/2023-11-08-mithril.md?truncated=true",64213],"9b6092d7":[()=>n.e(48990).then(n.bind(n,90436)),"@site/blog/2022-12-14-db-sync.md",90436],"9b7a95a2":[()=>n.e(7266).then(n.bind(n,54972)),"@site/blog/2022-10-18-consensus.md?truncated=true",54972],"9ba26136":[()=>n.e(62231).then(n.bind(n,19146)),"@site/blog/2023-10-15-network.md",19146],"9bcfaf7c":[()=>n.e(27850).then(n.t.bind(n,13927,19)),"~blog/updates/cardano-updates-page-48-cb9.json",13927],"9c662d1f":[()=>n.e(75773).then(n.t.bind(n,23714,19)),"~blog/updates/cardano-updates-tags-mithril-7d9.json",23714],"9c7979b1":[()=>n.e(31757).then(n.bind(n,71635)),"@site/blog/2023-08-18-sre.md",71635],"9c96fa11":[()=>n.e(90178).then(n.bind(n,42764)),"@site/blog/2023-03-31-hydra.md?truncated=true",42764],"9cab6d73":[()=>n.e(93203).then(n.bind(n,72305)),"@site/blog/2023-07-07-hydra.md?truncated=true",72305],"9ce37f6e":[()=>n.e(66764).then(n.bind(n,79098)),"@site/blog/2023-12-01-hydra.md?truncated=true",79098],"9d43e047":[()=>n.e(78148).then(n.t.bind(n,29117,19)),"~blog/updates/cardano-updates-page-29-d69.json",29117],"9d7869bb":[()=>n.e(37734).then(n.bind(n,91509)),"@site/blog/2023-09-01-ledger.md?truncated=true",91509],"9dce568f":[()=>n.e(35029).then(n.t.bind(n,35560,19)),"~blog/updates/cardano-updates-tags-network-5a5-list.json",35560],"9dee36e7":[()=>n.e(58744).then(n.bind(n,57912)),"@site/blog/2023-08-18-sre.md?truncated=true",57912],"9e4087bc":[()=>n.e(53608).then(n.bind(n,63169)),"@theme/BlogArchivePage",63169],"9e570fef":[()=>n.e(32925).then(n.bind(n,62129)),"@site/blog/2023-09-15-goedel.md?truncated=true",62129],"9e834cf3":[()=>n.e(24941).then(n.t.bind(n,36262,19)),"~blog/updates/cardano-updates-page-13-7a9.json",36262],"9e9bda24":[()=>n.e(48679).then(n.t.bind(n,30570,19)),"~blog/updates/cardano-updates-page-50-009.json",30570],"9f70a142":[()=>n.e(6169).then(n.bind(n,4756)),"@site/blog/2022-12-09-crypto.md",4756],"9f761678":[()=>n.e(278).then(n.bind(n,32230)),"@site/blog/2023-04-28-crypto.md",32230],"9f7c2154":[()=>n.e(32472).then(n.bind(n,35890)),"@site/blog/2022-12-28-node-cli-api.md",35890],"9fba849d":[()=>n.e(82941).then(n.bind(n,14990)),"@site/blog/2022-11-04-hydra.md?truncated=true",14990],a040c838:[()=>n.e(9499).then(n.bind(n,85704)),"@site/blog/2023-06-09-crypto.md",85704],a0d18a99:[()=>n.e(62767).then(n.bind(n,11960)),"@site/quarterly/2022-11-07-ledger.md",11960],a0fc6770:[()=>n.e(59158).then(n.t.bind(n,94032,19)),"~blog/updates/cardano-updates-tags-db-sync-page-2-4f6-list.json",94032],a14fd889:[()=>n.e(87326).then(n.bind(n,16410)),"@site/blog/2023-10-18-mithril.md?truncated=true",16410],a1597564:[()=>n.e(60715).then(n.bind(n,33286)),"@site/blog/2023-02-02-ledger.md?truncated=true",33286],a1ac97eb:[()=>n.e(36463).then(n.bind(n,25274)),"@site/blog/2022-11-30-node-cli-api.md?truncated=true",25274],a1b4c76a:[()=>n.e(8765).then(n.t.bind(n,48796,19)),"~blog/updates/cardano-updates-page-14-0e3.json",48796],a1cde312:[()=>n.e(90748).then(n.bind(n,47553)),"@site/blog/2023-07-28-hydra.md?truncated=true",47553],a1d1f035:[()=>n.e(91282).then(n.bind(n,39065)),"@site/blog/2023-09-20-consensus.md?truncated=true",39065],a1d4a798:[()=>n.e(25353).then(n.bind(n,53712)),"@site/blog/2023-11-17-performance-and-tracing.md?truncated=true",53712],a1f2945e:[()=>n.e(87407).then(n.bind(n,18936)),"@site/blog/2023-09-26-node-cli-api.md?truncated=true",18936],a2a63bac:[()=>n.e(16002).then(n.bind(n,54903)),"@site/blog/2023-06-09-hydra.md",54903],a2ee852b:[()=>n.e(95208).then(n.bind(n,15302)),"@site/blog/2023-05-03-consensus.md",15302],a34b3179:[()=>n.e(22254).then(n.t.bind(n,94029,19)),"~blog/updates/cardano-updates-tags-crypto-page-4-d7d.json",94029],a3889346:[()=>n.e(49769).then(n.bind(n,8838)),"@site/blog/2022-09-30-ledger.md?truncated=true",8838],a48d66c0:[()=>n.e(77965).then(n.bind(n,69029)),"@site/blog/2023-09-07-performance-and-tracing.md",69029],a572b6ff:[()=>n.e(56618).then(n.bind(n,18104)),"@site/blog/2023-08-04-performance-and-tracing.md",18104],a5bf291f:[()=>n.e(30907).then(n.t.bind(n,97577,19)),"~blog/updates/cardano-updates-tags-open-source-9d0-list.json",97577],a6238997:[()=>n.e(49904).then(n.bind(n,46010)),"@site/blog/2023-04-17-incident.md?truncated=true",46010],a687dd04:[()=>n.e(26026).then(n.bind(n,59536)),"@site/blog/2023-10-13-sre.md?truncated=true",59536],a69f0deb:[()=>n.e(2773).then(n.bind(n,67900)),"@site/blog/2023-07-18-node-cli-api.md?truncated=true",67900],a6aa9e1f:[()=>Promise.all([n.e(40532),n.e(80210),n.e(2529),n.e(93089)]).then(n.bind(n,80046)),"@theme/BlogListPage",80046],a6afc437:[()=>n.e(69565).then(n.t.bind(n,87737,19)),"~blog/updates/cardano-updates-tags-hydra-page-6-174.json",87737],a6e1d45a:[()=>n.e(8737).then(n.bind(n,30221)),"@site/blog/2023-10-27-hydra.md",30221],a6e5ff3c:[()=>n.e(78153).then(n.bind(n,3868)),"@site/blog/2023-08-18-hydra.md?truncated=true",3868],a7418040:[()=>n.e(16886).then(n.bind(n,43603)),"@site/blog/2023-11-15-mithril.md",43603],a7a31948:[()=>n.e(85943).then(n.bind(n,91654)),"@site/blog/2023-09-29-sre.md",91654],a8723288:[()=>n.e(86673).then(n.t.bind(n,51115,19)),"~blog/updates/cardano-updates-tags-sre-d43.json",51115],a8738e5f:[()=>n.e(99881).then(n.bind(n,67461)),"@site/blog/2023-04-20-mithril.md",67461],a9019578:[()=>n.e(4497).then(n.bind(n,65934)),"@site/blog/2022-10-04-node-cli-api.md",65934],a9347c1b:[()=>n.e(76323).then(n.bind(n,95829)),"@site/blog/2023-02-09-mithril.md?truncated=true",95829],aa4c9cc8:[()=>n.e(50919).then(n.bind(n,13503)),"@site/blog/2023-05-19-hydra.md?truncated=true",13503],aafd9eaa:[()=>n.e(89083).then(n.t.bind(n,25543,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-2-43f.json",25543],ab4c3279:[()=>n.e(72690).then(n.bind(n,67660)),"@site/blog/2023-09-22-hydra.md",67660],ac12bff3:[()=>n.e(4608).then(n.t.bind(n,66384,19)),"~blog/updates/cardano-updates-page-49-110.json",66384],ac56cb0b:[()=>n.e(39329).then(n.bind(n,7640)),"@site/blog/2022-11-16-consensus.md",7640],ac87db6a:[()=>n.e(62703).then(n.t.bind(n,20637,19)),"~blog/updates/cardano-updates-tags-hydra-page-4-6e8-list.json",20637],ac8a5a87:[()=>n.e(25853).then(n.t.bind(n,33480,19)),"~blog/quarterly/cardano-updates-quarterly-archive-b33.json",33480],acd2edbe:[()=>n.e(39113).then(n.t.bind(n,52701,19)),"~blog/updates/cardano-updates-page-3-c5b.json",52701],ace79a55:[()=>n.e(61185).then(n.bind(n,40709)),"@site/blog/2023-06-30-hydra.md?truncated=true",40709],add555bf:[()=>n.e(23360).then(n.bind(n,7584)),"@site/blog/2022-11-02-ledger.md",7584],ae2d2424:[()=>n.e(17873).then(n.bind(n,59274)),"@site/blog/2022-10-14-hydra.md?truncated=true",59274],ae455379:[()=>n.e(38672).then(n.t.bind(n,17033,19)),"~blog/quarterly/cardano-updates-quarterly-tags-consensus-562-list.json",17033],ae521593:[()=>n.e(81947).then(n.t.bind(n,59230,19)),"~blog/updates/cardano-updates-tags-crypto-page-3-740.json",59230],ae7f7c70:[()=>n.e(56789).then(n.t.bind(n,97303,19)),"~blog/updates/cardano-updates-tags-crypto-page-4-d7d-list.json",97303],afa83c07:[()=>n.e(68115).then(n.bind(n,27614)),"@site/blog/2023-07-31-network.md?truncated=true",27614],b020ac17:[()=>n.e(33538).then(n.t.bind(n,88564,19)),"~blog/updates/cardano-updates-page-22-cfc.json",88564],b032e7ab:[()=>n.e(292).then(n.bind(n,32167)),"@site/blog/2023-07-27-mithril.md?truncated=true",32167],b03d4a4e:[()=>n.e(52834).then(n.bind(n,44301)),"@site/blog/2022-11-11-ledger.md",44301],b073a55d:[()=>n.e(20955).then(n.bind(n,7729)),"@site/quarterly/2023-Q3-performance-and-tracing.md",7729],b073edd1:[()=>n.e(70613).then(n.t.bind(n,85795,19)),"~blog/updates/cardano-updates-tags-mithril-page-7-afd-list.json",85795],b13803f3:[()=>n.e(96558).then(n.t.bind(n,47768,19)),"~blog/updates/cardano-updates-tags-hydra-page-7-81d-list.json",47768],b242687d:[()=>n.e(22191).then(n.bind(n,95807)),"@site/blog/2023-09-29-sre.md?truncated=true",95807],b28a1077:[()=>n.e(7413).then(n.bind(n,49384)),"@site/blog/2023-05-17-performance-and-tracing.md",49384],b3041b60:[()=>n.e(35889).then(n.bind(n,2592)),"@site/blog/2023-05-05-ledger.md?truncated=true",2592],b3043f02:[()=>n.e(27478).then(n.bind(n,59290)),"@site/blog/2023-10-04-consensus.md?truncated=true",59290],b41783a8:[()=>n.e(89104).then(n.t.bind(n,861,19)),"~blog/updates/cardano-updates-tags-goedel-5b9-list.json",861],b4645a09:[()=>n.e(24910).then(n.t.bind(n,14950,19)),"~blog/updates/cardano-updates-f9b.json",14950],b4cc2dd2:[()=>n.e(70635).then(n.bind(n,52945)),"@site/blog/2023-03-03-hydra.md",52945],b4f5b98b:[()=>n.e(78461).then(n.bind(n,18983)),"@site/blog/2023-08-01-node-cli-api.md?truncated=true",18983],b512dd46:[()=>n.e(47093).then(n.bind(n,5136)),"@site/blog/2022-11-11-network.md?truncated=true",5136],b5164349:[()=>n.e(40176).then(n.bind(n,3644)),"@site/blog/2023-03-22-performance-and-tracing.md",3644],b57687d8:[()=>n.e(24651).then(n.bind(n,17503)),"@site/blog/2023-05-31-consensus.md?truncated=true",17503],b6145ff0:[()=>n.e(71843).then(n.t.bind(n,61785,19)),"~blog/updates/cardano-updates-page-59-25a.json",61785],b65e5ec2:[()=>n.e(15715).then(n.bind(n,79198)),"@site/blog/2023-09-07-performance-and-tracing.md?truncated=true",79198],b6ef4fcb:[()=>n.e(53516).then(n.bind(n,33340)),"@site/blog/2022-12-16-hydra.md?truncated=true",33340],b78698d9:[()=>n.e(33288).then(n.bind(n,52949)),"@site/blog/2023-01-25-node-cli-api.md",52949],b7dd63dc:[()=>n.e(11400).then(n.bind(n,51146)),"@site/blog/2023-11-10-hydra.md?truncated=true",51146],b8465b4d:[()=>n.e(74933).then(n.t.bind(n,42005,19)),"~blog/updates/cardano-updates-page-37-232.json",42005],b88c8fa9:[()=>n.e(42190).then(n.bind(n,22750)),"@site/blog/2022-12-14-node-cli-api.md",22750],b8a3fbda:[()=>n.e(7741).then(n.bind(n,68986)),"@site/blog/2023-09-29-goedel.md",68986],b8bcf1d1:[()=>n.e(73277).then(n.bind(n,98981)),"@site/blog/2023-02-03-crypto.md?truncated=true",98981],b92c36fd:[()=>n.e(52322).then(n.bind(n,84846)),"@site/blog/2022-10-28-hydra.md?truncated=true",84846],b96b3223:[()=>n.e(77411).then(n.t.bind(n,39478,19)),"~blog/updates/cardano-updates-tags-crypto-page-3-740-list.json",39478],b9d87023:[()=>n.e(95850).then(n.t.bind(n,95586,19)),"~blog/updates/cardano-updates-tags-goedel-page-4-a08-list.json",95586],ba0b6dbd:[()=>Promise.all([n.e(51068),n.e(30126)]).then(n.bind(n,50065)),"@site/blog/2022-08-12-network.md?truncated=true",50065],baed1590:[()=>n.e(12812).then(n.t.bind(n,44187,19)),"~blog/updates/cardano-updates-tags-ledger-page-4-98a.json",44187],bb44f9e3:[()=>n.e(45943).then(n.bind(n,90805)),"@site/blog/2023-09-07-mithril.md?truncated=true",90805],bb465a37:[()=>n.e(6246).then(n.bind(n,12332)),"@site/blog/2023-01-13-release.md",12332],bbc31819:[()=>n.e(67330).then(n.t.bind(n,21765,19)),"~blog/quarterly/cardano-updates-quarterly-tags-cli-api-quarterly-1f5.json",21765],bbe7c3bd:[()=>n.e(24379).then(n.t.bind(n,38715,19)),"~blog/updates/cardano-updates-tags-mithril-page-5-446.json",38715],bc6b65d9:[()=>n.e(40160).then(n.bind(n,45335)),"@site/blog/2023-03-02-network.md",45335],bccb35b7:[()=>n.e(94759).then(n.bind(n,19604)),"@site/blog/2023-05-26-network.md?truncated=true",19604],bcf46d9c:[()=>n.e(31617).then(n.bind(n,48880)),"@site/blog/2023-01-20-hydra.md",48880],bd65afd9:[()=>n.e(36160).then(n.bind(n,25362)),"@site/blog/2023-07-12-performance-and-tracing.md",25362],bda3e1c7:[()=>n.e(27335).then(n.bind(n,19203)),"@site/blog/2023-02-08-node-cli-api.md?truncated=true",19203],bdc4c1ed:[()=>n.e(76581).then(n.bind(n,29598)),"@site/blog/2023-06-09-hydra.md?truncated=true",29598],be16a434:[()=>n.e(83247).then(n.bind(n,85869)),"@site/blog/2023-08-24-performance-and-tracing.md",85869],be1e6782:[()=>n.e(25469).then(n.bind(n,12306)),"@site/quarterly/2023-Q2-network.md",12306],be26e761:[()=>n.e(86095).then(n.t.bind(n,20510,19)),"~blog/updates/cardano-updates-page-38-3c2.json",20510],be32a6ec:[()=>n.e(15224).then(n.t.bind(n,27775,19)),"~blog/updates/cardano-updates-tags-hydra-page-9-033.json",27775],bf071e0b:[()=>n.e(67787).then(n.t.bind(n,36898,19)),"~blog/updates/cardano-updates-page-40-5e8.json",36898],c0354ce6:[()=>n.e(36881).then(n.bind(n,50633)),"@site/blog/2023-11-24-hydra.md",50633],c036f08e:[()=>n.e(40309).then(n.bind(n,52303)),"@site/blog/2023-06-23-sre.md?truncated=true",52303],c061e3b1:[()=>n.e(64614).then(n.bind(n,99797)),"@site/blog/2023-03-09-mithril.md?truncated=true",99797],c063df1b:[()=>n.e(21562).then(n.bind(n,7314)),"@site/blog/2023-03-03-crypto.md",7314],c08c0f47:[()=>n.e(64562).then(n.bind(n,63876)),"@site/blog/2023-06-14-consensus.md",63876],c091c5d8:[()=>n.e(39596).then(n.t.bind(n,414,19)),"~blog/updates/cardano-updates-tags-devx-3a5-list.json",414],c0ac1524:[()=>n.e(89752).then(n.bind(n,58905)),"@site/blog/2023-08-04-goedel.md",58905],c0cf6239:[()=>n.e(53482).then(n.bind(n,29025)),"@site/quarterly/2023-01-13-network.md?truncated=true",29025],c10365f3:[()=>n.e(7783).then(n.bind(n,3827)),"@site/blog/2023-04-20-mithril.md?truncated=true",3827],c178b56c:[()=>n.e(92255).then(n.bind(n,80883)),"@site/blog/2023-09-01-network.md",80883],c1c5c6f5:[()=>n.e(95569).then(n.t.bind(n,9564,19)),"/home/runner/work/cardano-updates/cardano-updates/.docusaurus/docusaurus-plugin-content-blog/quarterly/plugin-route-context-module-100.json",9564],c2b4dd94:[()=>n.e(43020).then(n.bind(n,79021)),"@site/blog/2023-07-12-performance-and-tracing.md?truncated=true",79021],c2eec07f:[()=>n.e(35388).then(n.bind(n,6988)),"@site/blog/2023-07-04-node-cli-api.md?truncated=true",6988],c315164d:[()=>n.e(43194).then(n.bind(n,64268)),"@site/blog/2023-01-12-mithril.md?truncated=true",64268],c4479859:[()=>n.e(73321).then(n.bind(n,92606)),"@site/blog/2023-06-07-node-cli-api.md",92606],c511c40f:[()=>n.e(94922).then(n.bind(n,63417)),"@site/blog/2023-05-17-consensus.md",63417],c5858ebd:[()=>n.e(95199).then(n.bind(n,16011)),"@site/quarterly/2023-04-03-ledger.md",16011],c60581f2:[()=>n.e(97094).then(n.bind(n,84718)),"@site/blog/2023-02-08-consensus.md?truncated=true",84718],c6259fbb:[()=>n.e(2506).then(n.t.bind(n,63415,19)),"~blog/updates/cardano-updates-tags-hydra-page-8-f0c-list.json",63415],c63933b3:[()=>n.e(11727).then(n.bind(n,27502)),"@site/blog/2023-03-22-consensus.md",27502],c6ae40c2:[()=>n.e(17693).then(n.bind(n,68680)),"@site/blog/2023-01-20-sre.md?truncated=true",68680],c6f90b29:[()=>n.e(39080).then(n.bind(n,9762)),"@site/blog/2023-06-07-node-cli-api.md?truncated=true",9762],c7337d4e:[()=>n.e(91151).then(n.bind(n,82469)),"@site/quarterly/2023-04-25-consensus.md",82469],c7e43a05:[()=>n.e(65956).then(n.bind(n,75265)),"@site/blog/2023-10-25-mithril.md?truncated=true",75265],c831575d:[()=>n.e(42677).then(n.bind(n,20519)),"@site/blog/2023-02-21-db-sync.md?truncated=true",20519],c90fb258:[()=>n.e(26584).then(n.bind(n,44389)),"@site/blog/2023-06-08-db-sync.md",44389],c9210b26:[()=>n.e(97959).then(n.bind(n,31535)),"@site/blog/2023-05-04-mithril.md?truncated=true",31535],c94f306d:[()=>n.e(98727).then(n.t.bind(n,29127,19)),"~blog/updates/cardano-updates-tags-hydra-page-3-3da.json",29127],ca3b5bc8:[()=>n.e(96140).then(n.bind(n,92861)),"@site/blog/2023-08-09-consensus.md?truncated=true",92861],ca6829cb:[()=>n.e(41153).then(n.bind(n,14193)),"@site/blog/2023-10-20-hydra.md",14193],caab1e2e:[()=>n.e(93570).then(n.bind(n,74145)),"@site/blog/2023-07-20-goedel.md?truncated=true",74145],cb7a1a0b:[()=>n.e(90934).then(n.bind(n,62094)),"@site/blog/2023-11-16-network.md?truncated=true",62094],cc267639:[()=>n.e(81214).then(n.bind(n,27582)),"@site/blog/2023-01-13-system-test.md",27582],cc30e037:[()=>n.e(31421).then(n.t.bind(n,9353,19)),"~blog/updates/cardano-updates-tags-hydra-18a.json",9353],cc5c2602:[()=>n.e(78761).then(n.bind(n,54230)),"@site/quarterly/2023-01-13-network.md",54230],ccb7a847:[()=>n.e(22469).then(n.bind(n,17352)),"@site/blog/2023-11-01-consensus.md",17352],ccc49370:[()=>Promise.all([n.e(40532),n.e(80210),n.e(2529),n.e(46103)]).then(n.bind(n,65203)),"@theme/BlogPostPage",65203],cced6026:[()=>n.e(48818).then(n.bind(n,52869)),"@site/quarterly/2022-11-07-nod-api-cli.md?truncated=true",52869],ccf451f9:[()=>n.e(5237).then(n.bind(n,81451)),"@site/blog/2023-10-20-hydra.md?truncated=true",81451],ccfc9222:[()=>n.e(87233).then(n.bind(n,86986)),"@site/blog/2023-03-22-node-cli-api.md?truncated=true",86986],cd0ded60:[()=>n.e(27668).then(n.bind(n,72238)),"@site/blog/2023-06-30-hydra.md",72238],cd612773:[()=>n.e(67205).then(n.bind(n,26169)),"@site/blog/2023-05-12-crypto.md",26169],ce17d78b:[()=>n.e(77533).then(n.bind(n,9586)),"@site/quarterly/2023-Q2-sre.md",9586],ce6dcc9e:[()=>n.e(77644).then(n.bind(n,56737)),"@site/blog/2022-09-19-db-sync.md?truncated=true",56737],ce7ed51f:[()=>n.e(30830).then(n.bind(n,71367)),"@site/blog/2023-04-14-hydra.md",71367],cf1bc381:[()=>n.e(84773).then(n.bind(n,77907)),"@site/blog/2023-06-14-performance-and-tracing.md?truncated=true",77907],cfb82551:[()=>n.e(6036).then(n.t.bind(n,85146,19)),"~blog/updates/cardano-updates-tags-hydra-page-4-6e8.json",85146],cfdb38ee:[()=>n.e(59736).then(n.t.bind(n,91779,19)),"~blog/updates/cardano-updates-page-24-2e6.json",91779],d0639dee:[()=>n.e(52506).then(n.bind(n,84505)),"@site/blog/2023-11-29-consensus.md?truncated=true",84505],d077dadd:[()=>n.e(88862).then(n.bind(n,4491)),"@site/blog/2023-06-28-consensus.md?truncated=true",4491],d0a351c0:[()=>n.e(51934).then(n.t.bind(n,298,19)),"~blog/updates/cardano-updates-tags-ledger-page-3-db1-list.json",298],d0e182b9:[()=>n.e(32627).then(n.bind(n,81065)),"@site/blog/2023-06-29-mithril.md?truncated=true",81065],d10ad4a6:[()=>n.e(6166).then(n.t.bind(n,9785,19)),"~blog/updates/cardano-updates-page-30-538.json",9785],d124c703:[()=>n.e(15152).then(n.bind(n,54219)),"@site/blog/2022-11-04-open-source.md?truncated=true",54219],d15a0787:[()=>n.e(89548).then(n.bind(n,20257)),"@site/blog/2023-09-29-hydra.md",20257],d19a344f:[()=>n.e(20387).then(n.bind(n,3568)),"@site/blog/2023-04-14-goedel.md",3568],d1d47ba3:[()=>n.e(65319).then(n.t.bind(n,62205,19)),"~blog/updates/cardano-updates-page-11-5be.json",62205],d200e7a4:[()=>n.e(20738).then(n.t.bind(n,32771,19)),"~blog/updates/cardano-updates-page-41-b80.json",32771],d2ab2776:[()=>n.e(16360).then(n.bind(n,40090)),"@site/blog/2023-06-08-goedel.md",40090],d2aca35e:[()=>n.e(13412).then(n.bind(n,62337)),"@site/blog/2023-10-06-hydra.md",62337],d2ea5af2:[()=>n.e(91984).then(n.bind(n,15042)),"@site/blog/2023-04-21-ledger.md",15042],d343e3e1:[()=>n.e(8033).then(n.bind(n,26796)),"@site/blog/2023-09-15-hydra.md?truncated=true",26796],d3a595c1:[()=>n.e(1537).then(n.bind(n,698)),"@site/blog/2022-10-19-node-cli-api.md?truncated=true",698],d3f3f546:[()=>n.e(13764).then(n.bind(n,54994)),"@site/blog/2022-11-25-crypto.md",54994],d442e1d8:[()=>n.e(9821).then(n.t.bind(n,8678,19)),"~blog/updates/cardano-updates-page-57-bbf.json",8678],d5676bf9:[()=>n.e(3270).then(n.bind(n,82850)),"@site/blog/2023-07-07-hydra.md",82850],d5cc3122:[()=>n.e(28669).then(n.bind(n,3047)),"@site/blog/2023-06-08-db-sync.md?truncated=true",3047],d5f27176:[()=>n.e(95558).then(n.bind(n,45623)),"@site/blog/2023-10-10-node-cli-api.md?truncated=true",45623],d65b9dd2:[()=>n.e(93108).then(n.bind(n,59513)),"@site/blog/2023-10-27-network.md",59513],d6a3b4a5:[()=>n.e(30482).then(n.bind(n,19301)),"@site/blog/2023-07-31-network.md",19301],d6a93ba7:[()=>n.e(31349).then(n.bind(n,61256)),"@site/blog/2022-12-01-system-test.md?truncated=true",61256],d6b66cf4:[()=>n.e(95516).then(n.t.bind(n,1673,19)),"~blog/updates/blog-post-list-prop-updates.json",1673],d6c09ac2:[()=>n.e(22393).then(n.bind(n,98294)),"@site/blog/2023-07-21-hydra.md?truncated=true",98294],d6f20405:[()=>n.e(23599).then(n.bind(n,73363)),"@site/blog/2023-09-01-hydra.md",73363],d70b4c5f:[()=>n.e(71870).then(n.bind(n,39446)),"@site/blog/2023-10-06-performance-and-tracing.md?truncated=true",39446],d7836792:[()=>n.e(42126).then(n.bind(n,82217)),"@site/blog/2023-08-25-hydra.md?truncated=true",82217],d7899fea:[()=>n.e(17285).then(n.bind(n,59997)),"@site/blog/2022-11-11-crypto.md?truncated=true",59997],d79a4bb7:[()=>n.e(90206).then(n.bind(n,25790)),"@site/blog/2022-11-25-hydra.md?truncated=true",25790],d7c69167:[()=>n.e(24288).then(n.bind(n,15983)),"@site/blog/2023-09-29-goedel.md?truncated=true",15983],d7d2f3e9:[()=>n.e(97363).then(n.t.bind(n,93901,19)),"~blog/quarterly/cardano-updates-quarterly-tags-cli-api-quarterly-1f5-list.json",93901],d83d9042:[()=>n.e(8580).then(n.bind(n,42611)),"@site/blog/2023-05-12-hydra.md",42611],d857251e:[()=>n.e(75698).then(n.bind(n,14394)),"@site/blog/2023-05-24-node-cli-api.md",14394],d863ede2:[()=>n.e(45766).then(n.bind(n,48709)),"@site/blog/2023-02-22-consensus.md?truncated=true",48709],d8668f0c:[()=>n.e(1821).then(n.bind(n,94658)),"@site/blog/2023-03-23-db-sync.md",94658],d8c4fe87:[()=>n.e(24671).then(n.bind(n,48221)),"@site/blog/2023-09-06-consensus.md",48221],d92df848:[()=>n.e(2578).then(n.bind(n,61895)),"@site/blog/2023-01-12-mithril.md",61895],d957ac34:[()=>n.e(57772).then(n.bind(n,66001)),"@site/blog/2023-03-24-hydra.md",66001],d967308c:[()=>n.e(20957).then(n.bind(n,12811)),"@site/blog/2023-10-18-mithril.md",12811],d96cfa54:[()=>n.e(16171).then(n.bind(n,21351)),"@site/blog/2023-05-03-performance-and-tracing.md?truncated=true",21351],d988d084:[()=>n.e(85138).then(n.bind(n,56663)),"@site/blog/2023-06-28-performance-and-tracing.md",56663],d99d594e:[()=>n.e(46521).then(n.bind(n,43933)),"@site/blog/2023-02-23-performance-and-tracing.md?truncated=true",43933],d9b708eb:[()=>n.e(67463).then(n.bind(n,49915)),"@site/blog/2023-04-20-node-cli-api.md?truncated=true",49915],d9ccb35d:[()=>n.e(3136).then(n.bind(n,62438)),"@site/blog/2023-03-21-network.md?truncated=true",62438],d9e42018:[()=>n.e(70170).then(n.t.bind(n,65246,19)),"~blog/updates/cardano-updates-tags-cli-api-page-4-e6c-list.json",65246],da04b7b0:[()=>n.e(78101).then(n.bind(n,12804)),"@site/blog/2023-08-15-node-cli-api.md?truncated=true",12804],da7937f0:[()=>n.e(62083).then(n.bind(n,52445)),"@site/blog/2022-10-05-consensus.md",52445],daa3e20a:[()=>n.e(29177).then(n.bind(n,34169)),"@site/blog/2023-03-27-system-test.md",34169],daace409:[()=>Promise.all([n.e(51068),n.e(89008)]).then(n.bind(n,23947)),"@site/blog/2022-09-27-network.md",23947],db138d7c:[()=>n.e(18634).then(n.bind(n,78238)),"@site/quarterly/2023-01-18-consensus.md",78238],db50202c:[()=>n.e(63566).then(n.bind(n,99900)),"@site/blog/2023-05-26-goedel.md?truncated=true",99900],db5663d1:[()=>n.e(14348).then(n.t.bind(n,45422,19)),"~blog/updates/cardano-updates-tags-network-page-2-514.json",45422],dceb6e64:[()=>n.e(18242).then(n.bind(n,22300)),"@site/quarterly/2022-11-15-consensus.md?truncated=true",22300],ddcb8bff:[()=>n.e(54642).then(n.bind(n,15811)),"@site/blog/2023-11-22-mithril.md?truncated=true",15811],ddce0bff:[()=>n.e(31005).then(n.bind(n,59319)),"@site/blog/2023-07-21-sre.md",59319],de5b481b:[()=>n.e(72317).then(n.t.bind(n,12630,19)),"~blog/quarterly/cardano-updates-quarterly-tags-open-source-e7c.json",12630],de790939:[()=>n.e(42185).then(n.bind(n,99073)),"@site/blog/2023-04-21-ledger.md?truncated=true",99073],decc8fa8:[()=>n.e(57918).then(n.bind(n,43654)),"@site/blog/2023-12-01-hydra.md",43654],dee5d2d9:[()=>n.e(52560).then(n.bind(n,46159)),"@site/blog/2023-08-18-network.md",46159],df778edc:[()=>n.e(79036).then(n.bind(n,65687)),"@site/blog/2023-04-28-network.md",65687],dfd49ee8:[()=>n.e(60247).then(n.bind(n,72396)),"@site/blog/2022-10-28-performance-and-tracing.md",72396],dff1c289:[()=>n.e(3792).then(n.bind(n,30089)),"@site/docs/tutorial-extras/manage-docs-versions.md",30089],dff84d74:[()=>n.e(65421).then(n.bind(n,812)),"@site/blog/2022-11-04-mithril.md",812],e06746c7:[()=>n.e(64410).then(n.t.bind(n,81981,19)),"~blog/updates/cardano-updates-tags-consensus-page-2-fa9-list.json",81981],e0a90ddc:[()=>n.e(24891).then(n.t.bind(n,44348,19)),"~blog/updates/cardano-updates-tags-consensus-330-list.json",44348],e0b45b46:[()=>n.e(55135).then(n.bind(n,23826)),"@site/blog/2023-09-12-node-cli-api.md",23826],e135bd86:[()=>n.e(69791).then(n.bind(n,96223)),"@site/blog/2022-11-30-consensus.md?truncated=true",96223],e158fd47:[()=>n.e(88829).then(n.bind(n,64964)),"@site/blog/2023-03-31-goedel.md?truncated=true",64964],e1f21c3f:[()=>n.e(58680).then(n.bind(n,32235)),"@site/blog/2023-11-14-node-cli-api.md",32235],e2011657:[()=>n.e(30849).then(n.bind(n,51505)),"@site/blog/2023-03-17-hydra.md?truncated=true",51505],e25ae581:[()=>n.e(1929).then(n.bind(n,4890)),"@site/blog/2023-06-23-hydra.md",4890],e2a7c340:[()=>n.e(48622).then(n.bind(n,36391)),"@site/blog/2023-01-13-hydra.md?truncated=true",36391],e2c8baed:[()=>n.e(36721).then(n.t.bind(n,80615,19)),"~blog/updates/cardano-updates-tags-crypto-page-2-57e.json",80615],e3067ecd:[()=>n.e(84599).then(n.bind(n,11113)),"@site/blog/2023-09-22-hydra.md?truncated=true",11113],e356bfd0:[()=>n.e(90083).then(n.bind(n,96391)),"@site/blog/2022-10-27-crypto.md?truncated=true",96391],e38c8545:[()=>n.e(51092).then(n.t.bind(n,50047,19)),"~blog/updates/cardano-updates-tags-system-test-b49.json",50047],e3c3ef1c:[()=>n.e(9107).then(n.bind(n,4394)),"@site/blog/2022-11-04-hydra.md",4394],e406e44d:[()=>n.e(23531).then(n.t.bind(n,30099,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-4-7d2.json",30099],e44a2883:[()=>n.e(96755).then(n.bind(n,80740)),"@site/docs/tutorial-extras/translate-your-site.md",80740],e4619b9c:[()=>n.e(56482).then(n.bind(n,70761)),"@site/blog/2023-07-06-developer-experience.md?truncated=true",70761],e4a61baa:[()=>n.e(53121).then(n.bind(n,32288)),"@site/blog/2023-05-26-ledger.md",32288],e54fb861:[()=>n.e(89248).then(n.t.bind(n,35997,19)),"~blog/updates/cardano-updates-tags-hydra-page-9-033-list.json",35997],e56a9a29:[()=>n.e(43412).then(n.bind(n,43937)),"@site/blog/2023-08-24-performance-and-tracing.md?truncated=true",43937],e57d1f62:[()=>n.e(79362).then(n.t.bind(n,29042,19)),"~blog/updates/cardano-updates-tags-consensus-page-7-7b5.json",29042],e5a8e689:[()=>n.e(25946).then(n.t.bind(n,88019,19)),"~blog/updates/cardano-updates-page-16-842.json",88019],e5b737ed:[()=>n.e(54750).then(n.t.bind(n,1879,19)),"~blog/updates/cardano-updates-tags-system-test-b49-list.json",1879],e5dd9161:[()=>n.e(37329).then(n.bind(n,16036)),"@site/blog/2023-02-24-hydra.md",16036],e6402687:[()=>n.e(93524).then(n.bind(n,26879)),"@site/blog/2022-11-28-network.md",26879],e695f231:[()=>n.e(26540).then(n.t.bind(n,9562,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-3-d14-list.json",9562],e6ea9b03:[()=>n.e(88869).then(n.bind(n,53187)),"@site/blog/2023-03-31-crypto.md",53187],e70f68c6:[()=>n.e(72815).then(n.bind(n,80684)),"@site/blog/2023-03-16-goedel.md",80684],e716e5b6:[()=>n.e(94379).then(n.bind(n,13179)),"@site/quarterly/2023-Q3-sre.md?truncated=true",13179],e7486169:[()=>n.e(45237).then(n.bind(n,74349)),"@site/quarterly/2022-11-09-network.md",74349],e7a72da0:[()=>n.e(46846).then(n.bind(n,66876)),"@site/blog/2023-04-19-performance-and-tracing.md",66876],e80f56fd:[()=>n.e(73336).then(n.bind(n,78673)),"@site/blog/2023-04-14-hydra.md?truncated=true",78673],e84709f6:[()=>n.e(46033).then(n.t.bind(n,90005,19)),"~blog/updates/cardano-updates-tags-hydra-page-11-1e1.json",90005],e86dcd26:[()=>n.e(162).then(n.t.bind(n,12200,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-5-215.json",12200],e8d4d6c0:[()=>n.e(52818).then(n.bind(n,32340)),"@site/blog/2023-02-17-network.md",32340],e8f5afda:[()=>n.e(25540).then(n.t.bind(n,8990,19)),"~blog/updates/cardano-updates-tags-ledger-page-2-c49.json",8990],e90b2ff0:[()=>n.e(96840).then(n.bind(n,99480)),"@site/blog/2023-07-13-mithril.md?truncated=true",99480],e9310706:[()=>n.e(43363).then(n.t.bind(n,90133,19)),"~blog/updates/cardano-updates-tags-performance-tracing-page-2-43f-list.json",90133],ea2603ff:[()=>n.e(86326).then(n.bind(n,28380)),"@site/blog/2023-11-08-ledger.md?truncated=true",28380],ea5726b6:[()=>n.e(35846).then(n.t.bind(n,88675,19)),"~blog/updates/cardano-updates-tags-cip-1694-380.json",88675],ea7f8016:[()=>n.e(67820).then(n.t.bind(n,35602,19)),"~blog/updates/cardano-updates-tags-consensus-page-4-6d0-list.json",35602],ea84a009:[()=>n.e(92501).then(n.bind(n,602)),"@site/blog/2023-03-03-crypto.md?truncated=true",602],eab6de32:[()=>n.e(7891).then(n.t.bind(n,80771,19)),"~blog/updates/cardano-updates-tags-consensus-page-6-107-list.json",80771],eac6bb0a:[()=>n.e(87445).then(n.bind(n,97940)),"@site/blog/2022-11-16-node-cli-api.md",97940],eac9cf07:[()=>n.e(59037).then(n.t.bind(n,89207,19)),"~blog/quarterly/cardano-updates-quarterly-tags-sre-aa0.json",89207],eb0e2fb1:[()=>n.e(80622).then(n.bind(n,19040)),"@site/blog/2023-08-17-crypto.md",19040],ebf8adea:[()=>n.e(54669).then(n.bind(n,45668)),"@site/blog/2023-05-17-mithril.md?truncated=true",45668],ec06fa8a:[()=>n.e(46271).then(n.bind(n,1091)),"@site/blog/2023-10-10-node-cli-api.md",1091],ec344652:[()=>n.e(68580).then(n.bind(n,13231)),"@site/blog/2023-07-07-crypto.md",13231],ec53298b:[()=>n.e(21129).then(n.bind(n,94656)),"@site/blog/2023-04-05-performance-and-tracing.md?truncated=true",94656],ed730a1d:[()=>n.e(61137).then(n.t.bind(n,87638,19)),"~blog/updates/cardano-updates-tags-consensus-page-5-ec6-list.json",87638],ed930750:[()=>n.e(23318).then(n.bind(n,64185)),"@site/blog/2023-05-03-consensus.md?truncated=true",64185],ed99d55f:[()=>n.e(65318).then(n.bind(n,73437)),"@site/blog/2023-10-27-hydra.md?truncated=true",73437],eda7cf83:[()=>n.e(48423).then(n.bind(n,10725)),"@site/blog/2023-02-10-hydra.md?truncated=true",10725],edca0251:[()=>n.e(39066).then(n.bind(n,22704)),"@site/blog/2023-02-08-performance-and-tracing.md?truncated=true",22704],ee0b7a59:[()=>n.e(26544).then(n.bind(n,1679)),"@site/blog/2023-07-26-consensus.md?truncated=true",1679],ee94a44f:[()=>n.e(56815).then(n.bind(n,6855)),"@site/blog/2022-12-15-mithril.md",6855],ef2b1d07:[()=>n.e(70729).then(n.t.bind(n,91102,19)),"~blog/updates/cardano-updates-tags-hydra-page-3-3da-list.json",91102],ef2b6a3f:[()=>n.e(1338).then(n.bind(n,50818)),"@site/blog/2022-12-14-db-sync.md?truncated=true",50818],ef4801f7:[()=>n.e(75394).then(n.bind(n,45443)),"@site/blog/2023-02-08-performance-and-tracing.md",45443],ef4f60e7:[()=>n.e(55531).then(n.bind(n,86601)),"@site/blog/2023-04-14-goedel.md?truncated=true",86601],efad53df:[()=>n.e(53426).then(n.t.bind(n,84260,19)),"~blog/updates/cardano-updates-tags-cli-api-page-3-7d2-list.json",84260],eff08811:[()=>n.e(95816).then(n.bind(n,72837)),"@site/blog/2023-02-03-hydra.md",72837],f0418a99:[()=>n.e(73799).then(n.bind(n,25770)),"@site/blog/2023-11-16-network.md",25770],f117ec90:[()=>n.e(51522).then(n.bind(n,64385)),"@site/blog/2023-09-08-hydra.md",64385],f13a89c7:[()=>n.e(86582).then(n.t.bind(n,17825,19)),"~blog/updates/cardano-updates-tags-sre-page-2-3cd-list.json",17825],f1bfc30d:[()=>n.e(35877).then(n.bind(n,30394)),"@site/blog/2023-10-11-mithril.md",30394],f1df5007:[()=>n.e(53288).then(n.bind(n,80999)),"@site/blog/2023-08-28-mithril.md",80999],f210b4b5:[()=>n.e(24745).then(n.bind(n,68831)),"@site/blog/2022-12-01-db-sync.md?truncated=true",68831],f2180c0a:[()=>n.e(17433).then(n.bind(n,9304)),"@site/blog/2023-05-05-ledger.md",9304],f2423430:[()=>n.e(1321).then(n.bind(n,28149)),"@site/blog/2023-03-22-performance-and-tracing.md?truncated=true",28149],f2b32cff:[()=>n.e(58566).then(n.bind(n,59485)),"@site/blog/2023-02-17-ledger.md",59485],f2deb2f1:[()=>n.e(82164).then(n.bind(n,80599)),"@site/blog/2023-11-10-sre.md",80599],f302e248:[()=>n.e(83214).then(n.bind(n,31079)),"@site/blog/2023-02-22-node-cli-api.md?truncated=true",31079],f3c06362:[()=>n.e(34985).then(n.bind(n,22460)),"@site/quarterly/2023-Q2-consensus.md",22460],f452efc5:[()=>n.e(44281).then(n.bind(n,89556)),"@site/blog/2023-07-07-goedel.md",89556],f4548430:[()=>n.e(93789).then(n.bind(n,84374)),"@site/blog/2023-09-27-mithril.md",84374],f47d214c:[()=>n.e(55791).then(n.t.bind(n,52078,19)),"~blog/updates/cardano-updates-tags-cip-1694-380-list.json",52078],f48535bf:[()=>n.e(45821).then(n.bind(n,99684)),"@site/blog/2023-06-16-hydra.md?truncated=true",99684],f4cb7e87:[()=>n.e(70085).then(n.t.bind(n,76777,19)),"~blog/updates/cardano-updates-tags-mithril-page-2-0fe-list.json",76777],f51bb76d:[()=>n.e(12626).then(n.bind(n,21772)),"@site/blog/2023-03-08-performance-and-tracing.md",21772],f522921c:[()=>n.e(75556).then(n.bind(n,55660)),"@site/blog/2023-06-02-hydra.md",55660],f530b85c:[()=>n.e(49605).then(n.bind(n,35118)),"@site/blog/2023-04-05-node-cli-api.md",35118],f55d3e7a:[()=>n.e(54193).then(n.bind(n,78030)),"@site/docs/tutorial-basics/deploy-your-site.md",78030],f59c978c:[()=>n.e(46545).then(n.bind(n,22053)),"@site/blog/2022-11-30-consensus.md",22053],f5a24224:[()=>n.e(71844).then(n.bind(n,66255)),"@site/blog/2022-10-14-ledger.md?truncated=true",66255],f5b1250e:[()=>n.e(1129).then(n.bind(n,25013)),"@site/blog/2023-08-04-hydra.md?truncated=true",25013],f5d27437:[()=>n.e(85351).then(n.t.bind(n,71522,19)),"~blog/updates/cardano-updates-page-51-e72.json",71522],f5e5d1cf:[()=>n.e(51410).then(n.bind(n,45256)),"@site/blog/2022-11-18-mithril.md?truncated=true",45256],f5f103cc:[()=>n.e(67170).then(n.t.bind(n,53162,19)),"~blog/updates/cardano-updates-page-5-d4c.json",53162],f63b6b72:[()=>n.e(87389).then(n.bind(n,36793)),"@site/blog/2023-07-21-ledger.md",36793],f6a3ab66:[()=>n.e(12634).then(n.t.bind(n,2832,19)),"~blog/updates/cardano-updates-tags-mithril-page-7-afd.json",2832],f6aa5556:[()=>n.e(376).then(n.bind(n,86936)),"@site/blog/2022-12-09-ledger.md?truncated=true",86936],f6b8faad:[()=>n.e(83584).then(n.t.bind(n,28460,19)),"~blog/updates/cardano-updates-page-35-d30.json",28460],f6ec1152:[()=>n.e(11254).then(n.bind(n,53954)),"@site/blog/2023-10-13-ledger.md?truncated=true",53954],f7e5e70a:[()=>n.e(48909).then(n.bind(n,78370)),"@site/blog/2023-11-01-mithril.md?truncated=true",78370],f850a5f3:[()=>n.e(25403).then(n.bind(n,23498)),"@site/blog/2023-01-20-network.md",23498],f8681695:[()=>n.e(32464).then(n.bind(n,67885)),"@site/blog/2023-06-15-mithril.md?truncated=true",67885],f872275a:[()=>n.e(46922).then(n.bind(n,87739)),"@site/blog/2023-03-08-consensus.md?truncated=true",87739],f89a4337:[()=>n.e(25189).then(n.bind(n,54416)),"@site/blog/2023-09-26-node-cli-api.md",54416],f96c80d6:[()=>n.e(90288).then(n.bind(n,75947)),"@site/blog/2023-12-04-performance-and-tracing.md",75947],f96c80dc:[()=>n.e(70641).then(n.bind(n,9022)),"@site/blog/2023-09-01-hydra.md?truncated=true",9022],fa00d705:[()=>n.e(26710).then(n.bind(n,94828)),"@site/blog/2023-11-24-sre.md?truncated=true",94828],fa0b1b5d:[()=>n.e(90056).then(n.bind(n,62140)),"@site/blog/2023-05-12-goedel.md?truncated=true",62140],fa57bfdd:[()=>n.e(92149).then(n.t.bind(n,64665,19)),"~blog/updates/cardano-updates-tags-network-5a5.json",64665],fa5dce7e:[()=>n.e(73001).then(n.bind(n,20486)),"@site/blog/2023-08-18-goedel.md",20486],faece773:[()=>n.e(32023).then(n.bind(n,58910)),"@site/blog/2023-02-03-hydra.md?truncated=true",58910],fb0b9e22:[()=>n.e(92522).then(n.bind(n,20214)),"@site/blog/2023-06-23-hydra.md?truncated=true",20214],fb63aa20:[()=>n.e(58470).then(n.bind(n,62389)),"@site/blog/2022-12-14-performance-and-tracing.md",62389],fb793160:[()=>n.e(87411).then(n.bind(n,48089)),"@site/blog/2023-02-08-consensus.md",48089],fb8d4667:[()=>n.e(57161).then(n.bind(n,31241)),"@site/blog/2022-10-28-network.md?truncated=true",31241],fba052bd:[()=>n.e(36171).then(n.bind(n,54664)),"@site/blog/2022-11-02-consensus.md",54664],fbdc54bf:[()=>n.e(63824).then(n.bind(n,40671)),"@site/blog/2023-06-02-hydra.md?truncated=true",40671],fc0eac3b:[()=>n.e(67927).then(n.t.bind(n,49063,19)),"~blog/updates/cardano-updates-page-10-021.json",49063],fc8c3309:[()=>n.e(77642).then(n.bind(n,64267)),"@site/blog/2023-08-23-consensus.md?truncated=true",64267],fce7e268:[()=>n.e(62140).then(n.bind(n,50153)),"@site/blog/2023-03-03-hydra.md?truncated=true",50153],fd6fd4a3:[()=>n.e(37495).then(n.bind(n,66366)),"@site/blog/2022-11-23-ledger.md",66366],fdba8f98:[()=>n.e(79224).then(n.bind(n,1814)),"@site/blog/2023-03-10-hydra.md",1814],fdfeff52:[()=>n.e(81030).then(n.t.bind(n,49771,19)),"~blog/updates/cardano-updates-tags-goedel-page-2-248-list.json",49771],fe184e91:[()=>n.e(79967).then(n.t.bind(n,51034,19)),"~blog/updates/cardano-updates-tags-cli-api-4f5-list.json",51034],fee99998:[()=>n.e(91760).then(n.bind(n,49627)),"@site/blog/2023-02-24-hydra.md?truncated=true",49627],ff276f6a:[()=>n.e(39969).then(n.t.bind(n,20040,19)),"~blog/updates/cardano-updates-tags-network-page-5-19d.json",20040],ff8cfcf7:[()=>n.e(20203).then(n.bind(n,98149)),"@site/blog/2022-12-09-ledger.md",98149],ffbc2281:[()=>n.e(64906).then(n.t.bind(n,21299,19)),"~blog/updates/cardano-updates-page-46-e12.json",21299]};function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?a.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},a.createElement("p",null,String(t)),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},"Retry"))):r?a.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},a.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},a.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"8"},a.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var l=n(99670),u=n(30226);function p(e,t){if("*"===e)return c()({loading:s,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return a.createElement(u.z,{value:{plugin:{name:"native",id:"default"}}},a.createElement(n,t))}});const o=i[`${e}-${t}`],p={},f=[],b=[],g=(0,l.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const a=d[n];a&&(p[t]=a[0],f.push(a[1]),b.push(a[2]))})),c().Map({loading:s,loader:p,modules:f,webpack:()=>b,render(t,n){const c=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,a]=t;const r=a.default;if(!r)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof r&&"function"!=typeof r||Object.keys(a).filter((e=>"default"!==e)).forEach((e=>{r[e]=a[e]}));let o=c;const i=n.split(".");i.slice(0,-1).forEach((e=>{o=o[e]})),o[i[i.length-1]]=r}));const i=c.__comp;delete c.__comp;const d=c.__context;return delete c.__context,a.createElement(u.z,{value:d},a.createElement(i,(0,r.Z)({},c,n)))}})}const f=[{path:"/cardano-updates/2022-08-12-network",component:p("/cardano-updates/2022-08-12-network","e9a"),exact:!0},{path:"/cardano-updates/2022-08-12-sre",component:p("/cardano-updates/2022-08-12-sre","cf2"),exact:!0},{path:"/cardano-updates/2022-08-31-consensus",component:p("/cardano-updates/2022-08-31-consensus","6f9"),exact:!0},{path:"/cardano-updates/2022-09-01-ledger",component:p("/cardano-updates/2022-09-01-ledger","ccc"),exact:!0},{path:"/cardano-updates/2022-09-16-ledger",component:p("/cardano-updates/2022-09-16-ledger","8dd"),exact:!0},{path:"/cardano-updates/2022-09-19-db-sync",component:p("/cardano-updates/2022-09-19-db-sync","a4b"),exact:!0},{path:"/cardano-updates/2022-09-20-consensus",component:p("/cardano-updates/2022-09-20-consensus","b11"),exact:!0},{path:"/cardano-updates/2022-09-27-network",component:p("/cardano-updates/2022-09-27-network","7f3"),exact:!0},{path:"/cardano-updates/2022-09-30-ledger",component:p("/cardano-updates/2022-09-30-ledger","58c"),exact:!0},{path:"/cardano-updates/2022-10-02-consensus",component:p("/cardano-updates/2022-10-02-consensus","758"),exact:!0},{path:"/cardano-updates/2022-10-04-db-sync",component:p("/cardano-updates/2022-10-04-db-sync","114"),exact:!0},{path:"/cardano-updates/2022-10-04-node-cli-api",component:p("/cardano-updates/2022-10-04-node-cli-api","01f"),exact:!0},{path:"/cardano-updates/2022-10-05-consensus",component:p("/cardano-updates/2022-10-05-consensus","020"),exact:!0},{path:"/cardano-updates/2022-10-14-hydra",component:p("/cardano-updates/2022-10-14-hydra","8a0"),exact:!0},{path:"/cardano-updates/2022-10-14-ledger",component:p("/cardano-updates/2022-10-14-ledger","585"),exact:!0},{path:"/cardano-updates/2022-10-18-consensus",component:p("/cardano-updates/2022-10-18-consensus","52a"),exact:!0},{path:"/cardano-updates/2022-10-19-node-cli-api",component:p("/cardano-updates/2022-10-19-node-cli-api","dea"),exact:!0},{path:"/cardano-updates/2022-10-21-hydra",component:p("/cardano-updates/2022-10-21-hydra","577"),exact:!0},{path:"/cardano-updates/2022-10-27-crypto",component:p("/cardano-updates/2022-10-27-crypto","8f1"),exact:!0},{path:"/cardano-updates/2022-10-28-hydra",component:p("/cardano-updates/2022-10-28-hydra","835"),exact:!0},{path:"/cardano-updates/2022-10-28-network",component:p("/cardano-updates/2022-10-28-network","a2a"),exact:!0},{path:"/cardano-updates/2022-10-28-performance-and-tracing",component:p("/cardano-updates/2022-10-28-performance-and-tracing","207"),exact:!0},{path:"/cardano-updates/2022-10-31-open-source",component:p("/cardano-updates/2022-10-31-open-source","374"),exact:!0},{path:"/cardano-updates/2022-11-01-db-sync",component:p("/cardano-updates/2022-11-01-db-sync","aee"),exact:!0},{path:"/cardano-updates/2022-11-02-ledger",component:p("/cardano-updates/2022-11-02-ledger","672"),exact:!0},{path:"/cardano-updates/2022-11-02-node-cli-api",component:p("/cardano-updates/2022-11-02-node-cli-api","a05"),exact:!0},{path:"/cardano-updates/2022-11-02-release",component:p("/cardano-updates/2022-11-02-release","459"),exact:!0},{path:"/cardano-updates/2022-11-02-system-test",component:p("/cardano-updates/2022-11-02-system-test","d6c"),exact:!0},{path:"/cardano-updates/2022-11-03-embedding-quality",component:p("/cardano-updates/2022-11-03-embedding-quality","246"),exact:!0},{path:"/cardano-updates/2022-11-04-hydra",component:p("/cardano-updates/2022-11-04-hydra","f05"),exact:!0},{path:"/cardano-updates/2022-11-04-mithril",component:p("/cardano-updates/2022-11-04-mithril","591"),exact:!0},{path:"/cardano-updates/2022-11-11-crypto",component:p("/cardano-updates/2022-11-11-crypto","1d7"),exact:!0},{path:"/cardano-updates/2022-11-11-hydra",component:p("/cardano-updates/2022-11-11-hydra","83e"),exact:!0},{path:"/cardano-updates/2022-11-11-ledger",component:p("/cardano-updates/2022-11-11-ledger","2f1"),exact:!0},{path:"/cardano-updates/2022-11-11-network",component:p("/cardano-updates/2022-11-11-network","34f"),exact:!0},{path:"/cardano-updates/2022-11-16-consensus",component:p("/cardano-updates/2022-11-16-consensus","a8f"),exact:!0},{path:"/cardano-updates/2022-11-16-node-cli-api",component:p("/cardano-updates/2022-11-16-node-cli-api","bbe"),exact:!0},{path:"/cardano-updates/2022-11-16-performance-and-tracing",component:p("/cardano-updates/2022-11-16-performance-and-tracing","5fa"),exact:!0},{path:"/cardano-updates/2022-11-18-hydra",component:p("/cardano-updates/2022-11-18-hydra","c71"),exact:!0},{path:"/cardano-updates/2022-11-18-mithril",component:p("/cardano-updates/2022-11-18-mithril","0a1"),exact:!0},{path:"/cardano-updates/2022-11-23-ledger",component:p("/cardano-updates/2022-11-23-ledger","53d"),exact:!0},{path:"/cardano-updates/2022-11-25-crypto",component:p("/cardano-updates/2022-11-25-crypto","f67"),exact:!0},{path:"/cardano-updates/2022-11-25-hydra",component:p("/cardano-updates/2022-11-25-hydra","839"),exact:!0},{path:"/cardano-updates/2022-11-28-network",component:p("/cardano-updates/2022-11-28-network","e29"),exact:!0},{path:"/cardano-updates/2022-11-30-consensus",component:p("/cardano-updates/2022-11-30-consensus","e7e"),exact:!0},{path:"/cardano-updates/2022-11-30-node-cli-api",component:p("/cardano-updates/2022-11-30-node-cli-api","e8e"),exact:!0},{path:"/cardano-updates/2022-11-30-performance-and-tracing",component:p("/cardano-updates/2022-11-30-performance-and-tracing","8d0"),exact:!0},{path:"/cardano-updates/2022-12-01-db-sync",component:p("/cardano-updates/2022-12-01-db-sync","ae4"),exact:!0},{path:"/cardano-updates/2022-12-01-mithril",component:p("/cardano-updates/2022-12-01-mithril","543"),exact:!0},{path:"/cardano-updates/2022-12-01-system-test",component:p("/cardano-updates/2022-12-01-system-test","706"),exact:!0},{path:"/cardano-updates/2022-12-02-hydra",component:p("/cardano-updates/2022-12-02-hydra","b24"),exact:!0},{path:"/cardano-updates/2022-12-09-crypto",component:p("/cardano-updates/2022-12-09-crypto","531"),exact:!0},{path:"/cardano-updates/2022-12-09-hydra",component:p("/cardano-updates/2022-12-09-hydra","b00"),exact:!0},{path:"/cardano-updates/2022-12-09-ledger",component:p("/cardano-updates/2022-12-09-ledger","d4c"),exact:!0},{path:"/cardano-updates/2022-12-12-network",component:p("/cardano-updates/2022-12-12-network","550"),exact:!0},{path:"/cardano-updates/2022-12-14-consensus",component:p("/cardano-updates/2022-12-14-consensus","70e"),exact:!0},{path:"/cardano-updates/2022-12-14-db-sync",component:p("/cardano-updates/2022-12-14-db-sync","9c9"),exact:!0},{path:"/cardano-updates/2022-12-14-node-cli-api",component:p("/cardano-updates/2022-12-14-node-cli-api","27e"),exact:!0},{path:"/cardano-updates/2022-12-14-performance-and-tracing",component:p("/cardano-updates/2022-12-14-performance-and-tracing","5c7"),exact:!0},{path:"/cardano-updates/2022-12-15-mithril",component:p("/cardano-updates/2022-12-15-mithril","650"),exact:!0},{path:"/cardano-updates/2022-12-16-hydra",component:p("/cardano-updates/2022-12-16-hydra","d53"),exact:!0},{path:"/cardano-updates/2022-12-28-node-cli-api",component:p("/cardano-updates/2022-12-28-node-cli-api","c05"),exact:!0},{path:"/cardano-updates/2023-01-05-ledger",component:p("/cardano-updates/2023-01-05-ledger","beb"),exact:!0},{path:"/cardano-updates/2023-01-06-crypto",component:p("/cardano-updates/2023-01-06-crypto","4d1"),exact:!0},{path:"/cardano-updates/2023-01-11-consensus",component:p("/cardano-updates/2023-01-11-consensus","632"),exact:!0},{path:"/cardano-updates/2023-01-11-performance-and-tracing",component:p("/cardano-updates/2023-01-11-performance-and-tracing","c8e"),exact:!0},{path:"/cardano-updates/2023-01-12-mithril",component:p("/cardano-updates/2023-01-12-mithril","02f"),exact:!0},{path:"/cardano-updates/2023-01-13-hydra",component:p("/cardano-updates/2023-01-13-hydra","ac6"),exact:!0},{path:"/cardano-updates/2023-01-13-release",component:p("/cardano-updates/2023-01-13-release","f71"),exact:!0},{path:"/cardano-updates/2023-01-13-system-test",component:p("/cardano-updates/2023-01-13-system-test","6c4"),exact:!0},{path:"/cardano-updates/2023-01-14-db-sync",component:p("/cardano-updates/2023-01-14-db-sync","07c"),exact:!0},{path:"/cardano-updates/2023-01-19-ledger",component:p("/cardano-updates/2023-01-19-ledger","2b7"),exact:!0},{path:"/cardano-updates/2023-01-20-crypto",component:p("/cardano-updates/2023-01-20-crypto","985"),exact:!0},{path:"/cardano-updates/2023-01-20-hydra",component:p("/cardano-updates/2023-01-20-hydra","aba"),exact:!0},{path:"/cardano-updates/2023-01-20-network",component:p("/cardano-updates/2023-01-20-network","c85"),exact:!0},{path:"/cardano-updates/2023-01-20-sre",component:p("/cardano-updates/2023-01-20-sre","f1a"),exact:!0},{path:"/cardano-updates/2023-01-25-consensus",component:p("/cardano-updates/2023-01-25-consensus","d6b"),exact:!0},{path:"/cardano-updates/2023-01-25-node-cli-api",component:p("/cardano-updates/2023-01-25-node-cli-api","b8a"),exact:!0},{path:"/cardano-updates/2023-01-26-mithril",component:p("/cardano-updates/2023-01-26-mithril","401"),exact:!0},{path:"/cardano-updates/2023-01-27-hydra",component:p("/cardano-updates/2023-01-27-hydra","2f4"),exact:!0},{path:"/cardano-updates/2023-02-02-ledger",component:p("/cardano-updates/2023-02-02-ledger","7d2"),exact:!0},{path:"/cardano-updates/2023-02-03-crypto",component:p("/cardano-updates/2023-02-03-crypto","ad8"),exact:!0},{path:"/cardano-updates/2023-02-03-goedel",component:p("/cardano-updates/2023-02-03-goedel","2d4"),exact:!0},{path:"/cardano-updates/2023-02-03-hydra",component:p("/cardano-updates/2023-02-03-hydra","45c"),exact:!0},{path:"/cardano-updates/2023-02-08-consensus",component:p("/cardano-updates/2023-02-08-consensus","a91"),exact:!0},{path:"/cardano-updates/2023-02-08-node-cli-api",component:p("/cardano-updates/2023-02-08-node-cli-api","c56"),exact:!0},{path:"/cardano-updates/2023-02-08-performance-and-tracing",component:p("/cardano-updates/2023-02-08-performance-and-tracing","888"),exact:!0},{path:"/cardano-updates/2023-02-09-mithril",component:p("/cardano-updates/2023-02-09-mithril","898"),exact:!0},{path:"/cardano-updates/2023-02-10-hydra",component:p("/cardano-updates/2023-02-10-hydra","fd6"),exact:!0},{path:"/cardano-updates/2023-02-17-crypto",component:p("/cardano-updates/2023-02-17-crypto","933"),exact:!0},{path:"/cardano-updates/2023-02-17-goedel",component:p("/cardano-updates/2023-02-17-goedel","855"),exact:!0},{path:"/cardano-updates/2023-02-17-hydra",component:p("/cardano-updates/2023-02-17-hydra","51e"),exact:!0},{path:"/cardano-updates/2023-02-17-ledger",component:p("/cardano-updates/2023-02-17-ledger","a32"),exact:!0},{path:"/cardano-updates/2023-02-17-network",component:p("/cardano-updates/2023-02-17-network","136"),exact:!0},{path:"/cardano-updates/2023-02-21-db-sync",component:p("/cardano-updates/2023-02-21-db-sync","141"),exact:!0},{path:"/cardano-updates/2023-02-22-consensus",component:p("/cardano-updates/2023-02-22-consensus","6a1"),exact:!0},{path:"/cardano-updates/2023-02-22-node-cli-api",component:p("/cardano-updates/2023-02-22-node-cli-api","c5f"),exact:!0},{path:"/cardano-updates/2023-02-23-mithril",component:p("/cardano-updates/2023-02-23-mithril","f96"),exact:!0},{path:"/cardano-updates/2023-02-23-performance-and-tracing",component:p("/cardano-updates/2023-02-23-performance-and-tracing","570"),exact:!0},{path:"/cardano-updates/2023-02-24-hydra",component:p("/cardano-updates/2023-02-24-hydra","120"),exact:!0},{path:"/cardano-updates/2023-03-02-network",component:p("/cardano-updates/2023-03-02-network","2cf"),exact:!0},{path:"/cardano-updates/2023-03-03-crypto",component:p("/cardano-updates/2023-03-03-crypto","afe"),exact:!0},{path:"/cardano-updates/2023-03-03-goedel",component:p("/cardano-updates/2023-03-03-goedel","6d4"),exact:!0},{path:"/cardano-updates/2023-03-03-hydra",component:p("/cardano-updates/2023-03-03-hydra","b66"),exact:!0},{path:"/cardano-updates/2023-03-03-ledger",component:p("/cardano-updates/2023-03-03-ledger","ad5"),exact:!0},{path:"/cardano-updates/2023-03-08-consensus",component:p("/cardano-updates/2023-03-08-consensus","caa"),exact:!0},{path:"/cardano-updates/2023-03-08-node-cli-api",component:p("/cardano-updates/2023-03-08-node-cli-api","4f2"),exact:!0},{path:"/cardano-updates/2023-03-08-performance-and-tracing",component:p("/cardano-updates/2023-03-08-performance-and-tracing","8bb"),exact:!0},{path:"/cardano-updates/2023-03-09-mithril",component:p("/cardano-updates/2023-03-09-mithril","031"),exact:!0},{path:"/cardano-updates/2023-03-10-hydra",component:p("/cardano-updates/2023-03-10-hydra","7d8"),exact:!0},{path:"/cardano-updates/2023-03-16-goedel",component:p("/cardano-updates/2023-03-16-goedel","2c1"),exact:!0},{path:"/cardano-updates/2023-03-17-crypto",component:p("/cardano-updates/2023-03-17-crypto","91c"),exact:!0},{path:"/cardano-updates/2023-03-17-hydra",component:p("/cardano-updates/2023-03-17-hydra","531"),exact:!0},{path:"/cardano-updates/2023-03-17-ledger",component:p("/cardano-updates/2023-03-17-ledger","b04"),exact:!0},{path:"/cardano-updates/2023-03-21-network",component:p("/cardano-updates/2023-03-21-network","327"),exact:!0},{path:"/cardano-updates/2023-03-22-consensus",component:p("/cardano-updates/2023-03-22-consensus","a73"),exact:!0},{path:"/cardano-updates/2023-03-22-node-cli-api",component:p("/cardano-updates/2023-03-22-node-cli-api","7a9"),exact:!0},{path:"/cardano-updates/2023-03-22-performance-and-tracing",component:p("/cardano-updates/2023-03-22-performance-and-tracing","665"),exact:!0},{path:"/cardano-updates/2023-03-23-db-sync",component:p("/cardano-updates/2023-03-23-db-sync","68e"),exact:!0},{path:"/cardano-updates/2023-03-23-mithril",component:p("/cardano-updates/2023-03-23-mithril","d40"),exact:!0},{path:"/cardano-updates/2023-03-24-hydra",component:p("/cardano-updates/2023-03-24-hydra","91d"),exact:!0},{path:"/cardano-updates/2023-03-27-system-test",component:p("/cardano-updates/2023-03-27-system-test","915"),exact:!0},{path:"/cardano-updates/2023-03-31-crypto",component:p("/cardano-updates/2023-03-31-crypto","53e"),exact:!0},{path:"/cardano-updates/2023-03-31-goedel",component:p("/cardano-updates/2023-03-31-goedel","e53"),exact:!0},{path:"/cardano-updates/2023-03-31-hydra",component:p("/cardano-updates/2023-03-31-hydra","f8f"),exact:!0},{path:"/cardano-updates/2023-03-31-ledger",component:p("/cardano-updates/2023-03-31-ledger","bd1"),exact:!0},{path:"/cardano-updates/2023-04-05-consensus",component:p("/cardano-updates/2023-04-05-consensus","948"),exact:!0},{path:"/cardano-updates/2023-04-05-node-cli-api",component:p("/cardano-updates/2023-04-05-node-cli-api","bca"),exact:!0},{path:"/cardano-updates/2023-04-05-performance-and-tracing",component:p("/cardano-updates/2023-04-05-performance-and-tracing","50a"),exact:!0},{path:"/cardano-updates/2023-04-06-mithril",component:p("/cardano-updates/2023-04-06-mithril","a86"),exact:!0},{path:"/cardano-updates/2023-04-07-hydra",component:p("/cardano-updates/2023-04-07-hydra","c27"),exact:!0},{path:"/cardano-updates/2023-04-14-goedel",component:p("/cardano-updates/2023-04-14-goedel","2bc"),exact:!0},{path:"/cardano-updates/2023-04-14-hydra",component:p("/cardano-updates/2023-04-14-hydra","3aa"),exact:!0},{path:"/cardano-updates/2023-04-17-ledger",component:p("/cardano-updates/2023-04-17-ledger","1d1"),exact:!0},{path:"/cardano-updates/2023-04-19-consensus",component:p("/cardano-updates/2023-04-19-consensus","711"),exact:!0},{path:"/cardano-updates/2023-04-19-performance-and-tracing",component:p("/cardano-updates/2023-04-19-performance-and-tracing","1ef"),exact:!0},{path:"/cardano-updates/2023-04-20-mithril",component:p("/cardano-updates/2023-04-20-mithril","2f6"),exact:!0},{path:"/cardano-updates/2023-04-20-node-cli-api",component:p("/cardano-updates/2023-04-20-node-cli-api","f77"),exact:!0},{path:"/cardano-updates/2023-04-21-hydra",component:p("/cardano-updates/2023-04-21-hydra","12b"),exact:!0},{path:"/cardano-updates/2023-04-21-ledger",component:p("/cardano-updates/2023-04-21-ledger","b7b"),exact:!0},{path:"/cardano-updates/2023-04-27-hydra",component:p("/cardano-updates/2023-04-27-hydra","266"),exact:!0},{path:"/cardano-updates/2023-04-28-crypto",component:p("/cardano-updates/2023-04-28-crypto","8b9"),exact:!0},{path:"/cardano-updates/2023-04-28-goedel",component:p("/cardano-updates/2023-04-28-goedel","0ba"),exact:!0},{path:"/cardano-updates/2023-04-28-network",component:p("/cardano-updates/2023-04-28-network","bb5"),exact:!0},{path:"/cardano-updates/2023-05-01-db-sync",component:p("/cardano-updates/2023-05-01-db-sync","ab4"),exact:!0},{path:"/cardano-updates/2023-05-03-consensus",component:p("/cardano-updates/2023-05-03-consensus","b9e"),exact:!0},{path:"/cardano-updates/2023-05-03-performance-and-tracing",component:p("/cardano-updates/2023-05-03-performance-and-tracing","370"),exact:!0},{path:"/cardano-updates/2023-05-04-mithril",component:p("/cardano-updates/2023-05-04-mithril","427"),exact:!0},{path:"/cardano-updates/2023-05-05-ledger",component:p("/cardano-updates/2023-05-05-ledger","4f2"),exact:!0},{path:"/cardano-updates/2023-05-05-node-cli-api",component:p("/cardano-updates/2023-05-05-node-cli-api","7ed"),exact:!0},{path:"/cardano-updates/2023-05-12-crypto",component:p("/cardano-updates/2023-05-12-crypto","eb6"),exact:!0},{path:"/cardano-updates/2023-05-12-goedel",component:p("/cardano-updates/2023-05-12-goedel","10f"),exact:!0},{path:"/cardano-updates/2023-05-12-hydra",component:p("/cardano-updates/2023-05-12-hydra","dc7"),exact:!0},{path:"/cardano-updates/2023-05-12-network",component:p("/cardano-updates/2023-05-12-network","738"),exact:!0},{path:"/cardano-updates/2023-05-17-consensus",component:p("/cardano-updates/2023-05-17-consensus","f99"),exact:!0},{path:"/cardano-updates/2023-05-17-mithril",component:p("/cardano-updates/2023-05-17-mithril","d0a"),exact:!0},{path:"/cardano-updates/2023-05-17-performance-and-tracing",component:p("/cardano-updates/2023-05-17-performance-and-tracing","976"),exact:!0},{path:"/cardano-updates/2023-05-19-hydra",component:p("/cardano-updates/2023-05-19-hydra","8b0"),exact:!0},{path:"/cardano-updates/2023-05-24-node-cli-api",component:p("/cardano-updates/2023-05-24-node-cli-api","43d"),exact:!0},{path:"/cardano-updates/2023-05-26-goedel",component:p("/cardano-updates/2023-05-26-goedel","5c5"),exact:!0},{path:"/cardano-updates/2023-05-26-hydra",component:p("/cardano-updates/2023-05-26-hydra","d35"),exact:!0},{path:"/cardano-updates/2023-05-26-ledger",component:p("/cardano-updates/2023-05-26-ledger","a41"),exact:!0},{path:"/cardano-updates/2023-05-26-network",component:p("/cardano-updates/2023-05-26-network","3a9"),exact:!0},{path:"/cardano-updates/2023-05-31-consensus",component:p("/cardano-updates/2023-05-31-consensus","bc8"),exact:!0},{path:"/cardano-updates/2023-05-31-performance-and-tracing",component:p("/cardano-updates/2023-05-31-performance-and-tracing","f2d"),exact:!0},{path:"/cardano-updates/2023-06-01-mithril",component:p("/cardano-updates/2023-06-01-mithril","a0d"),exact:!0},{path:"/cardano-updates/2023-06-02-hydra",component:p("/cardano-updates/2023-06-02-hydra","e96"),exact:!0},{path:"/cardano-updates/2023-06-07-node-cli-api",component:p("/cardano-updates/2023-06-07-node-cli-api","9c8"),exact:!0},{path:"/cardano-updates/2023-06-08-db-sync",component:p("/cardano-updates/2023-06-08-db-sync","496"),exact:!0},{path:"/cardano-updates/2023-06-08-goedel",component:p("/cardano-updates/2023-06-08-goedel","3d4"),exact:!0},{path:"/cardano-updates/2023-06-08-sre",component:p("/cardano-updates/2023-06-08-sre","d91"),exact:!0},{path:"/cardano-updates/2023-06-08-system-test",component:p("/cardano-updates/2023-06-08-system-test","62e"),exact:!0},{path:"/cardano-updates/2023-06-09-crypto",component:p("/cardano-updates/2023-06-09-crypto","2e0"),exact:!0},{path:"/cardano-updates/2023-06-09-developer-experience",component:p("/cardano-updates/2023-06-09-developer-experience","c4e"),exact:!0},{path:"/cardano-updates/2023-06-09-hydra",component:p("/cardano-updates/2023-06-09-hydra","bab"),exact:!0},{path:"/cardano-updates/2023-06-12-network",component:p("/cardano-updates/2023-06-12-network","fbe"),exact:!0},{path:"/cardano-updates/2023-06-14-consensus",component:p("/cardano-updates/2023-06-14-consensus","ee8"),exact:!0},{path:"/cardano-updates/2023-06-14-performance-and-tracing",component:p("/cardano-updates/2023-06-14-performance-and-tracing","3ec"),exact:!0},{path:"/cardano-updates/2023-06-15-mithril",component:p("/cardano-updates/2023-06-15-mithril","f0a"),exact:!0},{path:"/cardano-updates/2023-06-16-hydra",component:p("/cardano-updates/2023-06-16-hydra","2e0"),exact:!0},{path:"/cardano-updates/2023-06-23-goedel",component:p("/cardano-updates/2023-06-23-goedel","988"),exact:!0},{path:"/cardano-updates/2023-06-23-hydra",component:p("/cardano-updates/2023-06-23-hydra","ec0"),exact:!0},{path:"/cardano-updates/2023-06-23-network",component:p("/cardano-updates/2023-06-23-network","e4b"),exact:!0},{path:"/cardano-updates/2023-06-23-sre",component:p("/cardano-updates/2023-06-23-sre","088"),exact:!0},{path:"/cardano-updates/2023-06-28-consensus",component:p("/cardano-updates/2023-06-28-consensus","031"),exact:!0},{path:"/cardano-updates/2023-06-28-performance-and-tracing",component:p("/cardano-updates/2023-06-28-performance-and-tracing","997"),exact:!0},{path:"/cardano-updates/2023-06-29-mithril",component:p("/cardano-updates/2023-06-29-mithril","6e2"),exact:!0},{path:"/cardano-updates/2023-06-30-hydra",component:p("/cardano-updates/2023-06-30-hydra","fd5"),exact:!0},{path:"/cardano-updates/2023-07-04-db-sync",component:p("/cardano-updates/2023-07-04-db-sync","7cb"),exact:!0},{path:"/cardano-updates/2023-07-04-node-cli-api",component:p("/cardano-updates/2023-07-04-node-cli-api","ede"),exact:!0},{path:"/cardano-updates/2023-07-06-developer-experience",component:p("/cardano-updates/2023-07-06-developer-experience","c31"),exact:!0},{path:"/cardano-updates/2023-07-07-crypto",component:p("/cardano-updates/2023-07-07-crypto","240"),exact:!0},{path:"/cardano-updates/2023-07-07-goedel",component:p("/cardano-updates/2023-07-07-goedel","a98"),exact:!0},{path:"/cardano-updates/2023-07-07-hydra",component:p("/cardano-updates/2023-07-07-hydra","5d6"),exact:!0},{path:"/cardano-updates/2023-07-07-sre",component:p("/cardano-updates/2023-07-07-sre","5bc"),exact:!0},{path:"/cardano-updates/2023-07-12-consensus",component:p("/cardano-updates/2023-07-12-consensus","395"),exact:!0},{path:"/cardano-updates/2023-07-12-performance-and-tracing",component:p("/cardano-updates/2023-07-12-performance-and-tracing","b16"),exact:!0},{path:"/cardano-updates/2023-07-13-mithril",component:p("/cardano-updates/2023-07-13-mithril","3dc"),exact:!0},{path:"/cardano-updates/2023-07-14-hydra",component:p("/cardano-updates/2023-07-14-hydra","231"),exact:!0},{path:"/cardano-updates/2023-07-18-node-cli-api",component:p("/cardano-updates/2023-07-18-node-cli-api","156"),exact:!0},{path:"/cardano-updates/2023-07-20-goedel",component:p("/cardano-updates/2023-07-20-goedel","d82"),exact:!0},{path:"/cardano-updates/2023-07-21-hydra",component:p("/cardano-updates/2023-07-21-hydra","39b"),exact:!0},{path:"/cardano-updates/2023-07-21-ledger",component:p("/cardano-updates/2023-07-21-ledger","ff7"),exact:!0},{path:"/cardano-updates/2023-07-21-sre",component:p("/cardano-updates/2023-07-21-sre","ad2"),exact:!0},{path:"/cardano-updates/2023-07-26-consensus",component:p("/cardano-updates/2023-07-26-consensus","c66"),exact:!0},{path:"/cardano-updates/2023-07-27-mithril",component:p("/cardano-updates/2023-07-27-mithril","8ae"),exact:!0},{path:"/cardano-updates/2023-07-28-hydra",component:p("/cardano-updates/2023-07-28-hydra","811"),exact:!0},{path:"/cardano-updates/2023-07-31-network",component:p("/cardano-updates/2023-07-31-network","d4f"),exact:!0},{path:"/cardano-updates/2023-08-01-node-cli-api",component:p("/cardano-updates/2023-08-01-node-cli-api","cb1"),exact:!0},{path:"/cardano-updates/2023-08-04-crypto",component:p("/cardano-updates/2023-08-04-crypto","e3c"),exact:!0},{path:"/cardano-updates/2023-08-04-goedel",component:p("/cardano-updates/2023-08-04-goedel","886"),exact:!0},{path:"/cardano-updates/2023-08-04-hydra",component:p("/cardano-updates/2023-08-04-hydra","15e"),exact:!0},{path:"/cardano-updates/2023-08-04-ledger",component:p("/cardano-updates/2023-08-04-ledger","d11"),exact:!0},{path:"/cardano-updates/2023-08-04-network",component:p("/cardano-updates/2023-08-04-network","883"),exact:!0},{path:"/cardano-updates/2023-08-04-performance-and-tracing",component:p("/cardano-updates/2023-08-04-performance-and-tracing","a82"),exact:!0},{path:"/cardano-updates/2023-08-04-sre",component:p("/cardano-updates/2023-08-04-sre","2d9"),exact:!0},{path:"/cardano-updates/2023-08-09-consensus",component:p("/cardano-updates/2023-08-09-consensus","092"),exact:!0},{path:"/cardano-updates/2023-08-10-mithril",component:p("/cardano-updates/2023-08-10-mithril","c36"),exact:!0},{path:"/cardano-updates/2023-08-11-hydra",component:p("/cardano-updates/2023-08-11-hydra","7c0"),exact:!0},{path:"/cardano-updates/2023-08-11-performance-and-tracing",component:p("/cardano-updates/2023-08-11-performance-and-tracing","0bd"),exact:!0},{path:"/cardano-updates/2023-08-15-node-cli-api",component:p("/cardano-updates/2023-08-15-node-cli-api","27f"),exact:!0},{path:"/cardano-updates/2023-08-17-crypto",component:p("/cardano-updates/2023-08-17-crypto","fd2"),exact:!0},{path:"/cardano-updates/2023-08-17-db-sync",component:p("/cardano-updates/2023-08-17-db-sync","20d"),exact:!0},{path:"/cardano-updates/2023-08-17-secp-issue",component:p("/cardano-updates/2023-08-17-secp-issue","6bb"),exact:!0},{path:"/cardano-updates/2023-08-18-goedel",component:p("/cardano-updates/2023-08-18-goedel","762"),exact:!0},{path:"/cardano-updates/2023-08-18-hydra",component:p("/cardano-updates/2023-08-18-hydra","09d"),exact:!0},{path:"/cardano-updates/2023-08-18-ledger",component:p("/cardano-updates/2023-08-18-ledger","04c"),exact:!0},{path:"/cardano-updates/2023-08-18-network",component:p("/cardano-updates/2023-08-18-network","606"),exact:!0},{path:"/cardano-updates/2023-08-18-sre",component:p("/cardano-updates/2023-08-18-sre","cc5"),exact:!0},{path:"/cardano-updates/2023-08-23-consensus",component:p("/cardano-updates/2023-08-23-consensus","8a6"),exact:!0},{path:"/cardano-updates/2023-08-24-performance-and-tracing",component:p("/cardano-updates/2023-08-24-performance-and-tracing","c0b"),exact:!0},{path:"/cardano-updates/2023-08-25-hydra",component:p("/cardano-updates/2023-08-25-hydra","ee1"),exact:!0},{path:"/cardano-updates/2023-08-28-mithril",component:p("/cardano-updates/2023-08-28-mithril","2ab"),exact:!0},{path:"/cardano-updates/2023-08-29-node-cli-api",component:p("/cardano-updates/2023-08-29-node-cli-api","851"),exact:!0},{path:"/cardano-updates/2023-09-01-goedel",component:p("/cardano-updates/2023-09-01-goedel","9f0"),exact:!0},{path:"/cardano-updates/2023-09-01-hydra",component:p("/cardano-updates/2023-09-01-hydra","980"),exact:!0},{path:"/cardano-updates/2023-09-01-ledger",component:p("/cardano-updates/2023-09-01-ledger","1d6"),exact:!0},{path:"/cardano-updates/2023-09-01-network",component:p("/cardano-updates/2023-09-01-network","567"),exact:!0},{path:"/cardano-updates/2023-09-01-sre",component:p("/cardano-updates/2023-09-01-sre","657"),exact:!0},{path:"/cardano-updates/2023-09-06-consensus",component:p("/cardano-updates/2023-09-06-consensus","292"),exact:!0},{path:"/cardano-updates/2023-09-07-mithril",component:p("/cardano-updates/2023-09-07-mithril","d11"),exact:!0},{path:"/cardano-updates/2023-09-07-performance-and-tracing",component:p("/cardano-updates/2023-09-07-performance-and-tracing","219"),exact:!0},{path:"/cardano-updates/2023-09-08-hydra",component:p("/cardano-updates/2023-09-08-hydra","7ec"),exact:!0},{path:"/cardano-updates/2023-09-12-node-cli-api",component:p("/cardano-updates/2023-09-12-node-cli-api","934"),exact:!0},{path:"/cardano-updates/2023-09-14-db-sync",component:p("/cardano-updates/2023-09-14-db-sync","32d"),exact:!0},{path:"/cardano-updates/2023-09-15-goedel",component:p("/cardano-updates/2023-09-15-goedel","ca8"),exact:!0},{path:"/cardano-updates/2023-09-15-hydra",component:p("/cardano-updates/2023-09-15-hydra","92f"),exact:!0},{path:"/cardano-updates/2023-09-15-ledger",component:p("/cardano-updates/2023-09-15-ledger","890"),exact:!0},{path:"/cardano-updates/2023-09-15-network",component:p("/cardano-updates/2023-09-15-network","6ee"),exact:!0},{path:"/cardano-updates/2023-09-15-sre",component:p("/cardano-updates/2023-09-15-sre","78b"),exact:!0},{path:"/cardano-updates/2023-09-20-consensus",component:p("/cardano-updates/2023-09-20-consensus","d6f"),exact:!0},{path:"/cardano-updates/2023-09-20-mithril",component:p("/cardano-updates/2023-09-20-mithril","91d"),exact:!0},{path:"/cardano-updates/2023-09-22-hydra",component:p("/cardano-updates/2023-09-22-hydra","c6b"),exact:!0},{path:"/cardano-updates/2023-09-22-performance-and-tracing",component:p("/cardano-updates/2023-09-22-performance-and-tracing","e17"),exact:!0},{path:"/cardano-updates/2023-09-26-node-cli-api",component:p("/cardano-updates/2023-09-26-node-cli-api","6d5"),exact:!0},{path:"/cardano-updates/2023-09-27-mithril",component:p("/cardano-updates/2023-09-27-mithril","42f"),exact:!0},{path:"/cardano-updates/2023-09-29-goedel",component:p("/cardano-updates/2023-09-29-goedel","359"),exact:!0},{path:"/cardano-updates/2023-09-29-hydra",component:p("/cardano-updates/2023-09-29-hydra","3cc"),exact:!0},{path:"/cardano-updates/2023-09-29-ledger",component:p("/cardano-updates/2023-09-29-ledger","bcc"),exact:!0},{path:"/cardano-updates/2023-09-29-sre",component:p("/cardano-updates/2023-09-29-sre","9c9"),exact:!0},{path:"/cardano-updates/2023-10-02-network",component:p("/cardano-updates/2023-10-02-network","9f0"),exact:!0},{path:"/cardano-updates/2023-10-04-consensus",component:p("/cardano-updates/2023-10-04-consensus","451"),exact:!0},{path:"/cardano-updates/2023-10-04-mithril",component:p("/cardano-updates/2023-10-04-mithril","e3d"),exact:!0},{path:"/cardano-updates/2023-10-06-hydra",component:p("/cardano-updates/2023-10-06-hydra","6a8"),exact:!0},{path:"/cardano-updates/2023-10-06-performance-and-tracing",component:p("/cardano-updates/2023-10-06-performance-and-tracing","516"),exact:!0},{path:"/cardano-updates/2023-10-10-node-cli-api",component:p("/cardano-updates/2023-10-10-node-cli-api","2c5"),exact:!0},{path:"/cardano-updates/2023-10-11-mithril",component:p("/cardano-updates/2023-10-11-mithril","784"),exact:!0},{path:"/cardano-updates/2023-10-13-hydra",component:p("/cardano-updates/2023-10-13-hydra","226"),exact:!0},{path:"/cardano-updates/2023-10-13-ledger",component:p("/cardano-updates/2023-10-13-ledger","742"),exact:!0},{path:"/cardano-updates/2023-10-13-sre",component:p("/cardano-updates/2023-10-13-sre","1c3"),exact:!0},{path:"/cardano-updates/2023-10-15-network",component:p("/cardano-updates/2023-10-15-network","303"),exact:!0},{path:"/cardano-updates/2023-10-18-consensus",component:p("/cardano-updates/2023-10-18-consensus","c43"),exact:!0},{path:"/cardano-updates/2023-10-18-mithril",component:p("/cardano-updates/2023-10-18-mithril","c02"),exact:!0},{path:"/cardano-updates/2023-10-20-hydra",component:p("/cardano-updates/2023-10-20-hydra","f5e"),exact:!0},{path:"/cardano-updates/2023-10-24-node-cli-api",component:p("/cardano-updates/2023-10-24-node-cli-api","4ea"),exact:!0},{path:"/cardano-updates/2023-10-25-mithril",component:p("/cardano-updates/2023-10-25-mithril","2fc"),exact:!0},{path:"/cardano-updates/2023-10-27-hydra",component:p("/cardano-updates/2023-10-27-hydra","8d7"),exact:!0},{path:"/cardano-updates/2023-10-27-network",component:p("/cardano-updates/2023-10-27-network","e80"),exact:!0},{path:"/cardano-updates/2023-10-27-sre",component:p("/cardano-updates/2023-10-27-sre","06f"),exact:!0},{path:"/cardano-updates/2023-11-01-consensus",component:p("/cardano-updates/2023-11-01-consensus","342"),exact:!0},{path:"/cardano-updates/2023-11-01-mithril",component:p("/cardano-updates/2023-11-01-mithril","865"),exact:!0},{path:"/cardano-updates/2023-11-08-ledger",component:p("/cardano-updates/2023-11-08-ledger","0c9"),exact:!0},{path:"/cardano-updates/2023-11-08-mithril",component:p("/cardano-updates/2023-11-08-mithril","19e"),exact:!0},{path:"/cardano-updates/2023-11-09-db-sync",component:p("/cardano-updates/2023-11-09-db-sync","484"),exact:!0},{path:"/cardano-updates/2023-11-10-hydra",component:p("/cardano-updates/2023-11-10-hydra","181"),exact:!0},{path:"/cardano-updates/2023-11-10-sre",component:p("/cardano-updates/2023-11-10-sre","c9e"),exact:!0},{path:"/cardano-updates/2023-11-14-node-cli-api",component:p("/cardano-updates/2023-11-14-node-cli-api","c82"),exact:!0},{path:"/cardano-updates/2023-11-15-consensus",component:p("/cardano-updates/2023-11-15-consensus","201"),exact:!0},{path:"/cardano-updates/2023-11-15-mithril",component:p("/cardano-updates/2023-11-15-mithril","072"),exact:!0},{path:"/cardano-updates/2023-11-16-network",component:p("/cardano-updates/2023-11-16-network","659"),exact:!0},{path:"/cardano-updates/2023-11-17-hydra",component:p("/cardano-updates/2023-11-17-hydra","609"),exact:!0},{path:"/cardano-updates/2023-11-17-performance-and-tracing",component:p("/cardano-updates/2023-11-17-performance-and-tracing","18e"),exact:!0},{path:"/cardano-updates/2023-11-20-cip1694",component:p("/cardano-updates/2023-11-20-cip1694","61b"),exact:!0},{path:"/cardano-updates/2023-11-22-ledger",component:p("/cardano-updates/2023-11-22-ledger","d58"),exact:!0},{path:"/cardano-updates/2023-11-22-mithril",component:p("/cardano-updates/2023-11-22-mithril","7ef"),exact:!0},{path:"/cardano-updates/2023-11-24-hydra",component:p("/cardano-updates/2023-11-24-hydra","18e"),exact:!0},{path:"/cardano-updates/2023-11-24-sre",component:p("/cardano-updates/2023-11-24-sre","ec2"),exact:!0},{path:"/cardano-updates/2023-11-29-consensus",component:p("/cardano-updates/2023-11-29-consensus","8be"),exact:!0},{path:"/cardano-updates/2023-11-29-mithril",component:p("/cardano-updates/2023-11-29-mithril","a48"),exact:!0},{path:"/cardano-updates/2023-12-01-hydra",component:p("/cardano-updates/2023-12-01-hydra","264"),exact:!0},{path:"/cardano-updates/2023-12-04-performance-and-tracing",component:p("/cardano-updates/2023-12-04-performance-and-tracing","13f"),exact:!0},{path:"/cardano-updates/2023-12-06-ledger",component:p("/cardano-updates/2023-12-06-ledger","b76"),exact:!0},{path:"/cardano-updates/2023-12-06-mithril",component:p("/cardano-updates/2023-12-06-mithril","96a"),exact:!0},{path:"/cardano-updates/archive",component:p("/cardano-updates/archive","f69"),exact:!0},{path:"/cardano-updates/markdown-page",component:p("/cardano-updates/markdown-page","52f"),exact:!0},{path:"/cardano-updates/page/10",component:p("/cardano-updates/page/10","4c1"),exact:!0},{path:"/cardano-updates/page/11",component:p("/cardano-updates/page/11","bea"),exact:!0},{path:"/cardano-updates/page/12",component:p("/cardano-updates/page/12","d5b"),exact:!0},{path:"/cardano-updates/page/13",component:p("/cardano-updates/page/13","29a"),exact:!0},{path:"/cardano-updates/page/14",component:p("/cardano-updates/page/14","63c"),exact:!0},{path:"/cardano-updates/page/15",component:p("/cardano-updates/page/15","877"),exact:!0},{path:"/cardano-updates/page/16",component:p("/cardano-updates/page/16","b38"),exact:!0},{path:"/cardano-updates/page/17",component:p("/cardano-updates/page/17","d0c"),exact:!0},{path:"/cardano-updates/page/18",component:p("/cardano-updates/page/18","735"),exact:!0},{path:"/cardano-updates/page/19",component:p("/cardano-updates/page/19","42a"),exact:!0},{path:"/cardano-updates/page/2",component:p("/cardano-updates/page/2","d2f"),exact:!0},{path:"/cardano-updates/page/20",component:p("/cardano-updates/page/20","0b1"),exact:!0},{path:"/cardano-updates/page/21",component:p("/cardano-updates/page/21","833"),exact:!0},{path:"/cardano-updates/page/22",component:p("/cardano-updates/page/22","66d"),exact:!0},{path:"/cardano-updates/page/23",component:p("/cardano-updates/page/23","5e6"),exact:!0},{path:"/cardano-updates/page/24",component:p("/cardano-updates/page/24","1ad"),exact:!0},{path:"/cardano-updates/page/25",component:p("/cardano-updates/page/25","fdb"),exact:!0},{path:"/cardano-updates/page/26",component:p("/cardano-updates/page/26","bc7"),exact:!0},{path:"/cardano-updates/page/27",component:p("/cardano-updates/page/27","307"),exact:!0},{path:"/cardano-updates/page/28",component:p("/cardano-updates/page/28","0ae"),exact:!0},{path:"/cardano-updates/page/29",component:p("/cardano-updates/page/29","143"),exact:!0},{path:"/cardano-updates/page/3",component:p("/cardano-updates/page/3","a8a"),exact:!0},{path:"/cardano-updates/page/30",component:p("/cardano-updates/page/30","f2b"),exact:!0},{path:"/cardano-updates/page/31",component:p("/cardano-updates/page/31","0cc"),exact:!0},{path:"/cardano-updates/page/32",component:p("/cardano-updates/page/32","383"),exact:!0},{path:"/cardano-updates/page/33",component:p("/cardano-updates/page/33","263"),exact:!0},{path:"/cardano-updates/page/34",component:p("/cardano-updates/page/34","f10"),exact:!0},{path:"/cardano-updates/page/35",component:p("/cardano-updates/page/35","f1b"),exact:!0},{path:"/cardano-updates/page/36",component:p("/cardano-updates/page/36","35d"),exact:!0},{path:"/cardano-updates/page/37",component:p("/cardano-updates/page/37","9e5"),exact:!0},{path:"/cardano-updates/page/38",component:p("/cardano-updates/page/38","525"),exact:!0},{path:"/cardano-updates/page/39",component:p("/cardano-updates/page/39","32f"),exact:!0},{path:"/cardano-updates/page/4",component:p("/cardano-updates/page/4","307"),exact:!0},{path:"/cardano-updates/page/40",component:p("/cardano-updates/page/40","10d"),exact:!0},{path:"/cardano-updates/page/41",component:p("/cardano-updates/page/41","643"),exact:!0},{path:"/cardano-updates/page/42",component:p("/cardano-updates/page/42","bb5"),exact:!0},{path:"/cardano-updates/page/43",component:p("/cardano-updates/page/43","d3b"),exact:!0},{path:"/cardano-updates/page/44",component:p("/cardano-updates/page/44","f06"),exact:!0},{path:"/cardano-updates/page/45",component:p("/cardano-updates/page/45","9bf"),exact:!0},{path:"/cardano-updates/page/46",component:p("/cardano-updates/page/46","9b4"),exact:!0},{path:"/cardano-updates/page/47",component:p("/cardano-updates/page/47","b7b"),exact:!0},{path:"/cardano-updates/page/48",component:p("/cardano-updates/page/48","dc6"),exact:!0},{path:"/cardano-updates/page/49",component:p("/cardano-updates/page/49","08e"),exact:!0},{path:"/cardano-updates/page/5",component:p("/cardano-updates/page/5","0c2"),exact:!0},{path:"/cardano-updates/page/50",component:p("/cardano-updates/page/50","665"),exact:!0},{path:"/cardano-updates/page/51",component:p("/cardano-updates/page/51","d42"),exact:!0},{path:"/cardano-updates/page/52",component:p("/cardano-updates/page/52","ffc"),exact:!0},{path:"/cardano-updates/page/53",component:p("/cardano-updates/page/53","554"),exact:!0},{path:"/cardano-updates/page/54",component:p("/cardano-updates/page/54","984"),exact:!0},{path:"/cardano-updates/page/55",component:p("/cardano-updates/page/55","aa5"),exact:!0},{path:"/cardano-updates/page/56",component:p("/cardano-updates/page/56","f12"),exact:!0},{path:"/cardano-updates/page/57",component:p("/cardano-updates/page/57","4c1"),exact:!0},{path:"/cardano-updates/page/58",component:p("/cardano-updates/page/58","60b"),exact:!0},{path:"/cardano-updates/page/59",component:p("/cardano-updates/page/59","11d"),exact:!0},{path:"/cardano-updates/page/6",component:p("/cardano-updates/page/6","444"),exact:!0},{path:"/cardano-updates/page/60",component:p("/cardano-updates/page/60","468"),exact:!0},{path:"/cardano-updates/page/61",component:p("/cardano-updates/page/61","5e4"),exact:!0},{path:"/cardano-updates/page/7",component:p("/cardano-updates/page/7","c54"),exact:!0},{path:"/cardano-updates/page/8",component:p("/cardano-updates/page/8","3b7"),exact:!0},{path:"/cardano-updates/page/9",component:p("/cardano-updates/page/9","d20"),exact:!0},{path:"/cardano-updates/quarterly",component:p("/cardano-updates/quarterly","968"),exact:!0},{path:"/cardano-updates/quarterly/2022-10-07-node-cli-api",component:p("/cardano-updates/quarterly/2022-10-07-node-cli-api","6ba"),exact:!0},{path:"/cardano-updates/quarterly/2022-11-07-ledger",component:p("/cardano-updates/quarterly/2022-11-07-ledger","bf4"),exact:!0},{path:"/cardano-updates/quarterly/2022-11-09-network",component:p("/cardano-updates/quarterly/2022-11-09-network","8a6"),exact:!0},{path:"/cardano-updates/quarterly/2022-11-15-consensus",component:p("/cardano-updates/quarterly/2022-11-15-consensus","3cf"),exact:!0},{path:"/cardano-updates/quarterly/2023-01-13-network",component:p("/cardano-updates/quarterly/2023-01-13-network","608"),exact:!0},{path:"/cardano-updates/quarterly/2023-01-13-open-source",component:p("/cardano-updates/quarterly/2023-01-13-open-source","ac2"),exact:!0},{path:"/cardano-updates/quarterly/2023-01-18-consensus",component:p("/cardano-updates/quarterly/2023-01-18-consensus","401"),exact:!0},{path:"/cardano-updates/quarterly/2023-04-03-ledger",component:p("/cardano-updates/quarterly/2023-04-03-ledger","719"),exact:!0},{path:"/cardano-updates/quarterly/2023-04-04-network",component:p("/cardano-updates/quarterly/2023-04-04-network","bc4"),exact:!0},{path:"/cardano-updates/quarterly/2023-04-25-consensus",component:p("/cardano-updates/quarterly/2023-04-25-consensus","28b"),exact:!0},{path:"/cardano-updates/quarterly/2023-Q2-consensus",component:p("/cardano-updates/quarterly/2023-Q2-consensus","562"),exact:!0},{path:"/cardano-updates/quarterly/2023-Q2-network",component:p("/cardano-updates/quarterly/2023-Q2-network","6e3"),exact:!0},{path:"/cardano-updates/quarterly/2023-Q2-sre",component:p("/cardano-updates/quarterly/2023-Q2-sre","e4c"),exact:!0},{path:"/cardano-updates/quarterly/2023-Q3-performance-and-tracing",component:p("/cardano-updates/quarterly/2023-Q3-performance-and-tracing","606"),exact:!0},{path:"/cardano-updates/quarterly/2023-Q3-sre",component:p("/cardano-updates/quarterly/2023-Q3-sre","32f"),exact:!0},{path:"/cardano-updates/quarterly/archive",component:p("/cardano-updates/quarterly/archive","c41"),exact:!0},{path:"/cardano-updates/quarterly/page/2",component:p("/cardano-updates/quarterly/page/2","70e"),exact:!0},{path:"/cardano-updates/quarterly/tags",component:p("/cardano-updates/quarterly/tags","d09"),exact:!0},{path:"/cardano-updates/quarterly/tags/cli-api-quarterly",component:p("/cardano-updates/quarterly/tags/cli-api-quarterly","723"),exact:!0},{path:"/cardano-updates/quarterly/tags/consensus",component:p("/cardano-updates/quarterly/tags/consensus","842"),exact:!0},{path:"/cardano-updates/quarterly/tags/ledger",component:p("/cardano-updates/quarterly/tags/ledger","62d"),exact:!0},{path:"/cardano-updates/quarterly/tags/network",component:p("/cardano-updates/quarterly/tags/network","3b9"),exact:!0},{path:"/cardano-updates/quarterly/tags/open-source",component:p("/cardano-updates/quarterly/tags/open-source","03a"),exact:!0},{path:"/cardano-updates/quarterly/tags/performance-tracing",component:p("/cardano-updates/quarterly/tags/performance-tracing","7a7"),exact:!0},{path:"/cardano-updates/quarterly/tags/sre",component:p("/cardano-updates/quarterly/tags/sre","102"),exact:!0},{path:"/cardano-updates/tags",component:p("/cardano-updates/tags","3c0"),exact:!0},{path:"/cardano-updates/tags/cip-1694",component:p("/cardano-updates/tags/cip-1694","a7d"),exact:!0},{path:"/cardano-updates/tags/cli-api",component:p("/cardano-updates/tags/cli-api","cf8"),exact:!0},{path:"/cardano-updates/tags/cli-api/page/2",component:p("/cardano-updates/tags/cli-api/page/2","ab6"),exact:!0},{path:"/cardano-updates/tags/cli-api/page/3",component:p("/cardano-updates/tags/cli-api/page/3","bd2"),exact:!0},{path:"/cardano-updates/tags/cli-api/page/4",component:p("/cardano-updates/tags/cli-api/page/4","8bc"),exact:!0},{path:"/cardano-updates/tags/cli-api/page/5",component:p("/cardano-updates/tags/cli-api/page/5","bfe"),exact:!0},{path:"/cardano-updates/tags/cli-api/page/6",component:p("/cardano-updates/tags/cli-api/page/6","69e"),exact:!0},{path:"/cardano-updates/tags/consensus",component:p("/cardano-updates/tags/consensus","d84"),exact:!0},{path:"/cardano-updates/tags/consensus/page/2",component:p("/cardano-updates/tags/consensus/page/2","56c"),exact:!0},{path:"/cardano-updates/tags/consensus/page/3",component:p("/cardano-updates/tags/consensus/page/3","2c0"),exact:!0},{path:"/cardano-updates/tags/consensus/page/4",component:p("/cardano-updates/tags/consensus/page/4","384"),exact:!0},{path:"/cardano-updates/tags/consensus/page/5",component:p("/cardano-updates/tags/consensus/page/5","af0"),exact:!0},{path:"/cardano-updates/tags/consensus/page/6",component:p("/cardano-updates/tags/consensus/page/6","4a3"),exact:!0},{path:"/cardano-updates/tags/consensus/page/7",component:p("/cardano-updates/tags/consensus/page/7","692"),exact:!0},{path:"/cardano-updates/tags/crypto",component:p("/cardano-updates/tags/crypto","865"),exact:!0},{path:"/cardano-updates/tags/crypto/page/2",component:p("/cardano-updates/tags/crypto/page/2","d35"),exact:!0},{path:"/cardano-updates/tags/crypto/page/3",component:p("/cardano-updates/tags/crypto/page/3","8c2"),exact:!0},{path:"/cardano-updates/tags/crypto/page/4",component:p("/cardano-updates/tags/crypto/page/4","85a"),exact:!0},{path:"/cardano-updates/tags/db-sync",component:p("/cardano-updates/tags/db-sync","5de"),exact:!0},{path:"/cardano-updates/tags/db-sync/page/2",component:p("/cardano-updates/tags/db-sync/page/2","957"),exact:!0},{path:"/cardano-updates/tags/db-sync/page/3",component:p("/cardano-updates/tags/db-sync/page/3","aa5"),exact:!0},{path:"/cardano-updates/tags/devx",component:p("/cardano-updates/tags/devx","b40"),exact:!0},{path:"/cardano-updates/tags/embedding-quality",component:p("/cardano-updates/tags/embedding-quality","49f"),exact:!0},{path:"/cardano-updates/tags/goedel",component:p("/cardano-updates/tags/goedel","6fc"),exact:!0},{path:"/cardano-updates/tags/goedel/page/2",component:p("/cardano-updates/tags/goedel/page/2","2a2"),exact:!0},{path:"/cardano-updates/tags/goedel/page/3",component:p("/cardano-updates/tags/goedel/page/3","6ad"),exact:!0},{path:"/cardano-updates/tags/goedel/page/4",component:p("/cardano-updates/tags/goedel/page/4","5b7"),exact:!0},{path:"/cardano-updates/tags/hydra",component:p("/cardano-updates/tags/hydra","319"),exact:!0},{path:"/cardano-updates/tags/hydra/page/10",component:p("/cardano-updates/tags/hydra/page/10","dbd"),exact:!0},{path:"/cardano-updates/tags/hydra/page/11",component:p("/cardano-updates/tags/hydra/page/11","1ad"),exact:!0},{path:"/cardano-updates/tags/hydra/page/2",component:p("/cardano-updates/tags/hydra/page/2","e33"),exact:!0},{path:"/cardano-updates/tags/hydra/page/3",component:p("/cardano-updates/tags/hydra/page/3","ec8"),exact:!0},{path:"/cardano-updates/tags/hydra/page/4",component:p("/cardano-updates/tags/hydra/page/4","281"),exact:!0},{path:"/cardano-updates/tags/hydra/page/5",component:p("/cardano-updates/tags/hydra/page/5","911"),exact:!0},{path:"/cardano-updates/tags/hydra/page/6",component:p("/cardano-updates/tags/hydra/page/6","319"),exact:!0},{path:"/cardano-updates/tags/hydra/page/7",component:p("/cardano-updates/tags/hydra/page/7","fc5"),exact:!0},{path:"/cardano-updates/tags/hydra/page/8",component:p("/cardano-updates/tags/hydra/page/8","e36"),exact:!0},{path:"/cardano-updates/tags/hydra/page/9",component:p("/cardano-updates/tags/hydra/page/9","344"),exact:!0},{path:"/cardano-updates/tags/ledger",component:p("/cardano-updates/tags/ledger","5cf"),exact:!0},{path:"/cardano-updates/tags/ledger/page/2",component:p("/cardano-updates/tags/ledger/page/2","c91"),exact:!0},{path:"/cardano-updates/tags/ledger/page/3",component:p("/cardano-updates/tags/ledger/page/3","d03"),exact:!0},{path:"/cardano-updates/tags/ledger/page/4",component:p("/cardano-updates/tags/ledger/page/4","754"),exact:!0},{path:"/cardano-updates/tags/ledger/page/5",component:p("/cardano-updates/tags/ledger/page/5","86d"),exact:!0},{path:"/cardano-updates/tags/ledger/page/6",component:p("/cardano-updates/tags/ledger/page/6","9c7"),exact:!0},{path:"/cardano-updates/tags/mithril",component:p("/cardano-updates/tags/mithril","5ea"),exact:!0},{path:"/cardano-updates/tags/mithril/page/2",component:p("/cardano-updates/tags/mithril/page/2","8ae"),exact:!0},{path:"/cardano-updates/tags/mithril/page/3",component:p("/cardano-updates/tags/mithril/page/3","30f"),exact:!0},{path:"/cardano-updates/tags/mithril/page/4",component:p("/cardano-updates/tags/mithril/page/4","c21"),exact:!0},{path:"/cardano-updates/tags/mithril/page/5",component:p("/cardano-updates/tags/mithril/page/5","fc4"),exact:!0},{path:"/cardano-updates/tags/mithril/page/6",component:p("/cardano-updates/tags/mithril/page/6","c91"),exact:!0},{path:"/cardano-updates/tags/mithril/page/7",component:p("/cardano-updates/tags/mithril/page/7","812"),exact:!0},{path:"/cardano-updates/tags/network",component:p("/cardano-updates/tags/network","e9b"),exact:!0},{path:"/cardano-updates/tags/network/page/2",component:p("/cardano-updates/tags/network/page/2","312"),exact:!0},{path:"/cardano-updates/tags/network/page/3",component:p("/cardano-updates/tags/network/page/3","b91"),exact:!0},{path:"/cardano-updates/tags/network/page/4",component:p("/cardano-updates/tags/network/page/4","314"),exact:!0},{path:"/cardano-updates/tags/network/page/5",component:p("/cardano-updates/tags/network/page/5","d89"),exact:!0},{path:"/cardano-updates/tags/open-source",component:p("/cardano-updates/tags/open-source","905"),exact:!0},{path:"/cardano-updates/tags/performance-tracing",component:p("/cardano-updates/tags/performance-tracing","7e4"),exact:!0},{path:"/cardano-updates/tags/performance-tracing/page/2",component:p("/cardano-updates/tags/performance-tracing/page/2","665"),exact:!0},{path:"/cardano-updates/tags/performance-tracing/page/3",component:p("/cardano-updates/tags/performance-tracing/page/3","b14"),exact:!0},{path:"/cardano-updates/tags/performance-tracing/page/4",component:p("/cardano-updates/tags/performance-tracing/page/4","fad"),exact:!0},{path:"/cardano-updates/tags/performance-tracing/page/5",component:p("/cardano-updates/tags/performance-tracing/page/5","f63"),exact:!0},{path:"/cardano-updates/tags/release",component:p("/cardano-updates/tags/release","2e7"),exact:!0},{path:"/cardano-updates/tags/security",component:p("/cardano-updates/tags/security","616"),exact:!0},{path:"/cardano-updates/tags/sre",component:p("/cardano-updates/tags/sre","abe"),exact:!0},{path:"/cardano-updates/tags/sre/page/2",component:p("/cardano-updates/tags/sre/page/2","2a2"),exact:!0},{path:"/cardano-updates/tags/sre/page/3",component:p("/cardano-updates/tags/sre/page/3","7ef"),exact:!0},{path:"/cardano-updates/tags/system-test",component:p("/cardano-updates/tags/system-test","c77"),exact:!0},{path:"/cardano-updates/docs",component:p("/cardano-updates/docs","49f"),routes:[{path:"/cardano-updates/docs/category/tutorial---basics",component:p("/cardano-updates/docs/category/tutorial---basics","14d"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/category/tutorial---extras",component:p("/cardano-updates/docs/category/tutorial---extras","19d"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/intro",component:p("/cardano-updates/docs/intro","433"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-basics/congratulations",component:p("/cardano-updates/docs/tutorial-basics/congratulations","9cd"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-basics/create-a-blog-post",component:p("/cardano-updates/docs/tutorial-basics/create-a-blog-post","ca9"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-basics/create-a-document",component:p("/cardano-updates/docs/tutorial-basics/create-a-document","5bb"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-basics/create-a-page",component:p("/cardano-updates/docs/tutorial-basics/create-a-page","8d5"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-basics/deploy-your-site",component:p("/cardano-updates/docs/tutorial-basics/deploy-your-site","c68"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-basics/markdown-features",component:p("/cardano-updates/docs/tutorial-basics/markdown-features","319"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-extras/manage-docs-versions",component:p("/cardano-updates/docs/tutorial-extras/manage-docs-versions","9eb"),exact:!0,sidebar:"defaultSidebar"},{path:"/cardano-updates/docs/tutorial-extras/translate-your-site",component:p("/cardano-updates/docs/tutorial-extras/translate-your-site","0ea"),exact:!0,sidebar:"defaultSidebar"}]},{path:"/cardano-updates/",component:p("/cardano-updates/","5f5"),exact:!0},{path:"*",component:p("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,t:()=>o});var a=n(67294);const r=a.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{o(!0)}),[]),a.createElement(r.Provider,{value:n},t)}},49383:(e,t,n)=>{"use strict";var a=n(67294),r=n(73935),o=n(73727),c=n(70405),i=n(10412);const d=[n(32497),n(3310),n(18320),n(52295)];var s=n(723),l=n(16550),u=n(18790);function p(e){let{children:t}=e;return a.createElement(a.Fragment,null,t)}var f=n(87462),b=n(35742),g=n(52263),m=n(44996),h=n(86668),y=n(1944),_=n(94711),v=n(19727),w=n(43320),x=n(90197);function k(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,_.l)();return a.createElement(b.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:r}]=e;return a.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:r})})),a.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),r=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,l.TH)();return e+(0,m.Z)(t)}(),o=t?`${n}${t}`:r;return a.createElement(b.Z,null,a.createElement("meta",{property:"og:url",content:o}),a.createElement("link",{rel:"canonical",href:o}))}function S(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,h.L)();return a.createElement(a.Fragment,null,a.createElement(b.Z,null,a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("body",{className:v.h})),n&&a.createElement(y.d,{image:n}),a.createElement(E,null),a.createElement(k,null),a.createElement(x.Z,{tag:w.HX,locale:e}),a.createElement(b.Z,null,t.map(((e,t)=>a.createElement("meta",(0,f.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,u.f)(s.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var A=n(98934),L=n(58940);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];const r=d.map((t=>{const a=t.default?.[e]??t[e];return a?.(...n)}));return()=>r.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,a.useLayoutEffect)((()=>{r!==n&&(r&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);n?.scrollIntoView()}else window.scrollTo(0,0)}(n),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,u.f)(s.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends a.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=i.Z.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return a.createElement(R,{previousLocation:this.previousLocation,location:t},a.createElement(l.AW,{location:t,render:()=>e}))}}const j=O,M="docusaurus-base-url-issue-banner-container",D="docusaurus-base-url-issue-banner",I="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${F}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${F}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${D}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseurl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${I}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${I}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function q(){const{siteConfig:{baseUrl:e}}=(0,g.Z)();return(0,a.useLayoutEffect)((()=>{window[F]=!1}),[]),a.createElement(a.Fragment,null,!i.Z.canUseDOM&&a.createElement(b.Z,null,a.createElement("script",null,B(e))),a.createElement("div",{id:M}))}function z(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,l.TH)();return t&&n===e?a.createElement(q,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,g.Z)(),c=(0,m.Z)(e),{htmlLang:i,direction:d}=o[r];return a.createElement(b.Z,null,a.createElement("html",{lang:i,dir:d}),a.createElement("title",null,t),a.createElement("meta",{property:"og:title",content:t}),a.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&a.createElement("link",{rel:"icon",href:c}))}var $=n(44763);function H(){const e=(0,u.H)(s.Z),t=(0,l.TH)();return a.createElement($.Z,null,a.createElement(L.M,null,a.createElement(A.t,null,a.createElement(p,null,a.createElement(U,null),a.createElement(S,null),a.createElement(z,null),a.createElement(j,{location:T(t)},e)))))}var G=n(16887);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const r=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;r?.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const a=new XMLHttpRequest;a.open("GET",e,!0),a.withCredentials=!0,a.onload=()=>{200===a.status?t():n()},a.send(null)}))};var V=n(99670);const W=new Set,Q=new Set,Y=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,K={prefetch(e){if(!(e=>!Y()&&!Q.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,u.f)(s.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,V.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!Q.has(e))(e)&&(Q.add(e),N(e))},X=Object.freeze(K);if(i.Z.canUseDOM){window.docusaurus=X;const e=r.hydrate;N(window.location.pathname).then((()=>{e(a.createElement(c.B6,null,a.createElement(o.VK,null,a.createElement(H,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>l,M:()=>u});var a=n(67294),r=n(36809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/cardano-updates/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/cardano-updates/docs","mainDocId":"intro","docs":[{"id":"intro","path":"/cardano-updates/docs/intro","sidebar":"defaultSidebar"},{"id":"tutorial-basics/congratulations","path":"/cardano-updates/docs/tutorial-basics/congratulations","sidebar":"defaultSidebar"},{"id":"tutorial-basics/create-a-blog-post","path":"/cardano-updates/docs/tutorial-basics/create-a-blog-post","sidebar":"defaultSidebar"},{"id":"tutorial-basics/create-a-document","path":"/cardano-updates/docs/tutorial-basics/create-a-document","sidebar":"defaultSidebar"},{"id":"tutorial-basics/create-a-page","path":"/cardano-updates/docs/tutorial-basics/create-a-page","sidebar":"defaultSidebar"},{"id":"tutorial-basics/deploy-your-site","path":"/cardano-updates/docs/tutorial-basics/deploy-your-site","sidebar":"defaultSidebar"},{"id":"tutorial-basics/markdown-features","path":"/cardano-updates/docs/tutorial-basics/markdown-features","sidebar":"defaultSidebar"},{"id":"tutorial-extras/manage-docs-versions","path":"/cardano-updates/docs/tutorial-extras/manage-docs-versions","sidebar":"defaultSidebar"},{"id":"tutorial-extras/translate-your-site","path":"/cardano-updates/docs/tutorial-extras/translate-your-site","sidebar":"defaultSidebar"},{"id":"/category/tutorial---basics","path":"/cardano-updates/docs/category/tutorial---basics","sidebar":"defaultSidebar"},{"id":"/category/tutorial---extras","path":"/cardano-updates/docs/category/tutorial---extras","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/cardano-updates/docs/intro","label":"intro"}}}}],"breadcrumbs":true}}}'),c=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var i=n(57529);const d=JSON.parse('{"docusaurusVersion":"2.2.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.2.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.2.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.2.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.2.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.2.0"}}}'),s={siteConfig:r.default,siteMetadata:d,globalData:o,i18n:c,codeTranslations:i},l=a.createContext(s);function u(e){let{children:t}=e;return a.createElement(l.Provider,{value:s},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var a=n(67294),r=n(10412),o=n(35742),c=n(93285);function i(e){let{error:t,tryAgain:n}=e;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},a.createElement("h1",null,"This page crashed."),a.createElement("p",null,t.message),a.createElement("button",{type:"button",onClick:n},"Try again"))}function d(e){let{error:t,tryAgain:n}=e;return a.createElement(l,{fallback:()=>a.createElement(i,{error:t,tryAgain:n})},a.createElement(o.Z,null,a.createElement("title",null,"Page Error")),a.createElement(c.Z,null,a.createElement(i,{error:t,tryAgain:n})))}const s=e=>a.createElement(d,e);class l extends a.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){r.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??s)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const a="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,r={canUseDOM:a,canUseEventListeners:a&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:a&&"IntersectionObserver"in window,canUseViewport:a&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(70405);function o(e){return a.createElement(r.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(87462),r=n(67294),o=n(73727),c=n(18780),i=n(52263),d=n(13919),s=n(10412);const l=r.createContext({collectLink:()=>{}});var u=n(44996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:b,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:h=!0,...y}=e;const{siteConfig:{trailingSlash:_,baseUrl:v}}=(0,i.Z)(),{withBaseUrl:w}=(0,u.C)(),x=(0,r.useContext)(l),k=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>k.current));const E=p||f;const S=(0,d.Z)(E),C=E?.replace("pathname://","");let T=void 0!==C?(A=C,h&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;T&&S&&(T=(0,c.applyTrailingSlash)(T,{trailingSlash:_,baseUrl:v}));const L=(0,r.useRef)(!1),P=n?o.OL:o.rU,R=s.Z.canUseIntersectionObserver,N=(0,r.useRef)(),O=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,r.useEffect)((()=>(!R&&S&&null!=T&&window.docusaurus.prefetch(T),()=>{R&&N.current&&N.current.disconnect()})),[N,T,R,S]);const j=T?.startsWith("#")??!1,M=!T||!S||j;return M||m||x.collectLink(T),M?r.createElement("a",(0,a.Z)({ref:k,href:T},E&&!S&&{target:"_blank",rel:"noopener noreferrer"},y)):r.createElement(P,(0,a.Z)({},y,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{k.current=e,R&&e&&S&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T},n&&{isActive:g,activeClassName:b}))}const f=r.forwardRef(p)},11875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=()=>null},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d,I:()=>i});var a=n(67294);function r(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,a.isValidElement)(e)))?n.map(((e,t)=>(0,a.isValidElement)(e)?a.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(57529);function c(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function i(e,t){let{message:n,id:a}=e;return r(c({message:n,id:a}),t)}function d(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=c({message:t,id:n});return a.createElement(a.Fragment,null,r(i,o))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>a});const a="default"},13919:(e,t,n)=>{"use strict";function a(e){return/^(?:\w*:|\/\/)/.test(e)}function r(e){return void 0!==e&&!a(e)}n.d(t,{Z:()=>r,b:()=>a})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>c});var a=n(52263),r=n(13919);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)();return{withBaseUrl:(n,a)=>function(e,t,n,a){let{forcePrependBaseUrl:o=!1,absolute:c=!1}=void 0===a?{}:a;if(!n||n.startsWith("#")||(0,r.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const i=n.startsWith(t)?n:t+n.replace(/^\//,"");return c?e+i:i}(t,e,n,a)}}function c(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(58940);function o(){return(0,a.useContext)(r._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(98934);function o(){return(0,a.useContext)(r._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const a=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[o,c]=n;const i=r?`${r}.${o}`:o;a(c)?e(c,i):t[i]=c}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>r,z:()=>o});var a=n(67294);const r=a.createContext(null);function o(e){let{children:t,value:n}=e;const o=a.useContext(r),c=(0,a.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const a={...t.data,...n?.data};return{plugin:t.plugin,data:a}}({parent:o,value:n})),[o,n]);return a.createElement(r.Provider,{value:c},t)}},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>p,_r:()=>l,Jo:()=>m,zh:()=>u,yW:()=>b,gB:()=>f});var a=n(16550),r=n(52263),o=n(29935);function c(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const i=e=>e.versions.find((e=>e.isLast));function d(e,t){const n=function(e,t){const n=i(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,a.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),r=n?.docs.find((e=>!!(0,a.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:r,alternateDocVersions:r?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((a=>{a.id===t&&(n[e.name]=a)}))})),n}(r.id):{}}}const s={},l=()=>c("docusaurus-plugin-content-docs")??s,u=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const a=c(e),r=a?.[t];if(!r&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return r}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=l(),{pathname:n}=(0,a.TH)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,a.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return u(e).versions}function b(e){const t=u(e);return i(t)}function g(e){const t=u(e),{pathname:n}=(0,a.TH)();return d(t,n)}function m(e){const t=u(e),{pathname:n}=(0,a.TH)();return function(e,t){const n=i(e);return{latestDocSuggestion:d(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var a=n(74865),r=n.n(a);r().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{r().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){r().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var a=n(87410),r=n(36809);!function(e){const{themeConfig:{prism:t}}=r.default,{additionalLanguages:a}=t;globalThis.Prism=e,a.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(a.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294);const r={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return a.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink},a.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},93285:(e,t,n)=>{"use strict";n.d(t,{Z:()=>dt});var a=n(67294),r=n(86010),o=n(44763),c=n(1944),i=n(87462),d=n(16550),s=n(95999),l=n(85936);const u="docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,a.useRef)(null),{action:t}=(0,d.k6)(),n=(0,a.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(u);t&&p(t)}),[]);return(0,l.S)((n=>{let{location:a}=n;e.current&&!a.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const b=(0,s.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??b,{containerRef:n,onClick:r}=f();return a.createElement("div",{ref:n,role:"region","aria-label":b},a.createElement("a",(0,i.Z)({},e,{href:`#${u}`,onClick:r}),t))}var m=n(35281),h=n(19727);const y={skipToContent:"skipToContent_fXgn"};function _(){return a.createElement(g,{className:y.skipToContent})}var v=n(86668),w=n(59689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:c,...d}=e;return a.createElement("svg",(0,i.Z)({viewBox:"0 0 15 15",width:t,height:n},d),a.createElement("g",{stroke:r,strokeWidth:o},a.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const k={closeButton:"closeButton_CVFx"};function E(e){return a.createElement("button",(0,i.Z)({type:"button","aria-label":(0,s.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,r.Z)("clean-btn close",k.closeButton,e.className)}),a.createElement(x,{width:14,height:14,strokeWidth:3.1}))}const S={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,v.L)(),{content:n}=t;return a.createElement("div",(0,i.Z)({},e,{className:(0,r.Z)(S.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,v.L)(),{isActive:t,close:n}=(0,w.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:c}=e;return a.createElement("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner"},c&&a.createElement("div",{className:T.announcementBarPlaceholder}),a.createElement(C,{className:T.announcementBarContent}),c&&a.createElement(E,{onClick:n,className:T.announcementBarClose}))}var L=n(72961),P=n(12466);var R=n(902),N=n(13102);const O=a.createContext(null);function j(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,N.HY)(),[n,r]=(0,a.useState)(!1),o=null!==t.component,c=(0,R.D9)(o);return(0,a.useEffect)((()=>{o&&!c&&r(!0)}),[o,c]),(0,a.useEffect)((()=>{o?e.shown||r(!0):r(!1)}),[e.shown,o]),(0,a.useMemo)((()=>[n,r]),[n])}();return a.createElement(O.Provider,{value:n},t)}function M(e){if(e.component){const t=e.component;return a.createElement(t,e.props)}}function D(){const e=(0,a.useContext)(O);if(!e)throw new R.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,r=(0,a.useCallback)((()=>n(!1)),[n]),o=(0,N.HY)();return(0,a.useMemo)((()=>({shown:t,hide:r,content:M(o)})),[r,o,t])}function I(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:c}=D();return a.createElement("div",{className:"navbar-sidebar"},t,a.createElement("div",{className:(0,r.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":c})},a.createElement("div",{className:"navbar-sidebar__item menu"},n),a.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var F=n(92949),B=n(72389);function q(e){return a.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function z(e){return a.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,value:n,onChange:o}=e;const c=(0,B.Z)(),i=(0,s.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,s.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return a.createElement("div",{className:(0,r.Z)(U.toggle,t)},a.createElement("button",{className:(0,r.Z)("clean-btn",U.toggleButton,!c&&U.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!c,title:i,"aria-label":i,"aria-live":"polite"},a.createElement(q,{className:(0,r.Z)(U.toggleIcon,U.lightToggleIcon)}),a.createElement(z,{className:(0,r.Z)(U.toggleIcon,U.darkToggleIcon)})))}const H=a.memo($);function G(e){let{className:t}=e;const n=(0,v.L)().colorMode.disableSwitch,{colorMode:r,setColorMode:o}=(0,F.I)();return n?null:a.createElement(H,{className:t,value:r,onChange:o})}var Z=n(21327);function V(){return a.createElement(Z.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function W(){const e=(0,L.e)();return a.createElement("button",{type:"button","aria-label":(0,s.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},a.createElement(x,{color:"var(--ifm-color-emphasis-600)"}))}function Q(){return a.createElement("div",{className:"navbar-sidebar__brand"},a.createElement(V,null),a.createElement(G,{className:"margin-right--md"}),a.createElement(W,null))}var Y=n(39960),K=n(44996),X=n(13919);function J(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var ee=n(39471);function te(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:c,html:d,isDropdownLink:s,prependBaseUrlToHref:l,...u}=e;const p=(0,K.Z)(r),f=(0,K.Z)(t),b=(0,K.Z)(o,{forcePrependBaseUrl:!0}),g=c&&o&&!(0,X.Z)(o),m=d?{dangerouslySetInnerHTML:{__html:d}}:{children:a.createElement(a.Fragment,null,c,g&&a.createElement(ee.Z,s&&{width:12,height:12}))};return o?a.createElement(Y.Z,(0,i.Z)({href:l?b:o},u,m)):a.createElement(Y.Z,(0,i.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?J(n,t.pathname):t.pathname.startsWith(f)},u,m))}function ne(e){let{className:t,isDropdownItem:n=!1,...o}=e;const c=a.createElement(te,(0,i.Z)({className:(0,r.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?a.createElement("li",null,c):c}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return a.createElement("li",{className:"menu__list-item"},a.createElement(te,(0,i.Z)({className:(0,r.Z)("menu__link",t)},o)))}function re(e){let{mobile:t=!1,position:n,...r}=e;const o=t?ae:ne;return a.createElement(o,(0,i.Z)({},r,{activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var oe=n(86043),ce=n(48596),ie=n(52263);function de(e,t){return e.some((e=>function(e,t){return!!(0,ce.Mg)(e.to,t)||!!J(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function se(e){let{items:t,position:n,className:o,onClick:c,...d}=e;const s=(0,a.useRef)(null),[l,u]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&u(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[s]),a.createElement("div",{ref:s,className:(0,r.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":l})},a.createElement(te,(0,i.Z)({"aria-haspopup":"true","aria-expanded":l,role:"button",href:d.to?void 0:"#",className:(0,r.Z)("navbar__link",o)},d,{onClick:d.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),u(!l))}}),d.children??d.label),a.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>a.createElement(ke,(0,i.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),u(!1);const t=s.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function le(e){let{items:t,className:n,position:o,onClick:c,...s}=e;const l=function(){const{siteConfig:{baseUrl:e}}=(0,ie.Z)(),{pathname:t}=(0,d.TH)();return t.replace(e,"/")}(),u=de(t,l),{collapsed:p,toggleCollapsed:f,setCollapsed:b}=(0,oe.u)({initialState:()=>!u});return(0,a.useEffect)((()=>{u&&b(!u)}),[l,u,b]),a.createElement("li",{className:(0,r.Z)("menu__list-item",{"menu__list-item--collapsed":p})},a.createElement(te,(0,i.Z)({role:"button",className:(0,r.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},s,{onClick:e=>{e.preventDefault(),f()}}),s.children??s.label),a.createElement(oe.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>a.createElement(ke,(0,i.Z)({mobile:!0,isDropdownItem:!0,onClick:c,activeClassName:"menu__link--active"},e,{key:t}))))))}function ue(e){let{mobile:t=!1,...n}=e;const r=t?le:se;return a.createElement(r,n)}var pe=n(94711);function fe(e){let{width:t=20,height:n=20,...r}=e;return a.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},r),a.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const be="iconLanguage_nlXk";var ge=n(11875);const me={searchBox:"searchBox_ZlJk"};function he(e){let{children:t,className:n}=e;return a.createElement("div",{className:(0,r.Z)(n,me.searchBox)},t)}var ye=n(80143),_e=n(52802);var ve=n(60373);const we=e=>e.docs.find((t=>t.id===e.mainDocId));const xe={default:re,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,...o}=e;const{i18n:{currentLocale:c,locales:l,localeConfigs:u}}=(0,ie.Z)(),p=(0,pe.l)(),{search:f,hash:b}=(0,d.TH)(),g=[...n,...l.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${b}`;return{label:u[e].label,lang:u[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===c?t?"menu__link--active":"dropdown__link--active":""}})),...r],m=t?(0,s.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):u[c].label;return a.createElement(ue,(0,i.Z)({},o,{mobile:t,label:a.createElement(a.Fragment,null,a.createElement(fe,{className:be}),m),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:a.createElement(he,{className:n},a.createElement(ge.Z,null))},dropdown:ue,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:c=!1}=e;const i=c?"li":"div";return a.createElement(i,{className:(0,r.Z)({navbar__item:!o&&!c,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:c}=(0,ye.Iw)(r),d=(0,_e.vY)(t,r);return null===d?null:a.createElement(re,(0,i.Z)({exact:!0},o,{isActive:()=>c?.path===d.path||!!c?.sidebar&&c.sidebar===d.sidebar,label:n??d.id,to:d.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:c}=(0,ye.Iw)(r),d=(0,_e.oz)(t,r).link;if(!d)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return a.createElement(re,(0,i.Z)({exact:!0},o,{isActive:()=>c?.sidebar===t,label:n??d.label,to:d.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const c=(0,_e.lO)(r)[0],d=t??c.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(c).path;return a.createElement(re,(0,i.Z)({},o,{label:d,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:c,...l}=e;const{search:u,hash:p}=(0,d.TH)(),f=(0,ye.Iw)(n),b=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,ve.J)(n),m=[...o,...b.map((e=>{const t=f.alternateDocVersions[e.name]??we(e);return{label:e.label,to:`${t.path}${u}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...c],h=(0,_e.lO)(n)[0],y=t&&m.length>1?(0,s.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,_=t&&m.length>1?void 0:we(h).path;return m.length<=1?a.createElement(re,(0,i.Z)({},l,{mobile:t,label:y,to:_,isActive:r?()=>!1:void 0})):a.createElement(ue,(0,i.Z)({},l,{mobile:t,label:y,to:_,items:m,isActive:r?()=>!1:void 0}))}};function ke(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=xe[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return a.createElement(o,n)}function Ee(){const e=(0,L.e)(),t=(0,v.L)().navbar.items;return a.createElement("ul",{className:"menu__list"},t.map(((t,n)=>a.createElement(ke,(0,i.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Se(e){return a.createElement("button",(0,i.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),a.createElement(s.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ce(){const e=0===(0,v.L)().navbar.items.length,t=D();return a.createElement(a.Fragment,null,!e&&a.createElement(Se,{onClick:()=>t.hide()}),t.content)}function Te(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,a.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?a.createElement(I,{header:a.createElement(Q,null),primaryMenu:a.createElement(Ee,null),secondaryMenu:a.createElement(Ce,null)}):null}const Ae={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return a.createElement("div",(0,i.Z)({role:"presentation"},e,{className:(0,r.Z)("navbar-sidebar__backdrop",e.className)}))}function Pe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,v.L)(),c=(0,L.e)(),{navbarRef:i,isNavbarVisible:d}=function(e){const[t,n]=(0,a.useState)(e),r=(0,a.useRef)(!1),o=(0,a.useRef)(0),c=(0,a.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,P.RF)(((t,a)=>{let{scrollY:c}=t;if(!e)return;if(c<o.current)return void n(!0);if(r.current)return void(r.current=!1);const i=a?.scrollY,d=document.documentElement.scrollHeight-o.current,s=window.innerHeight;i&&c>=i?n(!1):c+s<d&&n(!0)})),(0,l.S)((t=>{if(!e)return;const a=t.location.hash;if(a?document.getElementById(a.substring(1)):void 0)return r.current=!0,void n(!1);n(!0)})),{navbarRef:c,isNavbarVisible:t}}(n);return a.createElement("nav",{ref:i,className:(0,r.Z)("navbar","navbar--fixed-top",n&&[Ae.navbarHideable,!d&&Ae.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":c.shown})},t,a.createElement(Le,{onClick:c.toggle}),a.createElement(Te,null))}const Re="right";function Ne(e){let{width:t=30,height:n=30,className:r,...o}=e;return a.createElement("svg",(0,i.Z)({className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Oe(){const{toggle:e,shown:t}=(0,L.e)();return a.createElement("button",{onClick:e,"aria-label":(0,s.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},a.createElement(Ne,null))}const je={colorModeToggle:"colorModeToggle_DEke"};function Me(e){let{items:t}=e;return a.createElement(a.Fragment,null,t.map(((e,t)=>a.createElement(ke,(0,i.Z)({},e,{key:t})))))}function De(e){let{left:t,right:n}=e;return a.createElement("div",{className:"navbar__inner"},a.createElement("div",{className:"navbar__items"},t),a.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ie(){const e=(0,L.e)(),t=(0,v.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Re)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return a.createElement(De,{left:a.createElement(a.Fragment,null,!e.disabled&&a.createElement(Oe,null),a.createElement(V,null),a.createElement(Me,{items:n})),right:a.createElement(a.Fragment,null,a.createElement(Me,{items:r}),a.createElement(G,{className:je.colorModeToggle}),!o&&a.createElement(he,null,a.createElement(ge.Z,null)))})}function Fe(){return a.createElement(Pe,null,a.createElement(Ie,null))}function Be(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:c,...d}=t,s=(0,K.Z)(n),l=(0,K.Z)(r,{forcePrependBaseUrl:!0});return a.createElement(Y.Z,(0,i.Z)({className:"footer__link-item"},r?{href:c?l:r}:{to:s},d),o,r&&!(0,X.Z)(r)&&a.createElement(ee.Z,null))}function qe(e){let{item:t}=e;return t.html?a.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement("li",{key:t.href??t.to,className:"footer__item"},a.createElement(Be,{item:t}))}function ze(e){let{column:t}=e;return a.createElement("div",{className:"col footer__col"},a.createElement("div",{className:"footer__title"},t.title),a.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>a.createElement(qe,{key:t,item:e})))))}function Ue(e){let{columns:t}=e;return a.createElement("div",{className:"row footer__links"},t.map(((e,t)=>a.createElement(ze,{key:t,column:e}))))}function $e(){return a.createElement("span",{className:"footer__link-separator"},"\xb7")}function He(e){let{item:t}=e;return t.html?a.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement(Be,{item:t})}function Ge(e){let{links:t}=e;return a.createElement("div",{className:"footer__links text--center"},a.createElement("div",{className:"footer__links"},t.map(((e,n)=>a.createElement(a.Fragment,{key:n},a.createElement(He,{item:e}),t.length!==n+1&&a.createElement($e,null))))))}function Ze(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?a.createElement(Ue,{columns:t}):a.createElement(Ge,{links:t})}var Ve=n(50941);const We={footerLogoLink:"footerLogoLink_BH7S"};function Qe(e){let{logo:t}=e;const{withBaseUrl:n}=(0,K.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return a.createElement(Ve.Z,{className:(0,r.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function Ye(e){let{logo:t}=e;return t.href?a.createElement(Y.Z,{href:t.href,className:We.footerLogoLink,target:t.target},a.createElement(Qe,{logo:t})):a.createElement(Qe,{logo:t})}function Ke(e){let{copyright:t}=e;return a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Xe(e){let{style:t,links:n,logo:o,copyright:c}=e;return a.createElement("footer",{className:(0,r.Z)("footer",{"footer--dark":"dark"===t})},a.createElement("div",{className:"container container-fluid"},n,(o||c)&&a.createElement("div",{className:"footer__bottom text--center"},o&&a.createElement("div",{className:"margin-bottom--sm"},o),c)))}function Je(){const{footer:e}=(0,v.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return a.createElement(Xe,{style:o,links:n&&n.length>0&&a.createElement(Ze,{links:n}),logo:r&&a.createElement(Ye,{logo:r}),copyright:t&&a.createElement(Ke,{copyright:t})})}const et=a.memo(Je);var tt=n(50012);const nt="docusaurus.tab.",at=a.createContext(void 0);const rt=(0,R.Qc)([F.S,w.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,a.useState)({}),n=(0,a.useCallback)(((e,t)=>{(0,tt.W)(`${nt}${e}`).set(t)}),[]);(0,a.useEffect)((()=>{try{const e={};(0,tt._)().forEach((t=>{if(t.startsWith(nt)){const n=t.substring(nt.length);e[n]=(0,tt.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const r=(0,a.useCallback)(((e,a)=>{t((t=>({...t,[e]:a}))),n(e,a)}),[n]);return(0,a.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:r})),[e,r])}();return a.createElement(at.Provider,{value:n},t)},P.OC,ve.L5,c.VC,function(e){let{children:t}=e;return a.createElement(N.n2,null,a.createElement(L.M,null,a.createElement(j,null,t)))}]);function ot(e){let{children:t}=e;return a.createElement(rt,null,t)}function ct(e){let{error:t,tryAgain:n}=e;return a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(s.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),a.createElement("p",null,t.message),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},a.createElement(s.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const it={mainWrapper:"mainWrapper_z2l0"};function dt(e){const{children:t,noFooter:n,wrapperClassName:i,title:d,description:s}=e;return(0,h.t)(),a.createElement(ot,null,a.createElement(c.d,{title:d,description:s}),a.createElement(_,null),a.createElement(A,null),a.createElement(Fe,null),a.createElement("div",{id:u,className:(0,r.Z)(m.k.wrapper.main,it.mainWrapper,i)},a.createElement(o.Z,{fallback:e=>a.createElement(ct,e)},t)),!n&&a.createElement(et,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(87462),r=n(67294),o=n(39960),c=n(44996),i=n(52263),d=n(86668),s=n(50941);function l(e){let{logo:t,alt:n,imageClassName:a}=e;const o={light:(0,c.Z)(t.src),dark:(0,c.Z)(t.srcDark||t.src)},i=r.createElement(s.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return a?r.createElement("div",{className:a},i):i}function u(e){const{siteConfig:{title:t}}=(0,i.Z)(),{navbar:{title:n,logo:s}}=(0,d.L)(),{imageClassName:u,titleClassName:p,...f}=e,b=(0,c.Z)(s?.href||"/"),g=n?"":t,m=s?.alt??g;return r.createElement(o.Z,(0,a.Z)({to:b},f,s?.target&&{target:s.target}),s&&r.createElement(l,{logo:s,alt:m,imageClassName:u}),null!=n&&r.createElement("b",{className:p},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=n(67294),r=n(35742);function o(e){let{locale:t,version:n,tag:o}=e;const c=t;return a.createElement(r.Z,null,t&&a.createElement("meta",{name:"docusaurus_locale",content:t}),n&&a.createElement("meta",{name:"docusaurus_version",content:n}),o&&a.createElement("meta",{name:"docusaurus_tag",content:o}),c&&a.createElement("meta",{name:"docsearch:language",content:c}),n&&a.createElement("meta",{name:"docsearch:version",content:n}),o&&a.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var a=n(87462),r=n(67294),o=n(86010),c=n(72389),i=n(92949);const d={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function s(e){const t=(0,c.Z)(),{colorMode:n}=(0,i.I)(),{sources:s,className:l,alt:u,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return r.createElement(r.Fragment,null,f.map((e=>r.createElement("img",(0,a.Z)({key:e,src:s[e],alt:u,className:(0,o.Z)(d.themedImage,d[`themedImage--${e}`],l)},p)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>g});var a=n(87462),r=n(67294),o=n(10412);const c="ease-in-out";function i(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const d={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function l(e,t){const n=t?d:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??c}`,height:`${t}px`}}function i(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return l(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=d.height,e.style.overflow=d.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function p(e){if(!o.Z.canUseDOM)return e?d:s}function f(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:c,className:i,disableSSRStyle:d}=e;const s=(0,r.useRef)(null);return u({collapsibleRef:s,collapsed:n,animation:o}),r.createElement(t,{ref:s,style:d?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(l(s.current,n),c?.(n))},className:i},a)}function b(e){let{collapsed:t,...n}=e;const[o,c]=(0,r.useState)(!t),[i,d]=(0,r.useState)(t);return(0,r.useLayoutEffect)((()=>{t||c(!0)}),[t]),(0,r.useLayoutEffect)((()=>{o&&d(t)}),[o,t]),o?r.createElement(f,(0,a.Z)({},n,{collapsed:i})):null}function g(e){let{lazy:t,...n}=e;const a=t?b:f;return r.createElement(a,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>b,pl:()=>f});var a=n(67294),r=n(72389),o=n(50012),c=n(902),i=n(86668);const d=(0,o.W)("docusaurus.announcement.dismiss"),s=(0,o.W)("docusaurus.announcement.id"),l=()=>"true"===d.get(),u=e=>d.set(String(e)),p=a.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,i.L)(),t=(0,r.Z)(),[n,o]=(0,a.useState)((()=>!!t&&l()));(0,a.useEffect)((()=>{o(l())}),[]);const c=(0,a.useCallback)((()=>{u(!0),o(!0)}),[]);return(0,a.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=s.get();"annoucement-bar"===n&&(n="announcement-bar");const a=t!==n;s.set(t),a&&u(!1),!a&&l()||o(!1)}),[e]),(0,a.useMemo)((()=>({isActive:!!e&&!n,close:c})),[e,n,c])}();return a.createElement(p.Provider,{value:n},t)}function b(){const e=(0,a.useContext)(p);if(!e)throw new c.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>m,S:()=>g});var a=n(67294),r=n(10412),o=n(902),c=n(50012),i=n(86668);const d=a.createContext(void 0),s="theme",l=(0,c.W)(s),u={light:"light",dark:"dark"},p=e=>e===u.dark?u.dark:u.light,f=e=>r.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),b=e=>{l.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,i.L)(),[r,o]=(0,a.useState)(f(e));(0,a.useEffect)((()=>{t&&l.del()}),[t]);const c=(0,a.useCallback)((function(t,a){void 0===a&&(a={});const{persist:r=!0}=a;t?(o(t),r&&b(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?u.dark:u.light:e),l.del())}),[n,e]);(0,a.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(r))}),[r]),(0,a.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==s)return;const t=l.get();null!==t&&c(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,c]);const d=(0,a.useRef)(!1);return(0,a.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),a=()=>{window.matchMedia("print").matches||d.current?d.current=window.matchMedia("print").matches:c(null)};return e.addListener(a),()=>e.removeListener(a)}),[c,t,n]),(0,a.useMemo)((()=>({colorMode:r,setColorMode:c,get isDarkTheme(){return r===u.dark},setLightTheme(){c(u.light)},setDarkTheme(){c(u.dark)}})),[r,c])}();return a.createElement(d.Provider,{value:n},t)}function m(){const e=(0,a.useContext)(d);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>m});var a=n(67294),r=n(80143),o=n(29935),c=n(86668),i=n(52802),d=n(902),s=n(50012);const l=e=>`docs-preferred-version-${e}`,u={save:(e,t,n)=>{(0,s.W)(l(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.W)(l(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.W)(l(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=a.createContext(null);function b(){const e=(0,r._r)(),t=(0,c.L)().docs.versionPersistence,n=(0,a.useMemo)((()=>Object.keys(e)),[e]),[o,i]=(0,a.useState)((()=>p(n)));(0,a.useEffect)((()=>{i(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:a}=e;function r(e){const t=u.read(e,n);return a[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(u.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,r(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,a.useMemo)((()=>({savePreferredVersion:function(e,n){u.save(e,t,n),i((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=b();return a.createElement(f.Provider,{value:n},t)}function m(e){let{children:t}=e;return i.cE?a.createElement(g,null,t):a.createElement(a.Fragment,null,t)}function h(){const e=(0,a.useContext)(f);if(!e)throw new d.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.m);const t=(0,r.zh)(e),[n,c]=h(),{preferredVersionName:i}=n[e];return{preferredVersion:t.versions.find((e=>e.name===i))??null,savePreferredVersionName:(0,a.useCallback)((t=>{c.savePreferredVersion(e,t)}),[c,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>d,b:()=>i});var a=n(67294),r=n(902);const o=Symbol("EmptyContext"),c=a.createContext(o);function i(e){let{children:t,name:n,items:r}=e;const o=(0,a.useMemo)((()=>n&&r?{name:n,items:r}:null),[n,r]);return a.createElement(c.Provider,{value:o},t)}function d(){const e=(0,a.useContext)(c);if(e===o)throw new r.i6("DocsSidebarProvider");return e}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>i,q:()=>c});var a=n(67294),r=n(902);const o=a.createContext(null);function c(e){let{children:t,version:n}=e;return a.createElement(o.Provider,{value:n},t)}function i(){const e=(0,a.useContext)(o);if(null===e)throw new r.i6("DocsVersionProvider");return e}},72961:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var a=n(67294),r=n(13102),o=n(87524),c=n(16550),i=n(902);function d(e){!function(e){const t=(0,c.k6)(),n=(0,i.zX)(e);(0,a.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var s=n(86668);const l=a.createContext(void 0);function u(){const e=function(){const e=(0,r.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[c,i]=(0,a.useState)(!1);d((()=>{if(c)return i(!1),!1}));const l=(0,a.useCallback)((()=>{i((e=>!e))}),[]);return(0,a.useEffect)((()=>{"desktop"===t&&i(!1)}),[t]),(0,a.useMemo)((()=>({disabled:e,shouldRender:n,toggle:l,shown:c})),[e,n,l,c])}function p(e){let{children:t}=e;const n=u();return a.createElement(l.Provider,{value:n},t)}function f(){const e=a.useContext(l);if(void 0===e)throw new i.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>i,Zo:()=>d,n2:()=>c});var a=n(67294),r=n(902);const o=a.createContext(null);function c(e){let{children:t}=e;const n=(0,a.useState)({component:null,props:null});return a.createElement(o.Provider,{value:n},t)}function i(){const e=(0,a.useContext)(o);if(!e)throw new r.i6("NavbarSecondaryMenuContentProvider");return e[0]}function d(e){let{component:t,props:n}=e;const c=(0,a.useContext)(o);if(!c)throw new r.i6("NavbarSecondaryMenuContentProvider");const[,i]=c,d=(0,r.Ql)(n);return(0,a.useEffect)((()=>{i({component:t,props:d})}),[i,t,d]),(0,a.useEffect)((()=>()=>i({component:null,props:null})),[i]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>r,t:()=>o});var a=n(67294);const r="navigation-with-keyboard";function o(){(0,a.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(r),"mousedown"===e.type&&document.body.classList.remove(r)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(r),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var a=n(67294),r=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},c=996;function i(){return r.Z.canUseDOM?window.innerWidth>c?o.desktop:o.mobile:o.ssr}const d=!1;function s(){const[e,t]=(0,a.useState)((()=>d?"ssr":i()));return(0,a.useEffect)((()=>{function e(){t(i())}const n=d?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>a});const a={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},52802:(e,t,n)=>{"use strict";n.d(t,{MN:()=>S,Wl:()=>b,_F:()=>y,cE:()=>p,jA:()=>g,xz:()=>f,hI:()=>E,lO:()=>w,vY:()=>k,oz:()=>x,s1:()=>v});var a=n(67294),r=n(16550),o=n(18790),c=n(80143),i=n(60373),d=n(74477),s=n(1116);function l(e){return Array.from(new Set(e))}var u=n(48596);const p=!!c._r;function f(e){const t=(0,d.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function b(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=b(t);if(e)return e}}}function g(){const{pathname:e}=(0,r.TH)(),t=(0,s.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=_({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),h=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function _(e){let{sidebarItems:t,pathname:n,onlyCategories:a=!1}=e;const r=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return a&&"category"!==o.type||r.unshift(o),!0}return!1}(t),r}function v(){const e=(0,s.V)(),{pathname:t}=(0,r.TH)(),n=(0,c.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?_({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,c.Iw)(e),{preferredVersion:n}=(0,i.J)(e),r=(0,c.yW)(e);return(0,a.useMemo)((()=>l([t,n,r].filter(Boolean))),[t,n,r])}function x(e,t){const n=w(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),a=t.find((t=>t[0]===e));if(!a)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return a[1]}),[e,n])}function k(e,t){const n=w(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),a=t.find((t=>t.id===e));if(!a){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${l(t.map((e=>e.id))).join("\n- ")}`)}return a}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const a=(0,r.TH)(),c=t.routes,i=c.find((e=>(0,r.LX)(a.pathname,e)));if(!i)return null;const d=i.sidebar,s=d?n.docsSidebars[d]:void 0;return{docElement:(0,o.H)(c),sidebarName:d,sidebarItems:s}}function S(e){return e.filter((e=>"category"!==e.type||!!b(e)))}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>l,VC:()=>f});var a=n(67294),r=n(86010),o=n(35742),c=n(30226);function i(){const e=a.useContext(c._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var d=n(44996),s=n(52263);function l(e){let{title:t,description:n,keywords:r,image:c,children:i}=e;const l=function(e){const{siteConfig:t}=(0,s.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}(t),{withBaseUrl:u}=(0,d.C)(),p=c?u(c,{absolute:!0}):void 0;return a.createElement(o.Z,null,t&&a.createElement("title",null,l),t&&a.createElement("meta",{property:"og:title",content:l}),n&&a.createElement("meta",{name:"description",content:n}),n&&a.createElement("meta",{property:"og:description",content:n}),r&&a.createElement("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&a.createElement("meta",{property:"og:image",content:p}),p&&a.createElement("meta",{name:"twitter:image",content:p}),i)}const u=a.createContext(void 0);function p(e){let{className:t,children:n}=e;const c=a.useContext(u),i=(0,r.Z)(c,t);return a.createElement(u.Provider,{value:i},a.createElement(o.Z,null,a.createElement("html",{className:i})),n)}function f(e){let{children:t}=e;const n=i(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const c=`plugin-id-${n.plugin.id}`;return a.createElement(p,{className:(0,r.Z)(o,c)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>c,Qc:()=>s,Ql:()=>d,i6:()=>i,zX:()=>o});var a=n(67294);const r=n(10412).Z.canUseDOM?a.useLayoutEffect:a.useEffect;function o(e){const t=(0,a.useRef)(e);return r((()=>{t.current=e}),[e]),(0,a.useCallback)((function(){return t.current(...arguments)}),[])}function c(e){const t=(0,a.useRef)();return r((()=>{t.current=e})),t.current}class i extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function d(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,a.useMemo)((()=>e),t.flat())}function s(e){return t=>{let{children:n}=t;return a.createElement(a.Fragment,null,e.reduceRight(((e,t)=>a.createElement(t,null,e)),n))}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>c,Ns:()=>i});var a=n(67294),r=n(723),o=n(52263);function c(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function i(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,a.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function a(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(a)||e(t.filter(r).flatMap((e=>e.routes??[])))}(n)}({routes:r.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>d,RF:()=>u});var a=n(67294),r=n(10412),o=n(72389),c=n(902);const i=a.createContext(void 0);function d(e){let{children:t}=e;const n=function(){const e=(0,a.useRef)(!0);return(0,a.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return a.createElement(i.Provider,{value:n},t)}function s(){const e=(0,a.useContext)(i);if(null==e)throw new c.i6("ScrollControllerProvider");return e}const l=()=>r.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function u(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=s(),r=(0,a.useRef)(l()),o=(0,c.zX)(e);(0,a.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=l();o(e,r.current),r.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,a.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function a(){const r=document.documentElement.scrollTop;(n&&r>e||!n&&r<e)&&(t=requestAnimationFrame(a),window.scrollTo(0,Math.floor(.85*(r-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>a,os:()=>r});n(52263);const a="default";function r(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,_:()=>d});const a="localStorage";function r(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}let o=!1;const c={get:()=>null,set:()=>{},del:()=>{}};function i(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t}}(e);const n=r(t?.persistence);return null===n?c:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{n.setItem(e,t)}catch(a){console.error(`Docusaurus storage error, can't set ${e}=${t}`,a)}},del:()=>{try{n.removeItem(e)}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}}}}function d(e){void 0===e&&(e=a);const t=r(e);if(!t)return[];const n=[];for(let a=0;a<t.length;a+=1){const e=t.key(a);null!==e&&n.push(e)}return n}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var a=n(52263),r=n(16550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,a.Z)(),{pathname:c}=(0,r.TH)(),i=o===n?e:e.replace(`/${o}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:a,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===n?`${i}`:`${i}${e}/`}(a)}${d}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>c});var a=n(67294),r=n(16550),o=n(902);function c(e){const t=(0,r.TH)(),n=(0,o.D9)(t),c=(0,o.zX)(e);(0,a.useEffect)((()=>{n&&t!==n&&c({location:t,previousLocation:n})}),[c,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var a=n(52263);function r(){return(0,a.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:a}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[r]=e.split(/[#?]/),o="/"===r||r===a?r:(c=r,n?function(e){return e.endsWith("/")?e:`${e}/`}(c):function(e){return e.endsWith("/")?e.slice(0,-1):e}(c));var c;return e.replace(r,o)}},18780:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var r=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return a(r).default}})},86010:(e,t,n)=>{"use strict";function a(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=a(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}n.d(t,{Z:()=>r});const r=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=a(e))&&(r&&(r+=" "),r+=t);return r}},99318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>v,q_:()=>C,ob:()=>f,PP:()=>A,Ep:()=>p});var a=n(87462);function r(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,a=n+1,r=e.length;a<r;n+=1,a+=1)e[n]=e[a];e.pop()}const c=function(e,t){void 0===t&&(t="");var n,a=e&&e.split("/")||[],c=t&&t.split("/")||[],i=e&&r(e),d=t&&r(t),s=i||d;if(e&&r(e)?c=a:a.length&&(c.pop(),c=c.concat(a)),!c.length)return"/";if(c.length){var l=c[c.length-1];n="."===l||".."===l||""===l}else n=!1;for(var u=0,p=c.length;p>=0;p--){var f=c[p];"."===f?o(c,p):".."===f?(o(c,p),u++):u&&(o(c,p),u--)}if(!s)for(;u--;u)c.unshift("..");!s||""===c[0]||c[0]&&r(c[0])||c.unshift("");var b=c.join("/");return n&&"/"!==b.substr(-1)&&(b+="/"),b};var i=n(38776);function d(e){return"/"===e.charAt(0)?e:"/"+e}function s(e){return"/"===e.charAt(0)?e.substr(1):e}function l(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function u(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,a=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),a&&"#"!==a&&(r+="#"===a.charAt(0)?a:"#"+a),r}function f(e,t,n,r){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",a="",r=t.indexOf("#");-1!==r&&(a=t.substr(r),t=t.substr(0,r));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===a?"":a}}(e),o.state=t):(void 0===(o=(0,a.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(o.key=n),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=c(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,a,r){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof a?a(o,r):r(!0):r(!1!==o)}else r(!0)},appendListener:function(e){var n=!0;function a(){n&&e.apply(void 0,arguments)}return t.push(a),function(){n=!1,t=t.filter((function(e){return e!==a}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];t.forEach((function(e){return e.apply(void 0,n)}))}}}var g=!("undefined"==typeof window||!window.document||!window.document.createElement);function m(e,t){t(window.confirm(e))}var h="popstate",y="hashchange";function _(){try{return window.history.state||{}}catch(e){return{}}}function v(e){void 0===e&&(e={}),g||(0,i.Z)(!1);var t,n=window.history,r=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),c=e,s=c.forceRefresh,v=void 0!==s&&s,w=c.getUserConfirmation,x=void 0===w?m:w,k=c.keyLength,E=void 0===k?6:k,S=e.basename?u(d(e.basename)):"";function C(e){var t=e||{},n=t.key,a=t.state,r=window.location,o=r.pathname+r.search+r.hash;return S&&(o=l(o,S)),f(o,a,n)}function T(){return Math.random().toString(36).substr(2,E)}var A=b();function L(e){(0,a.Z)(z,e),z.length=n.length,A.notifyListeners(z.location,z.action)}function P(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||O(C(e.state))}function R(){O(C(_()))}var N=!1;function O(e){if(N)N=!1,L();else{A.confirmTransitionTo(e,"POP",x,(function(t){t?L({action:"POP",location:e}):function(e){var t=z.location,n=M.indexOf(t.key);-1===n&&(n=0);var a=M.indexOf(e.key);-1===a&&(a=0);var r=n-a;r&&(N=!0,I(r))}(e)}))}}var j=C(_()),M=[j.key];function D(e){return S+p(e)}function I(e){n.go(e)}var F=0;function B(e){1===(F+=e)&&1===e?(window.addEventListener(h,P),o&&window.addEventListener(y,R)):0===F&&(window.removeEventListener(h,P),o&&window.removeEventListener(y,R))}var q=!1;var z={length:n.length,action:"POP",location:j,createHref:D,push:function(e,t){var a="PUSH",o=f(e,t,T(),z.location);A.confirmTransitionTo(o,a,x,(function(e){if(e){var t=D(o),c=o.key,i=o.state;if(r)if(n.pushState({key:c,state:i},null,t),v)window.location.href=t;else{var d=M.indexOf(z.location.key),s=M.slice(0,d+1);s.push(o.key),M=s,L({action:a,location:o})}else window.location.href=t}}))},replace:function(e,t){var a="REPLACE",o=f(e,t,T(),z.location);A.confirmTransitionTo(o,a,x,(function(e){if(e){var t=D(o),c=o.key,i=o.state;if(r)if(n.replaceState({key:c,state:i},null,t),v)window.location.replace(t);else{var d=M.indexOf(z.location.key);-1!==d&&(M[d]=o.key),L({action:a,location:o})}else window.location.replace(t)}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return q||(B(1),q=!0),function(){return q&&(q=!1,B(-1)),t()}},listen:function(e){var t=A.appendListener(e);return B(1),function(){B(-1),t()}}};return z}var w="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+s(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:s,decodePath:d},slash:{encodePath:d,decodePath:d}};function k(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function E(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function S(e){window.location.replace(k(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),g||(0,i.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),r=n.getUserConfirmation,o=void 0===r?m:r,c=n.hashType,s=void 0===c?"slash":c,h=e.basename?u(d(e.basename)):"",y=x[s],_=y.encodePath,v=y.decodePath;function C(){var e=v(E());return h&&(e=l(e,h)),f(e)}var T=b();function A(e){(0,a.Z)(q,e),q.length=t.length,T.notifyListeners(q.location,q.action)}var L=!1,P=null;function R(){var e,t,n=E(),a=_(n);if(n!==a)S(a);else{var r=C(),c=q.location;if(!L&&(t=r,(e=c).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(P===p(r))return;P=null,function(e){if(L)L=!1,A();else{var t="POP";T.confirmTransitionTo(e,t,o,(function(n){n?A({action:t,location:e}):function(e){var t=q.location,n=M.lastIndexOf(p(t));-1===n&&(n=0);var a=M.lastIndexOf(p(e));-1===a&&(a=0);var r=n-a;r&&(L=!0,D(r))}(e)}))}}(r)}}var N=E(),O=_(N);N!==O&&S(O);var j=C(),M=[p(j)];function D(e){t.go(e)}var I=0;function F(e){1===(I+=e)&&1===e?window.addEventListener(w,R):0===I&&window.removeEventListener(w,R)}var B=!1;var q={length:t.length,action:"POP",location:j,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=k(window.location.href)),n+"#"+_(h+p(e))},push:function(e,t){var n="PUSH",a=f(e,void 0,void 0,q.location);T.confirmTransitionTo(a,n,o,(function(e){if(e){var t=p(a),r=_(h+t);if(E()!==r){P=t,function(e){window.location.hash=e}(r);var o=M.lastIndexOf(p(q.location)),c=M.slice(0,o+1);c.push(t),M=c,A({action:n,location:a})}else A()}}))},replace:function(e,t){var n="REPLACE",a=f(e,void 0,void 0,q.location);T.confirmTransitionTo(a,n,o,(function(e){if(e){var t=p(a),r=_(h+t);E()!==r&&(P=t,S(r));var o=M.indexOf(p(q.location));-1!==o&&(M[o]=t),A({action:n,location:a})}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return B||(F(1),B=!0),function(){return B&&(B=!1,F(-1)),t()}},listen:function(e){var t=T.appendListener(e);return F(1),function(){F(-1),t()}}};return q}function T(e,t,n){return Math.min(Math.max(e,t),n)}function A(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,r=t.initialEntries,o=void 0===r?["/"]:r,c=t.initialIndex,i=void 0===c?0:c,d=t.keyLength,s=void 0===d?6:d,l=b();function u(e){(0,a.Z)(v,e),v.length=v.entries.length,l.notifyListeners(v.location,v.action)}function g(){return Math.random().toString(36).substr(2,s)}var m=T(i,0,o.length-1),h=o.map((function(e){return f(e,void 0,"string"==typeof e?g():e.key||g())})),y=p;function _(e){var t=T(v.index+e,0,v.entries.length-1),a=v.entries[t];l.confirmTransitionTo(a,"POP",n,(function(e){e?u({action:"POP",location:a,index:t}):u()}))}var v={length:h.length,action:"POP",location:h[m],index:m,entries:h,createHref:y,push:function(e,t){var a="PUSH",r=f(e,t,g(),v.location);l.confirmTransitionTo(r,a,n,(function(e){if(e){var t=v.index+1,n=v.entries.slice(0);n.length>t?n.splice(t,n.length-t,r):n.push(r),u({action:a,location:r,index:t,entries:n})}}))},replace:function(e,t){var a="REPLACE",r=f(e,t,g(),v.location);l.confirmTransitionTo(r,a,n,(function(e){e&&(v.entries[v.index]=r,u({action:a,location:r}))}))},go:_,goBack:function(){_(-1)},goForward:function(){_(1)},canGo:function(e){var t=v.index+e;return t>=0&&t<v.entries.length},block:function(e){return void 0===e&&(e=!1),l.setPrompt(e)},listen:function(e){return l.appendListener(e)}};return v}},8679:(e,t,n)=>{"use strict";var a=n(59864),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},c={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function d(e){return a.isMemo(e)?c:i[e.$$typeof]||r}i[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[a.Memo]=c;var s=Object.defineProperty,l=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,b=Object.prototype;e.exports=function e(t,n,a){if("string"!=typeof n){if(b){var r=f(n);r&&r!==b&&e(t,r,a)}var c=l(n);u&&(c=c.concat(u(n)));for(var i=d(t),g=d(n),m=0;m<c.length;++m){var h=c[m];if(!(o[h]||a&&a[h]||g&&g[h]||i&&i[h])){var y=p(n,h);try{s(t,h,y)}catch(_){}}}}return t}},41143:e=>{"use strict";e.exports=function(e,t,n,a,r,o,c,i){if(!e){var d;if(void 0===t)d=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var s=[n,a,r,o,c,i],l=0;(d=new Error(t.replace(/%s/g,(function(){return s[l++]})))).name="Invariant Violation"}throw d.framesToPop=1,d}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},32497:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var a,r;a=function(){var e,t,n={version:"0.2.0"},a=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function r(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function c(e,t,n){var r;return(r="translate3d"===a.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,r}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,a.minimum,1),n.status=1===e?null:e;var o=n.render(!t),s=o.querySelector(a.barSelector),l=a.speed,u=a.easing;return o.offsetWidth,i((function(t){""===a.positionUsing&&(a.positionUsing=n.getPositioningCSS()),d(s,c(e,l,u)),1===e?(d(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){d(o,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),l)}),l)):setTimeout(t,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),a.trickleSpeed)};return a.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*a.trickleRate)},e=0,t=0,n.promise=function(a){return a&&"resolved"!==a.state()?(0===t&&n.start(),e++,t++,a.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");l(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var r,c=t.querySelector(a.barSelector),i=e?"-100":o(n.status||0),s=document.querySelector(a.parent);return d(c,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),a.showSpinner||(r=t.querySelector(a.spinnerSelector))&&f(r),s!=document.body&&l(s,"nprogress-custom-parent"),s.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),d=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function a(t){var n=document.body.style;if(t in n)return t;for(var a,r=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((a=e[r]+o)in n)return a;return t}function r(e){return e=n(e),t[e]||(t[e]=a(e))}function o(e,t,n){t=r(t),e.style[t]=n}return function(e,t){var n,a,r=arguments;if(2==r.length)for(n in t)void 0!==(a=t[n])&&t.hasOwnProperty(n)&&o(e,n,a);else o(e,r[1],r[2])}}();function s(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function l(e,t){var n=p(e),a=n+t;s(n,t)||(e.className=a.substring(1))}function u(e,t){var n,a=p(e);s(e,t)&&(n=a.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(r="function"==typeof a?a.call(t,n,t,e):a)||(e.exports=r)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach((function(e){a[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(r){return!1}}()?Object.assign:function(e,r){for(var o,c,i=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),d=1;d<arguments.length;d++){for(var s in o=Object(arguments[d]))n.call(o,s)&&(i[s]=o[s]);if(t){c=t(o);for(var l=0;l<c.length;l++)a.call(o,c[l])&&(i[c[l]]=o[c[l]])}}return i}},87410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},a={util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var r,o;switch(n=n||{},a.util.type(t)){case"Object":if(o=a.util.objId(t),n[o])return n[o];for(var c in r={},n[o]=r,t)t.hasOwnProperty(c)&&(r[c]=e(t[c],n));return r;case"Array":return o=a.util.objId(t),n[o]?n[o]:(r=[],n[o]=r,t.forEach((function(t,a){r[a]=e(t,n)})),r);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var a="no-"+t;e;){var r=e.classList;if(r.contains(t))return!0;if(r.contains(a))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=a.util.clone(a.languages[e]);for(var r in t)n[r]=t[r];return n},insertBefore:function(e,t,n,r){var o=(r=r||a.languages)[e],c={};for(var i in o)if(o.hasOwnProperty(i)){if(i==t)for(var d in n)n.hasOwnProperty(d)&&(c[d]=n[d]);n.hasOwnProperty(i)||(c[i]=o[i])}var s=r[e];return r[e]=c,a.languages.DFS(a.languages,(function(t,n){n===s&&t!=e&&(this[t]=c)})),c},DFS:function e(t,n,r,o){o=o||{};var c=a.util.objId;for(var i in t)if(t.hasOwnProperty(i)){n.call(t,i,t[i],r||i);var d=t[i],s=a.util.type(d);"Object"!==s||o[c(d)]?"Array"!==s||o[c(d)]||(o[c(d)]=!0,e(d,n,i,o)):(o[c(d)]=!0,e(d,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return a.hooks.run("before-tokenize",o),o.tokens=a.tokenize(o.code,o.grammar),a.hooks.run("after-tokenize",o),r.stringify(a.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest}var r=new i;return d(r,r.head,e),c(e,r,t,r.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(r)},hooks:{all:{},add:function(e,t){var n=a.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=a.hooks.all[e];if(n&&n.length)for(var r,o=0;r=n[o++];)r(t)}},Token:r};function r(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function o(e,t,n,a){e.lastIndex=t;var r=e.exec(n);if(r&&a&&r[1]){var o=r[1].length;r.index+=o,r[0]=r[0].slice(o)}return r}function c(e,t,n,i,l,u){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var b=0;b<f.length;++b){if(u&&u.cause==p+","+b)return;var g=f[b],m=g.inside,h=!!g.lookbehind,y=!!g.greedy,_=g.alias;if(y&&!g.pattern.global){var v=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,v+"g")}for(var w=g.pattern||g,x=i.next,k=l;x!==t.tail&&!(u&&k>=u.reach);k+=x.value.length,x=x.next){var E=x.value;if(t.length>e.length)return;if(!(E instanceof r)){var S,C=1;if(y){if(!(S=o(w,k,e,h))||S.index>=e.length)break;var T=S.index,A=S.index+S[0].length,L=k;for(L+=x.value.length;T>=L;)L+=(x=x.next).value.length;if(k=L-=x.value.length,x.value instanceof r)continue;for(var P=x;P!==t.tail&&(L<A||"string"==typeof P.value);P=P.next)C++,L+=P.value.length;C--,E=e.slice(k,L),S.index-=k}else if(!(S=o(w,0,E,h)))continue;T=S.index;var R=S[0],N=E.slice(0,T),O=E.slice(T+R.length),j=k+E.length;u&&j>u.reach&&(u.reach=j);var M=x.prev;if(N&&(M=d(t,M,N),k+=N.length),s(t,M,C),x=d(t,M,new r(p,m?a.tokenize(R,m):R,_,R)),O&&d(t,x,O),C>1){var D={cause:p+","+b,reach:j};c(e,t,n,x.prev,k,D),u&&D.reach>u.reach&&(u.reach=D.reach)}}}}}}function i(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function d(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function s(e,t,n){for(var a=t.next,r=0;r<n&&a!==e.tail;r++)a=a.next;t.next=a,a.prev=t,e.length-=r}return r.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var r="";return t.forEach((function(t){r+=e(t,n)})),r}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},c=t.alias;c&&(Array.isArray(c)?Array.prototype.push.apply(o.classes,c):o.classes.push(c)),a.hooks.run("wrap",o);var i="";for(var d in o.attributes)i+=" "+d+'="'+(o.attributes[d]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+i+">"+o.content+"</"+o.tag+">"},a}(),r=a;a.default=a,r.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},r.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=a.variable[1].inside,c=0;c<r.length;c++)o[r[c]]=e.languages.bash[r[c]];e.languages.shell=e.languages.bash}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.c=r.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),r.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),r.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},r.languages.c.string],char:r.languages.c.char,comment:r.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:r.languages.c}}}}),r.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete r.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(r),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var a={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:r})}(r),r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(r),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function c(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return a})).replace(/<<key>>/g,(function(){return"(?:"+r+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:c(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:c(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:c(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:c(o),lookbehind:!0,greedy:!0},number:{pattern:c(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(r),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return a})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+o+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+o+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,a=t.length;n<a;n++){var r=t[n];if("code"===r.type){var o=r.content[1],c=r.content[3];if(o&&c&&"code-language"===o.type&&"code-block"===c.type&&"string"==typeof o.content){var i=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),d="language-"+(i=(/[a-z][\w-]*/i.exec(i)||[""])[0].toLowerCase());c.alias?"string"==typeof c.alias?c.alias=[c.alias,d]:c.alias.push(d):c.alias=[d]}}else e(r.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",a=0,r=t.classes.length;a<r;a++){var o=t.classes[a],s=/language-(.+)/.exec(o);if(s){n=s[1];break}}var l,u=e.languages[n];if(u)t.content=e.highlight((l=t.content,l.replace(c,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),d(n);var a=i[t];return a||e}))),u,n);else if(n&&"none"!==n&&e.plugins.autoloader){var p="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=p,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(p);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var c=RegExp(e.languages.markup.tag.pattern.source,"gi"),i={amp:"&",lt:"<",gt:">",quot:'"'},d=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(r),r.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:r.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},r.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var a=t[n++];if("keyword"===a.type&&"mutation"===a.content){var r=[];if(u(["definition-mutation","punctuation"])&&"("===l(1).content){n+=2;var o=p(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var c=l(0);"variable"===c.type&&(f(c,"variable-input"),r.push(c.content))}n=o+1}if(u(["punctuation","property-query"])&&"{"===l(0).content&&(n++,f(l(0),"property-mutation"),r.length>0)){var i=p(/^\{$/,/^\}$/);if(-1===i)continue;for(var d=n;d<i;d++){var s=t[d];"variable"===s.type&&r.indexOf(s.content)>=0&&f(s,"variable-input")}}}}function l(e){return t[n+e]}function u(e,t){t=t||0;for(var n=0;n<e.length;n++){var a=l(n+t);if(!a||a.type!==e[n])return!1}return!0}function p(e,a){for(var r=1,o=n;o<t.length;o++){var c=t[o],i=c.content;if("punctuation"===c.type&&"string"==typeof i)if(e.test(i))r++;else if(a.test(i)&&0===--r)return o}return-1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),r.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,a=t.inside.interpolation,r=a.inside["interpolation-punctuation"],o=a.pattern.source;function c(t,a){if(e.languages[t])return{pattern:RegExp("((?:"+a+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function i(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function d(t,n,a){var r={code:t,grammar:n,language:a};return e.hooks.run("before-tokenize",r),r.tokens=e.tokenize(r.code,r.grammar),e.hooks.run("after-tokenize",r),r.tokens}function s(t){var n={};n["interpolation-punctuation"]=r;var o=e.tokenize(t,n);if(3===o.length){var c=[1,1];c.push.apply(c,d(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,c)}return new e.Token("interpolation",o,a.alias,t)}function l(t,n,a){var r=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),c=0,l={},u=d(r.map((function(e){if("string"==typeof e)return e;for(var n,r=e.content;-1!==t.indexOf(n=i(c++,a)););return l[n]=r,n})).join(""),n,a),p=Object.keys(l);return c=0,function e(t){for(var n=0;n<t.length;n++){if(c>=p.length)return;var a=t[n];if("string"==typeof a||"string"==typeof a.content){var r=p[c],o="string"==typeof a?a:a.content,i=o.indexOf(r);if(-1!==i){++c;var d=o.substring(0,i),u=s(l[r]),f=o.substring(i+r.length),b=[];if(d&&b.push(d),b.push(u),f){var g=[f];e(g),b.push.apply(b,g)}"string"==typeof a?(t.splice.apply(t,[n,1].concat(b)),n+=b.length-1):a.content=b}}else{var m=a.content;Array.isArray(m)?e(m):e([m])}}}(u),new e.Token(a,u,"language-"+a,t)}e.languages.javascript["template-string"]=[c("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),c("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),c("svg",/\bsvg/.source),c("markdown",/\b(?:markdown|md)/.source),c("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),c("sql",/\bsql/.source),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var a=0,r=n.length;a<r;a++){var o=n[a];if("string"!=typeof o){var c=o.content;if(Array.isArray(c))if("template-string"===o.type){var i=c[1];if(3===c.length&&"string"!=typeof i&&"embedded-code"===i.type){var d=p(i),s=i.alias,u=Array.isArray(s)?s[0]:s,f=e.languages[u];if(!f)continue;c[1]=l(d,f,u)}}else t(c);else"string"!=typeof c&&t([c])}}}(t.tokens)}))}(r),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(r),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],a=0;a<n.length;a++){var r=n[a],o=e.languages.javascript[r];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[r]={pattern:o});var c=o.inside||{};o.inside=c,c["maybe-class-name"]=/^[A-Z][\s\S]*/}}(r),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,a=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,r=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return a})).replace(/<SPREAD>/g,(function(){return r})),RegExp(e,t)}r=o(r).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var c=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(c).join(""):""},i=function(t){for(var n=[],a=0;a<t.length;a++){var r=t[a],o=!1;if("string"!=typeof r&&("tag"===r.type&&r.content[0]&&"tag"===r.content[0].type?"</"===r.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===c(r.content[0].content[1])&&n.pop():"/>"===r.content[r.content.length-1].content||n.push({tagName:c(r.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===r.type&&"{"===r.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof r)&&n.length>0&&0===n[n.length-1].openedBraces){var d=c(r);a<t.length-1&&("string"==typeof t[a+1]||"plain-text"===t[a+1].type)&&(d+=c(t[a+1]),t.splice(a+1,1)),a>0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(d=c(t[a-1])+d,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",d,null,d)}r.content&&"string"!=typeof r.content&&i(r.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(r),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var a=t[n],r=[];/^\w+$/.test(n)||r.push(/\w+/.exec(n)[0]),"diff"===n&&r.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+a+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(r),r.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},r.languages.go=r.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),r.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete r.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,r,o){if(n.language===a){var c=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==n.code.indexOf(r=t(a,i));)++i;return c[i]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var r=0,o=Object.keys(n.tokenStack);!function c(i){for(var d=0;d<i.length&&!(r>=o.length);d++){var s=i[d];if("string"==typeof s||s.content&&"string"==typeof s.content){var l=o[r],u=n.tokenStack[l],p="string"==typeof s?s:s.content,f=t(a,l),b=p.indexOf(f);if(b>-1){++r;var g=p.substring(0,b),m=new e.Token(a,e.tokenize(u,n.grammar),"language-"+a,u),h=p.substring(b+f.length),y=[];g&&y.push.apply(y,c([g])),y.push(m),h&&y.push.apply(y,c([h])),"string"==typeof s?i.splice.apply(i,[d,1].concat(y)):s.content=y}}else s.content&&c(s.content)}return i}(n.tokens)}}}})}(r),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(r),r.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},r.languages.webmanifest=r.languages.json,r.languages.less=r.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),r.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),r.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},r.languages.objectivec=r.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete r.languages.objectivec["class-name"],r.languages.objc=r.languages.objectivec,r.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},r.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},r.languages.python["string-interpolation"].inside.interpolation.inside.rest=r.languages.python,r.languages.py=r.languages.python,r.languages.reason=r.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),r.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete r.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(r),r.languages.scss=r.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),r.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),r.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),r.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),r.languages.scss.atrule.inside.rest=r.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},a={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};a.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:a}},a.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:a}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:a}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:a}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:a}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:a.interpolation}},rest:a}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:a.interpolation,comment:a.comment,punctuation:/[{},]/}},func:a.func,string:a.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:a.interpolation,punctuation:/[{}()\[\];:.]/}}(r),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(r),r.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=r},29901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const a=n(29901),r=n(39642),o=new Set;function c(e){void 0===e?e=Object.keys(a.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];r(a,e,t).load((e=>{if(!(e in a.languages))return void(c.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(16500).resolve(t)],delete Prism.languages[e],n(16500)(t),o.add(e)}))}c.silent=!1,e.exports=c},6726:(e,t,n)=>{var a={"./":2885};function r(e){var t=o(e);return n(t)}function o(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=o,e.exports=r,r.id=6726},16500:(e,t,n)=>{var a={"./":2885};function r(e){var t=o(e);return n(t)}function o(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=o,e.exports=r,r.id=16500},39642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,a=e.length;n<a;n++)t[e[n]]=!0;return t}function a(e){var n={},a=[];function r(a,o){if(!(a in n)){o.push(a);var c=o.indexOf(a);if(c<o.length-1)throw new Error("Circular dependency: "+o.slice(c).join(" -> "));var i={},d=e[a];if(d){function s(t){if(!(t in e))throw new Error(a+" depends on an unknown component "+t);if(!(t in i))for(var c in r(t,o),i[t]=!0,n[t])i[c]=!0}t(d.require,s),t(d.optional,s),t(d.modify,s)}n[a]=i,o.pop()}}return function(e){var t=n[e];return t||(r(e,a),t=n[e]),t}}function r(e){for(var t in e)return!0;return!1}return function(o,c,i){var d=function(e){var t={};for(var n in e){var a=e[n];for(var r in a)if("meta"!=r){var o=a[r];t[r]="string"==typeof o?{title:o}:o}}return t}(o),s=function(e){var n;return function(a){if(a in e)return a;if(!n)for(var r in n={},e){var o=e[r];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+r+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+r+" because it is a component.");n[t]=r}))}return n[a]||a}}(d);c=c.map(s),i=(i||[]).map(s);var l=n(c),u=n(i);c.forEach((function e(n){var a=d[n];t(a&&a.require,(function(t){t in u||(l[t]=!0,e(t))}))}));for(var p,f=a(d),b=l;r(b);){for(var g in p={},b){var m=d[g];t(m&&m.modify,(function(e){e in u&&(p[e]=!0)}))}for(var h in u)if(!(h in l))for(var y in f(h))if(y in l){p[h]=!0;break}for(var _ in b=p)l[_]=!0}var v={getIds:function(){var e=[];return v.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,a,r){var o=r?r.series:void 0,c=r?r.parallel:e,i={},d={};function s(e){if(e in i)return i[e];d[e]=!0;var r,l=[];for(var u in t(e))u in n&&l.push(u);if(0===l.length)r=a(e);else{var p=c(l.map((function(e){var t=s(e);return delete d[e],t})));o?r=o(p,(function(){return a(e)})):a(e)}return i[e]=r}for(var l in n)s(l);var u=[];for(var p in d)u.push(i[p]);return c(u)}(f,l,t,n)}};return v}}();e.exports=t},92703:(e,t,n)=>{"use strict";var a=n(50414);function r(){}function o(){}o.resetWarningCache=r,e.exports=function(){function e(e,t,n,r,o,c){if(c!==a){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:r};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var a=n(67294),r=n(27418),o=n(63840);function c(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!a)throw Error(c(227));var i=new Set,d={};function s(e,t){l(e,t),l(e+"Capture",t)}function l(e,t){for(d[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),p=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,f=Object.prototype.hasOwnProperty,b={},g={};function m(e,t,n,a,r,o,c){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=a,this.attributeNamespace=r,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=c}var h={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){h[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];h[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){h[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){h[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){h[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){h[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){h[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){h[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){h[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var y=/[\-:]([a-z])/g;function _(e){return e[1].toUpperCase()}function v(e,t,n,a){var r=h.hasOwnProperty(t)?h[t]:null;(null!==r?0===r.type:!a&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,a){if(null==t||function(e,t,n,a){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!a&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,a))return!0;if(a)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,r,a)&&(n=null),a||null===r?function(e){return!!f.call(g,e)||!f.call(b,e)&&(p.test(e)?g[e]=!0:(b[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):r.mustUseProperty?e[r.propertyName]=null===n?3!==r.type&&"":n:(t=r.attributeName,a=r.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(r=r.type)||4===r&&!0===n?"":""+n,a?e.setAttributeNS(a,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(y,_);h[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(y,_);h[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(y,_);h[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),h.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,x=60103,k=60106,E=60107,S=60108,C=60114,T=60109,A=60110,L=60112,P=60113,R=60120,N=60115,O=60116,j=60121,M=60128,D=60129,I=60130,F=60131;if("function"==typeof Symbol&&Symbol.for){var B=Symbol.for;x=B("react.element"),k=B("react.portal"),E=B("react.fragment"),S=B("react.strict_mode"),C=B("react.profiler"),T=B("react.provider"),A=B("react.context"),L=B("react.forward_ref"),P=B("react.suspense"),R=B("react.suspense_list"),N=B("react.memo"),O=B("react.lazy"),j=B("react.block"),B("react.scope"),M=B("react.opaque.id"),D=B("react.debug_trace_mode"),I=B("react.offscreen"),F=B("react.legacy_hidden")}var q,z="function"==typeof Symbol&&Symbol.iterator;function U(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=z&&e[z]||e["@@iterator"])?e:null}function $(e){if(void 0===q)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);q=t&&t[1]||""}return"\n"+q+e}var H=!1;function G(e,t){if(!e||H)return"";H=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(d){var a=d}Reflect.construct(e,[],t)}else{try{t.call()}catch(d){a=d}e.call(t.prototype)}else{try{throw Error()}catch(d){a=d}e()}}catch(d){if(d&&a&&"string"==typeof d.stack){for(var r=d.stack.split("\n"),o=a.stack.split("\n"),c=r.length-1,i=o.length-1;1<=c&&0<=i&&r[c]!==o[i];)i--;for(;1<=c&&0<=i;c--,i--)if(r[c]!==o[i]){if(1!==c||1!==i)do{if(c--,0>--i||r[c]!==o[i])return"\n"+r[c].replace(" at new "," at ")}while(1<=c&&0<=i);break}}}finally{H=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?$(e):""}function Z(e){switch(e.tag){case 5:return $(e.type);case 16:return $("Lazy");case 13:return $("Suspense");case 19:return $("SuspenseList");case 0:case 2:case 15:return e=G(e.type,!1);case 11:return e=G(e.type.render,!1);case 22:return e=G(e.type._render,!1);case 1:return e=G(e.type,!0);default:return""}}function V(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case E:return"Fragment";case k:return"Portal";case C:return"Profiler";case S:return"StrictMode";case P:return"Suspense";case R:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case T:return(e._context.displayName||"Context")+".Provider";case L:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case N:return V(e.type);case j:return V(e._render);case O:t=e._payload,e=e._init;try{return V(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Q(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var t=Q(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var r=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(e){a=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(e){a=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function K(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=Q(e)?e.checked?"true":"false":e.value),(e=a)!==n&&(t.setValue(e),!0)}function X(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return r({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,a=null!=t.checked?t.checked:t.defaultChecked;n=W(null!=t.value?t.value:n),e._wrapperState={initialChecked:a,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=W(t.value),a=t.type;if(null!=n)"number"===a?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===a||"reset"===a)return void e.removeAttribute("value");t.hasOwnProperty("value")?re(e,t.type,n):t.hasOwnProperty("defaultValue")&&re(e,t.type,W(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function ae(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!("submit"!==a&&"reset"!==a||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function re(e,t,n){"number"===t&&X(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=r({children:void 0},t),(t=function(e){var t="";return a.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ce(e,t,n,a){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t["$"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty("$"+e[n].value),e[n].selected!==r&&(e[n].selected=r),r&&a&&(e[n].defaultSelected=!0)}else{for(n=""+W(n),t=null,r=0;r<e.length;r++){if(e[r].value===n)return e[r].selected=!0,void(a&&(e[r].defaultSelected=!0));null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function ie(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(c(91));return r({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function de(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(c(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(c(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:W(n)}}function se(e,t){var n=W(t.value),a=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=a&&(e.defaultValue=""+a)}function le(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var ue={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function pe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function fe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?pe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var be,ge,me=(ge=function(e,t){if(e.namespaceURI!==ue.svg||"innerHTML"in e)e.innerHTML=t;else{for((be=be||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=be.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,a){MSApp.execUnsafeLocalFunction((function(){return ge(e,t)}))}:ge);function he(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ye={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},_e=["Webkit","ms","Moz","O"];function ve(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ye.hasOwnProperty(e)&&ye[e]?(""+t).trim():t+"px"}function we(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var a=0===n.indexOf("--"),r=ve(n,t[n],a);"float"===n&&(n="cssFloat"),a?e.setProperty(n,r):e[n]=r}}Object.keys(ye).forEach((function(e){_e.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ye[t]=ye[e]}))}));var xe=r({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ke(e,t){if(t){if(xe[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(c(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(c(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(c(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(c(62))}}function Ee(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Se(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ce=null,Te=null,Ae=null;function Le(e){if(e=nr(e)){if("function"!=typeof Ce)throw Error(c(280));var t=e.stateNode;t&&(t=rr(t),Ce(e.stateNode,e.type,t))}}function Pe(e){Te?Ae?Ae.push(e):Ae=[e]:Te=e}function Re(){if(Te){var e=Te,t=Ae;if(Ae=Te=null,Le(e),t)for(e=0;e<t.length;e++)Le(t[e])}}function Ne(e,t){return e(t)}function Oe(e,t,n,a,r){return e(t,n,a,r)}function je(){}var Me=Ne,De=!1,Ie=!1;function Fe(){null===Te&&null===Ae||(je(),Re())}function Be(e,t){var n=e.stateNode;if(null===n)return null;var a=rr(n);if(null===a)return null;n=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(a=!a.disabled)||(a=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!a;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(c(231,t,typeof n));return n}var qe=!1;if(u)try{var ze={};Object.defineProperty(ze,"passive",{get:function(){qe=!0}}),window.addEventListener("test",ze,ze),window.removeEventListener("test",ze,ze)}catch(ge){qe=!1}function Ue(e,t,n,a,r,o,c,i,d){var s=Array.prototype.slice.call(arguments,3);try{t.apply(n,s)}catch(l){this.onError(l)}}var $e=!1,He=null,Ge=!1,Ze=null,Ve={onError:function(e){$e=!0,He=e}};function We(e,t,n,a,r,o,c,i,d){$e=!1,He=null,Ue.apply(Ve,arguments)}function Qe(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Ye(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Ke(e){if(Qe(e)!==e)throw Error(c(188))}function Xe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Qe(e)))throw Error(c(188));return t!==e?null:e}for(var n=e,a=t;;){var r=n.return;if(null===r)break;var o=r.alternate;if(null===o){if(null!==(a=r.return)){n=a;continue}break}if(r.child===o.child){for(o=r.child;o;){if(o===n)return Ke(r),e;if(o===a)return Ke(r),t;o=o.sibling}throw Error(c(188))}if(n.return!==a.return)n=r,a=o;else{for(var i=!1,d=r.child;d;){if(d===n){i=!0,n=r,a=o;break}if(d===a){i=!0,a=r,n=o;break}d=d.sibling}if(!i){for(d=o.child;d;){if(d===n){i=!0,n=o,a=r;break}if(d===a){i=!0,a=o,n=r;break}d=d.sibling}if(!i)throw Error(c(189))}}if(n.alternate!==a)throw Error(c(190))}if(3!==n.tag)throw Error(c(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Je(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var et,tt,nt,at,rt=!1,ot=[],ct=null,it=null,dt=null,st=new Map,lt=new Map,ut=[],pt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function ft(e,t,n,a,r){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:r,targetContainers:[a]}}function bt(e,t){switch(e){case"focusin":case"focusout":ct=null;break;case"dragenter":case"dragleave":it=null;break;case"mouseover":case"mouseout":dt=null;break;case"pointerover":case"pointerout":st.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":lt.delete(t.pointerId)}}function gt(e,t,n,a,r,o){return null===e||e.nativeEvent!==o?(e=ft(t,n,a,r,o),null!==t&&(null!==(t=nr(t))&&tt(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,null!==r&&-1===t.indexOf(r)&&t.push(r),e)}function mt(e){var t=tr(e.target);if(null!==t){var n=Qe(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ye(n)))return e.blockedOn=t,void at(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){nt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function ht(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Xt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=nr(n))&&tt(t),e.blockedOn=n,!1;t.shift()}return!0}function yt(e,t,n){ht(e)&&n.delete(t)}function _t(){for(rt=!1;0<ot.length;){var e=ot[0];if(null!==e.blockedOn){null!==(e=nr(e.blockedOn))&&et(e);break}for(var t=e.targetContainers;0<t.length;){var n=Xt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&ot.shift()}null!==ct&&ht(ct)&&(ct=null),null!==it&&ht(it)&&(it=null),null!==dt&&ht(dt)&&(dt=null),st.forEach(yt),lt.forEach(yt)}function vt(e,t){e.blockedOn===t&&(e.blockedOn=null,rt||(rt=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,_t)))}function wt(e){function t(t){return vt(t,e)}if(0<ot.length){vt(ot[0],e);for(var n=1;n<ot.length;n++){var a=ot[n];a.blockedOn===e&&(a.blockedOn=null)}}for(null!==ct&&vt(ct,e),null!==it&&vt(it,e),null!==dt&&vt(dt,e),st.forEach(t),lt.forEach(t),n=0;n<ut.length;n++)(a=ut[n]).blockedOn===e&&(a.blockedOn=null);for(;0<ut.length&&null===(n=ut[0]).blockedOn;)mt(n),null===n.blockedOn&&ut.shift()}function xt(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kt={animationend:xt("Animation","AnimationEnd"),animationiteration:xt("Animation","AnimationIteration"),animationstart:xt("Animation","AnimationStart"),transitionend:xt("Transition","TransitionEnd")},Et={},St={};function Ct(e){if(Et[e])return Et[e];if(!kt[e])return e;var t,n=kt[e];for(t in n)if(n.hasOwnProperty(t)&&t in St)return Et[e]=n[t];return e}u&&(St=document.createElement("div").style,"AnimationEvent"in window||(delete kt.animationend.animation,delete kt.animationiteration.animation,delete kt.animationstart.animation),"TransitionEvent"in window||delete kt.transitionend.transition);var Tt=Ct("animationend"),At=Ct("animationiteration"),Lt=Ct("animationstart"),Pt=Ct("transitionend"),Rt=new Map,Nt=new Map,Ot=["abort","abort",Tt,"animationEnd",At,"animationIteration",Lt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Pt,"transitionEnd","waiting","waiting"];function jt(e,t){for(var n=0;n<e.length;n+=2){var a=e[n],r=e[n+1];r="on"+(r[0].toUpperCase()+r.slice(1)),Nt.set(a,t),Rt.set(a,r),s(r,[a])}}(0,o.unstable_now)();var Mt=8;function Dt(e){if(0!=(1&e))return Mt=15,1;if(0!=(2&e))return Mt=14,2;if(0!=(4&e))return Mt=13,4;var t=24&e;return 0!==t?(Mt=12,t):0!=(32&e)?(Mt=11,32):0!==(t=192&e)?(Mt=10,t):0!=(256&e)?(Mt=9,256):0!==(t=3584&e)?(Mt=8,t):0!=(4096&e)?(Mt=7,4096):0!==(t=4186112&e)?(Mt=6,t):0!==(t=62914560&e)?(Mt=5,t):67108864&e?(Mt=4,67108864):0!=(134217728&e)?(Mt=3,134217728):0!==(t=805306368&e)?(Mt=2,t):0!=(1073741824&e)?(Mt=1,1073741824):(Mt=8,e)}function It(e,t){var n=e.pendingLanes;if(0===n)return Mt=0;var a=0,r=0,o=e.expiredLanes,c=e.suspendedLanes,i=e.pingedLanes;if(0!==o)a=o,r=Mt=15;else if(0!==(o=134217727&n)){var d=o&~c;0!==d?(a=Dt(d),r=Mt):0!==(i&=o)&&(a=Dt(i),r=Mt)}else 0!==(o=n&~c)?(a=Dt(o),r=Mt):0!==i&&(a=Dt(i),r=Mt);if(0===a)return 0;if(a=n&((0>(a=31-$t(a))?0:1<<a)<<1)-1,0!==t&&t!==a&&0==(t&c)){if(Dt(t),r<=Mt)return t;Mt=r}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=a;0<t;)r=1<<(n=31-$t(t)),a|=e[n],t&=~r;return a}function Ft(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function Bt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=qt(24&~t))?Bt(10,t):e;case 10:return 0===(e=qt(192&~t))?Bt(8,t):e;case 8:return 0===(e=qt(3584&~t))&&(0===(e=qt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=qt(805306368&~t))&&(t=268435456),t}throw Error(c(358,e))}function qt(e){return e&-e}function zt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ut(e,t,n){e.pendingLanes|=t;var a=t-1;e.suspendedLanes&=a,e.pingedLanes&=a,(e=e.eventTimes)[t=31-$t(t)]=n}var $t=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ht(e)/Gt|0)|0},Ht=Math.log,Gt=Math.LN2;var Zt=o.unstable_UserBlockingPriority,Vt=o.unstable_runWithPriority,Wt=!0;function Qt(e,t,n,a){De||je();var r=Kt,o=De;De=!0;try{Oe(r,e,t,n,a)}finally{(De=o)||Fe()}}function Yt(e,t,n,a){Vt(Zt,Kt.bind(null,e,t,n,a))}function Kt(e,t,n,a){var r;if(Wt)if((r=0==(4&t))&&0<ot.length&&-1<pt.indexOf(e))e=ft(null,e,t,n,a),ot.push(e);else{var o=Xt(e,t,n,a);if(null===o)r&&bt(e,a);else{if(r){if(-1<pt.indexOf(e))return e=ft(o,e,t,n,a),void ot.push(e);if(function(e,t,n,a,r){switch(t){case"focusin":return ct=gt(ct,e,t,n,a,r),!0;case"dragenter":return it=gt(it,e,t,n,a,r),!0;case"mouseover":return dt=gt(dt,e,t,n,a,r),!0;case"pointerover":var o=r.pointerId;return st.set(o,gt(st.get(o)||null,e,t,n,a,r)),!0;case"gotpointercapture":return o=r.pointerId,lt.set(o,gt(lt.get(o)||null,e,t,n,a,r)),!0}return!1}(o,e,t,n,a))return;bt(e,a)}ja(e,t,a,null,n)}}}function Xt(e,t,n,a){var r=Se(a);if(null!==(r=tr(r))){var o=Qe(r);if(null===o)r=null;else{var c=o.tag;if(13===c){if(null!==(r=Ye(o)))return r;r=null}else if(3===c){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;r=null}else o!==r&&(r=null)}}return ja(e,t,a,r,n),null}var Jt=null,en=null,tn=null;function nn(){if(tn)return tn;var e,t,n=en,a=n.length,r="value"in Jt?Jt.value:Jt.textContent,o=r.length;for(e=0;e<a&&n[e]===r[e];e++);var c=a-e;for(t=1;t<=c&&n[a-t]===r[o-t];t++);return tn=r.slice(e,1<t?1-t:void 0)}function an(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function rn(){return!0}function on(){return!1}function cn(e){function t(t,n,a,r,o){for(var c in this._reactName=t,this._targetInst=a,this.type=n,this.nativeEvent=r,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(c)&&(t=e[c],this[c]=t?t(r):r[c]);return this.isDefaultPrevented=(null!=r.defaultPrevented?r.defaultPrevented:!1===r.returnValue)?rn:on,this.isPropagationStopped=on,this}return r(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=rn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=rn)},persist:function(){},isPersistent:rn}),t}var dn,sn,ln,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=cn(un),fn=r({},un,{view:0,detail:0}),bn=cn(fn),gn=r({},fn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Tn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(dn=e.screenX-ln.screenX,sn=e.screenY-ln.screenY):sn=dn=0,ln=e),dn)},movementY:function(e){return"movementY"in e?e.movementY:sn}}),mn=cn(gn),hn=cn(r({},gn,{dataTransfer:0})),yn=cn(r({},fn,{relatedTarget:0})),_n=cn(r({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),vn=r({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),wn=cn(vn),xn=cn(r({},un,{data:0})),kn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},En={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function Tn(){return Cn}var An=r({},fn,{key:function(e){if(e.key){var t=kn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=an(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?En[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Tn,charCode:function(e){return"keypress"===e.type?an(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?an(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Ln=cn(An),Pn=cn(r({},gn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Rn=cn(r({},fn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Tn})),Nn=cn(r({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),On=r({},gn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),jn=cn(On),Mn=[9,13,27,32],Dn=u&&"CompositionEvent"in window,In=null;u&&"documentMode"in document&&(In=document.documentMode);var Fn=u&&"TextEvent"in window&&!In,Bn=u&&(!Dn||In&&8<In&&11>=In),qn=String.fromCharCode(32),zn=!1;function Un(e,t){switch(e){case"keyup":return-1!==Mn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $n(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Hn=!1;var Gn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Zn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Gn[e.type]:"textarea"===t}function Vn(e,t,n,a){Pe(a),0<(t=Da(t,"onChange")).length&&(n=new pn("onChange","change",null,n,a),e.push({event:n,listeners:t}))}var Wn=null,Qn=null;function Yn(e){Aa(e,0)}function Kn(e){if(K(ar(e)))return e}function Xn(e,t){if("change"===e)return t}var Jn=!1;if(u){var ea;if(u){var ta="oninput"in document;if(!ta){var na=document.createElement("div");na.setAttribute("oninput","return;"),ta="function"==typeof na.oninput}ea=ta}else ea=!1;Jn=ea&&(!document.documentMode||9<document.documentMode)}function aa(){Wn&&(Wn.detachEvent("onpropertychange",ra),Qn=Wn=null)}function ra(e){if("value"===e.propertyName&&Kn(Qn)){var t=[];if(Vn(t,Qn,e,Se(e)),e=Yn,De)e(t);else{De=!0;try{Ne(e,t)}finally{De=!1,Fe()}}}}function oa(e,t,n){"focusin"===e?(aa(),Qn=n,(Wn=t).attachEvent("onpropertychange",ra)):"focusout"===e&&aa()}function ca(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Kn(Qn)}function ia(e,t){if("click"===e)return Kn(t)}function da(e,t){if("input"===e||"change"===e)return Kn(t)}var sa="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},la=Object.prototype.hasOwnProperty;function ua(e,t){if(sa(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(a=0;a<n.length;a++)if(!la.call(t,n[a])||!sa(e[n[a]],t[n[a]]))return!1;return!0}function pa(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function fa(e,t){var n,a=pa(e);for(e=0;a;){if(3===a.nodeType){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=pa(a)}}function ba(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?ba(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function ga(){for(var e=window,t=X();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(a){n=!1}if(!n)break;t=X((e=t.contentWindow).document)}return t}function ma(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var ha=u&&"documentMode"in document&&11>=document.documentMode,ya=null,_a=null,va=null,wa=!1;function xa(e,t,n){var a=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;wa||null==ya||ya!==X(a)||("selectionStart"in(a=ya)&&ma(a)?a={start:a.selectionStart,end:a.selectionEnd}:a={anchorNode:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset},va&&ua(va,a)||(va=a,0<(a=Da(_a,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:a}),t.target=ya)))}jt("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),jt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),jt(Ot,2);for(var ka="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Ea=0;Ea<ka.length;Ea++)Nt.set(ka[Ea],0);l("onMouseEnter",["mouseout","mouseover"]),l("onMouseLeave",["mouseout","mouseover"]),l("onPointerEnter",["pointerout","pointerover"]),l("onPointerLeave",["pointerout","pointerover"]),s("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),s("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),s("onBeforeInput",["compositionend","keypress","textInput","paste"]),s("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Sa="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ca=new Set("cancel close invalid load scroll toggle".split(" ").concat(Sa));function Ta(e,t,n){var a=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,a,r,o,i,d,s){if(We.apply(this,arguments),$e){if(!$e)throw Error(c(198));var l=He;$e=!1,He=null,Ge||(Ge=!0,Ze=l)}}(a,t,void 0,e),e.currentTarget=null}function Aa(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var a=e[n],r=a.event;a=a.listeners;e:{var o=void 0;if(t)for(var c=a.length-1;0<=c;c--){var i=a[c],d=i.instance,s=i.currentTarget;if(i=i.listener,d!==o&&r.isPropagationStopped())break e;Ta(r,i,s),o=d}else for(c=0;c<a.length;c++){if(d=(i=a[c]).instance,s=i.currentTarget,i=i.listener,d!==o&&r.isPropagationStopped())break e;Ta(r,i,s),o=d}}}if(Ge)throw e=Ze,Ge=!1,Ze=null,e}function La(e,t){var n=or(t),a=e+"__bubble";n.has(a)||(Oa(t,e,2,!1),n.add(a))}var Pa="_reactListening"+Math.random().toString(36).slice(2);function Ra(e){e[Pa]||(e[Pa]=!0,i.forEach((function(t){Ca.has(t)||Na(t,!1,e,null),Na(t,!0,e,null)})))}function Na(e,t,n,a){var r=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==a&&!t&&Ca.has(e)){if("scroll"!==e)return;r|=2,o=a}var c=or(o),i=e+"__"+(t?"capture":"bubble");c.has(i)||(t&&(r|=4),Oa(o,e,r,t),c.add(i))}function Oa(e,t,n,a){var r=Nt.get(t);switch(void 0===r?2:r){case 0:r=Qt;break;case 1:r=Yt;break;default:r=Kt}n=r.bind(null,t,n,e),r=void 0,!qe||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(r=!0),a?void 0!==r?e.addEventListener(t,n,{capture:!0,passive:r}):e.addEventListener(t,n,!0):void 0!==r?e.addEventListener(t,n,{passive:r}):e.addEventListener(t,n,!1)}function ja(e,t,n,a,r){var o=a;if(0==(1&t)&&0==(2&t)&&null!==a)e:for(;;){if(null===a)return;var c=a.tag;if(3===c||4===c){var i=a.stateNode.containerInfo;if(i===r||8===i.nodeType&&i.parentNode===r)break;if(4===c)for(c=a.return;null!==c;){var d=c.tag;if((3===d||4===d)&&((d=c.stateNode.containerInfo)===r||8===d.nodeType&&d.parentNode===r))return;c=c.return}for(;null!==i;){if(null===(c=tr(i)))return;if(5===(d=c.tag)||6===d){a=o=c;continue e}i=i.parentNode}}a=a.return}!function(e,t,n){if(Ie)return e(t,n);Ie=!0;try{return Me(e,t,n)}finally{Ie=!1,Fe()}}((function(){var a=o,r=Se(n),c=[];e:{var i=Rt.get(e);if(void 0!==i){var d=pn,s=e;switch(e){case"keypress":if(0===an(n))break e;case"keydown":case"keyup":d=Ln;break;case"focusin":s="focus",d=yn;break;case"focusout":s="blur",d=yn;break;case"beforeblur":case"afterblur":d=yn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":d=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":d=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":d=Rn;break;case Tt:case At:case Lt:d=_n;break;case Pt:d=Nn;break;case"scroll":d=bn;break;case"wheel":d=jn;break;case"copy":case"cut":case"paste":d=wn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":d=Pn}var l=0!=(4&t),u=!l&&"scroll"===e,p=l?null!==i?i+"Capture":null:i;l=[];for(var f,b=a;null!==b;){var g=(f=b).stateNode;if(5===f.tag&&null!==g&&(f=g,null!==p&&(null!=(g=Be(b,p))&&l.push(Ma(b,g,f)))),u)break;b=b.return}0<l.length&&(i=new d(i,s,null,n,r),c.push({event:i,listeners:l}))}}if(0==(7&t)){if(d="mouseout"===e||"pointerout"===e,(!(i="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(s=n.relatedTarget||n.fromElement)||!tr(s)&&!s[Ja])&&(d||i)&&(i=r.window===r?r:(i=r.ownerDocument)?i.defaultView||i.parentWindow:window,d?(d=a,null!==(s=(s=n.relatedTarget||n.toElement)?tr(s):null)&&(s!==(u=Qe(s))||5!==s.tag&&6!==s.tag)&&(s=null)):(d=null,s=a),d!==s)){if(l=mn,g="onMouseLeave",p="onMouseEnter",b="mouse","pointerout"!==e&&"pointerover"!==e||(l=Pn,g="onPointerLeave",p="onPointerEnter",b="pointer"),u=null==d?i:ar(d),f=null==s?i:ar(s),(i=new l(g,b+"leave",d,n,r)).target=u,i.relatedTarget=f,g=null,tr(r)===a&&((l=new l(p,b+"enter",s,n,r)).target=f,l.relatedTarget=u,g=l),u=g,d&&s)e:{for(p=s,b=0,f=l=d;f;f=Ia(f))b++;for(f=0,g=p;g;g=Ia(g))f++;for(;0<b-f;)l=Ia(l),b--;for(;0<f-b;)p=Ia(p),f--;for(;b--;){if(l===p||null!==p&&l===p.alternate)break e;l=Ia(l),p=Ia(p)}l=null}else l=null;null!==d&&Fa(c,i,d,l,!1),null!==s&&null!==u&&Fa(c,u,s,l,!0)}if("select"===(d=(i=a?ar(a):window).nodeName&&i.nodeName.toLowerCase())||"input"===d&&"file"===i.type)var m=Xn;else if(Zn(i))if(Jn)m=da;else{m=ca;var h=oa}else(d=i.nodeName)&&"input"===d.toLowerCase()&&("checkbox"===i.type||"radio"===i.type)&&(m=ia);switch(m&&(m=m(e,a))?Vn(c,m,n,r):(h&&h(e,i,a),"focusout"===e&&(h=i._wrapperState)&&h.controlled&&"number"===i.type&&re(i,"number",i.value)),h=a?ar(a):window,e){case"focusin":(Zn(h)||"true"===h.contentEditable)&&(ya=h,_a=a,va=null);break;case"focusout":va=_a=ya=null;break;case"mousedown":wa=!0;break;case"contextmenu":case"mouseup":case"dragend":wa=!1,xa(c,n,r);break;case"selectionchange":if(ha)break;case"keydown":case"keyup":xa(c,n,r)}var y;if(Dn)e:{switch(e){case"compositionstart":var _="onCompositionStart";break e;case"compositionend":_="onCompositionEnd";break e;case"compositionupdate":_="onCompositionUpdate";break e}_=void 0}else Hn?Un(e,n)&&(_="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(_="onCompositionStart");_&&(Bn&&"ko"!==n.locale&&(Hn||"onCompositionStart"!==_?"onCompositionEnd"===_&&Hn&&(y=nn()):(en="value"in(Jt=r)?Jt.value:Jt.textContent,Hn=!0)),0<(h=Da(a,_)).length&&(_=new xn(_,e,null,n,r),c.push({event:_,listeners:h}),y?_.data=y:null!==(y=$n(n))&&(_.data=y))),(y=Fn?function(e,t){switch(e){case"compositionend":return $n(t);case"keypress":return 32!==t.which?null:(zn=!0,qn);case"textInput":return(e=t.data)===qn&&zn?null:e;default:return null}}(e,n):function(e,t){if(Hn)return"compositionend"===e||!Dn&&Un(e,t)?(e=nn(),tn=en=Jt=null,Hn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Bn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(a=Da(a,"onBeforeInput")).length&&(r=new xn("onBeforeInput","beforeinput",null,n,r),c.push({event:r,listeners:a}),r.data=y))}Aa(c,t)}))}function Ma(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Da(e,t){for(var n=t+"Capture",a=[];null!==e;){var r=e,o=r.stateNode;5===r.tag&&null!==o&&(r=o,null!=(o=Be(e,n))&&a.unshift(Ma(e,o,r)),null!=(o=Be(e,t))&&a.push(Ma(e,o,r))),e=e.return}return a}function Ia(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Fa(e,t,n,a,r){for(var o=t._reactName,c=[];null!==n&&n!==a;){var i=n,d=i.alternate,s=i.stateNode;if(null!==d&&d===a)break;5===i.tag&&null!==s&&(i=s,r?null!=(d=Be(n,o))&&c.unshift(Ma(n,d,i)):r||null!=(d=Be(n,o))&&c.push(Ma(n,d,i))),n=n.return}0!==c.length&&e.push({event:t,listeners:c})}function Ba(){}var qa=null,za=null;function Ua(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function $a(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Ha="function"==typeof setTimeout?setTimeout:void 0,Ga="function"==typeof clearTimeout?clearTimeout:void 0;function Za(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function Va(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Wa(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Qa=0;var Ya=Math.random().toString(36).slice(2),Ka="__reactFiber$"+Ya,Xa="__reactProps$"+Ya,Ja="__reactContainer$"+Ya,er="__reactEvents$"+Ya;function tr(e){var t=e[Ka];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Ja]||n[Ka]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Wa(e);null!==e;){if(n=e[Ka])return n;e=Wa(e)}return t}n=(e=n).parentNode}return null}function nr(e){return!(e=e[Ka]||e[Ja])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ar(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(c(33))}function rr(e){return e[Xa]||null}function or(e){var t=e[er];return void 0===t&&(t=e[er]=new Set),t}var cr=[],ir=-1;function dr(e){return{current:e}}function sr(e){0>ir||(e.current=cr[ir],cr[ir]=null,ir--)}function lr(e,t){ir++,cr[ir]=e.current,e.current=t}var ur={},pr=dr(ur),fr=dr(!1),br=ur;function gr(e,t){var n=e.type.contextTypes;if(!n)return ur;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var r,o={};for(r in n)o[r]=t[r];return a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function mr(e){return null!=(e=e.childContextTypes)}function hr(){sr(fr),sr(pr)}function yr(e,t,n){if(pr.current!==ur)throw Error(c(168));lr(pr,t),lr(fr,n)}function _r(e,t,n){var a=e.stateNode;if(e=t.childContextTypes,"function"!=typeof a.getChildContext)return n;for(var o in a=a.getChildContext())if(!(o in e))throw Error(c(108,V(t)||"Unknown",o));return r({},n,a)}function vr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||ur,br=pr.current,lr(pr,e),lr(fr,fr.current),!0}function wr(e,t,n){var a=e.stateNode;if(!a)throw Error(c(169));n?(e=_r(e,t,br),a.__reactInternalMemoizedMergedChildContext=e,sr(fr),sr(pr),lr(pr,e)):sr(fr),lr(fr,n)}var xr=null,kr=null,Er=o.unstable_runWithPriority,Sr=o.unstable_scheduleCallback,Cr=o.unstable_cancelCallback,Tr=o.unstable_shouldYield,Ar=o.unstable_requestPaint,Lr=o.unstable_now,Pr=o.unstable_getCurrentPriorityLevel,Rr=o.unstable_ImmediatePriority,Nr=o.unstable_UserBlockingPriority,Or=o.unstable_NormalPriority,jr=o.unstable_LowPriority,Mr=o.unstable_IdlePriority,Dr={},Ir=void 0!==Ar?Ar:function(){},Fr=null,Br=null,qr=!1,zr=Lr(),Ur=1e4>zr?Lr:function(){return Lr()-zr};function $r(){switch(Pr()){case Rr:return 99;case Nr:return 98;case Or:return 97;case jr:return 96;case Mr:return 95;default:throw Error(c(332))}}function Hr(e){switch(e){case 99:return Rr;case 98:return Nr;case 97:return Or;case 96:return jr;case 95:return Mr;default:throw Error(c(332))}}function Gr(e,t){return e=Hr(e),Er(e,t)}function Zr(e,t,n){return e=Hr(e),Sr(e,t,n)}function Vr(){if(null!==Br){var e=Br;Br=null,Cr(e)}Wr()}function Wr(){if(!qr&&null!==Fr){qr=!0;var e=0;try{var t=Fr;Gr(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fr=null}catch(n){throw null!==Fr&&(Fr=Fr.slice(e+1)),Sr(Rr,Vr),n}finally{qr=!1}}}var Qr=w.ReactCurrentBatchConfig;function Yr(e,t){if(e&&e.defaultProps){for(var n in t=r({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Kr=dr(null),Xr=null,Jr=null,eo=null;function to(){eo=Jr=Xr=null}function no(e){var t=Kr.current;sr(Kr),e.type._context._currentValue=t}function ao(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function ro(e,t){Xr=e,eo=Jr=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Dc=!0),e.firstContext=null)}function oo(e,t){if(eo!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(eo=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Jr){if(null===Xr)throw Error(c(308));Jr=t,Xr.dependencies={lanes:0,firstContext:t,responders:null}}else Jr=Jr.next=t;return e._currentValue}var co=!1;function io(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function so(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function lo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function uo(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function po(e,t){var n=e.updateQueue,a=e.alternate;if(null!==a&&n===(a=a.updateQueue)){var r=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var c={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?r=o=c:o=o.next=c,n=n.next}while(null!==n);null===o?r=o=t:o=o.next=t}else r=o=t;return n={baseState:a.baseState,firstBaseUpdate:r,lastBaseUpdate:o,shared:a.shared,effects:a.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function fo(e,t,n,a){var o=e.updateQueue;co=!1;var c=o.firstBaseUpdate,i=o.lastBaseUpdate,d=o.shared.pending;if(null!==d){o.shared.pending=null;var s=d,l=s.next;s.next=null,null===i?c=l:i.next=l,i=s;var u=e.alternate;if(null!==u){var p=(u=u.updateQueue).lastBaseUpdate;p!==i&&(null===p?u.firstBaseUpdate=l:p.next=l,u.lastBaseUpdate=s)}}if(null!==c){for(p=o.baseState,i=0,u=l=s=null;;){d=c.lane;var f=c.eventTime;if((a&d)===d){null!==u&&(u=u.next={eventTime:f,lane:0,tag:c.tag,payload:c.payload,callback:c.callback,next:null});e:{var b=e,g=c;switch(d=t,f=n,g.tag){case 1:if("function"==typeof(b=g.payload)){p=b.call(f,p,d);break e}p=b;break e;case 3:b.flags=-4097&b.flags|64;case 0:if(null==(d="function"==typeof(b=g.payload)?b.call(f,p,d):b))break e;p=r({},p,d);break e;case 2:co=!0}}null!==c.callback&&(e.flags|=32,null===(d=o.effects)?o.effects=[c]:d.push(c))}else f={eventTime:f,lane:d,tag:c.tag,payload:c.payload,callback:c.callback,next:null},null===u?(l=u=f,s=p):u=u.next=f,i|=d;if(null===(c=c.next)){if(null===(d=o.shared.pending))break;c=d.next,d.next=null,o.lastBaseUpdate=d,o.shared.pending=null}}null===u&&(s=p),o.baseState=s,o.firstBaseUpdate=l,o.lastBaseUpdate=u,zi|=i,e.lanes=i,e.memoizedState=p}}function bo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var a=e[t],r=a.callback;if(null!==r){if(a.callback=null,a=n,"function"!=typeof r)throw Error(c(191,r));r.call(a)}}}var go=(new a.Component).refs;function mo(e,t,n,a){n=null==(n=n(a,t=e.memoizedState))?t:r({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var ho={isMounted:function(e){return!!(e=e._reactInternals)&&Qe(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var a=pd(),r=fd(e),o=lo(a,r);o.payload=t,null!=n&&(o.callback=n),uo(e,o),bd(e,r,a)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var a=pd(),r=fd(e),o=lo(a,r);o.tag=1,o.payload=t,null!=n&&(o.callback=n),uo(e,o),bd(e,r,a)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=pd(),a=fd(e),r=lo(n,a);r.tag=2,null!=t&&(r.callback=t),uo(e,r),bd(e,a,n)}};function yo(e,t,n,a,r,o,c){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(a,o,c):!t.prototype||!t.prototype.isPureReactComponent||(!ua(n,a)||!ua(r,o))}function _o(e,t,n){var a=!1,r=ur,o=t.contextType;return"object"==typeof o&&null!==o?o=oo(o):(r=mr(t)?br:pr.current,o=(a=null!=(a=t.contextTypes))?gr(e,r):ur),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=ho,e.stateNode=t,t._reactInternals=e,a&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=o),t}function vo(e,t,n,a){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,a),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,a),t.state!==e&&ho.enqueueReplaceState(t,t.state,null)}function wo(e,t,n,a){var r=e.stateNode;r.props=n,r.state=e.memoizedState,r.refs=go,io(e);var o=t.contextType;"object"==typeof o&&null!==o?r.context=oo(o):(o=mr(t)?br:pr.current,r.context=gr(e,o)),fo(e,n,r,a),r.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(mo(e,t,o,n),r.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof r.getSnapshotBeforeUpdate||"function"!=typeof r.UNSAFE_componentWillMount&&"function"!=typeof r.componentWillMount||(t=r.state,"function"==typeof r.componentWillMount&&r.componentWillMount(),"function"==typeof r.UNSAFE_componentWillMount&&r.UNSAFE_componentWillMount(),t!==r.state&&ho.enqueueReplaceState(r,r.state,null),fo(e,n,r,a),r.state=e.memoizedState),"function"==typeof r.componentDidMount&&(e.flags|=4)}var xo=Array.isArray;function ko(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(c(309));var a=n.stateNode}if(!a)throw Error(c(147,e));var r=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===r?t.ref:(t=function(e){var t=a.refs;t===go&&(t=a.refs={}),null===e?delete t[r]:t[r]=e},t._stringRef=r,t)}if("string"!=typeof e)throw Error(c(284));if(!n._owner)throw Error(c(290,e))}return e}function Eo(e,t){if("textarea"!==e.type)throw Error(c(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function So(e){function t(t,n){if(e){var a=t.lastEffect;null!==a?(a.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,a){if(!e)return null;for(;null!==a;)t(n,a),a=a.sibling;return null}function a(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function r(e,t){return(e=Zd(e,t)).index=0,e.sibling=null,e}function o(t,n,a){return t.index=a,e?null!==(a=t.alternate)?(a=a.index)<n?(t.flags=2,n):a:(t.flags=2,n):n}function i(t){return e&&null===t.alternate&&(t.flags=2),t}function d(e,t,n,a){return null===t||6!==t.tag?((t=Yd(n,e.mode,a)).return=e,t):((t=r(t,n)).return=e,t)}function s(e,t,n,a){return null!==t&&t.elementType===n.type?((a=r(t,n.props)).ref=ko(e,t,n),a.return=e,a):((a=Vd(n.type,n.key,n.props,null,e.mode,a)).ref=ko(e,t,n),a.return=e,a)}function l(e,t,n,a){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Kd(n,e.mode,a)).return=e,t):((t=r(t,n.children||[])).return=e,t)}function u(e,t,n,a,o){return null===t||7!==t.tag?((t=Wd(n,e.mode,a,o)).return=e,t):((t=r(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Yd(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case x:return(n=Vd(t.type,t.key,t.props,null,e.mode,n)).ref=ko(e,null,t),n.return=e,n;case k:return(t=Kd(t,e.mode,n)).return=e,t}if(xo(t)||U(t))return(t=Wd(t,e.mode,n,null)).return=e,t;Eo(e,t)}return null}function f(e,t,n,a){var r=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==r?null:d(e,t,""+n,a);if("object"==typeof n&&null!==n){switch(n.$$typeof){case x:return n.key===r?n.type===E?u(e,t,n.props.children,a,r):s(e,t,n,a):null;case k:return n.key===r?l(e,t,n,a):null}if(xo(n)||U(n))return null!==r?null:u(e,t,n,a,null);Eo(e,n)}return null}function b(e,t,n,a,r){if("string"==typeof a||"number"==typeof a)return d(t,e=e.get(n)||null,""+a,r);if("object"==typeof a&&null!==a){switch(a.$$typeof){case x:return e=e.get(null===a.key?n:a.key)||null,a.type===E?u(t,e,a.props.children,r,a.key):s(t,e,a,r);case k:return l(t,e=e.get(null===a.key?n:a.key)||null,a,r)}if(xo(a)||U(a))return u(t,e=e.get(n)||null,a,r,null);Eo(t,a)}return null}function g(r,c,i,d){for(var s=null,l=null,u=c,g=c=0,m=null;null!==u&&g<i.length;g++){u.index>g?(m=u,u=null):m=u.sibling;var h=f(r,u,i[g],d);if(null===h){null===u&&(u=m);break}e&&u&&null===h.alternate&&t(r,u),c=o(h,c,g),null===l?s=h:l.sibling=h,l=h,u=m}if(g===i.length)return n(r,u),s;if(null===u){for(;g<i.length;g++)null!==(u=p(r,i[g],d))&&(c=o(u,c,g),null===l?s=u:l.sibling=u,l=u);return s}for(u=a(r,u);g<i.length;g++)null!==(m=b(u,r,g,i[g],d))&&(e&&null!==m.alternate&&u.delete(null===m.key?g:m.key),c=o(m,c,g),null===l?s=m:l.sibling=m,l=m);return e&&u.forEach((function(e){return t(r,e)})),s}function m(r,i,d,s){var l=U(d);if("function"!=typeof l)throw Error(c(150));if(null==(d=l.call(d)))throw Error(c(151));for(var u=l=null,g=i,m=i=0,h=null,y=d.next();null!==g&&!y.done;m++,y=d.next()){g.index>m?(h=g,g=null):h=g.sibling;var _=f(r,g,y.value,s);if(null===_){null===g&&(g=h);break}e&&g&&null===_.alternate&&t(r,g),i=o(_,i,m),null===u?l=_:u.sibling=_,u=_,g=h}if(y.done)return n(r,g),l;if(null===g){for(;!y.done;m++,y=d.next())null!==(y=p(r,y.value,s))&&(i=o(y,i,m),null===u?l=y:u.sibling=y,u=y);return l}for(g=a(r,g);!y.done;m++,y=d.next())null!==(y=b(g,r,m,y.value,s))&&(e&&null!==y.alternate&&g.delete(null===y.key?m:y.key),i=o(y,i,m),null===u?l=y:u.sibling=y,u=y);return e&&g.forEach((function(e){return t(r,e)})),l}return function(e,a,o,d){var s="object"==typeof o&&null!==o&&o.type===E&&null===o.key;s&&(o=o.props.children);var l="object"==typeof o&&null!==o;if(l)switch(o.$$typeof){case x:e:{for(l=o.key,s=a;null!==s;){if(s.key===l){if(7===s.tag){if(o.type===E){n(e,s.sibling),(a=r(s,o.props.children)).return=e,e=a;break e}}else if(s.elementType===o.type){n(e,s.sibling),(a=r(s,o.props)).ref=ko(e,s,o),a.return=e,e=a;break e}n(e,s);break}t(e,s),s=s.sibling}o.type===E?((a=Wd(o.props.children,e.mode,d,o.key)).return=e,e=a):((d=Vd(o.type,o.key,o.props,null,e.mode,d)).ref=ko(e,a,o),d.return=e,e=d)}return i(e);case k:e:{for(s=o.key;null!==a;){if(a.key===s){if(4===a.tag&&a.stateNode.containerInfo===o.containerInfo&&a.stateNode.implementation===o.implementation){n(e,a.sibling),(a=r(a,o.children||[])).return=e,e=a;break e}n(e,a);break}t(e,a),a=a.sibling}(a=Kd(o,e.mode,d)).return=e,e=a}return i(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==a&&6===a.tag?(n(e,a.sibling),(a=r(a,o)).return=e,e=a):(n(e,a),(a=Yd(o,e.mode,d)).return=e,e=a),i(e);if(xo(o))return g(e,a,o,d);if(U(o))return m(e,a,o,d);if(l&&Eo(e,o),void 0===o&&!s)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(c(152,V(e.type)||"Component"))}return n(e,a)}}var Co=So(!0),To=So(!1),Ao={},Lo=dr(Ao),Po=dr(Ao),Ro=dr(Ao);function No(e){if(e===Ao)throw Error(c(174));return e}function Oo(e,t){switch(lr(Ro,t),lr(Po,e),lr(Lo,Ao),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:fe(null,"");break;default:t=fe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}sr(Lo),lr(Lo,t)}function jo(){sr(Lo),sr(Po),sr(Ro)}function Mo(e){No(Ro.current);var t=No(Lo.current),n=fe(t,e.type);t!==n&&(lr(Po,e),lr(Lo,n))}function Do(e){Po.current===e&&(sr(Lo),sr(Po))}var Io=dr(0);function Fo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Bo=null,qo=null,zo=!1;function Uo(e,t){var n=Hd(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function $o(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Ho(e){if(zo){var t=qo;if(t){var n=t;if(!$o(e,t)){if(!(t=Va(n.nextSibling))||!$o(e,t))return e.flags=-1025&e.flags|2,zo=!1,void(Bo=e);Uo(Bo,n)}Bo=e,qo=Va(t.firstChild)}else e.flags=-1025&e.flags|2,zo=!1,Bo=e}}function Go(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Bo=e}function Zo(e){if(e!==Bo)return!1;if(!zo)return Go(e),zo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!$a(t,e.memoizedProps))for(t=qo;t;)Uo(e,t),t=Va(t.nextSibling);if(Go(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(c(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){qo=Va(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}qo=null}}else qo=Bo?Va(e.stateNode.nextSibling):null;return!0}function Vo(){qo=Bo=null,zo=!1}var Wo=[];function Qo(){for(var e=0;e<Wo.length;e++)Wo[e]._workInProgressVersionPrimary=null;Wo.length=0}var Yo=w.ReactCurrentDispatcher,Ko=w.ReactCurrentBatchConfig,Xo=0,Jo=null,ec=null,tc=null,nc=!1,ac=!1;function rc(){throw Error(c(321))}function oc(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!sa(e[n],t[n]))return!1;return!0}function cc(e,t,n,a,r,o){if(Xo=o,Jo=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Yo.current=null===e||null===e.memoizedState?Nc:Oc,e=n(a,r),ac){o=0;do{if(ac=!1,!(25>o))throw Error(c(301));o+=1,tc=ec=null,t.updateQueue=null,Yo.current=jc,e=n(a,r)}while(ac)}if(Yo.current=Rc,t=null!==ec&&null!==ec.next,Xo=0,tc=ec=Jo=null,nc=!1,t)throw Error(c(300));return e}function ic(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===tc?Jo.memoizedState=tc=e:tc=tc.next=e,tc}function dc(){if(null===ec){var e=Jo.alternate;e=null!==e?e.memoizedState:null}else e=ec.next;var t=null===tc?Jo.memoizedState:tc.next;if(null!==t)tc=t,ec=e;else{if(null===e)throw Error(c(310));e={memoizedState:(ec=e).memoizedState,baseState:ec.baseState,baseQueue:ec.baseQueue,queue:ec.queue,next:null},null===tc?Jo.memoizedState=tc=e:tc=tc.next=e}return tc}function sc(e,t){return"function"==typeof t?t(e):t}function lc(e){var t=dc(),n=t.queue;if(null===n)throw Error(c(311));n.lastRenderedReducer=e;var a=ec,r=a.baseQueue,o=n.pending;if(null!==o){if(null!==r){var i=r.next;r.next=o.next,o.next=i}a.baseQueue=r=o,n.pending=null}if(null!==r){r=r.next,a=a.baseState;var d=i=o=null,s=r;do{var l=s.lane;if((Xo&l)===l)null!==d&&(d=d.next={lane:0,action:s.action,eagerReducer:s.eagerReducer,eagerState:s.eagerState,next:null}),a=s.eagerReducer===e?s.eagerState:e(a,s.action);else{var u={lane:l,action:s.action,eagerReducer:s.eagerReducer,eagerState:s.eagerState,next:null};null===d?(i=d=u,o=a):d=d.next=u,Jo.lanes|=l,zi|=l}s=s.next}while(null!==s&&s!==r);null===d?o=a:d.next=i,sa(a,t.memoizedState)||(Dc=!0),t.memoizedState=a,t.baseState=o,t.baseQueue=d,n.lastRenderedState=a}return[t.memoizedState,n.dispatch]}function uc(e){var t=dc(),n=t.queue;if(null===n)throw Error(c(311));n.lastRenderedReducer=e;var a=n.dispatch,r=n.pending,o=t.memoizedState;if(null!==r){n.pending=null;var i=r=r.next;do{o=e(o,i.action),i=i.next}while(i!==r);sa(o,t.memoizedState)||(Dc=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,a]}function pc(e,t,n){var a=t._getVersion;a=a(t._source);var r=t._workInProgressVersionPrimary;if(null!==r?e=r===a:(e=e.mutableReadLanes,(e=(Xo&e)===e)&&(t._workInProgressVersionPrimary=a,Wo.push(t))),e)return n(t._source);throw Wo.push(t),Error(c(350))}function fc(e,t,n,a){var r=Oi;if(null===r)throw Error(c(349));var o=t._getVersion,i=o(t._source),d=Yo.current,s=d.useState((function(){return pc(r,t,n)})),l=s[1],u=s[0];s=tc;var p=e.memoizedState,f=p.refs,b=f.getSnapshot,g=p.source;p=p.subscribe;var m=Jo;return e.memoizedState={refs:f,source:t,subscribe:a},d.useEffect((function(){f.getSnapshot=n,f.setSnapshot=l;var e=o(t._source);if(!sa(i,e)){e=n(t._source),sa(u,e)||(l(e),e=fd(m),r.mutableReadLanes|=e&r.pendingLanes),e=r.mutableReadLanes,r.entangledLanes|=e;for(var a=r.entanglements,c=e;0<c;){var d=31-$t(c),s=1<<d;a[d]|=e,c&=~s}}}),[n,t,a]),d.useEffect((function(){return a(t._source,(function(){var e=f.getSnapshot,n=f.setSnapshot;try{n(e(t._source));var a=fd(m);r.mutableReadLanes|=a&r.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,a]),sa(b,n)&&sa(g,t)&&sa(p,a)||((e={pending:null,dispatch:null,lastRenderedReducer:sc,lastRenderedState:u}).dispatch=l=Pc.bind(null,Jo,e),s.queue=e,s.baseQueue=null,u=pc(r,t,n),s.memoizedState=s.baseState=u),u}function bc(e,t,n){return fc(dc(),e,t,n)}function gc(e){var t=ic();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:sc,lastRenderedState:e}).dispatch=Pc.bind(null,Jo,e),[t.memoizedState,e]}function mc(e,t,n,a){return e={tag:e,create:t,destroy:n,deps:a,next:null},null===(t=Jo.updateQueue)?(t={lastEffect:null},Jo.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(a=n.next,n.next=e,e.next=a,t.lastEffect=e),e}function hc(e){return e={current:e},ic().memoizedState=e}function yc(){return dc().memoizedState}function _c(e,t,n,a){var r=ic();Jo.flags|=e,r.memoizedState=mc(1|t,n,void 0,void 0===a?null:a)}function vc(e,t,n,a){var r=dc();a=void 0===a?null:a;var o=void 0;if(null!==ec){var c=ec.memoizedState;if(o=c.destroy,null!==a&&oc(a,c.deps))return void mc(t,n,o,a)}Jo.flags|=e,r.memoizedState=mc(1|t,n,o,a)}function wc(e,t){return _c(516,4,e,t)}function xc(e,t){return vc(516,4,e,t)}function kc(e,t){return vc(4,2,e,t)}function Ec(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Sc(e,t,n){return n=null!=n?n.concat([e]):null,vc(4,2,Ec.bind(null,t,e),n)}function Cc(){}function Tc(e,t){var n=dc();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&oc(t,a[1])?a[0]:(n.memoizedState=[e,t],e)}function Ac(e,t){var n=dc();t=void 0===t?null:t;var a=n.memoizedState;return null!==a&&null!==t&&oc(t,a[1])?a[0]:(e=e(),n.memoizedState=[e,t],e)}function Lc(e,t){var n=$r();Gr(98>n?98:n,(function(){e(!0)})),Gr(97<n?97:n,(function(){var n=Ko.transition;Ko.transition=1;try{e(!1),t()}finally{Ko.transition=n}}))}function Pc(e,t,n){var a=pd(),r=fd(e),o={lane:r,action:n,eagerReducer:null,eagerState:null,next:null},c=t.pending;if(null===c?o.next=o:(o.next=c.next,c.next=o),t.pending=o,c=e.alternate,e===Jo||null!==c&&c===Jo)ac=nc=!0;else{if(0===e.lanes&&(null===c||0===c.lanes)&&null!==(c=t.lastRenderedReducer))try{var i=t.lastRenderedState,d=c(i,n);if(o.eagerReducer=c,o.eagerState=d,sa(d,i))return}catch(s){}bd(e,r,a)}}var Rc={readContext:oo,useCallback:rc,useContext:rc,useEffect:rc,useImperativeHandle:rc,useLayoutEffect:rc,useMemo:rc,useReducer:rc,useRef:rc,useState:rc,useDebugValue:rc,useDeferredValue:rc,useTransition:rc,useMutableSource:rc,useOpaqueIdentifier:rc,unstable_isNewReconciler:!1},Nc={readContext:oo,useCallback:function(e,t){return ic().memoizedState=[e,void 0===t?null:t],e},useContext:oo,useEffect:wc,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,_c(4,2,Ec.bind(null,t,e),n)},useLayoutEffect:function(e,t){return _c(4,2,e,t)},useMemo:function(e,t){var n=ic();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var a=ic();return t=void 0!==n?n(t):t,a.memoizedState=a.baseState=t,e=(e=a.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Pc.bind(null,Jo,e),[a.memoizedState,e]},useRef:hc,useState:gc,useDebugValue:Cc,useDeferredValue:function(e){var t=gc(e),n=t[0],a=t[1];return wc((function(){var t=Ko.transition;Ko.transition=1;try{a(e)}finally{Ko.transition=t}}),[e]),n},useTransition:function(){var e=gc(!1),t=e[0];return hc(e=Lc.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var a=ic();return a.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},fc(a,e,t,n)},useOpaqueIdentifier:function(){if(zo){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Qa++).toString(36))),Error(c(355))})),n=gc(t)[1];return 0==(2&Jo.mode)&&(Jo.flags|=516,mc(5,(function(){n("r:"+(Qa++).toString(36))}),void 0,null)),t}return gc(t="r:"+(Qa++).toString(36)),t},unstable_isNewReconciler:!1},Oc={readContext:oo,useCallback:Tc,useContext:oo,useEffect:xc,useImperativeHandle:Sc,useLayoutEffect:kc,useMemo:Ac,useReducer:lc,useRef:yc,useState:function(){return lc(sc)},useDebugValue:Cc,useDeferredValue:function(e){var t=lc(sc),n=t[0],a=t[1];return xc((function(){var t=Ko.transition;Ko.transition=1;try{a(e)}finally{Ko.transition=t}}),[e]),n},useTransition:function(){var e=lc(sc)[0];return[yc().current,e]},useMutableSource:bc,useOpaqueIdentifier:function(){return lc(sc)[0]},unstable_isNewReconciler:!1},jc={readContext:oo,useCallback:Tc,useContext:oo,useEffect:xc,useImperativeHandle:Sc,useLayoutEffect:kc,useMemo:Ac,useReducer:uc,useRef:yc,useState:function(){return uc(sc)},useDebugValue:Cc,useDeferredValue:function(e){var t=uc(sc),n=t[0],a=t[1];return xc((function(){var t=Ko.transition;Ko.transition=1;try{a(e)}finally{Ko.transition=t}}),[e]),n},useTransition:function(){var e=uc(sc)[0];return[yc().current,e]},useMutableSource:bc,useOpaqueIdentifier:function(){return uc(sc)[0]},unstable_isNewReconciler:!1},Mc=w.ReactCurrentOwner,Dc=!1;function Ic(e,t,n,a){t.child=null===e?To(t,null,n,a):Co(t,e.child,n,a)}function Fc(e,t,n,a,r){n=n.render;var o=t.ref;return ro(t,r),a=cc(e,t,n,a,o,r),null===e||Dc?(t.flags|=1,Ic(e,t,a,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,oi(e,t,r))}function Bc(e,t,n,a,r,o){if(null===e){var c=n.type;return"function"!=typeof c||Gd(c)||void 0!==c.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Vd(n.type,null,a,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=c,qc(e,t,c,a,r,o))}return c=e.child,0==(r&o)&&(r=c.memoizedProps,(n=null!==(n=n.compare)?n:ua)(r,a)&&e.ref===t.ref)?oi(e,t,o):(t.flags|=1,(e=Zd(c,a)).ref=t.ref,e.return=t,t.child=e)}function qc(e,t,n,a,r,o){if(null!==e&&ua(e.memoizedProps,a)&&e.ref===t.ref){if(Dc=!1,0==(o&r))return t.lanes=e.lanes,oi(e,t,o);0!=(16384&e.flags)&&(Dc=!0)}return $c(e,t,n,a,o)}function zc(e,t,n){var a=t.pendingProps,r=a.children,o=null!==e?e.memoizedState:null;if("hidden"===a.mode||"unstable-defer-without-hiding"===a.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},xd(t,n);else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},xd(t,e),null;t.memoizedState={baseLanes:0},xd(t,null!==o?o.baseLanes:n)}else null!==o?(a=o.baseLanes|n,t.memoizedState=null):a=n,xd(t,a);return Ic(e,t,r,n),t.child}function Uc(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function $c(e,t,n,a,r){var o=mr(n)?br:pr.current;return o=gr(t,o),ro(t,r),n=cc(e,t,n,a,o,r),null===e||Dc?(t.flags|=1,Ic(e,t,n,r),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~r,oi(e,t,r))}function Hc(e,t,n,a,r){if(mr(n)){var o=!0;vr(t)}else o=!1;if(ro(t,r),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),_o(t,n,a),wo(t,n,a,r),a=!0;else if(null===e){var c=t.stateNode,i=t.memoizedProps;c.props=i;var d=c.context,s=n.contextType;"object"==typeof s&&null!==s?s=oo(s):s=gr(t,s=mr(n)?br:pr.current);var l=n.getDerivedStateFromProps,u="function"==typeof l||"function"==typeof c.getSnapshotBeforeUpdate;u||"function"!=typeof c.UNSAFE_componentWillReceiveProps&&"function"!=typeof c.componentWillReceiveProps||(i!==a||d!==s)&&vo(t,c,a,s),co=!1;var p=t.memoizedState;c.state=p,fo(t,a,c,r),d=t.memoizedState,i!==a||p!==d||fr.current||co?("function"==typeof l&&(mo(t,n,l,a),d=t.memoizedState),(i=co||yo(t,n,i,a,p,d,s))?(u||"function"!=typeof c.UNSAFE_componentWillMount&&"function"!=typeof c.componentWillMount||("function"==typeof c.componentWillMount&&c.componentWillMount(),"function"==typeof c.UNSAFE_componentWillMount&&c.UNSAFE_componentWillMount()),"function"==typeof c.componentDidMount&&(t.flags|=4)):("function"==typeof c.componentDidMount&&(t.flags|=4),t.memoizedProps=a,t.memoizedState=d),c.props=a,c.state=d,c.context=s,a=i):("function"==typeof c.componentDidMount&&(t.flags|=4),a=!1)}else{c=t.stateNode,so(e,t),i=t.memoizedProps,s=t.type===t.elementType?i:Yr(t.type,i),c.props=s,u=t.pendingProps,p=c.context,"object"==typeof(d=n.contextType)&&null!==d?d=oo(d):d=gr(t,d=mr(n)?br:pr.current);var f=n.getDerivedStateFromProps;(l="function"==typeof f||"function"==typeof c.getSnapshotBeforeUpdate)||"function"!=typeof c.UNSAFE_componentWillReceiveProps&&"function"!=typeof c.componentWillReceiveProps||(i!==u||p!==d)&&vo(t,c,a,d),co=!1,p=t.memoizedState,c.state=p,fo(t,a,c,r);var b=t.memoizedState;i!==u||p!==b||fr.current||co?("function"==typeof f&&(mo(t,n,f,a),b=t.memoizedState),(s=co||yo(t,n,s,a,p,b,d))?(l||"function"!=typeof c.UNSAFE_componentWillUpdate&&"function"!=typeof c.componentWillUpdate||("function"==typeof c.componentWillUpdate&&c.componentWillUpdate(a,b,d),"function"==typeof c.UNSAFE_componentWillUpdate&&c.UNSAFE_componentWillUpdate(a,b,d)),"function"==typeof c.componentDidUpdate&&(t.flags|=4),"function"==typeof c.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof c.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof c.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),t.memoizedProps=a,t.memoizedState=b),c.props=a,c.state=b,c.context=d,a=s):("function"!=typeof c.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof c.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=256),a=!1)}return Gc(e,t,n,a,o,r)}function Gc(e,t,n,a,r,o){Uc(e,t);var c=0!=(64&t.flags);if(!a&&!c)return r&&wr(t,n,!1),oi(e,t,o);a=t.stateNode,Mc.current=t;var i=c&&"function"!=typeof n.getDerivedStateFromError?null:a.render();return t.flags|=1,null!==e&&c?(t.child=Co(t,e.child,null,o),t.child=Co(t,null,i,o)):Ic(e,t,i,o),t.memoizedState=a.state,r&&wr(t,n,!0),t.child}function Zc(e){var t=e.stateNode;t.pendingContext?yr(0,t.pendingContext,t.pendingContext!==t.context):t.context&&yr(0,t.context,!1),Oo(e,t.containerInfo)}var Vc,Wc,Qc,Yc,Kc={dehydrated:null,retryLane:0};function Xc(e,t,n){var a,r=t.pendingProps,o=Io.current,c=!1;return(a=0!=(64&t.flags))||(a=(null===e||null!==e.memoizedState)&&0!=(2&o)),a?(c=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===r.fallback||!0===r.unstable_avoidThisFallback||(o|=1),lr(Io,1&o),null===e?(void 0!==r.fallback&&Ho(t),e=r.children,o=r.fallback,c?(e=Jc(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Kc,e):"number"==typeof r.unstable_expectedLoadTime?(e=Jc(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Kc,t.lanes=33554432,e):((n=Qd({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,c?(r=ti(e,t,r.children,r.fallback,n),c=t.child,o=e.child.memoizedState,c.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},c.childLanes=e.childLanes&~n,t.memoizedState=Kc,r):(n=ei(e,t,r.children,n),t.memoizedState=null,n))}function Jc(e,t,n,a){var r=e.mode,o=e.child;return t={mode:"hidden",children:t},0==(2&r)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=Qd(t,r,0,null),n=Wd(n,r,a,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function ei(e,t,n,a){var r=e.child;return e=r.sibling,n=Zd(r,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=a),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function ti(e,t,n,a,r){var o=t.mode,c=e.child;e=c.sibling;var i={mode:"hidden",children:n};return 0==(2&o)&&t.child!==c?((n=t.child).childLanes=0,n.pendingProps=i,null!==(c=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=c,c.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Zd(c,i),null!==e?a=Zd(e,a):(a=Wd(a,o,r,null)).flags|=2,a.return=t,n.return=t,n.sibling=a,t.child=n,a}function ni(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ao(e.return,t)}function ai(e,t,n,a,r,o){var c=e.memoizedState;null===c?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:n,tailMode:r,lastEffect:o}:(c.isBackwards=t,c.rendering=null,c.renderingStartTime=0,c.last=a,c.tail=n,c.tailMode=r,c.lastEffect=o)}function ri(e,t,n){var a=t.pendingProps,r=a.revealOrder,o=a.tail;if(Ic(e,t,a.children,n),0!=(2&(a=Io.current)))a=1&a|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&ni(e,n);else if(19===e.tag)ni(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}if(lr(Io,a),0==(2&t.mode))t.memoizedState=null;else switch(r){case"forwards":for(n=t.child,r=null;null!==n;)null!==(e=n.alternate)&&null===Fo(e)&&(r=n),n=n.sibling;null===(n=r)?(r=t.child,t.child=null):(r=n.sibling,n.sibling=null),ai(t,!1,r,n,o,t.lastEffect);break;case"backwards":for(n=null,r=t.child,t.child=null;null!==r;){if(null!==(e=r.alternate)&&null===Fo(e)){t.child=r;break}e=r.sibling,r.sibling=n,n=r,r=e}ai(t,!0,n,null,o,t.lastEffect);break;case"together":ai(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function oi(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),zi|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(c(153));if(null!==t.child){for(n=Zd(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Zd(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function ci(e,t){if(!zo)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var a=null;null!==n;)null!==n.alternate&&(a=n),n=n.sibling;null===a?t||null===e.tail?e.tail=null:e.tail.sibling=null:a.sibling=null}}function ii(e,t,n){var a=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return mr(t.type)&&hr(),null;case 3:return jo(),sr(fr),sr(pr),Qo(),(a=t.stateNode).pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),null!==e&&null!==e.child||(Zo(t)?t.flags|=4:a.hydrate||(t.flags|=256)),Wc(t),null;case 5:Do(t);var o=No(Ro.current);if(n=t.type,null!==e&&null!=t.stateNode)Qc(e,t,n,a,o),e.ref!==t.ref&&(t.flags|=128);else{if(!a){if(null===t.stateNode)throw Error(c(166));return null}if(e=No(Lo.current),Zo(t)){a=t.stateNode,n=t.type;var i=t.memoizedProps;switch(a[Ka]=t,a[Xa]=i,n){case"dialog":La("cancel",a),La("close",a);break;case"iframe":case"object":case"embed":La("load",a);break;case"video":case"audio":for(e=0;e<Sa.length;e++)La(Sa[e],a);break;case"source":La("error",a);break;case"img":case"image":case"link":La("error",a),La("load",a);break;case"details":La("toggle",a);break;case"input":ee(a,i),La("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!i.multiple},La("invalid",a);break;case"textarea":de(a,i),La("invalid",a)}for(var s in ke(n,i),e=null,i)i.hasOwnProperty(s)&&(o=i[s],"children"===s?"string"==typeof o?a.textContent!==o&&(e=["children",o]):"number"==typeof o&&a.textContent!==""+o&&(e=["children",""+o]):d.hasOwnProperty(s)&&null!=o&&"onScroll"===s&&La("scroll",a));switch(n){case"input":Y(a),ae(a,i,!0);break;case"textarea":Y(a),le(a);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(a.onclick=Ba)}a=e,t.updateQueue=a,null!==a&&(t.flags|=4)}else{switch(s=9===o.nodeType?o:o.ownerDocument,e===ue.html&&(e=pe(n)),e===ue.html?"script"===n?((e=s.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof a.is?e=s.createElement(n,{is:a.is}):(e=s.createElement(n),"select"===n&&(s=e,a.multiple?s.multiple=!0:a.size&&(s.size=a.size))):e=s.createElementNS(e,n),e[Ka]=t,e[Xa]=a,Vc(e,t,!1,!1),t.stateNode=e,s=Ee(n,a),n){case"dialog":La("cancel",e),La("close",e),o=a;break;case"iframe":case"object":case"embed":La("load",e),o=a;break;case"video":case"audio":for(o=0;o<Sa.length;o++)La(Sa[o],e);o=a;break;case"source":La("error",e),o=a;break;case"img":case"image":case"link":La("error",e),La("load",e),o=a;break;case"details":La("toggle",e),o=a;break;case"input":ee(e,a),o=J(e,a),La("invalid",e);break;case"option":o=oe(e,a);break;case"select":e._wrapperState={wasMultiple:!!a.multiple},o=r({},a,{value:void 0}),La("invalid",e);break;case"textarea":de(e,a),o=ie(e,a),La("invalid",e);break;default:o=a}ke(n,o);var l=o;for(i in l)if(l.hasOwnProperty(i)){var u=l[i];"style"===i?we(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&me(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&he(e,u):"number"==typeof u&&he(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(d.hasOwnProperty(i)?null!=u&&"onScroll"===i&&La("scroll",e):null!=u&&v(e,i,u,s))}switch(n){case"input":Y(e),ae(e,a,!1);break;case"textarea":Y(e),le(e);break;case"option":null!=a.value&&e.setAttribute("value",""+W(a.value));break;case"select":e.multiple=!!a.multiple,null!=(i=a.value)?ce(e,!!a.multiple,i,!1):null!=a.defaultValue&&ce(e,!!a.multiple,a.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Ba)}Ua(n,a)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Yc(e,t,e.memoizedProps,a);else{if("string"!=typeof a&&null===t.stateNode)throw Error(c(166));n=No(Ro.current),No(Lo.current),Zo(t)?(a=t.stateNode,n=t.memoizedProps,a[Ka]=t,a.nodeValue!==n&&(t.flags|=4)):((a=(9===n.nodeType?n:n.ownerDocument).createTextNode(a))[Ka]=t,t.stateNode=a)}return null;case 13:return sr(Io),a=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(a=null!==a,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Zo(t):n=null!==e.memoizedState,a&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Io.current)?0===Fi&&(Fi=3):(0!==Fi&&3!==Fi||(Fi=4),null===Oi||0==(134217727&zi)&&0==(134217727&Ui)||yd(Oi,Mi))),(a||n)&&(t.flags|=4),null);case 4:return jo(),Wc(t),null===e&&Ra(t.stateNode.containerInfo),null;case 10:return no(t),null;case 19:if(sr(Io),null===(a=t.memoizedState))return null;if(i=0!=(64&t.flags),null===(s=a.rendering))if(i)ci(a,!1);else{if(0!==Fi||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(s=Fo(e))){for(t.flags|=64,ci(a,!1),null!==(i=s.updateQueue)&&(t.updateQueue=i,t.flags|=4),null===a.lastEffect&&(t.firstEffect=null),t.lastEffect=a.lastEffect,a=n,n=t.child;null!==n;)e=a,(i=n).flags&=2,i.nextEffect=null,i.firstEffect=null,i.lastEffect=null,null===(s=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=s.childLanes,i.lanes=s.lanes,i.child=s.child,i.memoizedProps=s.memoizedProps,i.memoizedState=s.memoizedState,i.updateQueue=s.updateQueue,i.type=s.type,e=s.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return lr(Io,1&Io.current|2),t.child}e=e.sibling}null!==a.tail&&Ur()>Zi&&(t.flags|=64,i=!0,ci(a,!1),t.lanes=33554432)}else{if(!i)if(null!==(e=Fo(s))){if(t.flags|=64,i=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),ci(a,!0),null===a.tail&&"hidden"===a.tailMode&&!s.alternate&&!zo)return null!==(t=t.lastEffect=a.lastEffect)&&(t.nextEffect=null),null}else 2*Ur()-a.renderingStartTime>Zi&&1073741824!==n&&(t.flags|=64,i=!0,ci(a,!1),t.lanes=33554432);a.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=a.last)?n.sibling=s:t.child=s,a.last=s)}return null!==a.tail?(n=a.tail,a.rendering=n,a.tail=n.sibling,a.lastEffect=t.lastEffect,a.renderingStartTime=Ur(),n.sibling=null,t=Io.current,lr(Io,i?1&t|2:1&t),n):null;case 23:case 24:return kd(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==a.mode&&(t.flags|=4),null}throw Error(c(156,t.tag))}function di(e){switch(e.tag){case 1:mr(e.type)&&hr();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(jo(),sr(fr),sr(pr),Qo(),0!=(64&(t=e.flags)))throw Error(c(285));return e.flags=-4097&t|64,e;case 5:return Do(e),null;case 13:return sr(Io),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return sr(Io),null;case 4:return jo(),null;case 10:return no(e),null;case 23:case 24:return kd(),null;default:return null}}function si(e,t){try{var n="",a=t;do{n+=Z(a),a=a.return}while(a);var r=n}catch(o){r="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:r}}function li(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}Vc=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Wc=function(){},Qc=function(e,t,n,a){var o=e.memoizedProps;if(o!==a){e=t.stateNode,No(Lo.current);var c,i=null;switch(n){case"input":o=J(e,o),a=J(e,a),i=[];break;case"option":o=oe(e,o),a=oe(e,a),i=[];break;case"select":o=r({},o,{value:void 0}),a=r({},a,{value:void 0}),i=[];break;case"textarea":o=ie(e,o),a=ie(e,a),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof a.onClick&&(e.onclick=Ba)}for(u in ke(n,a),n=null,o)if(!a.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var s=o[u];for(c in s)s.hasOwnProperty(c)&&(n||(n={}),n[c]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(d.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in a){var l=a[u];if(s=null!=o?o[u]:void 0,a.hasOwnProperty(u)&&l!==s&&(null!=l||null!=s))if("style"===u)if(s){for(c in s)!s.hasOwnProperty(c)||l&&l.hasOwnProperty(c)||(n||(n={}),n[c]="");for(c in l)l.hasOwnProperty(c)&&s[c]!==l[c]&&(n||(n={}),n[c]=l[c])}else n||(i||(i=[]),i.push(u,n)),n=l;else"dangerouslySetInnerHTML"===u?(l=l?l.__html:void 0,s=s?s.__html:void 0,null!=l&&s!==l&&(i=i||[]).push(u,l)):"children"===u?"string"!=typeof l&&"number"!=typeof l||(i=i||[]).push(u,""+l):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(d.hasOwnProperty(u)?(null!=l&&"onScroll"===u&&La("scroll",e),i||s===l||(i=[])):"object"==typeof l&&null!==l&&l.$$typeof===M?l.toString():(i=i||[]).push(u,l))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Yc=function(e,t,n,a){n!==a&&(t.flags|=4)};var ui="function"==typeof WeakMap?WeakMap:Map;function pi(e,t,n){(n=lo(-1,n)).tag=3,n.payload={element:null};var a=t.value;return n.callback=function(){Yi||(Yi=!0,Ki=a),li(0,t)},n}function fi(e,t,n){(n=lo(-1,n)).tag=3;var a=e.type.getDerivedStateFromError;if("function"==typeof a){var r=t.value;n.payload=function(){return li(0,t),a(r)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof a&&(null===Xi?Xi=new Set([this]):Xi.add(this),li(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var bi="function"==typeof WeakSet?WeakSet:Set;function gi(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){qd(e,n)}else t.current=null}function mi(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,a=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Yr(t.type,n),a),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Za(t.stateNode.containerInfo))}throw Error(c(163))}function hi(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var a=e.create;e.destroy=a()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var r=e;a=r.next,0!=(4&(r=r.tag))&&0!=(1&r)&&(Id(n,e),Dd(n,e)),e=a}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(a=n.elementType===n.type?t.memoizedProps:Yr(n.type,t.memoizedProps),e.componentDidUpdate(a,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&bo(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}bo(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&Ua(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&wt(n)))))}throw Error(c(163))}function yi(e,t){for(var n=e;;){if(5===n.tag){var a=n.stateNode;if(t)"function"==typeof(a=a.style).setProperty?a.setProperty("display","none","important"):a.display="none";else{a=n.stateNode;var r=n.memoizedProps.style;r=null!=r&&r.hasOwnProperty("display")?r.display:null,a.style.display=ve("display",r)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function _i(e,t){if(kr&&"function"==typeof kr.onCommitFiberUnmount)try{kr.onCommitFiberUnmount(xr,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var a=n,r=a.destroy;if(a=a.tag,void 0!==r)if(0!=(4&a))Id(t,n);else{a=t;try{r()}catch(o){qd(a,o)}}n=n.next}while(n!==e)}break;case 1:if(gi(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){qd(t,o)}break;case 5:gi(t);break;case 4:Si(e,t)}}function vi(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function wi(e){return 5===e.tag||3===e.tag||4===e.tag}function xi(e){e:{for(var t=e.return;null!==t;){if(wi(t))break e;t=t.return}throw Error(c(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var a=!1;break;case 3:case 4:t=t.containerInfo,a=!0;break;default:throw Error(c(161))}16&n.flags&&(he(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||wi(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}a?ki(e,n,t):Ei(e,n,t)}function ki(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Ba));else if(4!==a&&null!==(e=e.child))for(ki(e,t,n),e=e.sibling;null!==e;)ki(e,t,n),e=e.sibling}function Ei(e,t,n){var a=e.tag,r=5===a||6===a;if(r)e=r?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==a&&null!==(e=e.child))for(Ei(e,t,n),e=e.sibling;null!==e;)Ei(e,t,n),e=e.sibling}function Si(e,t){for(var n,a,r=t,o=!1;;){if(!o){o=r.return;e:for(;;){if(null===o)throw Error(c(160));switch(n=o.stateNode,o.tag){case 5:a=!1;break e;case 3:case 4:n=n.containerInfo,a=!0;break e}o=o.return}o=!0}if(5===r.tag||6===r.tag){e:for(var i=e,d=r,s=d;;)if(_i(i,s),null!==s.child&&4!==s.tag)s.child.return=s,s=s.child;else{if(s===d)break e;for(;null===s.sibling;){if(null===s.return||s.return===d)break e;s=s.return}s.sibling.return=s.return,s=s.sibling}a?(i=n,d=r.stateNode,8===i.nodeType?i.parentNode.removeChild(d):i.removeChild(d)):n.removeChild(r.stateNode)}else if(4===r.tag){if(null!==r.child){n=r.stateNode.containerInfo,a=!0,r.child.return=r,r=r.child;continue}}else if(_i(e,r),null!==r.child){r.child.return=r,r=r.child;continue}if(r===t)break;for(;null===r.sibling;){if(null===r.return||r.return===t)return;4===(r=r.return).tag&&(o=!1)}r.sibling.return=r.return,r=r.sibling}}function Ci(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var a=n=n.next;do{3==(3&a.tag)&&(e=a.destroy,a.destroy=void 0,void 0!==e&&e()),a=a.next}while(a!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){a=t.memoizedProps;var r=null!==e?e.memoizedProps:a;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Xa]=a,"input"===e&&"radio"===a.type&&null!=a.name&&te(n,a),Ee(e,r),t=Ee(e,a),r=0;r<o.length;r+=2){var i=o[r],d=o[r+1];"style"===i?we(n,d):"dangerouslySetInnerHTML"===i?me(n,d):"children"===i?he(n,d):v(n,i,d,t)}switch(e){case"input":ne(n,a);break;case"textarea":se(n,a);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!a.multiple,null!=(o=a.value)?ce(n,!!a.multiple,o,!1):e!==!!a.multiple&&(null!=a.defaultValue?ce(n,!!a.multiple,a.defaultValue,!0):ce(n,!!a.multiple,a.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(c(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,wt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Gi=Ur(),yi(t.child,!0)),void Ti(t);case 19:return void Ti(t);case 23:case 24:return void yi(t,null!==t.memoizedState)}throw Error(c(163))}function Ti(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new bi),t.forEach((function(t){var a=Ud.bind(null,e,t);n.has(t)||(n.add(t),t.then(a,a))}))}}function Ai(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Li=Math.ceil,Pi=w.ReactCurrentDispatcher,Ri=w.ReactCurrentOwner,Ni=0,Oi=null,ji=null,Mi=0,Di=0,Ii=dr(0),Fi=0,Bi=null,qi=0,zi=0,Ui=0,$i=0,Hi=null,Gi=0,Zi=1/0;function Vi(){Zi=Ur()+500}var Wi,Qi=null,Yi=!1,Ki=null,Xi=null,Ji=!1,ed=null,td=90,nd=[],ad=[],rd=null,od=0,cd=null,id=-1,dd=0,sd=0,ld=null,ud=!1;function pd(){return 0!=(48&Ni)?Ur():-1!==id?id:id=Ur()}function fd(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===$r()?1:2;if(0===dd&&(dd=qi),0!==Qr.transition){0!==sd&&(sd=null!==Hi?Hi.pendingLanes:0),e=dd;var t=4186112&~sd;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=$r(),0!=(4&Ni)&&98===e?e=Bt(12,dd):e=Bt(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),dd),e}function bd(e,t,n){if(50<od)throw od=0,cd=null,Error(c(185));if(null===(e=gd(e,t)))return null;Ut(e,t,n),e===Oi&&(Ui|=t,4===Fi&&yd(e,Mi));var a=$r();1===t?0!=(8&Ni)&&0==(48&Ni)?_d(e):(md(e,n),0===Ni&&(Vi(),Vr())):(0==(4&Ni)||98!==a&&99!==a||(null===rd?rd=new Set([e]):rd.add(e)),md(e,n)),Hi=e}function gd(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function md(e,t){for(var n=e.callbackNode,a=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,i=e.pendingLanes;0<i;){var d=31-$t(i),s=1<<d,l=o[d];if(-1===l){if(0==(s&a)||0!=(s&r)){l=t,Dt(s);var u=Mt;o[d]=10<=u?l+250:6<=u?l+5e3:-1}}else l<=t&&(e.expiredLanes|=s);i&=~s}if(a=It(e,e===Oi?Mi:0),t=Mt,0===a)null!==n&&(n!==Dr&&Cr(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Dr&&Cr(n)}15===t?(n=_d.bind(null,e),null===Fr?(Fr=[n],Br=Sr(Rr,Wr)):Fr.push(n),n=Dr):14===t?n=Zr(99,_d.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(c(358,e))}}(t),n=Zr(n,hd.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function hd(e){if(id=-1,sd=dd=0,0!=(48&Ni))throw Error(c(327));var t=e.callbackNode;if(Md()&&e.callbackNode!==t)return null;var n=It(e,e===Oi?Mi:0);if(0===n)return null;var a=n,r=Ni;Ni|=16;var o=Cd();for(Oi===e&&Mi===a||(Vi(),Ed(e,a));;)try{Ld();break}catch(d){Sd(e,d)}if(to(),Pi.current=o,Ni=r,null!==ji?a=0:(Oi=null,Mi=0,a=Fi),0!=(qi&Ui))Ed(e,0);else if(0!==a){if(2===a&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Za(e.containerInfo)),0!==(n=Ft(e))&&(a=Td(e,n))),1===a)throw t=Bi,Ed(e,0),yd(e,n),md(e,Ur()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,a){case 0:case 1:throw Error(c(345));case 2:case 5:Nd(e);break;case 3:if(yd(e,n),(62914560&n)===n&&10<(a=Gi+500-Ur())){if(0!==It(e,0))break;if(((r=e.suspendedLanes)&n)!==n){pd(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=Ha(Nd.bind(null,e),a);break}Nd(e);break;case 4:if(yd(e,n),(4186112&n)===n)break;for(a=e.eventTimes,r=-1;0<n;){var i=31-$t(n);o=1<<i,(i=a[i])>r&&(r=i),n&=~o}if(n=r,10<(n=(120>(n=Ur()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Li(n/1960))-n)){e.timeoutHandle=Ha(Nd.bind(null,e),n);break}Nd(e);break;default:throw Error(c(329))}}return md(e,Ur()),e.callbackNode===t?hd.bind(null,e):null}function yd(e,t){for(t&=~$i,t&=~Ui,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-$t(t),a=1<<n;e[n]=-1,t&=~a}}function _d(e){if(0!=(48&Ni))throw Error(c(327));if(Md(),e===Oi&&0!=(e.expiredLanes&Mi)){var t=Mi,n=Td(e,t);0!=(qi&Ui)&&(n=Td(e,t=It(e,t)))}else n=Td(e,t=It(e,0));if(0!==e.tag&&2===n&&(Ni|=64,e.hydrate&&(e.hydrate=!1,Za(e.containerInfo)),0!==(t=Ft(e))&&(n=Td(e,t))),1===n)throw n=Bi,Ed(e,0),yd(e,t),md(e,Ur()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Nd(e),md(e,Ur()),null}function vd(e,t){var n=Ni;Ni|=1;try{return e(t)}finally{0===(Ni=n)&&(Vi(),Vr())}}function wd(e,t){var n=Ni;Ni&=-2,Ni|=8;try{return e(t)}finally{0===(Ni=n)&&(Vi(),Vr())}}function xd(e,t){lr(Ii,Di),Di|=t,qi|=t}function kd(){Di=Ii.current,sr(Ii)}function Ed(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Ga(n)),null!==ji)for(n=ji.return;null!==n;){var a=n;switch(a.tag){case 1:null!=(a=a.type.childContextTypes)&&hr();break;case 3:jo(),sr(fr),sr(pr),Qo();break;case 5:Do(a);break;case 4:jo();break;case 13:case 19:sr(Io);break;case 10:no(a);break;case 23:case 24:kd()}n=n.return}Oi=e,ji=Zd(e.current,null),Mi=Di=qi=t,Fi=0,Bi=null,$i=Ui=zi=0}function Sd(e,t){for(;;){var n=ji;try{if(to(),Yo.current=Rc,nc){for(var a=Jo.memoizedState;null!==a;){var r=a.queue;null!==r&&(r.pending=null),a=a.next}nc=!1}if(Xo=0,tc=ec=Jo=null,ac=!1,Ri.current=null,null===n||null===n.return){Fi=1,Bi=t,ji=null;break}e:{var o=e,c=n.return,i=n,d=t;if(t=Mi,i.flags|=2048,i.firstEffect=i.lastEffect=null,null!==d&&"object"==typeof d&&"function"==typeof d.then){var s=d;if(0==(2&i.mode)){var l=i.alternate;l?(i.updateQueue=l.updateQueue,i.memoizedState=l.memoizedState,i.lanes=l.lanes):(i.updateQueue=null,i.memoizedState=null)}var u=0!=(1&Io.current),p=c;do{var f;if(f=13===p.tag){var b=p.memoizedState;if(null!==b)f=null!==b.dehydrated;else{var g=p.memoizedProps;f=void 0!==g.fallback&&(!0!==g.unstable_avoidThisFallback||!u)}}if(f){var m=p.updateQueue;if(null===m){var h=new Set;h.add(s),p.updateQueue=h}else m.add(s);if(0==(2&p.mode)){if(p.flags|=64,i.flags|=16384,i.flags&=-2981,1===i.tag)if(null===i.alternate)i.tag=17;else{var y=lo(-1,1);y.tag=2,uo(i,y)}i.lanes|=1;break e}d=void 0,i=t;var _=o.pingCache;if(null===_?(_=o.pingCache=new ui,d=new Set,_.set(s,d)):void 0===(d=_.get(s))&&(d=new Set,_.set(s,d)),!d.has(i)){d.add(i);var v=zd.bind(null,o,s,i);s.then(v,v)}p.flags|=4096,p.lanes=t;break e}p=p.return}while(null!==p);d=Error((V(i.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Fi&&(Fi=2),d=si(d,i),p=c;do{switch(p.tag){case 3:o=d,p.flags|=4096,t&=-t,p.lanes|=t,po(p,pi(0,o,t));break e;case 1:o=d;var w=p.type,x=p.stateNode;if(0==(64&p.flags)&&("function"==typeof w.getDerivedStateFromError||null!==x&&"function"==typeof x.componentDidCatch&&(null===Xi||!Xi.has(x)))){p.flags|=4096,t&=-t,p.lanes|=t,po(p,fi(p,o,t));break e}}p=p.return}while(null!==p)}Rd(n)}catch(k){t=k,ji===n&&null!==n&&(ji=n=n.return);continue}break}}function Cd(){var e=Pi.current;return Pi.current=Rc,null===e?Rc:e}function Td(e,t){var n=Ni;Ni|=16;var a=Cd();for(Oi===e&&Mi===t||Ed(e,t);;)try{Ad();break}catch(r){Sd(e,r)}if(to(),Ni=n,Pi.current=a,null!==ji)throw Error(c(261));return Oi=null,Mi=0,Fi}function Ad(){for(;null!==ji;)Pd(ji)}function Ld(){for(;null!==ji&&!Tr();)Pd(ji)}function Pd(e){var t=Wi(e.alternate,e,Di);e.memoizedProps=e.pendingProps,null===t?Rd(e):ji=t,Ri.current=null}function Rd(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ii(n,t,Di)))return void(ji=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Di)||0==(4&n.mode)){for(var a=0,r=n.child;null!==r;)a|=r.lanes|r.childLanes,r=r.sibling;n.childLanes=a}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=di(t)))return n.flags&=2047,void(ji=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(ji=t);ji=t=e}while(null!==t);0===Fi&&(Fi=5)}function Nd(e){var t=$r();return Gr(99,Od.bind(null,e,t)),null}function Od(e,t){do{Md()}while(null!==ed);if(0!=(48&Ni))throw Error(c(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(c(177));e.callbackNode=null;var a=n.lanes|n.childLanes,r=a,o=e.pendingLanes&~r;e.pendingLanes=r,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=r,e.mutableReadLanes&=r,e.entangledLanes&=r,r=e.entanglements;for(var i=e.eventTimes,d=e.expirationTimes;0<o;){var s=31-$t(o),l=1<<s;r[s]=0,i[s]=-1,d[s]=-1,o&=~l}if(null!==rd&&0==(24&a)&&rd.has(e)&&rd.delete(e),e===Oi&&(ji=Oi=null,Mi=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,a=n.firstEffect):a=n:a=n.firstEffect,null!==a){if(r=Ni,Ni|=32,Ri.current=null,qa=Wt,ma(i=ga())){if("selectionStart"in i)d={start:i.selectionStart,end:i.selectionEnd};else e:if(d=(d=i.ownerDocument)&&d.defaultView||window,(l=d.getSelection&&d.getSelection())&&0!==l.rangeCount){d=l.anchorNode,o=l.anchorOffset,s=l.focusNode,l=l.focusOffset;try{d.nodeType,s.nodeType}catch(C){d=null;break e}var u=0,p=-1,f=-1,b=0,g=0,m=i,h=null;t:for(;;){for(var y;m!==d||0!==o&&3!==m.nodeType||(p=u+o),m!==s||0!==l&&3!==m.nodeType||(f=u+l),3===m.nodeType&&(u+=m.nodeValue.length),null!==(y=m.firstChild);)h=m,m=y;for(;;){if(m===i)break t;if(h===d&&++b===o&&(p=u),h===s&&++g===l&&(f=u),null!==(y=m.nextSibling))break;h=(m=h).parentNode}m=y}d=-1===p||-1===f?null:{start:p,end:f}}else d=null;d=d||{start:0,end:0}}else d=null;za={focusedElem:i,selectionRange:d},Wt=!1,ld=null,ud=!1,Qi=a;do{try{jd()}catch(C){if(null===Qi)throw Error(c(330));qd(Qi,C),Qi=Qi.nextEffect}}while(null!==Qi);ld=null,Qi=a;do{try{for(i=e;null!==Qi;){var _=Qi.flags;if(16&_&&he(Qi.stateNode,""),128&_){var v=Qi.alternate;if(null!==v){var w=v.ref;null!==w&&("function"==typeof w?w(null):w.current=null)}}switch(1038&_){case 2:xi(Qi),Qi.flags&=-3;break;case 6:xi(Qi),Qi.flags&=-3,Ci(Qi.alternate,Qi);break;case 1024:Qi.flags&=-1025;break;case 1028:Qi.flags&=-1025,Ci(Qi.alternate,Qi);break;case 4:Ci(Qi.alternate,Qi);break;case 8:Si(i,d=Qi);var x=d.alternate;vi(d),null!==x&&vi(x)}Qi=Qi.nextEffect}}catch(C){if(null===Qi)throw Error(c(330));qd(Qi,C),Qi=Qi.nextEffect}}while(null!==Qi);if(w=za,v=ga(),_=w.focusedElem,i=w.selectionRange,v!==_&&_&&_.ownerDocument&&ba(_.ownerDocument.documentElement,_)){null!==i&&ma(_)&&(v=i.start,void 0===(w=i.end)&&(w=v),"selectionStart"in _?(_.selectionStart=v,_.selectionEnd=Math.min(w,_.value.length)):(w=(v=_.ownerDocument||document)&&v.defaultView||window).getSelection&&(w=w.getSelection(),d=_.textContent.length,x=Math.min(i.start,d),i=void 0===i.end?x:Math.min(i.end,d),!w.extend&&x>i&&(d=i,i=x,x=d),d=fa(_,x),o=fa(_,i),d&&o&&(1!==w.rangeCount||w.anchorNode!==d.node||w.anchorOffset!==d.offset||w.focusNode!==o.node||w.focusOffset!==o.offset)&&((v=v.createRange()).setStart(d.node,d.offset),w.removeAllRanges(),x>i?(w.addRange(v),w.extend(o.node,o.offset)):(v.setEnd(o.node,o.offset),w.addRange(v))))),v=[];for(w=_;w=w.parentNode;)1===w.nodeType&&v.push({element:w,left:w.scrollLeft,top:w.scrollTop});for("function"==typeof _.focus&&_.focus(),_=0;_<v.length;_++)(w=v[_]).element.scrollLeft=w.left,w.element.scrollTop=w.top}Wt=!!qa,za=qa=null,e.current=n,Qi=a;do{try{for(_=e;null!==Qi;){var k=Qi.flags;if(36&k&&hi(_,Qi.alternate,Qi),128&k){v=void 0;var E=Qi.ref;if(null!==E){var S=Qi.stateNode;Qi.tag,v=S,"function"==typeof E?E(v):E.current=v}}Qi=Qi.nextEffect}}catch(C){if(null===Qi)throw Error(c(330));qd(Qi,C),Qi=Qi.nextEffect}}while(null!==Qi);Qi=null,Ir(),Ni=r}else e.current=n;if(Ji)Ji=!1,ed=e,td=t;else for(Qi=a;null!==Qi;)t=Qi.nextEffect,Qi.nextEffect=null,8&Qi.flags&&((k=Qi).sibling=null,k.stateNode=null),Qi=t;if(0===(a=e.pendingLanes)&&(Xi=null),1===a?e===cd?od++:(od=0,cd=e):od=0,n=n.stateNode,kr&&"function"==typeof kr.onCommitFiberRoot)try{kr.onCommitFiberRoot(xr,n,void 0,64==(64&n.current.flags))}catch(C){}if(md(e,Ur()),Yi)throw Yi=!1,e=Ki,Ki=null,e;return 0!=(8&Ni)||Vr(),null}function jd(){for(;null!==Qi;){var e=Qi.alternate;ud||null===ld||(0!=(8&Qi.flags)?Je(Qi,ld)&&(ud=!0):13===Qi.tag&&Ai(e,Qi)&&Je(Qi,ld)&&(ud=!0));var t=Qi.flags;0!=(256&t)&&mi(e,Qi),0==(512&t)||Ji||(Ji=!0,Zr(97,(function(){return Md(),null}))),Qi=Qi.nextEffect}}function Md(){if(90!==td){var e=97<td?97:td;return td=90,Gr(e,Fd)}return!1}function Dd(e,t){nd.push(t,e),Ji||(Ji=!0,Zr(97,(function(){return Md(),null})))}function Id(e,t){ad.push(t,e),Ji||(Ji=!0,Zr(97,(function(){return Md(),null})))}function Fd(){if(null===ed)return!1;var e=ed;if(ed=null,0!=(48&Ni))throw Error(c(331));var t=Ni;Ni|=32;var n=ad;ad=[];for(var a=0;a<n.length;a+=2){var r=n[a],o=n[a+1],i=r.destroy;if(r.destroy=void 0,"function"==typeof i)try{i()}catch(s){if(null===o)throw Error(c(330));qd(o,s)}}for(n=nd,nd=[],a=0;a<n.length;a+=2){r=n[a],o=n[a+1];try{var d=r.create;r.destroy=d()}catch(s){if(null===o)throw Error(c(330));qd(o,s)}}for(d=e.current.firstEffect;null!==d;)e=d.nextEffect,d.nextEffect=null,8&d.flags&&(d.sibling=null,d.stateNode=null),d=e;return Ni=t,Vr(),!0}function Bd(e,t,n){uo(e,t=pi(0,t=si(n,t),1)),t=pd(),null!==(e=gd(e,1))&&(Ut(e,1,t),md(e,t))}function qd(e,t){if(3===e.tag)Bd(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Bd(n,e,t);break}if(1===n.tag){var a=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof a.componentDidCatch&&(null===Xi||!Xi.has(a))){var r=fi(n,e=si(t,e),1);if(uo(n,r),r=pd(),null!==(n=gd(n,1)))Ut(n,1,r),md(n,r);else if("function"==typeof a.componentDidCatch&&(null===Xi||!Xi.has(a)))try{a.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function zd(e,t,n){var a=e.pingCache;null!==a&&a.delete(t),t=pd(),e.pingedLanes|=e.suspendedLanes&n,Oi===e&&(Mi&n)===n&&(4===Fi||3===Fi&&(62914560&Mi)===Mi&&500>Ur()-Gi?Ed(e,0):$i|=n),md(e,t)}function Ud(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===$r()?1:2:(0===dd&&(dd=qi),0===(t=qt(62914560&~dd))&&(t=4194304))),n=pd(),null!==(e=gd(e,t))&&(Ut(e,t,n),md(e,n))}function $d(e,t,n,a){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Hd(e,t,n,a){return new $d(e,t,n,a)}function Gd(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Zd(e,t){var n=e.alternate;return null===n?((n=Hd(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Vd(e,t,n,a,r,o){var i=2;if(a=e,"function"==typeof e)Gd(e)&&(i=1);else if("string"==typeof e)i=5;else e:switch(e){case E:return Wd(n.children,r,o,t);case D:i=8,r|=16;break;case S:i=8,r|=1;break;case C:return(e=Hd(12,n,t,8|r)).elementType=C,e.type=C,e.lanes=o,e;case P:return(e=Hd(13,n,t,r)).type=P,e.elementType=P,e.lanes=o,e;case R:return(e=Hd(19,n,t,r)).elementType=R,e.lanes=o,e;case I:return Qd(n,r,o,t);case F:return(e=Hd(24,n,t,r)).elementType=F,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:i=10;break e;case A:i=9;break e;case L:i=11;break e;case N:i=14;break e;case O:i=16,a=null;break e;case j:i=22;break e}throw Error(c(130,null==e?e:typeof e,""))}return(t=Hd(i,n,t,r)).elementType=e,t.type=a,t.lanes=o,t}function Wd(e,t,n,a){return(e=Hd(7,e,a,t)).lanes=n,e}function Qd(e,t,n,a){return(e=Hd(23,e,a,t)).elementType=I,e.lanes=n,e}function Yd(e,t,n){return(e=Hd(6,e,null,t)).lanes=n,e}function Kd(e,t,n){return(t=Hd(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Xd(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=zt(0),this.expirationTimes=zt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=zt(0),this.mutableSourceEagerHydrationData=null}function Jd(e,t,n,a){var r=t.current,o=pd(),i=fd(r);e:if(n){t:{if(Qe(n=n._reactInternals)!==n||1!==n.tag)throw Error(c(170));var d=n;do{switch(d.tag){case 3:d=d.stateNode.context;break t;case 1:if(mr(d.type)){d=d.stateNode.__reactInternalMemoizedMergedChildContext;break t}}d=d.return}while(null!==d);throw Error(c(171))}if(1===n.tag){var s=n.type;if(mr(s)){n=_r(n,s,d);break e}}n=d}else n=ur;return null===t.context?t.context=n:t.pendingContext=n,(t=lo(o,i)).payload={element:e},null!==(a=void 0===a?null:a)&&(t.callback=a),uo(r,t),bd(r,i,o),i}function es(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function ts(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function ns(e,t){ts(e,t),(e=e.alternate)&&ts(e,t)}function as(e,t,n){var a=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Xd(e,t,null!=n&&!0===n.hydrate),t=Hd(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,io(t),e[Ja]=n.current,Ra(8===e.nodeType?e.parentNode:e),a)for(e=0;e<a.length;e++){var r=(t=a[e])._getVersion;r=r(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,r]:n.mutableSourceEagerHydrationData.push(t,r)}this._internalRoot=n}function rs(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function os(e,t,n,a,r){var o=n._reactRootContainer;if(o){var c=o._internalRoot;if("function"==typeof r){var i=r;r=function(){var e=es(c);i.call(e)}}Jd(t,c,e,r)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new as(e,0,t?{hydrate:!0}:void 0)}(n,a),c=o._internalRoot,"function"==typeof r){var d=r;r=function(){var e=es(c);d.call(e)}}wd((function(){Jd(t,c,e,r)}))}return es(c)}function cs(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!rs(t))throw Error(c(200));return function(e,t,n){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:k,key:null==a?null:""+a,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Wi=function(e,t,n){var a=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||fr.current)Dc=!0;else{if(0==(n&a)){switch(Dc=!1,t.tag){case 3:Zc(t),Vo();break;case 5:Mo(t);break;case 1:mr(t.type)&&vr(t);break;case 4:Oo(t,t.stateNode.containerInfo);break;case 10:a=t.memoizedProps.value;var r=t.type._context;lr(Kr,r._currentValue),r._currentValue=a;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Xc(e,t,n):(lr(Io,1&Io.current),null!==(t=oi(e,t,n))?t.sibling:null);lr(Io,1&Io.current);break;case 19:if(a=0!=(n&t.childLanes),0!=(64&e.flags)){if(a)return ri(e,t,n);t.flags|=64}if(null!==(r=t.memoizedState)&&(r.rendering=null,r.tail=null,r.lastEffect=null),lr(Io,Io.current),a)break;return null;case 23:case 24:return t.lanes=0,zc(e,t,n)}return oi(e,t,n)}Dc=0!=(16384&e.flags)}else Dc=!1;switch(t.lanes=0,t.tag){case 2:if(a=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=gr(t,pr.current),ro(t,n),r=cc(null,t,a,e,r,n),t.flags|=1,"object"==typeof r&&null!==r&&"function"==typeof r.render&&void 0===r.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,mr(a)){var o=!0;vr(t)}else o=!1;t.memoizedState=null!==r.state&&void 0!==r.state?r.state:null,io(t);var i=a.getDerivedStateFromProps;"function"==typeof i&&mo(t,a,i,e),r.updater=ho,t.stateNode=r,r._reactInternals=t,wo(t,a,e,n),t=Gc(null,t,a,!0,o,n)}else t.tag=0,Ic(null,t,r,n),t=t.child;return t;case 16:r=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Gd(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===N)return 14}return 2}(r),e=Yr(r,e),o){case 0:t=$c(null,t,r,e,n);break e;case 1:t=Hc(null,t,r,e,n);break e;case 11:t=Fc(null,t,r,e,n);break e;case 14:t=Bc(null,t,r,Yr(r.type,e),a,n);break e}throw Error(c(306,r,""))}return t;case 0:return a=t.type,r=t.pendingProps,$c(e,t,a,r=t.elementType===a?r:Yr(a,r),n);case 1:return a=t.type,r=t.pendingProps,Hc(e,t,a,r=t.elementType===a?r:Yr(a,r),n);case 3:if(Zc(t),a=t.updateQueue,null===e||null===a)throw Error(c(282));if(a=t.pendingProps,r=null!==(r=t.memoizedState)?r.element:null,so(e,t),fo(t,a,null,n),(a=t.memoizedState.element)===r)Vo(),t=oi(e,t,n);else{if((o=(r=t.stateNode).hydrate)&&(qo=Va(t.stateNode.containerInfo.firstChild),Bo=t,o=zo=!0),o){if(null!=(e=r.mutableSourceEagerHydrationData))for(r=0;r<e.length;r+=2)(o=e[r])._workInProgressVersionPrimary=e[r+1],Wo.push(o);for(n=To(t,null,a,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Ic(e,t,a,n),Vo();t=t.child}return t;case 5:return Mo(t),null===e&&Ho(t),a=t.type,r=t.pendingProps,o=null!==e?e.memoizedProps:null,i=r.children,$a(a,r)?i=null:null!==o&&$a(a,o)&&(t.flags|=16),Uc(e,t),Ic(e,t,i,n),t.child;case 6:return null===e&&Ho(t),null;case 13:return Xc(e,t,n);case 4:return Oo(t,t.stateNode.containerInfo),a=t.pendingProps,null===e?t.child=Co(t,null,a,n):Ic(e,t,a,n),t.child;case 11:return a=t.type,r=t.pendingProps,Fc(e,t,a,r=t.elementType===a?r:Yr(a,r),n);case 7:return Ic(e,t,t.pendingProps,n),t.child;case 8:case 12:return Ic(e,t,t.pendingProps.children,n),t.child;case 10:e:{a=t.type._context,r=t.pendingProps,i=t.memoizedProps,o=r.value;var d=t.type._context;if(lr(Kr,d._currentValue),d._currentValue=o,null!==i)if(d=i.value,0===(o=sa(d,o)?0:0|("function"==typeof a._calculateChangedBits?a._calculateChangedBits(d,o):1073741823))){if(i.children===r.children&&!fr.current){t=oi(e,t,n);break e}}else for(null!==(d=t.child)&&(d.return=t);null!==d;){var s=d.dependencies;if(null!==s){i=d.child;for(var l=s.firstContext;null!==l;){if(l.context===a&&0!=(l.observedBits&o)){1===d.tag&&((l=lo(-1,n&-n)).tag=2,uo(d,l)),d.lanes|=n,null!==(l=d.alternate)&&(l.lanes|=n),ao(d.return,n),s.lanes|=n;break}l=l.next}}else i=10===d.tag&&d.type===t.type?null:d.child;if(null!==i)i.return=d;else for(i=d;null!==i;){if(i===t){i=null;break}if(null!==(d=i.sibling)){d.return=i.return,i=d;break}i=i.return}d=i}Ic(e,t,r.children,n),t=t.child}return t;case 9:return r=t.type,a=(o=t.pendingProps).children,ro(t,n),a=a(r=oo(r,o.unstable_observedBits)),t.flags|=1,Ic(e,t,a,n),t.child;case 14:return o=Yr(r=t.type,t.pendingProps),Bc(e,t,r,o=Yr(r.type,o),a,n);case 15:return qc(e,t,t.type,t.pendingProps,a,n);case 17:return a=t.type,r=t.pendingProps,r=t.elementType===a?r:Yr(a,r),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,mr(a)?(e=!0,vr(t)):e=!1,ro(t,n),_o(t,a,r),wo(t,a,r,n),Gc(null,t,a,!0,e,n);case 19:return ri(e,t,n);case 23:case 24:return zc(e,t,n)}throw Error(c(156,t.tag))},as.prototype.render=function(e){Jd(e,this._internalRoot,null,null)},as.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Jd(null,e,null,(function(){t[Ja]=null}))},et=function(e){13===e.tag&&(bd(e,4,pd()),ns(e,4))},tt=function(e){13===e.tag&&(bd(e,67108864,pd()),ns(e,67108864))},nt=function(e){if(13===e.tag){var t=pd(),n=fd(e);bd(e,n,t),ns(e,n)}},at=function(e,t){return t()},Ce=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var a=n[t];if(a!==e&&a.form===e.form){var r=rr(a);if(!r)throw Error(c(90));K(a),ne(a,r)}}}break;case"textarea":se(e,n);break;case"select":null!=(t=n.value)&&ce(e,!!n.multiple,t,!1)}},Ne=vd,Oe=function(e,t,n,a,r){var o=Ni;Ni|=4;try{return Gr(98,e.bind(null,t,n,a,r))}finally{0===(Ni=o)&&(Vi(),Vr())}},je=function(){0==(49&Ni)&&(function(){if(null!==rd){var e=rd;rd=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,md(e,Ur())}))}Vr()}(),Md())},Me=function(e,t){var n=Ni;Ni|=2;try{return e(t)}finally{0===(Ni=n)&&(Vi(),Vr())}};var is={Events:[nr,ar,rr,Pe,Re,Md,{current:!1}]},ds={findFiberByHostInstance:tr,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},ss={bundleType:ds.bundleType,version:ds.version,rendererPackageName:ds.rendererPackageName,rendererConfig:ds.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Xe(e))?null:e.stateNode},findFiberByHostInstance:ds.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ls=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ls.isDisabled&&ls.supportsFiber)try{xr=ls.inject(ss),kr=ls}catch(ge){}}t.hydrate=function(e,t,n){if(!rs(t))throw Error(c(200));return os(null,e,t,!0,n)}},73935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(64448)},69590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,a="function"==typeof Set,r="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,c){if(e===c)return!0;if(e&&c&&"object"==typeof e&&"object"==typeof c){if(e.constructor!==c.constructor)return!1;var i,d,s,l;if(Array.isArray(e)){if((i=e.length)!=c.length)return!1;for(d=i;0!=d--;)if(!o(e[d],c[d]))return!1;return!0}if(n&&e instanceof Map&&c instanceof Map){if(e.size!==c.size)return!1;for(l=e.entries();!(d=l.next()).done;)if(!c.has(d.value[0]))return!1;for(l=e.entries();!(d=l.next()).done;)if(!o(d.value[1],c.get(d.value[0])))return!1;return!0}if(a&&e instanceof Set&&c instanceof Set){if(e.size!==c.size)return!1;for(l=e.entries();!(d=l.next()).done;)if(!c.has(d.value[0]))return!1;return!0}if(r&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(c)){if((i=e.length)!=c.length)return!1;for(d=i;0!=d--;)if(e[d]!==c[d])return!1;return!0}if(e.constructor===RegExp)return e.source===c.source&&e.flags===c.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof c.valueOf)return e.valueOf()===c.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof c.toString)return e.toString()===c.toString();if((i=(s=Object.keys(e)).length)!==Object.keys(c).length)return!1;for(d=i;0!=d--;)if(!Object.prototype.hasOwnProperty.call(c,s[d]))return!1;if(t&&e instanceof Element)return!1;for(d=i;0!=d--;)if(("_owner"!==s[d]&&"__v"!==s[d]&&"__o"!==s[d]||!e.$$typeof)&&!o(e[s[d]],c[s[d]]))return!1;return!0}return e!=e&&c!=c}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},70405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>G,ql:()=>J});var a=n(67294),r=n(45697),o=n.n(r),c=n(69590),i=n.n(c),d=n(41143),s=n.n(d),l=n(96774),u=n.n(l);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,b(e,t)}function b(e,t){return b=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},b(e,t)}function g(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)t.indexOf(n=o[a])>=0||(r[n]=e[n]);return r}var m={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},h={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},_={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},v=Object.keys(m).map((function(e){return m[e]})),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(w).reduce((function(e,t){return e[w[t]]=t,e}),{}),k=function(e,t){for(var n=e.length-1;n>=0;n-=1){var a=e[n];if(Object.prototype.hasOwnProperty.call(a,t))return a[t]}return null},E=function(e){var t=k(e,m.TITLE),n=k(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var a=k(e,"defaultTitle");return t||a||void 0},S=function(e){return k(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[m.BASE]})).map((function(e){return e[m.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var a=Object.keys(n),r=0;r<a.length;r+=1){var o=a[r].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},A=function(e,t,n){var a={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var r={};n.filter((function(e){for(var n,o=Object.keys(e),c=0;c<o.length;c+=1){var i=o[c],d=i.toLowerCase();-1===t.indexOf(d)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===d&&"stylesheet"===e[d].toLowerCase()||(n=d),-1===t.indexOf(i)||"innerHTML"!==i&&"cssText"!==i&&"itemprop"!==i||(n=i)}if(!n||!e[n])return!1;var s=e[n].toLowerCase();return a[n]||(a[n]={}),r[n]||(r[n]={}),!a[n][s]&&(r[n][s]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(r),c=0;c<o.length;c+=1){var i=o[c],d=p({},a[i],r[i]);a[i]=d}return e}),[]).reverse()},L=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},P=function(e){return Array.isArray(e)?e.join(""):e},R=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),a=0;a<n.length;a+=1)if(t[n[a]]&&t[n[a]].includes(e[n[a]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},O=[m.NOSCRIPT,m.SCRIPT,m.STYLE],j=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},M=function(e){return Object.keys(e).reduce((function(t,n){var a=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+a:a}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},I=function(e,t){return t.map((function(t,n){var r,o=((r={key:n})["data-rh"]=!0,r);return Object.keys(t).forEach((function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),a.createElement(e,o)}))},F=function(e,t,n){switch(e){case m.TITLE:return{toComponent:function(){return n=t.titleAttributes,(r={key:e=t.title})["data-rh"]=!0,o=D(n,r),[a.createElement(m.TITLE,o,e)];var e,n,r,o},toString:function(){return function(e,t,n,a){var r=M(n),o=P(t);return r?"<"+e+' data-rh="true" '+r+">"+j(o,a)+"</"+e+">":"<"+e+' data-rh="true">'+j(o,a)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return I(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,a){var r=Object.keys(a).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var r=void 0===a[t]?t:t+'="'+j(a[t],n)+'"';return e?e+" "+r:r}),""),o=a.innerHTML||a.cssText||"",c=-1===O.indexOf(e);return t+"<"+e+' data-rh="true" '+r+(c?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},B=function(e){var t=e.baseTag,n=e.bodyAttributes,a=e.encode,r=e.htmlAttributes,o=e.noscriptTags,c=e.styleTags,i=e.title,d=void 0===i?"":i,s=e.titleAttributes,l=e.linkTags,u=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var b=function(e){var t=e.linkTags,n=e.scriptTags,a=e.encode,r=R(e.metaTags,_),o=R(t,h),c=R(n,y);return{priorityMethods:{toComponent:function(){return[].concat(I(m.META,r.priority),I(m.LINK,o.priority),I(m.SCRIPT,c.priority))},toString:function(){return F(m.META,r.priority,a)+" "+F(m.LINK,o.priority,a)+" "+F(m.SCRIPT,c.priority,a)}},metaTags:r.default,linkTags:o.default,scriptTags:c.default}}(e);f=b.priorityMethods,l=b.linkTags,u=b.metaTags,p=b.scriptTags}return{priority:f,base:F(m.BASE,t,a),bodyAttributes:F("bodyAttributes",n,a),htmlAttributes:F("htmlAttributes",r,a),link:F(m.LINK,l,a),meta:F(m.META,u,a),noscript:F(m.NOSCRIPT,o,a),script:F(m.SCRIPT,p,a),style:F(m.STYLE,c,a),title:F(m.TITLE,{title:d,titleAttributes:s},a)}},q=[],z=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?q:n.instances},add:function(e){(n.canUseDOM?q:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?q:n.instances).indexOf(e);(n.canUseDOM?q:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=B({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=a.createContext({}),$=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var a;return(a=e.call(this,n)||this).helmetData=new z(a.props.context,t.canUseDOM),a}return f(t,e),t.prototype.render=function(){return a.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(a.Component);G.canUseDOM=H,G.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var Z=function(e,t){var n,a=document.head||document.querySelector(m.HEAD),r=a.querySelectorAll(e+"[data-rh]"),o=[].slice.call(r),c=[];return t&&t.length&&t.forEach((function(t){var a=document.createElement(e);for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&("innerHTML"===r?a.innerHTML=t.innerHTML:"cssText"===r?a.styleSheet?a.styleSheet.cssText=t.cssText:a.appendChild(document.createTextNode(t.cssText)):a.setAttribute(r,void 0===t[r]?"":t[r]));a.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,a.isEqualNode(e)}))?o.splice(n,1):c.push(a)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),c.forEach((function(e){return a.appendChild(e)})),{oldTags:o,newTags:c}},V=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var a=n.getAttribute("data-rh"),r=a?a.split(","):[],o=[].concat(r),c=Object.keys(t),i=0;i<c.length;i+=1){var d=c[i],s=t[d]||"";n.getAttribute(d)!==s&&n.setAttribute(d,s),-1===r.indexOf(d)&&r.push(d);var l=o.indexOf(d);-1!==l&&o.splice(l,1)}for(var u=o.length-1;u>=0;u-=1)n.removeAttribute(o[u]);r.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==c.join(",")&&n.setAttribute("data-rh",c.join(","))}},W=function(e,t){var n=e.baseTag,a=e.htmlAttributes,r=e.linkTags,o=e.metaTags,c=e.noscriptTags,i=e.onChangeClientState,d=e.scriptTags,s=e.styleTags,l=e.title,u=e.titleAttributes;V(m.BODY,e.bodyAttributes),V(m.HTML,a),function(e,t){void 0!==e&&document.title!==e&&(document.title=P(e)),V(m.TITLE,t)}(l,u);var p={baseTag:Z(m.BASE,n),linkTags:Z(m.LINK,r),metaTags:Z(m.META,o),noscriptTags:Z(m.NOSCRIPT,c),scriptTags:Z(m.SCRIPT,d),styleTags:Z(m.STYLE,s)},f={},b={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,a=t.oldTags;n.length&&(f[e]=n),a.length&&(b[e]=p[e].oldTags)})),t&&t(),i(e,f,b)},Q=null,Y=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).rendered=!1,t}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!u()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,a=n.setHelmet,r=null,o=(e=n.helmetInstances.get().map((function(e){var t=p({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:k(e,"defer"),encode:k(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:A(m.LINK,["rel","href"],e),metaTags:A(m.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(m.NOSCRIPT,["innerHTML"],e),onChangeClientState:S(e),scriptTags:A(m.SCRIPT,["src","innerHTML"],e),styleTags:A(m.STYLE,["cssText"],e),title:E(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});G.canUseDOM?(t=o,Q&&cancelAnimationFrame(Q),t.defer?Q=requestAnimationFrame((function(){W(t,(function(){Q=null}))})):(W(t),Q=null)):B&&(r=B(o)),a(r)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(a.Component);Y.propTypes={context:$.isRequired},Y.displayName="HelmetDispatcher";var K=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!i()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case m.SCRIPT:case m.NOSCRIPT:return{innerHTML:t};case m.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,a=e.arrayTypeChildren;return p({},a,((t={})[n.type]=[].concat(a[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,a=e.child,r=e.newProps,o=e.newChildProps,c=e.nestedChildren;switch(a.type){case m.TITLE:return p({},r,((t={})[a.type]=c,t.titleAttributes=p({},o),t));case m.BODY:return p({},r,{bodyAttributes:p({},o)});case m.HTML:return p({},r,{htmlAttributes:p({},o)});default:return p({},r,((n={})[a.type]=p({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var a;n=p({},n,((a={})[t]=e[t],a))})),n},n.warnOnInvalidChildren=function(e,t){return s()(v.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+v.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),s()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,r={};return a.Children.forEach(e,(function(e){if(e&&e.props){var a=e.props,o=a.children,c=g(a,K),i=Object.keys(c).reduce((function(e,t){return e[x[t]||t]=c[t],e}),{}),d=e.type;switch("symbol"==typeof d?d=d.toString():n.warnOnInvalidChildren(e,o),d){case m.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case m.LINK:case m.META:case m.NOSCRIPT:case m.SCRIPT:case m.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:i,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:i,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(r,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,X),r=p({},n),o=n.helmetData;return t&&(r=this.mapChildrenToProps(t,r)),!o||o instanceof z||(o=new z(o.context,o.instances)),o?a.createElement(Y,p({},r,{context:o.value,helmetData:void 0})):a.createElement(U.Consumer,null,(function(e){return a.createElement(Y,p({},r,{context:e}))}))},t}(a.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},69921:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,a=n?Symbol.for("react.element"):60103,r=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,c=n?Symbol.for("react.strict_mode"):60108,i=n?Symbol.for("react.profiler"):60114,d=n?Symbol.for("react.provider"):60109,s=n?Symbol.for("react.context"):60110,l=n?Symbol.for("react.async_mode"):60111,u=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,b=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,m=n?Symbol.for("react.lazy"):60116,h=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,_=n?Symbol.for("react.responder"):60118,v=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case a:switch(e=e.type){case l:case u:case o:case i:case c:case f:return e;default:switch(e=e&&e.$$typeof){case s:case p:case m:case g:case d:return e;default:return t}}case r:return t}}}function x(e){return w(e)===u}t.AsyncMode=l,t.ConcurrentMode=u,t.ContextConsumer=s,t.ContextProvider=d,t.Element=a,t.ForwardRef=p,t.Fragment=o,t.Lazy=m,t.Memo=g,t.Portal=r,t.Profiler=i,t.StrictMode=c,t.Suspense=f,t.isAsyncMode=function(e){return x(e)||w(e)===l},t.isConcurrentMode=x,t.isContextConsumer=function(e){return w(e)===s},t.isContextProvider=function(e){return w(e)===d},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.isForwardRef=function(e){return w(e)===p},t.isFragment=function(e){return w(e)===o},t.isLazy=function(e){return w(e)===m},t.isMemo=function(e){return w(e)===g},t.isPortal=function(e){return w(e)===r},t.isProfiler=function(e){return w(e)===i},t.isStrictMode=function(e){return w(e)===c},t.isSuspense=function(e){return w(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===u||e===i||e===c||e===f||e===b||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===g||e.$$typeof===d||e.$$typeof===s||e.$$typeof===p||e.$$typeof===y||e.$$typeof===_||e.$$typeof===v||e.$$typeof===h)},t.typeOf=w},59864:(e,t,n)=>{"use strict";e.exports=n(69921)},68356:(e,t,n)=>{"use strict";function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(){return c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},c.apply(this,arguments)}var i=n(67294),d=n(45697),s=[],l=[];function u(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(a){var r=u(e[a]);r.loading?t.loading=!0:(t.loaded[a]=r.loaded,t.error=r.error),n.push(r.promise),r.promise.then((function(e){t.loaded[a]=e})).catch((function(e){t.error=e}))}))}catch(a){t.error=a}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function f(e,t){return i.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function b(e,t){var u,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var b=c({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),g=null;function m(){return g||(g=e(b.loader)),g.promise}return s.push(m),"function"==typeof b.webpack&&l.push((function(){if((0,b.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return m()})),p=u=function(t){function n(n){var a;return o(r(r(a=t.call(this,n)||this)),"retry",(function(){a.setState({error:null,loading:!0,timedOut:!1}),g=e(b.loader),a._loadModule()})),m(),a.state={error:g.error,pastDelay:!1,timedOut:!1,loading:g.loading,loaded:g.loaded},a}a(n,t),n.preload=function(){return m()};var c=n.prototype;return c.UNSAFE_componentWillMount=function(){this._loadModule()},c.componentDidMount=function(){this._mounted=!0},c._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(b.modules)&&b.modules.forEach((function(t){e.context.loadable.report(t)})),g.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof b.delay&&(0===b.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),b.delay)),"number"==typeof b.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),b.timeout));var n=function(){t({error:g.error,loaded:g.loaded,loading:g.loading}),e._clearTimeouts()};g.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},c.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},c._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},c.render=function(){return this.state.loading||this.state.error?i.createElement(b.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?b.render(this.state.loaded,this.props):null},n}(i.Component),o(u,"contextTypes",{loadable:d.shape({report:d.func.isRequired})}),p}function g(e){return b(u,e)}g.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return b(p,e)};var m=function(e){function t(){return e.apply(this,arguments)||this}a(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return i.Children.only(this.props.children)},t}(i.Component);function h(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return h(e)}))}o(m,"propTypes",{report:d.func.isRequired}),o(m,"childContextTypes",{loadable:d.shape({report:d.func.isRequired}).isRequired}),g.Capture=m,g.preloadAll=function(){return new Promise((function(e,t){h(s).then(e,t)}))},g.preloadReady=function(){return new Promise((function(e,t){h(l).then(e,e)}))},e.exports=g},18790:(e,t,n)=>{"use strict";n.d(t,{H:()=>i,f:()=>c});var a=n(16550),r=n(87462),o=n(67294);function c(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var r=e.path?(0,a.LX)(t,e):n.length?n[n.length-1].match:a.F0.computeRootMatch(t);return r&&(n.push({route:e,match:r}),e.routes&&c(e.routes,t,n)),r})),n}function i(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(a.rs,n,e.map((function(e,n){return o.createElement(a.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,r.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,r.Z)({},n,t,{route:e}))}})}))):null}},73727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>_,VK:()=>l,rU:()=>m});var a=n(16550),r=n(75068),o=n(67294),c=n(99318),i=n(87462),d=n(63366),s=n(38776),l=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).history=(0,c.lX)(t.props),t}return(0,r.Z)(t,e),t.prototype.render=function(){return o.createElement(a.F0,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var u=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,c.ob)(e,null,null,t):e},f=function(e){return e},b=o.forwardRef;void 0===b&&(b=f);var g=b((function(e,t){var n=e.innerRef,a=e.navigate,r=e.onClick,c=(0,d.Z)(e,["innerRef","navigate","onClick"]),s=c.target,l=(0,i.Z)({},c,{onClick:function(e){try{r&&r(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||s&&"_self"!==s||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),a())}});return l.ref=f!==b&&t||n,o.createElement("a",l)}));var m=b((function(e,t){var n=e.component,r=void 0===n?g:n,l=e.replace,m=e.to,h=e.innerRef,y=(0,d.Z)(e,["component","replace","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,s.Z)(!1);var n=e.history,a=p(u(m,e.location),e.location),d=a?n.createHref(a):"",g=(0,i.Z)({},y,{href:d,navigate:function(){var t=u(m,e.location),a=(0,c.Ep)(e.location)===(0,c.Ep)(p(t));(l||a?n.replace:n.push)(t)}});return f!==b?g.ref=t||h:g.innerRef=h,o.createElement(r,g)}))})),h=function(e){return e},y=o.forwardRef;void 0===y&&(y=h);var _=y((function(e,t){var n=e["aria-current"],r=void 0===n?"page":n,c=e.activeClassName,l=void 0===c?"active":c,f=e.activeStyle,b=e.className,g=e.exact,_=e.isActive,v=e.location,w=e.sensitive,x=e.strict,k=e.style,E=e.to,S=e.innerRef,C=(0,d.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(a.s6.Consumer,null,(function(e){e||(0,s.Z)(!1);var n=v||e.location,c=p(u(E,n),n),d=c.pathname,T=d&&d.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,a.LX)(n.pathname,{path:T,exact:g,sensitive:w,strict:x}):null,L=!!(_?_(A,n):A),P="function"==typeof b?b(L):b,R="function"==typeof k?k(L):k;L&&(P=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(P,l),R=(0,i.Z)({},R,f));var N=(0,i.Z)({"aria-current":L&&r||null,className:P,style:R,to:c},C);return h!==y?N.ref=t||S:N.innerRef=S,o.createElement(m,N)}))}))},16550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>E,F0:()=>_,LX:()=>k,TH:()=>O,k6:()=>N,rs:()=>P,s6:()=>y});var a=n(75068),r=n(67294),o=n(45697),c=n.n(o),i=n(99318),d=n(38776),s=n(87462),l=n(39658),u=n.n(l),p=(n(59864),n(63366)),f=(n(8679),1073741823),b="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var g=r.createContext||function(e,t){var n,o,i="__create-react-context-"+function(){var e="__global_unique_id__";return b[e]=(b[e]||0)+1}()+"__",d=function(e){function n(){for(var t,n,a,r=arguments.length,o=new Array(r),c=0;c<r;c++)o[c]=arguments[c];return(t=e.call.apply(e,[this].concat(o))||this).emitter=(n=t.props.value,a=[],{on:function(e){a.push(e)},off:function(e){a=a.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,a.forEach((function(e){return e(n,t)}))}}),t}(0,a.Z)(n,e);var r=n.prototype;return r.getChildContext=function(){var e;return(e={})[i]=this.emitter,e},r.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,a=this.props.value,r=e.value;((o=a)===(c=r)?0!==o||1/o==1/c:o!=o&&c!=c)?n=0:(n="function"==typeof t?t(a,r):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,c},r.render=function(){return this.props.children},n}(r.Component);d.childContextTypes=((n={})[i]=c().object.isRequired,n);var s=function(t){function n(){for(var e,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(e=t.call.apply(t,[this].concat(a))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,a.Z)(n,t);var r=n.prototype;return r.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},r.componentDidMount=function(){this.context[i]&&this.context[i].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},r.componentWillUnmount=function(){this.context[i]&&this.context[i].off(this.onUpdate)},r.getValue=function(){return this.context[i]?this.context[i].get():e},r.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(r.Component);return s.contextTypes=((o={})[i]=c().object,o),{Provider:d,Consumer:s}},m=function(e){var t=g();return t.displayName=e,t},h=m("Router-History"),y=m("Router"),_=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,a.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return r.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},r.createElement(h.Provider,{children:this.props.children||null,value:this.props.history}))},t}(r.Component);r.Component;r.Component;var v={},w=1e4,x=0;function k(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,a=n.path,r=n.exact,o=void 0!==r&&r,c=n.strict,i=void 0!==c&&c,d=n.sensitive,s=void 0!==d&&d;return[].concat(a).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var a=function(e,t){var n=""+t.end+t.strict+t.sensitive,a=v[n]||(v[n]={});if(a[e])return a[e];var r=[],o={regexp:u()(e,r,t),keys:r};return x<w&&(a[e]=o,x++),o}(n,{end:o,strict:i,sensitive:s}),r=a.regexp,c=a.keys,d=r.exec(e);if(!d)return null;var l=d[0],p=d.slice(1),f=e===l;return o&&!f?null:{path:n,url:"/"===n&&""===l?"/":l,isExact:f,params:c.reduce((function(e,t,n){return e[t.name]=p[n],e}),{})}}),null)}var E=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(y.Consumer,null,(function(t){t||(0,d.Z)(!1);var n=e.props.location||t.location,a=e.props.computedMatch?e.props.computedMatch:e.props.path?k(n.pathname,e.props):t.match,o=(0,s.Z)({},t,{location:n,match:a}),c=e.props,i=c.children,l=c.component,u=c.render;return Array.isArray(i)&&function(e){return 0===r.Children.count(e)}(i)&&(i=null),r.createElement(y.Provider,{value:o},o.match?i?"function"==typeof i?i(o):i:l?r.createElement(l,o):u?u(o):null:"function"==typeof i?i(o):null)}))},t}(r.Component);function S(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=S(e);return 0!==t.pathname.indexOf(n)?t:(0,s.Z)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,i.Ep)(e)}function A(e){return function(){(0,d.Z)(!1)}}function L(){}r.Component;var P=function(e){function t(){return e.apply(this,arguments)||this}return(0,a.Z)(t,e),t.prototype.render=function(){var e=this;return r.createElement(y.Consumer,null,(function(t){t||(0,d.Z)(!1);var n,a,o=e.props.location||t.location;return r.Children.forEach(e.props.children,(function(e){if(null==a&&r.isValidElement(e)){n=e;var c=e.props.path||e.props.from;a=c?k(o.pathname,(0,s.Z)({},e.props,{path:c})):t.match}})),a?r.cloneElement(n,{location:o,computedMatch:a}):null}))},t}(r.Component);var R=r.useContext;function N(){return R(h)}function O(){return R(y).location}},39658:(e,t,n)=>{var a=n(5826);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return i(o(e,t),t)},e.exports.tokensToFunction=i,e.exports.tokensToRegExp=p;var r=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,a=[],o=0,c=0,i="",l=t&&t.delimiter||"/";null!=(n=r.exec(e));){var u=n[0],p=n[1],f=n.index;if(i+=e.slice(c,f),c=f+u.length,p)i+=p[1];else{var b=e[c],g=n[2],m=n[3],h=n[4],y=n[5],_=n[6],v=n[7];i&&(a.push(i),i="");var w=null!=g&&null!=b&&b!==g,x="+"===_||"*"===_,k="?"===_||"*"===_,E=n[2]||l,S=h||y;a.push({name:m||o++,prefix:g||"",delimiter:E,optional:k,repeat:x,partial:w,asterisk:!!v,pattern:S?s(S):v?".*":"[^"+d(E)+"]+?"})}}return c<e.length&&(i+=e.substr(c)),i&&a.push(i),a}function c(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function i(e,t){for(var n=new Array(e.length),r=0;r<e.length;r++)"object"==typeof e[r]&&(n[r]=new RegExp("^(?:"+e[r].pattern+")$",u(t)));return function(t,r){for(var o="",i=t||{},d=(r||{}).pretty?c:encodeURIComponent,s=0;s<e.length;s++){var l=e[s];if("string"!=typeof l){var u,p=i[l.name];if(null==p){if(l.optional){l.partial&&(o+=l.prefix);continue}throw new TypeError('Expected "'+l.name+'" to be defined')}if(a(p)){if(!l.repeat)throw new TypeError('Expected "'+l.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(l.optional)continue;throw new TypeError('Expected "'+l.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(u=d(p[f]),!n[s].test(u))throw new TypeError('Expected all "'+l.name+'" to match "'+l.pattern+'", but received `'+JSON.stringify(u)+"`");o+=(0===f?l.prefix:l.delimiter)+u}}else{if(u=l.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):d(p),!n[s].test(u))throw new TypeError('Expected "'+l.name+'" to match "'+l.pattern+'", but received "'+u+'"');o+=l.prefix+u}}else o+=l}return o}}function d(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function s(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function l(e,t){return e.keys=t,e}function u(e){return e&&e.sensitive?"":"i"}function p(e,t,n){a(t)||(n=t||n,t=[]);for(var r=(n=n||{}).strict,o=!1!==n.end,c="",i=0;i<e.length;i++){var s=e[i];if("string"==typeof s)c+=d(s);else{var p=d(s.prefix),f="(?:"+s.pattern+")";t.push(s),s.repeat&&(f+="(?:"+p+f+")*"),c+=f=s.optional?s.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var b=d(n.delimiter||"/"),g=c.slice(-b.length)===b;return r||(c=(g?c.slice(0,-b.length):c)+"(?:"+b+"(?=$))?"),c+=o?"$":r&&g?"":"(?="+b+"|$)",l(new RegExp("^"+c,u(n)),t)}function f(e,t,n){return a(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var a=0;a<n.length;a++)t.push({name:a,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return l(e,t)}(e,t):a(e)?function(e,t,n){for(var a=[],r=0;r<e.length;r++)a.push(f(e[r],t,n).source);return l(new RegExp("(?:"+a.join("|")+")",u(n)),t)}(e,t,n):function(e,t,n){return p(o(e,n),t,n)}(e,t,n)}},72408:(e,t,n)=>{"use strict";var a=n(27418),r=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var c=60109,i=60110,d=60112;t.Suspense=60113;var s=60115,l=60116;if("function"==typeof Symbol&&Symbol.for){var u=Symbol.for;r=u("react.element"),o=u("react.portal"),t.Fragment=u("react.fragment"),t.StrictMode=u("react.strict_mode"),t.Profiler=u("react.profiler"),c=u("react.provider"),i=u("react.context"),d=u("react.forward_ref"),t.Suspense=u("react.suspense"),s=u("react.memo"),l=u("react.lazy")}var p="function"==typeof Symbol&&Symbol.iterator;function f(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function m(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||b}function h(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||b}m.prototype.isReactComponent={},m.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(f(85));this.updater.enqueueSetState(this,e,t,"setState")},m.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},h.prototype=m.prototype;var _=y.prototype=new h;_.constructor=y,a(_,m.prototype),_.isPureReactComponent=!0;var v={current:null},w=Object.prototype.hasOwnProperty,x={key:!0,ref:!0,__self:!0,__source:!0};function k(e,t,n){var a,o={},c=null,i=null;if(null!=t)for(a in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(c=""+t.key),t)w.call(t,a)&&!x.hasOwnProperty(a)&&(o[a]=t[a]);var d=arguments.length-2;if(1===d)o.children=n;else if(1<d){for(var s=Array(d),l=0;l<d;l++)s[l]=arguments[l+2];o.children=s}if(e&&e.defaultProps)for(a in d=e.defaultProps)void 0===o[a]&&(o[a]=d[a]);return{$$typeof:r,type:e,key:c,ref:i,props:o,_owner:v.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===r}var S=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function T(e,t,n,a,c){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var d=!1;if(null===e)d=!0;else switch(i){case"string":case"number":d=!0;break;case"object":switch(e.$$typeof){case r:case o:d=!0}}if(d)return c=c(d=e),e=""===a?"."+C(d,0):a,Array.isArray(c)?(n="",null!=e&&(n=e.replace(S,"$&/")+"/"),T(c,t,n,"",(function(e){return e}))):null!=c&&(E(c)&&(c=function(e,t){return{$$typeof:r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(c,n+(!c.key||d&&d.key===c.key?"":(""+c.key).replace(S,"$&/")+"/")+e)),t.push(c)),1;if(d=0,a=""===a?".":a+":",Array.isArray(e))for(var s=0;s<e.length;s++){var l=a+C(i=e[s],s);d+=T(i,t,n,l,c)}else if(l=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof l)for(e=l.call(e),s=0;!(i=e.next()).done;)d+=T(i=i.value,t,n,l=a+C(i,s++),c);else if("object"===i)throw t=""+e,Error(f(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return d}function A(e,t,n){if(null==e)return e;var a=[],r=0;return T(e,a,"","",(function(e){return t.call(n,e,r++)})),a}function L(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var P={current:null};function R(){var e=P.current;if(null===e)throw Error(f(321));return e}var N={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:v,IsSomeRendererActing:{current:!1},assign:a};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!E(e))throw Error(f(143));return e}},t.Component=m,t.PureComponent=y,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=N,t.cloneElement=function(e,t,n){if(null==e)throw Error(f(267,e));var o=a({},e.props),c=e.key,i=e.ref,d=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,d=v.current),void 0!==t.key&&(c=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(l in t)w.call(t,l)&&!x.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==s?s[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=n;else if(1<l){s=Array(l);for(var u=0;u<l;u++)s[u]=arguments[u+2];o.children=s}return{$$typeof:r,type:e.type,key:c,ref:i,props:o,_owner:d}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:i,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:c,_context:e},e.Consumer=e},t.createElement=k,t.createFactory=function(e){var t=k.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:d,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:l,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:s,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return R().useCallback(e,t)},t.useContext=function(e,t){return R().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return R().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return R().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return R().useLayoutEffect(e,t)},t.useMemo=function(e,t){return R().useMemo(e,t)},t.useReducer=function(e,t,n){return R().useReducer(e,t,n)},t.useRef=function(e){return R().useRef(e)},t.useState=function(e){return R().useState(e)},t.version="17.0.2"},67294:(e,t,n)=>{"use strict";e.exports=n(72408)},60053:(e,t)=>{"use strict";var n,a,r,o;if("object"==typeof performance&&"function"==typeof performance.now){var c=performance;t.unstable_now=function(){return c.now()}}else{var i=Date,d=i.now();t.unstable_now=function(){return i.now()-d}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var s=null,l=null,u=function(){if(null!==s)try{var e=t.unstable_now();s(!0,e),s=null}catch(n){throw setTimeout(u,0),n}};n=function(e){null!==s?setTimeout(n,0,e):(s=e,setTimeout(u,0))},a=function(e,t){l=setTimeout(e,t)},r=function(){clearTimeout(l)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var p=window.setTimeout,f=window.clearTimeout;if("undefined"!=typeof console){var b=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof b&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var g=!1,m=null,h=-1,y=5,_=0;t.unstable_shouldYield=function(){return t.unstable_now()>=_},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):y=0<e?Math.floor(1e3/e):5};var v=new MessageChannel,w=v.port2;v.port1.onmessage=function(){if(null!==m){var e=t.unstable_now();_=e+y;try{m(!0,e)?w.postMessage(null):(g=!1,m=null)}catch(n){throw w.postMessage(null),n}}else g=!1},n=function(e){m=e,g||(g=!0,w.postMessage(null))},a=function(e,n){h=p((function(){e(t.unstable_now())}),n)},r=function(){f(h),h=-1}}function x(e,t){var n=e.length;e.push(t);e:for(;;){var a=n-1>>>1,r=e[a];if(!(void 0!==r&&0<S(r,t)))break e;e[a]=t,e[n]=r,n=a}}function k(e){return void 0===(e=e[0])?null:e}function E(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var a=0,r=e.length;a<r;){var o=2*(a+1)-1,c=e[o],i=o+1,d=e[i];if(void 0!==c&&0>S(c,n))void 0!==d&&0>S(d,c)?(e[a]=d,e[i]=n,a=i):(e[a]=c,e[o]=n,a=o);else{if(!(void 0!==d&&0>S(d,n)))break e;e[a]=d,e[i]=n,a=i}}}return t}return null}function S(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var C=[],T=[],A=1,L=null,P=3,R=!1,N=!1,O=!1;function j(e){for(var t=k(T);null!==t;){if(null===t.callback)E(T);else{if(!(t.startTime<=e))break;E(T),t.sortIndex=t.expirationTime,x(C,t)}t=k(T)}}function M(e){if(O=!1,j(e),!N)if(null!==k(C))N=!0,n(D);else{var t=k(T);null!==t&&a(M,t.startTime-e)}}function D(e,n){N=!1,O&&(O=!1,r()),R=!0;var o=P;try{for(j(n),L=k(C);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var c=L.callback;if("function"==typeof c){L.callback=null,P=L.priorityLevel;var i=c(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof i?L.callback=i:L===k(C)&&E(C),j(n)}else E(C);L=k(C)}if(null!==L)var d=!0;else{var s=k(T);null!==s&&a(M,s.startTime-n),d=!1}return d}finally{L=null,P=o,R=!1}}var I=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){N||R||(N=!0,n(D))},t.unstable_getCurrentPriorityLevel=function(){return P},t.unstable_getFirstCallbackNode=function(){return k(C)},t.unstable_next=function(e){switch(P){case 1:case 2:case 3:var t=3;break;default:t=P}var n=P;P=t;try{return e()}finally{P=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=I,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=P;P=e;try{return t()}finally{P=n}},t.unstable_scheduleCallback=function(e,o,c){var i=t.unstable_now();switch("object"==typeof c&&null!==c?c="number"==typeof(c=c.delay)&&0<c?i+c:i:c=i,e){case 1:var d=-1;break;case 2:d=250;break;case 5:d=1073741823;break;case 4:d=1e4;break;default:d=5e3}return e={id:A++,callback:o,priorityLevel:e,startTime:c,expirationTime:d=c+d,sortIndex:-1},c>i?(e.sortIndex=c,x(T,e),null===k(C)&&e===k(T)&&(O?r():O=!0,a(M,c-i))):(e.sortIndex=d,x(C,e),N||R||(N=!0,n(D))),e},t.unstable_wrapCallback=function(e){var t=P;return function(){var n=P;P=t;try{return e.apply(this,arguments)}finally{P=n}}}},63840:(e,t,n)=>{"use strict";e.exports=n(60053)},96774:e=>{e.exports=function(e,t,n,a){var r=n?n.call(a,e,t):void 0;if(void 0!==r)return!!r;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),c=Object.keys(t);if(o.length!==c.length)return!1;for(var i=Object.prototype.hasOwnProperty.bind(t),d=0;d<o.length;d++){var s=o[d];if(!i(s))return!1;var l=e[s],u=t[s];if(!1===(r=n?n.call(a,l,u,s):void 0)||void 0===r&&l!==u)return!1}return!0}},36809:(e,t,n)=>{"use strict";n.d(t,{default:()=>a});const a={title:"Cardano Development Updates",tagline:"Regular updates from Cardano Development Teams",url:"https://input-output-hk.github.io",baseUrl:"/cardano-updates/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/favicon.ico",organizationName:"input-output-hk",projectName:"cardano-updates",plugins:[["content-blog",{id:"quarterly",routeBasePath:"quarterly",path:"quarterly",authorsMapPath:"authors.yml",editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/"}]],scripts:[{src:"https://plausible.io/js/script.js",defer:!0,"data-domain":"input-output-hk.github.io/cardano-updates"}],presets:[["classic",{blog:{id:"updates",routeBasePath:"/",showReadingTime:!0,editUrl:"https://github.com/input-output-hk/cardano-updates/tree/main/",blogTitle:"Cardano Development Updates",blogDescription:"Regular updates from Cardano Development Teams",postsPerPage:5,blogSidebarTitle:"Recent Posts",blogSidebarCount:10,feedOptions:{type:"all",title:"Cardano Updates Feed",description:"Regular updates from Cardano Development Teams"}},sitemap:{},theme:{customCss:"/home/runner/work/cardano-updates/cardano-updates/src/css/custom.css"}}]],themeConfig:{navbar:{title:"Cardano Updates",logo:{alt:"Cardano Logo",src:"img/logo.svg"},items:[{to:"/",label:"Home",position:"right"},{to:"/quarterly",label:"Quarterly",position:"right"},{type:"dropdown",to:"tags",label:"Topics",position:"right",items:[{to:"tags",label:"All Topics"},{to:"tags/network",label:"Network"},{to:"tags/consensus",label:"Consensus"},{to:"tags/ledger",label:"Ledger"},{to:"tags/hydra",label:"Hydra"},{to:"tags/db-sync",label:"DB Sync"},{to:"tags/cli-api",label:"Node CLI & API"},{to:"quarterly/tags/cli-api-quarterly",label:"Node CLI & API Quarterly"},{to:"tags/crypto",label:"Crypto"},{to:"tags/goedel",label:"Goedel"},{to:"tags/mithril",label:"Mithril"}]},{to:"archive",label:"Archive",position:"right"},{href:"https://github.com/input-output-hk/cardano-updates",position:"right",className:"header-github-link","aria-label":"GitHub repository"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Blog",items:[{label:"Home",to:"/"},{label:"Archive",to:"archive"},{label:"Tags",to:"tags"}]}],copyright:"Copyright \xa9 2023 Input Output Global, Inc. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,i18n:{defaultLocale:"en",path:"i18n",locales:["en"],localeConfigs:{}},onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{mermaid:!1}}},87462:(e,t,n)=>{"use strict";function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},a.apply(this,arguments)}n.d(t,{Z:()=>a})},75068:(e,t,n)=>{"use strict";function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,a(e,t)}n.d(t,{Z:()=>r})},63366:(e,t,n)=>{"use strict";function a(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}n.d(t,{Z:()=>a})},38776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var a=!0,r="Invariant failed";function o(e,t){if(!e){if(a)throw new Error(r);var n="function"==typeof t?t():t,o=n?"".concat(r,": ").concat(n):r;throw new Error(o)}}},57529:e=>{"use strict";e.exports={}},16887:e=>{"use strict";e.exports=JSON.parse('{"/cardano-updates/2022-08-12-network-e9a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"71e4641a"},"/cardano-updates/2022-08-12-sre-cf2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"43bbbae7"},"/cardano-updates/2022-08-31-consensus-6f9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"7030fa2f"},"/cardano-updates/2022-09-01-ledger-ccc":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"6d371395"},"/cardano-updates/2022-09-16-ledger-8dd":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5733c82d"},"/cardano-updates/2022-09-19-db-sync-a4b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"637356df"},"/cardano-updates/2022-09-20-consensus-b11":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"015be621"},"/cardano-updates/2022-09-27-network-7f3":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"daace409"},"/cardano-updates/2022-09-30-ledger-58c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"94133299"},"/cardano-updates/2022-10-02-consensus-758":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"fba052bd"},"/cardano-updates/2022-10-04-db-sync-114":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3328a3bf"},"/cardano-updates/2022-10-04-node-cli-api-01f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a9019578"},"/cardano-updates/2022-10-05-consensus-020":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"da7937f0"},"/cardano-updates/2022-10-14-hydra-8a0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"733f2214"},"/cardano-updates/2022-10-14-ledger-585":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8ccf5d9f"},"/cardano-updates/2022-10-18-consensus-52a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"6d826f51"},"/cardano-updates/2022-10-19-node-cli-api-dea":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"1377d1fa"},"/cardano-updates/2022-10-21-hydra-577":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8cd47ea9"},"/cardano-updates/2022-10-27-crypto-8f1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"93b15a8c"},"/cardano-updates/2022-10-28-hydra-835":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5889a844"},"/cardano-updates/2022-10-28-network-a2a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"370c5287"},"/cardano-updates/2022-10-28-performance-and-tracing-207":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"dfd49ee8"},"/cardano-updates/2022-10-31-open-source-374":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"485c7377"},"/cardano-updates/2022-11-01-db-sync-aee":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"78d8ce1d"},"/cardano-updates/2022-11-02-ledger-672":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"add555bf"},"/cardano-updates/2022-11-02-node-cli-api-a05":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"089154c4"},"/cardano-updates/2022-11-02-release-459":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8d3da32e"},"/cardano-updates/2022-11-02-system-test-d6c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"17630979"},"/cardano-updates/2022-11-03-embedding-quality-246":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"1147f4da"},"/cardano-updates/2022-11-04-hydra-f05":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e3c3ef1c"},"/cardano-updates/2022-11-04-mithril-591":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"dff84d74"},"/cardano-updates/2022-11-11-crypto-1d7":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"187056c8"},"/cardano-updates/2022-11-11-hydra-83e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"32d4ad41"},"/cardano-updates/2022-11-11-ledger-2f1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"b03d4a4e"},"/cardano-updates/2022-11-11-network-34f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"03d856aa"},"/cardano-updates/2022-11-16-consensus-a8f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ac56cb0b"},"/cardano-updates/2022-11-16-node-cli-api-bbe":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"eac6bb0a"},"/cardano-updates/2022-11-16-performance-and-tracing-5fa":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"94c6d911"},"/cardano-updates/2022-11-18-hydra-c71":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"017cd6b7"},"/cardano-updates/2022-11-18-mithril-0a1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"81bb24c9"},"/cardano-updates/2022-11-23-ledger-53d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"fd6fd4a3"},"/cardano-updates/2022-11-25-crypto-f67":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d3f3f546"},"/cardano-updates/2022-11-25-hydra-839":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"51cf8946"},"/cardano-updates/2022-11-28-network-e29":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e6402687"},"/cardano-updates/2022-11-30-consensus-e7e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f59c978c"},"/cardano-updates/2022-11-30-node-cli-api-e8e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"120c0b00"},"/cardano-updates/2022-11-30-performance-and-tracing-8d0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4aaac366"},"/cardano-updates/2022-12-01-db-sync-ae4":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"347c3e4d"},"/cardano-updates/2022-12-01-mithril-543":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"042169f6"},"/cardano-updates/2022-12-01-system-test-706":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"21857c8f"},"/cardano-updates/2022-12-02-hydra-b24":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"26678b7e"},"/cardano-updates/2022-12-09-crypto-531":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9f70a142"},"/cardano-updates/2022-12-09-hydra-b00":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5668eccd"},"/cardano-updates/2022-12-09-ledger-d4c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ff8cfcf7"},"/cardano-updates/2022-12-12-network-550":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"91b05c51"},"/cardano-updates/2022-12-14-consensus-70e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9440f007"},"/cardano-updates/2022-12-14-db-sync-9c9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9b6092d7"},"/cardano-updates/2022-12-14-node-cli-api-27e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"b88c8fa9"},"/cardano-updates/2022-12-14-performance-and-tracing-5c7":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"fb63aa20"},"/cardano-updates/2022-12-15-mithril-650":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ee94a44f"},"/cardano-updates/2022-12-16-hydra-d53":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5e3dc99b"},"/cardano-updates/2022-12-28-node-cli-api-c05":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9f7c2154"},"/cardano-updates/2023-01-05-ledger-beb":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"795480a5"},"/cardano-updates/2023-01-06-crypto-4d1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"924be064"},"/cardano-updates/2023-01-11-consensus-632":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2fd426fa"},"/cardano-updates/2023-01-11-performance-and-tracing-c8e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4df30499"},"/cardano-updates/2023-01-12-mithril-02f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d92df848"},"/cardano-updates/2023-01-13-hydra-ac6":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"831d95cb"},"/cardano-updates/2023-01-13-release-f71":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"bb465a37"},"/cardano-updates/2023-01-13-system-test-6c4":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"cc267639"},"/cardano-updates/2023-01-14-db-sync-07c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"93729337"},"/cardano-updates/2023-01-19-ledger-2b7":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8a6fc2ec"},"/cardano-updates/2023-01-20-crypto-985":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8d209506"},"/cardano-updates/2023-01-20-hydra-aba":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"bcf46d9c"},"/cardano-updates/2023-01-20-network-c85":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f850a5f3"},"/cardano-updates/2023-01-20-sre-f1a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2eba0b82"},"/cardano-updates/2023-01-25-consensus-d6b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"691b1ed7"},"/cardano-updates/2023-01-25-node-cli-api-b8a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"b78698d9"},"/cardano-updates/2023-01-26-mithril-401":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"72c81964"},"/cardano-updates/2023-01-27-hydra-2f4":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4ce06e64"},"/cardano-updates/2023-02-02-ledger-7d2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"986e43da"},"/cardano-updates/2023-02-03-crypto-ad8":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"437db4bf"},"/cardano-updates/2023-02-03-goedel-2d4":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"550cdc1d"},"/cardano-updates/2023-02-03-hydra-45c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"eff08811"},"/cardano-updates/2023-02-08-consensus-a91":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"fb793160"},"/cardano-updates/2023-02-08-node-cli-api-c56":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"60e1630c"},"/cardano-updates/2023-02-08-performance-and-tracing-888":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ef4801f7"},"/cardano-updates/2023-02-09-mithril-898":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8c75942c"},"/cardano-updates/2023-02-10-hydra-fd6":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"44642b2f"},"/cardano-updates/2023-02-17-crypto-933":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4bed0e48"},"/cardano-updates/2023-02-17-goedel-855":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"62f46a38"},"/cardano-updates/2023-02-17-hydra-51e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0c48efb1"},"/cardano-updates/2023-02-17-ledger-a32":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f2b32cff"},"/cardano-updates/2023-02-17-network-136":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e8d4d6c0"},"/cardano-updates/2023-02-21-db-sync-141":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4b62dc40"},"/cardano-updates/2023-02-22-consensus-6a1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"324138c8"},"/cardano-updates/2023-02-22-node-cli-api-c5f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"144cea98"},"/cardano-updates/2023-02-23-mithril-f96":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"925feafa"},"/cardano-updates/2023-02-23-performance-and-tracing-570":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9a03c440"},"/cardano-updates/2023-02-24-hydra-120":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e5dd9161"},"/cardano-updates/2023-03-02-network-2cf":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"bc6b65d9"},"/cardano-updates/2023-03-03-crypto-afe":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c063df1b"},"/cardano-updates/2023-03-03-goedel-6d4":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"34012593"},"/cardano-updates/2023-03-03-hydra-b66":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"b4cc2dd2"},"/cardano-updates/2023-03-03-ledger-ad5":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4be9a3a6"},"/cardano-updates/2023-03-08-consensus-caa":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"28874657"},"/cardano-updates/2023-03-08-node-cli-api-4f2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"1d10bd9e"},"/cardano-updates/2023-03-08-performance-and-tracing-8bb":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f51bb76d"},"/cardano-updates/2023-03-09-mithril-031":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"97daee08"},"/cardano-updates/2023-03-10-hydra-7d8":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"fdba8f98"},"/cardano-updates/2023-03-16-goedel-2c1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e70f68c6"},"/cardano-updates/2023-03-17-crypto-91c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2e52ad4e"},"/cardano-updates/2023-03-17-hydra-531":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0d889cfb"},"/cardano-updates/2023-03-17-ledger-b04":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"43aa4824"},"/cardano-updates/2023-03-21-network-327":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"63fae4f0"},"/cardano-updates/2023-03-22-consensus-a73":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c63933b3"},"/cardano-updates/2023-03-22-node-cli-api-7a9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2a8f0182"},"/cardano-updates/2023-03-22-performance-and-tracing-665":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"b5164349"},"/cardano-updates/2023-03-23-db-sync-68e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d8668f0c"},"/cardano-updates/2023-03-23-mithril-d40":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8e410d22"},"/cardano-updates/2023-03-24-hydra-91d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d957ac34"},"/cardano-updates/2023-03-27-system-test-915":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"daa3e20a"},"/cardano-updates/2023-03-31-crypto-53e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e6ea9b03"},"/cardano-updates/2023-03-31-goedel-e53":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4fe12b4b"},"/cardano-updates/2023-03-31-hydra-f8f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"42ad0ca4"},"/cardano-updates/2023-03-31-ledger-bd1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"771f29e6"},"/cardano-updates/2023-04-05-consensus-948":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5d5964ec"},"/cardano-updates/2023-04-05-node-cli-api-bca":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f530b85c"},"/cardano-updates/2023-04-05-performance-and-tracing-50a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"47658b82"},"/cardano-updates/2023-04-06-mithril-a86":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"97cbe67b"},"/cardano-updates/2023-04-07-hydra-c27":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"05f2862f"},"/cardano-updates/2023-04-14-goedel-2bc":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d19a344f"},"/cardano-updates/2023-04-14-hydra-3aa":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ce7ed51f"},"/cardano-updates/2023-04-17-ledger-1d1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2d91c21f"},"/cardano-updates/2023-04-19-consensus-711":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"496cb9ef"},"/cardano-updates/2023-04-19-performance-and-tracing-1ef":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e7a72da0"},"/cardano-updates/2023-04-20-mithril-2f6":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a8738e5f"},"/cardano-updates/2023-04-20-node-cli-api-f77":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3cb9fdac"},"/cardano-updates/2023-04-21-hydra-12b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"73a96f39"},"/cardano-updates/2023-04-21-ledger-b7b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d2ea5af2"},"/cardano-updates/2023-04-27-hydra-266":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"435d8b4c"},"/cardano-updates/2023-04-28-crypto-8b9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9f761678"},"/cardano-updates/2023-04-28-goedel-0ba":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"219856ee"},"/cardano-updates/2023-04-28-network-bb5":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"df778edc"},"/cardano-updates/2023-05-01-db-sync-ab4":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3ee2c73a"},"/cardano-updates/2023-05-03-consensus-b9e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a2ee852b"},"/cardano-updates/2023-05-03-performance-and-tracing-370":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"77d820b6"},"/cardano-updates/2023-05-04-mithril-427":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"90bf9c2d"},"/cardano-updates/2023-05-05-ledger-4f2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f2180c0a"},"/cardano-updates/2023-05-05-node-cli-api-7ed":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4febca42"},"/cardano-updates/2023-05-12-crypto-eb6":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"cd612773"},"/cardano-updates/2023-05-12-goedel-10f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"67ce4884"},"/cardano-updates/2023-05-12-hydra-dc7":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d83d9042"},"/cardano-updates/2023-05-12-network-738":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5e730d4f"},"/cardano-updates/2023-05-17-consensus-f99":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c511c40f"},"/cardano-updates/2023-05-17-mithril-d0a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"7a7e39bb"},"/cardano-updates/2023-05-17-performance-and-tracing-976":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"b28a1077"},"/cardano-updates/2023-05-19-hydra-8b0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0c10bcf4"},"/cardano-updates/2023-05-24-node-cli-api-43d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d857251e"},"/cardano-updates/2023-05-26-goedel-5c5":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"78d554ba"},"/cardano-updates/2023-05-26-hydra-d35":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3a493dd8"},"/cardano-updates/2023-05-26-ledger-a41":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e4a61baa"},"/cardano-updates/2023-05-26-network-3a9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"588e4efd"},"/cardano-updates/2023-05-31-consensus-bc8":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"77d69aed"},"/cardano-updates/2023-05-31-performance-and-tracing-f2d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"752b6ead"},"/cardano-updates/2023-06-01-mithril-a0d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2bc04bf6"},"/cardano-updates/2023-06-02-hydra-e96":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f522921c"},"/cardano-updates/2023-06-07-node-cli-api-9c8":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c4479859"},"/cardano-updates/2023-06-08-db-sync-496":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c90fb258"},"/cardano-updates/2023-06-08-goedel-3d4":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d2ab2776"},"/cardano-updates/2023-06-08-sre-d91":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0281a492"},"/cardano-updates/2023-06-08-system-test-62e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"86c4d158"},"/cardano-updates/2023-06-09-crypto-2e0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a040c838"},"/cardano-updates/2023-06-09-developer-experience-c4e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"20bc6fcd"},"/cardano-updates/2023-06-09-hydra-bab":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a2a63bac"},"/cardano-updates/2023-06-12-network-fbe":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"99b0bd12"},"/cardano-updates/2023-06-14-consensus-ee8":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c08c0f47"},"/cardano-updates/2023-06-14-performance-and-tracing-3ec":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"82209890"},"/cardano-updates/2023-06-15-mithril-f0a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"50135b75"},"/cardano-updates/2023-06-16-hydra-2e0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0fa2fd29"},"/cardano-updates/2023-06-23-goedel-988":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"66345e96"},"/cardano-updates/2023-06-23-hydra-ec0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e25ae581"},"/cardano-updates/2023-06-23-network-e4b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4b996e44"},"/cardano-updates/2023-06-23-sre-088":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"47da279e"},"/cardano-updates/2023-06-28-consensus-031":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4ab012ff"},"/cardano-updates/2023-06-28-performance-and-tracing-997":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d988d084"},"/cardano-updates/2023-06-29-mithril-6e2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"632979e8"},"/cardano-updates/2023-06-30-hydra-fd5":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"cd0ded60"},"/cardano-updates/2023-07-04-db-sync-7cb":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"20ca2c37"},"/cardano-updates/2023-07-04-node-cli-api-ede":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8ed15298"},"/cardano-updates/2023-07-06-developer-experience-c31":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"492dc159"},"/cardano-updates/2023-07-07-crypto-240":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ec344652"},"/cardano-updates/2023-07-07-goedel-a98":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f452efc5"},"/cardano-updates/2023-07-07-hydra-5d6":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d5676bf9"},"/cardano-updates/2023-07-07-sre-5bc":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"16a93549"},"/cardano-updates/2023-07-12-consensus-395":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"84189288"},"/cardano-updates/2023-07-12-performance-and-tracing-b16":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"bd65afd9"},"/cardano-updates/2023-07-13-mithril-3dc":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3dbbac8a"},"/cardano-updates/2023-07-14-hydra-231":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3a3a2602"},"/cardano-updates/2023-07-18-node-cli-api-156":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"007e4c05"},"/cardano-updates/2023-07-20-goedel-d82":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"237aa4d6"},"/cardano-updates/2023-07-21-hydra-39b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"12208c5e"},"/cardano-updates/2023-07-21-ledger-ff7":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f63b6b72"},"/cardano-updates/2023-07-21-sre-ad2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ddce0bff"},"/cardano-updates/2023-07-26-consensus-c66":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"769eb34c"},"/cardano-updates/2023-07-27-mithril-8ae":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5a843cd2"},"/cardano-updates/2023-07-28-hydra-811":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"12c83d8a"},"/cardano-updates/2023-07-31-network-d4f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d6a3b4a5"},"/cardano-updates/2023-08-01-node-cli-api-cb1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"80537537"},"/cardano-updates/2023-08-04-crypto-e3c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"425dfc0f"},"/cardano-updates/2023-08-04-goedel-886":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c0ac1524"},"/cardano-updates/2023-08-04-hydra-15e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"7e644b1f"},"/cardano-updates/2023-08-04-ledger-d11":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"444dad87"},"/cardano-updates/2023-08-04-network-883":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2276e554"},"/cardano-updates/2023-08-04-performance-and-tracing-a82":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a572b6ff"},"/cardano-updates/2023-08-04-sre-2d9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"65ecf6d5"},"/cardano-updates/2023-08-09-consensus-092":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"692497e1"},"/cardano-updates/2023-08-10-mithril-c36":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3f2108ba"},"/cardano-updates/2023-08-11-hydra-7c0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"6bae8700"},"/cardano-updates/2023-08-11-performance-and-tracing-0bd":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"397686d4"},"/cardano-updates/2023-08-15-node-cli-api-27f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2455acc4"},"/cardano-updates/2023-08-17-crypto-fd2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"eb0e2fb1"},"/cardano-updates/2023-08-17-db-sync-20d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"77e9cceb"},"/cardano-updates/2023-08-17-secp-issue-6bb":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"15691c1d"},"/cardano-updates/2023-08-18-goedel-762":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"fa5dce7e"},"/cardano-updates/2023-08-18-hydra-09d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"43289e4d"},"/cardano-updates/2023-08-18-ledger-04c":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5226ad4f"},"/cardano-updates/2023-08-18-network-606":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"dee5d2d9"},"/cardano-updates/2023-08-18-sre-cc5":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9c7979b1"},"/cardano-updates/2023-08-23-consensus-8a6":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"301cd1f4"},"/cardano-updates/2023-08-24-performance-and-tracing-c0b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"be16a434"},"/cardano-updates/2023-08-25-hydra-ee1":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"52b8fa8a"},"/cardano-updates/2023-08-28-mithril-2ab":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f1df5007"},"/cardano-updates/2023-08-29-node-cli-api-851":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3bb06773"},"/cardano-updates/2023-09-01-goedel-9f0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4b90674f"},"/cardano-updates/2023-09-01-hydra-980":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d6f20405"},"/cardano-updates/2023-09-01-ledger-1d6":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"14ffac04"},"/cardano-updates/2023-09-01-network-567":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c178b56c"},"/cardano-updates/2023-09-01-sre-657":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5af0f4f9"},"/cardano-updates/2023-09-06-consensus-292":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d8c4fe87"},"/cardano-updates/2023-09-07-mithril-d11":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"1b2a226f"},"/cardano-updates/2023-09-07-performance-and-tracing-219":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a48d66c0"},"/cardano-updates/2023-09-08-hydra-7ec":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f117ec90"},"/cardano-updates/2023-09-12-node-cli-api-934":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e0b45b46"},"/cardano-updates/2023-09-14-db-sync-32d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"2b637fd9"},"/cardano-updates/2023-09-15-goedel-ca8":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"778ef860"},"/cardano-updates/2023-09-15-hydra-92f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"245ecae9"},"/cardano-updates/2023-09-15-ledger-890":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4e45b006"},"/cardano-updates/2023-09-15-network-6ee":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"6e7b669d"},"/cardano-updates/2023-09-15-sre-78b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5674f153"},"/cardano-updates/2023-09-20-consensus-d6f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8d0075ff"},"/cardano-updates/2023-09-20-mithril-91d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"1f9c0c9c"},"/cardano-updates/2023-09-22-hydra-c6b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ab4c3279"},"/cardano-updates/2023-09-22-performance-and-tracing-e17":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"4ed83391"},"/cardano-updates/2023-09-26-node-cli-api-6d5":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f89a4337"},"/cardano-updates/2023-09-27-mithril-42f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f4548430"},"/cardano-updates/2023-09-29-goedel-359":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"b8a3fbda"},"/cardano-updates/2023-09-29-hydra-3cc":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d15a0787"},"/cardano-updates/2023-09-29-ledger-bcc":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"35e2a0c5"},"/cardano-updates/2023-09-29-sre-9c9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a7a31948"},"/cardano-updates/2023-10-02-network-9f0":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"1afca88e"},"/cardano-updates/2023-10-04-consensus-451":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"354f96c6"},"/cardano-updates/2023-10-04-mithril-e3d":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9291df2e"},"/cardano-updates/2023-10-06-hydra-6a8":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d2aca35e"},"/cardano-updates/2023-10-06-performance-and-tracing-516":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"70372002"},"/cardano-updates/2023-10-10-node-cli-api-2c5":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ec06fa8a"},"/cardano-updates/2023-10-11-mithril-784":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f1bfc30d"},"/cardano-updates/2023-10-13-hydra-226":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5cc32405"},"/cardano-updates/2023-10-13-ledger-742":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"5d0266be"},"/cardano-updates/2023-10-13-sre-1c3":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0b0bfceb"},"/cardano-updates/2023-10-15-network-303":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"9ba26136"},"/cardano-updates/2023-10-18-consensus-c43":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"798d160f"},"/cardano-updates/2023-10-18-mithril-c02":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d967308c"},"/cardano-updates/2023-10-20-hydra-f5e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ca6829cb"},"/cardano-updates/2023-10-24-node-cli-api-4ea":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"78c763b8"},"/cardano-updates/2023-10-25-mithril-2fc":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"6927f7c4"},"/cardano-updates/2023-10-27-hydra-8d7":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a6e1d45a"},"/cardano-updates/2023-10-27-network-e80":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"d65b9dd2"},"/cardano-updates/2023-10-27-sre-06f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8fe062a7"},"/cardano-updates/2023-11-01-consensus-342":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"ccb7a847"},"/cardano-updates/2023-11-01-mithril-865":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"8d306cf9"},"/cardano-updates/2023-11-08-ledger-0c9":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"7439ef37"},"/cardano-updates/2023-11-08-mithril-19e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"44e33f80"},"/cardano-updates/2023-11-09-db-sync-484":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"36a96f5a"},"/cardano-updates/2023-11-10-hydra-181":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"387f3426"},"/cardano-updates/2023-11-10-sre-c9e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f2deb2f1"},"/cardano-updates/2023-11-14-node-cli-api-c82":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"e1f21c3f"},"/cardano-updates/2023-11-15-consensus-201":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"49d642c9"},"/cardano-updates/2023-11-15-mithril-072":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"a7418040"},"/cardano-updates/2023-11-16-network-659":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f0418a99"},"/cardano-updates/2023-11-17-hydra-609":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0ade4266"},"/cardano-updates/2023-11-17-performance-and-tracing-18e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"38284ae5"},"/cardano-updates/2023-11-20-cip1694-61b":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"1b34f23d"},"/cardano-updates/2023-11-22-ledger-d58":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"3a40f46b"},"/cardano-updates/2023-11-22-mithril-7ef":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"35961293"},"/cardano-updates/2023-11-24-hydra-18e":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"c0354ce6"},"/cardano-updates/2023-11-24-sre-ec2":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"57008883"},"/cardano-updates/2023-11-29-consensus-8be":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"335868d9"},"/cardano-updates/2023-11-29-mithril-a48":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"0e717c32"},"/cardano-updates/2023-12-01-hydra-264":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"decc8fa8"},"/cardano-updates/2023-12-04-performance-and-tracing-13f":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"f96c80d6"},"/cardano-updates/2023-12-06-ledger-b76":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"28d85025"},"/cardano-updates/2023-12-06-mithril-96a":{"__comp":"ccc49370","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","content":"55e35eab"},"/cardano-updates/archive-f69":{"__comp":"9e4087bc","__context":{"plugin":"08c82b6d"},"archive":"3ede3d79"},"/cardano-updates/markdown-page-52f":{"__comp":"1f391b9e","__context":{"plugin":"57700755"},"content":"393be207"},"/cardano-updates/page/10-4c1":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"6e43d302"},{"content":"b242687d"},{"content":"24d5a6d9"},{"content":"a1f2945e"},{"content":"e3067ecd"}],"metadata":"fc0eac3b"},"/cardano-updates/page/11-bea":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"69c7a5a7"},{"content":"a1d1f035"},{"content":"9668e24b"},{"content":"9e570fef"},{"content":"d343e3e1"}],"metadata":"d1d47ba3"},"/cardano-updates/page/12-d5b":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0e828f3a"},{"content":"046dd16d"},{"content":"611f3a9e"},{"content":"878c8163"},{"content":"3399a664"}],"metadata":"3ac14561"},"/cardano-updates/page/13-29a":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"31025fde"},{"content":"bb44f9e3"},{"content":"b65e5ec2"},{"content":"7c895c96"},{"content":"61e62d68"}],"metadata":"9e834cf3"},"/cardano-updates/page/14-63c":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"f96c80dc"},{"content":"9d7869bb"},{"content":"469935bd"},{"content":"7574ff34"},{"content":"77550e96"}],"metadata":"a1b4c76a"},"/cardano-updates/page/15-877":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"7a6174e7"},{"content":"d7836792"},{"content":"e56a9a29"},{"content":"fc8c3309"},{"content":"1e57c0e2"}],"metadata":"07541956"},"/cardano-updates/page/16-b38":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"a6e5ff3c"},{"content":"789f2cca"},{"content":"0e0c98f4"},{"content":"9dee36e7"},{"content":"65d0391b"}],"metadata":"e5a8e689"},"/cardano-updates/page/17-d0c":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"1a932c01"},{"content":"3c3d2bff"},{"content":"da04b7b0"},{"content":"80c54634"},{"content":"12a1613f"}],"metadata":"1e0f95a7"},"/cardano-updates/page/18-735":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"2e28eb6b"},{"content":"ca3b5bc8"},{"content":"246d9f04"},{"content":"10532414"},{"content":"f5b1250e"}],"metadata":"9450fd8f"},"/cardano-updates/page/19-42a":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"704e5bb8"},{"content":"6004d2a4"},{"content":"6a75c57a"},{"content":"35ef34ae"},{"content":"b4f5b98b"}],"metadata":"7b73b4cd"},"/cardano-updates/page/2-d2f":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"4de4e659"},{"content":"8534c2dd"},{"content":"fa00d705"},{"content":"5e9a4be9"},{"content":"ddcb8bff"}],"metadata":"47cae651"},"/cardano-updates/page/20-0b1":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"afa83c07"},{"content":"a1cde312"},{"content":"b032e7ab"},{"content":"ee0b7a59"},{"content":"d6c09ac2"}],"metadata":"3e93a65d"},"/cardano-updates/page/21-833":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0645cd02"},{"content":"68585f67"},{"content":"caab1e2e"},{"content":"a69f0deb"},{"content":"71d215be"}],"metadata":"548ef7ca"},"/cardano-updates/page/22-66d":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"e90b2ff0"},{"content":"113fed8c"},{"content":"c2b4dd94"},{"content":"8bfc66fb"},{"content":"4d3eb7e7"}],"metadata":"b020ac17"},"/cardano-updates/page/23-5e6":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"9cab6d73"},{"content":"45a10ae8"},{"content":"e4619b9c"},{"content":"0dfea636"},{"content":"c2eec07f"}],"metadata":"9a01d9b0"},"/cardano-updates/page/24-1ad":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ace79a55"},{"content":"d0e182b9"},{"content":"d077dadd"},{"content":"034a14a6"},{"content":"3bb415e3"}],"metadata":"cfdb38ee"},"/cardano-updates/page/25-fdb":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"fb0b9e22"},{"content":"871691d4"},{"content":"c036f08e"},{"content":"f48535bf"},{"content":"f8681695"}],"metadata":"3c8518bb"},"/cardano-updates/page/26-bc7":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"999e2b46"},{"content":"cf1bc381"},{"content":"1be923a7"},{"content":"6eecfaae"},{"content":"6190b2fb"}],"metadata":"8fddd37c"},"/cardano-updates/page/27-307":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"bdc4c1ed"},{"content":"d5cc3122"},{"content":"6d25229c"},{"content":"11423591"},{"content":"28bc1d1b"}],"metadata":"0ee9866d"},"/cardano-updates/page/28-0ae":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"c6f90b29"},{"content":"fbdc54bf"},{"content":"62ec9f43"},{"content":"b57687d8"},{"content":"2d52a685"}],"metadata":"3cb4be67"},"/cardano-updates/page/29-143":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"db50202c"},{"content":"0801ba5a"},{"content":"2154b8e4"},{"content":"bccb35b7"},{"content":"12637b23"}],"metadata":"9d43e047"},"/cardano-updates/page/3-a8a":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"7221b837"},{"content":"7fa9de70"},{"content":"a1d4a798"},{"content":"cb7a1a0b"},{"content":"7de83161"}],"metadata":"acd2edbe"},"/cardano-updates/page/30-f2b":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"aa4c9cc8"},{"content":"59a262d5"},{"content":"ebf8adea"},{"content":"99881079"},{"content":"91595845"}],"metadata":"d10ad4a6"},"/cardano-updates/page/31-0cc":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"fa0b1b5d"},{"content":"17e76f05"},{"content":"51bf60d9"},{"content":"b3041b60"},{"content":"73f0dde0"}],"metadata":"6610396c"},"/cardano-updates/page/32-383":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"c9210b26"},{"content":"ed930750"},{"content":"d96cfa54"},{"content":"6b16e156"},{"content":"2d0da244"}],"metadata":"2f97c20a"},"/cardano-updates/page/33-263":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0431617f"},{"content":"78df8d65"},{"content":"876c34e9"},{"content":"90cc522f"},{"content":"de790939"}],"metadata":"89211367"},"/cardano-updates/page/34-f10":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"c10365f3"},{"content":"d9b708eb"},{"content":"8b4d9039"},{"content":"7a4b421f"},{"content":"a6238997"}],"metadata":"6b6054d2"},"/cardano-updates/page/35-f1b":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ef4f60e7"},{"content":"e80f56fd"},{"content":"12d5d907"},{"content":"89931013"},{"content":"3f9060c3"}],"metadata":"f6b8faad"},"/cardano-updates/page/36-35d":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"393cd824"},{"content":"ec53298b"},{"content":"9136968b"},{"content":"e158fd47"},{"content":"9c96fa11"}],"metadata":"84823557"},"/cardano-updates/page/37-9e5":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0af81f82"},{"content":"04c3317f"},{"content":"4d7c8e78"},{"content":"3ab5f4e0"},{"content":"913aac40"}],"metadata":"b8465b4d"},"/cardano-updates/page/38-525":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0db650db"},{"content":"ccfc9222"},{"content":"f2423430"},{"content":"d9ccb35d"},{"content":"50d0e663"}],"metadata":"be26e761"},"/cardano-updates/page/39-32f":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"e2011657"},{"content":"391126a1"},{"content":"3ac610ff"},{"content":"1caacab6"},{"content":"c061e3b1"}],"metadata":"62a53033"},"/cardano-updates/page/4-307":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"1c192ca4"},{"content":"6d22e028"},{"content":"b7dd63dc"},{"content":"82db709e"},{"content":"934a8f8d"}],"metadata":"60c9cc01"},"/cardano-updates/page/40-10d":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"f872275a"},{"content":"6fb45133"},{"content":"8864b77b"},{"content":"ea84a009"},{"content":"94a907c9"}],"metadata":"bf071e0b"},"/cardano-updates/page/41-643":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"fce7e268"},{"content":"56f35d85"},{"content":"55b9667a"},{"content":"fee99998"},{"content":"76794a21"}],"metadata":"d200e7a4"},"/cardano-updates/page/42-bb5":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d99d594e"},{"content":"d863ede2"},{"content":"f302e248"},{"content":"c831575d"},{"content":"8c6dbeca"}],"metadata":"415f2cd9"},"/cardano-updates/page/43-d3b":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"3ce290cc"},{"content":"2d72833d"},{"content":"62422ab6"},{"content":"79730245"},{"content":"eda7cf83"}],"metadata":"7ff38eb4"},"/cardano-updates/page/44-f06":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"a9347c1b"},{"content":"c60581f2"},{"content":"bda3e1c7"},{"content":"edca0251"},{"content":"b8bcf1d1"}],"metadata":"53f26dca"},"/cardano-updates/page/45-9bf":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0c11045c"},{"content":"faece773"},{"content":"a1597564"},{"content":"35785fae"},{"content":"4dc3be72"}],"metadata":"29801efc"},"/cardano-updates/page/46-9b4":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"8fea44ca"},{"content":"04326247"},{"content":"82f24945"},{"content":"417fc4b4"},{"content":"4735cd81"}],"metadata":"ffbc2281"},"/cardano-updates/page/47-b7b":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"c6ae40c2"},{"content":"2e2abe90"},{"content":"94780c38"},{"content":"e2a7c340"},{"content":"07fdf123"}],"metadata":"2ebccc4d"},"/cardano-updates/page/48-dc6":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"7c359f4d"},{"content":"c315164d"},{"content":"6e743f1b"},{"content":"3143eb67"},{"content":"8470e3c7"}],"metadata":"9bcfaf7c"},"/cardano-updates/page/49-08e":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"563fcf2e"},{"content":"0048047b"},{"content":"b6ef4fcb"},{"content":"98e6984f"},{"content":"74d66224"}],"metadata":"ac12bff3"},"/cardano-updates/page/5-0c2":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ea2603ff"},{"content":"9b5ce5fa"},{"content":"0b5e25e7"},{"content":"f7e5e70a"},{"content":"ed99d55f"}],"metadata":"f5f103cc"},"/cardano-updates/page/50-665":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ef2b6a3f"},{"content":"0a44a251"},{"content":"996aa714"},{"content":"805fc822"},{"content":"0b1b72af"}],"metadata":"9e9bda24"},"/cardano-updates/page/51-d42":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"84677cf0"},{"content":"f6aa5556"},{"content":"41606842"},{"content":"f210b4b5"},{"content":"81528b00"}],"metadata":"f5d27437"},"/cardano-updates/page/52-ffc":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d6a93ba7"},{"content":"e135bd86"},{"content":"a1ac97eb"},{"content":"7e87972d"},{"content":"533bb9dc"}],"metadata":"60a77258"},"/cardano-updates/page/53-554":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"6da0a796"},{"content":"d79a4bb7"},{"content":"6226ba71"},{"content":"41d087d7"},{"content":"f5e5d1cf"}],"metadata":"3f64a4c5"},"/cardano-updates/page/54-984":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"8914fa7e"},{"content":"10659ce5"},{"content":"76c61a3b"},{"content":"d7899fea"},{"content":"177280a4"}],"metadata":"388f6888"},"/cardano-updates/page/55-aa5":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"274d7200"},{"content":"b512dd46"},{"content":"9fba849d"},{"content":"144cf255"},{"content":"d124c703"}],"metadata":"709abed9"},"/cardano-updates/page/56-f12":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"1da92289"},{"content":"31889a8f"},{"content":"126e82e6"},{"content":"40e498fa"},{"content":"439b9a57"}],"metadata":"94dc91d7"},"/cardano-updates/page/57-4c1":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"15dc596d"},{"content":"0d671897"},{"content":"b92c36fd"},{"content":"fb8d4667"},{"content":"7faccef9"}],"metadata":"d442e1d8"},"/cardano-updates/page/58-60b":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"90f359c5"},{"content":"e356bfd0"},{"content":"77215fb3"},{"content":"d3a595c1"},{"content":"9b7a95a2"}],"metadata":"2dd2949a"},"/cardano-updates/page/59-11d":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ae2d2424"},{"content":"f5a24224"},{"content":"7c815b5e"},{"content":"06a283ef"},{"content":"4c4f8ee1"}],"metadata":"b6145ff0"},"/cardano-updates/page/6-444":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"7a263bfa"},{"content":"5c8fca76"},{"content":"c7e43a05"},{"content":"54a7c81e"},{"content":"ccf451f9"}],"metadata":"4c91b9ee"},"/cardano-updates/page/60-468":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"a3889346"},{"content":"2073b851"},{"content":"73bbd4d7"},{"content":"ce6dcc9e"},{"content":"68fb9d2f"}],"metadata":"86cc1b5f"},"/cardano-updates/page/61-5e4":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"2fa57f55"},{"content":"019bb279"},{"content":"ba0b6dbd"}],"metadata":"1b0bebd5"},"/cardano-updates/page/7-c54":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"1752e4e5"},{"content":"a14fd889"},{"content":"43ab8474"},{"content":"49d88be4"},{"content":"f6ec1152"}],"metadata":"82ed4471"},"/cardano-updates/page/8-3b7":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"a687dd04"},{"content":"3bc8fe23"},{"content":"d5f27176"},{"content":"35c3586e"},{"content":"d70b4c5f"}],"metadata":"66326f4e"},"/cardano-updates/page/9-d20":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"b3043f02"},{"content":"70396aa3"},{"content":"209bf559"},{"content":"d7c69167"},{"content":"80617771"}],"metadata":"7d4ab4f9"},"/cardano-updates/quarterly-968":{"__comp":"a6aa9e1f","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"6b51f988"},{"content":"57e0ab98"},{"content":"5296f864"},{"content":"7de7ce98"},{"content":"e716e5b6"},{"content":"97407dee"},{"content":"600e4190"},{"content":"12525f14"},{"content":"95f12e12"},{"content":"c0cf6239"}],"metadata":"34c17ec8"},"/cardano-updates/quarterly/2022-10-07-node-cli-api-6ba":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"5778ca6b"},"/cardano-updates/quarterly/2022-11-07-ledger-bf4":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"a0d18a99"},"/cardano-updates/quarterly/2022-11-09-network-8a6":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"e7486169"},"/cardano-updates/quarterly/2022-11-15-consensus-3cf":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"83e7e4db"},"/cardano-updates/quarterly/2023-01-13-network-608":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"cc5c2602"},"/cardano-updates/quarterly/2023-01-13-open-source-ac2":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"0dea9a3b"},"/cardano-updates/quarterly/2023-01-18-consensus-401":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"db138d7c"},"/cardano-updates/quarterly/2023-04-03-ledger-719":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"c5858ebd"},"/cardano-updates/quarterly/2023-04-04-network-bc4":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"4da01d42"},"/cardano-updates/quarterly/2023-04-25-consensus-28b":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"c7337d4e"},"/cardano-updates/quarterly/2023-Q2-consensus-562":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"f3c06362"},"/cardano-updates/quarterly/2023-Q2-network-6e3":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"be1e6782"},"/cardano-updates/quarterly/2023-Q2-sre-e4c":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"ce17d78b"},"/cardano-updates/quarterly/2023-Q3-performance-and-tracing-606":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"b073a55d"},"/cardano-updates/quarterly/2023-Q3-sre-32f":{"__comp":"ccc49370","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","content":"6c8b7ad4"},"/cardano-updates/quarterly/archive-c41":{"__comp":"9e4087bc","__context":{"plugin":"c1c5c6f5"},"archive":"ac8a5a87"},"/cardano-updates/quarterly/page/2-70e":{"__comp":"a6aa9e1f","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"79d76848"},{"content":"dceb6e64"},{"content":"46c51ef6"},{"content":"15072f11"},{"content":"cced6026"}],"metadata":"4ef71b5f"},"/cardano-updates/quarterly/tags-d09":{"__comp":"01a85c17","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","tags":"2494f6fc"},"/cardano-updates/quarterly/tags/cli-api-quarterly-723":{"__comp":"6875c492","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"cced6026"}],"tag":"bbc31819","listMetadata":"d7d2f3e9"},"/cardano-updates/quarterly/tags/consensus-842":{"__comp":"6875c492","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"6b51f988"},{"content":"97407dee"},{"content":"95f12e12"},{"content":"dceb6e64"}],"tag":"565f686e","listMetadata":"ae455379"},"/cardano-updates/quarterly/tags/ledger-62d":{"__comp":"6875c492","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"12525f14"},{"content":"15072f11"}],"tag":"60fae5f4","listMetadata":"965e9e9a"},"/cardano-updates/quarterly/tags/network-3b9":{"__comp":"6875c492","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"57e0ab98"},{"content":"600e4190"},{"content":"c0cf6239"},{"content":"46c51ef6"}],"tag":"3eae7101","listMetadata":"80057f85"},"/cardano-updates/quarterly/tags/open-source-03a":{"__comp":"6875c492","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"79d76848"}],"tag":"de5b481b","listMetadata":"1e24dd00"},"/cardano-updates/quarterly/tags/performance-tracing-7a7":{"__comp":"6875c492","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"7de7ce98"}],"tag":"8c574ba2","listMetadata":"1b2c892c"},"/cardano-updates/quarterly/tags/sre-102":{"__comp":"6875c492","__context":{"plugin":"c1c5c6f5"},"sidebar":"87088759","items":[{"content":"5296f864"},{"content":"e716e5b6"}],"tag":"eac9cf07","listMetadata":"40718b14"},"/cardano-updates/tags-3c0":{"__comp":"01a85c17","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","tags":"372219b0"},"/cardano-updates/tags/cip-1694-a7d":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"7221b837"}],"tag":"ea5726b6","listMetadata":"f47d214c"},"/cardano-updates/tags/cli-api-cf8":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"6d22e028"},{"content":"54a7c81e"},{"content":"d5f27176"},{"content":"a1f2945e"},{"content":"3399a664"}],"tag":"4cecd320","listMetadata":"fe184e91"},"/cardano-updates/tags/cli-api/page/2-ab6":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"77550e96"},{"content":"da04b7b0"},{"content":"b4f5b98b"},{"content":"a69f0deb"},{"content":"c2eec07f"}],"tag":"1a657a20","listMetadata":"9a4c05df"},"/cardano-updates/tags/cli-api/page/3-bd2":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"c6f90b29"},{"content":"12637b23"},{"content":"73f0dde0"},{"content":"d9b708eb"},{"content":"393cd824"}],"tag":"622f92df","listMetadata":"efad53df"},"/cardano-updates/tags/cli-api/page/4-8bc":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ccfc9222"},{"content":"6fb45133"},{"content":"f302e248"},{"content":"bda3e1c7"},{"content":"04326247"}],"tag":"8084428b","listMetadata":"d9e42018"},"/cardano-updates/tags/cli-api/page/5-bfe":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0048047b"},{"content":"0a44a251"},{"content":"a1ac97eb"},{"content":"10659ce5"},{"content":"40e498fa"}],"tag":"4906b8e6","listMetadata":"7ff27d5d"},"/cardano-updates/tags/cli-api/page/6-69e":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d3a595c1"},{"content":"4c4f8ee1"}],"tag":"1b2c8e6e","listMetadata":"98b2ca25"},"/cardano-updates/tags/consensus-d84":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d0639dee"},{"content":"7de83161"},{"content":"0b5e25e7"},{"content":"1752e4e5"},{"content":"b3043f02"}],"tag":"459dd1ef","listMetadata":"e0a90ddc"},"/cardano-updates/tags/consensus/page/2-56c":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"a1d1f035"},{"content":"7c895c96"},{"content":"fc8c3309"},{"content":"ca3b5bc8"},{"content":"ee0b7a59"}],"tag":"4fb1471a","listMetadata":"e06746c7"},"/cardano-updates/tags/consensus/page/3-2c0":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"113fed8c"},{"content":"d077dadd"},{"content":"999e2b46"},{"content":"b57687d8"},{"content":"59a262d5"}],"tag":"61f1e7c8","listMetadata":"62dc90a1"},"/cardano-updates/tags/consensus/page/4-384":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ed930750"},{"content":"8b4d9039"},{"content":"3f9060c3"},{"content":"0db650db"},{"content":"f872275a"}],"tag":"23a95b4f","listMetadata":"ea7f8016"},"/cardano-updates/tags/consensus/page/5-af0":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d863ede2"},{"content":"c60581f2"},{"content":"8fea44ca"},{"content":"6e743f1b"},{"content":"74d66224"}],"tag":"376dd8e8","listMetadata":"ed730a1d"},"/cardano-updates/tags/consensus/page/6-4a3":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"e135bd86"},{"content":"8914fa7e"},{"content":"31889a8f"},{"content":"9b7a95a2"},{"content":"7c815b5e"}],"tag":"8a766cbb","listMetadata":"eab6de32"},"/cardano-updates/tags/consensus/page/7-692":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"73bbd4d7"},{"content":"019bb279"}],"tag":"e57d1f62","listMetadata":"37b2e4a4"},"/cardano-updates/tags/crypto-865":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"65d0391b"},{"content":"3c3d2bff"},{"content":"246d9f04"},{"content":"8bfc66fb"},{"content":"6eecfaae"}],"tag":"35f1ce0d","listMetadata":"1a21d6a2"},"/cardano-updates/tags/crypto/page/2-d35":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"91595845"},{"content":"2d0da244"},{"content":"9136968b"},{"content":"50d0e663"},{"content":"ea84a009"}],"tag":"e2c8baed","listMetadata":"8395f67d"},"/cardano-updates/tags/crypto/page/3-8c2":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"8c6dbeca"},{"content":"b8bcf1d1"},{"content":"82f24945"},{"content":"8470e3c7"},{"content":"0b1b72af"}],"tag":"ae521593","listMetadata":"b96b3223"},"/cardano-updates/tags/crypto/page/4-85a":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"6da0a796"},{"content":"d7899fea"},{"content":"e356bfd0"}],"tag":"a34b3179","listMetadata":"ae7f7c70"},"/cardano-updates/tags/db-sync-5de":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"934a8f8d"},{"content":"878c8163"},{"content":"1a932c01"},{"content":"0dfea636"},{"content":"d5cc3122"}],"tag":"5cf7c214","listMetadata":"4fe88e48"},"/cardano-updates/tags/db-sync/page/2-957":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"6b16e156"},{"content":"3ab5f4e0"},{"content":"c831575d"},{"content":"94780c38"},{"content":"ef2b6a3f"}],"tag":"859b6012","listMetadata":"a0fc6770"},"/cardano-updates/tags/db-sync/page/3-aa5":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"f210b4b5"},{"content":"0d671897"},{"content":"06a283ef"},{"content":"ce6dcc9e"}],"tag":"0d7612e9","listMetadata":"4883d618"},"/cardano-updates/tags/devx-b40":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"e4619b9c"},{"content":"6190b2fb"}],"tag":"09abc415","listMetadata":"c091c5d8"},"/cardano-updates/tags/embedding-quality-49f":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"1da92289"}],"tag":"40a4cbba","listMetadata":"359aa856"},"/cardano-updates/tags/goedel-6fc":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d7c69167"},{"content":"9e570fef"},{"content":"61e62d68"},{"content":"1e57c0e2"},{"content":"10532414"}],"tag":"7d6aa09c","listMetadata":"b41783a8"},"/cardano-updates/tags/goedel/page/2-2a2":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"caab1e2e"},{"content":"4d3eb7e7"},{"content":"3bb415e3"},{"content":"6d25229c"},{"content":"db50202c"}],"tag":"27c15961","listMetadata":"fdfeff52"},"/cardano-updates/tags/goedel/page/3-6ad":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"fa0b1b5d"},{"content":"0431617f"},{"content":"ef4f60e7"},{"content":"e158fd47"},{"content":"3ac610ff"}],"tag":"35369e36","listMetadata":"56b3fab8"},"/cardano-updates/tags/goedel/page/4-5b7":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"94a907c9"},{"content":"3ce290cc"},{"content":"0c11045c"}],"tag":"578d3f15","listMetadata":"b9d87023"},"/cardano-updates/tags/hydra-319":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"9ce37f6e"},{"content":"8534c2dd"},{"content":"7fa9de70"},{"content":"b7dd63dc"},{"content":"ed99d55f"}],"tag":"cc30e037","listMetadata":"98277053"},"/cardano-updates/tags/hydra/page/10-dbd":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"b6ef4fcb"},{"content":"84677cf0"},{"content":"41606842"},{"content":"d79a4bb7"},{"content":"41d087d7"}],"tag":"830ba2c4","listMetadata":"948ff80d"},"/cardano-updates/tags/hydra/page/11-1ad":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"177280a4"},{"content":"9fba849d"},{"content":"b92c36fd"},{"content":"77215fb3"},{"content":"ae2d2424"}],"tag":"e84709f6","listMetadata":"7325235b"},"/cardano-updates/tags/hydra/page/2-e33":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ccf451f9"},{"content":"49d88be4"},{"content":"35c3586e"},{"content":"80617771"},{"content":"e3067ecd"}],"tag":"91831590","listMetadata":"79239208"},"/cardano-updates/tags/hydra/page/3-ec8":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d343e3e1"},{"content":"31025fde"},{"content":"f96c80dc"},{"content":"d7836792"},{"content":"a6e5ff3c"}],"tag":"c94f306d","listMetadata":"ef2b1d07"},"/cardano-updates/tags/hydra/page/4-281":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"80c54634"},{"content":"f5b1250e"},{"content":"a1cde312"},{"content":"d6c09ac2"},{"content":"71d215be"}],"tag":"cfb82551","listMetadata":"ac87db6a"},"/cardano-updates/tags/hydra/page/5-911":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"9cab6d73"},{"content":"ace79a55"},{"content":"fb0b9e22"},{"content":"f48535bf"},{"content":"bdc4c1ed"}],"tag":"04cbd10c","listMetadata":"51457b0b"},"/cardano-updates/tags/hydra/page/6-319":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"fbdc54bf"},{"content":"0801ba5a"},{"content":"aa4c9cc8"},{"content":"17e76f05"},{"content":"876c34e9"}],"tag":"a6afc437","listMetadata":"12ef8706"},"/cardano-updates/tags/hydra/page/7-fc5":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"90cc522f"},{"content":"e80f56fd"},{"content":"12d5d907"},{"content":"9c96fa11"},{"content":"4d7c8e78"}],"tag":"46d9aab0","listMetadata":"b13803f3"},"/cardano-updates/tags/hydra/page/8-e36":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"e2011657"},{"content":"1caacab6"},{"content":"fce7e268"},{"content":"fee99998"},{"content":"2d72833d"}],"tag":"40367786","listMetadata":"c6259fbb"},"/cardano-updates/tags/hydra/page/9-344":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"eda7cf83"},{"content":"faece773"},{"content":"35785fae"},{"content":"417fc4b4"},{"content":"e2a7c340"}],"tag":"be32a6ec","listMetadata":"e54fb861"},"/cardano-updates/tags/ledger-5cf":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"884eee03"},{"content":"5e9a4be9"},{"content":"7221b837"},{"content":"ea2603ff"},{"content":"f6ec1152"}],"tag":"2e69cd33","listMetadata":"41244b80"},"/cardano-updates/tags/ledger/page/2-c91":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"6e43d302"},{"content":"0e828f3a"},{"content":"9d7869bb"},{"content":"789f2cca"},{"content":"704e5bb8"}],"tag":"e8f5afda","listMetadata":"166775fd"},"/cardano-updates/tags/ledger/page/3-d03":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0645cd02"},{"content":"2154b8e4"},{"content":"b3041b60"},{"content":"de790939"},{"content":"a6238997"}],"tag":"154dea53","listMetadata":"d0a351c0"},"/cardano-updates/tags/ledger/page/4-754":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"0af81f82"},{"content":"391126a1"},{"content":"56f35d85"},{"content":"62422ab6"},{"content":"a1597564"}],"tag":"baed1590","listMetadata":"73a1bc7a"},"/cardano-updates/tags/ledger/page/5-86d":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"2e2abe90"},{"content":"563fcf2e"},{"content":"f6aa5556"},{"content":"6226ba71"},{"content":"274d7200"}],"tag":"49db7061","listMetadata":"48292e37"},"/cardano-updates/tags/ledger/page/6-9c7":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"126e82e6"},{"content":"f5a24224"},{"content":"a3889346"},{"content":"68fb9d2f"},{"content":"2fa57f55"}],"tag":"255b72b4","listMetadata":"3c2e75b4"},"/cardano-updates/tags/mithril-5ea":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"37b247a8"},{"content":"4de4e659"},{"content":"ddcb8bff"},{"content":"1c192ca4"},{"content":"9b5ce5fa"}],"tag":"9c662d1f","listMetadata":"86e0423a"},"/cardano-updates/tags/mithril/page/2-8ae":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"f7e5e70a"},{"content":"c7e43a05"},{"content":"a14fd889"},{"content":"3bc8fe23"},{"content":"70396aa3"}],"tag":"551db1ac","listMetadata":"f4cb7e87"},"/cardano-updates/tags/mithril/page/3-30f":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"24d5a6d9"},{"content":"9668e24b"},{"content":"bb44f9e3"},{"content":"7a6174e7"},{"content":"2e28eb6b"}],"tag":"00bb8269","listMetadata":"17f4ca64"},"/cardano-updates/tags/mithril/page/4-c21":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"b032e7ab"},{"content":"e90b2ff0"},{"content":"d0e182b9"},{"content":"f8681695"},{"content":"62ec9f43"}],"tag":"6f700e99","listMetadata":"960e3390"},"/cardano-updates/tags/mithril/page/5-fc4":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ebf8adea"},{"content":"c9210b26"},{"content":"c10365f3"},{"content":"89931013"},{"content":"913aac40"}],"tag":"bbe7c3bd","listMetadata":"9945c128"},"/cardano-updates/tags/mithril/page/6-c91":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"c061e3b1"},{"content":"76794a21"},{"content":"a9347c1b"},{"content":"4dc3be72"},{"content":"c315164d"}],"tag":"6b553c5c","listMetadata":"6a2140b3"},"/cardano-updates/tags/mithril/page/7-812":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"98e6984f"},{"content":"81528b00"},{"content":"f5e5d1cf"},{"content":"144cf255"}],"tag":"f6a3ab66","listMetadata":"b073edd1"},"/cardano-updates/tags/network-e9b":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"cb7a1a0b"},{"content":"7a263bfa"},{"content":"43ab8474"},{"content":"209bf559"},{"content":"046dd16d"}],"tag":"fa57bfdd","listMetadata":"9dce568f"},"/cardano-updates/tags/network/page/2-312":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"469935bd"},{"content":"0e0c98f4"},{"content":"6004d2a4"},{"content":"afa83c07"},{"content":"871691d4"}],"tag":"db5663d1","listMetadata":"21735eff"},"/cardano-updates/tags/network/page/3-b91":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"1be923a7"},{"content":"bccb35b7"},{"content":"51bf60d9"},{"content":"78df8d65"},{"content":"d9ccb35d"}],"tag":"54597942","listMetadata":"1f965afe"},"/cardano-updates/tags/network/page/4-314":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"55b9667a"},{"content":"79730245"},{"content":"4735cd81"},{"content":"805fc822"},{"content":"533bb9dc"}],"tag":"4fd8c72a","listMetadata":"7aaa65e3"},"/cardano-updates/tags/network/page/5-d89":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"b512dd46"},{"content":"fb8d4667"},{"content":"2073b851"},{"content":"ba0b6dbd"}],"tag":"ff276f6a","listMetadata":"7e8e081f"},"/cardano-updates/tags/open-source-905":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"d124c703"}],"tag":"684a796f","listMetadata":"a5bf291f"},"/cardano-updates/tags/performance-tracing-7e4":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"26a4b8b3"},{"content":"a1d4a798"},{"content":"d70b4c5f"},{"content":"69c7a5a7"},{"content":"b65e5ec2"}],"tag":"2c045882","listMetadata":"14fc0a72"},"/cardano-updates/tags/performance-tracing/page/2-665":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"e56a9a29"},{"content":"12a1613f"},{"content":"6a75c57a"},{"content":"c2b4dd94"},{"content":"034a14a6"}],"tag":"aafd9eaa","listMetadata":"e9310706"},"/cardano-updates/tags/performance-tracing/page/3-b14":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"cf1bc381"},{"content":"2d52a685"},{"content":"99881079"},{"content":"d96cfa54"},{"content":"7a4b421f"}],"tag":"0dc0e43e","listMetadata":"e695f231"},"/cardano-updates/tags/performance-tracing/page/4-fad":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"ec53298b"},{"content":"f2423430"},{"content":"8864b77b"},{"content":"d99d594e"},{"content":"edca0251"}],"tag":"e406e44d","listMetadata":"7312b66d"},"/cardano-updates/tags/performance-tracing/page/5-f63":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"3143eb67"},{"content":"996aa714"},{"content":"7e87972d"},{"content":"76c61a3b"},{"content":"7faccef9"}],"tag":"e86dcd26","listMetadata":"3be95f92"},"/cardano-updates/tags/release-2e7":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"4735cd81"},{"content":"07fdf123"},{"content":"805fc822"},{"content":"533bb9dc"},{"content":"439b9a57"}],"tag":"61d299e1","listMetadata":"5df8a536"},"/cardano-updates/tags/security-616":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"7221b837"}],"tag":"4c7d0c08","listMetadata":"66be9998"},"/cardano-updates/tags/sre-abe":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"fa00d705"},{"content":"82db709e"},{"content":"5c8fca76"},{"content":"a687dd04"},{"content":"b242687d"}],"tag":"a8723288","listMetadata":"6c658908"},"/cardano-updates/tags/sre/page/2-2a2":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"611f3a9e"},{"content":"7574ff34"},{"content":"9dee36e7"},{"content":"35ef34ae"},{"content":"68585f67"}],"tag":"82c38436","listMetadata":"f13a89c7"},"/cardano-updates/tags/sre/page/3-7ef":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"45a10ae8"},{"content":"c036f08e"},{"content":"11423591"},{"content":"c6ae40c2"},{"content":"90f359c5"}],"tag":"5c5c653f","listMetadata":"89a43a90"},"/cardano-updates/tags/system-test-c77":{"__comp":"6875c492","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"28bc1d1b"},{"content":"04c3317f"},{"content":"7c359f4d"},{"content":"d6a93ba7"},{"content":"15dc596d"}],"tag":"e38c8545","listMetadata":"e5b737ed"},"/cardano-updates/docs-49f":{"__comp":"1be78505","__context":{"plugin":"27c463c7"},"versionMetadata":"935f2afb"},"/cardano-updates/docs/category/tutorial---basics-14d":{"__comp":"14eb3368","categoryGeneratedIndex":"8f7e10a3"},"/cardano-updates/docs/category/tutorial---extras-19d":{"__comp":"14eb3368","categoryGeneratedIndex":"0de82e28"},"/cardano-updates/docs/intro-433":{"__comp":"17896441","content":"0e384e19"},"/cardano-updates/docs/tutorial-basics/congratulations-9cd":{"__comp":"17896441","content":"822bd8ab"},"/cardano-updates/docs/tutorial-basics/create-a-blog-post-ca9":{"__comp":"17896441","content":"533a09ca"},"/cardano-updates/docs/tutorial-basics/create-a-document-5bb":{"__comp":"17896441","content":"1e4232ab"},"/cardano-updates/docs/tutorial-basics/create-a-page-8d5":{"__comp":"17896441","content":"5c868d36"},"/cardano-updates/docs/tutorial-basics/deploy-your-site-c68":{"__comp":"17896441","content":"f55d3e7a"},"/cardano-updates/docs/tutorial-basics/markdown-features-319":{"__comp":"17896441","content":"18c41134"},"/cardano-updates/docs/tutorial-extras/manage-docs-versions-9eb":{"__comp":"17896441","content":"dff1c289"},"/cardano-updates/docs/tutorial-extras/translate-your-site-0ea":{"__comp":"17896441","content":"e44a2883"},"/cardano-updates/-5f5":{"__comp":"a6aa9e1f","__context":{"plugin":"08c82b6d"},"sidebar":"d6b66cf4","items":[{"content":"884eee03"},{"content":"37b247a8"},{"content":"26a4b8b3"},{"content":"9ce37f6e"},{"content":"d0639dee"}],"metadata":"b4645a09"}}')}},e=>{e.O(0,[40532],(()=>{return t=49383,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.bc51b93f.js.LICENSE.txt b/assets/js/main.bc51b93f.js.LICENSE.txt new file mode 100644 index 00000000000..6e08db297b1 --- /dev/null +++ b/assets/js/main.bc51b93f.js.LICENSE.txt @@ -0,0 +1,53 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + */ + +/** @license React v0.20.2 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/runtime~main.0180faa2.js b/assets/js/runtime~main.0180faa2.js new file mode 100644 index 00000000000..c6a2526f929 --- /dev/null +++ b/assets/js/runtime~main.0180faa2.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,c,a,d,f,b={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var a=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=b,r.c=t,e=[],r.O=(c,a,d,f)=>{if(!a){var b=1/0;for(i=0;i<e.length;i++){a=e[i][0],d=e[i][1],f=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&f||b>=f)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,f<b&&(b=f));if(t){e.splice(i--,1);var n=d();void 0!==n&&(c=n)}}return c}f=f||0;for(var i=e.length;i>0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[a,d,f]},r.n=e=>{var c=e&&e.__esModule?()=>e.default:()=>e;return r.d(c,{a:c}),c},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};c=c||[null,a({}),a([]),a(a)];for(var t=2&d&&e;"object"==typeof t&&!~c.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((c=>b[c]=()=>e[c]));return b.default=()=>e,r.d(f,b),f},r.d=(e,c)=>{for(var a in c)r.o(c,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:c[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((c,a)=>(r.f[a](e,c),c)),[])),r.u=e=>"assets/js/"+({81:"08c82b6d",162:"e86dcd26",278:"9f761678",292:"b032e7ab",376:"f6aa5556",416:"09abc415",458:"43289e4d",770:"1752e4e5",947:"733f2214",1129:"f5b1250e",1285:"28bc1d1b",1321:"f2423430",1338:"ef2b6a3f",1435:"98b2ca25",1537:"d3a595c1",1821:"d8668f0c",1929:"e25ae581",2109:"219856ee",2136:"871691d4",2221:"3ede3d79",2307:"06a283ef",2348:"1a932c01",2432:"7e87972d",2506:"c6259fbb",2578:"d92df848",2681:"62f46a38",2773:"a69f0deb",2789:"35c3586e",3136:"d9ccb35d",3270:"d5676bf9",3403:"7312b66d",3445:"565f686e",3530:"8c75942c",3649:"017cd6b7",3792:"dff1c289",3918:"5668eccd",4093:"20bc6fcd",4307:"16a93549",4376:"3ab5f4e0",4497:"a9019578",4608:"ac12bff3",4615:"12a1613f",4775:"53f26dca",4910:"0dea9a3b",4944:"691b1ed7",4986:"9136968b",5106:"43ab8474",5214:"28d85025",5237:"ccf451f9",5337:"4883d618",5485:"56f35d85",5552:"61d299e1",5978:"1d10bd9e",6036:"cfb82551",6115:"35961293",6166:"d10ad4a6",6169:"9f70a142",6236:"47da279e",6246:"bb465a37",6249:"55e35eab",6255:"5296f864",6324:"51cf8946",6413:"03d856aa",6683:"94dc91d7",6807:"986e43da",6890:"10532414",6919:"769eb34c",6962:"15dc596d",6996:"2dd2949a",7204:"3143eb67",7233:"35785fae",7266:"9b7a95a2",7322:"485c7377",7413:"b28a1077",7555:"4ab012ff",7729:"6d826f51",7741:"b8a3fbda",7783:"c10365f3",7891:"eab6de32",7897:"4b996e44",7966:"246d9f04",7968:"7de83161",8033:"d343e3e1",8580:"d83d9042",8694:"62ec9f43",8737:"a6e1d45a",8765:"a1b4c76a",9107:"e3c3ef1c",9140:"3be95f92",9499:"a040c838",9817:"14eb3368",9821:"d442e1d8",9828:"7de7ce98",9928:"8ed15298",10114:"0af81f82",10173:"89931013",10335:"4b62dc40",11254:"f6ec1152",11400:"b7dd63dc",11652:"1e24dd00",11727:"c63933b3",11748:"5e9a4be9",11952:"301cd1f4",12029:"3bc8fe23",12626:"f51bb76d",12634:"f6a3ab66",12812:"baed1590",13085:"1f391b9e",13276:"57700755",13412:"d2aca35e",13680:"77215fb3",13764:"d3f3f546",14274:"68585f67",14348:"db5663d1",14392:"5674f153",14582:"93b15a8c",15091:"3ac610ff",15152:"d124c703",15224:"be32a6ec",15347:"8914fa7e",15529:"4735cd81",15589:"5c868d36",15623:"8bfc66fb",15677:"2f97c20a",15715:"b65e5ec2",16002:"a2a63bac",16091:"7ff27d5d",16165:"5af0f4f9",16171:"d96cfa54",16227:"0ade4266",16348:"12d5d907",16349:"4febca42",16360:"d2ab2776",16855:"3dbbac8a",16878:"54a7c81e",16886:"a7418040",16934:"8395f67d",16959:"9a03c440",17214:"5226ad4f",17285:"d7899fea",17433:"f2180c0a",17490:"91b05c51",17693:"c6ae40c2",17837:"66326f4e",17873:"ae2d2424",17903:"4da01d42",17923:"622f92df",18058:"7d6aa09c",18144:"8d306cf9",18242:"dceb6e64",18303:"2d72833d",18367:"48292e37",18479:"05f2862f",18634:"db138d7c",18654:"3ce290cc",18694:"1a21d6a2",19105:"7ff38eb4",19516:"52b8fa8a",19644:"0801ba5a",19773:"925feafa",19861:"98e6984f",20203:"ff8cfcf7",20387:"d19a344f",20433:"7439ef37",20553:"2d52a685",20635:"1f965afe",20681:"5cf7c214",20738:"d200e7a4",20779:"57e0ab98",20955:"b073a55d",20957:"d967308c",20974:"3a3a2602",21080:"37b247a8",21129:"ec53298b",21158:"9a01d9b0",21198:"415f2cd9",21200:"0dfea636",21463:"1147f4da",21562:"c063df1b",21597:"8fe062a7",21642:"2455acc4",21798:"924be064",22109:"255b72b4",22154:"8a6fc2ec",22191:"b242687d",22206:"45a10ae8",22254:"a34b3179",22393:"d6c09ac2",22469:"ccb7a847",22496:"41244b80",22519:"31025fde",22838:"4ed83391",22954:"1da92289",23092:"40e498fa",23146:"1c192ca4",23271:"347c3e4d",23318:"ed930750",23360:"add555bf",23427:"80617771",23531:"e406e44d",23599:"d6f20405",23621:"0b5e25e7",23941:"94a907c9",24212:"8a766cbb",24215:"62a53033",24251:"372219b0",24288:"d7c69167",24310:"43bbbae7",24327:"27c463c7",24379:"bbe7c3bd",24384:"6b51f988",24651:"b57687d8",24671:"d8c4fe87",24745:"f210b4b5",24891:"e0a90ddc",24910:"b4645a09",24913:"960e3390",24941:"9e834cf3",25189:"f89a4337",25272:"8e410d22",25351:"611f3a9e",25353:"a1d4a798",25403:"f850a5f3",25469:"be1e6782",25480:"4be9a3a6",25540:"e8f5afda",25578:"548ef7ca",25590:"73bbd4d7",25759:"04326247",25778:"8fddd37c",25853:"ac8a5a87",25946:"e5a8e689",26026:"a687dd04",26276:"0b1b72af",26299:"2d0da244",26397:"0e717c32",26540:"e695f231",26544:"ee0b7a59",26565:"274d7200",26584:"c90fb258",26614:"578d3f15",26710:"fa00d705",27237:"0d889cfb",27335:"bda3e1c7",27449:"042169f6",27478:"b3043f02",27647:"82db709e",27668:"cd0ded60",27850:"9bcfaf7c",27918:"17896441",28298:"46c51ef6",28323:"1f9c0c9c",28480:"2154b8e4",28577:"6c8b7ad4",28592:"28874657",28669:"d5cc3122",28843:"2276e554",29059:"0d671897",29071:"76794a21",29121:"91831590",29177:"daa3e20a",29399:"77d69aed",29514:"1be78505",29537:"78df8d65",29614:"0dc0e43e",29750:"6d22e028",30101:"73f0dde0",30126:"ba0b6dbd",30141:"82209890",30335:"2d91c21f",30374:"5df8a536",30482:"d6a3b4a5",30584:"6b6054d2",30670:"50d0e663",30830:"ce7ed51f",30843:"3c2e75b4",30849:"e2011657",30907:"a5bf291f",31005:"ddce0bff",31349:"d6a93ba7",31421:"cc30e037",31617:"bcf46d9c",31636:"44e33f80",31724:"8084428b",31757:"9c7979b1",31831:"60e1630c",32023:"faece773",32035:"90bf9c2d",32070:"97daee08",32438:"370c5287",32464:"f8681695",32472:"9f7c2154",32627:"d0e182b9",32706:"12637b23",32831:"632979e8",32852:"12208c5e",32871:"684a796f",32925:"9e570fef",32936:"8d209506",33215:"113fed8c",33288:"b78698d9",33399:"57008883",33538:"b020ac17",33596:"54597942",33671:"5d0266be",33724:"82f24945",33815:"444dad87",34070:"4906b8e6",34631:"4bed0e48",34719:"387f3426",34828:"5c5c653f",34891:"7574ff34",34985:"f3c06362",35029:"9dce568f",35388:"c2eec07f",35400:"35f1ce0d",35703:"6bae8700",35748:"79239208",35846:"ea5726b6",35877:"f1bfc30d",35889:"b3041b60",36016:"2fd426fa",36160:"bd65afd9",36171:"fba052bd",36186:"66be9998",36229:"82c38436",36303:"1b2c8e6e",36337:"3a40f46b",36370:"934a8f8d",36398:"3f9060c3",36434:"56b3fab8",36463:"a1ac97eb",36504:"822bd8ab",36721:"e2c8baed",36881:"c0354ce6",37221:"5a843cd2",37329:"e5dd9161",37426:"17f4ca64",37495:"fd6fd4a3",37595:"965e9e9a",37734:"9d7869bb",38141:"8470e3c7",38516:"20ca2c37",38518:"0048047b",38672:"ae455379",38938:"7fa9de70",39066:"edca0251",39071:"3a493dd8",39080:"c6f90b29",39113:"acd2edbe",39329:"ac56cb0b",39419:"07541956",39439:"07fdf123",39596:"c091c5d8",39640:"7030fa2f",39745:"0c11045c",39898:"63fae4f0",39969:"ff276f6a",39987:"8534c2dd",40160:"bc6b65d9",40176:"b5164349",40309:"c036f08e",40373:"46d9aab0",40400:"10659ce5",40430:"187056c8",40682:"4c7d0c08",40705:"60fae5f4",40767:"74d66224",41153:"ca6829cb",41794:"0c48efb1",42126:"d7836792",42185:"de790939",42190:"b88c8fa9",42198:"59a262d5",42347:"4fb1471a",42575:"32d4ad41",42677:"c831575d",42686:"6e743f1b",43020:"c2b4dd94",43108:"44642b2f",43140:"80537537",43194:"c315164d",43261:"789f2cca",43363:"e9310706",43412:"e56a9a29",43686:"14fc0a72",43729:"15691c1d",43898:"2eba0b82",43980:"40718b14",44003:"5c8fca76",44281:"f452efc5",44377:"7a6174e7",44379:"73a1bc7a",44501:"94c6d911",44966:"35ef34ae",45237:"e7486169",45389:"4d7c8e78",45410:"9450fd8f",45480:"335868d9",45542:"154dea53",45662:"2e69cd33",45766:"d863ede2",45821:"f48535bf",45932:"878c8163",45943:"bb44f9e3",46003:"81bb24c9",46033:"e84709f6",46103:"ccc49370",46207:"12525f14",46271:"ec06fa8a",46318:"4ce06e64",46521:"d99d594e",46545:"f59c978c",46576:"2e28eb6b",46831:"86c4d158",46846:"e7a72da0",46922:"f872275a",46982:"0645cd02",47093:"b512dd46",47176:"2fa57f55",47263:"97407dee",47406:"40367786",47605:"469935bd",47658:"1be923a7",47669:"26a4b8b3",47704:"2073b851",47724:"26678b7e",48221:"97cbe67b",48275:"94133299",48423:"eda7cf83",48600:"6190b2fb",48610:"6875c492",48622:"e2a7c340",48679:"9e9bda24",48818:"cced6026",48837:"4fe12b4b",48863:"84189288",48909:"f7e5e70a",48983:"66345e96",48990:"9b6092d7",49105:"38284ae5",49237:"046dd16d",49238:"7e8e081f",49605:"f530b85c",49706:"3c3d2bff",49769:"a3889346",49835:"1afca88e",49904:"a6238997",50097:"588e4efd",50165:"752b6ead",50307:"29801efc",50471:"81528b00",50506:"3ee2c73a",50881:"144cea98",50919:"aa4c9cc8",51092:"e38c8545",51164:"3e93a65d",51257:"00bb8269",51268:"91595845",51410:"f5e5d1cf",51522:"f117ec90",51727:"5778ca6b",51934:"d0a351c0",51951:"4df30499",52322:"b92c36fd",52506:"d0639dee",52560:"dee5d2d9",52650:"6b16e156",52703:"70372002",52818:"e8d4d6c0",52834:"b03d4a4e",53004:"99881079",53121:"e4a61baa",53165:"805fc822",53210:"1b2c892c",53288:"f1df5007",53426:"efad53df",53482:"c0cf6239",53516:"b6ef4fcb",53608:"9e4087bc",53662:"4de4e659",53931:"5d5964ec",53940:"71e4641a",54007:"7d4ab4f9",54176:"50135b75",54193:"f55d3e7a",54415:"84677cf0",54607:"533a09ca",54642:"ddcb8bff",54669:"ebf8adea",54750:"e5b737ed",54868:"77e9cceb",54975:"884eee03",55135:"e0b45b46",55202:"8b4d9039",55413:"376dd8e8",55531:"ef4f60e7",55553:"144cf255",55638:"3cb9fdac",55791:"f47d214c",55855:"62422ab6",56010:"2bc04bf6",56482:"e4619b9c",56618:"a572b6ff",56674:"771f29e6",56733:"704e5bb8",56789:"ae7f7c70",56815:"ee94a44f",56950:"69c7a5a7",57161:"fb8d4667",57193:"6004d2a4",57227:"2a8f0182",57271:"417fc4b4",57583:"2494f6fc",57772:"d957ac34",57918:"decc8fa8",58312:"82ed4471",58470:"fb63aa20",58566:"f2b32cff",58628:"8cd47ea9",58680:"e1f21c3f",58744:"9dee36e7",58774:"12c83d8a",58925:"94780c38",59037:"eac9cf07",59158:"a0fc6770",59318:"7c815b5e",59494:"14ffac04",59576:"51457b0b",59671:"0e384e19",59736:"cfdb38ee",59747:"6e43d302",59749:"4ef71b5f",59798:"99b0bd12",59955:"120c0b00",60019:"6927f7c4",60183:"49db7061",60247:"dfd49ee8",60263:"47658b82",60280:"0e0c98f4",60375:"7e644b1f",60459:"6f700e99",60715:"a1597564",60852:"496cb9ef",60881:"7b73b4cd",60903:"0b0bfceb",61039:"12ef8706",61137:"ed730a1d",61185:"ace79a55",61596:"79730245",61660:"7a7e39bb",61908:"8864b77b",61980:"78d554ba",62034:"86cc1b5f",62083:"da7937f0",62140:"fce7e268",62227:"77550e96",62231:"9ba26136",62302:"9291df2e",62703:"ac87db6a",62767:"a0d18a99",62901:"51bf60d9",63089:"4e45b006",63565:"0a44a251",63566:"db50202c",63824:"fbdc54bf",64013:"01a85c17",64112:"65ecf6d5",64156:"21735eff",64313:"1e57c0e2",64410:"e06746c7",64562:"c08c0f47",64614:"c061e3b1",64827:"4d3eb7e7",64906:"ffbc2281",64966:"17e76f05",65029:"3bb06773",65123:"1e0f95a7",65318:"ed99d55f",65319:"d1d47ba3",65356:"245ecae9",65421:"dff84d74",65562:"5cc32405",65773:"393cd824",65956:"c7e43a05",66458:"40a4cbba",66602:"98277053",66649:"8ccf5d9f",66743:"0de82e28",66764:"9ce37f6e",66840:"2e52ad4e",66891:"90f359c5",67170:"f5f103cc",67205:"cd612773",67272:"5e3dc99b",67330:"bbc31819",67452:"7a4b421f",67463:"d9b708eb",67787:"bf071e0b",67820:"ea7f8016",67825:"459dd1ef",67927:"fc0eac3b",68044:"9668e24b",68077:"9a4c05df",68102:"83e7e4db",68115:"afa83c07",68153:"0431617f",68184:"5889a844",68352:"47cae651",68580:"ec344652",69376:"2b637fd9",69399:"3eae7101",69467:"2e2abe90",69565:"a6afc437",69778:"86e0423a",69791:"e135bd86",70022:"533bb9dc",70085:"f4cb7e87",70170:"d9e42018",70594:"996aa714",70613:"b073edd1",70635:"b4cc2dd2",70641:"f96c80dc",70644:"6226ba71",70729:"ef2b1d07",70883:"61f1e7c8",70950:"3399a664",71843:"b6145ff0",71844:"f5a24224",71870:"d70b4c5f",71972:"41d087d7",72033:"8f7e10a3",72311:"4cecd320",72317:"de5b481b",72344:"089154c4",72690:"ab4c3279",72744:"60c9cc01",72815:"e70f68c6",72872:"0c10bcf4",73001:"fa5dce7e",73277:"b8bcf1d1",73320:"78d8ce1d",73321:"c4479859",73336:"e80f56fd",73343:"49d88be4",73798:"27c15961",73799:"f0418a99",73800:"007e4c05",73875:"6c658908",74390:"71d215be",74433:"35369e36",74607:"0db650db",74933:"b8465b4d",75064:"7faccef9",75319:"831d95cb",75379:"79d76848",75394:"ef4801f7",75501:"9b5ce5fa",75506:"55b9667a",75556:"f522921c",75696:"90cc522f",75698:"d857251e",75730:"550cdc1d",75748:"492dc159",75773:"9c662d1f",76074:"4dc3be72",76294:"4fd8c72a",76323:"a9347c1b",76413:"77d820b6",76433:"999e2b46",76581:"bdc4c1ed",76705:"4c91b9ee",76762:"5e730d4f",77338:"0e828f3a",77411:"b96b3223",77533:"ce17d78b",77642:"fc8c3309",77644:"ce6dcc9e",77696:"7c359f4d",77965:"a48d66c0",78101:"da04b7b0",78148:"9d43e047",78153:"a6e5ff3c",78183:"8c574ba2",78397:"3f64a4c5",78446:"795480a5",78461:"b4f5b98b",78580:"354f96c6",78761:"cc5c2602",79036:"df778edc",79224:"fdba8f98",79260:"6fb45133",79362:"e57d1f62",79503:"0281a492",79765:"3ac14561",79841:"1377d1fa",79967:"fe184e91",80048:"68fb9d2f",80053:"935f2afb",80113:"4c4f8ee1",80309:"42ad0ca4",80367:"209bf559",80542:"391126a1",80567:"6da0a796",80575:"49d642c9",80599:"600e4190",80613:"015be621",80622:"eb0e2fb1",81030:"fdfeff52",81169:"61e62d68",81214:"cc267639",81587:"437db4bf",81947:"ae521593",82164:"f2deb2f1",82214:"4fe88e48",82358:"798d160f",82859:"18c41134",82939:"89a43a90",82941:"9fba849d",83036:"7c895c96",83050:"04c3317f",83051:"37b2e4a4",83129:"15072f11",83160:"60a77258",83167:"019bb279",83214:"f302e248",83247:"be16a434",83377:"80057f85",83584:"f6b8faad",83646:"0fa2fd29",84069:"6eecfaae",84340:"6610396c",84599:"e3067ecd",84727:"95f12e12",84773:"cf1bc381",84877:"8d3da32e",85138:"d988d084",85173:"859b6012",85349:"425dfc0f",85351:"f5d27437",85362:"709abed9",85369:"876c34e9",85417:"21857c8f",85442:"1caacab6",85845:"93729337",85943:"a7a31948",86003:"62dc90a1",86074:"551db1ac",86095:"be26e761",86326:"ea2603ff",86393:"3328a3bf",86582:"f13a89c7",86673:"a8723288",86809:"34012593",86830:"67ce4884",86983:"3c8518bb",87233:"ccfc9222",87314:"0ee9866d",87326:"a14fd889",87389:"f63b6b72",87407:"a1f2945e",87411:"fb793160",87414:"393be207",87445:"eac6bb0a",88101:"41606842",88572:"65d0391b",88592:"6a75c57a",88697:"435d8b4c",88767:"948ff80d",88782:"1b2a226f",88818:"1e4232ab",88829:"e158fd47",88845:"6a2140b3",88862:"d077dadd",88869:"e6ea9b03",89008:"daace409",89083:"aafd9eaa",89104:"b41783a8",89248:"e54fb861",89325:"9945c128",89548:"d15a0787",89752:"c0ac1524",89756:"397686d4",90045:"7221b837",90047:"87088759",90056:"fa0b1b5d",90083:"e356bfd0",90178:"9c96fa11",90206:"d79a4bb7",90288:"f96c80d6",90748:"a1cde312",90934:"cb7a1a0b",90999:"35e2a0c5",91151:"c7337d4e",91192:"76c61a3b",91282:"a1d1f035",91760:"fee99998",91879:"6d25229c",91902:"34c17ec8",91984:"d2ea5af2",91990:"1b34f23d",92149:"fa57bfdd",92160:"36a96f5a",92214:"692497e1",92255:"c178b56c",92308:"4b90674f",92501:"ea84a009",92517:"70396aa3",92522:"fb0b9e22",92846:"913aac40",93089:"a6aa9e1f",93108:"d65b9dd2",93203:"9cab6d73",93524:"e6402687",93570:"caab1e2e",93724:"17630979",93784:"6b553c5c",93789:"f4548430",94184:"5733c82d",94379:"e716e5b6",94560:"563fcf2e",94583:"23a95b4f",94590:"72c81964",94759:"bccb35b7",94771:"84823557",94900:"3bb415e3",94922:"c511c40f",95018:"034a14a6",95199:"c5858ebd",95208:"a2ee852b",95447:"177280a4",95516:"d6b66cf4",95558:"d5f27176",95569:"c1c5c6f5",95613:"324138c8",95739:"0d7612e9",95816:"eff08811",95845:"73a96f39",95850:"b9d87023",95979:"637356df",96121:"439b9a57",96140:"ca3b5bc8",96162:"8c6dbeca",96394:"388f6888",96410:"11423591",96446:"31889a8f",96558:"b13803f3",96755:"e44a2883",96774:"3cb4be67",96799:"6e7b669d",96838:"778ef860",96840:"e90b2ff0",96871:"126e82e6",96944:"78c763b8",97094:"c60581f2",97245:"04cbd10c",97317:"359aa856",97363:"d7d2f3e9",97382:"1a657a20",97421:"89211367",97517:"8fea44ca",97535:"4aaac366",97730:"6d371395",97801:"1b0bebd5",97959:"c9210b26",98254:"9440f007",98347:"43aa4824",98370:"2ebccc4d",98450:"7a263bfa",98698:"24d5a6d9",98727:"c94f306d",98777:"2c045882",98882:"7aaa65e3",98918:"237aa4d6",99610:"3f2108ba",99726:"830ba2c4",99750:"8d0075ff",99808:"80c54634",99847:"166775fd",99873:"7325235b",99881:"a8738e5f"}[e]||e)+"."+{81:"8647aa4f",162:"125084b6",278:"efd79bb9",292:"b1a9961b",376:"97793938",416:"e2f175c7",458:"c91734fc",770:"873d8644",947:"260f1743",1129:"5a405e64",1285:"e033ce8a",1321:"bec1d3ae",1338:"276cebb0",1435:"58b9f52d",1537:"813f9114",1821:"be2330b5",1929:"b6c5260b",2109:"fc647f5b",2136:"358d342f",2221:"3f739406",2307:"b8b2b1f9",2348:"6aaf6224",2432:"24662f86",2506:"fdd3fb9d",2529:"3a3a1ec8",2578:"9daf110c",2681:"200c43f2",2773:"4d5ff44c",2789:"55caad30",3136:"cea6c556",3270:"f90c55bb",3403:"97615e9e",3445:"5a6ec3a7",3530:"5e08e3a4",3649:"6c855c6e",3792:"c8e36228",3918:"20b5304f",4093:"6a2cce37",4307:"ab7d990e",4376:"04ccd5a8",4497:"618a0894",4608:"f511d815",4615:"0e2fe3c1",4775:"4f1881f6",4910:"e1158297",4944:"406ee554",4972:"a20ea76a",4986:"5abe266e",5106:"0e965728",5214:"84af456e",5237:"7efe9c4d",5337:"0d6007b2",5485:"c3eab92c",5552:"76807eb6",5978:"e7b9cd1c",6036:"e63304fb",6115:"d0fa4575",6166:"af42a029",6169:"92a32352",6236:"0dc7a732",6246:"a85dd0e6",6249:"f696c438",6255:"dabe31b3",6324:"e4f02867",6413:"52e2f164",6683:"e956eef6",6807:"f541f01c",6890:"69c8af62",6919:"4403be81",6962:"ecdc1050",6996:"e4a51357",7204:"b959afc8",7233:"0a17f637",7266:"ff1a9f67",7322:"08d81db4",7413:"d4571d53",7555:"891d7eda",7729:"2c78b028",7741:"c9a4283c",7783:"472f2046",7891:"8354251c",7897:"f9c2f0cd",7966:"1a9615d1",7968:"6e30b750",8033:"3cb5767a",8580:"fc0ecb0d",8694:"b063b2d8",8737:"affc557f",8765:"51af9271",9107:"61c2b7ed",9140:"45db99c1",9499:"3f6e8559",9817:"75d4fe89",9821:"854196c8",9828:"caa95da2",9928:"d65354c1",10114:"4b115c93",10173:"c6ff4cfa",10335:"f3efb060",11254:"c2043e3a",11400:"a0a6b412",11652:"03c90e48",11727:"19137cb7",11748:"9e7aea0b",11952:"2e5b4d2a",12029:"54d3883d",12626:"7f54a00b",12634:"dd8c87cc",12812:"d9d74d98",13085:"4c243540",13276:"3e57e6d9",13412:"86129eca",13680:"5fcc484d",13764:"88297ed1",14274:"eb9cce0f",14348:"a1ed76f8",14392:"b4eb130b",14582:"d2a93a61",15091:"316c8e11",15152:"15587654",15224:"24f1e527",15347:"0fe96f3b",15529:"21fed183",15589:"01487d90",15623:"c75678d4",15677:"ce7c08f0",15715:"d8fca806",16002:"f350ae76",16091:"5960fd00",16165:"98e85c8f",16171:"2939f4b2",16227:"b7cf47d6",16348:"1addbe15",16349:"f94e02ae",16360:"0b7a25c4",16855:"56fe0fb3",16878:"d059c59c",16886:"313e46d8",16934:"798e5dd2",16959:"55017adb",17214:"b1d14706",17285:"8822e22a",17433:"2c802d5e",17490:"41ca190f",17693:"fcdab135",17837:"78fd62e9",17873:"be7ef5ae",17903:"55b2a465",17923:"5ca5ec26",18058:"fba7f48c",18144:"aa58ca4c",18242:"eb5e94a8",18303:"b2ed8410",18367:"4e1a58d5",18479:"32b47b8d",18634:"1b8b9080",18654:"49694d77",18694:"8c1f975e",19105:"f5ac8427",19516:"b3e53016",19644:"ebcbb7d6",19773:"07b667eb",19861:"26f25dbd",20203:"83f44d88",20387:"3d64c4eb",20433:"e15faba5",20553:"16ff720d",20635:"e03ac866",20681:"36586195",20738:"e30d362a",20779:"71940d4e",20955:"87d95835",20957:"4b0b548a",20974:"b09aebb4",21080:"bcaeb502",21129:"c7e575ce",21158:"da592dca",21198:"064a1e9b",21200:"45223f2a",21463:"c6a37e99",21562:"518f2336",21597:"d7311ede",21642:"54c4fd43",21798:"77e5f297",22109:"c906285c",22154:"f5b11d20",22191:"9e8010a3",22206:"de178977",22254:"fc92e4ec",22393:"62736fde",22469:"7e3751a5",22496:"81b0a059",22519:"797a7c77",22838:"31eb1d59",22954:"64c6b1ce",23092:"7e0d2b44",23146:"8659f9df",23271:"648bedec",23318:"a3d3ae4d",23360:"8ea1e3df",23427:"3351af55",23531:"c4e96dd4",23599:"d88dddb4",23621:"c75d5f30",23941:"b1899393",24212:"70e76067",24215:"08859e4a",24251:"103948fa",24288:"06afceb4",24310:"8ce14775",24327:"c17177cd",24379:"224be55a",24384:"6976254a",24651:"ad244a62",24671:"808f0700",24745:"8690c2eb",24891:"a29272eb",24910:"58164e44",24913:"9a5d2160",24941:"1e4d257a",25189:"d99ad3e6",25272:"c34ee40e",25351:"dc1be487",25353:"53b252bf",25403:"536e35f2",25469:"4ec13c11",25480:"9e933a24",25540:"eb7f2404",25578:"87502d26",25590:"28eef603",25759:"8876239e",25778:"2e76cb01",25853:"fb97dd70",25946:"c5c3df95",26026:"bb48cff5",26276:"a3f1baa4",26299:"cbe1ecb9",26397:"e588556c",26540:"2dfaf583",26544:"f2d5e972",26565:"08e977b8",26584:"9c89e222",26614:"ece3e377",26710:"cb0aaed6",27237:"7f793126",27335:"8c9d07fa",27449:"41e4831f",27478:"38a94c82",27647:"075c055a",27668:"0db37d65",27850:"459a8722",27918:"12db7610",28298:"7652a0cc",28323:"5dc5eee7",28480:"4635d227",28577:"3b4a3f73",28592:"18164af4",28669:"33b4ba11",28843:"dfa87ea9",29059:"dc5836f3",29071:"2d5266e5",29121:"028d52d9",29177:"f1391e79",29399:"613ab23b",29514:"eb072735",29537:"119ba796",29614:"00835288",29750:"a5fcbc6b",30101:"f2c110fe",30126:"00ad8d78",30141:"d5e4ff65",30335:"2b35d919",30374:"f44554bd",30482:"0e85b9f0",30584:"1032f2af",30670:"0674ac23",30830:"8bdb2215",30843:"1fb064d3",30849:"8d35be8c",30907:"f146d996",31005:"2c93fa43",31349:"2190ecb6",31421:"47fc6eda",31617:"dc0dfba9",31636:"842bca3f",31724:"0eba4435",31757:"e1cf42fe",31831:"96901eb9",32023:"2d8cf6c5",32035:"ecec42d7",32070:"077f549d",32438:"99fe1c0a",32464:"f50d9273",32472:"b8bd5c7b",32627:"835c5b63",32706:"8c689cc8",32831:"1945c14a",32852:"498a6ea8",32871:"c08bc3c2",32925:"3918b741",32936:"e4591885",33215:"43bf9228",33288:"e2fd1721",33399:"11bb08cb",33538:"f01a9412",33596:"94ae773b",33671:"e028d3f3",33724:"8746cef5",33815:"29aa76a0",34070:"48c4df9c",34631:"0ec05e19",34719:"93ddf683",34828:"17cac15c",34891:"785c26ac",34985:"96ecb4f3",35029:"09ea27c7",35388:"f7406fac",35400:"c093fa38",35703:"1896d76a",35748:"68e37e23",35846:"2672f5db",35877:"4bc1270e",35889:"04095479",36016:"ac550511",36160:"b89ce463",36171:"92a16ec4",36186:"833c32ac",36229:"f7c1816e",36303:"9c8b7196",36337:"b5ec8c54",36370:"939addfb",36398:"e4eac2b7",36434:"8ae61492",36463:"58460967",36504:"dfb2cd17",36721:"fe76b678",36881:"09b0b808",37221:"63c9493e",37329:"eed06922",37426:"bfe3c38a",37495:"1f94006f",37595:"ae2a813a",37734:"35b4854a",38141:"4090b9b2",38516:"5368fb83",38518:"7e1f75e8",38672:"e0af4636",38938:"cff3c34e",39066:"665a94cd",39071:"735658ae",39080:"8b77bc39",39113:"7d8cc863",39329:"5e036803",39419:"2c467b7c",39439:"654288cb",39596:"ce22eeb2",39640:"ac2104c3",39745:"7ecdd83c",39898:"c9242707",39969:"72f5da9b",39987:"8ec8dbda",40160:"f1413473",40176:"8a4ed5f9",40309:"230d3185",40373:"40f77729",40400:"04295867",40430:"90cfbf91",40682:"57bb3429",40705:"0a220c69",40767:"39d38542",41153:"00bb58af",41794:"01a06fce",42126:"8920f6e8",42185:"74e01666",42190:"9fdee81f",42198:"9dd70cc0",42347:"876221eb",42575:"059e2e13",42677:"33f5874b",42686:"64602d6e",43020:"778afa9a",43108:"9ca08045",43140:"5725cfd8",43194:"90ef02cc",43261:"39f99462",43363:"e46f5ee8",43412:"d1d0f3d4",43686:"a4681214",43729:"51e197de",43898:"d58fcc5f",43980:"5ad5937f",44003:"d1a16dc0",44281:"b66888d2",44377:"93ed69fb",44379:"eede1bae",44501:"ce947e81",44966:"d5d7c472",45237:"d066da59",45389:"a7f8c06f",45410:"f4c685b8",45480:"3ea9cbb3",45542:"1fc8ba85",45662:"7723f713",45766:"11363200",45821:"29fcdfb3",45932:"fc733a29",45943:"0939305b",46003:"76693a73",46033:"bffbbe4e",46103:"66cad8e9",46207:"359b7596",46271:"8d919f1b",46318:"8c5577b4",46521:"0abb20d4",46545:"51f789b1",46576:"9479c2e3",46831:"2e916fa2",46846:"d7b2d45e",46922:"dbdfeb4f",46982:"fa280ace",47093:"0c3c6eed",47176:"9c6c3715",47263:"1346e5b9",47406:"801454be",47605:"daaef810",47658:"8d35f70e",47669:"b55c0ab6",47704:"3d1c7c5a",47724:"706c9ffb",48221:"9fa74904",48275:"4eaf7b31",48423:"e9a49dd3",48600:"6cb691e4",48610:"16502a56",48622:"17f426f9",48679:"2571a9f9",48818:"061e2055",48837:"941e6176",48863:"e5afffc2",48909:"061609b3",48983:"e312da06",48990:"8ac0135c",49105:"6211d81b",49237:"729d4d40",49238:"455c9b12",49605:"90d61588",49706:"6a9b8a9e",49769:"f4b45fc1",49835:"5924808c",49904:"20176f92",50097:"70f41653",50165:"8868ca89",50307:"c897fcb8",50471:"9aeb470f",50506:"56f15864",50881:"f99162b0",50919:"6f769daf",51068:"b4d6108e",51092:"52bffd2c",51164:"c81741e5",51257:"def94b86",51268:"dbcc8865",51410:"409624be",51522:"7fad2391",51727:"8bc37115",51934:"258067ed",51951:"579d0d55",52322:"da51b229",52506:"f18be2c7",52560:"044804a9",52650:"2e2f483e",52703:"8347b491",52818:"20140c19",52834:"5d00abc3",53004:"7399a249",53121:"347ef4cf",53165:"c864d419",53210:"dc757eff",53288:"afbfc914",53426:"45dcc7a1",53482:"cd90552c",53516:"68ecccd5",53608:"47006cd4",53662:"cb788841",53931:"d720c839",53940:"c575aa4b",54007:"0ec0db41",54176:"e3faee2b",54193:"f786acd2",54415:"55a9266a",54607:"3d88b763",54642:"0be505e0",54669:"dcda8491",54750:"3fd1fabf",54868:"9b232c45",54975:"9c216150",55135:"004f9296",55202:"1f86965b",55413:"2261b7dd",55531:"f66551bc",55553:"88218aa6",55638:"eb9b02da",55791:"7885e24c",55855:"648df983",56010:"977be0a1",56482:"0e5fd447",56618:"fac7438c",56674:"38c2d771",56733:"fbbc39f4",56789:"147dae80",56815:"72450e08",56950:"4519d82c",57161:"f082283b",57193:"ab1b5f3f",57227:"70e085a1",57271:"4f4a2695",57583:"cb95a366",57772:"2fafdb70",57918:"03de18e2",58312:"838c38ab",58470:"850437a9",58566:"39abae3b",58628:"cf455658",58680:"7f2072d9",58744:"c9cec439",58774:"ebd0fc40",58925:"71d2b83d",59037:"e77df8c6",59158:"402665bb",59318:"a5522061",59494:"cf60f381",59576:"bd558a45",59671:"2cd17c73",59736:"97cf8400",59747:"e737c437",59749:"e4f1978f",59798:"4ff93e6b",59955:"b79d45ef",60019:"bee27a35",60183:"7d2045e9",60247:"8d5945b5",60263:"e1d6cb38",60280:"b615e9a6",60375:"ef2c8f6f",60459:"66ebd5a7",60715:"186e8185",60852:"aaee1128",60881:"d7498fa0",60903:"29fc63d0",61039:"114e8e85",61137:"19e36255",61185:"6028e600",61596:"14cda0d8",61660:"20054c14",61908:"cb1a7306",61980:"66ab6334",62034:"c4aa4649",62083:"7cc22aaa",62140:"e65bf999",62227:"e668c8a1",62231:"1faa833c",62302:"9b87d940",62703:"c0500c01",62767:"9c37ba0b",62901:"2a2866d6",63089:"d8b869ce",63565:"e62524d6",63566:"71a9a110",63824:"80a293fa",64013:"545379d8",64112:"9b390ce8",64156:"0b009fcd",64313:"66497df8",64410:"a59320ce",64562:"416aafe8",64614:"52557f8e",64827:"deb360a8",64906:"bed0db17",64966:"72c79f2a",65029:"29b34cb1",65123:"4185e54d",65318:"e3582b94",65319:"c8bfd78a",65356:"0554e2e3",65421:"7af6b65c",65562:"fd1def08",65773:"593da712",65956:"c308de8a",66458:"c44c73f4",66602:"8204ac95",66649:"108f5ee1",66743:"ff3d9525",66764:"77804269",66840:"1909c27b",66891:"bdc4672e",67170:"b1cf07d2",67205:"d9b87bb0",67272:"c7aa10e4",67330:"a65c3848",67452:"f75b7a16",67463:"a7b8ca27",67787:"76b7ab70",67820:"7c07b525",67825:"7604d487",67927:"320a4227",68044:"a1fef7db",68077:"566cf4df",68102:"6c511419",68115:"67905eb7",68153:"5c919503",68184:"62933b70",68352:"5e63cd4e",68580:"83a054ec",69376:"56e9f371",69399:"1c3bfdde",69467:"2e84cbdd",69565:"c755f9a0",69778:"929b4796",69791:"35a0a708",70022:"b96dad64",70085:"0c2f8fe1",70170:"8af86b03",70594:"48a86a7d",70613:"1e4774ca",70635:"ac8372ad",70641:"85f32d0b",70644:"40eb13ae",70729:"41206daf",70883:"3b0a1c29",70950:"cb1ecec9",71843:"7ca20c32",71844:"d169d439",71870:"9e25feed",71972:"f106b6c0",72033:"d241f9ad",72311:"50a66533",72317:"565b362c",72344:"cd4dba30",72690:"cc8e8278",72744:"8f5bc5c6",72815:"0a94e2cb",72872:"c8aa7ca2",73001:"e833700b",73277:"204838b0",73320:"84441dbe",73321:"8309a90c",73336:"6510f040",73343:"57145c14",73798:"1370e42d",73799:"2c34ef4d",73800:"e45fd96d",73875:"1afc9614",74390:"87d3dda2",74433:"c570c97c",74607:"bac77798",74933:"c76114e0",75064:"aac12434",75319:"0c66da8a",75379:"47b0a3f4",75394:"5d3fc9af",75501:"860ab49e",75506:"9fc9a6eb",75556:"3a805440",75696:"bcba69c4",75698:"5d7f7fca",75730:"5c224350",75748:"444114ca",75773:"abf660e9",76074:"1b8e67d2",76294:"6da59da0",76323:"a93f84b5",76413:"ed642bc4",76433:"b9eca61e",76581:"c2a461dc",76705:"800884f9",76762:"bf3e3989",77338:"84204c63",77411:"99af26b5",77533:"b895a29b",77642:"746176a0",77644:"38a5e04e",77696:"0c522b73",77965:"554b9825",78101:"390ca13a",78148:"df69749e",78153:"f8f8d3c0",78183:"ca3a46e5",78397:"7672a1fc",78446:"e692d8ea",78461:"d8a4a2ab",78580:"f214d6fc",78761:"db9902d7",79036:"6398e671",79224:"8aadb32b",79260:"8780f9a7",79362:"5be8a504",79503:"3b7b7eac",79765:"1cd1f4d0",79841:"d6f4b9df",79967:"4c2cc153",80048:"2531ccaa",80053:"12b4c978",80113:"35fd4774",80210:"245c42c2",80309:"784088d6",80367:"8a8670ee",80542:"ec0b455d",80567:"a9cb8072",80575:"3891d7a8",80599:"0bee7b6c",80613:"e0570f17",80622:"07255769",81030:"d2d4df98",81169:"b6c5bb67",81214:"9995a73a",81587:"f20821a1",81947:"22fed2a0",82164:"b1733abd",82214:"fa1e775a",82358:"fc29dc61",82859:"31284dc4",82939:"47af50cd",82941:"b41ee22a",83036:"960a5ba4",83050:"e2f79174",83051:"2c8ca832",83129:"49e121a3",83160:"17d58a0f",83167:"7e5077df",83214:"841b73d3",83247:"031b2037",83377:"edc1c235",83584:"decb8bc1",83646:"15fed629",84069:"6cbf1fce",84340:"3cf94bee",84599:"64e66e32",84727:"89a759bd",84773:"4cd9437b",84877:"efff0598",85138:"3a371a78",85173:"9836dc83",85349:"51e517b1",85351:"a48dcb5c",85362:"708c231e",85369:"eaf9747b",85417:"db26831e",85442:"f165aa95",85845:"24640633",85943:"7327cf2d",86003:"3f3d2412",86074:"ee42f66f",86095:"724d58c0",86326:"ae5b22eb",86393:"2a0ee70d",86582:"c87b817b",86673:"631293b3",86809:"05c2493c",86830:"ec575d6b",86983:"e3668a02",87233:"e04c413b",87314:"aa05b5be",87326:"9bf1cea0",87389:"003220d2",87407:"cd202afc",87411:"b4e7853d",87414:"17ef41bf",87445:"1aa24d10",88101:"90043f12",88572:"cf9502af",88592:"f8e5de89",88697:"89bf5b70",88767:"35bdc0f3",88782:"ac20107e",88818:"8f20f4ae",88829:"041cd656",88845:"b4a88233",88862:"9fa7f5a1",88869:"a0904c0a",89008:"1ea8e0b2",89083:"e577fb53",89104:"f909dc33",89248:"dc652803",89325:"4d1fc2f5",89548:"33318e9f",89752:"13b59269",89756:"61d37a76",90045:"a070d45c",90047:"90416017",90056:"f62143b4",90083:"a7639fa4",90178:"ea8e50f7",90206:"a815c560",90288:"4ce4cb71",90748:"838f2c04",90934:"fc91c3ee",90999:"c76faf09",91151:"6cea3bb1",91192:"3a82d970",91282:"546a3e7f",91760:"1c695705",91879:"2394cdc6",91902:"6d76c4fb",91984:"447b9563",91990:"944aa387",92149:"f14710cf",92160:"9a5af48d",92214:"a2ed0b7c",92255:"3e187747",92308:"c49340db",92501:"36271ad3",92517:"b3e5d301",92522:"7e06c8d0",92846:"95dd1cb5",93089:"3167acc2",93108:"7da8dd3d",93203:"47f4f611",93524:"8934f415",93570:"790da899",93724:"ef34abf8",93784:"fe679aa9",93789:"7eb98ed2",94184:"3d490188",94379:"99afaa36",94560:"dc6fb4c7",94583:"a0a27f60",94590:"0dc8e201",94759:"5dbc8a59",94771:"5b494971",94900:"ede0fcad",94922:"0dd3f662",95018:"3aafc153",95199:"c70ee4f9",95208:"3deb7f04",95447:"d0786185",95516:"24242dbb",95558:"938b3c42",95569:"bba09171",95613:"0ffe20ee",95739:"c2555544",95816:"39187769",95845:"b97f3a8a",95850:"3ccfd671",95979:"030a1e3f",96121:"c4abecba",96140:"d750be9f",96162:"57f339f6",96394:"258f2772",96410:"8e82ecb7",96446:"911b77aa",96558:"f0a1384b",96755:"8da70635",96774:"1f1b2aaa",96799:"61ef66f9",96838:"762eeabd",96840:"7fbed957",96871:"4290e249",96944:"c42d19d7",97094:"f0c60a3a",97245:"9008202b",97317:"a7e87b7a",97363:"262520e6",97382:"8a85f02f",97421:"d2f211db",97517:"9d9d62e9",97535:"4801cea2",97730:"59984cd7",97801:"e1bd57de",97959:"f9c92b06",98254:"f4a7587d",98347:"940228f0",98370:"b7a55404",98450:"1c805219",98698:"56e383b8",98727:"475fec2b",98777:"801eedcd",98882:"2ad8effb",98918:"8db3819a",99610:"00951b81",99726:"c975997b",99750:"7598228c",99808:"fd705a3e",99847:"be23135f",99873:"554ee35f",99881:"f18e47da"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,c)=>Object.prototype.hasOwnProperty.call(e,c),d={},f="cardano-updates:",r.l=(e,c,a,b)=>{if(d[e])d[e].push(c);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==f+a){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",f+a),t.src=e),d[e]=[c];var l=(c,a)=>{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(a))),c)return c(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/cardano-updates/",r.gca=function(e){return e={10532414:"6890",11423591:"96410",17630979:"93724",17896441:"27918",28874657:"28592",34012593:"86809",35961293:"6115",40367786:"47406",41606842:"88101",54597942:"33596",57008883:"33399",57700755:"13276",70372002:"52703",79239208:"35748",79730245:"61596",80537537:"43140",80617771:"23427",82209890:"30141",84189288:"48863",84823557:"94771",87088759:"90047",89211367:"97421",89931013:"10173",91595845:"51268",91831590:"29121",93729337:"85845",94133299:"48275",98277053:"66602",99881079:"53004","08c82b6d":"81",e86dcd26:"162","9f761678":"278",b032e7ab:"292",f6aa5556:"376","09abc415":"416","43289e4d":"458","1752e4e5":"770","733f2214":"947",f5b1250e:"1129","28bc1d1b":"1285",f2423430:"1321",ef2b6a3f:"1338","98b2ca25":"1435",d3a595c1:"1537",d8668f0c:"1821",e25ae581:"1929","219856ee":"2109","871691d4":"2136","3ede3d79":"2221","06a283ef":"2307","1a932c01":"2348","7e87972d":"2432",c6259fbb:"2506",d92df848:"2578","62f46a38":"2681",a69f0deb:"2773","35c3586e":"2789",d9ccb35d:"3136",d5676bf9:"3270","7312b66d":"3403","565f686e":"3445","8c75942c":"3530","017cd6b7":"3649",dff1c289:"3792","5668eccd":"3918","20bc6fcd":"4093","16a93549":"4307","3ab5f4e0":"4376",a9019578:"4497",ac12bff3:"4608","12a1613f":"4615","53f26dca":"4775","0dea9a3b":"4910","691b1ed7":"4944","9136968b":"4986","43ab8474":"5106","28d85025":"5214",ccf451f9:"5237","4883d618":"5337","56f35d85":"5485","61d299e1":"5552","1d10bd9e":"5978",cfb82551:"6036",d10ad4a6:"6166","9f70a142":"6169","47da279e":"6236",bb465a37:"6246","55e35eab":"6249","5296f864":"6255","51cf8946":"6324","03d856aa":"6413","94dc91d7":"6683","986e43da":"6807","769eb34c":"6919","15dc596d":"6962","2dd2949a":"6996","3143eb67":"7204","35785fae":"7233","9b7a95a2":"7266","485c7377":"7322",b28a1077:"7413","4ab012ff":"7555","6d826f51":"7729",b8a3fbda:"7741",c10365f3:"7783",eab6de32:"7891","4b996e44":"7897","246d9f04":"7966","7de83161":"7968",d343e3e1:"8033",d83d9042:"8580","62ec9f43":"8694",a6e1d45a:"8737",a1b4c76a:"8765",e3c3ef1c:"9107","3be95f92":"9140",a040c838:"9499","14eb3368":"9817",d442e1d8:"9821","7de7ce98":"9828","8ed15298":"9928","0af81f82":"10114","4b62dc40":"10335",f6ec1152:"11254",b7dd63dc:"11400","1e24dd00":"11652",c63933b3:"11727","5e9a4be9":"11748","301cd1f4":"11952","3bc8fe23":"12029",f51bb76d:"12626",f6a3ab66:"12634",baed1590:"12812","1f391b9e":"13085",d2aca35e:"13412","77215fb3":"13680",d3f3f546:"13764","68585f67":"14274",db5663d1:"14348","5674f153":"14392","93b15a8c":"14582","3ac610ff":"15091",d124c703:"15152",be32a6ec:"15224","8914fa7e":"15347","4735cd81":"15529","5c868d36":"15589","8bfc66fb":"15623","2f97c20a":"15677",b65e5ec2:"15715",a2a63bac:"16002","7ff27d5d":"16091","5af0f4f9":"16165",d96cfa54:"16171","0ade4266":"16227","12d5d907":"16348","4febca42":"16349",d2ab2776:"16360","3dbbac8a":"16855","54a7c81e":"16878",a7418040:"16886","8395f67d":"16934","9a03c440":"16959","5226ad4f":"17214",d7899fea:"17285",f2180c0a:"17433","91b05c51":"17490",c6ae40c2:"17693","66326f4e":"17837",ae2d2424:"17873","4da01d42":"17903","622f92df":"17923","7d6aa09c":"18058","8d306cf9":"18144",dceb6e64:"18242","2d72833d":"18303","48292e37":"18367","05f2862f":"18479",db138d7c:"18634","3ce290cc":"18654","1a21d6a2":"18694","7ff38eb4":"19105","52b8fa8a":"19516","0801ba5a":"19644","925feafa":"19773","98e6984f":"19861",ff8cfcf7:"20203",d19a344f:"20387","7439ef37":"20433","2d52a685":"20553","1f965afe":"20635","5cf7c214":"20681",d200e7a4:"20738","57e0ab98":"20779",b073a55d:"20955",d967308c:"20957","3a3a2602":"20974","37b247a8":"21080",ec53298b:"21129","9a01d9b0":"21158","415f2cd9":"21198","0dfea636":"21200","1147f4da":"21463",c063df1b:"21562","8fe062a7":"21597","2455acc4":"21642","924be064":"21798","255b72b4":"22109","8a6fc2ec":"22154",b242687d:"22191","45a10ae8":"22206",a34b3179:"22254",d6c09ac2:"22393",ccb7a847:"22469","41244b80":"22496","31025fde":"22519","4ed83391":"22838","1da92289":"22954","40e498fa":"23092","1c192ca4":"23146","347c3e4d":"23271",ed930750:"23318",add555bf:"23360",e406e44d:"23531",d6f20405:"23599","0b5e25e7":"23621","94a907c9":"23941","8a766cbb":"24212","62a53033":"24215","372219b0":"24251",d7c69167:"24288","43bbbae7":"24310","27c463c7":"24327",bbe7c3bd:"24379","6b51f988":"24384",b57687d8:"24651",d8c4fe87:"24671",f210b4b5:"24745",e0a90ddc:"24891",b4645a09:"24910","960e3390":"24913","9e834cf3":"24941",f89a4337:"25189","8e410d22":"25272","611f3a9e":"25351",a1d4a798:"25353",f850a5f3:"25403",be1e6782:"25469","4be9a3a6":"25480",e8f5afda:"25540","548ef7ca":"25578","73bbd4d7":"25590","04326247":"25759","8fddd37c":"25778",ac8a5a87:"25853",e5a8e689:"25946",a687dd04:"26026","0b1b72af":"26276","2d0da244":"26299","0e717c32":"26397",e695f231:"26540",ee0b7a59:"26544","274d7200":"26565",c90fb258:"26584","578d3f15":"26614",fa00d705:"26710","0d889cfb":"27237",bda3e1c7:"27335","042169f6":"27449",b3043f02:"27478","82db709e":"27647",cd0ded60:"27668","9bcfaf7c":"27850","46c51ef6":"28298","1f9c0c9c":"28323","2154b8e4":"28480","6c8b7ad4":"28577",d5cc3122:"28669","2276e554":"28843","0d671897":"29059","76794a21":"29071",daa3e20a:"29177","77d69aed":"29399","1be78505":"29514","78df8d65":"29537","0dc0e43e":"29614","6d22e028":"29750","73f0dde0":"30101",ba0b6dbd:"30126","2d91c21f":"30335","5df8a536":"30374",d6a3b4a5:"30482","6b6054d2":"30584","50d0e663":"30670",ce7ed51f:"30830","3c2e75b4":"30843",e2011657:"30849",a5bf291f:"30907",ddce0bff:"31005",d6a93ba7:"31349",cc30e037:"31421",bcf46d9c:"31617","44e33f80":"31636","8084428b":"31724","9c7979b1":"31757","60e1630c":"31831",faece773:"32023","90bf9c2d":"32035","97daee08":"32070","370c5287":"32438",f8681695:"32464","9f7c2154":"32472",d0e182b9:"32627","12637b23":"32706","632979e8":"32831","12208c5e":"32852","684a796f":"32871","9e570fef":"32925","8d209506":"32936","113fed8c":"33215",b78698d9:"33288",b020ac17:"33538","5d0266be":"33671","82f24945":"33724","444dad87":"33815","4906b8e6":"34070","4bed0e48":"34631","387f3426":"34719","5c5c653f":"34828","7574ff34":"34891",f3c06362:"34985","9dce568f":"35029",c2eec07f:"35388","35f1ce0d":"35400","6bae8700":"35703",ea5726b6:"35846",f1bfc30d:"35877",b3041b60:"35889","2fd426fa":"36016",bd65afd9:"36160",fba052bd:"36171","66be9998":"36186","82c38436":"36229","1b2c8e6e":"36303","3a40f46b":"36337","934a8f8d":"36370","3f9060c3":"36398","56b3fab8":"36434",a1ac97eb:"36463","822bd8ab":"36504",e2c8baed:"36721",c0354ce6:"36881","5a843cd2":"37221",e5dd9161:"37329","17f4ca64":"37426",fd6fd4a3:"37495","965e9e9a":"37595","9d7869bb":"37734","8470e3c7":"38141","20ca2c37":"38516","0048047b":"38518",ae455379:"38672","7fa9de70":"38938",edca0251:"39066","3a493dd8":"39071",c6f90b29:"39080",acd2edbe:"39113",ac56cb0b:"39329","07541956":"39419","07fdf123":"39439",c091c5d8:"39596","7030fa2f":"39640","0c11045c":"39745","63fae4f0":"39898",ff276f6a:"39969","8534c2dd":"39987",bc6b65d9:"40160",b5164349:"40176",c036f08e:"40309","46d9aab0":"40373","10659ce5":"40400","187056c8":"40430","4c7d0c08":"40682","60fae5f4":"40705","74d66224":"40767",ca6829cb:"41153","0c48efb1":"41794",d7836792:"42126",de790939:"42185",b88c8fa9:"42190","59a262d5":"42198","4fb1471a":"42347","32d4ad41":"42575",c831575d:"42677","6e743f1b":"42686",c2b4dd94:"43020","44642b2f":"43108",c315164d:"43194","789f2cca":"43261",e9310706:"43363",e56a9a29:"43412","14fc0a72":"43686","15691c1d":"43729","2eba0b82":"43898","40718b14":"43980","5c8fca76":"44003",f452efc5:"44281","7a6174e7":"44377","73a1bc7a":"44379","94c6d911":"44501","35ef34ae":"44966",e7486169:"45237","4d7c8e78":"45389","9450fd8f":"45410","335868d9":"45480","154dea53":"45542","2e69cd33":"45662",d863ede2:"45766",f48535bf:"45821","878c8163":"45932",bb44f9e3:"45943","81bb24c9":"46003",e84709f6:"46033",ccc49370:"46103","12525f14":"46207",ec06fa8a:"46271","4ce06e64":"46318",d99d594e:"46521",f59c978c:"46545","2e28eb6b":"46576","86c4d158":"46831",e7a72da0:"46846",f872275a:"46922","0645cd02":"46982",b512dd46:"47093","2fa57f55":"47176","97407dee":"47263","469935bd":"47605","1be923a7":"47658","26a4b8b3":"47669","2073b851":"47704","26678b7e":"47724","97cbe67b":"48221",eda7cf83:"48423","6190b2fb":"48600","6875c492":"48610",e2a7c340:"48622","9e9bda24":"48679",cced6026:"48818","4fe12b4b":"48837",f7e5e70a:"48909","66345e96":"48983","9b6092d7":"48990","38284ae5":"49105","046dd16d":"49237","7e8e081f":"49238",f530b85c:"49605","3c3d2bff":"49706",a3889346:"49769","1afca88e":"49835",a6238997:"49904","588e4efd":"50097","752b6ead":"50165","29801efc":"50307","81528b00":"50471","3ee2c73a":"50506","144cea98":"50881",aa4c9cc8:"50919",e38c8545:"51092","3e93a65d":"51164","00bb8269":"51257",f5e5d1cf:"51410",f117ec90:"51522","5778ca6b":"51727",d0a351c0:"51934","4df30499":"51951",b92c36fd:"52322",d0639dee:"52506",dee5d2d9:"52560","6b16e156":"52650",e8d4d6c0:"52818",b03d4a4e:"52834",e4a61baa:"53121","805fc822":"53165","1b2c892c":"53210",f1df5007:"53288",efad53df:"53426",c0cf6239:"53482",b6ef4fcb:"53516","9e4087bc":"53608","4de4e659":"53662","5d5964ec":"53931","71e4641a":"53940","7d4ab4f9":"54007","50135b75":"54176",f55d3e7a:"54193","84677cf0":"54415","533a09ca":"54607",ddcb8bff:"54642",ebf8adea:"54669",e5b737ed:"54750","77e9cceb":"54868","884eee03":"54975",e0b45b46:"55135","8b4d9039":"55202","376dd8e8":"55413",ef4f60e7:"55531","144cf255":"55553","3cb9fdac":"55638",f47d214c:"55791","62422ab6":"55855","2bc04bf6":"56010",e4619b9c:"56482",a572b6ff:"56618","771f29e6":"56674","704e5bb8":"56733",ae7f7c70:"56789",ee94a44f:"56815","69c7a5a7":"56950",fb8d4667:"57161","6004d2a4":"57193","2a8f0182":"57227","417fc4b4":"57271","2494f6fc":"57583",d957ac34:"57772",decc8fa8:"57918","82ed4471":"58312",fb63aa20:"58470",f2b32cff:"58566","8cd47ea9":"58628",e1f21c3f:"58680","9dee36e7":"58744","12c83d8a":"58774","94780c38":"58925",eac9cf07:"59037",a0fc6770:"59158","7c815b5e":"59318","14ffac04":"59494","51457b0b":"59576","0e384e19":"59671",cfdb38ee:"59736","6e43d302":"59747","4ef71b5f":"59749","99b0bd12":"59798","120c0b00":"59955","6927f7c4":"60019","49db7061":"60183",dfd49ee8:"60247","47658b82":"60263","0e0c98f4":"60280","7e644b1f":"60375","6f700e99":"60459",a1597564:"60715","496cb9ef":"60852","7b73b4cd":"60881","0b0bfceb":"60903","12ef8706":"61039",ed730a1d:"61137",ace79a55:"61185","7a7e39bb":"61660","8864b77b":"61908","78d554ba":"61980","86cc1b5f":"62034",da7937f0:"62083",fce7e268:"62140","77550e96":"62227","9ba26136":"62231","9291df2e":"62302",ac87db6a:"62703",a0d18a99:"62767","51bf60d9":"62901","4e45b006":"63089","0a44a251":"63565",db50202c:"63566",fbdc54bf:"63824","01a85c17":"64013","65ecf6d5":"64112","21735eff":"64156","1e57c0e2":"64313",e06746c7:"64410",c08c0f47:"64562",c061e3b1:"64614","4d3eb7e7":"64827",ffbc2281:"64906","17e76f05":"64966","3bb06773":"65029","1e0f95a7":"65123",ed99d55f:"65318",d1d47ba3:"65319","245ecae9":"65356",dff84d74:"65421","5cc32405":"65562","393cd824":"65773",c7e43a05:"65956","40a4cbba":"66458","8ccf5d9f":"66649","0de82e28":"66743","9ce37f6e":"66764","2e52ad4e":"66840","90f359c5":"66891",f5f103cc:"67170",cd612773:"67205","5e3dc99b":"67272",bbc31819:"67330","7a4b421f":"67452",d9b708eb:"67463",bf071e0b:"67787",ea7f8016:"67820","459dd1ef":"67825",fc0eac3b:"67927","9668e24b":"68044","9a4c05df":"68077","83e7e4db":"68102",afa83c07:"68115","0431617f":"68153","5889a844":"68184","47cae651":"68352",ec344652:"68580","2b637fd9":"69376","3eae7101":"69399","2e2abe90":"69467",a6afc437:"69565","86e0423a":"69778",e135bd86:"69791","533bb9dc":"70022",f4cb7e87:"70085",d9e42018:"70170","996aa714":"70594",b073edd1:"70613",b4cc2dd2:"70635",f96c80dc:"70641","6226ba71":"70644",ef2b1d07:"70729","61f1e7c8":"70883","3399a664":"70950",b6145ff0:"71843",f5a24224:"71844",d70b4c5f:"71870","41d087d7":"71972","8f7e10a3":"72033","4cecd320":"72311",de5b481b:"72317","089154c4":"72344",ab4c3279:"72690","60c9cc01":"72744",e70f68c6:"72815","0c10bcf4":"72872",fa5dce7e:"73001",b8bcf1d1:"73277","78d8ce1d":"73320",c4479859:"73321",e80f56fd:"73336","49d88be4":"73343","27c15961":"73798",f0418a99:"73799","007e4c05":"73800","6c658908":"73875","71d215be":"74390","35369e36":"74433","0db650db":"74607",b8465b4d:"74933","7faccef9":"75064","831d95cb":"75319","79d76848":"75379",ef4801f7:"75394","9b5ce5fa":"75501","55b9667a":"75506",f522921c:"75556","90cc522f":"75696",d857251e:"75698","550cdc1d":"75730","492dc159":"75748","9c662d1f":"75773","4dc3be72":"76074","4fd8c72a":"76294",a9347c1b:"76323","77d820b6":"76413","999e2b46":"76433",bdc4c1ed:"76581","4c91b9ee":"76705","5e730d4f":"76762","0e828f3a":"77338",b96b3223:"77411",ce17d78b:"77533",fc8c3309:"77642",ce6dcc9e:"77644","7c359f4d":"77696",a48d66c0:"77965",da04b7b0:"78101","9d43e047":"78148",a6e5ff3c:"78153","8c574ba2":"78183","3f64a4c5":"78397","795480a5":"78446",b4f5b98b:"78461","354f96c6":"78580",cc5c2602:"78761",df778edc:"79036",fdba8f98:"79224","6fb45133":"79260",e57d1f62:"79362","0281a492":"79503","3ac14561":"79765","1377d1fa":"79841",fe184e91:"79967","68fb9d2f":"80048","935f2afb":"80053","4c4f8ee1":"80113","42ad0ca4":"80309","209bf559":"80367","391126a1":"80542","6da0a796":"80567","49d642c9":"80575","600e4190":"80599","015be621":"80613",eb0e2fb1:"80622",fdfeff52:"81030","61e62d68":"81169",cc267639:"81214","437db4bf":"81587",ae521593:"81947",f2deb2f1:"82164","4fe88e48":"82214","798d160f":"82358","18c41134":"82859","89a43a90":"82939","9fba849d":"82941","7c895c96":"83036","04c3317f":"83050","37b2e4a4":"83051","15072f11":"83129","60a77258":"83160","019bb279":"83167",f302e248:"83214",be16a434:"83247","80057f85":"83377",f6b8faad:"83584","0fa2fd29":"83646","6eecfaae":"84069","6610396c":"84340",e3067ecd:"84599","95f12e12":"84727",cf1bc381:"84773","8d3da32e":"84877",d988d084:"85138","859b6012":"85173","425dfc0f":"85349",f5d27437:"85351","709abed9":"85362","876c34e9":"85369","21857c8f":"85417","1caacab6":"85442",a7a31948:"85943","62dc90a1":"86003","551db1ac":"86074",be26e761:"86095",ea2603ff:"86326","3328a3bf":"86393",f13a89c7:"86582",a8723288:"86673","67ce4884":"86830","3c8518bb":"86983",ccfc9222:"87233","0ee9866d":"87314",a14fd889:"87326",f63b6b72:"87389",a1f2945e:"87407",fb793160:"87411","393be207":"87414",eac6bb0a:"87445","65d0391b":"88572","6a75c57a":"88592","435d8b4c":"88697","948ff80d":"88767","1b2a226f":"88782","1e4232ab":"88818",e158fd47:"88829","6a2140b3":"88845",d077dadd:"88862",e6ea9b03:"88869",daace409:"89008",aafd9eaa:"89083",b41783a8:"89104",e54fb861:"89248","9945c128":"89325",d15a0787:"89548",c0ac1524:"89752","397686d4":"89756","7221b837":"90045",fa0b1b5d:"90056",e356bfd0:"90083","9c96fa11":"90178",d79a4bb7:"90206",f96c80d6:"90288",a1cde312:"90748",cb7a1a0b:"90934","35e2a0c5":"90999",c7337d4e:"91151","76c61a3b":"91192",a1d1f035:"91282",fee99998:"91760","6d25229c":"91879","34c17ec8":"91902",d2ea5af2:"91984","1b34f23d":"91990",fa57bfdd:"92149","36a96f5a":"92160","692497e1":"92214",c178b56c:"92255","4b90674f":"92308",ea84a009:"92501","70396aa3":"92517",fb0b9e22:"92522","913aac40":"92846",a6aa9e1f:"93089",d65b9dd2:"93108","9cab6d73":"93203",e6402687:"93524",caab1e2e:"93570","6b553c5c":"93784",f4548430:"93789","5733c82d":"94184",e716e5b6:"94379","563fcf2e":"94560","23a95b4f":"94583","72c81964":"94590",bccb35b7:"94759","3bb415e3":"94900",c511c40f:"94922","034a14a6":"95018",c5858ebd:"95199",a2ee852b:"95208","177280a4":"95447",d6b66cf4:"95516",d5f27176:"95558",c1c5c6f5:"95569","324138c8":"95613","0d7612e9":"95739",eff08811:"95816","73a96f39":"95845",b9d87023:"95850","637356df":"95979","439b9a57":"96121",ca3b5bc8:"96140","8c6dbeca":"96162","388f6888":"96394","31889a8f":"96446",b13803f3:"96558",e44a2883:"96755","3cb4be67":"96774","6e7b669d":"96799","778ef860":"96838",e90b2ff0:"96840","126e82e6":"96871","78c763b8":"96944",c60581f2:"97094","04cbd10c":"97245","359aa856":"97317",d7d2f3e9:"97363","1a657a20":"97382","8fea44ca":"97517","4aaac366":"97535","6d371395":"97730","1b0bebd5":"97801",c9210b26:"97959","9440f007":"98254","43aa4824":"98347","2ebccc4d":"98370","7a263bfa":"98450","24d5a6d9":"98698",c94f306d:"98727","2c045882":"98777","7aaa65e3":"98882","237aa4d6":"98918","3f2108ba":"99610","830ba2c4":"99726","8d0075ff":"99750","80c54634":"99808","166775fd":"99847","7325235b":"99873",a8738e5f:"99881"}[e]||e,r.p+r.u(e)},(()=>{var e={51303:0,40532:0};r.f.j=(c,a)=>{var d=r.o(e,c)?e[c]:void 0;if(0!==d)if(d)a.push(d[2]);else if(/^(40532|51303)$/.test(c))e[c]=0;else{var f=new Promise(((a,f)=>d=e[c]=[a,f]));a.push(d[2]=f);var b=r.p+r.u(c),t=new Error;r.l(b,(a=>{if(r.o(e,c)&&(0!==(d=e[c])&&(e[c]=void 0),d)){var f=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+c+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+c,c)}},r.O.j=c=>0===e[c];var c=(c,a)=>{var d,f,b=a[0],t=a[1],o=a[2],n=0;if(b.some((c=>0!==e[c]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(c&&c(a);n<b.length;n++)f=b[n],r.o(e,f)&&e[f]&&e[f][0](),e[f]=0;return r.O(i)},a=self.webpackChunkcardano_updates=self.webpackChunkcardano_updates||[];a.forEach(c.bind(null,0)),a.push=c.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000000..55ab670a7ec --- /dev/null +++ b/atom.xml @@ -0,0 +1,6233 @@ +<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + <id>https://input-output-hk.github.io/cardano-updates/</id> + <title>Cardano Updates Feed + 2023-12-06T00:00:00.000Z + https://github.com/jpmonette/feed + + Regular updates from Cardano Development Teams + https://input-output-hk.github.io/cardano-updates/img/favicon.ico + + <![CDATA[Ledger Team Update]]> + 2023-12-06-ledger + + 2023-12-06T00:00:00.000Z + + High level summary

This period we reached a major milestone, namely we now have an initial version of Conway +conformance testing working. We are now able to generate random valid data with the help +of constraint based testing framework, apply that data to Conway Ledger rules and verify +that the output matches to the one produced by the executable version of the Formal Ledger +Specification, when it is applied to the same random data.

We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get +Constitutional Committee query is complete and tested. Various improvements to the +testing tools. Addition of more test cases.

Low level summary

Conway

  • pull-3888 - Add checks for valid ProtVer when a proposal is a HardFork
  • pull-3902 - Fix pvCanFollow usage in Conway and improve clarity in Shelley
  • pull-3855 - Remove unreachable proposals
  • pull-3903 - Add lenient decoder for Addr
  • pull-3878 - Committee query - implement next epoch change

Testing

  • pull-3893 - Move tree-diff dependency to tests together with all instances
  • pull-3896 - Fix Brute force failure
  • pull-3904 - New ListWhere Pred added to the Constrained Solver.
  • pull-3907 - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file
  • pull-3883 - Committee QuerySpec Imp Test
  • pull-3909 - Make impAnn a bit more useful, by making the logs scoped by impAnn
  • pull-3908 - Use upstream testing instances for very basic types
  • pull-3912 - Removed call to tail, and the 'watchPulser' test
  • pull-3852 - Added constrained generators to conformance tests - Part 1

Improvements and releasing

]]> + + Alexey Kuleshevich + https://github.com/lehins + + + + + <![CDATA[Mithril Team Update]]> + 2023-12-06-mithril + + 2023-12-06T00:00:00.000Z + + High level overview

This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking.

Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io.

Low level overview

  • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
  • Worked on the issue P2P threat modeling and risk analysis #1350
  • Worked on the issue Create a test network on Sanchonet #1173
  • Worked on the issue Upgrade breaking changes crates #1357
  • Worked on the issue Enhance Mithril/Cardano node communication #1315
  • Completed the issue Enhance aggregator REST API performances #1327
  • Completed the issue Signer runtime is stuck for some SPO #1312
  • Completed the issue Make mithril-client examples full crates #1385
  • Completed the issue Manual publication to crates.io with GitHub action #1380
  • Completed the issue Remove sqlite dependency from mithril-client crate #1390
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Performance & Tracing Update]]> + 2023-12-04-performance-and-tracing + + 2023-12-04T00:00:00.000Z + + High level summary
  • Benchmarking: Release benchmarking for node 8.7.0. Also, we performed the first-ever Conway benchmarks.
  • Development: Conway capability of our workload generator has been implemented and merged to master.
  • Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data.
  • Tracing: Quality-of-life improvements to tracing output and addition of a test suite.
  • Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.

Low level overview

Benchmarking

A full set of benchmarks for node 8.7.0 has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of 8.7.0 over 8.6.0, and can confirm no regressions have been introduced.

Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version. +Only Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty.

Development

Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era. +Currently, we're looking into adding Conway-exclusive features, such as DRep registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining DRep sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying.

Infrastructure

As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've +improved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data.

Tracing

The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages. +Additionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system.

Nomad backend

We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-12-01-hydra + + 2023-12-01T00:00:00.000Z + + High-level summary

This week, the Hydra team conducted a packed Monthly Review meeting, +featuring demonstrations and the preparation of the monthly report. They +addressed flakiness in tests and enhanced the logs json schema, +improving overall test reliability. Additionally, the team successfully +built MacOS ARM64 (aarch64-darwin) binaries in CI, expanding platform +support. They further improved the network configuration by detecting +incompatible persisted states, contributing to overall system +robustness. Finally, the team released version 0.14.0, highlighting +their commitment to delivering regular updates and improvements.

What did the team achieve this week

  • Monthly Review +meeting +packed with demonstrations and prepared monthly report +#1189
  • Fixed several flaky tests and improved the logs json schema +#1188#1190#1192
  • Built MacOS ARM64 (aarch64-darwin) binaries in CI +#1182
  • Improved network configuration by detecting incompatible persisted +states #1174
  • Released version 0.14.0

What are the goals of next week

  • Start work on incremental decommit
  • Continue shepherding contributed PRs to completion
  • Finish stateless-observation work
  • Open a head on a Conway network
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-11-29-consensus + + 2023-11-29T00:00:00.000Z + + High level summary

The Consensus team implemented and tested a patch that does not propagate future headers. +It is under review, and we expect it can be released in the next Cardano node version. +On the UTxO-HD front, we finished prototyping the LedgerDB and BackingStore redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend. +With this prototype finished we can start integrating the rest of the code. +We investigated the unexpected performance degradation observed when acquiring the block context. +We also released Cardano node 8.7.0 and moved tree-diff outside cardano-ledger libraries.

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-11-29-mithril + + 2023-11-29T00:00:00.000Z + + High level overview

This week, the Mithril team released the initial version of the Mithril client library, enabling developers to integrate core Mithril features into their applications. They also released a new distribution, 2347.0, which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements.

The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance.

Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users.

Low level overview

  • Release of the mithril-client library crate
  • Publication of a dev blog post about the released Mithril library
  • Released the new distribution 2347.0
  • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
  • Worked on the issue Enhance Mithril/Cardano node communication #1315
  • Worked on the issue P2P threat modeling and risk analysis #1350
  • Worked on the issue Enhance aggregator REST API performances #1327
  • Worked on the issue Signer runtime is stuck for some SPO #1312
  • Completed the issue Support P2P relay in infrastructure #1361
  • Completed the issue Make Cardano node version custom in CI/CD #1355
  • Completed the issue Manually deploy a test Mithril network #1356
  • Completed the issue mithril-client verbosity not following usage menu #1325
  • Completed the issue Error message for mithril-client snapshot download #1375
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-11-24-hydra + + 2023-11-24T00:00:00.000Z + + High-level summary

This week, the Hydra team spent significant time opening a head among +themselves on mainnet using the release candidate, revealing and +addressing lurking bugs such as +#1174. Also +required was this change to dynamically calculate the min utxo value +#1176, a +necessary adjustment following the switch to inline datums. The team +engaged with cardano-cli / cardano-api maintainers to discuss recent +changes and collaborated on drafting feature ideas, including providing +Conway support +for the Hydra roadmap. As part of ongoing improvements, they +experimented with writing the specification in markdown instead of +LaTex.

What did the team achieve this week

  • Opened head among us on mainnet and uncovered a few lurking bugs like +#1174 in the +release candidate
  • Calculate the min utxo value instead of hard-coding it +#1176, which is +needed since we switched to inline datums.
  • Met with the cardano-cli / cardano-api maintainers to discuss +recent changes and way forward
  • Drafted features ideas to provide Conway +support on the +Hydra roadmap
  • Experimented in writing the specification in markdown instead of LaTex

What are the goals of next week

  • Have the Monthly review meeting with several demos
  • Release version 0.14.0 with this +scope
  • Complete tidying up chain layer via stateless observation changes in +hydra-node +#1096
  • Update dependencies to prepare for Conway +#1114
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[SRE Team Update]]> + 2023-11-24-sre + + 2023-11-24T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • The cardano-node nixos service now supports SIGHUP p2p topology reloading when the useSystemdReload option is enabled

Lower level summary

Capkgs

  • Update cardano-db-sync and offchain-metadata-tools package paths and/or references: capkgs-compare

Cardano-node

  • Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: cardano-node-pull-5537
    • Creates a useSystemdReload bool option for the cardano-node nixos service
    • This will move the topology file(s) to /etc/cardano-node/topology-$i.yaml and inject systemd reload hooks for p2p configured cardano-node instances
    • Moving topology files to /etc also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired

Cardano-parts

  • Adds a metadata server profile and a number of other features and improvements: cardano-parts-pull-20
    • Adds a new metadata-service profile
    • Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile
    • Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish
    • Adds extra node list producers and public producers for cardano-node-topology profile
    • Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch
    • Adds select systemd metrics reporting to grafana-agent profile
    • Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS
    • Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it
    • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
    • Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation
    • Adds support for grafana recording rules in the template files
    • Improves cardano-group profile handling of producers with respect to multiple instance nodes
    • Improves grafana-agent profile metrics handling for multi-instance cardano-node servers
    • Improves smash service preStart handling while waiting for a node socket
    • Updates Justfile for ERA_CMD demo support
    • Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates
    • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
    • Defaults cardano-postgres profile psqlrc use to false

Cardano-playground

  • Adds a new testnet metadata server, cluster webserver, and other improvements: cardano-playground-pull-6
    • Adds a new metadata server
    • Adds a new webserver for the cluster's static virtualhost needs
    • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
    • Adds systemd metrics monitoring to the cluster
    • Resizes sanchonet machines to support the growing chain
    • Completes migration of preprod from world
    • Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes
    • Updates Justfile for ERA_CMD demo support
    • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
    • Migrates book static code to playground from world, with refactor, cleanup and updates
    • Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules

Offchain-metadata-tools

  • Adds db password option with obfuscation plus misc improvements: offchain-metadata-tools-pull-61
    • Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services
    • Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile
    • Moves from std use in the nix flake to standard flake schema
    • Fixes hydra CI failures
    • Builds update-docs in hydra to avoid long local build times
    • Removes deprecated tullia
    • Removes deprecated check-hydra from pkgs
    • Removes deprecated bors files and references
]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-11-22-ledger + + 2023-11-22T00:00:00.000Z + + High level summary

Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of +CDDL specification. Important bugfixes include:

  • Fix deserialization of ValueNotConservedUTxO predicate failure that could not +previously report zero ADA.
  • Fix deserialization of CostModels in the PParamsUpdate. Invalid CostModels are no +longer allowed, only CostModels for unrecognized Plutus versions are allowed starting +with Conway
  • Fix returning of Deposits for ProposalProcedures

Testing tooling has been improved and new tests have been implemented for Conway era.

Low level summary

Conway

  • pull-3858 - Restructure computing Refunds and Deposits in a TxBody across all eras
  • pull-3860 - Removed mock/crypto.cddl, added optional tag to sets
  • pull-3864 - Fix Proposal deposits and add deposit tests to imp tests
  • pull-3859 - Rename ProposalsSnapshot to Proposals
  • pull-3867 - MaryValue fixes
  • pull-3869 - Indicate that tag 258 is optional for OSet. Fix rational CDDL
  • pull-3863 - Improve deposits refunds re-usability
  • pull-3861 - Fail PParamsUpdate deserialization for invalid costmodels in Conway
  • pull-3875 - Fix cddl spec for CostModels in Conway
  • pull-3876 - Change 4 PParam fields from EpochNo to EpochInterval
  • pull-3884 - Relax requirement on the Set tag 258 to be enforced in the next era

Testing

  • pull-3868 - Improvements to support property tests on Traces with simple Tx with DRep related Certs
  • pull-3792 - RATIFY and GOV constraint tests
  • pull-3885 - Added a test for genTxAndNewEpoch
  • pull-3886 - QuickCheck Imp integration

Improvements and releasing

]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-11-22-mithril + + 2023-11-22T00:00:00.000Z + + High level overview

This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer.

Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release.

Low level overview

  • Completed the issue Prototype a P2P relay with libp2p #1326
  • Worked on the issue Enhance aggregator REST API performances #1327
  • Worked on the issue Signer runtime is stuck for some SPO #1312
  • Completed the issue Manually deploy a test Mithril network #1356
  • Completed the issue Make Cardano node version custom in CI/CD #1355
  • Worked on the issue Support P2P relay in infrastructure #1361
  • Completed the issue mithril-client fails to extract archive #1352
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Initial CIP 1694 Security Analysis and Responses]]> + 2023-11-20-cip1694 + + 2023-11-20T00:00:00.000Z + + High level summary

We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

Initial CIP-1694 Security Analysis and Responses

Section: The constitutional committee


  • “For example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


Section: Size of the constitutional committee


  • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


Section: Terms


  • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

Thanks. Yes, that suggestion is a bit easier to read.


Section: Registered DReps


  • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


Section: Ratification


  • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

These correspond exactly to the groups that are administered by the Parameter Committee.


  • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

Yes, it’s not about harming the system, since Info +actions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


Section: Content


  • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


Section: Protocol Parameter groups


  • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


  • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


Section: Votes


  • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


  • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


Section: Changes post Edinburgh workshop (July 2023)


  • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


Section: Reduced deposits for some government actions


  • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

Indeed. We have no plans for this at the moment.

]]>
+ + Kevin Hammond + https://github.com/kevinhammond + + + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-11-17-hydra + + 2023-11-17T00:00:00.000Z + + High-level summary

This week, the Hydra team made several impactful updates. They addressed +misleading errors regarding collect com transactions, resolved a security +advisory (CVE-2023-42806), and simplified the Hydra Head protocol by using +inline datums. The team also tackled minor inconsistencies in specifications and +implementation, documented reasons for potentially dropped close transactions by +the cardano-node, and collaborated with SundaeLabs on an offline mode for +hydra-node. Additionally, they engaged in discussions with researchers about +incremental de-/commits.

What did the team achieve this week

  • Removed misleading errors about collect com transactions #839
  • Addressed security advisory CVE-2023-42806 in PR #1161
  • Changed the head protocol to use inline datums, simplifying things in the hydra-node #1162
  • Addressed minor inconsistencies in spec and implementation #1104
  • Documented why close transacations might be dropped by the cardano-node (cant fix) #1039
  • Tidy up a few things here and there
  • Worked with SundaeLabs on the offline mode for hydra-node
  • Discussed incremental de-/commits with researchers

What are the goals of next week

  • Start work on incremental decommits protocol specification #1057
  • Provide support to Hypix
  • Address all open bugs
  • Release version 0.14.0 with this scope
  • Update dependencies to prepare for Conway #1114
  • Shepherd off-line mode PR over the finish line
  • Complete tidying up chain layer via stateless observation changes in hydra-node #1096
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Performance & Tracing Update]]> + 2023-11-17-performance-and-tracing + + 2023-11-17T00:00:00.000Z + + High level summary
  • Benchmarking: Release benchmarking for node 8.6.0 as well as benchmarks scrutinizing GHC versions and the new tracing system.
  • Development: PlutusV3 capability of our workload generator has been implemented.
  • Tracing: First round of optimization of the cardano-tracer service has completed, awaiting validation.
  • Nomad backend: A significant PR has landed addressing automation features and debugging capabilites.
  • Workbench: Configurable remote environments and improvements to run documentation have been merged to master.

Low level overview

Benchmarking

We've performed and analyzed a full set of benchmarks for node 8.6.0, both in comparison to recent release tags +and mainnet version 8.1.2. A lot of development work has entered the system since then, so it is crucial +we can rule out any potential performance risks for the next mainnet release.

Additionally, we've been benchmarking GHC9.6.3 builds of cardano-node. Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform.

A last set of benchmarks was dedicated to the new tracing system with node 8.6.0. We were able to show that +there is no performance risk to enabling the new system, even when forwarding all trace messages to a cardano-tracer +service on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression.

Development

For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes +to the execution budgets by developing specialized workloads.

Tracing

The cardano-tracer service has received its first batch of optimizations. Profiling output is promising; to measure +performance for a long service run time, we're currently equipping the service binary with the same capability to +emit regular resource traces as cardano-node. Analysis of those will be the basis for validating this and possible future optimization efforts.

Nomad backend

Many improvements for the nomad backend have been implemented and merged to master. This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service, +more detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables +our team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred.

Workbench

Our performance workbench has seen upgrades in documenting and reporting cardano-node builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler. +When alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential.

Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Network Team Update]]> + 2023-11-16-network + + 2023-11-16T00:00:00.000Z + + High-level overview of sprint 48

Bootstrap Peers

We continued reviewing bootstrap peers, ouroboros-network#4555.

IOClasses / IOSim

We prepared slides for a Haskell meetup were we presented a talk on IOSimPOR. +The recording will be availble on YouTube.

We also used the opportunity to do some refactoring of the IOSim code base: io-sim#117. +We released io-sim-1.3.0.0 on Hackage: io-sim#119.

We also added forkFinally to MonadFork (not included in 1.3.0.0 release): io-sim#123.

Tech debt

We refactored Resource used by the DNS subsystem: ouroboros-network#4707. +We continued reviewing the ouroboros-network#4625 PR, which refactors +RootPeersDNS module.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-11-15-consensus + + 2023-11-15T00:00:00.000Z + + High level summary

Over the last two weeks, we managed to run a UTxO-HD capable node in legacy mode, which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does). +This legacy mode could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not. +However, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter. +On the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node. +Therefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend.

On the Genesis front, we reviewed the peer simulator for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team.

We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos.

Javier Sagredo continues his cycle as release engineer, and he is working on version 8.7 of Cardano node.

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-11-15-mithril + + 2023-11-15T00:00:00.000Z + + High level overview

This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files.

Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation.

Low level overview

  • Worked on the issue Prototype a P2P relay with libp2p #1300
  • Completed the issue Light Wallet: Release mithril-client library #1311
  • Completed the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
  • Completed the issue release-mainnet aggregator is unreachable #1310
  • Completed the issue Fix certificate hashes re-computation in aggregator #1343
  • Completed the issue Remove unstable tag in unstable release #1235
  • Worked on the issue Enhance aggregator REST API performances #1327
  • Worked on the issue Signer runtime is stuck for some SPO #1312
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-11-14-node-cli-api + + 2023-11-14T00:00:00.000Z + + 2023-11-01 - 2023-11-14

High level summary

CARDANO-NODE

CARDANO-CLI

  • Improve golden tests
  • Clean-up of conway era commands

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-11-10-hydra + + 2023-11-10T00:00:00.000Z + + High-level summary

The last two weeks, the Hydra team achieved several milestones. They published +the monthly report for October, providing updates on project developments. The +team delivered a presentation and workshop at the Cardano Summit, contributing +to community engagement. They implemented a \"dirt road\" solution for the +\"Ignored init tx\" notification and moved the hydra-poll example project to a +dedicated repository. Additionally, the team built a hydra-chain-observer tool +for Hydra Heads, updated the toolchain to GHC 9.6.3, and made various +improvements to tooling and code formatting. They addressed specific issues, +such as fixing the gen-hydra-keys command and resolving concerns with the +rewritten hydra-tui. The team also enhanced the hydra-cluster smoke test +suite by fetching network configurations dynamically. Lastly, they actively +reviewed pull requests and architectural decision records from the community, +including contributions from SundaeSwap. An experiment, the Hydra tally, was +completed and successfully deployed to the mainnet by the Cardano Foundation.

What did the team achieve this week

  • Published the monthly report for +october
  • Given a presentation / workshop at the Cardano summit +#1109
  • Dirt road implementation for \"Ignored init tx\" notification +#529 (without +stateless observation)
  • Completed and moved hydra-poll example project into a +dedicated +repository
  • Built a first version of a chain observation tool for Hydra Heads +#1096
  • Switched toolchain to GHC 9.6.3 and various improvements on tooling +and code formatting +#1135#1152#1151#1154
  • Fix gen-hydra-keys command to not overwrite existing +keys #1136
  • Fixed the rewritten hydra-tui#1113#1137
  • Fetch network configurations instead of packaging them into +hydra-cluster (smoke) test suite +#1156
  • Reviewing PRs and ADRs from the community (SundaeSwap) +#1118#1157
  • Hydra tally experiment (Cardano Foundation) deployed to mainnet

What are the goals of next week

  • Tackle reported bugs
  • Shepherd contributed off-line mode PR to the main codeline
  • Improve chain observation tool to include more data and refactor +existing code towards more stateless observation
  • Start work on incremental decommits
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[SRE Team Update]]> + 2023-11-10-sre + + 2023-11-10T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the cardano-playground stack

Lower level summary

Capkgs

Cardano-parts

  • General migration support PR for cardano-world to cardano-playground cardano-parts-pull-18
    • Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground
    • Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes
    • Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains
    • The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state
    • The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable
    • Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0
    • For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true
    • Template updates include:
      • Adds optional TF AZ declaration on ec2 resources
      • Adds a cardano node p2p dashboard to the grafana cloud stack
      • Adds a dbsync pool performance analysis query
      • Updates python distribute and delegation scripts from world for playground compatibility
      • Starts a python script lib to reduce shared code among the python scripts
      • Several justfile improvements and new recipes
    • More detail is available in the PR description
  • Update submit action script for 8.6 cardano-parts-pull-19
  • Update scripts for 8.6.0-pre cardano-parts-pull-21
    • Fixes subcommand names based on ERA_CMD
    • Adds deposits to some commands
    • Separates CC cold/hot key generation as host authorization has to occur after action is approved
    • CC voting enabled in vote job

Cardano-playground

  • Migration PR to largely complete the network migration from cardano-world to cardano-playground: cardano-playground-pull-5
    • Adds re-spun private chain network
    • Migrates shelley-qa chain network from world
    • Justfile improvements and new recipes
    • Improve concurrent environment chain support
    • More detail is available in the PR description

Iohk-nix

  • Migration to play: iohk-nix-pull-561
    • Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org
    • Remove deprecated cardano-lib p2p network environment
    • Update sanchonet chain with respin changes
    • Update private chain with respin changes
    • Bump private and shelley-qa chains to sanchonet equivalent conway genesis
    • Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing

Sanchonet-demo

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[DB-sync Team Update]]> + 2023-11-09-db-sync + + 2023-11-09T00:00:00.000Z + + High level summary

We have created new tag sancho-2-2-0, which integrates missing Conway feautures and some minor fix +tags sancho-2-1-0, sancho-2-0-1. +We have completed the initial implementation for the bootstrap instance objective.

Lower level summary

  • Add a new --disable-gov flag which disabled Conway ferautures +#1558
  • Fix of the committee key size +#1544
  • Workaround a ledger issue with unregistered pools +#1542
  • Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs +#1539
  • Rename offline to offchain +#1533
  • Transfer existing tests to Conway era +#1529#1547
]]>
+ + Kostas Dermentzis + https://github.com/kderme + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-11-08-ledger + + 2023-11-08T00:00:00.000Z + + High level summary

This update contains mostly improvements to quality of Conway era implementation and +tooling that we use for testing Ledger. Major Conway bugs that were discovered and +squashed are:

  • PParamsUpdate proposals will now correctly use DRep thresholds for ratification
  • Treasury withdrawals are now properly enacted.
  • Corrected snapshotting and DRep Stake Distribution Pulser initialization
  • Delegation to non-existent Stake pool is no longer possible

Other important quality of life improvements are addition of reusable interfaces for an +ordered set OSet and ordered map OMap. Which allowed us to disable duplicate +certificates and proposals in a transaction. As a precursor to PlutusV3 integration, a +serious reorganization of Plutus related functionality was performed.

Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on +expired proposals, addition of Anchor to Constitutional Committee resignation proposals.

Significant improvements have been made to a specialized "Imp" test library that allows us +writing concise stateful unit tests for verifying the Ledger logic. Serious progress has +been made on the conformance testing, where we can now interface with Haskell generated +code from the Agda specification. Serialization testing has been extended to increase +binary conformance coverage.

Low level summary

Conway

  • pull-3808 - Enhance CommitteeMembersState query to return quorum and NoConfidence
  • pull-3801 - Fix epoch rule and tests
  • pull-3803 - Fix delegation validation
  • pull-3759 - Reshuffle things to the DRepPulser incorporates some snap shot things
  • pull-3779 - Prevent duplicate certs and proposals
  • pull-3794 - Added anchor to resign certs
  • pull-3797 - Cleanup JSON instances for Conway governance
  • pull-3848 - Plutus modules restructure
  • pull-3840 - Fix anomalies in Deposits in the Conway Era
  • pull-3856 - Add governance related ledger events
  • pull-3825 - Prevent voting on expired GovActions
  • pull-3831 - Treasury withdrawal fix
  • pull-3791 - Use a Data.OMap.Strict to replace ProposalsSnapshot
  • pull-3836 - PParamsUpdate enactment fix
  • pull-3846 - Revert argument order swap.

Testing

  • pull-3782 - Move ImpTest to Shelley testlib
  • pull-3842 - Imp improvements
  • pull-3844 - Add mappings to Agda types
  • pull-3853 - Fix strange assertion failure, which hides real Block too big problem.
  • pull-3809 - CDDL roundtrip testing
  • pull-3832 - Treasury withdrawals tests
  • pull-3839 - Added cardano-ledger-conformance
  • pull-3841 - Add sha256 to cardano-ledger-executable-spec

Improvements and releasing

  • pull-3843 - Add ...WithLogs versions of evalScripts and friends
  • pull-3795 - Bump plutus to 1.15
  • pull-3798 - Bump urllib3 from 1.26.17 to 1.26.18 in /doc
  • pull-3799 - Changes needed for 8.6 release
  • pull-3807 - Add invalidBeforeL and invalidHereAfterL functions
  • pull-3819 - Fixups needed for a release
  • pull-3829 - Post release CHANGELOG version bumps
  • pull-3830 - Bump aeson to 2.2
  • pull-3833 - Backport release cardano-ledger-conway-1.10.1.0
  • pull-3828 - Add changelog for node release 8.6
]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-11-08-mithril + + 2023-11-08T00:00:00.000Z + + High level overview

This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files.

Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator.

Low level overview

  • Worked on the issue Prototype a P2P relay with libp2p #1300
  • Worked on the issue Light Wallet: Release mithril-client library #1311
  • Worked on the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
  • Worked on the issue release-mainnet aggregator is unreachable #1310
  • Completed the issue Client Docker package is incorrect #1322
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-11-01-consensus + + 2023-11-01T00:00:00.000Z + + High level summary

This week the Consensus team made progress on two fronts: the question of survivable eclipse duration, which is part of our work supporting Genesis delivery, and how to improve the handling of blocks from the future. +Regarding the UTxO-HD branch, we managed to run a node with legacy blocks, which is syncing with mainnet, up to including Alonzo. +We also investigated a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release.

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-11-01-mithril + + 2023-11-01T00:00:00.000Z + + High level overview

This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the release-mainnet aggregator.

Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI.

Low level overview

  • Worked on the issue P2P Networking - Proof of Concept #1300
  • Completed the issue Build mithril-common and mithril-client in WASM PoC #1284
  • Completed the issue Fix devnet Mithril Docker images [#1272](https://github.com/input-output-hk/mithril/issues/1272
  • Worked on the issue Light Wallet: Release mithril-client library #1311
  • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
  • Worked on the issue release-mainnet aggregator is unreachable #1310
  • Completed the issue Client regressions in snapshot list and download #1321
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-10-27-hydra + + 2023-10-27T00:00:00.000Z + + High-level summary

This week, the Hydra team fixed the gen-hydra-keys command to avoid +overwriting existing keys, and resolved issues related to the rewritten +hydra-tui. They also worked on a \"dirt road\" implementation for the +\"Ignored init tx\" notification, improving the robustness of the system.

The team finalized preparations for the Cardano Summit presentation, including +implementation of the hydra-poll example DApp.

If you happen to read this and attend the Summit in Dubai, make sure to check +out our Masterclass about \"Developing Hydra + Mithril for Scaling Cardano\" on +Friday, November 3 at 14:00-15:30 local time in the \"Al Dar\" room!

What did the team achieve this week

  • Fix gen-hydra-keys command to not overwrite existing keys +#1136
  • Fixed the rewritten hydra-tui#1113#1137
  • Finalized cardano summit preparation +#1109
  • Implemented the hydra-poll example DApp link to +repository
  • Dirt road implementation for \"Ignored init tx\" notification +#529

What are the goals of next week

  • Attend cardano summit and deliver presentation
  • Clarify / close user created issues
  • Build aarch64-darwin binaries in CI
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Network Team Update]]> + 2023-10-27-network + + 2023-10-27T00:00:00.000Z + + High-level overview of sprint 47

Bootstrap Peers

We continued to review the process of bootstrap peers, see ouroboros-network#4555

CI / Tests

We investigated our CI issues. We found a memory leak in typed-protocols +function used for testing codecs which triggered out of memory manager (OOM) on +some platforms (typed-protocols#43); we also found a bug in the connection manager which resulted in CI +timeouts (see connection-manager-fix).

KeepAlive client

We found two small issues with the keep-alive client, which were addressed +by Karl Knutsson (Cardano Foundation), ouroboros-network#4689.

Galois

We merged two large PRs prepared by Galois:

Cardano Network Service Assurance (CNSA)

Galois made the following progress on CNSA:

  • a simple [InfuxDB] database backend has been added;
  • the documentation has been updated;
  • internal improvements to the code;
  • progress on a new "CSNA analysis" that provides, for each sampler node, the +block download throughput in bytes over time.

New CHaP Release

We cut a new release of ouroboros-netowrk packages to CHaP: chap#547

More details

CI / Tests

We improved the memory footprint of some of our tests by analysing a stream of +IOSim traces without retaining them, see ouroboros-network#4696

As a safety measure, we introduced an upper bound for heap memory used by test +artefacts in our nix tests. We use 200MB limit for all tests except for +network-mux tests which use 350MB limit, see ouroboros-network#4702.

We refactored one of our tests to use ephemeral ports thus allowing it to +run concurrently, see ouroboros-network#4702.

We merged ouroboros-network#4623 which fixes a bunch of test failures.

All of them were due to a bug in test logic rather than a bug in production +code.

Release Process

We updated our release process & associated scripts, see +ouroboros-network#4705.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[SRE Team Update]]> + 2023-10-27-sre + + 2023-10-27T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the cardano-playground stack

Lower level summary

Capkgs

  • Adds offchain-metadata-tools, dbsync sanchonet updates: capkgs-compare

Cardano-parts

  • General package updates, modules improvements and template recipes to support network migration from world to playground cardano-parts-pull-17
    • Bumps cardano-db-sync-ng to sancho-2-0-0 tag
    • Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play
    • Adds more machine system bins and devShell bins for scripting and debug purposes
    • Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module
    • Adds profile-cardano-node-topology module for a simplified interface to most common topology needs
    • Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs
    • Adds a topology function to filter self from group machines with an allowList for matching infixes
    • Adds metadata-server and related offchain-metadata-tools bins from capkgs
    • Updates justfile template with:
      • a new query-all recipe for getting status of multiple concurrent running environments
      • a new set-default-cardano-env recipe for fast switching between environments
      • a new start-demo recipe for forking a custom env into conway
      • a new start-node recipe for generic environment start
      • a new stop-node recipe for generic environment stop
      • updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions
      • updated query-tip recipe to a generic query tip compatible with each environment

Cardano-playground

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-10-25-mithril + + 2023-10-25T00:00:00.000Z + + High level overview

This week, the Mithril team released a new distribution 2342.0. This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes.

They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files.

Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the release-mainnet aggregator, and enhanced the Mithril explorer UI.

Low level overview

  • Worked on the issue P2P Networking - Proof of Concept #1300
  • Completed the issue Make mithril-client crate a library #1141
  • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
  • Completed the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
  • Worked on the issue Fix devnet Mithril Docker images #1272
  • Worked on the issue release-mainnet aggregator is unreachable #1310
  • Worked on the issue Build mithril-common and mithril-client in WASM PoC #1284
  • Completed the issue Display a summary of signers before the full list in explorer #1133
  • Completed the issue Add certificates list in explorer #1184
  • Completed the issue CoreVerifier setup does not compute total_stake correctly #1306
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-10-24-node-cli-api + + 2023-10-24T00:00:00.000Z + + 2023-10-11 - 2023-10-24

High level summary

CARDANO-CLI

  • Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified.
  • stake-address-info now shows deposits balance.
  • Added conway governance action view to allow to inspect governance action files before submitting them on a transaction.
  • build-raw support for --vote-file and --proposal-file

CARDANO-API

  • Support DRep extended keys
  • Support Plutus V1 in Conway

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-10-20-hydra + + 2023-10-20T00:00:00.000Z + + High-level summary

This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023.

In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON. +This improvement offers users greater flexibility and ease of interaction with the API.

Finally, the team has followed up on the TUI brick upgrade to version 1.10. +This effort has resulted in addressing minor details and enhancing the overall user experience with the TUI.

What did the team achieve this week

  • Prepare presentation and workshop for Cardano Summit.
  • More TUI fixes and improvements.
  • Upgrade GHC from 9.2.8 -> 9.6.2 #1105
  • Solved user issue related to submitting transactions in cbor format #1111.
  • Fix hydraw connection issue making it more stable #1121.

What are the goals of next week

  • Work on hydra-poll dApp for Cardano summit.
  • Start the work on packaging hydra-node and related services.
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-10-18-consensus + + 2023-10-18T00:00:00.000Z + + High level summary

During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node.

UTxO-HD

  • The Plutus workload benchmark for the in-memory backend showed no regressions for the metrics of interest, but it does show an increase in resource usage.
  • We got additional ad-hoc measurements on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB.
  • We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.

Genesis

  • We produced the first draft for a Survivable Eclipse Duration Model (422).

Support

  • Esgen finished his cycle as release engineer. Node 8.5.0 has been released.
  • We resumed work on the subpar handling of block from the future (4251).
  • We prepared the integration of new tracing events for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned issue).
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-10-18-mithril + + 2023-10-18T00:00:00.000Z + + High level overview

This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay.

Finally, they enhanced the CI/CD to publish multiple packages to crates.io and started improving the developer experience with the Mithril devnet.

Low level overview

  • Published the security advisory Mithril relay could expose Cardano block producer internal IP when updated #GHSA-9m3h-72xj-x2gq
  • Worked on the issue P2P Networking - Proof of Concept #1300
  • Worked on the issue Make mithril-client crate a library #1141
  • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
  • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
  • Completed the issue Publish multiple packages to crates.io #1298
  • Completed the issue Rename public key published in releases #1292
  • Completed the issue Mithril networks infrastructure maintenance #1218
  • Worked on the issue Fix devnet Mithril Docker images #1272
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Network Team Update]]> + 2023-10-15-network + + 2023-10-15T00:00:00.000Z + + High-level overview of sprint 46

Bootstrap Peers

We continued reviewing of bootstrap peers, see ouroboros-network#4555.

Towards Typed Protocols 0.2.0.0

We diagnosed the performance regression of the new design. The work on +typed-protocols will be postponed. For more details see the +typed-protocols#3. As an outcome of the performance debugging we prepared +PR which updates the demo-ping-pong and +demo-chain-sync applications.

Peer Sharing

We made progress in review of ouroboros-network#4644, which simplifies the +peer sharing and fixes the ouroboros-network#4642 issue.

Tech Debt

We reviewed the ouroboros-network#3836 PR which inspects all the uses of +error in ouroboros-network. The PR was prepared by Galois.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-10-13-hydra + + 2023-10-13T00:00:00.000Z + + High-level summary

This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity.

They also completed the exploration of potentially moving the Plutus validator scripts to Aiken.

Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project.

What did the team achieve this week

  • Network Resilience Persistence (#1101)[https://github.com/input-output-hk/hydra/pull/1101].
  • Upgrade brick on TUI (#1103)[https://github.com/input-output-hk/hydra/pull/1103].
  • Aiken commit validator translation (#1072)[https://github.com/input-output-hk/hydra/pull/1072].
  • Fixed some bugs in our TUI client.

What are the goals of next week

  • Prepare presentation and workshop for Cardano Summit.
  • Work on hydra-poll dApp for Cardano summit.
  • Start the work on packaging hydra-node and related services.
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-10-13-ledger + + 2023-10-13T00:00:00.000Z + + High level summary

The Ledger team has been shifting focus from implementing Conway related features to +testing. For this reason there is a very little amount features that are reported this +time aorund. Notable Conway related changes are a specialized ledger query for getting +Constitutional Committee state and prevention of submitting proposal procedures that have +no valid path to enactment.

Testing related work was mainly on a constraint base system as well as on roundtrip +serialization. As a result of this extra testing a bug in Conway Genesis serialization +was eliminated.

Low level summary

Conway era

Integration and releasing

Testing

  • pull-3769 - Add roundtrip testing by validating FlatTerm
  • pull-3783 - Update TranslationInstance.hs
  • pull-3775 - Refactor and improve constraint based STS tests
  • pull-3793 - Fix sums with negative RHS.
]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[SRE Team Update]]> + 2023-10-13-sre + + 2023-10-13T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Sanchonet environment was updated to 8.5.0-pre.
  • Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring

Lower level summary

Capkgs

  • Various improvements and fixes including:
    • Add GHA cron schedule
    • Add nix auto-gc to avoid running out of storage during large package set builds
    • Add new packages to capkgs
    • Reduce runner storage requirement leaving more room for builds
    • Restructure capkgs attribute names to avoid package name collisions
    • Return to non-musl builds for cardano packages to retain journald compatability
    • Update cache usage to from file level to folder level to reduce network and latency overhead
    • Commit diff: capkgs-compare

Cardano-parts

  • Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: cardano-parts-pull-16
  • Dbsync, smash, faucet and more: cardano-parts-pull-15
    • Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes
    • Adds nginx vhost metrics exporter profile
    • Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down
    • Adds bash *-ng autocompletion compatible wrappers
    • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
    • Adds downstream grafana cloud dashboard as templates
    • Adds downstream grafana cloud alerts as templates
    • Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish
    • Updates the basic profile with IOG cache and commonly used bins
    • Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
    • Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks
    • Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets
    • Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration
    • Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion
    • Updates the colmena template with dbsync, smash, faucet machines profiles and roles
    • Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns
    • Bumps capkgs node-ng to 8.5.0-pre

Cardano-playground

  • Dbsync, smash, faucet and more: cardano-playground-pull-3
    • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
    • Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts
    • Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change
    • Optimizes machine sizes
    • Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets
    • Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion
    • Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
    • Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration

Cardano-world

Sanchonet-demo

  • Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: sanchonet-demo-commit
]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-10-11-mithril + + 2023-10-11T00:00:00.000Z + + High level overview

This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on crates.io, the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures.

Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI.

Low level overview

  • Worked on the issue Make mithril-client crate a library #1141
  • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
  • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
  • Completed the issue Update Rust compiler in nix CI #1282
  • Worked on the issue Mithril networks infrastructure maintenance #1218
  • Worked on the issue Activate Cloudflare protection of infrastructure #1230
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-10-10-node-cli-api + + 2023-10-10T00:00:00.000Z + + 2023-09-27 - 2023-10-10

High level summary

CARDANO-NODE

CARDANO-CLI

  • Depracated governance query commands and moved all governance related queries to cardano-cli <era> query
  • Drep registration certificates now allow to include an anchor
  • Integrated Drep retirement ceriticates
  • clean up of Drep registration certificates.

CARDANO-API

  • Add support for committee hot key witnesses
  • Require conway onwards for voting
  • Conway drep registration: expose ledger anchor parameter
  • Add certs to txbody of Conway transactions

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-10-06-hydra + + 2023-10-06T00:00:00.000Z + + High-level summary

This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums.

The team also delivered the first version of the network resilience layer, significantly increasing head availability.

Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra.

Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra.

What did the team achieve this week

  • Release 0.13.0
  • Published vulnerability reports #1088
  • Merged network resilience work part I #1074
  • Planning for Cardano Summit participation
  • Discussions with funded Catalyst projects wanting to build on Hydra for support
  • Merged typos fix PR from @omahs #1095

What are the goals of next week

  • Complete Aiken commit validator script #1072
  • Complete Kupo integration #1078
  • Brick upgrade on TUI #1103
  • Clean backlog
  • Prepare and rehearse demo and talk for Cardano Summit
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-10-06-performance-and-tracing + + 2023-10-06T00:00:00.000Z + + High level summary
  • Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system.
  • Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7.
  • Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store.
  • Tracing: The machine-readable tracer configuration has been merged. Optimization of cardano-tracer started.
  • Nomad backend: Ongoing variance analysis and refined cluster topology.

Low level overview

Benchmarking

Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the +performance of the in-memory backing store and evaluate possible optimizations (or regressions) for it.

Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results +show all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the cardano-tracer service.

Consensus QTAs

The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The +feedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype.

Development

Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort.

PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time, +we'd like to validate the many improvements that have gone into the Plutus evaluator.

Tracing

The focus for further optimization of the new tracing system has shifted to cardano-tracer - the service +receiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in cardano-node is +more performance critical, the receiving service must still minimize its resource footprint. Moreover, it can +generate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations.

Nomad backend

Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated +the same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-10-04-consensus + + 2023-10-04T00:00:00.000Z + + High level summary

The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the in-memory backend.

On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain. +We also merged a fix for the Babbage to Conway transition, and released a new version of Consensus.

Genesis

  • We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (392).

Support

  • We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (366).
  • We enabled richer tracers in cardano-node that can be useful in future debugging (384).
  • Esgen continues with his release engineer activities, and created a new Consensus release.

Fostering collaboration

  • We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (369).
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-10-04-mithril + + 2023-10-04T00:00:00.000Z + + High level overview

This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion on implementing Mithril in a light wallet to receive feedback and contributions from the community.

They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks.

Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs.

Low level overview

  • Created the discussion Implement Mithril in a light wallet #1273
  • Completed the issue Run client in browser WASM PoC #1254
  • Completed the issue Benchmark aggregator performances #1220
  • Worked on the issue Add SPO tickers in explorer #1185
  • Completed the issue Add a non 404 status code on the aggregator endpoint #1103
  • Completed the issue Use source attribute in errors #1265
  • Completed the issue Create a SPO checklist for KES keys update #1267
  • Completed the issue Configure status page and alerting #1277
  • Completed the issue Upgrade dependencies #1274
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Network Team Update]]> + 2023-10-02-network + + 2023-10-02T00:00:00.000Z + + High-level overview of sprint 45

Bootstrap Peers

We started reviewing the bootstrap peers PR, ouroboros-network#4615.

Towards Typed Protocols 0.2.0.0

We discovered a performance regression when using typed-protocols-0.2.0.0, and we +started investigating where it comes from. Currently, we see that +typed-protocols-0.2.0.0 can outperform typed-protocols-0.1.0.0 when running +in isolation with a simple ping-pong protocol, so the regression might be in +the new block fetch implementation which comes with typed-protocols-0.2.0.0 +See typed-protocols#3.

Tech Debt

We merged two PRs written by Galois engineers:

  • a pull request which refactors the main entry function for P2P, see ouroboros-network#3834;
  • a pull request which reviews usage of unsafe function in the network code based.

Galois also made progress with the following two issues:

IO-Sim

IOSimPOR

We found and fixed a bug in IOSimPOR. We'd like to thank Prof. John Hughes +(Quviq AB) for helping us with debugging the issue.

We also provided a more uniform API for IOSimPOR, and added ways to make the +debugging similar problems in the future easier.

Technical Details on IOSim refactoring
We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future.

IOSim

To prepare for the next release, we consolidate packages taking advantage of +the public sublibraries supported now both by cabal and Hackage. This is +a work in progress, io-sim#114.

Cardano Newtork Service Assurance

Galois made the following progress:

  • A test run of spinning up a CNSA instance was done, as a result documentation +was updated.
  • Based on the IOG code review of the CNSA code, updates to the CNSA code were +made.
  • Galois has started the design for adding a CNSA analysis for "fetched bytes +over time while node is syncing".

P2P adoption

In the last two weeks, we've seen increase in P2P adoption. +P2P relays

The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays. +node versions

Open Source

We upstreamed our FFI bindings to Windows named pipes to Win32 package, the +PR was accepted and merged.

We also received an external contribution which enhanced our documentation, see +ouroboros-network#4676.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-09-29-goedel + + 2023-09-29T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and testing the +performance analysis tool

Details

  • drafting processs calculus semantics of mini protocol programs

  • testing the new performance modelling tool

  • further work on specification of mini protocols

  • extension of mini protocol framework to support communication of +programs with local environments via synchronous channels

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-09-29-hydra + + 2023-09-29T00:00:00.000Z + + High-level summary

This week, the Hydra team mainly focused on having a working new reliability +network layer; and specified its expected behavior in a new ADR.

They also revisited the security policy and vulnerability disclosure policy on +how to handle security vulnerability within Hydra, and in particular how to +handle so-called "Silent fixes".

What did the team achieve this week

  • Updated security policy and vulnerability disclosure policy #1088
  • Adr/network reliability #1082

What are the goals of next week

]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-09-29-ledger + + 2023-09-29T00:00:00.000Z + + High level summary

Few important Conway related features were completed in this two week period:

  • Constitutional Committee was the last missing Conway related entity that has now been +fully implemented.
  • Treasury withdrawals governance actions have been fixed and now behave as expected.
  • Current treasury amount supplied in the transaction is now enforced by the rules.
  • DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no +proposals to vote on.
  • Semantics of how CostModels are updated with Protocol Parameters have been changed to +allow for individual Plutus language version updates, rather than requiring a complete +replacement of all CostModels

Besides the new features there were also important performance and testing improvements:

  • In particular stake distribution computation and native script handling received some +optimizations.
  • New testing DSL has been implemented that drastically simplifies writing unit tests for +ledger rules.
  • Integration tests and benchmarks are now possible for Conway era because of the overhaul +of functionality for initial funds and staking injection whenever node starts up in +Conway, while bypassing all previous eras.

Low level summary

Conway era

  • pull-3729 - DRep expiry update after a contiguous set of epochs with no proposals to vote on
  • pull-3739 - Rename some PParams to be consistent with Agda specification
  • pull-3743 - Move DRepDistr from VState to ConwayGovState
  • pull-3746 - Implement tcTranslationContextL for Shelley
  • pull-3737 - Implement EraTransition
  • pull-3749 - Add predicate failure: current treasury value mismatch in LEDGER
  • pull-3748 - Apply enacted treasury withdrawals
  • pull-3745 - Constitutional Committee Ratification
  • pull-3763 - Plutus interface improvements
  • pull-3771 - Changed how costmodel updates are applied
  • pull-3766 - Prevent updating protocol version with PParamUpdate

Performance

  • pull-3765 - Improve native script handling
  • pull-3747 - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin
  • pull-3758 - Cardano-Perf regression: UMap.size regression fix
  • pull-3754 - Use Alonzo-style TxOut encoder when possible

Releasing

  • pull-3742 - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes
  • pull-3744 - Changelog 8.4
  • pull-3752 - Patch release of cardano ledger conway 1.8.1.0
  • pull-3753 - Minor cleanup and changelog entries
  • pull-3760 - Fixup issues for release
  • pull-3764 - Bump plutus deps to 1.13

Testing

  • pull-3734 - Removed Shaped instance for Rep
  • pull-3735 - Simplify the implementations of hasOrd and hasEq
  • pull-3728 - STS tests based on constraints
  • pull-3714 - Implement the remaining upgradable families
  • pull-3733 - Add some unit tests for Conway features
  • pull-3762 - Update CDDL for praos headers.
]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[SRE Team Update]]> + 2023-09-29-sre + + 2023-09-29T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent changes, updates or improvements include:

  • Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node 8.4.0-pre.
  • The use of cardano-node docker hub will be deprecated in preference of GHCR

Lower level summary

Capkgs

  • Refactor parsing scripts, add github action automation, various bugfixes and cleanup: capkgs-compare

Cardano-parts

  • Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: cardano-parts-pull-8

Cardano-playground

  • Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: cardano-playground

Cardano-world

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-09-27-mithril + + 2023-09-27T00:00:00.000Z + + High level overview

The Mithril team has released a new distribution 2337.0, which includes the following enhancements: support for zstandard compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator.

They also completed the refactoring and standardization of the errors in the Mithril nodes and published an Architectural decision record on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure.

Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs.

Low level overview

  • Completed the issue Release new 2337 distribution #1219
  • Completed the issue Errors refactoring #798
  • Completed the issue Client traffic creates performance bottleneck in aggregator #1207
  • Completed the issue Record statistics about the downloaded snapshot in the aggregator #1127
  • Completed the issue Create a SPO checklist for KES keys update #1267
  • Worked on the issue Spike: Run client in browser WASM PoC #1254
  • Worked on the issue Benchmark aggregator performances #1220
  • Worked on the issue Activate Cloudflare protection of infrastructure #1230
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-09-26-node-cli-api + + 2023-09-26T00:00:00.000Z + + 2023-09-13 - 2023-09-26

High level summary

  • cardano-node 8.4.0-pre release suitable for SanchoNet.
  • CLI continues making progress integrating governance features. During this sprint we integrated the info and new-committee governance actions.
  • The team continued moving to the ERA top-level commands structure. Removed --conway-era flag from the legacy commands making conway era commands only accessible via cardano-cli conway.
  • stake-pool command is now under the ERA top level structure.
  • API continues integration with governance features, it is worth to higlight that now ProposeNewCommitee uses the right key type (cc-cold)

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-09-22-hydra + + 2023-09-22T00:00:00.000Z + + High-level summary

This week, the Hydra team conducted the monthly review meeting in +collaboration with Mithril, enhancing project coordination.

The team improved the gen-hydra-key node command for smoother usability +and identified concrete steps to enhance network resiliency in feature +items #188, +#1080, and +#1079. +Additionally, they contributed the aiken-mode editor integration to the +aiken-lang organization, updated dependencies to utilize cardano-api +8.20, and published the Hydra security advisory CVE-2023-42806 with a +workaround available for users.

These efforts demonstrate the team\'s commitment to project improvement, +security, and open-source community collaboration.

What did the team achieve this week

  • Conducted the monthly review meeting together with Mithril
  • Improved gen-hydra-key node command +#1077
  • Established a clear plan to improve resiliency of network and manifested +feature items #188, +#1080 and +#1079
  • Moved aiken-mode (created by SN) +to aiken-lang organization
  • Updated dependencies to using cardano-api 8.20 +#1075
  • Published security advisory +CVE-2023-42806 +(workaround available)

What are the goals of next week

  • Write-up the monthly report for September
  • Finish "network resilience to disconnects" +#188
  • Finish kupo integration with hydra +#1078
  • Discuss and decide on using aiken or not
  • Address the published security advisory +CVE-2023-42806 +(to not require workaround)
  • Ideally, release 0.13.0
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-09-22-performance-and-tracing + + 2023-09-22T00:00:00.000Z + + High level summary
  • Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters.
  • Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time.
  • Tracing: Work on machine-readable tracing of tracer configuration is ongoing.
  • Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster.
  • Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Blöndal!

Low level overview

Benchmarking

As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking +backend with means to measure and document network latency for each run. Furthermore we've implemented means to +capture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences +in the behaviour of the underlying networking stack at OS level.

Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided +to compare standard deviations instead to validate the measurements from nomad.

Infrastructure

Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline +have been merged to master. They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis.

Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for trace-dispatcher and tx-generator we were able to address those issues.

Tracing

After various steps in constructing a configuration upon node startup, it is vital to document +which runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML +trace message for that purpose.

This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node.

Nomad backend

As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it +produces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an +impact on our measurements, as we'd be basically using two different instruments to take them.

Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service +or the slightly different system architecture of the new cluster.

New team member

Baldur Blöndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team. +So I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on cardano-tracer, the component receiving, processing and making available node traces and metrics.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-09-20-consensus + + 2023-09-20T00:00:00.000Z + + High level summary

We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks. +We are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough. +On the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain. +We also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway.

UTxO-HD

  • We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (349). System level benchmark results are pending.
  • Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (344), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run.
  • We also brought the UTxO-HD branch up to date with node version 8.4.0.

Genesis

  • We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain. +We are now drafting the final self-contained argument. (4157)

Support

  • We debugged a bad parameter update on the Babbage to Conway transition in the SanchoNet testnet (339). +A superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (340, 354, and 355) +However we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ConsensusProtocol type class and the HardForkBlock combinator (345 and 346). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-09-20-mithril + + 2023-09-20T00:00:00.000Z + + High level overview

This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports.

Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution.

Low level overview

  • Completed the issue Add snapshot compression parameters in infrastructure deployments #1200
  • Completed the issue Add Cloudflare protection of infrastructure #986
  • Worked on the issue Record statistics about the downloaded snapshot in the aggregator #1127
  • Worked on the issue Error refactoring #798
  • Worked on the issue Activate Cloudflare protection of infrastructure #1230
  • Worked on the issue Release new 2337 distribution #1219
  • Completed the issue Upgrade dependencies #1238
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-09-15-goedel + + 2023-09-15T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

Details

  • working on collating and open sourcing performance analysis prototype

  • improvements to Ouroboros Praos specification in Isabelle

  • working on formalising chain sync mini-protocol

  • reviewing an alternatice semantics for DeltaQ

  • Seminar talk at U. Bergen on algebraic properties of timeliness

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-09-15-hydra + + 2023-09-15T00:00:00.000Z + + High-level summary

This week, most of the Hydra team was attending a cardano scaling workshop in +Nantes, France. They used this oportunity to meet fellow mithril team and spend +some time together to hack on some code and, as always, reflect on the past work +and find optimal path forward for both projects. They also fixed a bug that +caused hydra-node to crash when querying L1, worked on a new network resillience +proof-of-concept and accepted a new ADR related to stateless transaction +observation.

What did the team achieve this week

  • Cardano scaling workshop with members of hydra and mithril teams
  • Accepted user contribution for possible new use-case #1048
  • Fix for the hydra-node crash related to internal wallet query #1053
  • Collected experimental CI findings #1070
  • Propose first POC for the network resilience #1074

What are the goals of next week

  • Monthly review meeting & report including updates from Mithril
  • Review POC and discuss our options for the network resilience
  • Update cardano-api to version 8.20
  • Address TODOs on aiken commit validator #1072
  • Complete hydra-support in kupo kupo#117
]]>
+ + Sasha Bogicevic + https://github.com/v0d1ch + + + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-09-15-ledger + + 2023-09-15T00:00:00.000Z + + High level summary

The Ledger team's focus is still mainly on the Conway era implementation.

We were able to add ability to specify initial Constitutional Comittee and the initial +version of Constitution. Priority in which Governance Action are now enacted matches the +specification. DRep's deposits are now properly accounted for. Governance actions that are +not allowed to be voted on by Stake Pool operators and Constitutional Committee members +are prevented by transaction submission failure, rather than simply being ignored. There +was a few important CDDL fixes as well as a lot of new round trip serialization +tests. Constraint based testing framework has also received a lot of improvements.

Low level summary

Conway era

  • pull-3681 - Conway Genesis additions
  • pull-3690 - Preserve the order of ProposalProcedures
  • pull-3705 - Removed ProtVer from EnactState
  • pull-3700 - Add conway-specific certs to deposit/refunds
  • pull-3704 - Add comments on deprecating certs to Conway CDDL
  • pull-3698 - Reordering of governance actions
  • pull-3712 - Disallow empty fields in ConwayTxBodyRaw
  • pull-3716 - Abstract threshold calculation
  • pull-3725 - Fix mistaken use of dollar sign in cddl files
  • pull-3718 - Predicate failure for mismatched Voter GovAction
  • pull-3721 - Committee expiration, validation and modification

Improvements and releasing

Testing

  • pull-3730 - Implement Show instance for Rep using IsTypeable
  • pull-3697 - Rewrite testEql using Typeable to make it impossible to forget cases
  • pull-3709 - Add many new features to the Constrained modues in cardano-ledger-test
  • pull-3726 - Conway and other eras serialization roundtrip tests
  • pull-3713 - Improve CI resiliency against GitHub issues
]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[Network Team Update]]> + 2023-09-15-network + + 2023-09-15T00:00:00.000Z + + High-level overview of sprint 44

Bootstrap Peers

In this sprint, we focused on developing bootstrap peers.

Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we +identified a possible improvement to bootstrap peers. A more detailed +description is available here.

Cardano-Node-8.4.0 Release

We also were responsible for the cardano-node-8.4.0-pre release. A final +integration PR is currently being merged. We published +new versions of ouroboros-consensus, cardano-api and cardano-cli.

Towards Typed Protocols 0.2.0.0

We also updated the future typed-protocols-0.2.0.0 and its integration with +cardano-node. This is towards our goal which we planned for the next +quarter. The identified tasks are to fix breaking tests, and then measure and +address possible performance regressions.

Tech Debt

Mark Tullsen (Galois) submitted two more PRs: ouroboros-network-#4663, +ouroboros-network-#4664. We provided feedback on their other pull requests: ouroboros-network-#4661 and +ouroboros-network-#4660.

P2P adoption

In the last two weeks, there was a regression in P2P adoption concerning +the number of SPOs or stakes, although the number of overall P2P relays has +increased. Karl Knutsson (Cardano Foundation) is investigating +this issue. +P2P relays

The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

Data has been kindly provided by Cardano Foundation and their mainnet +monitoring infrastructure.

Open Source

We are in the process of upstreaming our ffi to Windows Named Pipes API to the Win32 package, see [win32-220].

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[SRE Team Update]]> + 2023-09-15-sre + + 2023-09-15T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Sanchonet environment was updated to 8.3.0-pre.
  • Cardano-parts now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is here.

Lower level summary

Capkgs

  • Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: capkgs-compare

Cardano-ops

Cardano-parts

  • Utilize content addressed binaries to significantly improve eval, build and devShell performance: cardano-parts-pull-8
  • Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: cardano-parts-pull-10
  • Fix warns thrown during some builds and devShell usage: cardano-parts-pull-11
  • Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: cardano-parts-pull-12
  • Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: cardano-parts-pull-13

Cardano-perf

  • Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: cardano-perf-compare

Cardano-playground

Cardano-world

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[DB-sync Team Update]]> + 2023-09-14-db-sync + + 2023-09-14T00:00:00.000Z + + High level summary

We have created a DBSync tag sancho-1-1-0 which can follow sanchonet. Also +the team has ran a number of benchmarks and tests for the new options/flavours of DBSync +and prepared a blogpost which summorises them, for downstream components.

Lower level summary

  • Integration of node-8.3.x and support for Sanchonet on Conway +#1498
  • Simplifications of new feautures +#1496
  • Makes it impossible to restart DBSync with different schema options and adds +tests for them +#1466
  • CI fixes +#1494#1491
  • Prepared a blogpost about different DBSync options +blog
]]>
+ + Kostas Dermentzis + https://github.com/kderme + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-09-12-node-cli-api + + 2023-09-12T00:00:00.000Z + + 2023-08-30 - 2023-09-12

High level summary

Release of Cardano-node 8.3.0-pre for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs. +This release completes phase 2 of SanchoNet feature roll out plan

CLI continues on its migration to a era-based top-level commands. This sprint we moved text-view, key, query, genesis, node, stake-address, transaction and address into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints.

We are moving the drep delegation-certificate to the stake-address command so delegating to a drep is done via stake-addres vote-delegation-certificate. Along the same lines, we are renaming +stake-address delegation-certificate (delagating to a stake pool) to stake-address stake-delegation-certificate to distinguish between stake delegation to a pool and votes delegation to a drep. On top +of that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly stake-address stake-and-vote-delegation-certificate. Note that change is not included on 8.3 but will come on 8.4. +Removing --conway-era flag from all the transaction sub-commands.

Update description fields in delegation certificates from Stake Address Delegation Certificate to respectively (Conway onwards):

  • Stake Delegation Certificate
  • Vote Delegation Certificate
  • Stake and Vote Delegation Certificate

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-09-08-hydra + + 2023-09-08T00:00:00.000Z + + High-level summary

This week, the Hydra team improved the commit process with support for inline +datums. They simplified the chain layer by refactoring how the chain state is +persisted. Updates to the Hydra tutorial were completed, including CI workflows +to keep it up-to-date. The team engaged in discussions with researchers about +incremental commits & decommits, and drafted an architectural decision record +for a resource-based API. They also explored simpler solutions for the upcoming +network resilience feature.

What did the team achieve this week

  • Support InlineScriptDatum in commit +#1043
  • Refactored chain state persistency +#1049
  • Completed tutorial updates (by adding CI and some cleanup) +#997
  • Intersect Open Source committee meeting
  • Experimented with various models to better express the \"Network +resilience problem\" to find a KISS solution for +#188
  • Drafted and discussed incremental de-/commit features within team +and with researchers +#199 and +#1057
  • Created ADR for a resource based overhaul of the API +#1028

What are the goals of next week

  • Meetup of Hydra & Mithril contributors in Nantes, France
  • Integrated cardano-api 8.15 to have GHC 9.6 support
  • A clear design for incremental commits (decommits are already +understood)
  • An ADR for improving tx construction & observation to not need chain +state
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-09-07-mithril + + 2023-09-07T00:00:00.000Z + + High level overview

The Mithril team has released a new distribution 2335.0 which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information.

They have also worked on snapshots enhancements: implementation of the zstandard compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes.

Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client.

Low level overview

  • Completed the issue Use 'zstandard' compression for snapshot archives #876
  • Completed the issue Design & implement stress test tool for aggregator - phase 2 #1155
  • Completed the issue Provide progress information with '--json' option in Client #1095
  • Completed the issue Make client download and extract the archive simultaneously #1115
  • Completed the issue Add aggregator Cardano node version in snapshot artifact #948
  • Completed the issue Make Cardano node version part of the Mithril network configuration #947
  • Completed the issue Post deployment 'mainnet' infrastructure #1091
  • Worked on the issue Errors refactoring #798
  • Worked on the issue Add Cloudflare protection of infrastructure #986
  • Completed the issue Failed to restore recent snapshot with strange error #1160
  • Completed the issue Update 'ed25519-dalek' to '2.0.0' #1188
  • Completed the issue Add target networks blocks in release notes #1151
  • Completed the issue Fix end to end 'wait_for_the_expected_time' test #1191
  • Completed the issue Fix docs 'git checkout' command #1174
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-09-07-performance-and-tracing + + 2023-09-07T00:00:00.000Z + + High level summary
  • Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack.
  • Infrastructure: Various improvements of our analysis pipeline have been merged to master, supporting safe log truncation.
  • Tracing: Namespace consistency checks have been merged to master along with a curated configuration for benchmarking.
  • Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.

Low level overview

Benchmarking

We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer.

With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance.

The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack.

Infrastructure

As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation +operation that keeps the interdependencies of block events intact.

Truncation might happen at a slightly different point +in time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time.

Tracing

Consistency checking of namespace implementation and configuration when using the new system has been completed. +This feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a cardano-node shows inconsistencies with the namespaces the system provides - and hence needs attention.

Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many +detailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable.

Nomad backend

The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the +first real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-09-06-consensus + + 2023-09-06T00:00:00.000Z + + High level summary

We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation. +On the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers. +The Consensus release engineer finished his rotation: version 8.3.0-pre of cardano-node is releasing 2023 September 5.

UTxO-HD

  • We ran the first successful system-level benchmarks for UTxO-HD (see #203) using the in-memory backend.
    • We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot.
    • After the mempool regression is fixed the benchmarks need to be ran again.
    • System-level UTxO-HD benchmarks with the LMDB are still pending.
  • UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see #344).
  • We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in GetUTxOByAddress (see this comment). Preliminary results are promising.
  • Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (#344), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.

Tech debt

  • We added tests that Consensus emits valid CBOR (#3099). This helped us detect a couple of serialization bugs. The tests still need to be merged into the main branch (#323).

Support

  • Nick Frisby finished his release engineer rotation; cardano-node 8.3.0-pre is releasing 2023 September 5.
  • We helped to investigate a protocol version bug in Sanchonet (see #3491).
  • We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see #91.
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-09-01-goedel + + 2023-09-01T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

Details

  • finalising a presenting performance analysis internship work to the +formal methods team

  • developed a new Isabelle mini-protocol framework and examples

  • planning an extended version of the ICE DeltaQ paper

  • working on algebraic rules for properisation of any-to-finish

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-09-01-hydra + + 2023-09-01T00:00:00.000Z + + High-level summary

This week, the Hydra team focused primarily on changes needed in the network +layer and have the first draft document related to needed design. They also +improved the user experience by allowing a commit using inline datums. +Discussed the off-chain governance with researchers and improved internal model +tests.

What did the team achieve this week

  • Monthly report published
  • Small changes to hydraw and tutorial in light of the Masterclass
  • Investigated a bug and saw it was solved by recent developments
  • Improved the model tests by fully validating L1 transactions
  • Enhanced the /commit API to also allow commit from scripts with inline datums (user request)
  • Discussed off-chain governance with IOG and CF researchers
  • Drafted a first network specification document in the context of Network resilience

What are the goals of next week

  • Have a clear understanding of the changes we need for the "Improve network resiliency" feature
  • Groomed and agreed plan on incremental commits/decommits
  • Updated tutorials including CI workflows to check consistency
  • Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)
]]>
+ + Sasha Bogicevic + https://github.com/v0d1ch + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-09-01-ledger + + 2023-09-01T00:00:00.000Z + + High level summary

Broadly speaking the Ledger team focused on a few main areas of Conway era:

  • Creation of voting state snapshots in order to correctly delay ratification for one epoch
  • Validation of the Governance Actions sequencing and ordering
  • Proper expiry of DReps and Proposal Procedures
  • Expanding Conway Genesis functionality
  • Utilization of some of the new Protocol Parameters in ledger validation rules

Low level summary

Conway era

  • pull-3659 - Validate Network for ProposalProcedure and TreasuryWithdrawal
  • pull-3637 - Avoid using sequence of tuples, by adding GovActionId to GovActionState
  • pull-3651 - Inactive DReps
  • pull-3664 - Track proposal expiry
  • pull-3668 - Add min committee size predicate to NewCommittee
  • pull-3669 - Add Proposal deposit check against PParam
  • pull-3676 - Fix inactive PoolStake not counting as Drep Stake
  • pull-3635 - Make snapshots of GovActionsState
  • pull-3670 - Validate previously enacted govAction
  • pull-3694 - Improve error reporting on the positive coin decoder
  • pull-3674 - Added RATIFY thresholds
  • pull-3684 - Add proposal delaying, remove predicate failure from ENACT
  • pull-3688 - DRep Refunds and update evalTransactionBalance

Improvements and releasing

  • pull-3677 - Minor patch that fixes the DRep distribution computation
  • pull-3686 - Post patch release fixup
  • pull-3695 - Changelog for cardano-node-8.3 release
  • pull-3683 - Add two new bench mark programs

Testing

]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[Network Team Update]]> + 2023-09-01-network + + 2023-09-01T00:00:00.000Z + + High-level overview of sprint 43

In this sprint, we received contributions from CF & Galois. Karl Knutsson +(CF) has addressed various issues regarding peer churning in P2P, timeouts +and our WireShark dissector. While the Galois developers focused on +addressing issues from their review last year. See below for more details.

We continued working on bootstrap peers ouroboros-network-#4661.

We refactored our test suites: they are split into io-tests which require to +be run natively on all platforms (these tests mostly contain tests that +require IO system calls) and sim-tests which are platform independent. We +run io-tests on all supported platforms (e.g. x86_64-linux, +x86-64-darwin, aarch64-darwin and x86_64-w64-mingw32 (Windows)) natively. +The sim-tests are not executed on Windows due to memory limitations on +GitHub Actions runners. ouroboros-network-#4653

We also started rebasing typed-protocols refactoring branches.

Marcin was appointed as the cardano-node release engineer for the 8.4.0-pre +version. So far he integrated cardano-ledger-conway-1.8 and +ouroboros-network-0.9.1.0 to ouroboros-consensus, cardano-cli and +cardano-api. Once we will have an integration branch for cardano-node, +cardano-ledger-conway-1.8 and ouroboros-consensus packages can be released +to CHaP and PRs can be merged once they go through review & CI.

We also fixed some smaller issues regarding peer sharing (both were discovered +by Karl from CF). More details are included below.

Progress on P2P addoption

SPO relays

There are currently ~2000 relays running P2P +enabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On +16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil +Ada.

P2P relays

The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

Data has been kindly provided by CF and their mainnet monitoring +infrastructure.

IOG relays

As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all +IOG relays will be running P2P.

Detailed description

In this sprint, we got a few contributions from CF:

  • Karl made peer churning mechanism less aggressive ouroboros-network-#4656; and
  • he added timeouts for idle states in ChainSync & KeepAlive +miniprotocols. These timeouts help a node remove idle connections from the +responder (server) side ouroboros-network-#4648.
  • he improved the WireShark dissector by adding support for the peer-sharing mini-protocol ouroboros-network-#4656.

Galois has been making progress in addressing some of the issues they raised in their review (last year):

Peer Sharing

  • Light peer sharing is only enabled when peer sharing is turned on ouroboros-network-#4652;
  • Handshake incorrectly reports peer sharing value. It's supposed to relay the +remote value, but instead, it returns the local value. ouroboros-network-#4642 (in review).

Async Demotion Test Fix

  • We fixed an async demotion test failure which turned out to be a weakness of +the test itself rather than a bug in the connection manager. ouroboros-network-#4655
]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[SRE Team Update]]> + 2023-09-01-sre + + 2023-09-01T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes
  • Work on a new capkgs repository started -- "Content Addressed Packages"
    • This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output
    • These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do
    • Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers

Lower level summary

Capkgs

  • Content addressed packages -- new repo: capkgs

Cardano-ops

  • Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: cardano-ops-compare

Cardano-parts

Cardano-perf

Cardano-world

Sanchonet-demo

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-08-29-node-cli-api + + 2023-08-29T00:00:00.000Z + + 2023-08-16 - 2023-08-29

High level summary

CLI is making progress towards phases 3 and 4 of SanchoNet.

  • Ability to create info, no-confidence and new committee governance actions.

  • Voting as DREP is possible now on the CLI

  • API is now using Ledger's PParams and VotingProcedures

  • Expose following queries from consensus:

    - GetGovState
    - GetDRepState
    - GetDRepStakeDistr
    - GetCommitteeState
    - GetConstitution

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-08-28-mithril + + 2023-08-28T00:00:00.000Z + + High level overview

The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of zstandard compression of the snapshot archive, and streaming its download and decompression in the client.

Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer.

Low level overview

  • Completed the issue Create explorer page with registered signers #1097
  • Completed the issue Simplify logs on the Signer/Aggregator #1106
  • Completed the issue Refactor (de)serialization of crypto entities #668
  • Completed the issue Mithril client last snapshot download #1078
  • Completed the issue Use the '/signers/registered' route to verify if a signer is registered #1152
  • Worked on the issue Provide progress information with '--json' option in Client #1095
  • Worked on the issue Use 'zstandard' compression for snapshot archives #876
  • Worked on the issue Make client download and extract the archive simultaneously #1115
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-08-25-hydra + + 2023-08-25T00:00:00.000Z + + High-level summary

This week, the Hydra team conducted the monthly review meeting for Agust,which +continously ensures transparent communication and project evaluation.

In terms of community engagement, the Hydra team gave a Hydra master-class at +RareEvo workshop as an educational initiative for the community. +Additionally, the team updated the Hydra demo and tutorial to include Mithril +and latest release changes.

They also focused on exploring the Hydra network resiliance in order to improve +hydra-node availability, as it becomes stuck very easily and that leads to a +bad user experience.

What did the team achieve this week

  • Hydra master-class at RareEvo workshop!
  • Monthly report & review meeting
  • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
  • Groomed network resilience and explorer features #188
  • New ADR for “Resourced based API” #1028

What are the goals of next week

  • Have a poc on network resilience working #188
  • Fix issue #931: “Chain state in head state not updated on replayed observation”
  • Fix issue #1039: "Close transaction dropped from cardano-node"
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-08-24-performance-and-tracing + + 2023-08-24T00:00:00.000Z + + High level summary
  • Benchmarking: Benchmarking node version 8.2.1 has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD.
  • Infrastructure: Our analysis pipeline has received improvements reducing memory footprint.
  • Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing.
  • Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.

Low level overview

Benchmarking

We've performed and analysed the benchmarks for the 8.2.1 version of cardano-node as part of our release benchmarking cycle.

Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths.

Infrastructure

As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held +in memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline.

Tracing

The next portion of optimizations has been completed and merged to master, getting rid of Haskell's native String representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by cardano-node.

The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup.

Nomad backend

The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster +and porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-08-23-consensus + + 2023-08-23T00:00:00.000Z + + High level summary

On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests. +On the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base.

UTxO-HD

  • We addressed the issues that came from the benchmarking and testing phase (see #314).
    • We fixed the operational-certificate update exception (#305).

Tech debt

  • We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see this branch).
  • We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see this branch).
  • We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see #275).
  • We decreased the flakiness for our test suite (#284).
  • We incorporated and merged the pull-request on query versioning (#273).
  • We started working on new performance-based regression tests for mempool operations.

Support

  • Nick Frisby continues with his engineer responsibilities. Notably getting the Consensus release out for node pre-release 8.3. Nick also began integrating it into downstream branches (cardano{-api,-cli,-node}). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-08-18-goedel + + 2023-08-18T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

Details

  • Development of an automated prover for showing conformance of +programs to state machines (as part of the mini-protocol framework)

  • Completion of the documentation of the (current state of the) +mini-protocol framework

  • Discussion about two DeltaQ lectures with two practical sessions as part +of 4th year masters course on distributed systemsby colleagues at UC +Louvain in the Autumn

  • Discussion about four DeltaQ lectures by colleagues at U. Bergen as part +of a 5th year Masters course in the Autumn

  • Adapted original DeltaQ implementation to the new typeclasses and +wrote property tests for its algebraic laws

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-08-18-hydra + + 2023-08-18T00:00:00.000Z + + High-level summary

This week, the Hydra team released version 0.12.0, a significant update that +brings support for cardano-node 8.1.2, along with performance enhancements and +various API improvements. Additionally, the team successfully onboarded a new +contributor who is now actively participating in operating a Hydra Head. They +took part in a meeting of the Intersect open source committee and prepared the +Hydra master-class for RareEvo, an educational initiative for the community.

If you happen to be at RareEvo, register for the Hydra master-class using this +form. +We hope to make it possible to follow along on-line as well and will announce +details on the Hydra announcements channel on the IOG discord +server.

What did the team achieve this week

  • Released version 0.12.0 which adds support for cardano-node 8.1.2, performance +and several API improvements. Release notes
  • Replaced commit via websocket with external draft + submit. #954
  • Onboarded new contributor to the point where he actively participates in operating a Head now.
  • Joined a first meeting of the Intersect open source committee
  • Prepared the Hydra master-class for RareEvo.

What are the goals of next week

  • Monthly review meeting
  • Run the Hydra master-class at RareEvo!
  • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
  • Clear out red bin items (technical debt)
  • Groom network resilience and explorer features
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-08-18-ledger + + 2023-08-18T00:00:00.000Z + + High level summary

The ledger team made great progress in advancing Conway era forward. In particular, voting +for DRep and Stake Pool Operators is now at the state that can be used by downstream +components. Addition of new ledger state queries makes it possible to verify changes to +the governance state, such as placement of votes, submission of governance proposals, +inspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the +ability to enact all of the governance actions, except for the hard fork initiation.

Low level summary

Conway progress

  • pull-3577 - Move PParams to GovState
  • pull-3609 - Adjust thresholds for sanchonet
  • pull-3604 - README: update CIP-1694 link
  • pull-3616 - Switch TreasuryWithdrawals to use RewardAcnt
  • pull-3599 - Add governance action well-formedness check
  • pull-3607 - Rename governance to gov
  • pull-3601 - Added DRep anchors
  • pull-3615 - Add optional previous GovActionId in some ProposalProcedures
  • pull-3596 - Upgradeable families
  • pull-3625 - Change constitution to use Anchor
  • pull-3592 - Added pulsing incremental computation of the DRep distribution
  • pull-3523 - Treasury donations
  • pull-3633 - Prevent state changes on phase2 failure
  • pull-3634 - Disable serialization of protocolVersion param update
  • pull-3630 - Implemented DRep refreshing
  • pull-3640 - Remove crypto parameterization from AnchorData
  • pull-3636 - Implement DRep ratification with an "always passing"; threshold
  • pull-3648 - Governance queries
  • pull-3650 - Change environment for ShelleyPOOLREAP rule
  • pull-3658 - Set DRep ratify threshold to 51%
  • pull-3628 - DELEG, POOL, GOVCERT conformance with Spec v0.8

Testing

Improvements and releasing

  • pull-3660 - Fix bounds and versions
  • pull-3661 - Adjust versions, bounds and CHANGELOGs to account for the latest release
]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[Network Team Update]]> + 2023-08-18-network + + 2023-08-18T00:00:00.000Z + + High-level overview of sprint 42

Eclipse Evasion

We merged and released a new version of the ouroboros-network package (version +0.9.0.0) which includes big ledger peers feature. +This is the primary peer selection mechanism to defend against eclipses. We +also prepared a PR to updated ouroboros-cosnensus +and ekg-forward packages.

CDDL specs for protocol codecs

We made the cddl spec for network codec more inline with the implementation +which is highly polymorphic. cddl doesn't have the notion of polymorphism, +but has any which can generate any valid cbor term. We matched it with an +Any type on the Haskell side and made all remaining tests & specs use it. +This simplified the specifications and made it easier to understand which parts +are defined in the spec, and which parts are left unspecified. See +ouroboros-network#4595.

Ouroboros-Network-Framework API changes

We also released ouroboros-network-framework and other network components. +The ouroboros-network-framework package contains a redesign of API exposed to +ouroboros-consensus. We consolidated, cleaned it and made it easier to +extend in the future if there will be new arguments that need to be passed to +mini-protocol initiator and responders which comes from the low-level network +layer.

Nix setup (CI)

We also made a major review of our nix setup. With help from our DevX team +we ended up with a clean flake.nix file which can:

  • compile & test the code on x86_64-linux, x86_64-darwin and aarch64-darwin
  • cross-compile to Windows on x86_64-linux

And provides a shell which contains all the build tools, including ghc-9.6, +hls, cddl, and more. See ouroboros-network#4640, +ouroboros-network#4643.

Other contributions

Cardano Network Service Assurance

  • The work and writeup in finishing up the CNSA, first stage (first +contract).
  • Getting Sam Cowger (Galois Inc) up to speed.
  • The IOG Networking team carried a reivew of CNSA project progress: a limitted +code & design review.

Galois Review

Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues

scoping, requirements, and getting started.

CI

We added a nightly run for GitHub actions and made the GitHub actions test be +executed with extra concurrency ouroboros-network#4637, ouroboros-network#4649.

We also added GitHub's dependabot ouroboros-network#4650.

Bootstrap Peers

We settled on implementation design of bootstrap peers which is being +implemented, ouroboros-network#4615.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[SRE Team Update]]> + 2023-08-18-sre + + 2023-08-18T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Sanchonet and shelley-qa environments were updated to 8.2.1-pre.
  • Work on two new repos utilizing flake parts for cardano cluster generation, automation and operation.

Lower level summary

Cardano-ops

Cardano-parts

Cardano-perf

Cardano-playground

Cardano-world

Inputs-check

  • A flake parts module to check input closure sizes recursively for optimization considerations: inputs-check
]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Crypto Team Update]]> + 2023-08-17-crypto + + 2023-08-17T00:00:00.000Z + + High level summary

The open fronts that the crypto team is working on are:

  • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
  • mithril: Full node verifier
  • musig2: Include MuSig2 description in cryptography handbook
  • kes_agent: Finilising test and CI. Working on KES binary

Low level summary

Mithril

  • Full Node Verifier merged #939.

MuSig2

  • Started describing MuSig2 to include it as part of the cryptography handbook

Sidechains

  • Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in this fork.

KES agent

  • KES agent is ready:
    • CI ready #19
    • Receipt confirmation message #20
    • KES agent binary ready #21
    • Control client implemented #11
]]>
+ + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
+ + <![CDATA[DB-sync Team Update]]> + 2023-08-17-db-sync + + 2023-08-17T00:00:00.000Z + + High level summary

We have integrated many new Conway feutures and allow db-sync to sync sanchonet. +We also continued testing and improving the new db-sync options.

Lower level summary

  • Conway integration +#1484
  • Support for Sanchonet +#1476
  • Stake distribution is computed earlier +#1484
  • Deposit ledger events are now used. This reduces the db queries and makes syncing faster +#1484
  • Testing new db-sync options +#1466
  • Added support for ghc-9.6 +#1479
  • Tech debt: improve exceptions +#1471
]]>
+ + Kostas Dermentzis + https://github.com/kderme + + +
+ + <![CDATA[SECP bindings Security Issue Report]]> + 2023-08-17-secp-issue + + 2023-08-17T00:00:00.000Z + + Security Issue Report: SECP256k1 bug

Date Occurred: July 15, 2022 +Severity: Potentially Very High if exploited on Mainnet +Authors: Iñigo Querejeta Azurmendi

Date of Report: August 17, 2023

Summary of Issue

Criticality Level

Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet +Context

New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains. +How was the Issue Detected

The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there.

What Action was Taken

The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod). +Fixes were applied to prevent the use of the primitives. +A full security audit was carried out on the bindings. +The rollout of the primitives was postponed to a new hard fork (Valentine)

Potential Effect

The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction.

Actual Effect

  • Delay to the Vasil hard-fork
  • Temporary removal of SECP256k1 primitives
  • Additional hard-fork to introduce SECP256k1 primitives

Ongoing Mitigations Needed, if any

None

Responsibility for Mitigations

Core team

Detailed description of Incident

New Plutus secp256k1 cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet.

The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing.

  • This is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an expected structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely.
  • The same happened with the Schnorr verification function. It takes as input a SECP256k1_xonly_pubkey, which is again an opaque structure that holds a parsed and valid public key.

The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated.

The fix was addressed in this PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts.

Recommendations

  • Check all new Plutus bindings for correct use.
  • Audit all new Plutus built-in bindings.
  • Continue to develop specific End-to-End tests for all new Plutus features.
  • Do not assume that any existing library functions are "safe". Treat all external calls circumspectly.
]]>
+ + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-08-15-node-cli-api + + 2023-08-15T00:00:00.000Z + + 2023-08-02 - 2023-08-15

High level summary

  • cardano-node 8.2.1 (pre-release) to SanchoNet
  • Continue moving CLI into era-based top level command structure
  • Wire-up DREP key generation,
  • Fix DREP deregistration certificates
  • Implement Constitutional Committee Key generation on the CLI
  • Introducing era-based protocol parameters on the API
  • Removing depracated functions and types on the API

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

Fix broken links in docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-08-11-hydra + + 2023-08-11T00:00:00.000Z + + High-level summary

This week, the Hydra team updated hydra-node to support cardano-node version +8.1.2, ensuring compatibility with the latest mainnet release. The team also +participated in discussions about a "cardanonical" JSON schema and added it as a +submodule to the project, contributing to improved data modeling and +interoperability.

In terms of community engagement, the team successfully onboarded a new +contributor, also participated in a RareEvo Twitter space, and continued +preparations for the Hydra master-class.

What did the team achieve this week

  • Updated dependencies to support cardano-node 8.1.2 #1007
  • Engaged in discussions about a cardanonical json schema and +add it as submodule to the project +#1013
  • Onboarded a new contributor to the hydra project (@locallycompact)
  • Joined RareEvo twitter space and continued preparation of hydra master-class

What are the goals of next week

  • Update & streamline tutorial to work with latest version of hydra-node
  • Remove the internal commit functionality #954
  • Release 0.12.0
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-08-11-performance-and-tracing + + 2023-08-11T00:00:00.000Z + + High level summary
  • Benchmarking: We've concluded benchmarking node version 8.2.0.
  • Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration.
  • Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.

Low level overview

Benchmarking

As part of our release benchmarking cycle, we've completed and analysed the runs for the 8.2.0 version of cardano-node. In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version.

Tracing

A significant amount of optimizations for the new tracing system has finally been merged to master. At the moment, +we're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding +insight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward.

Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing.

Nomad backend

The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent +and reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were +able to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks.

A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to master.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-08-10-mithril + + 2023-08-10T00:00:00.000Z + + High level overview

The Mithril team completed the Mithril protocol’s mainnet beta launch: the release-mainnet network is now consistently producing new certificates and snapshots! The team has released a new distribution 2331.1 which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the mainnet infrastructure.

Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network.

Low level overview

  • Released the new distribution 2331.1
  • Completed the epic Release 'mainnet' Mithril network #918
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Completed the issue Design & implement basic stress test tool for aggregator - phase 1 #991
  • Worked on the epic Post deployment 'mainnet' infrastructure #1091:
    • Completed the issue Create Production Infrastructure Runbook #1085
    • Completed the issue Ingest 'mainnet' metrics/logs in Grafana #1122
  • Worked on optimizations:
    • Completed the issue Add a 'clean' file to extracted database in client #1131
    • Worked on the issue Create explorer page with registered signers #1097
  • Worked on refactoring:
    • Worked on the issue Refactor (de)serialization of crypto entities #668
  • Worked on bugs:
    • Completed the issue Client fails to unpack some snapshot archive #1137
    • Completed the issue The 'release-preprod' network stopped producing certificates #1114
    • Completed the issue The 'release-mainnet' network does not show up in the explorer #1111
  • Worked on dependencies:
    • Completed the issue Upgrade Cardano node to '8.1.2' #1090
  • Worked on troubleshooting:
    • Completed the issue Signer can't sign with 'Invalid signature for party' error #1125
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-08-09-consensus + + 2023-08-09T00:00:00.000Z + + High level summary

This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of fs-sim and fs-api, and released strict-checked-vars.

UTxO-HD

  • Rebased UTxO-HD on top of node 8.2 (issue)
  • Address new Maybe translations for UTxOs in Conway 1.6. (PR).
  • Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory.
  • Fixed an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully.
  • Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running QueryUTxOByAddress (PR).
  • Measured the speed of QueryUTxOByAddress under different queryBatchSize values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution.
  • Refactored and implemented ledgertable-related classes for the general HardforkBlock.

Genesis

  • Frisby and Esgen continue to engage with the Researchers on grinding against the Genesis design.

Fostering collaboration

  • Drafted a document explaining versioning of local state queries #273.

Support

  • Frisby is the release engineer this cycle.
  • Successfully created work-in-progress ouroboros-consensus and cardano-api commits that integrate the 2023 Aug 7 tip of cardano-ledger. This will require a release of ouroboros-consensus, which hasn't happened yet.
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Crypto Team Update]]> + 2023-08-04-crypto + + 2023-08-04T00:00:00.000Z + + High level summary

The open fronts that the crypto team is working on are:

  • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
  • mithril: Full node verifier
  • musig2: Finalised the missing fuzz tests
  • kes_agent: engineer on PTO. Work halted

Low level summary

Mithril

  • Work on a mithril flaky test #1105
  • Keep working on Full Node Verifier #939. +Should be merged in the coming week.

MuSig2

  • Finalised the fuzz tests #43

Sidechains

  • Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.
]]>
+ + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-08-04-goedel + + 2023-08-04T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is formalising mini protocols and also further developing the +performance modelling prototype.

Details

  • Developing new framework for specification and verification of +mini-protocols which is closer to the Haskell implementation.

  • Developed a new internal representation for the DeltaQ algebra that +allows for more modularity in backend implementations

  • Discussions regarding the Cardano networking specification

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-08-04-hydra + + 2023-08-04T00:00:00.000Z + + High-level summary

This week, the Hydra team achieved notable progress in various aspects of the +project. The team updated the use case section for auctions on the /unstable +branch of the website, improving the understanding of Hydras applicability.

From the development side, the team successfully completed event-sourced +persistence, a key enhancement in the projects architecture which improves +off-chain transaction processing performance. They also added a +submit-transaction endpoint to the API.

In addition to project-related progress, the team actively engaged in community +reviews for several catalyst proposals related to Hydra and Mithril, +contributing to the wider Cardano ecosystem.

Finally, the full report for the month of July was also published here.

What did the team achieve this week

  • Published the monthly report for July
  • Updated the use case section for auctions (published on /unstable branch)
  • Completed event sourced persistence #913
  • Added a submit-transaction endpoint to the API #966
  • Community reviews for several catalyst proposals related to Hydra and Mithril
  • Created a network testing tool (hydra-net) #1006

What are the goals of next week

  • Update hydra-node to work with cardano-node version 8.x
  • Remove the internal commit functionality
  • Release version 0.12.0
  • Update & streamline tutorial to work with latest version of hydra-node
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-08-04-ledger + + 2023-08-04T00:00:00.000Z + + High level summary

The ledger team was working almost exclusively on the Conway era implementation. In +particular, the main focus was directed towards solidifying transaction related types and +their binary representation. We also directed some effort into unblocking Plutus team with +respect to PlutusV3 integration.

Low level summary

Conway progress

  • pull-3552 - Allow Constitutional Committee Hot Key to be ScriptHash
  • pull-3581 - Make Constitutional Committee Cold Key to be ScriptHash
  • pull-3571 - Implement a portion of the TICKF rule.
  • pull-3556 - Add Script to Constitution
  • pull-3576 - Add optional Anchor to ConwayRegDRep certificate
  • pull-3495 - Implement refund logic for Proposal deposits
  • pull-3579 - Change voting procedure in the transaction to a nested Map
  • pull-3585 - Rename CommitteeCert into a GovCert
  • pull-3587 - Remove DelegStakeTxCert from the COMPLETE pragma for TxCert
  • pull-3586 - Add CurrentTreasuryValue to TxBody
  • pull-3588 - Rename key roles
  • pull-3557 - Update NewCommittee action to use RewardAcnt and add more info
  • pull-3595 - Add ConwayUpdateDRep constructor to ConwayTxCertGov type
  • pull-3600 - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway
  • pull-3597 - Update ProposalProcedure return address to be a RewardAcnt

Testing

  • pull-3374 - New features for generation subject to constraints
  • pull-3519 - Basic Conway features test

Bugfixes

Plutus integration

  • issue-3538 - A fairly complete specification was created for the PlutusV3 context
  • pull-3593 - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality

Improvements and releasing

  • pull-3574 - Improve clarity and performance of collateral Non-ADA validation:
  • pull-3573 - Update top-level CHANGELOG.md with cardano-node relevant changes
  • pull-3555 - Bump pygments from 2.12.0 to 2.15.0 in /doc
  • pull-3575 - Bump certifi from 2022.12.7 to 2023.7.22 in /doc
  • pull-3567 - Backport mint field translation bugfix
  • pull-3568 - Fixed typo in byron ledger spec
  • pull-3572 - Release/backport tickf bugfix
]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[Network Team Update]]> + 2023-08-04-network + + 2023-08-04T00:00:00.000Z + + High-level overview of sprint 41

24th July - 6th August 2023

We started the implementation of bootstrap peers. Bootstrap peers are designed +to provide a safety guarantee for nodes joining the network while still taking +advantage of the distributed network for nodes that are synced. This will be +an intermediate step before Genesis which will allow for further distribute the +system. The bootstrap peers will be run by some trusted partners like CF, +Emurgo or IOG. They are primarily designed for leaf nodes (e.g. full node +wallets), which often end up syncing and require access to the honest chain. See +ouroboros-network#4615 for a more detailed implementation plan.

Other contributions

We started to use nothunks library to discover if we have any unevaluated +thunks which can lead to memory leaks ouroboros-network#4633. We found +a small one in the peer metric component of the P2P networking stack. Fixing +it put us on a small detour of fixing the API of the strict-checked-vars +package: cardano-base#431, cardano-base#432, as well as adding NFData +instance to io-classes. We also improved nothunks +library to make debugging easier and we provided a NoThunks instance for +ThreadId which we will need in the future (see nothunks#33).

We released a new version of io-classes (version 1.2.0.0) and related +packages to Hackage.

We addressed all review comments on the eclipse evasion PR which introduces big +ledger peers, ouroboros-network#3886.

We fixed how SIGHUP signal handlers are registered, so it's not possible to +shutdown a node which was starting while trying to update network topology, +see cardano-node#5421.

I didn't mention that in the previous update, so here it goes: in the previous +sprint we released ouroboros-network-0.8.2.0 and +ouroboros-network-framework-0.7.0.0.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-08-04-performance-and-tracing + + 2023-08-04T00:00:00.000Z + + High level summary
  • Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version 8.2.0.
  • Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing.
  • Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6.
  • Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.

Low level overview

Benchmarking

The 8.2.0 version of cardano-node required adjustment of some of the sanity checks that are part of our benchmarking +cluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version.

Tracing

The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint +when using it as default for a running node.

A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any +inconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node. +This feature adds another layer of robustness to the whole system.

Infrastructure

A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler +versions. We've future-proofed our benchmarking code.

Nomad backend

The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend +accordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant.

The validation phase is ongoing. We were able to perform successful runs and analyses for various 8.x node versions, including 8.2.0-pre. With parallel runs on the current cluster, we hope to measure the same effects we've observed with the +nomad backend - which will be a big step towards production use.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[SRE Team Update]]> + 2023-08-04-sre + + 2023-08-04T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent updates or improvements include:

  • Preprod and preview envionments were updated to 8.1.2.
  • Sanchonet and shelley-qa environments were updated to 8.2.0-pre.
  • Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.

Lower level summary

Cardano-ops

Cardano-perf

Cardano-world

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-08-01-node-cli-api + + 2023-08-01T00:00:00.000Z + + 2023-07-19 - 2023-08-01

High level summary

  • Release of Node 8.2.0
    • Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694.
    • This release is phase 1 of the SanchoNet roll out
    • Allows SPOs to vote on changes to the on-chain constitution.
    • Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag.
    • Updates to the networking packages prepare the road for peer sharing.
  • cardano-cli and cardano-api continue to integrate Conway era features
  • Continue refactoring of cardano-testnet

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Network Team Update]]> + 2023-07-31-network + + 2023-07-31T00:00:00.000Z + + Network Update (Sprints 39 & 40)

The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away. +It was great to see and talk to so many of the community members.

Sprint 39 (Jun 26 - Jul 09)

Major changes

Now the following list of traces will be turned on by default:

node-to-client protocol
  • LocalConnectionManagerTracer
  • LocalInboundGovernor
  • LocalHandshake
  • LocalServer
node-to-node protocol
  • Server

See cardano-node#5353. This will be released in node-8.2.0.

We made sure that cardano-client-0.1.0.x library (which is db-sync) is not using the experimental node-to-client protocol. +The cardano-client-0.2.0.0 was not affected. +See ouroboros-network#4612.

We merged the dynamic block production feature to ouroboros-consensus (also available in the cardano-node-8.2.0 release). +Dynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes. +See ouroboros-network#3159, [ouroboros-consensu#140].

We continued to review the implementation of big ledger peers for eclipse evasion, see ouroboros-network#4462.

Minor changes

Sprint 40 (Jul 09 - Jul 23)

Major changes

We integrated ouroboros-network-0.8.2.0 with the master branch of cardano-node for the 8.2.0 release (the version match between ouroboros-network and cardano-node is purely accidental). +This includes:

  • integration with dynamic block production feature. +This feature is documented in the following PR.
  • Warm valency for local root peers (see below).

For the full list of features included in the 8.2.0 release from the network side, please take a look at the pre-release nodes.

We improved the memory footprint of peer metrics measured by the P2P stack. +Peer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation). +See ouroboros-network#4620. +The improvement will be available in cardano-node-8.2.0.

We added an optional explicit warm valency to local root peers of the P2P topology file. +Previously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to. +The hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones. +Warm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses. +See ouroboros-network#4575, cardano-node#5409.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-07-28-hydra + + 2023-07-28T00:00:00.000Z + + High-level summary

During this week, the Hydra team achieved significant progress in various areas. +They conducted the monthly review meeting for July, which continously ensures +transparent communication and project evaluation. The team migrated the core +logic of the node to an event-sourced architecture and incremental writes of +events to persistence, enhancing the projects performance and maintainability. +Furthermore, the team added the ability to read protocol parameters via the API +and fixed the CI workflows to support pull requests from forks of external +contributors, streamlining the development process for community involvement.

What did the team achieve this week

  • Held the monthly review meeting for July (recording)
  • Migrate the core logic of the node to an event-sourced architecture #999
  • Updated persistence to faster incremental writes of events #1000
  • Added ability to read protocol parameters via API #735
  • Fix CI workflows to support pull requests from forks of external contributors #993
  • Updated to GHC 9.2.8 #1005
  • Prepared an updated use cases section on https://hydra.family (published with next release)

What are the goals of next week

  • Publish monthly report
  • Complete user transaction submission work #966
  • Remove commit from internal wallet (deprecated) #954
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-07-27-mithril + + 2023-07-27T00:00:00.000Z + + High level overview

The Mithril team launched Mithril protocol’s mainnet beta: the release-mainnet network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch.

They have released a new distribution 2329.0, which is running on the release-mainnet network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator.

Finally, they have worked on enhancing the documentation for onboarding SPOs and setting up a Mithril signer, and fixing installation bugs of the binary artifacts produced in the CI.

Low level overview

  • Created the dev blog post Mithril Protocol’s Mainnet Beta Launch
  • Released the new distribution 2329.0
  • Closed the epic that prepares the Mithril infrastructure for mainnet #767:
    • Completed the issue Deploy 'mainnet' infrastructure #988
    • Completed the issue Handle Secrets management #989
  • Worked on the epic Release 'mainnet' Mithril network #918
    • Completed the issue Prepare SPO on-boarding guide #1049
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Worked on the issue Design & implement basic stress test tool for aggregator #991
  • Worked on optimizations:
    • Completed the issue Enhance the configuration of Mithril relay #1080
    • Completed the issue Remove legacy store adapters from aggregator #1053
    • Completed the issue Add a 'sign' sub-command to 'genesis' command in aggregator #1081
  • Worked on refactoring:
    • Worked on the issue Refactor (de)serialization of crypto entities #668
  • Worked on documentation:
    • Completed the issue Enhance 'Run a Mithril Signer node (SPO)' guide #1055
  • Worked on bugs:
    • Completed the issue Shared library error in CI binaries #1073
    • Completed the issue Debian package does not install cleanly on older ubuntu versions #834
    • Completed the issue Aggregator panics with new (de)serialization of 'ProtocolVerificationKey' #1083
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-07-26-consensus + + 2023-07-26T00:00:00.000Z + + High level summary

The db-sync team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now. +We also focused on completing tracing support for UTxO-HD in cardano-node. +Currently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further.

The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ChainSync client as part of the onboarding efforts for the team that will implement Genesis.

The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team.

Genesis liaising

Improvements to the ChainSync client:

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-07-21-hydra + + 2023-07-21T00:00:00.000Z + + High-level summary

This week, the Hydra team updated the specification to align with recent +off-chain protocol changes, completed refactoring the snapshot emission +in preparation for event-sourced protocol logic, and updated to GHC +9.2.7, resulting in improved compile times and slightly smaller Plutus +scripts.

What did the team achieve this week

  • Updated the specification to match the recent off-chain protocol +changes to complete +#728
  • Refactored the snapshot emission logic in preparation for event +sourced protocol logic.
  • Updated to GHC 9.2.7, which led to improved compile times and +slightly smaller plutus scripts.

What are the goals of next week

  • Monthly review meeting next wednesday and July report
  • Reflect latest information onto our roadmap.
  • Actual implemention of event-sourced persistence +#913.
  • Update the use cases section on https://hydra.family
  • Remove deprecated internal commit +#954.
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-07-21-ledger + + 2023-07-21T00:00:00.000Z + + High level summary

Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet. +All members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era. +We also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release). +Additionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available. +We also made progress on the constraint-based generators, which can now generate valid transactions and ledger states.

What we achieved

  • [pull-3521] [pull-3554] Improved Governance model (GovernanceProcedures, ProposalProcedure)
  • [pull-3520] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert )
  • [pull-3531] Refactored and simplified code interacting with Plutus
  • [pull-3558] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix.
  • [pull-3550] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed.
  • [pull-3551] [pull-3546] [pull-3472] Updated tools and added some small improvements
  • [issue-3146] [pull-3498] Introduced Conway protocol parameters
  • [issue-2948] [pull-3499] Implemented ConwayGenesis with the new protocol parameters

What is currently in progress

]]>
+ + Alexey Kuleshevich + https://github.com/lehins + + +
+ + <![CDATA[SRE Team Update]]> + 2023-07-21-sre + + 2023-07-21T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements and general environment maintenance.

Some notable recent improvements include:

  • Re-spin sanchonet for testing a new node version followed by fork to Conway
  • Deploying a sanchonet compatible faucet to sanchonet
  • Migrate shelley qa legacy environment to cardano-world

Lower level summary

Cardano-node

Cardano-ops

  • Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: cardano-ops-compare

Cardano-world

Iohk-nix

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-07-20-goedel + + 2023-07-20T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

The team is working on formalising mini protocols, the performance +modelling prototype and also finishing off their ICE papers.

Details

  • Formalization of the chain synchronization mini-protocol in the +thorn calculus

  • Final pre-publication steps for ICE 2023 papers

  • Developing approach for specification and verification of +mini-protocols

  • Started work on porting the DeltaQ framework to a new, more concrete +backend based on piecewise-polynomials

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-07-18-node-cli-api + + 2023-07-18T00:00:00.000Z + + 2023-07-05 - 2023-07-18

High level summary

  • Integrate Conway certificates in cardano-api
  • Prepare cardano-cli and cardano-api for cardano-node 8.1.2
  • Tagged cardano-cli 8.3.0.0
    • Query for the hash of the constitution (Conway)
    • Ability to create votes and governance actions
  • Tagged cardano-cli 8.3.1.0
    • Make it build with ghc-9.6
  • Upgrade to optparse-applicative-fork-0.18.1.0 for parsing command line options

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-07-14-hydra + + 2023-07-14T00:00:00.000Z + + High-level summary

This week the team focused on exploring the event sourced persistence in order +to improve hydra-node performance. Because of this work the team noticed we +need to refactor the emit snapshot emission logic and update the spec in the +light of new changes. They also took the time to revisit their goals and product +plans for the next quarter as well as doing some security fixes related to +multisignatures.

What did the team achieve this week

  • Finished spike about performance improvements of event sourced persistence #963.
  • Refactor snapshot emission in protocol logic.
  • Revisited our roadmap and goals.
  • Prepared and conducated a learning session on lean-waste.
  • Improve security of multi-signature checks, see this Github security advisory.
  • Implemented a cache friendly way to version our binaries #962.

What are the goals of next week

  • Implement Event sourced persistence #913.
  • Remove deprecated internal commit #954 and close #728.
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + + Sasha Bogicevic + https://github.com/v0d1ch + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-07-13-mithril + + 2023-07-13T00:00:00.000Z + + High level overview

The Mithril team created a new 2327.0 distribution. They focused on preparing the beta launch on the mainnet: they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the mainnet infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library.

Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs.

Low level overview

  • Released the new distribution 2327.0
  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Completed the issue Add infrastructure monitoring #987
    • Worked on the issue Deploy 'mainnet' infrastructure #988
    • Worked on the issue Handle Secrets management #989
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Worked on the issue Design & implement basic stress test tool for aggregator #991
  • Worked on optimizations:
    • Completed the issue Remove certificate hash from Artifact #932
    • Completed the issue Check vulnerabilities in CI #1037
    • Completed the issue Add 'created_at' in Mithril Stake Distribution messages #1030
    • Completed the issue Add a 'run-only' option in end to end test #1048
  • Worked on refactoring:
    • Completed the issue Factorize protocol crypto operations #669
    • Completed the issue Refactor aggregator dependency injection and services #1058
    • Completed the issue Build static binaries in CI #874
  • Worked on documentation:
    • Completed the issue Prepare SPO on-boarding guide #1049
    • Completed the issue Add instructions to set firewall using iptables #1040
    • Completed the issue Update ufw command to set firewall on Mithril Signer installation instructions #1041
  • Worked on bugs:
    • Completed the issue Aggregator does not detect certificate chain epoch gap #952
    • Completed the issue 'testing-preview' network does not create certificates #1015
    • Completed the issue SQLite compatibility in aggregator #837
    • Completed the issue Q&A followup fixes #1035
    • Completed the issue E2E tests are flaky in CI #1023
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-07-12-consensus + + 2023-07-12T00:00:00.000Z + + High level summary

This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a proposed fix. The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine.

The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility.

On the support front, the team drafted an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load.

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-07-12-performance-and-tracing + + 2023-07-12T00:00:00.000Z + + High level summary
  • Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed.
  • Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends.
  • Tracing: Optimization of the new tracing system is ongoing and yielding good performance results.
  • Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.

Low level overview

Benchmarking

Our analysis of the GHC9 build of cardano-node has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation.

In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into cardano-node. This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle.

Infrastructure

We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in master.

Tracing

Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance.

Nomad backend

For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run.

Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to master.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Crypto Team Update]]> + 2023-07-07-crypto + + 2023-07-07T00:00:00.000Z + + High level summary

The open fronts that the crypto team is working on are:

  • Sidechains: First version of snark-based ATMS
  • mithril: Full node verifier
  • kes_agent: Keep progress, and prepare CIP and CPS
  • CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP

Low level summary

kes_agent

Mithril

  • Final review of the implementation of Full Node Verifier #939. +Included benchmarks and further tests.

Sidechains

  • Schnorr signature implemented
  • ATMS signature implemented
  • First benchmarks show that for the committe size we expect, we need 2^21 constraints.

CIPs and community

  • Addressed some review comments in #PR506
  • Worked with the communityt on #PR524 to include Keccak as part of the next Plutus release.
]]>
+ + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-07-07-goedel + + 2023-07-07T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the teams have been working on finalising their ICE papers +for publication in EPTCS, formalising concensus, and investigating chain +sync.

Details

  • Preparing final versions of ICE papers

  • Reviewing the chain sync design and documentation

  • Refactoring the thorn calculus

  • First draft of Praos specification

  • Developing bounding factors on timeouts

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-07-07-hydra + + 2023-07-07T00:00:00.000Z + + High-level summary

This week the Hydra team accomplished some nice progress. They secured the +network layer further by implementing authentication of the messages between the +peers in the Head protocol. In the process they also managed to separate +HeartBeat messages from the protocol ones which somewhat improved the quality of +code in Hydra. The team also finished work related to sending only transaction +ids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark +publishing on the website.

What did the team achieve this week

What are the goals of next week

  • Spike on performance improvements of event sourced persistence #913
  • Add new endpoint for submitting client transactions
  • Remove commit from internal wallet
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + + Sasha Bogicevic + https://github.com/v0d1ch + + +
+ + <![CDATA[SRE Team Update]]> + 2023-07-07-sre + + 2023-07-07T00:00:00.000Z + + High level summary

The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance.

Some notable recent improvements include:

  • Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment
  • Explorer component updates
  • Spongix caching server rewrite for R2 Cloudflare support and various performance improvements

Lower level summary

Cardano-node

Cardano-ogmios

Cardano-ops

  • Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: cardano-ops-compare

Cardano-rosetta

Cardano-world

Spongix

  • Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: spongix-simple-branch
]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Developer Experience Update]]> + 2023-07-06-developer-experience + + 2023-07-06T00:00:00.000Z + + High level summary

The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements.

Lower level summary

build support & maintainance

The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions.

compiler upgrades

Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests.

Hydra Tools

Our repository, input-output-hk/actions, has seen quite some improvements to facility the hydra <-> github integration.

haskell.nix

Haskell.nix has been maintained and updated with the addition of preliminary GHC 9.8 support.

devx

The devx repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our actions/devx GitHub Actions, we have a consistent set of tooling for

  • nix develop shells
  • GitHub CodeSpaces integration
  • VSCode DevContainer support
  • GitHub Actions integration

upstream tooling

Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

]]>
+ + Moritz Angermann + https://github.com/angerman + + +
+ + <![CDATA[DB-sync Team Update]]> + 2023-07-04-db-sync + + 2023-07-04T00:00:00.000Z + + High level summary

We've made progress in all high level objectives

  • CIP-1694 integration design
  • UTxO-HD integration proof of concept
  • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested
  • Many devx issues resolved

Lower level summary

  • We have improved and validated the design for the Conway integration in db-sync
  • Improved the initial integration of the UTxO-HD feauture branches which are under test
  • Prepared a new release 13.1.1.3 which supports node 8.1.1 +#1455.
  • This also fixes a bug +#1451
  • Added new tests to the new tx_out options +#1429
  • Fixed a chronic issue in db-sync related to exception handling and concurrency +This fixes many other issues and simplifies the logic in db-sync +#1447
  • A number of fixes and improvements in ci, docker, devx, docs +#1436#1442#1448#1452
]]>
+ + Kostas Dermentzis + https://github.com/kderme + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-07-04-node-cli-api + + 2023-07-04T00:00:00.000Z + + 2023-06-21 - 2023-07-04

High level summary

  • Started integration of conway era into the cardano-api,
  • Pre-release of cardano-cli 8.2.1 which enables creating goveranance "Update constitution" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.
  • Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities.
  • Continue refactoring cardano-testnet
  • CI and docs house keeping on the new cardnao-cli and cardano-api repositories

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-06-30-hydra + + 2023-06-30T00:00:00.000Z + + High-level summary

This week, the Hydra team wrote and published the monthly report for June, +implemented the end-to-end functionality for external commits, and tested it on +the preview environment. They also listed Hydra as a tool on the Cardano +developer portal, providing more visibility for the project. The team clarified +the path forward for L2 protocol improvements and explored an alternative CI +approach using cabal instead of nix. Additionally, they released version 0.11.0, +marking another milestone in the projects development.

What did the team achieve this week

  • Written and published the monthly report for June
  • Implemented external commits end-to-end incl. tested it on preview #215
  • Listed Hydra as a tool on cardano developer portal
  • Cleared up path forward on L2 protocol improvements #728
  • Established an alternative CI using more cabal tools #923
  • Release version 0.11.0

What are the goals of next week

  • Spike on performance improvements of event sourced persistence #913
  • Complete ReqSn only sends transaction ids #728
  • Groom and plan last items for 0.12.0 (remove internal commit)
  • Improve reliability of benchmarks
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-06-29-mithril + + 2023-06-29T00:00:00.000Z + + High level overview

The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano mainnet infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator.

Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1.

Low level overview

  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Worked on the issue Add infrastructure monitoring #987
  • Completed the epic Prepare Mithril Signer deployment model for SPO #862:
    • Completed the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
    • Completed the issue Adapt infrastructure to use Mithril Relay #1018
    • Completed the issue Announce the new signer deployment model in a dev blog post #1017
  • Worked on the epic Benchmark performances of Mithril Aggregator #904:
    • Worked on the issue Design & implement basic stress test tool for aggregator #991
  • Worked on bugs:
    • Completed the issue Aggregator does not exit on critical error #993
    • Completed the issue Computation of master certificate of an epoch is incorrect #1006
    • Completed the issue End to end tests are flaky #954
    • Worked on the issue 'testing-preview' network does not create certificates #1015
  • Worked on optimizations:
    • Completed the issue Dates format is not standardized #946
    • Completed the issue Add 'recompute-certificates-hash' command to aggregator #1001
    • Completed the issue Add a retry mechanism for artifact creation in aggregator #984
    • Completed the issue Log node version at startup in Aggregator/Signer #944
    • Completed the issue Reactivate Publish Results job in CI #978
    • Completed the issue Clean 'pending_snapshot' directory of aggregator #983
    • Completed the issue Update OpenAPI spec examples #1000
  • Worked on refactoring:
    • Completed the issue Refactor 'MithrilStakeDistribution' entity #967
    • Completed the issue Refactoring client #982
    • Completed the issue Refactor download code in client #1010
    • Worked on the issue Factorize protocol crypto operations #669
  • Worked on dependencies:
    • Completed the issue Upgrade Cardano node to '8.1.1' #973
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-06-28-consensus + + 2023-06-28T00:00:00.000Z + + High level summary

During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team.

The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components.

Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node.

Genesis

  • We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.

  • We decided on an approach of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team.

UTxO-HD

  • We merged the last of the PRs that were part of UTxO-HD improvements for version 0.1: expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size.
  • We added a new "legacy" cardano block in a new ouroboros-consensus-cardano-legacy-block package that should ease the transition for some downstream packages to UTxO-HD, like db-sync. This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block.
  • We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-06-28-performance-and-tracing + + 2023-06-28T00:00:00.000Z + + High level summary
  • Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9.
  • Infrastructure: The first batch of refactoring and documentation for our tx-generator has been merged to master.
  • Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown.
  • Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.

Low level overview

Benchmarking

The compiler switch to GHC9 as the default build platform for cardano-node and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard.

Using the forge-stress approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node.

Infrastructure

The tx-generator is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to master. Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base.

Tracing

The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue.

Nomad backend

With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress.

Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-06-23-goedel + + 2023-06-23T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the teams presented two papers at ICE 2023.

Details

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-06-23-hydra + + 2023-06-23T00:00:00.000Z + + High-level summary

This week, the Hydra team shared progress updates during the monthly review +meeting (monthly report and video recording available soon) and started +experimenting on preview network with the new commit from external wallet +feature.

What did the team achieve this week

  • Monthly report & review meeting, demonstrating commit from external +wallet
  • Published regular benchmarks for +Hydra
  • Moved forward the journey for external commits using multiple script UTxOs +#903
  • Changed the API to only put transaction id in snapshots, instead of the full +transactions #922 -> this +is now evolved into fully addressing #728
  • Fuel marking is now optional as one can now commit from an external wallet +#924
  • Add flag option to display node version on tui +#934

What are the goals of next week

  • Complete external commits using multiple script UTxOs #903
  • New release 0.11.0
  • Dirtroad solution of improved persistence performance #913
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + + Pascal Grange + https://github.com/pgrange + + +
+ + <![CDATA[Network Team Update]]> + 2023-06-23-network + + 2023-06-23T00:00:00.000Z + + Network Update

Key contributions

We held a series of session to review the implementation of big ledger peers +(eclipse evasion). See #4462.

We get a request from a 3rd party to clarify an inconsistency between CDDL spec +and protocol implementation. We worked out a nice solution which takes +advantage of the any notion available in CDDL. On the Haskell side we +provide Any type which gen generate almost any CBOR term (some are excluded +only because they are not decoded back to the same form, and we relay on that +property). See #4580.

We fixed a bunch of problems of the cardano-cli ping command. It also now has +a limited support of node-to-client mini-protocol (the -c option is +ignored, as it cannot be supported by node-to-client protocol). Note that +the format of messages has changed, timestamps are printed in ISO8601 format. +See #4601, #5326, #5313, #30

In order to provide a new flag in the topology file which enables ledger peers +when the chain is close to the tip, we continued to work on #4530. This is +currently in review, the consensus team will need to provide us with the new +api. This feature is useful for two reasons: makes it easier to maintain +a topology file, it will also limit the traffic on public roots generated by +for example full node wallets and distribute it to ledger peers.

We also continued to work on a blog post which describes the journey of design +& implementation of the dynamic P2P network layer. Too be announced soon :).

Other smaller changes

We limit the concurrency of resolving dns names. Up to 8 root peers or ledger +peers DNS names are resolved concurrently, and at most 2 local root peer DNS +names. See #4596.

We fixed handshake query timeout in #4603.

We renamed one of the block-fetch decision constructors as requested by the +consensus team, see #4608.

]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[SRE Team Update]]> + 2023-06-23-sre + + 2023-06-23T00:00:00.000Z + + High level summary

The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:

  • A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality
  • Cardano Sanchonet environment was stood up to test Conway era functionality
  • Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case
  • Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments

Lower level summary

Cardano-node

  • Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: cardano-node-pull-5318

Cardano-ops

Cardano-world

Ci-ops

Ci-world

  • Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ci-world-compare

Devx-ci

  • A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: devx-ci-repo

Iohk-nix

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-06-16-hydra + + 2023-06-16T00:00:00.000Z + + High-level summary

This week, the Hydra team focused their efforts on continuing to investigate and +experiment operating a head on mainnet. They collected several bugs and issues +and worked on fixing them. Now the team is soon to release a new version, +0.11.0, which comes with a lot of improvements and bug fixes.

What did the team achieve this week

  • Restored and fixed a bug which stalled our head on mainnet #927
  • Solved one user issue #914
  • Reduced significantly local state size and logs by removing the full scripts from it #928
  • (pending review) Reduced snapshot size in the API, by only including tx ids #922

What are the goals of next week

  • New release 0.11.0
  • Monthly report & review meeting.
  • Fix some minor bugs discovered when operating our head on mainnet
  • Complete journey for external commits using multiple script UTxOs #903
  • Publish benchmarks and provide regular benchmarks for Hydra #186
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-06-15-mithril + + 2023-06-15T00:00:00.000Z + + High level overview

The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client’s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet.

Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI.

Low level overview

  • Completed on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the issue Create the sub-command for 'Mithril Stake Distribution' in client #896
    • Completed the issue Adapt end to end tests to handle new types of data #899
    • Completed the issue Update client documentation #897
    • Completed the issue Update architecture documentations for new types of data #898
    • Completed the issue Refactoring client #960
  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Completed the issue Enhance terraform infrastructure #930
  • Completed the epic that implements the computation of the stake distribution for mainnet #880:
    • Completed the issue Check performance impact of new stake distribution command on the 'mainnet' #962
  • Worked on the epic Prepare Mithril Signer deployment model for SPO #862:
    • Worked on the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
  • Worked on bugs and optimizations:
    • Completed the issue Aggregator does not always detect new immutable file #953
    • Completed the issue CI tests fail with Rust '1.70.0' #958
    • Worked on the issue End to end tests are flaky #954
    • Worked on the issue Certificate dates in metadata are not on the same timezone #946
    • Worked on the issue Refactor 'MithrilStakeDistribution' entity #967
    • Completed the issue Fix 'Mithril Client multi-platform test' with new client interface #956
    • Completed the issue Enhance 'ImmutableDigesterError::NotEnoughImmutable' error #969
    • Completed the issue Client 'snapshot download' command fails with option '--download-dir' #979
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-06-14-consensus + + 2023-06-14T00:00:00.000Z + + High level summary

The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the Byron and TPraos eras do not need to be checkpointed for an MVP. +There is one remaining question (which applies also to the Praos era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated "Limit on Patience" timeout sufficiently bounds how long the adversary can inflate a victim's overall sync time.

On the UTxO-HD front, the prototype branch was rebased on top of the latest ouroboros-consensus main branch and integrated on top of cardano-node 8.1.1-pre. As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD. +We managed to run a node again with UTxO-HD enabled. +We also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for cardano-node, which uncovered a performance regression on the Network component when using GHC-9.2/9.4. This is being addressed.

Regarding our support activities, we Released fs-sim-0.2.0.0 and are in the process of preparing the 8.2 release of cardano-node. We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests.

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-06-14-performance-and-tracing + + 2023-06-14T00:00:00.000Z + + High level summary
  • Benchmarking: We've continued release benchmarking and established a new baseline for 8.0.0.
  • New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined.
  • Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.

Low level overview

Benchmarking

In our release benchmarking cycle, we established a new performance baseline for 8.0.0. Additionally, we've measured +performance under various workloads for 8.1.1-pre; the results look promising and validate the optimization efforts +done on several system components.

In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for +benchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper.

Tracing

The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be +meaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific +trace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles.

Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD.

Nomad backend

As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs.

This means the backend is entering validation phase, where we systematically compare all metrics taken from the new +infrastructure to the existing ones, including determining reproducibility and variance.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Network Team Update]]> + 2023-06-12-network + + 2023-06-12T00:00:00.000Z + + Network Update

Key contributions and advances

We merged light peer sharing feature, which allows to include inbound peers +into outbound governor known peers. This is the primary way for new +unregistered nodes to enter the network, which then can be shared using peer +sharing. Note that peer sharing is an experimental feature which is disabled +until genesis & eclipse evasion as fully implemented. See #3596.

We are making progress reviewing eclipse evasion, #3886.

We fixed another bug in local root peers. We found out that if the local roots +where ignored until the first domain name was resolved, see #4583. The bug +fix was backported and released in ouroboros-network-0.8.1.1.

We re-started working on dynamically enabling block forging to address issue +#3159, which will enable us to release P2P on block producing nodes. See #140.

New cardano-ping / cardano-cli ping release

We prepared a new release of cardano-ping library which supports the new +query feature (query supported versions). See #4589, #4593 and #5313. +The new version of cardano-cli ping will use ISO8601 formatted +timestamps; also the formatting of ping results is slightly improved, and it +will introduce the new --query-versions (-Q) switch. If the remote site +supports the query parameter, the command will print:

redacted-ip:port network rtt: 0.064
redacted-ip:port handshake rtt: 0.064010896s
redacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat
orAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]

otherwise it will print the negotiation results

redacted-ip:port network rtt: 0.045
redacted-ip:port handshake rtt: 0.101867615s
redacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder

Note that in that case cardano-cli ping offers InitiatorAndResponder, which +allows us to detect whether the remote side is an InitiatorOnly or +InitiatorAndResponder. Also cardano-cli ping will no longer announce +itself as InitiatorAndResponder, except for the case mentioned above.

Other smaller contributions

On a request from the Marlow Team, we published haddocks of typed-protocols, +which are now available here (#40, #41).

We made a new release of strict-stm-1.1.0.1 on Hackage, which fixed a bug in +package description file, #101 .

We also helped to debug a deadlock when using named pipes on Windows in the new +RawBearer API. The API is being used to store secret keys only in memory. +The PR #4395 is under review.

We also have two more PRs which are under review:

  • #4530: enabling ledger peers on a fixed number of slots before the tip of the chain;
  • #4580: a PR which fixes inconsistencies in one of our cddl specs.
]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Crypto Team Update]]> + 2023-06-09-crypto + + 2023-06-09T00:00:00.000Z + + High level summary

The open fronts that the crypto team is working on are:

  • cardano-base: E2E tests for BLS bindings and KES agent
  • Sidechains: Implement ECC chip and Rescue hash primitives for ATMS
  • mithril: Full node verifier

Low level summary

cardano-base

  • RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); blocked due to issue with windows' localSnocket. Trying to resolve.
  • Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors #317.
  • Above, blocked by the simplification of typeclasses #404.
  • Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings

Mithril

  • Implementation of Full Node Verifier #939

Sidechains

  • ECC chip implemented for JubJub over BLS12-381
  • Rescue chip implemented for hashing.
  • Currently working on Schnorr signature (which uses the above constraints)
]]>
+ + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
+ + <![CDATA[Developer Experience Update]]> + 2023-06-09-developer-experience + + 2023-06-09T00:00:00.000Z + + High level summary

The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements.

Lower level summary

build support & maintainance

Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure LoadDLL errors to blst integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like cardano-base experiencing significant reductions in CI complexity.

compiler upgrades

After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility.

CHaP (cardano-haskell-packages)

We relocated the underlying tooling, (foliage), for CHaP into the IOG organization. Furthermore, we have introduced improved tooling to quickly add constraints to packages, better error reporting for add-revision and better hackage url compatibility to facilitate easer usage of CHaP.

GitHub Actions

Our repository, input-output-hk/actions, now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the base and haskell install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking cabal.

iohk-nix

The iohk-nix repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, sodium, blst, and secp256k1, are also fixed to certain revisions within the iohk-nix repository.

haskell.nix

Haskell.nix has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to gmp.

devx

The relatively new devx repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The devx repository's readme has been updated to reflect its purpose and usage guidelines.

upstream tooling

Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

]]>
+ + Moritz Angermann + https://github.com/angerman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-06-09-hydra + + 2023-06-09T00:00:00.000Z + + High-level summary

This week, the Hydra team worked on multiple fronts. They finished the +investigation about the broken head on mainnet and re-opened their persistent +head instance. The team also fixed the monthly report publication on their +website and started sketching ideas and further improvements. Also, they are on +the last mile to deliver a new feature which will allow parties to commit funds +from extern wallets. Finally the team started to work on optimizing the +performance on their benchmarks.

What did the team achieve this week

  • Finished investigation on broken head on mainnet #897 and re-opened it.
  • Added support for externally committing regular utxo #887
  • Fix monthly report publication on docs website and published the monthly report. Odd problems when publishing monthly report:
    • Make us think about if we should change something about the website #908
    • Open issue to docusaurus #9036
  • Fixed a bug in the benchmark process #910
  • Explored performance of the hydra-node{.verbatim} and identified a +bottleneck.
  • Timed transaction feature is being used by the auction project 🎉

What are the goals of next week

  • Complete performance analysis and start/plan improvements and provide +regular benchmarks for Hydra #186
  • Add hydra as tool to developer platform #872.
  • Authenticate network messages #727.
  • Complete journey for external commits using multiple script UTxOs #903
  • Start implementing Option B for external commits #215.
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[DB-sync Team Update]]> + 2023-06-08-db-sync + + 2023-06-08T00:00:00.000Z + + High level summary

We've made progress in all high level objectives

  • CIP-1694 integration design
  • UTxO-HD integration proof of concept
  • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2
  • A new hire will help us with devx issues.

Lower level summary

]]>
+ + Kostas Dermentzis + https://github.com/kderme + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-06-08-goedel + + 2023-06-08T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on giving and preparing public +talks, also on preparing final versions of their ICE 2023 papers, and +on analysing chain selection.

This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

Details

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[SRE Team Update]]> + 2023-06-08-sre + + 2023-06-08T00:00:00.000Z + + High level summary

The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer.

Lower level summary

Bitte

  • Equinix bare metal capability was added to bitte: bitte-pull-194
  • Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: bitte-pull-201

Bitte-cells

Cardano-graphql

Cardano-node

Cardano-ops

Cardano-world

Ci-ops

  • Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ci-ops-pull-108

Ci-world

Cicero

  • Implement a cicero webhook backoff with exponential decay plus jitter: cicero-pull-79

Iohk-nix

Openziti

]]>
+ + John Lotoski + https://github.com/johnalotoski + + +
+ + <![CDATA[System Test Team Update]]> + 2023-06-08-system-test + + 2023-06-08T00:00:00.000Z + + High level summary

Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.7 and 8.0.0 releases.

Workstreams

Full list of closed PRs

Framework improvements:

  • Make cardano-submit-api REST API service available and run corresponding regression tests by default
  • Update cabal build testing for 8.0.0
  • Add support for testing governance SPO poll
  • Use Poetry for Python dependency management
  • Check status of known GH issues during tests runtime and finish the test accordingly
  • Generate topology files with both IP addresses and DNS names
  • Log issues like failure to start a cluster instance and report errors during tests runtime

Testing improvements

  • Add rollback testing:
    1. global consensus is reached after rollback, in situation where less than securityParam blocks were produced since cluster split
    2. global consensus is not reached when more than securityParam blocks were produced, and the result is permanent fork
  • Add tests to governance SPO poll commands

Node:

DB-Sync:

  • improvements in db-sync sync tests
  • improvements in db-sync functional tests
]]>
+ + Martin Kourim + https://github.com/mkoura + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-06-07-node-cli-api + + 2023-06-07T00:00:00.000Z + + 2023-06-07 - 2023-06-20

High level summary

  • Completed cardano-cli migration to input-output-hk/cardano-cli
  • cardano-cli ping now uses cardano-ping-0.2.0.5
  • New queries on API:
    • queryCurrentEpochState
    • queryDebugLedgerState
    • queryGenesisParameters
    • queryPoolDistribution
    • queryPoolState
    • queryProtocolParameters
    • queryProtocolParametersUpdate
    • queryProtocolState
    • queryStakeAddresses
    • queryStakeDistribution
    • queryStakePoolParameters
    • queryStakeSnapshot
  • Deprecate:
    • queryPparams
  • Export query API as functions
    • genFeatureValueInEra
    • featureInShelleyBasedEra
    • isFeatureValue
    • valueOrDefault
    • asFeatureValue
    • asFeatureValueInShelleyBasedEra
    • queryEpoch
    • requireShelleyBasedEra
  • Restructure cardano-testnet (WIP)

cardano-cli

cardano-api

cardano-node

cardano-testnet

docs

CI & project maintenance

]]>
+ + Carlos LopezDeLara + https://github.com/CarlosLopezDeLara + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-06-02-hydra + + 2023-06-02T00:00:00.000Z + + High-level summary

This week, the Hydra team has put their effort on finding solutions on many +different problems, such as our broken head on mainnet +#897, our fragile monthly +report publications on the website and implementing Option A for +external commits #215. +Although most of these items are still open, huge progress has been made. To +accelerate the investigation, they improved their logging to give more precise +errors when a transition requirement fails, and to reduce duplication on effets +logged content. Last but not least, the team is exploring formal methods and +attended a workshop on formalizing cryptographic protocols in Agda.

What did the team achieve this week

  • Continued investigating broken head and opened an issue to keep track #897.

    As part of this issue, improvements were made to the node logs:

    • Give a precise error when a transition requirement fails #895.

    • Reduce duplication for effects logged content by using sequential eventId and effectId pair #896.

  • Fixed references in the hydra specification #893.

  • Attended a workshop on formal methods and crypto in Agda.

What are the goals of next week

  • Investigate and re-open our team-internal head on mainnet.
  • Improve and provide regular benchmarks for Hydra #186.
  • Complete journey for external commits implementing Option A and start implementing Option B #215.
  • Authenticate network messages #727.
  • Add hydra as tool to developr platform #872.
  • Fix monthly report publication on docs website.
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-06-01-mithril + + 2023-06-01T00:00:00.000Z + + High level overview

The Mithril team released a new 2321.1 distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots.

Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks.

Low level overview

  • Released the new distribution 2321.1
  • Worked on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the issue Enhance MessageAdapter for Artifact in aggregator REST API #925
    • Completed the issue Create the sub-command for 'Cardano Immutable Files Full' in client #895
    • Completed the issue Enhance state machines Aggregator/Signer #933
    • Completed the issue Adapt the aggregator REST API to list certificates #892
    • Worked on the issue Adapt end to end tests to handle new types of data #899
    • Worked on the issue Update client documentation #897
    • Worked on the issue Update architecture documentations for new types of data #898
  • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
    • Worked on the issue Enhance terraform infrastructure #930
  • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
    • Completed the issue Upgrade Cardano node to '8.0.0' #920
  • Completed the issue Add export path in Client CLI #512
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-05-31-consensus + + 2023-05-31T00:00:00.000Z + + High level summary

During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see this issue). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain.

On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano.

UTxO-HD

  • We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking SOP classes like HPure and HAp . In short, we implement generalised versions of important classes like Applicative and Traversable.

Support

  • fs-sim-0.1.0.2 and fs-api-0.1.0.2 were released, which makes them now compatible with GHC up to 9.6.
  • ouroboros-consensus-0.7.0.0 was released for cardano-node 8.1, including query serialization fixes for backwards compatibility.
]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-05-31-performance-and-tracing + + 2023-05-31T00:00:00.000Z + + High level summary
  • Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster.
  • New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism.
  • Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.

Low level overview

Benchmarking

The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build +configuration: As it stands, the ghc-bignum package is using the Haskell native-backend as a default. We strive +to benchmark a build with the gmp-backend next.

A variant of our forge-stress local benchmark has been set up to serve as an early indicator for the resource usage profile +we'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way +shorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great +support when evaluating different compiler versions or RTS flags incrementally.

Tracing

The hub of the new tracing system cardano-tracer is designed with a fixed output behaviour, which is limited to various +logging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to +directly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all.

Nomad backend

We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with +job definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing +benchmarking run required us to fine-tune communications with the nomad server.

Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible +and offers more detailed insight than the previous iteration in cardano-ops. The backend will enable you to formulate +very specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met.

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-05-26-goedel + + 2023-05-26T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

Details

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-05-26-hydra + + 2023-05-26T00:00:00.000Z + + High-level summary

This week, the Hydra team accomplished several important tasks. They held their +monthly review meeting and drafted the report for May. They made progress on +implementing the first end-to-end journey for external commits using "Option A" +for normal UTxOs, while still considering "Option B". The team also integrated a +Spanish translation contributed by the community, created micro-benchmarks for +transaction validation and deserialization, and made improvements to +hydra-node's version reporting. Last but not least, they implemented the ability +to commit multiple UTxOs to a head at once.

What did the team achieve this week

  • Held the monthly review meeting (recording + slides) & drafted the report for May.
  • Have a first end-to-end journey for external commits implementing Option A +for normal UTxOs #887 (still considering Option B).
  • Integrated the spanish translation #866.
  • Created micro-benchmarks for transaction validation and deserialization #884.
  • Improve hydra-node version reporting on non-released builds #849
  • Some minor CI improvements following up last weeks changes.
  • Allow commit transactions with multiple UTxO #774.

What are the goals of next week

  • Investigate and re-open our team-internal head on mainnet.
  • Improve and provide regular benchmarks for Hydra #186.
  • Complete external commits with script UTxOs #215.
  • Authenticate network messages #727.
  • Add hydra as tool to developr platform #872.
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-05-26-ledger + + 2023-05-26T00:00:00.000Z + + High level summary

The ledger team made progress on the conway ledger era. In particular, the design and implementation +of the new certificates is near complete, we refactored some of our data structures +to be able to support DReps, we cleaned up the serialization format, and renamed things to make +clearer the differences with Shelley.

The team also completed integration work for the next node release, namely 8.1.0. +And, as always, we continue to address technical debt.

Low level summary

Conway progress

  • pull-3408 - Improve conway delegation certificates
  • pull-3428 - Get rid of Constitutional in favor of Genesis and Committee
  • pull-3426 - Add DRep to internal data struture (UMap)
  • pull-3425 - Improve witness logic needed for conway
  • pull-3423 - Rename ShelleyDelegCerts constructors to distinguish them from Conway
  • pull-3421 - Rename DCert -> TxCert
  • pull-3454 - conway CDDL minor fixes

Improve testing

  • pull-3403 - Add Plutus script context golden tests

Integration work

  • pull-3410 - Update chaps index
  • pull-3416 - Bump cardano-ledger-alonzo-test version
  • pull-3414 - Bump cardano-ledger-shelley-test minor version
  • pull-3420 - Bump cardano-ledger-shelley-ma-test version
  • pull-3441 - Release cardano-ledger-[alonzo|babbage]-1.2.1

Technical debt

  • pull-3409 - Unit test - no such thing as a reference datum
  • pull-3407 - Fixup release process documentation
  • pull-3404 - Create TotalDeposits events during all eras
  • pull-3402 - Fix broken references in the Shelley spec
  • pull-3424 - Remove no longer used cardano-ledger-shelley-ma package
  • pull-3432 - Add an example on how to bump up versions in the changelog
  • pull-3440 - Revert back to the group serialization for ProtVer for PParams
]]>
+ + Jared Corduan + https://github.com/JaredCorduan + + +
+ + <![CDATA[Network Team Update]]> + 2023-05-26-network + + 2023-05-26T00:00:00.000Z + + High level summary

We continued working on eclipse-evasion. We also analysed and fixed a bug +when using DNS names in local root peers. We continued working on engineering +blog post about P2P. We released a new version of packages for +cardano-node-8.1.0 release.

We improved our CI, removed obsolete scripts add extra validation which checks +if CHANGELOG.md files were updated.

We also improved release scripts.

Detailed summary

  • Eclipse evasion: #4462
  • Local root peers bug fix: #4559
  • Release to CHaP: #4573
  • CI improvements: #4572
  • Release script improvements: #4573
]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-05-24-node-cli-api + + 2023-05-24T00:00:00.000Z + + 2023-05-24 - 2023-06-06

High level summary

  • The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released.
  • We provided assitance where needed in the release
  • An integration repository https://github.com/input-output-hk/fusion-flamingo was created to enable my team to more easily work on cardano-cli and cardano-api

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

]]>
+ + Jordan Millar + https://github.com/Jimbo4350 + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-05-19-hydra + + 2023-05-19T00:00:00.000Z + + High-level summary

This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the "Coding Standards" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.

What did the team achieve this week

  • Complete validation of timed transactions feature #196.
  • Write ops instructions and troubleshooting #569 and improve logs.
  • Remove --ledger-genesis argument to hydra-node options #863.
  • Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows #877.
  • Use nix to build test binaries to increase CI speed #867.
  • Updated our Coding Standards.

What are the goals of next week

  • Monthly report & review meeting.
  • Have a first end-to-end journey for external commits implementing "Option A" #215.
  • Integrate spanish translation #866.
  • Improve and provide regular benchmarks for Hydra #186.
  • Allow commit transactions with multiple UTxO #774.
  • Explored stateless observation and refined hydra explorer ticket #696.
]]>
+ + Franco Testagrossa + https://github.com/ffakenz + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-05-17-consensus + + 2023-05-17T00:00:00.000Z + + High level summary

During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the [Genesis][#genesis] section for more details.

Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our main branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain.

We improved our tooling by releasing an immutable DB server, which can be used for testing and benchmarking purposes, and a db-truncater program, which can be used in disaster recovery and benchmarking scenarios.

Genesis

The consensus team working on Genesis:

  • Improved the genesis selection rule as a result of our interaction with IO Research.
  • Studied how the hard-fork combinator handles forecasting at era transitions, and improved our documentation.
  • Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP.
  • Elaborated concrete proposal for the Genesis State Machine.
  • Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).

The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine.

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-05-17-mithril + + 2023-05-17T00:00:00.000Z + + High level overview

The Mithril team released a new 2318.0 distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types.

Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node 8.0.0 (along with the backward compatibility for previous 1.35.x versions).

Low level overview

  • Worked on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the handling of multiple types of signed entity in the aggregator runtime #907
    • Completed the adaptation of the signer runtime to use the signable builder service #854
    • Completed the adaptation of the aggregator runtime to use the artifact builder service #869
    • Completed the appending of the next AVK to all protocol messages #888
    • Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced #893
    • Completed the adaptation of the explorer to handle new artifact routes of the aggregator #927
  • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
    • Completed the implementation of the new stake distribution computation in the chain observer #919
    • Worked on upgrading the Cardano node to 8.0.0 #920
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-05-17-performance-and-tracing + + 2023-05-17T00:00:00.000Z + + High level summary
  • Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes.
  • New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due.
  • Analysis pipeline: First steps on implementing incremental analysis have been untertaken.
  • Open Sourcing: Exhaustive dataflow charts for both our analysis tool locli and our workbanch have been merged to master
  • Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster.
  • P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland.
  • Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.

Low level overview

Benchmarking

As a compiler switch to GHC 9.2.7 for cardano-node's default build environment is around the corner, we're setting up our benchmarking cluster to +handle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This +also involves choosing a reliable baseline as reference point for inter-version comparisons.

Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet, +we strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to +be balanced against resource demand for all our cluster's nodes.

Tracing

For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some +quality-of-life details that have changed required us to revision the system documentation.

Analysis

As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been +normally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a +huge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken.

Open Sourcing

A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking +copmonents more accessible. As a result, detailed charts for both our LogObject CLI locli and our workbench have been merged to master.

Nomad backend

While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting +those profiles of our workbench that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality +of the nomad cloud backend.

Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster.

Performance & Tracing Meetup

We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive +days together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future. +Also, it was a great opportunity to finally meet in person.

Offboarding

Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation +of team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!

]]>
+ + Michael Karg + https://github.com/mgmeier + + +
+ + <![CDATA[Crypto Team Update]]> + 2023-05-12-crypto + + 2023-05-12T00:00:00.000Z + + High level summary

The open fronts that the crypto team is working on are:

  • cardano-base: Include final tests for BLS signature. Further adaptations for KES agent.
  • Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.

Low level summary

cardano-base

Sidechains

  • Opened PR in halo2curves to include BLS12-381 and JubJub, #38
  • Addition constraint over JubJub merged #10
]]>
+ + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
+ + <![CDATA[Goedel Team Update]]> + 2023-05-12-goedel + + 2023-05-12T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

High level summary

This sprint the team had two paper accepted for ICE 2023 +(https://www.discotec.org/2023/ice). The event will be held in Lisbon +on 19th June 2023. The papers will be published in EPTCS.

Details

]]>
+ + James Chapman + https://github.com/jmchapman + + +
+ + <![CDATA[Hydra Team Update]]> + 2023-05-12-hydra + + 2023-05-12T00:00:00.000Z + + High-level summary

This week, the Hydra team achieved a number of milestones, including the release +of the first mainnet compatible version. Besides this they also addressed +inconsistencies in rollback handling, added an architecture page to the website, +reducing the size of logs using event IDs. They also had productive discussions +with researchers on plans for incremental commits/decommits and had a whiteboard +session on DeFi and lending protocols. The goals for next week include +completing the validation of the timed transactions feature, exploring stateless +observation, refining the Hydra explorer ticket, writing ops instructions and +troubleshooting, and implementing the first end-to-end journey for external +commits.

What did the team achieve this week

  • Released first mainnnet compatible version 0.10.0
  • Addressed inconsist handling of rollbacks #784
  • Added architecture page and fixed haddock links on our website #838
  • Opened a new hydra head on mainnet
  • Talked with researchers on initial plan for incremental commits/decommits
  • Had a Whiteboard session on DeFi and lending protocols
  • Reduced size of logs using event ids #859
  • Published the monthly report for April

What are the goals of next week

  • Complete validation of timed transactions feature #196
  • Explored stateless observation and refined hydra explorer ticket #696
  • Write ops instructions and troubleshooting #569 and improve logs
  • Have a first end-to-end journey for external commits implemented #215
]]>
+ + Sebastian Nagel + https://github.com/ch1bo + + +
+ + <![CDATA[Network Team Update]]> + 2023-05-12-network + + 2023-05-12T00:00:00.000Z + + High level summary

We started working on a new way to switch between root & ledger peers (see +below). We continued to work on eclipse-evasion. We merged changes to +Handshake contributed by Galois Inc. We made improvements to our tests (fixed +a flaky test, added cddl specs for NodeToNodeVersionData and +NodeToClientVersionData). We improved our CI and automated the process of +releasing new package version to CHaP.

Detailed summary

We continued to work on testing eclipse-evasion.

We came up with an idea to limit how full node wallets relay on root peers +(currently operated by IOG, in future also CF and Emurgo). We designed +a switch to use ledger peers if the node tip is close enough to the current +time. For more details see #4530.

We merged changes to the handshake mini-protocol which allow one to query +server's node-to-node / node-to-client parameters. We are grateful to +Galois Inc. for implementing it, #4256 and #4538. We published new version +of packages to CHaP chap-#253.

We added DiffusionError wrapper. Thanks to it, ouroboros-consensus will +not duplicate diffusion errors messages in the log, #4537.

We fixed an issue which caused one of our tests to be flaky, #4515.

We added cddl tests for NodeToNodeVersionData and NodeToClientVersionData: +#4540, #4544 (in review).

We wrote scripts which will help us release packages as well as verify that we +released all the package necessary to build the newest set of packages, +#4542.

We renamed the consensus startup tracer and make sure it doesn't log +ExitSuccess exceptions, consensus-#71.

We reviewed PR which adds RawBearer API, #4395.

We made series of improvements to our CI:

  • #4539: we don't need to install cryptographic libraries in CI;
  • #4545: Javier Sagredo (consensus) cleaned up CI after consensus moved +to a new repo;
  • #4546: we switched to use GitHub merge queues;
  • #4549: we made it possible to trigger building haddocks manually;
  • #4553: we fixed and enhanced caching of building dependencies.
]]>
+ + Marcin Szamotulski + https://github.com/coot + + +
+ + <![CDATA[Ledger Team Update]]> + 2023-05-05-ledger + + 2023-05-05T00:00:00.000Z + + High level summary

The ledger team focused mainly on the conway ledger era and node integration. +For conway, we completed a large structural change that now allows +for delegation certificates to be parameterized by era, and introducing +new certificates for the first time since Shelley. +We also continue to build out our contraint based generators that we will +use to property test the conway era. +In particular, we can now generate an entire ledger state and a +transaction which is balanced with respect to the ledger state.

Low level summary

Conway certificates

Certificiates are now abstracted as a type family in the ledger codebase. +Moreover, there are new certificates in the Conway era to support CIP-1694, +and MIR certificates have been removed.

Constraint based testing

Our plan for property testing in the conway era is to no longer use the trace generators, +but instead generate ledger states and transactions based on constraints. +We hit a milestone this week, namely the ability to generate a balanced transaction in the context +of a ledger state, all based on our ever growing constaint language.

Integration work

Technical debt

]]>
+ + Jared Corduan + https://github.com/JaredCorduan + + +
+ + <![CDATA[Node API & CLI Team Update]]> + 2023-05-05-node-cli-api + + 2023-05-05T00:00:00.000Z + + 2023-05-05 - 2023-05-23

High level summary

  • Golden tests for cardano-cli command help output were added.
  • Documentation was updated with new libsodium installation instructions.
  • There were several updates for the cardano-cli:
    • Deletion of the deprecated shelley command group.
    • Addition of golden tests for CLI help.
    • An improvement to avoid bare IO in tests, allowing better error reporting in failed tests.
    • Generation of UTCTime test values without leap seconds (avoids erroneous test failures)
    • Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32.
  • The cardano-api underwent multiple refinements:
    • Implementing deposit handling when balancing transactions (necessary for Conway)
    • Cleaning up socket file path code.
  • Several changes were made to the cardano-testnet:
    • Adding golden tests for cardano-testnet help.
    • Removing all hardcoded yaml files in cardano-testnet
    • Improving cardano-testnet help output.
    • Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.

docs

CI & project maintenance

Developer experience

cardano-cli

cardano-api

cardano-node

cardano-testnet

]]>
+ + Jordan Millar + https://github.com/Jimbo4350 + + +
+ + <![CDATA[Mithril Team Update]]> + 2023-05-04-mithril + + 2023-05-04T00:00:00.000Z + + High level overview

The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version 1.35.7.

Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain.

Low level overview

  • Worked on the epic that designs and implements generic signing/verification of entity services #780:
    • Completed the implementation of the Certifier service in the aggregator #850
    • Completed the implementation of the signable builder for the Mithril Stake Distribution #851
    • Completed the implementation of the artifact builder for the Mithril Stake Distribution #870
    • Completed the implementation of the signable builder for the Full Immutables Snapshot #852
    • Completed the implementation of the artifact builder for the Full Immutables Snapshot #871
    • Completed the adaptation of the aggregator runtime to use the signable builder service #853
    • Worked on the adaptation of the signer runtime to use the signable builder service #854
    • Completed the definition of the entity service interface for verification/restoration #868
    • Completed the refactoring of the OpenMessage type #878
  • Completed the epic that simplifies the multi-signer in the aggregator #398:
    • Completed the extraction of the single signature registration from the multi-signer #643
  • Completed the upgrade of the Cardano node to version 1.35.7 #881
  • Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators #873
]]>
+ + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
+ + <![CDATA[Consensus Team Update]]> + 2023-05-03-consensus + + 2023-05-03T00:00:00.000Z + + High level summary

During the past two weeks we made some important progress in the Genesis design. +It seems the BlockFetch logic need not be modified for Genesis, although this +needs to be confirmed. We started a DoS mitigation handbook and updated our +conceptual component diagram to guide the Genesis design. We engaged with the +IOG researchers to work on the Limit on Patience attack vector, work in this +area is still ongoing. We sketched a design to decouple the CPU load of the node +from its responsiveness to the socket. Finally, we discussed with Networking our +approach to lower the performance impact of the BlockFetch decision logic, and +got green light from them.

We migrated the consensus code to a new +repository, splitting +it from the ouroboros-network repository, and released version 0.6 of +Consensus.

We also merged the mempool fairness improvement to main branch.

Another significant enhancement to our documentation was the addition of an +explanation of the hardfork combinator forecast horizon.

See the sections below for more details.

Genesis

We reviewed the BlockFetch design documentation, and added some source-code +comments that emphasize certain properties of the decisions the BlockFetch +logic makes that are helping us confirm that Genesis does not require any +changes to BlockFetch. We are waiting on input from our former system +architect to verify this.

We migrated and updated the conceptual component diagram in the ouroboros-consensus +repository which helps us situate the Genesis design and argument.

We engaged with the IOG researchers about the Genesis design. We sketched out a +way to address the concern that the Limit on Patiente (LoP) attack vector duty +cycle is indeed low, but it's still non-trivial to ultimately conclude it's +sufficiently low.

We also sketched a design to decouple the CPU load of the node from its +responsiveness to the socket, since the LoP is a relatively tight timeout, and +node performance bugs inducing seconds-worth of latency are unfortunately +familiar phenomena.

Fostering collaboration

We added an +explanation of +a question that we had to explain many times about the exact behavior of the +hardfork combinator forecast horizon.

]]>
+ + Damian Nadales + https://github.com/dnadales + + +
+ + <![CDATA[Performance & tracing update]]> + 2023-05-03-performance-and-tracing + + 2023-05-03T00:00:00.000Z + +
  • Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.
  • New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint.
  • Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on.
  • Infrastructure: The plutus-apps flake input for cardano-node has finally been removed.
  • Nomad backend: A PR implementing placement of benchmarking clusters has been merged.
  • Benchmarking

    The performance investigations on the 8.0 release branch have lead to pinpointing and addressing incosistent behaviour. For that, +we created yet another local reproduction with the workbench's forge-stress benchmark.

    Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into 8.0 and +subsequent releases.

    Additionally, we've refined the trace-bench family of profiles that target benchmarking our own new tracing system.

    Tracing

    Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally +intended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant +conversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system.

    Infrastructure & Analysis

    Dataflow documentation

    The LogObject CLI locli is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate +further development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting.

    Remove redundant Plutus flake input

    This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input, +we simplify the dependency graph for cardano-node, as well as enable immediate feedback when developing Plutus benchmarks.

    Nomad backend

    Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking. +This capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along +with various quality-of-life improvements, has been merged to master.

    ]]>
    + + Michael Karg + https://github.com/mgmeier + + +
    + + <![CDATA[DB-sync Team Update]]> + 2023-05-01-db-sync + + 2023-05-01T00:00:00.000Z + + High level summary

    Lower level summary

    • Prepared a schema change which is expected to speed up queries and help clients +#1389.
    • Ran a big number of benchmarks on the above to evaluate if this change is reasonable.
    • Performance optimization related to rewards +#1382
    • Using the cache in more places to reduce recourses usage +#1380
    • Evaluated risks related to UTXO-HD integration
    • Worked on a feauture request to split the tx_out to an address table +#1396
    • Worked on another feauture request to prune the consumed entries from the tx_out table +#1398
    • Prepared for CIP-1694 integration
    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-04-28-crypto + + 2023-04-28T00:00:00.000Z + + High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library.
    • KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction.
    • Sidechains: Started implementing ECC chip of JubJub over BLS12-381.

    Low level summary

    cardano-base

    • #255 finally merged 🎉
    • Additional tests for BLS bindings #384
    • Open PR for including test vectors created with zkscrypto's library, PR#397

    KES agent

    • Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period PR#389.
    • Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) #317.
    • Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim
    • Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes
    • Refactor MonadSodium into MonadMLock PR#388.

    Sidechains

    • Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)
    • Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Goedel Team Update]]> + 2023-04-28-goedel + + 2023-04-28T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is working on porting an existing formalisation of Ouroboros +Praos to a newer foundation.

    Details

    ]]>
    + + James Chapman + https://github.com/jmchapman + + +
    + + <![CDATA[Network Team Update]]> + 2023-04-28-network + + 2023-04-28T00:00:00.000Z + + High level summary

    The networking team has released the following packages to Hackage:

    We published an announcement blog post. We made progress +also on another blog post which will describes the design of the P2P networking +layer.

    After moving ouroboros-consensus to its own repository, we made +ouroboros-network compatible with GHC 9.4 and 9.6.

    We made cardano-client library independent of +ouroboros-consensus-diffusion.

    We prepared release of network packages for cardano-node-8.0.

    Detailed log

    Ouroboros-Network

    IO-Sim

    • io-classes-1.0.0.0, and following up releases: 1.0.0.1 (ghc-9.6 +support), 1.1.0.0 (documentation fix).
    • Fixed timeouts and delays in io-sim in a series of PRs: io-sim#81, +io-sim#82, io-sim#86, io-sim#87.
    • Renamed a module: io-sim#88.
    • Fixed a failing registerDelayCancellable test: [io-sim#80].
    • Use GitHub merge queue in io-sim repository.
    • CI: download stylish-haskell: io-sim#83.

    Typed Protocols

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-04-27-hydra + + 2023-04-27T00:00:00.000Z + + High-level summary

    This week, the Hydra team held their Monthly review meeting and drafted the +report which likely is published next week. They put the spec into the +repository and website, addressed a user issue and fixed the TUI peer list. +Furthermore, they updated dependencies, conducted a Twitter space on Auctions +use cases, covered the rollback bug with tests and implemented a solution. +Looking ahead, their goals for next week include releasing 0.10.0, implementing +timed transactions support, writing a Query API ADR, and grooming work items +like off-chain benchmarks.

    What did the team achieve this week

    • Held the Monthly review meeting and drafted the report (to be published next week)
    • Added the spec into the repository +#693 and published on +the +website
    • Groom and addressed user issue #823
    • Covered the rollback bug with tests and implemented a solution (to be reviewed) #784
    • Fixed the TUI peer list
    • Updated dependencies to match cardano-node master
    • Conducted a twitter space on Auctions use cases

    What are the goals of next week

    • Release 0.10.0
    • Support timed transactions solution drafted and validated API with users
    • Write Query API ADR and groom a concrete step
    • Groom and solve PostTxOnChainFailed UX problem #832
    • Groom off-chain benchmarks idea #186 and turn it into a feature
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-04-21-hydra + + 2023-04-21T00:00:00.000Z + + High-level summary

    This week, the Hydra team worked on several fronts, including fixing state +machine continuity on-chain, discussing voting project solutions, exploring +adding Hydra support to kupo, and improving API navigation with a sidebar. The +team also updated dependencies and fixed issues in their test suites. Moving +forward, the team plans to hold the next monthly review meeting, address a user +issue, prepare for the 0.10.0 release, and work on a dirt road fix for the +rollbacks issue with proper test coverage.

    What did the team achieve this week

    • Fixed scripts to enforce state machine continuity on-chain #777.
    • Took part in a twitter space on Scaling Cardano.
    • Joined a CBIA meeting to discuss Cardano network protocols & how to specify them.
    • Discussed potential solutions of ensuring vote uniqueness in the voting project.
    • Updated dependencies to match cardano-node master to prepare for upcoming releases and hard-forks
    • Explored adding Hydra support to kupo, a lightweight Cardano chain indexer - some more work required.
    • Improved navigation of the API Reference with a sidebar, see unstable API version.
    • Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)

    What are the goals of next week

    • Monthly review meeting (join via Discord or AddEvent) & report
    • Dirt road fix for rollbacks #784 properly covered by a test.
    • Groom and ideally address user issue #823.
    • Put the spec into the repo #693 and prepare release 0.10.0.
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-04-21-ledger + + 2023-04-21T00:00:00.000Z + + High level summary

    We continued to make progress on CIP-1694 and the conway ledger era. +In particular, the conway era now supports Plutus V3. +Finally, we made small improvements to the ledger API and now host +our Haskell code documentation (haddocks) on github pages.

    Low level summary

    Conway ledger era

    Haddocks hosted on github pages

    Small improvements to the API

    Technical Debt

    • [pull-3367] Fix cost model json instances.
    • [pull-3371] UMap cleanup.
    • [pull-3373] Upgrade to ghc 9.2.7 and cabal 3.10.1.
    • [pull-3375] Sadly, we had to revert the TICKF optimizations. There was a regression we do not yet understand.
    • [pull-3377] Fix cabal warnings.
    • [pull-3383] Fix multi-asset test.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-04-20-mithril + + 2023-04-20T00:00:00.000Z + + High level overview

    The Mithril team released a new 2315.0 distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures.

    Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network.

    Low level overview

    • Released the new distribution 2315.0
    • Completed the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the signed_entity table #816
      • Completed the creation of the signer table #814
      • Completed the migration/adaptation of the single_signature table #829
    • Worked on the epic that designs and implement generic signing/verification of entity services #780:
      • Completed the definition of the interface of the generic entity service for signing #847
      • Worked on the implementation of the Certifier service in the aggregator #850
      • Completed the extension of the SignedEntityType type #848
      • Completed the implementation of the Tick service in the aggregator #849
      • Worked on implementing the signable builder for the Mithril Stake Distribution #851
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2023-04-20-node-cli-api + + 2023-04-20T00:00:00.000Z + + 2023-04-20 - 2023-05-04

    High level summary

    • Various fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-04-19-consensus + + 2023-04-19T00:00:00.000Z + + High level summary

    This week the consensus team continued working on the improved DB lock mechanism +for UTxO-HD, and modifications to the mempool benchmarks that this prototype +requires.

    On the Genesis front we validated that the fragment size calculation in +BlockFetch is a major performance sink for ChainSync Jumping. By removing it +we will get performance that is acceptably close to that of the baseline. We +also started investigating a performance fix that does not alter the existing +baseline behavior too much. In addition we reviewed our Genesis attack vector +calculations.

    On the support front we released Consensus 0.4, and we are working on improving +our release process, to support the Cardano-wide efforts in this area. We also +performed an analysis on the number of file descriptors that consensus use. This +information can be used by the node operators to check if the number of file +descriptors they want to support are enough.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Performance & tracing update]]> + 2023-04-19-performance-and-tracing + + 2023-04-19T00:00:00.000Z + +
  • Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.
  • New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois.
  • Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run.
  • Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench.
  • Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.
  • Benchmarking

    We have performed various cluster runs targeting the 8.0 release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile epoch-transition for local reproduction of what we observed on the benchmarking cluster.

    Furthermore, we bridged the gap between the run data from the 1.35.x releases to the the new 8.0.x release branch. This included walking the +master branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial +in locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of +benchmarks.

    Tracing

    In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still +ongoing.

    In coordination with Galois, who are developing a system assurance service by observing a number of cardano-nodes, we're working with the implementation +of data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational +burden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether cardano-tracer could be extended with a richer +feature set to that end.

    Infrastructure & Analysis

    Detailed manifest

    A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with. +These dependencies come from different package sources, have different versioning policies, and an identical package version might provide different +performance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated +by making all component bumps visible and accessible.

    GHC profiling inside workbench

    The workbench has been equipped with a new -profnix profile flavour. This enforces a -fprof-auto build for all node-related packages. The type of +profiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already +been merged to master.

    Nomad backend

    The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances. +This results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing.

    ]]>
    + + Michael Karg + https://github.com/mgmeier + + +
    + + <![CDATA[Incident Report]]> + 2023-04-17-ledger + + 2023-04-17T00:00:00.000Z + + Incident reporting: Cardano block production temporary outage

    On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a ‘critical’ incident, thus warranting immediate response and investigation by IOG engineers. +The investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue – a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite. +Following successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version. +With the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue.

    Further Details

    You can read more details on the incident and how it was managed from SundaeSwap’s Pi Lanningham here. Thanks again to all the community for its support in identifying and fixing this bug.

    ]]>
    + + Kevin Hammond + https://github.com/kevinhammond + + +
    + + <![CDATA[Goedel Team Update]]> + 2023-04-14-goedel + + 2023-04-14T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has submitted two papers for publication, carried +out consultancy with other teams and has an opening for an intern.

    Details

    ]]>
    + + James Chapman + https://github.com/jmchapman + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-04-14-hydra + + 2023-04-14T00:00:00.000Z + + High-level summary

    This week, the Hydra team focused on improving the smoke test, fixing developer +tooling, and improving the API for voting use cases. They reviewed progress on +auction, payments, and voting projects and made worked on reproducing a bug with +handling rollbacks. Moving forward, the team plans to update dependencies, +implement a dirt road fix for the rollbacks bug, and explore adding Hydra +support to kupo.

    What did the team achieve this week

    • Reviewed progress on auction, payments and voting projects
    • Improved smoke tests so they can run on mainnet
    • Fixed a regression in the development environment and updated cardano-node +used in tests
    • Improved API with more configurability to unblock voting use case
      • Exclude utxo in SnapshotConfirmed outputs #808
      • Addressed a user request by only sending Greetings once #813
    • Reproduced the rollback bug by improving our model-based test suite #784

    What are the goals of next week

    • Update dependencies to match cardano-node master
    • Dirt road fix for rollbacks #784
    • Update Hydraw to maintain state locally
    • Explore adding Hydra support to kupo
    • Put disclaimer texts and closing mainnet compatibility feature #713
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-04-07-hydra + + 2023-04-07T00:00:00.000Z + + High-level summary

    This week, the Hydra team published the monthly report for March, created +separate links for different versions of documentation, and clarified potential +solutions for the Rollbacks bug. The team also discussed Query API requests for +the Hydra Voting project and met with community members to answer questions +about Hydra. Moving forward, the team plans to integrate the specification into +the repository, implement a short-term fix for the Rollbacks issue, and draft a +Query API ADR.

    What did the team achieve this week

    • Published monthly reports on website
    • Separate last released and latest versions of docs (e.g. normal released vs. /unstable)
    • Discussed Query API concerns from Hydra Voting project (link)
    • Clarified rollbacks bug and defined possible solutions (short and long term) #784
    • Met with community members to answer questions about Hydra

    What are the goals of next week

    • Finally get the docs integrated into the repository #693
    • Dirt road fix for rollbacks #784
    • Disclaimer text and detail known issues about mainnet compatibility +#713
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-04-06-mithril + + 2023-04-06T00:00:00.000Z + + High level overview

    The Mithril team released a new 2313.0 distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages.

    Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to 1.35.6.

    Low level overview

    • Released the new distribution 2313.0
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the epoch_settings table #813
      • Completed the migration/adaptation of the signed-entity-type table #815
      • Completed the migration/adaptation of the certificate table #817
      • Completed the migration/adaptation of the open_message table #827
      • Completed the migration/adaptation of the signer_registration table #828
    • Completed the refactoring of the dependency injection of the aggregator #823
    • Completed the cleanup of the multi-signer of the aggregator #824
    • Completed the upgrade of the Cardano node to 1.35.6 #843
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-04-05-consensus + + 2023-04-05T00:00:00.000Z + + High level summary

    This week the consensus team finished the UTxO-HD prototype refactoring. We are +now working on improving the DB lock mechanism to improve performance. We also +introduced several improvements to the file system abstraction and simulation +layer (fs-sim), which culminated in the release of fs-sim-0.1.0.0 and +fs-api-0.1.0.0 to CHaP.

    On the Genesis front we distributed the updated Genesis design document, +soliciting feedback from Networking Team and IOG Researchers. We also opened up +a PR for the adversarial leader schedule QuickCheck generator, which is being +reviewed.

    On the support front, we got a new Consensus version that can use different +fundamental VRF crypto primitives for Babbage and Conway eras.

    On the tech debt front we fixed an bug in the followers logic, which was +discovered by our QuickCheck property tests.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2023-04-05-node-cli-api + + 2023-04-05T00:00:00.000Z + + 2023-04-05 - 2023-04-19

    High level summary

    • Introduce new governance commands create, answer and verify. This allows us to have onchain polls.
    • Begin making changes in cardano-api to accomodate for CIP-1694
    • Rename TestEnableDevelopmentHardForkEras to ExperimentalHardForksEnabled and TestEnableDevelopmentNetworkProtocols to ExperimentalProtocolsEnabled
    • Various bug fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Performance & tracing update]]> + 2023-04-05-performance-and-tracing + + 2023-04-05T00:00:00.000Z + +
  • Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.
  • New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput.
  • Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged.
  • Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added.
  • Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.
  • Benchmarking

    We have adapted our benchmarking cluster to the requirements of the 8.0 release branch. Testing runs of a very early feature branch for 8.0 +helped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for 8.0 soon.

    Tracing

    Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very +detailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing +the highest possible throughput of data for forwarding to cardano-tracer.

    Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions +for tunneling trace forwarding from a node to cardano-tracer via an easy to manage system service, which will match the production setup of most users.

    Infrastructure & Analysis

    General

    Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance +analysis can be fed back and serve as an additional point of comparison.

    Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations.

    Plutus library

    We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles. +This will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile. +It is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit.

    Nomad backend

    The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is +being improved to minimize any friction for the backend user.

    ]]>
    + + Michael Karg + https://github.com/mgmeier + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-03-31-crypto + + 2023-03-31T00:00:00.000Z + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Started looking into full-node verifier
    • cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties.
    • KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent.
    • Sidechains: Included BLS12-381 & JubJub to halo2curves
    • MuSig2: Final modifs to C version.

    Low level summary

    Mithril

    • Started designing how a full-node verifier would work. Issue comming in the next couple of weeks.

    cardano-base

    • BLS12-381 branch merged PR#266.
    • Testing strategy for BLS bindings:
      • Test-vectors for Groth16, and simple BLS signatures ready.
      • Test-vectors with different library, and created by different engineer.

    KES agent

    • Resolved issues of circular dependency
    • Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same.
    • Opened a PR for raw bearer branch in ouroboros network PR4395
    • Resolved a bug where the agent node did not properly closed connections
    • Updated version of IOSim allowed us to finish a first version of KES agent.

    Sidechains

    • Included BLS12-381 curve to our branch of halo2curves
    • Included JubJub to our branch of halo2curves

    MuSig2

    • Minor reorg PR#42
    • Started including fuzz testing for deserialisation PR#
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Goedel Team Update]]> + 2023-03-31-goedel + + 2023-03-31T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on final drafts of two papers +for internal review and planning next steps of analysis of consensus +design refiniments.

    Details

    • Preparing final draft of DeltaQSD algebra paper for internal review

    • Preparing final draft of verifying design refinements for +distributed system design for internal review

    • Planning next phase of consensus design refinement analysis

    ]]>
    + + James Chapman + https://github.com/jmchapman + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-03-31-hydra + + 2023-03-31T00:00:00.000Z + + High-level summary

    This week, the Hydra continued work on finishing mainnet compatibility. The +semi-automated smoke tests and some missing documentation is still preventing +from calling that fully done. They fixed smaller issues and made a step in the +Head protocol more robust. Besides development, they met with interested people +from the community who want to get started collaborating on communication and +marketing materials.

    What did the team achieve this week

    • Groomed and followed-up on GetUTxO user request discussion #797
    • Fixed hydra-node crashes after forks #560
    • Made collectCom more robust and aligned with spec #786
    • Completed configurable API feature #380
    • Met potential contributors about Hydra communication and marketing materials
    • Versioned documentation: we have a unstable bleeding edge version available as well now, seperate from the last released version

    What are the goals of next week

    • Follow-up backlog and roadmap clean-up
    • Complete mainnet compatibility feature #713 (documentation updates)
    • Integrate Hydra specification into repository #693
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-03-31-ledger + + 2023-03-31T00:00:00.000Z + + High level summary

    We are still heavily involved in work related to preparing the next release. +The other main thing we have worked on is experimentation about how we will +handle the DRep stake distribution for CIP-1694 in the conway ledger era. +Lastly, we merged a fix for +node-4826 +into our main branch (there will be a post-mortem shortly).

    Low level summary

    Support for the next release

    • pull-3363 - Fix problems relating to Arbitrary instances used by consensus.
    • pull-3361 - Remove the alonze genesis from the conway genesis.
    • pull-3360 - Translate bad pointer addresses to valid ones in conway.
    • pull-3357 - Fix a bug relating to zero valued ADA in the script context.
    • pull-3356 - Added needed instances (Arbitrary and Serialization) for conway integration.
    • pull-3345 - Added helper functions for the CLI.
    • pull-3342 - Fix a bug with a CLI helper function (having to do with deposit tracking).

    Experiments for DRep stake distribution

    Adding another stake distribution to the ledger state presents some new challenges. +We would like to be able to use the current stake distribution at the epoch boundary +for DRep voting so that people can always vote themselves in time for any proposal. +To this end, we have a prototype of an incremental computation based on the incremental +lambda calculus, together with tests and benchmarks (which are very promising). +See pull-3344.

    Additionally, more of the ledger state is going to need to be rearranged to accomodate +the new incremental computations. +We have two draft PRs up for possibles solution. +See pull-3353 and pull-3364.

    Technical debt and bug fixes

    Documentation changes

    • pull-3354 - Rename "optional datums" with "supplemental datums" in the alonzo spec.
    • pull-3352 - Add a section to the Shelly errata about the individual deposit tracking.
    • pull-3351 - Further clarify the details regarding the script integrity hash.
    • pull-3350 - Some cleanup of the Babbage spec.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[System Test Team Update]]> + 2023-03-27-system-test + + 2023-03-27T00:00:00.000Z + + High level summary

    Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.5 and 1.35.6 releases (and their predecessing release candidates) and ran tests on branch with the UTxO-HD functionality.

    Workstreams

    Framework improvements:

    • improvements in searching for unexpected error messages in log files during test run
    • added support for UTxO-HD testing
    • added support for the new P2P topology format
    • added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)
    • added preliminary support for the Conway era
    • added support for running tests on the Preview testnet

    Full list of closed PRs

    Node:

    • ran tests on node branch with the UTxO-HD functionality
    • tested the 1.35.5 release
    • tested the 1.35.6 release

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests
    ]]>
    + + Martin Kourim + https://github.com/mkoura + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-03-24-hydra + + 2023-03-24T00:00:00.000Z + + High-level summary

    This week, the Hydra had a team workshop and conducted the monthly review +meeting for March. They demonstrated a Hydra Head on mainnet, which was running +the hydraw demo application. While this marks an important milestone, they also +emphasized that more features are still to be added as needed for applications +to run on Hydra. Besides this, the roadmap is getting cleaned up to encourage +discussions and provide more space for user requests.

    What did the team achieve this week

    • Monthly review meeting slides/recording, full report of March next week
      • Opened a head on mainnet with hydraw demonstration
      • Hydra pay updates
    • Team workshop in Austria
      • Hydra presentation at the Cardano Foundation in Zurich
      • In-person grooming session, marked many items as candidates to be rather :idea: dicussions
      • Improved head protocol #786 and investigated a potential bug in rollback handling #784
      • Team building and retrospective

    What are the goals of next week

    • Follow-up on backlog and roadmap clean-up
    • Complete mainnet compatibility feature (documentation updates)
    • Make API more configurable #380
    • Integrate Hydra specification into repository #693
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[DB-sync Team Update]]> + 2023-03-23-db-sync + + 2023-03-23T00:00:00.000Z + + High level summary

    The DBSync team worked in performance enhancements issues, on providing new db-sync options and on +technical debt and bug fixing. The DBSync team also on boarded a new member.

    Low level summary

    • Worked on an issue which causes ada_pots tables to include the values related not only to an +epoch, but also the first epoch of the last epoch. +#1367
    • Fixed an issue where the epoch table didn't rollback and caused wrong values +#1370
    • Fixed an issue were users with disable-ledger option had to provide the state dir option, even +though it was never used. Also refactored the no ledger part of the codebase. +#1378
    • Improved the perforance by using the cache more. Also provided many new options which enables or +disables parts of db-sync. In addition a new --turbo mode is enables which allows db-sync to sync +mainnet in hours. +#1379
    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-03-23-mithril + + 2023-03-23T00:00:00.000Z + + High level overview

    The Mithril team released a new 2310.0 distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images.

    Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano mainnet and they have fixed some bugs.

    Low level overview

    • Completed the epic that implements eras behavior switch #707:
      • Completed handling the API version switch at era transition #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed on the migration/adaptation of the stake_pool table #787
      • Worked on the migration/adaptation of the epoch_settings table #813
      • Worked on the migration/adaptation of the signed-entity-type table #815
      • Completed the creation of a stake distribution service #799
    • Completed the testing of Mithril with Cardano mainnet network #777
    • Completed qualifying the computation of the stake distribution #810
    • Completed the testing of the Docker client in the Mithril Client multi-platform test workflow #794
    • Worked on bugs and optimizations:
      • Fixed a bug that made computation of the stake distribution occur multiple times during an epoch #804
      • Fixed a bug that created deadlocks on the SQLite connection #807
      • Optimized the error message and the behavior of the signer node when KES keys have expired #820
      • Upgraded the infrastructure of the testing-preview and pre-release-preview networks #801
      • Re-genesis of the testing-preview network #803
      • Re-genesis of the pre-release-preview network #818
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-03-22-consensus + + 2023-03-22T00:00:00.000Z + + High level summary

    This week the consensus team continued working on the refactoring of the UTxO HD +prototype, and design and testing of Genesis. We also extracted the fs-sim +package, which provides a file-system abstraction layer that can be used for +testing and simulation. This makes the Consensus code base smaller, while +providing a package that the community can reuse and contribute to. We also +fixed a failing property test related to iterators. We are also working on +mempool and VRF improvements.

    Low-level details

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2023-03-22-node-cli-api + + 2023-03-22T00:00:00.000Z + + 2023-03-22 - 2023-04-05

    High level summary

    • Added new cardano-cli ping command which allows users to ping remote cardano-nodes.
    • The transaction build command now can automatically balance multiassets
    • New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Performance & tracing update]]> + 2023-03-22-performance-and-tracing + + 2023-03-22T00:00:00.000Z + +
  • Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.
  • New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users.
  • Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery.
  • Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks.
  • Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing.
  • Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.
  • Performance

    New tracing

    The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe +a slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use.

    GHC RTS parametrization

    We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies +on different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use.

    Open Sourcing

    Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases.

    Tracing

    For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well +as a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points +for users of the new system, depending on their wants and needs.

    Infrastructure & Analysis

    General

    Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will +increase confidence in specific metrics.

    Nomad backend

    We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis +is patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries.

    ]]>
    + + Michael Karg + https://github.com/mgmeier + + +
    + + <![CDATA[Network Team Update]]> + 2023-03-21-network + + 2023-03-21T00:00:00.000Z + + High level summary

    In the last spring we released cardano-node-1.35.6 with dynamic P2P +functionality.

    We received reports from some SPOs who encountered problems with their non +P2P block producing nodes not being able to connect to their P2P relay. Karl +Knutsson (from Cardano Foundation) reproduced this issue between two nodes (a +non P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed +it and found a bug in the legacy non p2p code. The bug is only possible to +trigger with a P2P node which is binding its outbound connection port to +a fixed IP address and port (default in p2p). A possible solution was found. +For more information see #4465.

    We released cardano-ping-0.1.0.0 package to CHaP. cardano-ping is no +longer available as a standalone binary, but instead it will become part of +cardano-cli (see #4664)

    We are testing cardano-node with peer sharing functionality (#4019).

    We are working on eclipse evasion. We added new class of peers: big ledger +peers to the outbound governor, implemented tests and fixed found issues +(#4462). We also made the information if a given peer plays the role of +a big ledger peer to the mini-protocols. This will allow to modify +mini-protocol applications for such peers. As part of this functionality we +refactored some core types in the network code which simplifies exposed API.

    Together with Moritz Angerman we started to update io-sim to ghc-9.6.1 (see +#73).

    We merged a fix of configuration of accepted connections limit in +cardano-node (see #4902).

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-03-17-crypto + + 2023-03-17T00:00:00.000Z + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: RFP finished. Code ready for audit.
    • cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams.
    • KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing.
    • Sidechains: Preparing proving system to use the curves needed for main-net PoC.

    Low level summary

    Mithril

    • Merged PR#783
    • RFP for crypto audit ready.

    cardano-base

    • BLS12-381 branch approved PR#266. Blocker is Windown's CI. Working on it
    • Testing strategy for BLS bindings:
      • Preparing test-vectors for Groth16, and simple BLS signatures
      • Finding community projects to help write their use cases
      • Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)
    • Wrote blogpost on how using the same key for ed25519 and VRF completely breaks the security of both systems

    KES agent

    • Started integration of sockets interface used in consensus
    • Use that for de/ser
    • Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim
    • Results in having to parametrise for IOSim in KES and DSIGN for testing

    Sidechains

    • Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages.
    • Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS.
    • EdDSA over JubJub ready
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-03-17-hydra + + 2023-03-17T00:00:00.000Z + + High-level summary

    This week, the Hydra team has continued work on the mainnet compatibility of the +hydra-node. They added a golden test suite for hydra-plutus scripts, added +some detection of hydra-node misconfiguration, established a limit of 100 ADA +per commit and other smaller tasks to prepare for a mainnet beta release.

    Next week there will be a small team workshop to push for demonstrating a Hydra +Head on the Cardano mainnet, ideally just in time for the monthly review +meeting. See the hydra channels on the IOG Technical Community discord server +for details.

    What did the team achieve this week

    • Implement a 100 ADA hard-coded commit limit in the hydra-node +#763
    • Pay back funds to faucet after smoke-test run +#773
    • Setup custom github runner for smoke-tests on mainnet +#775
    • Created golden tests to assure the script hash stays the same between +changes #772
    • Removed hardcoded error codes in plutus scripts +#768
    • Detect misconfiguration of a hydra-node given persistent state +#767
    • Met with potential users for hydra-pay
    • Prepared hydra workshop

    What are the goals of next week

    • Hydra monthly meeting
    • Open a multi-party head on mainnet
    • Complete mainnet compatibility feature
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-03-17-ledger + + 2023-03-17T00:00:00.000Z + + High level summary

    We made further progress on the conway ledger era. +In particular, we expanded the ledger API significantly, including lots of governance features. +We also made progress on the specification and corresponding work in the Haskell implementation.

    We also continued to integrate the latest ledger packages into cardano node and addressed +technical debt.

    Low level summary

    Expanded ledger API

    The ledger API was significantly expanded to include:

    • a lot of protocol parameter support
    • versioning support (type level ledger eras and protocol versions)
    • auxiliary data support
    • many new lenses
    • support for witnesses
    • support for conway governance

    See pull-3328.

    Conway ledger rules

    We have made progress on the formal ledger specification for the Conway era. +Moreover, the corresponding Haskell updates were also completed:

    Incremental SPO/DRep stake distribution computation

    We have a working (and correct) proof of concept for how to use the incremental lambda calculus +to maintain several of the stake distributions incrementally. +For the per-SPO distribution, this is a performance improvement. +For the (conway) per-DRep distribution, this is will allow those who have delegated their votes +to a DRep to have time to react to any votes that they disapprove of. +(Sorry, no code to share just yet, more to come.)

    Technical debt

    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Goedel Team Update]]> + 2023-03-16-goedel + + 2023-03-16T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers +improving the deltaQ tutorial, consulting on performance design, and +the final version of the Djed paper.

    Details

    • Preparing draft of DeltaQSD algebra paper for ICE 2023

    • Successful outcome of Marlowe consultancy leading to substantial +improvement in performance

    • Preparing sections on the communication language and bisimulation +proofs for draft paper about verifying design refinements for +distributed system design

    • Camera ready version of Djed paper under preparation

    ]]>
    + + James Chapman + https://github.com/jmchapman + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-03-10-hydra + + 2023-03-10T00:00:00.000Z + + High-level summary

    This week, the Hydra team addressed issues with committing complex UTxOs into a +Hydra Head, prepared the hydra-node to be run on mainnet (soon) and improved +the test suite of the hydra-plutus scripts. The specification is constantly +getting improved upon reviewer feedback on overleaf - this week the graphical +notation was refined to be more transaction-focused.

    What did the team achieve this week

    • Clarified bug of committing UTxOs with reference scripts to a Hydra head #737
    • Prepare usage of hydra-node on mainnet by updating command line options #715
    • Improved our mutation test suite to all expected errors #705
    • Re-opened our persistent hydraw demo head on preprod using version 0.9.0
    • Updated on-chain graphs to be more transaction-focused in the specification

    What are the goals of next week

    • Complete mainnet compatibility feature
    • Prepare the Hydra workshop
    • Address all todo’s in the Hydra specification
    • Unblock the auctions project with commit from script a solution
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-03-09-mithril + + 2023-03-09T00:00:00.000Z + + High level overview

    The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano mainnet and computes the stake distribution with the optimized unreleased Cardano CLI command.

    Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup.

    Low level overview

    • Worked on the epic that implements eras behavior switch #707:
      • Completed the deployment of the era behavior switch to the test networks #752
      • Completed the enhancement of datum generation for era markers #786
      • Worked on handling the API version with an era switch #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Worked on the migration/adaptation of the stake_pool table #787
    • Completed the refactoring of errors in the signer and aggregator state machines #665
    • Worked on testing Mithril with a mainnet Cardano network #777
    • Worked on fixing bugs with the Docker client image:
      • Fixed a bug that made the Docker client container crash at startup #769
      • Fixed a bug that prevented the restoration of a snapshot with a Docker client #791
      • Worked on testing the Docker client in the Mithril Client multi-platform test workflow #794
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-03-08-consensus + + 2023-03-08T00:00:00.000Z + + High level summary

    The Consensus team continued working on refactoring and improving the UTxO-HD +prototype, and introducing improvements to the lmdb related packages. In +particular we identified an opportunity to gain performance by handling locks in +a more optimal way.

    On the Genesis front, we sketched a mitigation for an issue that PNSol and +Researchers caught. We also came op with a road map for not only testing the +Genesis prototypes, but also for enriching the tests we already have.

    Regarding technical debt, next to some minor improvements, we created +component-level micro-benchmarks for adding transactions to the mempool. The +results of these benchmarks will be published in the ouroboros-consensus web +page.

    We also finished moving the Consensus documentation to the ouroboros-consensus +repository, released ouroboros-consensus 0.3.0.0, and reduced the time +GitHub actions take in ouroboros-network.

    Workstreams

    UTxO HD Prototype

    We continued working on refactoring and improving the UTxO-HD prototype. As a +result of the first round of sytem-level benchmarks, we identified an +opportunity to optimise the way we handle locks to improve performance +(#4393).

    Also, we introduced several improvements to the lmdb related packages:

    Genesis

    We sketched out a mitigation of the issue that PNSol and Researchers caught in +the Genesis design.

    We came up with a road map for testing the Genesis prototypes, including early +milestones that are applicable to today's master branch, ie tests that are +useful before Genesis, and that will be nicely enriched when we do add Genesis.

    We developed the aforementioned tests, specifically a QuickCheck generator for +the Honest leader schedule and one as-aggressive-as-possible Adversarial +leader schedule that together satisfy the Praos properties that the Consensus +design takes as invariants.

    We investigated why the improved ChainDB queueing implementation behaves +differently in the baseline compared to the prototype, and we are close to +having a full picture of how the Consensus components interact during bulk sync.

    Technical debt

    We created component-level micro-benchmarks for adding transactions +to the mempool. We plan on extending this to more mempool actions and different +types of blocks. We store the benchmark data to make it available +to the GitHub action that publishes the benchmarks results.

    Other minor improvements include:

    • Removal of Test.Util.Classify in favour of Test.StateMachine.Labelling.
    • Addition of -Wunused-packages to the default ghc-options for Consensus +packages.

    Fostering collaboration

    We finished moving the Consensus documentation from +ouroboros-network to ouroboros-consensus, in preparation for +migrating the code to the latter repository.

    Support

    We released ouroboros-consensus 0.3.0.0.

    We reduced the load in the ouroboros-network GitHub actions, +thereby reducing the time CI jobs take.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2023-03-08-node-cli-api + + 2023-03-08T00:00:00.000Z + + 2023-03-08 - 2023-03-21

    High level summary

    General bug fixes and some refactoring

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Performance & tracing update]]> + 2023-03-08-performance-and-tracing + + 2023-03-08T00:00:00.000Z + +
  • Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.
  • New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users.
  • Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination.
  • Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation.
  • Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.
  • Performance

    1.35.6 release

    Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health.

    Analysis pipeline

    Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better +differentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance. +Additionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking +data more easily accessible.

    Open Sourcing

    As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable +third parties to make use of that data much more easily, by having reliable guidelines and a working example.

    Tracing

    The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make +the switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process.

    Infrastructure

    Nomad backend

    The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented.

    ]]>
    + + Michael Karg + https://github.com/mgmeier + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-03-03-crypto + + 2023-03-03T00:00:00.000Z + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit.
    • cardano-base: BLS branch is now ready for review. We are workign forward its merge.
    • KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase.
    • Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs

    Low level summary

    Mithril

    • Bumped to version 0.2.0 the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using mlock.
    • Opened PR#783 to update dependency
    • Improved testing for batch opening of mtree, PR#773
    • Improved testing for batch verification of STM sigs PR#774
    • RFP for crypto audit almost ready.

    cardano-base

    • BLS12-381 branch finally ready for review PR#266

    KES agent

    Team off for one week. Other progress:

    • Learning about raw direct-bearer abstraction. An interface for sockets in consensus.
    • use that for direct ser/deser
    • written those syntaxes for ouroboros (coming PR)
    • the kes agent will depend on that.

    Sidechains

    Progress with familiarisation of Halo2 library to write circuits.

    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Goedel Team Update]]> + 2023-03-03-goedel + + 2023-03-03T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, improving the deltaQ tutorial, consulting on +performance design, and the Djed paper has been accepted for +publication.

    Details

    • Preparing draft of DeltaQSD algebra paper for FORTE 2023

    • Extending the technical report on which the above paper is based

    • Consulting with an external company on performance engineering of Plutus contracts

    • Planning improvements and collecting material for the deltaQ +tutorial based on experience with systems that manage risk at +multiple timescales

    • Preparing sections on the communication language and idempontency +laws for draft paper about verifying design refinements for +distributed system design

    • Studying Cardano chain sync protocol

    • "Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin +Protocol" has been accepted for publication at IEEE ICBC 2023

    ]]>
    + + James Chapman + https://github.com/jmchapman + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-03-03-hydra + + 2023-03-03T00:00:00.000Z + + High-level summary

    This week, the Hydra team released version +0.9.0 - a version +of the hydra-node with fully specified behavior of on-chain scripts and +off-chain head-logic, decreased costs for opening/closing a Head and scalable +contestation deadline semantics. Check out the full release notes for details.

    Furthermore, they published the monthly +report of the Hydra project +and conducted a review meeting with an increasingly wider audience. The team +plans to extend invitations through the new Hydra +#announcements discord channel for the next +months, stay tuned!

    What did the team achieve this week

    • Monthly review meeting with report published on website
    • Fixed smoke tests #726
    • Reduced the cost of opening/closing a Head (error codes #748 + head reference script #701)
    • Released version 0.9.0
    • Conducted a first experiment on mainnet compatibility #713
    • New discord category with #announcements channel
    • Received a demo about the Hydra for Voting project
    • Lightning talk on mutation-based testing (to be shared)
    • New themes view in on our roadmap and some rearranging as we align it with high-level objectives
    • Clarified things with researchers, but mostly identified action items for them

    What are the goals of next week

    • Redraw transaction graphs and address TODOs specification
    • Run hydraw with 0.9.0 on preprod
    • Make smoke tests on mainnet possible
    • Groom the explorer item
    • Unblock the auctions projecth with commit from script a solution
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-03-03-ledger + + 2023-03-03T00:00:00.000Z + + High level summary

    We have focused the last two weeks on CIP-1694, integration of the last several months of ledger +work into consensus and node, and testing infrastrutcture that we will use in the conway ledger era.

    Low level summary

    Conway rules

    We made a major update to the conway era so that the implementation is now in sync with the spec +with respect to the ratification and enactment logic.

    See the notes in pull-3291 for more details.

    Constraint based generators

    This week we hit a major milestone in our efforts to build out better property based testing +support for the main ledger properties. +The new constraint based generators can now generate full ledger states with what is probably +very close to the real constraints (if anything, it is under constrained). +Next we will work on generating a transaction in the context of a ledger state, which would allow +us to actually start using these generators for real tests.

    See pull-3219.

    Preparing a release, now with proper versioning

    After quite some time, we are ready to release a version of ledger that will work with a new +version of consensus, using CHaPs.

    See pull-3308.

    Technical debt

    • We cleaned up the redeemer serialization code (to prevent future mistakes). See pull-3269.
    • We added a note to the Alonzo spec, specifying that the transaction inputs are +lexicographically ordered in the Plutus script context. See pull-3306.
    • We fixed a problem with the address deserialiazation +(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway). +See pull-3307.
    • We fixed a problem with our nix build. See pull-3311.
    • We fixed a problem with our NoThunks tests. See pull-3310.
    • We improved our nightly tests. See pull-3316.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Network Team Update]]> + 2023-03-02-network + + 2023-03-02T00:00:00.000Z + + High level summary

    In the current sprint the networking team focused on fixing bugs and pushing +forward implementation of eclipse evasion. We also found a bug in our +simulation testing setup (in integration of test node). We also overviewed the +work on extending handshake protocol which is delivered by Galois Inc.

    We published ouroboros-network-0.4.0.1 and +ouroboros-network-protocols-0.3.0.0 to CHaP.

    We also fixed a bug in cardano-node which results in not being able to +configure inbound connection limits, see PR #4902.

    Together with Karl Knutsson (CF) we realised an issue in cardano-cli: it's +validation of DNS names, IP address & ports when registering a stake pool +should be more strict to protect against common mistakes which we identified on +the chain. See issue #4929.

    Detailed work log

    In PR #4385 we fixed two bugs in peer state actions. First one results in +a busy loop if demotion from hot to warm times outs. This busy loop is +eventually exited when mux exits (we reported this in our previous report). +This fix made it to 1.35.6 release as well.

    In addition the PR #4385 also fixes another bug which results in hot -> warm +-> hot demotion / promotion busy loop.

    The PR #4385 also fixed a bug in a node only used in simulation which +resulted in not using chain-sync or block-fetch mini-protocols. In the +review process, we realised that the header-body split in the simulated node +requires further work (see PR #4419, which is under review).

    The PR #4385 also extend our generators, which together with the above fix, +cover the hot -> warm -> hot demotion / promotion busy loop.

    In PR #4419 we introduce a ChainDB for our simulation node, which plays +similar role to ChainDB in the ouroboros-consensus: a persistent (across +simulated restarts) store of blocks which does chain selection. This ensures +that the simulated node is using block-fetch to download blocks announced by +chain-sync mini-protocol.

    We also made progress with reviewing PR #4019 - peer sharing.

    We also fixed issue #4370 - a connection manager test failure, see PR #4384.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-02-24-hydra + + 2023-02-24T00:00:00.000Z + + High-level summary

    This week, the Hydra team continue closing many gaps and aligning the +implementation with the specification. More over, they have groomed a plan to +make Hydra Mainnet compatible. Also, they continue moving forward with the +internal auditing and have published some auditing guidelines to receive +contributions from the community.

    What did the team achieve this week

    • Completed #452 (what is +remaining in there)
    • Aligned the Head protocol logic implementation with the specification
    • Completed full minting policy implementation and spec +#720
    • Clarified message authentication with researchers
    • Groomed what is left to do for Mainnet compatibility +#713 and drafted a +0.10.0 version
    • Added a tutorial by @perturbing to the +website LINK
    • Published auditing guidelines +LINK
    • Made hydra-node work for macos +#746 and added support +for building on aarch64 +#673
    • Met with a potential customer of Hydra for Payments

    What are the goals of next week

    • Have the monthly review meeting incl. the report
    • Have smoke tests fixed and running regularly
    • Release 0.9.0 with updated scripts
    • Redraw transaction graphs for specification
    ]]>
    + + Franco Testagrossa + https://github.com/ffakenz + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-02-23-mithril + + 2023-02-23T00:00:00.000Z + + High level overview

    The Mithril team released a new 2306.0 distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes’ CLI that allows generating and signing an era marker’s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI.

    Low level overview

    • Released the new distribution 2306.0
    • Completed the epic that implements signer versions deployment monitoring #718:
      • Completed the implementation an event producer/consumer via channel #738
      • Completed the creation of a database and its configuration to save the events on the consumer side #740
      • Completed the creation of events and sending them on the channel on the producer side #741
      • Completed the creation of the signer registration event #742
      • Completed the creation a query to extract the node versions stakes distribution #743
    • Worked on the epic that implements eras behavior switch #707:
      • Completed the loading of era reader adapters from config in the signer and the aggregator #732
      • Completed the implementation of an era cli command in the aggregator #755
      • Completed the implementation of a dynamic matrix of cases in CI end to end tests #760
    • Fixed some bugs:
      • Fixed the unsupported unixepoch() function #757
      • Fixed the problem that prevented some signers from signing on the testing-preview network #730
      • Update SQLite version to 3.40 in aggregator infrastructure #765
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Performance & tracing update]]> + 2023-02-23-performance-and-tracing + + 2023-02-23T00:00:00.000Z + +
  • SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.
  • Release benchmarking: we performed a round of benchmarks for the 1.35.6 release.
  • UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup.
  • New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities.
  • Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure.
  • Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.
  • Performance

    SECP

    1. For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead.
    2. The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run.
    3. The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking.

    UTxO-HD

    1. After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop.
    2. We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.

    1.35.6 release

    Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health.

    Tracing

    Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible.

    Infrastructure

    Nomad backend

    1. Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients.
    2. Locality assumptions were removed and job monitoring was refactored.
    3. To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster.
    4. We're currently evaluating different options for genesis distribution in said cluster.

    NixOps backend

    The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery.

    ]]>
    + + Michael Karg + https://github.com/mgmeier + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-02-22-consensus + + 2023-02-22T00:00:00.000Z + + High level summary

    During the past two weeks we got the results from the system level benchmarks +for UTxO HD. They showed a substantial performance regression, so we spent some +time analyzing the results. We found out the frequency at which ledger snapshots +were taken was too high, so we requested the benchmarking team a new run with a +more realistic snapshotting policy. We continued refactoring and improving the +prototype, and we released UTxO-HD related packages to CHaP.

    We met with IOG researchers and networking specialists to discuss the Genesis +design, which was well received. We continued working on testing and +benchmarking different Genesis prototypes.

    We are also working on solving a test failure related to iterators. This work +derived in several improvements such as better documentation, a framework for +writing unit (and regression) tests, and the possibility of debugging +QuickCheck counter examples in the REPL.

    Finally, we released ouroboros-consensus 0.2.0.0 and +ouroboros-consensus-cardano 0.3.0.0 to CHaP

    Workstreams

    UTxO HD Prototype

    We got the results of the first system level benchmarks for UTxO HD. They seemed +to indicate a significant regression in performance. After looking into the +benchmark logs we found that the benchmark runs took ledger state snapshots too +often, due to the default snapshotting policy depending on k, and k being so +small in the benchmark runs. Therefore, the next step is to re-run the +benchmarks with a snapshotting policy that more closely resembles the one from +mainnet.

    At the same time, we continued refactoring and cleaning up the prototype.

    Also, we prepared the anti-diff packages (fingertree-rm, diff-containers, +simple-semigroupoids) and the lmdb related packages (cardano-lmdb and +cardano-lmdb-simple) to CHaP.

    Genesis

    The Genesis design was presented to the IOG researchers and Peter Thompson from +NSol. It was well received. They pointed out one blindspot, but we think it'll +be relatively simple to mitigate.

    In parallel, we continued developing test and benchmarks for the Genesis +prototypes. I particular we tested and implemented a potential fix for +increased ChainDB dequeue timings, which partly +behaved as we expected, but still needs further investigation. Also we obtained +new benchmarking data for the prototype.

    Technical debt

    Related to #4183, we developed a DSL for specifying +ChainDB unit tests. This will allow us to better understand the +counter-examples returned by QuickCheck tests, and to write regression +tests for them. Also, we added a module to enable +QuickCheck counter-examples to be run on the REPL, allowing for faster debugging +feedback. Also, we improved the documentation related to followers +(#4372).

    We are also working on a design for optimizing the way we handle blocks from the +future.

    Support

    We released ouroboros-consensus 0.2.0.0 and ouroboros-consensus-cardano +0.3.0.0 to CHaP. Remember that we decided to split the packages related to +Consensus into two bundles, one with the core functionality, Cardano-agnostic +code, and another bundle with instantiations specific to Cardano.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2023-02-22-node-cli-api + + 2023-02-22T00:00:00.000Z + + 2023-02-22 - 2023-03-07

    High level summary

    General bug fixes

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    Documentation

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[DB-sync Team Update]]> + 2023-02-21-db-sync + + 2023-02-21T00:00:00.000Z + + High level summary

    The db-sync team created a new tag 13.1.0.2 which is ready to release. +We also investigated and had the first working UTxO-HD integration which is one +of the potential future risks for db-sync.

    Low level summary

    • Integrated the UTxO-HD feauture branch in kderme/utxo-hd-1. This doesn't +use the full on disk storage but keeps things in memory and the plan is to keep +it this way for the first iteration. The integration still has some performance +issues which we investigate
    • Created tag 13.1.0.2 which upgrades the dependencies of db-sync
    • Fixed an issue related to errors appearing in SMASH +#1353
    • Continued with ghc-9.2 integration +#1339
    • Worked on an new fixing procedure for +#1348. +We try to make these procedures work also on older schema version, without the +need to migrate to newer schema, which can be very useful for fixing existing +snapshots.
    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-02-17-crypto + + 2023-02-17T00:00:00.000Z + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration.
    • cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: started implementation in rust.

    Low level summary

    Mithril

    • Transmute helpers merged PR#722
    • We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope.
    • We are working in a modification of KES to require caller to allocate the secret key buffer.
    • Proposed a solution for signer registration of Mithril.

    cardano-base

    • Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 proof.
      • Results are promising, with using only 23% of the execution budget to verify a realistic proof.
      • Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril.
    • KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this.
    • Conversion finally merged PR#344.

    KES agent

    • Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation
    • Figuring out how to go from fake file descriptor to write the raw bytes

    MuSig2

    • Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Goedel Team Update]]> + 2023-02-17-goedel + + 2023-02-17T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, distributivity properties of deltaQ, and consulting +on performance design with the Marlowe team.

    Details

    • Processing reviews on performance engineering paper and planning +paper revisions accordingly

    • Investigating distributivity properties of DeltaQ

    • Preparing sections on the thorn calculus and idempotency laws for +draft paper about verifying design refinements for distributed +system design

    • Consulting on performance design with Marlowe team

    ]]>
    + + James Chapman + https://github.com/jmchapman + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-02-17-hydra + + 2023-02-17T00:00:00.000Z + + High-level summary

    This week, the Hydra team completed work on dealing differently with contests +during the contestation period. These will now always push out the deadline and +hence contestation periods are easier to pick (depending on the network a Head +runs on). Furthermore, they added an important acceptance test and completed +internal refactoring of the protocol logic making future changes easier.

    What did the team achieve this week

    • Push contestation deadline on each contest #716
    • Wrote an acceptance (property) test can always close/fanout when collect is successful
    • Internal refactoring of our HeadLogic
    • Groomed remaining things from #452 into dedicated features

    What are the goals of next week

    • Complete full minting policy #720
    • Release 0.9.0 with updated scripts
    • Plan mainnet milestone and a 0.10.0 version
    • Redraw transaction graphs for specification (upon feedback)
    • Have smoke tests fixed and running regularly
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-02-17-ledger + + 2023-02-17T00:00:00.000Z + + High level summary

    This past two weeks saw many months worth of ledger changes integrated with the cardano-base +and ouroboros-network repositories. +The vast majority of the effort involved all the changes to the ledger serialization libraries +(and the interplay with cardano-base) which now support proper versioning. +Supporting the conway ledger era, and in particular allowing the ledger state to transition +to a whole new system of governance, also played a noticeable part in the integration.

    Besides the integration work, the team continues to address technical debt, improve the +documentation, make our testing infrastructure better (such as experimenting with better +nightly tests), and formally specifying more parts of CIP-1694.

    Lower level summary

    Integration work

    Below is all the integration work completed, which will enable a release to node from +the current ledger master. Many thanks to +Alexey for this colossal undertaking!

    Technical debt

    Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted +in the CBOR specification. See pull-3241.

    We now have our .cabal files being checked for a consistent formatting given by +cabal format in our CI. See pull-3286.

    We are still experimenting with better nightly tests for our long running +property based tests. See pull-3276 and pull-3296.

    Small documentation improvements

    The hand proofs of the preservation ADA property have been added back to the +Shelley ledger specification. See pull-3295.

    We have clarified how the script integrity hash is computed in the CDDL description. +See pull-3290.

    Specifying CIP-1694

    Our new formal specifications backed by Agda have seen a lot of progress! +Upgrading to Agda 2.6.3 fixed our main build infrastructure problems, +and we no longer have to rely on our custom fork. See pull-50.

    Our progress on formally specifying CIP-1694 can be followed here:

    Constraint based testing

    We are still actively working on our new constraint based property testing framework. +We have nearly all of the constraints for an entire ledger state +hooked into generators, and tests that the generators do indeed obey the constraints. +The variable count in the constraints is over 100! +There is still much work to do on shrinking, making the generators faster, +and writing actual property tests for the ledger, but the approach still seems viable and +we are hopeful that it could replace our trace generators. +The WIP can be followed here: pull-3219.

    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Network Team Update]]> + 2023-02-17-network + + 2023-02-17T00:00:00.000Z + + High level summary

    Recently QA found a bug in P2P code, which results in busy loops. We added one +fix to 1.35.6 release, another one will likely be part of next release. The +first one is already included in ouroboros-network-0.3.0.1 release. These +bugs could only affect nodes which are out of sync and thus should not impose +risk on well maintained nodes on mainnet. We also advertise to deploy at most +one of the relays as a P2P node, which shields from possible consequences.

    We recently finished design phase of eclipse evasion and we started +implementing it (see issue #3886 for progress).

    Galois finished implementing Handshake extension which will allow to query +network protocol versions (see pr #4256).

    We also recently released a newer set of network packages to be integrated with +cardano-node master branch, this includes:

    * monoidal-synchronisation-0.1.0.2
    * cardano-client-0.1.0.2
    * network-mux-0.3.0.0
    * ouroboros-network-api-0.1.0.0
    * ouroboros-network-protocols-0.2.0.0
    * ouroboros-network-testing-0.2.0.1
    * ouroboros-network-mock-0.1.0.0
    * ouroboros-network-framework-0.3.0.0
    * ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included
    in `0.3.0.1`)
    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-02-10-hydra + + 2023-02-10T00:00:00.000Z + + High-level summary

    This week, the Hydra team closed several gaps to align the Hydra scripts +implementation further with the specification. This also resulted in a slight +improvement on Hydra script size and costs. They consequently analysed the +asymptotic complexity of collect and fanout and how they relate. Also plutus-tx +profiling toolchain was evaluated and set up for future improvements on Hydra +on-chain performance. In discussions with researchers and internal auditors, +they also uncovered next steps on further securing the Head protocl using a +"full" minting policy.

    What did the team achieve this week

    • Closed several gaps to align script implementation with specification #452
      • Allow contest only once #680
      • Optimization through head output at index 0 #700
      • Value is preserved #702 + optimized exact value equality #709
    • Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to #721
    • Fixed our tooling around the Haskell language server
    • Discussed full minting policy with researchers
    • Started grooming “what we need for mainnet” on this idea ticket and milestone

    What are the goals of next week

    • Implement full minting policy
    • All remaining protocol discrepancies are implemented or groomed as individual features
    • Ideally release 0.9.0 with updated scripts
    • Discuss what we need for mainnet (milestone planning)
    • Redraw transaction graphs for specification (upon feedback)
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-02-09-mithril + + 2023-02-09T00:00:00.000Z + + High level overview

    The Mithril team released a new 2304.1 distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store.

    Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version 1.35.5 on their devnet and infrastructure.

    Low level overview

    • Released the new distribution 2304.1
    • Fixed a bug that prevented some signers to sign with 2304.0-prerelease #716
    • Completed the implementation of an EraChecker that checks if an era is active #708
    • Completed the implementation of an EraReader that gathers era activation data #709
    • Completed the implementation of an EraReader adapter with on chain transaction as source #710
    • Completed the relational design of the aggregator store #476
    • Completed adding a new SPO on the testing-preview network #729
    • Completed the upgrade of the Cardano node to 1.35.5 #725
    • Fixed flakiness in the CI #734
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-02-08-consensus + + 2023-02-08T00:00:00.000Z + + High level summary

    We continue refactoring the UTxO HD prototype while we wait for the system level +benchmarks. We have created a new repository that contains the anti-diff +packages used in this prototype.

    On the Genesis front, we are preparing another meeting with the researchers to +audit the implementation design, and we continued working on basic tests and +simplifications.

    During the past two weeks we also introduced two new tools. One for dumping CBOR +encoded blocks to JSON, and another to serve a local immutable DB.

    Workstreams

    UTxO HD Prototype

    We are in the process of refactoring the UTxO HD prototype, while we wait for +the system level benchmarks to confirm if the performance of the prototype is +satisfactory.

    We also set up a repository for the anti-diff package, which +required us to refactor the code, write documentation, and prepare a release to +CHaP.

    Genesis

    We worked on basic tests for the Limit on Eagerness property of +Genesis. We also introduced further robustness and simplifications in the +Genesis Density governor. Finally, we developed a presentation to engage again +with the researchers on our Genesis implementation design.

    Technical debt

    Fostering collaboration

    We are in the process of polishing the ouroboros-consensus +documentation site, which we will use a the entry point for Consensus related +documentation. The first version will not be complete, but we plan on +systematically improving it.

    Support

    We added a tool to ouroboros-consensus-cardano-tools which allows +to dump the Chain DB blocks or any given CBOR encoded blocks as JSON.

    We also added another tool that serves an existing immutable DB via +BlockFetch and ChainSync. This tool can help in assisting our local benchmarking +efforts (for instance Genesis' ChainSync jumping prototype).

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2023-02-08-node-cli-api + + 2023-02-08T00:00:00.000Z + + 2023-02-08 - 2023-02-21

    High level summary

    More maintenance and resolving raised issues.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Performance & tracing update]]> + 2023-02-08-performance-and-tracing + + 2023-02-08T00:00:00.000Z + + High level summary
    1. SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions.
    2. Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks.
    3. New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node.
    4. New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide.
    5. Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live.
    6. Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on.
    7. Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.

    Performance

    We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:

    • we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,
    • after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,
    • finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.

    In addition, we started benchmarks of the 1.35.6 release.

    Tracing

    A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way.

    Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting.

    Infrastructure

    On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders.

    The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment.

    The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops.

    ]]>
    + + Serge Kosyrev + https://github.com/deepfire + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-02-03-crypto + + 2023-02-03T00:00:00.000Z + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril.
    • cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.

    Low level summary

    Mithril

    • Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing PR#722
    • We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper.
    • We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.

    cardano-base

    • There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381.
    • The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner.
    • The update VRF PR#341 is finally merged, and we are ready to merge PR#344, which implements conversion functions from the compatible types between Praos and PraosBatchCompat.

    KES agent

    • Use of snockets to send the data directly from the socket to secure memory.
    • We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives
    • Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.

    MuSig2

    The GitHub Action linelint is used to check the files.

    • A new job for linting is added to the file /.github/workflows/ci.yml. The rules are configured in the file /.github/workflows/.linelint.yml. Some files from the configuration of libsecp were failing, so in the rules in .linelint.yml the failing files are denoted to be ignored by the linter.
    • Folders are reorganized. We created a folder to handle the example. This folder includes the examplemusig2.c, a distinct config.h, and helper.c. The example is enhanced by implementing the functions in the helper for the configuration given in config.h. The number of messages is different than the tests. The example is made more generic to run with a loop.
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Goedel Team Update]]> + 2023-02-03-goedel + + 2023-02-03T00:00:00.000Z + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been preparing several papers for peer review +and knowledge sharing and consulting within IO and the community.

    Details

    • R&D Seminar on experience participating in a member based organisation
    • Full day tutorial on performance engineering presented at HiPEAC +2023 conference
    • Finished preparing and submitted a paper on performance engineering +to an ACM workshop
    • Preparing a draft paper for future submission about verifying design +refinements for distributed system design
    • Consulting on performance design of other IO projects
    ]]>
    + + James Chapman + https://github.com/jmchapman + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-02-03-hydra + + 2023-02-03T00:00:00.000Z + + High-level summary

    This week, the Hydra team completed the Hydra specification with a section about +rollbacks and updated graphs +(#448). In a next step, +the specification will be made more approachable and an open standard. They +improved their hydra-cluster tool to launch a local --devnet sandbox +environment and continued aligning the hydra-plutus scripts with the +specification by hardening the checks on close and contest transactions.

    What did the team achieve this week

    • Completed the specification with a section about rollbacks and updated graphs +#448, with a follow-up on making it more approachable and an open standard.
    • Continued spec review with internal auditor and incorporated changes.
    • Talked to TxPipe about how Demeter and Hydra could work together
    • The hydra-cluster executable can be used to launch a local --devnet sandbox environment.
    • Reproduced the “head being stuck on network outage” bug
      • relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed.
    • Progressed with higher velocity by addressing more and more gaps #677

    What are the goals of next week

    • Upstream our JSON instances to the ledger
    • Close all transaction security related on-chain gaps
    • Ideally release 0.9.0 with updated scripts
    • Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-02-02-ledger + + 2023-02-02T00:00:00.000Z + + High level summary

    Much of the work the past two weeks involved integration efforts, +cleaning up and debugging some serialization issues, +adding tests, and work on large projects that are still ongoing. +We also released a CIP this week that aims to make the ledger +a registered CIP category.

    Lower level summary

    Ledger evolution CIP

    We published a +CIP +that will make the Cardano ledger a registered category of the CIP process.

    Serialization issues

    We had previously thought that we had found a serialization problem with the redeemers, +but it turned out to just be particularly confusing code. +We have now clarified the issue for the future.

    See pull-3263, pull-3269, and pull-3268.

    Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps.

    See pull-3277.

    New tests

    We added a new property test suite for some of our custom containers.

    See pull-3270.

    Progress on a better cost model serialization situation.

    We are still working our way through issue-2902. +Towards this end, we are now properly gating the new flexible encoders +until version 9.

    See pull-3274.

    Nightly tests

    We are still experimenting with moving more CI actions to GitHub actions.

    See pull-3276.

    Constraint based generators

    We continue to add to our proof of concept for constraint based generators. +See the previous ledger update for more information about this project.

    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-01-27-hydra + + 2023-01-27T00:00:00.000Z + + High-level summary

    This week, the Hydra team had a monthly review meeting with their stakeholders, +contributors and interested people from the community. The monthly repot for +January 2023 is a digest +of the things presented and also includes a summary of the meeting. The Hydra +specification was getting discussed and the team is incorporating suggested +changes of reviewers. Last but not least, they compute and publish script +information on every PR and also on the +website +now.

    What did the team achieve this week

    • Had the monthly review meeting with a broader audience
    • Published the monthly report for January 2023
    • Reviewed the spec and discussed individual aborts with researchers
    • Compute and publish script information along benchmarks on every PR and website

    What are the goals of next week

    • Add rollback section to Hydra spec, update pictures and publish it as part of repository
    • Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository.
    • Groom & plan actions required for a maintainable Head explorer + break down align gaps feature.
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-01-26-mithril + + 2023-01-26T00:00:00.000Z + + High level overview

    The Mithril team released a new 2302.0 distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes.

    Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node.

    Low level overview

    • Released the new distribution 2302.0
    • Implemented a backward/forward compatibility mechanism for API messages #688:
      • Implement the mechanism for the signer registration #689
      • Implement the mechanism for the signature registration #693
      • Implement the mechanism for epoch settings #695
      • Implement the mechanism for certificate pending #696
      • Implement the mechanism for certificate #697
      • Implement the mechanism for snapshots list #698
      • Implement the mechanism for snapshot #699
      • Update enforcement of API version with Semver #705
    • Completed the PoC implementation of backward compatibility with protobuf #677
    • Completed the PoC implementation of backward compatibility with avro #678
    • Completed the PoC to Read/Write transaction on chain for Era activations #672
    • Completed the upgrade Cardano devnet to 1.35.4 #523
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-01-25-consensus + + 2023-01-25T00:00:00.000Z + + High level summary

    During the past two weeks, the consensus team finished the testing activities +around the UTxO-HD prototype. This is a very important milestone which will +enable us to run system-level tests and benchmarks, as well as start refactoring +and cleaning the prototype. Regarding our Genesis workstream, we elaborated a +roadmap that gives an indication of the remaining work. We also continued our +work on benchmarking chain-sync-jumping. We also continued working on improving +the way we handle blocks from the future, and advancing the integration of the +new VRF and KES crypto.

    Workstreams

    UTxO HD Prototype

    As the prototype is nearing its completion, it was important to have enough +confidence that we will be able to move additional parts of the ledger state +onto disk. We worked together with the Ledger team to elaborate a +sketch on how the UTxO-HD design would accommodate the migration of +additional data from memory to disk. This gave us enough confidence that the +current architecture will be extensible in the future.

    On the testing front, we added property-based tests for the UTxO-HD +type classes.

    We also enabled disabled components, and addressed several +technical debt issues:

    • Implement splitSized anti-diff split (#4269), and integrate it +into consensus (#4273).
    • Renaming of peekVal to peekMDBVal (#7).

    We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We +found a race condition in the LMDB backing store, which we fixed. +After the fix we were able to successfully run these benchmarks. The results +were published by this pull request.

    We used our db-analyser tool to benchmark the cost of reading keys and +flushing values to disk. The following plot shows the duration of these disk +operation in relation to the main ledger operations, where we can see that the +cost of the former are comparatively low. The spike at the beginning of the +graph is when, at the start of the Shelley era, the entire UTxO set is flushed +to disk.

    UTxO-HD read and flush benchmarks

    After months of hard work adding tests for the prototype, we are ready to run +end-to-end tests on the node, and system level benchmarks. This signals a very +important milestone for the UTxO-HD workstream 🎉.

    Genesis

    We elaborated a high-level decomposition of the remaining +work for Genesis. We also continued benchmarking the chain-sync-jumping +happy-path.

    Technical debt

    We continued working on improving the way we handle blocks from the future.

    Support

    We completed the mapping of Crypto to HeaderCrypto and body Crypto. +HeaderCrypto is moved to cardano-protocol-tpraos. We created a draft pull +request to facilitate compiling consensus.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2023-01-25-node-cli-api + + 2023-01-25T00:00:00.000Z + + 2023-01-25 - 2023-02-07

    High level summary

    General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the cardano-cli query stake-snapshot command.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-01-20-crypto + + 2023-01-20T00:00:00.000Z + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We explored whether some uses of transmute could be removed, but it resulted in considerable regression.
    • cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision.
    • KES agent: An inconsistency between contra-tracer available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the contra-tracer used by consensus.

    Low level summary

    Mithril

    • We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average PR#675. We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing.
    • We are writing a RFP for the audit of the core library.

    cardano-base

    • A problem with Nix is blocking merge of PR#341
    • Plutus team ran benchmarks of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution.
    • Team is fully digesting the Plonk paper.
    • There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used.

    KES agent

    • A little unforseen delay has been caused by a mismatch in the use of contra-tracer. The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are doing the change, but still the CI is not happy.
    • The same was needed for the KES agents prerequisites PR#317.
    • We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-01-20-hydra + + 2023-01-20T00:00:00.000Z + + High-level summary

    This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1 +specification. Of which a first version has been aggregated and is currently +under review. They aligned the on-chain scripts of reimbursing funds on abort +like defined in the specification, improved the mutation test framework to have +more control when testing plutus scripts. The added HeadId in the API and the +TUI example client make hydra-node easier to use and a first experiment of a +Hydra Head explorer was showing the utility of this - see what Heads exist on +the preview network here.

    What did the team achieve this week

    • HeadId to API and display in the TUI #678
    • Experiment of creating a hydra explorer, first result hosted here
    • Improved mutation framework allowing to fail for the right reason #679
    • Correctly reimburse funds in abort (matching the spec) #670
    • Finished a first write-up of the Hydra HeadV1 spec: Read it on overleaf (Communication channels for feedback)

    What are the goals of next week

    • Monthly review meeting with a broader audience
    • Groom & plan actions required for a maintainable Head explorer
    • Break “align gaps” feature into smaller chunks (at least on- /off-chain) and groom it
    • Review the spec & discuss individual aborts with researchers (a bigger open question)
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Network Team Update]]> + 2023-01-20-network + + 2023-01-20T00:00:00.000Z + + High level summary

    We have been working towards cardano-node-1.35.5 release. QA & benchmarking +teams gave a green light for the release, and we made decent progress with some +CI problem which we encountered on the way (PR #4612). We are also working on +peer sharing, making improvements in our testing infrastructure, reducing +technical debt and making progress towards io-sim-1.0.0.0. Galois is making +progress on Handshake improvements.

    Low level summary

    Our diffusion simulation network now includes a mixed network of initiator +only and initiator and responder nodes. issue #4222

    We are now reviewing the peer sharing pull request.

    We are also reviewing pull request which introduces handshake query flag. PR #4256

    We fixed a bug in our network simulator. The bug was triggered when a node +died when performing a simultaneous TCP open (a corner case of a corner case!). PR #4265

    We also refactored Snocket interface and removed the bearer construction from +its methods. PR #4260

    We are working towards releasing io-sim-1.0.0.0 on Hackage, which includes +reviewing two PRs: PR #57 and PR #60 as well as writing an announcement +blog post.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + + +
    + + <![CDATA[SRE Team Update]]> + 2023-01-20-sre + + 2023-01-20T00:00:00.000Z + + High level summary

    The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing +support for cardano-world.

    Lower level summary

    Cicero

    • Fixed various race conditions around transformers.
    • Brought our CI up to date.
    • Migrated to the Nomad exec driver with Nix support for many actions.
    • Moved Nix builds to the Nomad clients for much better cache locality.
    • Ongoing work on vastly improving the action matching and evaluation speed.

    Tullia

    • Made it easier to support cloning from a PR's fork
    • Update to latest std
    • Add workaround for cgroup issue: nomad#12877
    • github preset: add github.ci.remote and (read|get)Repository functions
    • Fix various issues around CUE handling

    Bitte

    • Upgrade to NixOS 22.11
    • Prototype usage of Colmena for deploys instead of deploy-rs
    • Finalized work on Equinix Metal support
    • Prototype better secrets management with ragenix instead of sops-nix
    • Improve CI and bring it up to date

    cardano-world

    • Fixd various OOM issues on preview and preprod
    • Rotated KES keys on preview and preprod
    • Optimize mainnet db-sync to cope with higher load
    • Fix an issue where PostgreSQL would fail after a reboot

    bitte-world

    • Updated to NixOS 22.11

    ci-world

    • Updated to NixOS 22.11
    • Added Equnix cluster
    • Improve caching of Nix builds
    ]]>
    + + Michael Fellinger + https://github.com/manveru + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-01-19-ledger + + 2023-01-19T00:00:00.000Z + + High level summary

    The ledger team completed some preliminary ground work in preparation for CIP-1694 +(restructuring the ledger state), +fixed the PDF hosting problem (mostly the formal specs), +built out more of the new user-friendly ledger API, +finished a proof of concept for constraint-based generators for property tests +(with the hopes of being able to replace our trace generators one day), +and addressed technical debt.

    Lower level summary

    Restructuring the ledger state

    The existing governance structures will be replace in the conway ledger era, +as described in CIP-1694. +In particular, the ledger rules will be restructured as follows:

       BBODY
    |
    |-------------------------------|
    v v
    TICK LEDGERS
    | |
    |---------| |
    v v v
    RUPD ~NEWEPOCH~ ~LEDGER~
    | |
    |----------| |--------|-------------------|-----------|
    v v v v v
    ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+
    | | |
    |---------|------------| v |
    v v v DELPL v
    SNAP POOLREAP -UPEC- | UTXO
    |--------| |
    v v v
    POOL DELEG ~UTXOS~

    -..- Removed
    +..+ Added
    ~..~ Modified

    Moreover, the ledger state will also be restructured in accordance with the new rules. +In the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT. +We have also adapted all the data structures in the ledger state.

    See:

    PDF hosting

    We now build all of our PDFs using a GitHub action which is triggered by pushing a tag +with a specific form, cardano-ledger-spec-YYYY-MM-DD. +The action creates a GitHub release containing the PDFs. +The links in the main ledger README now point to the PDFs in the latest release.

    See:

    Powering the new ledger API

    We have now removed all the HasField instances from the protocol parameter data types, +and replaced them with lenses. +This is probably the last major restructuring that the ledger team will do on the code base +for the API for a while +(the Plutus tools team will be working on it next, see here). +We also added a new helpful function ensureMinCoinTxOut.

    See:

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We would like to switch to tests which instead generate a random ledger state representative +of not just an initial state, generate a single random valid block, and then test our properties. +The hope is that these will be much more random and easier to maintain.

    We have finished a proof of concept are encouraged that this approach could work!

    See:

    Technical debt

    • pull-3244 massive CI speedup
    • pull-3249 better types for fees in the protocol parameters
    • pull-3264 move our annotator code to the cardano-ledger-binary package where it belongs
    • pull-3239 move the Wdrls type to the Core module.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[DB-sync Team Update]]> + 2023-01-14-db-sync + + 2023-01-14T00:00:00.000Z + + High level summary

    After spending the last months on improving DBSync and releasing 13.1.0.0 the DBSync team focused +the last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the +new leger core and ghc-9.2.4

    Lower level summary

    • Integrate CHaP +#1331
    • Integrate new ledger core 0.1.1.1 and ghc-9.2 +#1332
    • Technical debt: Add code formatter fourmolu +#1334
    • Preparing and tracking Conway and UTxO integration
    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Hydra Team Update]]> + 2023-01-13-hydra + + 2023-01-13T00:00:00.000Z + + High-level summary

    Since last weekly update before christmas, the Hydra team worked on the +technical specification, closed gaps in hydra-plutus scripts, made the unique +headId available to Hydra clients through the API, allow the hydra-node to +explicitly synchronize from genesis (if configured), and fixed smaller log and +build issues reported by new users.

    Besides this, a retrospective blog +post +was published by Matthias Benkort (CF) on Hydra, summarizing our progress made +in 2022 also an outlook where Hydra is headed for in 2023. Also, the team had +some first sessions on the voting project with Catalyst and the CF.

    A full digest monthly digest for December 2022 can be found on the hydra +website.

    What did the team achieve this week

    • Had some first sessions on the voting project with Catalyst and CF
    • Published retrospective blog +post +by Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also +an outlook where Hydra is headed for in 2023.
    • Worked on the LaTeX spec for HydraHeadV1, not final or published yet - latest +version in this repository.
    • Add unique headId to API and hence make it available to clients.
    • Allow hydra-node to explicitly synchronize from genesis using --start-chain-from 0.
    • Closed gaps in hydra-plutus scripts
      • bounded transaction validity (ADR21)
      • enforcing contract continuity via state token in output
    • Fixed JSON for some logs and smaller build issues reported by new users.

    What are the goals of next week

    • Reach out to have hydra-tutorial integrated.
    • Plan the next couple of months.
    • Complete checking reimbursing of commits in head validator.
    • Align plutus scripts to spec and simplify them (identified some simplifications)
    • Improve mutation framework to be sure we fail tests for the right reasons
    • Complete the spec except the open points (<5) and also discuss them with researchers.
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Node Release Team Update]]> + 2023-01-13-release + + 2023-01-13T00:00:00.000Z + + Node Reelease Update

    2022-11-02 - 2023-01-13

    Executive Summary

    A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on +release/1.35 branch and does not bump cardano-ledger.

    The team successfully integrated an interim release bump of ledger and consensus into cardano-node master. +This work will not be released in a node version, but will be continued by the current dependency bump in progress.

    We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again.

    The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress.

    Completed

    In Progress

    ]]>
    + + Samuel Leathers + https://github.com/disassembler + + +
    + + <![CDATA[System Test Team Update]]> + 2023-01-13-system-test + + 2023-01-13T00:00:00.000Z + + High level summary

    During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the P2P Single +Relay functionality.

    We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level.

    Workstreams

    Framework improvements:

    • extended the cardano-node-tests with the ability for anybody to fork the repo and run all our System Tests on GitHub Actions
    • added 2 new nightly pipelines - nightly-mixed and nightly-p2p - details here
    • some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;

    === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) === + to + === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===

    Node:

    • ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled
    • started the preparations for testing the next tag - details here

    DB-Sync:

    • some improvements on db-sync sync tests
    ]]>
    + + Dorin Solomon + https://github.com/dorin100 + + +
    + + <![CDATA[Mithril Team Update]]> + 2023-01-12-mithril + + 2023-01-12T00:00:00.000Z + + High level overview

    The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ADR. They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible.

    Finally, they have worked on upgrading the devnet and fixing some flakiness in the end to end tests of the CI.

    Low level overview

    • Implemented the redaction of an ADR for handling graceful updates of the Mithril Network #671
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with protobuf #677
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with avro #678
    • Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction #672
    • Worked on upgrading the Cardano node of the Mithril devnet, as well as fixing flakiness of the CI #523
    • Prepared and tested the new 2302 distribution pre-release 2302.0-prerelease
    • Updated the documentation for SPO to build a signer node in order to better reflect the new release process #681
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Consensus Team Update]]> + 2023-01-11-consensus + + 2023-01-11T00:00:00.000Z + + High level summary

    The consensus team is resuming its activities after the Christmas break. During +these weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and +discussing with the Ledger team the changes that might be required for the next +iterations. The pull request that adds the Conway era is waiting for a second +review round and we hope to merge it soon. On the technical debt side we are +looking into a property-test failure found in the iterators. We are +investigating if this is an error in the model or in the implementation. We also +improved the documentation of our testing code.

    Workstreams

    UTxO HD Prototype

    We worked with the Ledger team to start preparing the next versions of UTxO-HD. +The Ledger team is concerned that for the remaining maps we might need the full +ledger state on epoch boundaries. Since the main consumer of the ledger rules is +Consensus, the code that requires access to a full state could be moved from the +ledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take +place in such bridge, instead of querying the ledger for the values that are +required in the epoch-transition computations.

    We relocated some UTxO-HD definitions, in preparation for merging +the prototype into master.

    We also completed updated local benchmarks comparing the replay time and memory +consumption of:

    • the baseline node (f2fc76ef45647275c98634da1718290b976ff364)
    • the UTxO-HD node with the in-memory backend
    • the UTxO-HD node with the LMDB backend

    The following plot shows the results: we can see that the LMDB node barely +reaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The +in-memory backend is about 30 minutes faster, but still slower than the baseline +version. We are aware of this phenomenon and it is inherent to the problem of +maintaining sequences of differences of the last k ledger states that allows +us to perform rollback and roll-forward. We are in the process of measuring +syncing from scratch times.

    We also added StaticEither accessors that helped us to simplify +the UTxO-HD prototype.

    New Conway era

    We incorporated the feedback of the pull request, and rebased this +branch on top of master. The PR is pending a second review round and we hope +to merge this soon.

    Technical debt

    We are investigating a property-testing failure involving +iterators. Solving this requires understanding the expected behavior of +iterators in the counterexample found by QuickCheck to determine if the error +is in the model or in the implementation.

    Fostering collaboration

    We moved the contents of docs/Testing.md closer to the code, so that the +explanations about the tests are easier to find in the relevant modules, and the +documentation is easier to keep up to date.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Performance & tracing update]]> + 2023-01-11-performance-and-tracing + + 2023-01-11T00:00:00.000Z + + High level summary

    Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:

    1. SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress.
    2. The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over.
    3. Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks.
    4. New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs.
    5. Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench.
    6. Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.

    Performance

    The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on.

    Tracing

    The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done.

    Infrastructure

    Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components.

    On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters. +We now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes.

    We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development. +Once this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads.

    ]]>
    + + Serge Kosyrev + https://github.com/deepfire + + +
    + + <![CDATA[Crypto Team Update]]> + 2023-01-06-crypto + + 2023-01-06T00:00:00.000Z + + High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: The API features (error handling) has been merged.
    • Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI.
    • KES agent: We keep progressing with KES secure forgetting implementation.

    We also started working in the cryptography engineering handbook, which will be a cross team effort.

    Low level summary

    MuSig2

    • Merged the more granular error handling mechanism PR#33

    Mithril

    • Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in Version 0.1.1, which was published in crates.io.
    • Updated new KES format to mithril library PR 674
    • We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync PR 531
    • We keep progressing on reducing the use of transmute in mithril-stm.

    cardano-base

    • Nothing new to report. Still working in merging these PRs. We are only missing nix merge of PR#520 and the updates on VRF will be merged.

    KES agent

    • We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests PR#255.

    Cryptography handbook

    We have made available the (temporary) cryptography handbook https://input-output-hk.github.io/cryptography_spec/, and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives.

    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-01-05-ledger + + 2023-01-05T00:00:00.000Z + + High level summary

    The ledger team finished up the remaining work for tracking individual depots, +built out the new Conway era transaction body (in line with CIP-1694), +greatly reduce some problematically large calculations on the epoch boundary, +and addressed technical debt.

    Lower level summary

    Finishing the deposit tracking

    The initial work on the individual deposit tracking project focused only on correctness. +As this is a large data structure +(since its size is linear with respect to the number of registered stake credentials), +it is very important that we also reduce the memory overhead as much as possible. +Fortunately, we were able to add very little overhead for the deposits by using existing +efficient data structures. The extra tracking now only incurs one word (8 bytes) +per registered stake credential.

    See:

    New Conway era transaction

    We implemented the Conway era transaction body, which is in line with CIP-1694. +Note that the Conway era implements, losing speaking, the parts of CIP-1694 that are not +related to the liquid democracy (the "DReps"). +The new transaction body adds the new governance actions and votes, +while also deprecating the old governance structures +(i.e. the old protocol parameter updates and MIR certificates).

    We also now have the wire specification (CDDL file) and serialization code in place. +The wire specification is still subject to change while we work on the Conway era, +but it is now usable and has proper testing support +(so that, for example, the serialization round-trips, etc).

    See:

    Optimizing the TICKF transition

    Every since the release of the Shelley era, we have been working to reduce the computational load +placed on the node by the ledger at the epoch boundary. +While still not perfect, we believe that we have removed one of the final problematically long +epoch boundary computations that exacerbate situations like +this. +In particular, the problem involved the way in which the consensus layer obtains a view of the +ledger for the purposes of checking the leadership schedule in a new epoch. +We implemented a stopgap measure which now only incurs a single multi-second cost once per epoch +instead of potentially several multi-second costs while the networks waits for the first block +of a new epoch to be minted.

    See:

    Technical debt

    We closed the year out with a lot of reduction to the technical debt!

    Improved ledger event

    • pull-3212 - The ledger events are not guaranteed to appear in any given order within a block. +For this reason, motivated by the use case in db-sync, the TotalDeposits event now +includes a transaction ID and emits the change in deposits instead of the value.

    Improved type saftey

    • pull-3208 - We replaced NominalDiffTime with a newtype wrapper. The problem was that our CBOR +encoders and decoders were using the wrong level of precision, having to due with with +the Shelley genesis file. We removed the potential problem with a newtype wrapper.
    • pull-3167 - We now use a GADT to ensure consistency of the Plutus language in the types +for TransactionScriptFailure and PlutusDebug.

    Code/Module organization

    • pull-3175 - The Allegra and Mary eras had an unusual relationship in our codebase, +due to the uncertainly of release dates while we were implementing them. +In particular, they were coupled in way that is different from the rest of the code base. +With hindsight on our side, we split the combined shelley-ma Haskell package into two +separate ledger era packages, which is now consistent with the rest of the repository +and module structure.
    • pull-3184 - We created a core test sub-library, cleaning up a lot of our property test +generator code.
    • pull-3210 - We moved the KeyPair type to the test library. Outside of testing, +the ledger does not need to deal with signing keys, and since this is a topic that +deserves the utmost care, it is best to make it clear that our use of signing keys +is only for testing.
    • pull-3229 - We split the Cardano.Ledger.Alonzo.Data module, which is more consistent with the rest +of the codebase.

    Revert pointer address deprecation

    Thanks to one of our excellent internal auditors, +@jmhrpr, +we now have a better plan for deprecating pointer addresses. +This meant that we had to revert the previous work to deprecate them.

    See:

    Miscellaneous

    • pull-3205 - We removed deprecated type synonyms.
    • pull-3218 - We cleaned up the address deserialization.
    • pull-3223 - We fixed faulty address deserialization tests.
    • pull-3222 - We switched to a general type family TxOut from concrete ones, +reducing many constraints.
    • pull-3224 - ShelleyGenesis is now parameterized by crypto instead of by era.
    • pull-3170 - We set the cabal-version to 3.0 in our projects.
    • pull-3172 - We removed the now useless EncodeMint/DecodeMint classes.
    • pull-3225 - We switch from ormolu to +fourmolu. +The reason was to be able to finally have more diff friendly code!
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-12-28-node-cli-api + + 2022-12-28T00:00:00.000Z + + 2022-12-28 - 2023-01-10

    High level summary

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-12-16-hydra + + 2022-12-16T00:00:00.000Z + + High-level summary

    This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on the website and reduced the cost for commit transactions by ~30% with the help of reference scripts.

    The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023.

    What did the team achieve this week

    • Kicked-off Hydra Voting project with Catalyst, CF, and IO Research.
    • Reduce commit transaction costs by ~30% with reference scripts.
    • Prepared an RFP for external audit of the Hydra Head solution.
    • Fixed transaction cost benchmarks for abort tx #631.
    • Recorded decision to use model-based testing (ADR22) and improved Model documentation.
      • Concluding the first increment on Validate coordinated Head protocol #194.
      • Formulated next step / follow-up on testing the Soundness property of our protocol #656.
    • Switched to using nix flakes for development setup and CI build #646.

    What are the goals of next week

    • Push ADR21 & tx validity gap over the finish line (smoke tests missing).
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Close & recap on the year with another monthly report (+ blog post).
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Mithril Team Update]]> + 2022-12-15-mithril + + 2022-12-15T00:00:00.000Z + + High level overview

    The Mithril team has released the new distribution 2248.1 of their nodes. They have published the first version of the Mithril cryptographic library on crates.io, the Rust community’s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots.

    Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities.

    Low level overview

    • Implemented removing verification key and stake from single signatures #619
    • Completed the extraction of the signer registration from the multi-signer #642
    • Completed the extraction of the certificate creation from the multi-signer #638
    • Implemented a workflow to test client binaries (Linux / MacOS / Windows) #601
    • Completed the signature of the artifacts produced by the CI #587
    • Fixed the protocol parameters transition #627
    • Worked on optimizing the snapshot digest computation #510
    • Worked on enforcing the API protocol versions in the client and signer #633
    • Worked on deactivating the non certified signer registration mode #621
    • Worked on the re-genesis of the test networks #651
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-12-14-consensus + + 2022-12-14T00:00:00.000Z + + High level summary

    During the past two weeks, the Consensus team finalized the QSM tests for the +backing store and Mempool on the UTxO-HD branch with important discoveries +regarding parallel QSM testing. We also worked with the Ledger team to envisage +the modifications that are required in Ledger and Consensus to accommodate the +changes in the crypto VRF and KES. The db-analyser now supports bechmarking +the ledger operations, which will allow us to identify, debug, and profile +potential performance problems. We drafted a document that defines how to manage +the versions of Consensus-related packages. The top level documentation of +ouroboros-network now features a description of the consensus components and +provides a hyperlinked map to the modules documentation.

    Workstreams

    UTxO HD prototype

    Whereas we had passing sequential state-machine tests for the mempool, the +parallel case proved to be more challenging than we thought. The operation of +adding a list of transactions to the mempool is not atomic and, as a result, +when adding a list of transactions, transactions from other processes can be +added in between. The mempool implementation handles this correctly, however +this required us to redesign the parallel model we had to take +the lack of atomicity into account.

    Backing store property tests

    We finished refactoring the backing store property tests. The second review +round is ongoing.

    LSM tree implementation

    We are working on benchmarking (in terms of time and number of IO operations) +fetching/looking up data from disk.

    Genesis

    We worked on the design of a mechanism to prevent a DoS attack on our Genesis +design related to rollbacks. This was arguably the biggest outstanding question.

    During the discussions around Genesis, we noticed a design boundary that nicely +delineates a fundamental component. We almost have a full Haskell prototype of +it. It will be very nicely self-contained, perhaps even usable in the ultimate +implementation!

    New VRF and KES crypto integration

    We collaborated with the Ledger team on preparing the ledger state and crypto +types to avoid huge allocation on the epoch boundary when changing aspects of +the crypto that will only manifest in headers, not in the ledger states.

    Technical debt

    We merged the pull-request that adds a support to db-analyser for +benchmarking ledger operations. This will allow us to identify, debug, and +profile potential performance problems. The benchmark focus on the main 5 ledger +operations that are involved in chain syncing, block forging, and block +validation, namely:

    1. Forecast.
    2. Header tick.
    3. Header application.
    4. Block tick.
    5. Block application.

    The following figure shows a plot of the benchmarking results for the first 65 +million blocks (approximately) of the Cardano chain. The thin yellow lines under +the x-axis show the epoch boundaries, whereas the thick yellow lines correspond +to the era transitions.

    As we can see in this figure, era and epoch boundaries require more computation +time. The ledger team are aware of this problem, and we are working to improve +this situation.

    Fostering collaboration

    We drafted a document motivating and defining how Consensus (and +possibly other core teams) will/should manage our package versions. This +pull-request garnered many great discussions from our team members and other +teams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et +al. We want to thank you all for your input, and we found this discussion very +enlightening!

    We merged the pull request that adds an overview of consensus to +the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[DB-sync Team Update]]> + 2022-12-14-db-sync + + 2022-12-14T00:00:00.000Z + + High level summary

    The DBSync team continued testing release 13.1.0.0. The QA team has reported that no issues have +been found. The DBSync team also worked on cherry-picks back to master and on fixing bugs.

    Lower level summary

    • Release is cherry-picked back to master, which uses the new rollback mechanism which uses +reverse indexes, same as the release +#1320 +This also fixes a bug number of issues on master.
    • Depenencies upgrade and CHaP integration +#1324
    • AdaPots fix #1323. This +fixes an issue where the per epoch AdaPots didn't match the epoch boundary, but +they also included changes from the first block of the epoch.
    • Deposits Event fix #3212. This pr +adjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the +number of queries that db-sync does during syncing an make syncing faster.
    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-12-14-node-cli-api + + 2022-12-14T00:00:00.000Z + + 2022-12-14 - 2022-12-27

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Performance & tracing update]]> + 2022-12-14-performance-and-tracing + + 2022-12-14T00:00:00.000Z + + High level summary
    1. SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment.
    2. A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery.
    3. The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals.
    4. Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started.
    5. Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.

    Performance

    The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload.

    We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling.

    Tracing

    After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical.

    To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:

    1. We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration.
    2. The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.

    All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further.

    In addition, we're still pursuing our performance-enhancing rework of the new tracing internals.

    Infrastructure

    After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends.

    Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it. +This means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis. +This will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports.

    A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches. +Previously we only had automation for two aspects separately, so we only could either:

    • compare individual runs (used for different node configurations / versions)
    • collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version) +Naturally, combining these two capabilities was a long-desired feature of our analysis pipeline.
    ]]>
    + + Serge Kosyrev + https://github.com/deepfire + + +
    + + <![CDATA[Network Team Update]]> + 2022-12-12-network + + 2022-12-12T00:00:00.000Z + + High level summary

    In last sprint the team focused on preparations for the conference talk at +OPODIS 2022. We also worked on preparations to publish io-sim and related +packages on Hackage (PR #57, PR #60).

    We also started reviewing:

    • ouroboros-network
    • cardano-node
    • cardano-ledger +repositories for open-source readiness (PR #4128).

    We prepared a PR which changes how node-to-node and node-to-client protocol +versiones are serialised in cardano-node log (PR #4691).

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + + +
    + + <![CDATA[Crypto Team Update]]> + 2022-12-09-crypto + + 2022-12-09T00:00:00.000Z + + High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency.
    • Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack.
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • [Still in progress] We are introducing a more granular error handling mechanism PR#33
    • We merged the API redesig PR#35
    • We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future PR#36

    Mithril

    • We merged the individual signature PR#620
    • We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (kes repo)

    cardano-base

    • Nothing new to report. Still working in merging these PRs.
    • We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a bug in GHC

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Fixed a 'use-after-free' bug in the KES agent.
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-12-09-hydra + + 2022-12-09T00:00:00.000Z + + High-level summary

    This week, the Hydra team has worked on completing to "Validate coordinated head protocol against formal model", this is a huge step to verify the implementation is secure. They also worked on implementing ADR21 related to bounded tx validity which is now under review. HydraPay project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of issues they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced.

    What did the team achieve this week

    • Document model based testing #194 & #641
    • Got ADR21, reducing gaps between implementation and specification, under review.
    • Complete review on hydra-tutorial.
    • Complete first round of review on HydraPay work #634
    • Meeting with Director of CyberSecurity frio IOG to unblock "the RFP prepared for the external audit" #606
    • Remove vasil-dev and testnet from smoke-test because they were not working #630
    • Fix flaky plutus-merkle-tree test #642
    • Refactor NetworkSpec to improve legilibility.
    • Fix benchmark cost for abortTx #631
    • Adapt nix.conf to the recent hydra-ci nix cache migration.

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation.
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Get Cicero (new CI) working.
    • Use reference inputs to reduce the cost of the commitTx.
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-12-09-ledger + + 2022-12-09T00:00:00.000Z + + High level summary

    The Plutus tools team at IOG has started helping the ledger team to build out a user friendly +cardano-ledger-api package! +A GitHub project +will be filled out in the days ahead, +people interested in the API can use it to follow along and join in on the conversations.

    The ledger team has started using +architectural decision records +to leave a record of important decisions that the team makes. +We will retroactively go back through past decisions and make ADRs for them.

    The logic to track individual deposits is now nearly in place. +We are prioritizing correctness with our first pull request, and will follow up with +performance optimizations and general cleanup next.

    Pointer addresses are being deprecated with the Cardano major protocol version 8. +See CPS-0002 +for more context.

    Lower level summary

    Cardano ledger API

    The Plutus tools team has taken our minimal cardano-ledger-api package and started filling it +out and adding much needed documentation. +They have also added doctests! +In the days to come, the Plutus tools team will map out a lot more work for the API and record +it in this +GitHub project.

    See

    Architectural Decision Records (ADRs)

    We are now providing more context and leaving a record of important decisions that are made +in the ledger. The first ADR explains the very lightweight process.

    See

    Tracking individual deposits

    See ADR-3 +for background. +We now have the logic in place to track individual deposits, and a host of property tests +to make sure that the logic is correct. +The current implementation uses more memory than it needs to, and we will address that next, +with our hope being to only use one word (8 bytes) per registered stake credential. +There is a fair amount of other cleanup needed for general maintainability.

    See

    Removing pointer addresses

    Pointer addresses, which have never seen any real use +(there are something like eleven on mainnet), are being deprecated starting at Cardano major +version 9. +CPS-0002 gives the context. +We are disabling them by first preventing transaction outputs containing them +from being serialized by the node at the moment we switch to version 9. +At the hard fork after that, we will translate the existing few pointer addresses +to enterprise addresses.

    See

    Technical debt

    • pull-3162 - Sometimes we have to put safeguards in place for hard forks which may never +be exercised. After we have passed the given hardfork, we are able to clean up the code +and simplify our logic. We removed all of the ones that we are currently easily able to.
    • pull-3165 - We improved the type safety of our code while also discovering and fixing +a serialization bug.
    • pull-3172 - We removed dead code.
    • pull-3175 - The Allegra and the Mary code used to be coupled in a particular way the we grew to +dislike. We made these two ledger eras now uniform with the rest of our code base.
    • pull-3184 - We organized our property testing code.
    • pull-3200 - The Plutus tools teams fixed an outstanding bug in the translation from the +ledger state to the Plutus script context.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-12-02-hydra + + 2022-12-02T00:00:00.000Z + + High-level summary

    This week, the Hydra team has worked on cleaning up several things in progress +after last week's summit. They have extended their model-based testing (MBT) +approach with transaction creation & observation +#410, solved +AcquirePointTooOld problems of the hydra-node with by changing the wallet +initialization #439. +Also, the Hydra researchers updated the security proofs of the Coordinated Hydra +Head, which are bound to be included in the Hydra HeadV1 specification.

    What did the team achieve this week

    • Monthly review & report - will also be published on our website #644
    • Extended the model-based testing (MBT) with transaction creation/observation #410
    • Solve AcquirePointTooOld problems with new wallet initialization #439
    • Fixed our hydraw deployments (EC2 instances)
    • Created & discussed ADR21 within tx validity work
    • Received & discussed security proofs of Coordinated Hydra Head (requires more work)

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation
    • Complete review & integrate the Hydra tutorial
    • Review latest hydra-pay work
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec
    • Get Cicero (new CI) working
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[DB sync Team Update]]> + 2022-12-01-db-sync + + 2022-12-01T00:00:00.000Z + + High level summary

    The DB Sync team prepared a release 13.1.0.0-rc2 which includes many improvements for db-sync, +it makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces +migrations. This release finalises the objectives that were set for db-sync for the previous +3 months period and part of the syncing speed objective set for the next period +Changelog

    Lower level summary

    • Branch release/13.1.0.x +includes all the improvements related to the release. The release is passing through the testing +phase and a number of bugs and issues have been fixed, like +#1312 +#1311. +Also many new unit tests have been added.

    • Part of the release branch is cherry-picked back into master, in a way that it respects the new +release and development process, so that it takes into account migrations +release process

    • The DB Sync team has also tagged release 13.0.6 which better supports preview and preprod for +docker.

    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Mithril Team Update]]> + 2022-12-01-mithril + + 2022-12-01T00:00:00.000Z + + High level overview

    The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes.

    Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer.

    Low level overview

    • Implemented custom Mithril SPOs on testing/pre-release networks #563
    • Deprecated Signer Declarative Pool Id registration mode #585
    • Completed the second stage of the store automatic migration process #600
    • Completed the deployment pipelines to crates.io registry #588
    • Completed automatic generation of nodes/libraries versions manifest in releases notes #599
    • Completed CI/CD handling of PR from forks #597
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #586
    • Worked on signing the artifacts released in the distributions by the CI/CD #587
    • Worked on multi-platforms end to end test #601
    • Worked on the refactorizaton of the aggregator multi-signer engine #398
    ]]>
    + + Jean-Philippe Raynaud + https://github.com/jpraynaud + + +
    + + <![CDATA[System Test Team Update]]> + 2022-12-01-system-test + + 2022-12-01T00:00:00.000Z + + High level summary

    During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the P2P Single +Relay functionality, and also tested some DB-Sync tags.

    Workstreams

    Framework improvements:

    • moved the System Test CLI Pipelines from BuildKite to Github Actions
    • improved the reporting tools to support the rerun of the failled tests and update of the reports
    • added support for Github API in report-aggregator, so reports will be generated from the GitHub nightly jobs from now on
    • added support for mixed topology - P2P, legacy, mixed topologies
    • planned the P2P Single Relay system test activities
    • added support to start regression tests with PV8 + better selection of tests

    DB-Sync:

    • confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)
    • tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2
    ]]>
    + + Dorin Solomon + https://github.com/dorin100 + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-11-30-consensus + + 2022-11-30T00:00:00.000Z + + High level summary

    During the past two weeks, the consensus team merged improvements to the monadic +cursor API that was needed to implement LMDB range reads, which is in turn +required for the implementation of the UTxO HD feature. We added tables to +several tests in for the UTxO HD feature, which increases our confidence in the +correctness of the prototype. The mempool property tests are close to being +completed. Also, we finished the LSM tree tuning algorithm.

    On the Genesis front we started simplifying the BlockFetch logic with +CSJ-specific workloads in mind.

    We are also documenting the Block Diffusion Pipelining feature, and added a +high-level overview of consensus to the top level documentation of +ouroboros-network.

    Workstreams

    UTxO HD prototype

    We merged the implementation of a monadic cursor API (#1)) which was +needed to solve a bug with LMDB range-reads. After this PR was merged, we focused on +bridging the gap between the lmdb-simple interface and consensus by facilitating +using lmdb-simple's cursor API without Serialise constraints (#3).

    We refactored the backing store property tests to use quickcheck-lockstep +(#4081).

    We added tables to the mock ledger in the UTxO-HD feature branch +(#4184). Every test that used to run with SimpleBlocks now uses +tables. This will enable us to exercise the UTxO HD mempool integration by +leveraging the existing mempool property-tests. The new state-machine +property-tests are still needed for testing the parallel behaviour of the +mempool.

    Our work on the mempool state-machine tests revealed the need for improvements +in the quickcheck-state-machine library. Parallel testing assumed that the +state machine did not have access to mutable references. However, the mempool +tests require the use of such mutable references for mocking the ledger +interface. As a result, our parallel tests were failing with rather obscure +messages. @Jasagredo submitted a pull request (#12) that allows for +new mutable references to be created at each run of the state machine.

    Backing store property tests

    LSM tree implementation

    We finished the LSM Tree tuning algorithm. We are currently tidying up the code +and gathering results (i.e., plots and their interpretation).

    CSJ prototype

    We started simplifying the BlockFetch logic with CSJ-specific workloads in mind.

    New VRF and KES crypto integration

    Started working on supporting new version of StandardCrypto which uses compact +KES and batched VRF (#4151).

    Technical debt

    We reviewed the existing state of the Block Diffusion Pipelining document. We +are now working on the "Implementation" section (#4020).

    Fostering collaboration

    We cleared up our understanding of the error dynamics of forecasting +(#4146 and #4174).

    We submitted a pull request that adds an overview of consensus to the top level +documentation of +ouroboros-network (#4197). This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    https://github.com/input-output-hk/ouroboros-network/pull/4197

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-11-30-node-cli-api + + 2022-11-30T00:00:00.000Z + + 2022-11-30 - 2022-12-13

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Performance & tracing update]]> + 2022-11-30-performance-and-tracing + + 2022-11-30T00:00:00.000Z + + High level summary
    1. Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release.
    2. SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench.
    3. The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks.
    4. Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started.
    5. Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.

    Performance

    We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release.

    Tracing

    For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them. +The idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time.

    To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics.

    Infrastructure

    Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation.

    In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model.

    The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged. +We are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration.

    We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability.

    We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP.

    As usual, a number of smaller workbench, data analysis & reporting improvements have been made.

    ]]>
    + + Serge Kosyrev + https://github.com/deepfire + + +
    + + <![CDATA[Network Team Update]]> + 2022-11-28-network + + 2022-11-28T00:00:00.000Z + + Stake-Driven Data Diffusion Release for Relays

    IOG networking team decided to release the Stake-Driven Data Diffusion with +Robust Optimised Peer Selection also more commonly known as P2P. In the +last update, we informed about a performance regression, but it turns out it +only affects block producers, and thus we highly advise against running it on +such nodes. Further investigation is required to find the cause of it.

    On IOG's benchmarking cluster we have seen quite a good performance improvement +on block propagation itself. The cluster is running a static topology with +valency 6 (each node is connected to 6 other nodes). In which every of the 50 +nodes are block producers. The setup of this network is the same as mainnet. +We've seen 40-50% performance improvement on block propagation comparing to the +same cluster deployed with the same topology but using non-P2P nodes. We think +this performance improvement is caused by using full duplex connections. Quite +likely the transaction traffic floating in both directions on the same TCP +connection helps to keep the TCP window open. Note that in a cluster of 50 +nodes with valency 6 the probability of having at least one duplex connection +is more than 50%. We don't expect the same improvement on mainnet because the +network is much wider and the transaction traffic is not as large.

    Just before the release we squashed two small bugs:

    • issue #4163 - top level integration bug in keep-alive;
    • issue #4177 - a bug in outbound-governor;
    • PR #4165 - a fix cardano-ping support of NodeToNodeV_10.

    Peer Sharing

    We were carrying a review of peer sharing PR.

    DeltaQ

    Neil Davies was invited to give a guest lecture entitled Avoiding System Catastrophes at UCLouvain.

    What have we achieve last sprint

    • issue #4163: we found out that a control message is not passed to the +keep-alive mini-protocol, this results in every demotion executing demotion +timeout rather than a graceful termination. With the fix the node will no longer log:

      { "kind": "PeerStatusChangeFailure"
      , "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"
      , "reason": "TimeoutError"
      }
    • issue #4177: we fixed an assertion failure in the outbound-governor; now +we don't try demoted peers which are being demoted already.

    • PR #4155: we refactored ouroboros-network packages. There's a top level +ouroboros-consensus-diffusion package which integrates network +& consensus code. We also introduced:

      • ouroboros-network-api package which contains the API shared between +network & conensus;
      • ouroboros-network-mock package which contains mock API used for testing +(e.g. a mock chain & chain producer, etc.)
      • ouroboros-network-protocols package which contains implementation of all +(but handshake) mini-protocols, exposes a testlib and contains test +and cddl components.

      This made the dependency tree of network & consensus packages much +cleaner.

    • PR #4169: we described the usage of release branches in CONTRIBUTING.md +doc.

    • PR #4165: we fixed cardano-ping support of NodeToNodeV_10 protocol.

    DeltaQ

    The abstract of the talk:

    An essential step to ensuring that distributed systems are fit for +purpose.

    Distributed systems have become an integral part of our society and +daily lives. We are, both implicitly and explicitly, individually as well as +collectively, placing ever more trust in them.

    Are they worthy of this trust? Our need for them to be ‘fit-for-purpose’ goes +well beyond notions of functional correctness (i.e. never getting the wrong +answer). We need them to deliver the desired outcomes in a timely, robust, +reliable, resilient fashion, at scale and in a sustainable way (both +economically and environmentally).

    This all sounds like a worthy aspiration, but what would be a practical +approach to capturing and reasoning about these issues? How can we ensure that +systems can meet their fit-for-purpose objectives, not just in their design but +as they are deployed, encounter the imperfect world, are scaled to become +economic, and proceed into ongoing maintenance?

    This talk will illustrate how the notions of Outcomes and Quality Attenuation +(as captured by ‘∆Q’) are being used to both frame the necessary notions and +provide a basis for assuring the refinement and reification of such systems, +from initial concept to operational infrastructure.

    You can download the slides from here.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + + +
    + + <![CDATA[Crypto Team Update]]> + 2022-11-25-crypto + + 2022-11-25T00:00:00.000Z + + High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team.
    • Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes
    • cardano-base: The VRF and BLS branchs are still open and in progress
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library PR#31
    • We are introducing a more granular error handling mechanism PR#33
    • We rethought the API and made it more consistent with the underlying secp256k1 library PR#35

    Mithril

    • The mithril crates in general will be published in crates.io, and we adapted the core library's README PR#616
    • We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information PR#620

    cardano-base

    • We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) PR#341
    • SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions PR#344
    • Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus PR#266

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-11-25-hydra + + 2022-11-25T00:00:00.000Z + + High-level summary

    This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a presentation about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas.

    What did the team achieve this week

    What are the goals of next week

    • Monthly report & review meeting
    • Tie up several loose ends / branches.
    • Resolve Tx validity discussions & PRs.
    • Review cicero PR & try it out.
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-11-23-ledger + + 2022-11-23T00:00:00.000Z + + High level summary

    We released CIP-1694, +our proposal for entering the Voltaire phase. +Please come join the discussion, this will be an incredibly exciting transition for +Cardano and we want everyone to participate!

    We now have a sensible way to version all of the serialization schemes used in the ledger. +The draft pull request was polished, reviewed, and merged this week. +This solves many problems that have vexed us since the beginning of the Shelley ledger era.

    Everyone working on the Cardano node is working together to improve our release process, +and the ledger team in particular dedicated one engineer to help with these efforts +for the next release.

    Lower level summary

    The Conway ledger era

    The current proposal in CIP-1694 encompasses two new ledger eras. +The first era will be called Conway, after the English mathematician John Horton Conway. +The community facing aspects of the Conway ledger era will be very minimal, +but it will pave the way for introducing liquid democracy. +The details can be viewed here. +We do not yet have a formal specification for the Conway era. +Our plan is to debut the +formal ledger model. +Briefly, the Conway ledger era will:

    • introduce SPO voting for hard forks (in the spirit of the now abandoned CIP-47)
    • provide an on-chain mechanism for rotating the governance keys
    • re-plumb the ledger rules involving governance to be in line with CIP-1694

    Versioned CBOR

    We now have the ability to easily tie our serialization schemes to the Cardano +major protocol version. +We still aim to preserve backwards compatibility as much as possible, but we now have a principled +plan for resolving problems (see CIP-ledger-cbor). +In particular, we can now address several long standing issues, such as +issue-2444, issue-2965, and issue-3003.

    The final (and massive!) pull request which brought us the versioning is pull-3138.

    Deposit tracking

    The draft pull request which was exploring how best to track individual deposits +is much closer now to being ready to take out of draft (pull-3127). +For background on the issue, see issue-3113. +This is quite an invasive change which effects many of our tests, which we are now addressing.

    Technical debt

    As always, we keep working on technical debt. +We have deduplicated a some things: pull-3129, pull-3162. +We have memoized a problematic computation (though more due diligence is needed before we can +merge): pull-3141.

    Node release

    We have been helping with the node release efforts. See pull-4608.

    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-11-18-hydra + + 2022-11-18T00:00:00.000Z + + High-level summary

    This week, the Hydra team released version 0.8.1, which includes several fixes and a user-wished extension of the persistence introduced by 0.8.0 of replaying server outputs to make clients like the hydra-tui be aware of the latest hydra-node state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from hydra-poc to hydra!

    What did the team achieve this week

    • Implemented replaying of server outputs to address #580
    • Released version 0.8.1 containing this and other fixes Release notes
    • Worked on the bounded tx validity as one of the on-chain script fixes, but couldnt finish it just yet #615
    • Collaborated with the education team on a Hydra tutorial.
    • Discovered and discussed issues with the seen ledger.
    • Renamed the Hydra repository hydra-poc -> hydra

    What are the goals of next week

    • Create and discuss an ADR about handling tx validity correctly.
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
    • Have a team workshop / hackathon after the summit:
      • Retrospective
      • Roadmapping session
      • Hack on something complex or useful
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Mithril Team Update]]> + 2022-11-18-mithril + + 2022-11-18T00:00:00.000Z + + High level overview

    The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks.

    Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer.

    Low level overview

    • Released a new Mithril distribution 2246.1
    • Completed the first stage of the store migrations process #562
    • Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes #565
    • Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage #576
    • Prepared a Daedalus synchronization benchmark video with/without Mithril #606
    • Upgraded the Cardano nodes of the testing Mithril networks to 1.35.4 #594
    • Worked on implementing SPO tests nodes on testing Mithril networks #563
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #588
    • Worked on the refactorizaton of the aggregator multi signer engine #398
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-11-16-consensus + + 2022-11-16T00:00:00.000Z + + High-level summary

    During the past two weeks, the consensus team started documenting the +implementation of the UTxO HD feature and continued developing tests for it. As +part of our work on UTxO HD, we improved the Haskell support for LMDB. We also +spent time working on the LSM tree prototype, and designed a parameter tuning +algorithm for it. Regarding our work on Genesis, our investigation of the +"plateaus" pointed at the TICKF slowdown on era boundaries as culprit. This +led us to developing a caching strategy that will not only remove the +aforementioned "plateaus", but can help alleviating the growing block production +delay on epoch switch. We also helped reviewing the block forge credential +hotswap feature, which is intended for use in the adoption of P2P.

    We also worked on paying technical debt and fostering collaboration. In +particular, we improved the io-sim framework, which is crucial for testing and +simulating Cardano components. We also removed thunks that appeared on era +translations, and improved our diffusion pipelining feature. We are working on a +presentation for explaining Praos and Genesis.

    High-level status report

    • Finish the UTxO HD prototype: in progress.
      • We added documentation for this feature.
      • We developed the second version of the mempool tests.
      • We fixed benchmarks that were inflating the speedup we observed in the +anti-diff implementation of sequences of differences. Speedups are now in the +range of [3.33, 4.75], which remain significant.
      • We continued improving Haskell LMDB support.
      • We finished implementing a "parameter tuning algorithm" for the LSM tree +prototype. This enables us to run experiments to check the correctness of +the algorithm.
    • Genesis: in progress.
      • Work investigating the "plateaus" in the ChainSync jumping prototype +pointed to the TICKF slowdown on era boundaries as culprit.
    • Tech debt:
      • We improved the capabilities of our io-sim library, which is crucial for +testing and simulating Cardano components.
      • We removed thunks from epoch translations in the ledger.
      • We added Linux CI support for lmdb-simple.
      • We got pending diffusion pipelining improvements merged.
    • Fostering collaboration:
      • We are working on a explanation of Praos and Genesis protocols.
    • Support:
      • Investigation of CSJ "plateaus" led us to developing a caching strategy for +TICKF that will not only remove these "plateaus", but can help alleviating +the growing block production delay on epoch switch.
      • We reviewed the block forge credential hotswapping feature which is intended +for use in the adoption of P2P.

    Workstreams

    Finish the UTxO HD prototype

    We merged PR #4060, which adds a report documenting the UTxO HD +feature, and puts emphasis in explaining how the mempool works in combination +with UTxO HD.

    We opened a draft PR with the second iteration of the property tests for the +mempool (#4076).

    We fixed the Arbitrary instances for keys and values in DiffSeq benchmarks +(#4143). The problem was that we were testing with mostly small +values, which artificially boosted the performance gains we saw on benhcmarks. +Speedups are now in the range of [3.33, 4.75] across the different +configurations.

    Backing store property tests

    We focused on incorporating feedback on the monadic cursor API PR (#1). +This required us to make small tweaks to quickcheck-lockstep to test the new +API. We also updated the backing store property tests to use the new version of +the monadic cursor API.

    LSM tree implementation

    We worked on the LSM tree prototype. In particular: finished implementing a +"parameter tuning algorithm" that adapts the LSM tree design based on factors +like:

    • workload
    • machine specs,
    • and characteristics of the data being stored.

    We are now running experiments to gather results and cross-reference them with +existing experimental results from the LSM tree paper to see if the algorithm is +working correctly.

    Benchmarking the CSJ prototype

    We focused on investigating the "plateaus" in the ChainSync tip, which turned +out to be due to the TICKF bug which we previously were only aware of in the +context of the long forging times near epoch boundaries. For the most drastic +patch by @nfrisby to speed up TICKF, full sync is speeding up by 7%.

    The following plot shows that by caching the TICKF the ChainSync tip and the +VolatileDB tip progress at the same rate.

    The plot below shows the speedup observed by caching the TICKF rule wrt the +baseline.

    Technical debt

    After addressing the PR comments, we merged PR #16, which implements +the MonadCatch instance for STM. This extends the capability of our io-sim +library, which is crucial for testing and simulating Cardano components PR #16 +closed #1461. This new feature was published as version 0.4.0.0 +of io-sim.

    We continued with our work fixing the NoThunk errors required for enabling +nightly tests, with the help of TVarInvariant checks in strict-stm and +nothunks libraries. We proposed fixes in cardano-ledger that took care of +thunks that appeared in era translations (#3143). The fixes will be +integrated back into consensus when cardano-ledger approves and publish the +changes introduced in #3143.

    We added CI support for lmdb-simple (#2). We currently test the build on +a Linux environment only.

    We got pending diffusion pipelining PRs (#3857, #3860, +#3856) merged, after rebasing and addressing feedback.

    Fostering collaboration

    @nfrisby finished a visualisation tool and outlined scripts for the Praos and +Genesis explanation presentations. The idea is to produce a video that gives an +overview of these protocols.

    Support

    We started working on caching the computation of the TICKF rule +(#4054), since this was blocking our benchmarking work for +Genesis. In addition, this issue has the Cardano community quite +concerned, so we are hoping the work done in caching the +computation of the TICKF rule can help alleviating the growing block +production delay on epoch switch.

    We reviewed the block forge credential hotswapping PR #3800 from the +networking team, which is intended for use in the adoption of P2P.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-11-16-node-cli-api + + 2022-11-16T00:00:00.000Z + + 2022-11-16 - 2022-11-29

    High level summary

    Completed

    docs

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Performance & tracing update]]> + 2022-11-16-performance-and-tracing + + 2022-11-16T00:00:00.000Z + + High level summary
    1. P2P performance investigation is ongoing, in support of the networking team.
    2. SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support.
    3. Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing.
    4. On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started.
    5. We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.

    Performance

    We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes.

    Tracing

    We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis.

    Infrastructure

    The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends.

    We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing.

    A number of smaller workbench, data analysis & reporting improvements have been made.

    ]]>
    + + Serge Kosyrev + https://github.com/deepfire + + +
    + + <![CDATA[Crypto Team Update]]> + 2022-11-11-crypto + + 2022-11-11T00:00:00.000Z + + High level overview

    The SECP primitives AC has been met, and the test-vectors PR has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool PR has been merged, and we've adapted the KES secure PR to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (PR#). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork.

    Low level overview

    • With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation.
    • We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool.
    • In parallel, we keep progressing on the KES agent
    • VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification.
    • Our libsodium fork now links directly to upstream libsodium.
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-11-11-hydra + + 2022-11-11T00:00:00.000Z + + High-level summary

    This week, the Hydra team published together with Obsidian Systems a light paper +on our "Hydra for Payments" project (Link). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of hydra-node processes.

    What did the team achieve this week

    • Published Hydra for Payments light paper (Link)
    • Have a draft RFP ready for a first review internally
    • Answered the internal auditors questions
    • Fixed a bug with following the chain when starting with persistence (#599)
    • Minor improvements to logging for better observability (#598, #600)
    • Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (#590)

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Close more gaps #452
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-11-11-ledger + + 2022-11-11T00:00:00.000Z + + High level summary

    I am extremely excited to say that we now have a pull request up which introduces our new versioned +CBOR serialization. This was an enormous effort, but it will solve a host of problems that we have +had since the Shelley phase. It will take time to properly review it, and we will +need to put in a lot of effort to integrate it with the downstream components, but this is a huge +milestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction +serialization schemes.

    We also have a draft pull request that reworks how deposits are tracked. Users of the system will +not notice any difference, but it is a necessary change needed to prepare the way for +decentralizing the governance of Cardano.

    Finally, we continued to address technical debt. In particular, we continued to make progress on +bringing coherency and consistency to the code base with a common naming convention, and +improving some error messages.

    Lower level summary

    • We have a pull request up for our new versioned CBOR serialization. +When we encounter a problem with our deserializers, it can be very difficult to implement a fix. +It is difficult because we can only fix such issues during a hard fork, and leading up to the +hard fork we must maintain two serializations for the same type in order to not cause unintended +network splitting (the problematic version must be used before the hard fork, +and the fixed version is used afterwards). +This can be especially tricky with the FromCBOR typeclass, since it is not always easy to +search for where all the problematic uses are located. +The new versioned CBOR serialization allows us to gracefully handle this transition. +See [pull-3138].
    • We proposed a CIP for backwards compatibility of the transaction serialization schemes. +See [pull-372].
    • We have draft for the new deposit tracking. +This draft is not as memory efficient as the final version will be, +but it is a sufficient proof of concept that we can write property tests against, ensuring +that we have not changed the semantics. +We will optimize after we are sure of the correctness. +See [pull-3127].
    • We now provide better support for debugging failed Plutus scripts in an important helper +function, named evaluateTransactionExecutionUnits. +In particular, it now returns all the information needed to rerun the script with exactly the +same arguments. This feature will end up appearing in the CLI and other tools from the Plutus +tools team. +See [pull-3135].
    • We did a lot more renaming to bring coherency and consistency to the code base. +See [pull-3126], [pull-3120], [pull-3118], and [pull-3116].
    • We have added a few things to the ledger repository to make it conform to the +Cardano Engineering Handbook +See [pull-3139].
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Network Team Update]]> + 2022-11-11-network + + 2022-11-11T00:00:00.000Z + + High-level summary

    In last sprint we got a performance report of P2P performance testing cluster +(which consists of 50 nodes). There is a performance regression in the header +notification metric. The P2P cluster is constructed with the same +topology as the non-p2p reference one this indicates some regression which +needs to be further investigated. This poses a risk for releasing P2P.

    We also continued to work on peer sharing: pull #4019.

    We continued working on dynamic block production which is required for P2P +release for BP nodes: pull #3159.

    We simplified the P2P topology format: issue #4559, pull #3888.

    We added a new trace point for asynchronous demotions of local peers with +Warning severity. This trace is important for SPOs.

    Detail description

    Performance regression

    Below we include a graph which shows the performance regression of the P2P code base vs non P2P.

    On the x axis is time in seconds which measures the delay from the start of +the slot to when a header was received. The y axis is the percentile of nodes +that received a header. We are currently investigating possible causes of the +regression.

    New P2P topology form

    The new topology file format is described in this issue #4559.

    Tracing improvements

    • We improved a handshake error reporting, pull #4136
    • We added TraceDemoteLocalAsynchronous rendered as DemoteLocalAsynchronous +in json format, pull #4127. Such demotions should be investigated by the +pool operator. They can indicate a problem in the deployed system, but also +they could indicate a remote problem in arranged connections with other SPOs.

    Open Source Improvements

    We improved documentation of io-sim and typed-protocols for open-source +contributors and/or maintenance tasks: pull #22, pull #45, pull #48.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-11-04-hydra + + 2022-11-04T00:00:00.000Z + + High level summary

    This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun preview network, see 0.8.0 release notes. They also completed implementation of ADR18 and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates #195 and alignment of the specification document with auditors.

    What did the team achieve this week

    • Complete and merge ADR18 #579
    • Re-deploy hydra scripts to respun preview network, see 0.8.0 release notes #595
    • Have first gap of #452 in review.
    • Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot.
    • Engineering meeting to discuss hard forks and protocol parameter updates #195
    • Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions.
    • Drafted project scope for an external audit RFP.

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Answer the internal auditors questions
    • Have a draft RFP ready for a first review internally
    • Close some gaps #452
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Mithril Team Update]]> + 2022-11-04-mithril + + 2022-11-04T00:00:00.000Z + + This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.

    Low level overview

    • We have been moving forward on the implementation of the release process #500:
      • Setup of the new hosted environments for testing-preview, pre-release-preview and release-preprod with their terraform and GitHub environments #542
      • Adapted the CI workflows to work with the new release process #543
      • Publication of an ADR3
      • Publication of a dev blog post about Mithril networks evolution
      • Releasing our first Mithril distribution 2244.0
    • Worked on the API versioning mechanism #565
    • Worked on the implementation of the stores migration process for the signer and aggregator nodes #562
    • Prepared a Mithril devnet video demo #526
    • Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably #484
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Open-Source Team]]> + 2022-10-31-open-source + + 2022-11-04T00:00:00.000Z + + High Level Summary
    • We've been working toward publishing Cardano Backlog, currently its in +review by the IOG communication team.
    • We identified a number of libraries which can be published.
    • We setup and enhanced cardano-updates.

    Detailed description

    I am glad to announce that I was given the role of open-source advocate for +cardano project. In last few weeks we were making steps towards publishing our +backlog. It's currently under review by the communication team, although most +of the issues are already visible across various repositories.

    The open-source initiatives have their own +project. It is set up +to help us track our major open-source activities. Right now there are two +work streams:

    We identifies a number of libraries across all the teams which contribute to +Cardano which we would like publish to publish, see the following +link. Arnauld Bailly recently published +quickcheck-dynamic +library on Hackage. The networking team is slowly progressing towards +publishing io-sim and related packages, checkout the progress +here.

    Thanks to Arnaud Bailly our Cardano Updates website has +a new look & feel! It's using docusaurus.io.

    Christian Taylor carried recently a detailed analysis of our open-source +repositories. He collected many interesting metrics, which allows us to see +where we need to improve as an open-source project to make the Cardano project +and many smaller related libraries which we maintain be more open and available +for open-source contributors.

    The graph below shows which documents the 55 most important Cardano +repositories are missing the most: +Documentation Adoption +You can expect we will improve in these metrics in the coming weeks.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Embedding Quality Workstream]]> + 2022-11-03-embedding-quality + + 2022-11-03T00:00:00.000Z + + High level summary

    We made good progress on most of the Action Items we agreed on Lisbon, like:

    • Cardano System Tests was fully open to public (tools, tests, results) +See cardano-node-tests webpage.
    • We defined an user-facing-functionality template that is used with the cardano-cli team
      • this includes acceptance criteria & user stories, and definition of done
    • We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)
    • We started to apply a labelling convention on cardano-node issues that will be used to generate some visual dashboards with some metrics [TBD]
    • Ziyand Liu started an End-to-End Development and Testing Process for Plutus Features
    ]]>
    + + Dorin Solomon + https://github.com/dorin100 + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-10-02-consensus + + 2022-11-02T00:00:00.000Z + + High-level summary

    During the past two weeks, the consensus team continued its work on testing the +UTxO HD prototype. We completed the era-transition and backing store tests, and +the mempool tests are advancing at a steady pace. Regarding our work in the +Genesis design, we continued our collaboration with the research and networking +teams, and we continue investigating strategies for making the chain-sync +jumping prototype faster.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We worked on state-machine tests for the mempool, and spotted potential bugs +in the implementation. Investigation is ongoing.
      • We have a set of property tests for the backing store. We still need to +incorporate the improvements to the LMDB cursor API that these tests +made possible.
      • We merged the era-transition tests PR.
    • Genesis: on track.
      • Design work around Genesis continues in collaboration with researchers and +the networking team.
      • We continued trying to improve the performance of the chain-sync jumping +prototype. We gained additional insight on which parameters to tweak next. +In spite of the baseline still being faster, the current prototype already +achieves a significant speedup when compared to the naive approach of simply +running full chain-sync with all peers.
    • Tech debt: on track.
      • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    Workstreams

    Finish the UTxO HD prototype

    We continued working on property-tests for the UTxO HD prototype. In particular +we merged the era-transition tests +PR.

    Backing store property tests

    The backing store property tests +PR has been +reviewed. The next steps are:

    • Improve error handling and command generation.
    • Add coverage testing to check that we are not failing to cover interesting +test cases.

    The monadic cursor API +went through its first review round. The API is in a relatively stable state. +This PR also unifies the cborg and serialise-based interfaces to LMDB +operations. The next steps are:

    • Write +quickcheck-dynamic +state-machine tests for this API.
    • Adapt the changes in the serialisation interface in the backing store property +tests. This will involve adding boilerplate code in consensus to make up for +the removal of the cborg-based interface.

    LSM tree implementation

    We worked on the LSM tree +prototype. In +particular, we focused on tuning the LSM tree design to the different workloads +that consensus has (eg syncing, normal node operation, etc).

    Benchmarking the CSJ prototype

    Work on improving the chain-sync jumping performance is ongoing. In particular +we compared the performance of different jump intervals, which, somewhat +surprisingly, do not make a significant difference. In particular, we are seeing +periodic "plateaus" where the chain-sync tip does not progress, but they are +much longer for the prototype. Our hypothesis is that this seem to be due to a +combination of the garbage collector (GC) pauses, and the actual time it takes +the non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo +fragment.

    In the coming weeks we will try to shorten these plateaus via a combination of +tweaking GC options and less synchronisation in the CSJ governor.

    The following plot shows the performance of the chain-sync jumping prototype +using different jumping intervals. It compares the syncing progress by plotting +the slots of adopted blocks against time. The baseline is still faster, however +it is worth noting that the current prototype already achieves a significant +speedup when compared to the naive approach of simply running full chain-sync +with all peers.

    The second plot shows the syncing progress sliced to a chosen ~5min interval, +and includes, in addition to the slots of adopted blocks, the slots of the tip +of the ChainSync fragment. This allows us to see how far ahead of the selected +tip the CS dynamo is, i.e. how much room we have for BlockFetch not to get +stalled. It shows periodic behaviour (due to the forecasting limit), and shows +that the CS fragment tip is not progressing for significant periods +("plateaus").

    Technical debt

    We clarified a +common source of confusion around VRF tie-breaking and cross-era chain +selection. This PR involved correcting potentially misleading names of +VRF-related functions, and providing context for a particular VRF value is +used for tie-breaking.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-11-02-ledger + + 2022-11-02T00:00:00.000Z + + High level summary

    We have made the decision to use the +formal ledger repository +in place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure +to the model. In particular, we now have a lot of support for axiomatic set theory. +While the next ledger era is still in the design phase, most of the team remains working +on technical debt. +In particular, we have moved a lot more code out of the Shelley specific modules and into +a ledger core module, we have finished up our benchmarking around the problematic TICKF +ledger transition (while improving the performance), made conveniences to the development +environment, cleaned up all the recent changes to the cost model, added a lot of documentation, +fixed some flaky tests, and deleted some dead code.

    Lower level summary

    Axiomatic Set Theory

    The formal ledger model now has support for much of the set theory that we make use of in +the formal ledger specifications. See [pull-20].

    Completed Technical Debt

    • We have addressed issues with two of our most problematic and flaky tests. +See [pull-3039] and [pull-3093].
    • We have added more documentation and tests to the Twiddler module. This is a module which +makes our CBOR serialization round-trip tests much more robust, and will also hopefully +help enforce the mandate for downstream libraries to never re-serialize data that needs +to be hashed. See [pull-3073] and [pull-3095] +(we cannot merge 3095 just yet, due to a preference for merging other features).
    • We have finished our long analysis of the problematic TICKF transition. +We now have a lot of benchmarks surrounding this code, and have added performance improvements. +See [pull-3068] and [issue-3035].
    • We have restored support for +ghcid +in our repository. This is a tool for developing with Haskell that many of us find greatly +improves our productivity by providing us with constant feedback from the type checker. +See [pull-3112].
    • After much activity on the cost model, we have done some final clean up of the code. +See [pull-3075] and [pull-3101].
    • We moved a lot of the existing user facing documentation regarding native tokens into the +ledger repository, and cleaned it up +(most of the heavy lifting was done by our amazing technical writers). +See [pull-3091].
    • We removed dead code. See [pull-3089].
    • We moved a lot of code from the Shelley specific libraries to the ledger core library. +See [pull-3109] and [pull-3110].
    • We've removed more of the awkward legacy template Haskell names. +See [pull-3108].
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-11-02-node-cli-api + + 2022-11-02T00:00:00.000Z + + 2022-11-02 - 2022-11-15

    High level summary

    • Documentation improvments
    • Merged community contributions
    • Exposing types from cardano-api requested by the community/other teamss
    • Test output has been improved so diagnosing failures is now easier
    • Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)
    • Refactoring of cardano-testnet making it more useable as a library (ongoing)
    • Release 1.35.4 was merged & released

    Completed

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Node Release Team Update]]> + 2022-11-02-release + + 2022-11-02T00:00:00.000Z + + Node Reelease Update

    2022-10-19 - 2022-11-02

    Executive Summary

    The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset, +a temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8.

    1.35.4 release candidates have been created and are being tested internally and externally.

    Completed

    In Progress

    ]]>
    + + Samuel Leathers + https://github.com/disassembler + + +
    + + <![CDATA[System Test Team Update]]> + 2022-11-02-system-test + + 2022-11-02T00:00:00.000Z + + High level summary

    We have been focused on:

    • Fully opening our test results (on top of the existing tests & tools):
      See cardano-node-tests webpage.
    • Started to test and automate the new functionalities added in the 1.35.4-rc1 node tag
      See test results tracking page.
    • Made some improvements to the automated db-sync sync tests
      See db-sync tests.
    • Multiple cleanups and updates to the cardano-node-tests framework
    • Updated the nightly pipelines for the cardano-node-tests after the Babbage HF
    ]]>
    + + Dorin Solomon + https://github.com/dorin100 + + +
    + + <![CDATA[DB Sync Team Update]]> + 2022-11-01-db-sync + + 2022-11-01T00:00:00.000Z + + High level summary

    The DBSync team is preparing a release which introduces schema simplifications, removes indexes, +unique and foreign keys. It also provides a way to fix older values and migrates without the need to +resync from genesis.

    Lower level summary

    Schema simplifications

    Indexes, Unique and Foreign keys are removed in order to speedup syncing +#1295 +The same pr also introduces a different way to rollback, which doesn't rely on foreign keys and +indexes.

    Performance

    The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A +conservative number of these will be included in the next release and the rest can be found in +performance view.

    Migrations and resyncing

    The next release will be 13.1.0, it will enable a migration without the need to resync. It will also +introduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases +#1294

    Release

    The release has been mostly cherry-picked from master +#1294 and its scope can be seen +release view

    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-10-28-hydra + + 2022-10-28T00:00:00.000Z + + High level summary

    This week, the hydra team completed several user experience improvements to the +hydra-tui and hydra-node, and delivered a first version of persisted head +states by publishing release version +0.8.0. +Besides this, they met with researchers on topic of the HeadV1 specification and +kicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation.

    What did the team achieve this week

    • Completed the UX improvements on the hydra-tui
    • Released version 0.8.0, which delivers a first version of persisted head states
    • Met with researchers on the HeadV1 specification
    • Started work on the RFP for our external audit

    What are the goals of next week

    • Complete ADR18 implementation and get it merged
    • Start work on event-sourced persistence #580
    • Have a first plutus script gap closed #452
    • Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Network Team Update]]> + 2022-10-28-network + + 2022-10-28T00:00:00.000Z + + High-level summary

    The team has focused on debuging & fixing bugs for the P2P single relay release, which included

    • diagnosing, fixing and writing tests for a bug in peer-state-actions which +fortunately hasn't been released;
    • diagnosing & preventing misconfiguration of DNS

    We also focused on developing peer sharing. We also held a session with +the scientists on eclipse evasion.

    Detailed description

    P2P Network Stack

    During the past two weeks the team focused on p2p single relay release and peer +sharing. We found and fixed an important bug recently introduced in one of the +components of p2p networking stack (fortunately never released). Together with +a fix, we designed a unit test diffusion simulation as well as quickcheck +property test (both could reproduce it). We also changed the code in a way that +if such a bug is reintroduced in the future, it will be obvious to diagnose. +For more see:

    Initial benchmarking run of the P2P code was executed. The results where +unlike what we see on the mainnet. We found a possible misconfiguration of the +cluster (caused by 0 TTL on domain names), which could be the direct cause of +it. We wrote a PR which rules out such misconfiguration. We are awaiting on +the next benchmarking results. See more at:

    ouroboros-network#4106

    We also started working on P2P single relay release. The PR +ouroboros-network#4120 +includes 108 patches cherry-picked from the master branch. We started +working toward integration these changes against the release branch of +cardano-node. Early next week we ought to be able to have an early version +of cardano-node with non experimental P2P support!

    For more detailed release plan please see P2P - Single +Relay +issue.

    Consensus

    We identified and fixed missing error reporting in consensus +initialisation phase. See more at +ouroboros-network#4015

    Cardano Node

    We also made changes in cardano-node in order to give better experience for +node operators. This includes updating severities of some of the traces as +well as implementing new format of the p2p topology file. For more see:

    Peer Sharing

    We continued working on implementation of peer sharing. We have an early +implementation which will be reviewed and analysed in next weeks. We started +working on cardano-node integration. We need +PR #4392 to be merged +before such integration will be able to land in cardano-node, although this +is not blocking us currently. See more at:

    Eclipse Evasion

    We held a session which included Alexander Russel, Sandro Coretti-Drayton and +Nick Frisby from the consensus team. We discussed high lever design of the +eclipse evasion scheme, which is important for the design and implementation of +ouroboros-genesis. We got a positive feedback from the researchers.

    IO-Sim

    In this period we made little progress towards releasing IO-Sim on Hackage. +A single PR which added +a few missing instances of the STM monad.

    Open Source

    We made sure the CI runs for PRs which comes from forks (which is important to +accept contributions from 3rd parties).

    Mithril Cardano Integration

    We held initial discussions with Arnaud Bailly about possible path to integrate +mithril to cardano-node and take advantage of the ouroboros-network +diffusion layer.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Performance & Tracing Team Update]]> + 2022-10-28-performance-and-tracing + + 2022-10-28T00:00:00.000Z + + High level summary

    On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline.

    On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario.

    Executive summary

    • The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale.
    • The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment.
    • The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.
    ]]>
    + + Serge Kosyrev + https://github.com/deepfire + + +
    + + <![CDATA[SRE Team Update]]> + 2022-08-12-sre + + 2022-10-28T00:00:00.000Z + + High level summary

    The SRE team is heavily working on the Equinix Metal migration, replacing Hydra +with Cicero, and a new version of Spongix.

    Lower level summary

    OpenZiti

    • Work is ongoing on our OpenZiti integration into Bitte in [bitte-zt].
    • CI-World deployment of Darwin CI Ziti service in [ci-world-commit-d40f4d].
    • Multiple issues filed, and a lot of discussion with the OpenZiti developers, +we're making pretty rapid progress thanks to them.
    • Work on getting Equinix baremetal machines integrated into AWS World Bitte +clusters utilizing a Ziti ZTNA network overlay to bridge the networking of +the two environments and get IAM extension to Equinix machine for Nomad +client onboarding.
    • A Nix Flake for most of our OpenZiti dependencies including the Console, +Controller, Edge Tunnel, and Router is now at [openziti-bins].
    • The Flake also includes a WiP NixOS modules for these components.
    • Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with +no issues seen so far
    • Moved the console to traefik routing service (zac.$DOMAIN) and +controller/edge router stay at zt.$DOMAIN, but have registered consul +services

    Cicero & Tullia Integrations

    Cicero & Tullia Features

    • Improvements to Tullia task aggregation to make [cardano-addresses] build +correctly.
    • Better tullia CUE lib default for tags [tullia-commit-4df3c5d].
    • Put cache.nixos.org back in cache.iog.io's upstreams. This is now +considered a public cache again, and without it some Cicero evaluations had +to build huge packages.
    • Started working on a flake-parts module for Tullia.
    • Started working on cutting down Tullia task build time by putting facts in +JSON files.
    • Fixed running into kernel arg limit by reading tullia's DAG from a file
    • Merged [tullia-pull-9] that fixes several issues related to error reporting. +and escaping.
    • Added Mac builders in Cicero on CI-World.
    • Started work on Tullia invocation caching.

    Spongix

    • A lot of progress on an SQlite backed version of Spongix, it already supports +the full HTTP binary cache protocol but still lacks comprehensive testing and +some tuning, as well as recursive lookups.
    • First steps in the implementation of the nix-daemon ssh-ng protocol so +Spongix can be used via SSH and we can get rid of basic auth.

    Bugs

    • Discovered Cicero bug where Nomad reschedules cause the Github commit status +to get stuck in pending
    • Discovered Cicero race condition bug around concurrent transactions for +codependent actions.
    • Fixed tullia task order bug in [cardano-addresses]
    • Diagnose Cicero action not triggered in [abcirdc]
    • Fixed meta/description of the Tullia package in [tullia-pull-7]
    • Add Vault token loop alerts in [bitte-cells-pull-40]
    • Ongoing investigation on recurring Patroni and nomad-follower issues related +to token rotation.
    ]]>
    + + Michael Fellinger + https://github.com/manveru + + +
    + + <![CDATA[Crypto Team Update]]> + 2022-10-27-crypto + + 2022-10-27T00:00:00.000Z + + High level overview

    The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to +meeting the acceptance criteria in cardano-base, +which lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and +we are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution, +but also progressing on the implementation.

    Low level overview

    SECP built-ins

    • (missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in PR 313
    • CIP-0049 was addressed in the editors meeting, and PR 250 was merged
    • The unit-tests PR 320 is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.

    KES agent

    • We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them.
    • We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).
    ]]>
    + + Iñigo Querejeta Azurmendi + https://github.com/iquerejeta + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-10-21-hydra + + 2022-10-21T00:00:00.000Z + + High level summary

    This week, the hydra team reviewed and addressed several open comments on the +new HeadV1 specification, completing a list the of identified gaps between +specification and implementation while doing so. In the wake of the recent +demonstration of SundaeSwap running their DEX in a Hydra Head, they met with +them to capture feature ideas & incorporate their feedback on the roadmap, as +well as potential research avenues.

    What did the team achieve this week

    What are the goals of next week

    • Complete the last two items required for a version 0.8.0.
    • Cut the next release, version 0.8.0
    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Have the CI build macos artifacts
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-10-19-node-cli-api + + 2022-10-19T00:00:00.000Z + + 2022-10-19 - 2022-11-01

    High level summary

    This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:

    • Ask the node about the current mempool's capacity and sizes
    • Request the next transaction from the mempool's current list
    • Query if a particular transaction exists in the mempool

    Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric tx_submit_fail_count has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:

    • Documentation improvments
    • Release 1.35.4 was merged & released
    • Exported various types from cardano-api that were requested by community members

    Completed

    cardano-cli

    cardano-api

    cardano-submit-api

    cardano-node

    cardano-testnet

    • None

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-10-18-consensus + + 2022-10-18T00:00:00.000Z + + High-level summary

    During the past two weeks, the consensus team worked on adding property test for +different aspects of the UTxO HD prototype: era transitions, mempool, and +backing store. Thanks to these tests we were able to uncover a bug in the +prototype. On the Genesis front, we benchmarked a different version of the +ChainSync jumping prototype to try to improve its performance, but this did not +result in any noticeable speedup.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We focused on increasing test coverage for the UTxO-HD prototype:
        • We started implementing Cadano-eras transition property-tests.
        • We started implementing state-machine property-tests for the mempool.
        • We merged the mempool rewrite.
        • We started working on state-machine tests for the backing store. This +uncovered a bug in the range-read implementation of the LMDB backing +store.
    • Genesis: on track.
      • We benchmarked a version of the Genesis ChainSync Jumping prototype that +spreads out the ChainSync updates over a longer period of time. This did not +result in any noticeable speedup.
      • We investigated the overhead introduced by non-ChainSync components, but no +conclusions could be drawn from the benchmarks we ran.

    Workstreams

    Finish the UTxO HD prototype

    We focused on increasing test coverage for the UTxO HD prototype. We also merged +the mempool +rewrite.

    Era transition property tests

    We started implementing Cardano era transition property +tests, +which are needed for making sure that the ledger tables get updated in the +right way when we move from one era to the next. There are at the moment two +important transitions.

    • Byron to Shelley: where all the UTxO is transferred from in-memory Byron +state (which has no tables) to the ledger tables of the Shelley state.
    • Shelley to Allegra: where the AVVM addresses must be deleted.

    We have tests for the Byron to Shelley transitions. We are working on adding +the remaining ones.

    Mempool state-machine tests

    We started implementing state-machine property tests for the +mempool. +The mempool is currently tested via pure property tests, and use a ledger +state without tables. With the introduction of UTxO HD, testing the concurrent +behavior of the mempool became of crucial importance (eg now we have to +acquire locks to flush the backing store). In addition, we need to test a +ledger state with tables. These needs led to the creation of a new set of +property tests. In particular we aim to run parallel state-machine tests that +exercise the mempool in a way similar to how the node would make use of it.

    Backing store property tests

    We started working on state-machine tests for the backing +store that UTxO +HD uses. The property tests uncovered errors in the range-reads implementation +of the LMDB backing store. To facilitate fixing this bug, we made +changes to the Haskell +LMDB bindings.

    Benchmarking the CSJ prototype

    Prompted by previous benchmarks showing significant improvements in sync time by +using more capabilities, we implemented a way to spread out the ChainSync +updates over a larger period instead of firing them all at the same time. This +didn't result in a noticeable speedup.

    We also benchmarked the prototype with CSJ disabled (such that just the dynamo +peer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule +out/confirm overhead by non-ChainSync (mainly BlockFetch) related components. +This results in era-specific behavior (speed is like the prototype in Byron, but +like the baseline in Shelley). This deserves a closer look in the future.

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    • Red: baseline
    • Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps.
    • Blue: like Green, jumps are spread out.
    • Orange: variant with no jumping, to measure unrelated overhead.

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Hydra Team Update]]> + 2022-10-14-hydra + + 2022-10-14T00:00:00.000Z + + High level summary

    This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the hydra-node over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks "past the opening of a Head". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.

    What did the team achieve this week

    • Last week we thought we were done with ADR18, but were not ...
    • ... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence.
    • Implemented a first version for persistence #187 in response.
    • Enhanced CI to publish test results on our website
    • Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!
    • Pulled static executable feature #200 into scope, implemented it and merged it!
    • Received and read through a project proposal by a vendor (building a Hydra platform).

    What are the goals of next week

    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Cut the next release, version 0.8.0
    • Address open comments on specification document & complete the list of identified gaps between specification and implementation #452
    • Have the CI build macos artifacts
    ]]>
    + + Sebastian Nagel + https://github.com/ch1bo + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-10-14-ledger + + 2022-10-14T00:00:00.000Z + + High level summary

    The ledger team is still primarily focused on addressing +technical +debt. +We now have the infrastructure for versioning our serialization schemes, +which we continue to put into action. +We have made first steps towards getting proper support for the +formal ledger repository +(in particular, we've added nix builds and +continuous integration support). +We are wrapping up an investigation of the performance of a critical +function used by the consensus layer for leader checks. +Finally, we are improving the packaging and versioning of our code.

    Lower level summary

    Completed Technical Debt

    • Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of +our code lives in the cardano-ledger-shelley package, though with hindsight we can say that +much of it should live in cardano-ledger-core. +We continue to move things to cardano-ledger-core, and have much more to come. [pull-3059]
    • We now have the infrastructure to support versioned serialization schemes. +The inability to do this has caused us a lot difficulties, +such as [issue-3003], [issue-2965] and [issue-2444]. +We are still in the process of switching to the versioned serialization scheme +(such as [pull-3078]), +but the infrastructure was completed in [pull-3063].
    • We now have proper nix and CI support for the formal ledger project. [pull-19]
    • A separate team is helping bring support for +CHaP +to all the cardano-node repositories. +We have been helping out with this effort.
    • A separate team continues working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. +We have been helping out with this effort.

    In-progress Technical Debt

    We also have several fairly large pull-requests in review +that we are working on.

    • In an on-going attempt to build out a more user-friendly API, +we continue to remove HasField instances in place of using micro-lenses. +The protocol parameters, in particular, are being worked on. [pull-3045]
    • We are also renaming record fields to be consistent across the repository. [pull-3062]
    • We are now cleaning up all the work we did to understand the performance +of the TICKF transition. We have some improvements to the computatation +as well. [pull-3068]
    • We are adding more documentation, in particular to our Twiddler functionality. [pull-3073]
    • The formal ledger is adding support for finite set theory. [pull-20]
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-10-05-consensus + + 2022-10-05T00:00:00.000Z + + High level summary

    During the past two weeks, the consensus team worked on improving the +performance of the ChainSync jumping logic, which is needed for Genesis. We also +rewrote the implementation of the mempool in the UTxO HD prototype which solved +the issues that prevented us from running system level benchmarks. Also on the +UTxO HD front, we have an improved implementation of the sequence-of-differences +(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for +the UTxO HD feature.

    Executive summary

    • With the latest implementation of ChainSync jumping we are closer to the +baseline performance. In particular, the prototype seems to benefit from the +extra concurrency provided by additional capabilities.
    • We rewrote the implementation of the mempool in the UTxO HD prototype. This +rewrite was required due to performance problems we observed when running the +workbench. +These performance problems prevented us from running system level benchmarks. +The rewrite solved these issues. After the UTxO-HD: mempool +rewrite PR is +merged, we will contact the Benchmarking team so that they run the system +level benchmarks.
    • The implementation of sequences of differences based on anti-diffs was +integrated into the UTxO HD prototype. It is pending +review and +we also need to run replay and syncing benchmarks to confirm that this will +deliver a performance improvement, as observed in our micro-benchmarks.
    • The UTxO HD prototype +inspection +resulted in a list of +tests +needed for consensus to consider the UTxO HD prototype as fully tested.

    Additional information

    Genesis

    Benchmarking setup: 50MBit/s, 50ms latency

    • Red: baseline
    • Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.

    As ChainSync Jumping involves many concurrent network operations at every jump, +we tried to run the node with 6 instead of the default 2 capabilties.

    • Orange: baseline with 6 capabilities
    • Blue: CSJ prototype with 6 capabilities

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    Further work includes whether we can tune the prototype to better handle few +capabilities, or to adapt the default number of capabilities (potentially just +while syncing).

    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[DB Sync Team Update]]> + 2022-10-04-db-sync + + 2022-10-04T00:00:00.000Z + + DBSync Update

    Fast restarts

    We fixed a long overdue issue in db-sync which caused long delays on restarts +1266. This has been +one of db-sync main objectives for this period. Restarts are now very fast, +because db-sync deletes almost nothing from the db, it just replays the ledger rules until it +reaches the tip of the db. The fix also improves reconnection speed, in cases where the node +restarts or the connection is temporarily lost. It also speeds up even more in cases where due to a +deployment mess up a very old snapshot or no snapshot at all is used.

    Property based testing

    We added stateful property based testing, using quickcheck-state-machine +1269. These tests use empty or +almost empty blocks to test the new behaviour of restarts and rollbacks.

    These tests generate arbitrarily a list of symbolic commands from these:

    RollForward Int
    RollBack BlockNo
    StopDBSync
    StartDBSync
    RestartNode
    AssertBlockNo BlockNo

    The commands are translated into real commands. For example RollForward Int will forge a new block +that fits on the current chain. These real commands are executed against db-sync using the mock +chain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync +which looks like this:

      Model
    { serverTip :: BlockNo
    , dbSyncTip :: BlockNo
    , dbSynsIsOn :: Bool
    , dbSynsHasSynced :: Bool
    }

    Finally a number of postconditions are checked, related to the eventual block number of db-sync.

    Tech Debt

    We handled a number of tech debt in +1275 +This improves the code format of db-sync, deletes many queries that were never used and groups the +others. This tech debt resolution not only improves the experience of working in db-sync, but can +facilitate some of our other objectives, as it makes it very explicit which queries are used +during syncing and which indexes are necessary.

    Smash

    We worked on fixing an issue related to fetching pool metadata +1276. +The issue which is described in +1270

    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-10-04-node-cli-api + + 2022-10-04T00:00:00.000Z + + Node-Api-Cli Update

    2022-10-04 - 2022-10-18

    Executive Summary

    The majority of the team's time was spent between getting 1.34.4 ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to cardano-cli.

    Completed

    cardano-cli

    cardano-api

    cardano-node

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-09-30-ledger + + 2022-09-30T00:00:00.000Z + + Ledger Update

    We have continued focusing nearly entirely on addressing technical debt. +A lot of design work has begun for the next ledger era, +but we do not yet have anything concrete to share.

    Technical debt issues completed

    • [issue-1676][pull-2992] We have finally removed the ledger dependency on the +cardano-prelude package. It was barely used in the ledger repository, and it added a dependency +that we did not want to maintain. It was a bit difficult to remove, and we had +to coordinate removing it from cardano-base. +A lot ended up going into pull-2992, due to the coordination effort, and we ended +up updating Plutus as well. +This means that we've now also made a lot of progress on the problematic cost model serialization +issues described in issue-2902. +In particular, after we resolve issue-3014, we will not have to wait an epoch before +releasing a cost model for a new version of Plutus, as we had to do for the Vasil HF.
    • [issue-3046][pull-3055] We moved a module that is now only used in Byron to a Byron package.
    • [issue-3047][pull-3054] We improved the interface to the Value (multi-asset) type.
    • [pull-3044] We debugged and fixed a tricky compilation issue. Certain kinds of field updates +were adding approximately 20 minutes to our compile time!
    • [issue-2932][pull-3036] As a part of our ongoing re-organization of the codebase, we +have added a Cardano.Ledger.[Era].Core module to each ledger era that has a TxBody class. +Most classes defined in the era should go in this new module. +We also re-export the Cardno.Ledger.Core module and the previous Cardano.Ledger.[Era].Core +modules from each era.

    Technical debt in progress

    • [issue-3034][issue-3035][node-issue-4421] We are continuing to write benchmarks to understand exactly where +all the time is being spent on executing the TICKF transition. +The consolidation of the per-stake-credential stake distribution to the per-stake-pool +distribution does seem to account for a large amount of time (near a second as written, which we +have down to about half a second with some optimizations), +but this does not account for everything. +Applying the reward update may also be a big contributing factor.
    • [pull-3033][pull-3038][pull-3041] A separate team is working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort.
    • The nix scripts used to build our new +formal ledger model +do not work consistently for everyone, and we have been working on fixing these issues.
    • [issue-3014] We are still working on adding a versioning scheme to all of the ledger +serializers.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Network Team Update]]> + 2022-09-27-network + + 2022-09-27T00:00:00.000Z + + Network Update

    Ouroboros Network

    Ouroboros Consensus

    • Recently we found out that the consensus does not log exceptions thrown during +intiialisation. This was fixed in +PR input-output-hk/ouroboros-network#4015 +As part of this pull request we also changed that all exceptions rethrown by +the connection handler thread are wrapped in ExceptionInHandler.

    Some older items, which were not announced

    • We identified and fixed an issue related to socket activation (socket options +where not set for sockets passed through socket activation). +PR input-output-hk/cardano-node#3979 +This fix will be released in the next cardano-node release.

    Cardano Node

    • We extended the NixOs service module so that one can modify socketPath, +runtimeDir, databasePath, traceSocketPathAccept, +traceSocketPathConnect and stateDir options. +PR input-output-hk/cardano-node#4196

    IO-Sim

    We resolved a number of issues before release of io-sim on hackage:

    See PR #24.

    We also improved experience for contributors of io-sim and typed-protocols by adding issue templates:

    Typed Protocols

    Input Endorsers Simulation

    New features include:

    • Histograms of block arrival frequency, for both network (inbound) and CPU +(block validation). This is interesting to check that we're not overloading +the CPU block validation capacity, or network link capacity. Or alternatively +to observe the behaviour in an overload situation if we set the block +generation rate high enough.

    • Pie chart of utilisation of TCP links. This shows how small a fraction of +links are being used at any one time, and shows that once the system "warms +up" and is operating stably, most block delivery is ballistic.

    • Showing off the new screen layout combinators, that let us put multiple +charts, titles etc on screen at once and scale them to whatever screen or +video resolution we like without having to tweak numbers (this example is +scaled to fit 1080HD video resolution).

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-09-20-consensus + + 2022-09-20T00:00:00.000Z + +
  • We proposed a fix for the performance degradation observed when running +distributed multi-node benchmarks in the UTxO HD feature branch. While this +fixed the problems observed when running local benchmarks, it broke the +ThreadNet tests due to concurrency issues. Therefore, we think it is wise to +start redesigning the UTxO HD mempool integration.
  • We did several rounds of code review on the alternative implementation of +diff-sequences required by the UTxO HD feature based on the idea of +anti-diffs. This alternative implementation is close to being merged, and the +next step is to integrate this to the UTxO HD branch, so that we can run +ad-hoc replaying and syncing from scratch benchmarks and compare these with +the baseline. The micro-benchmarks we elaborated for the alternative +implementation show speedups of up to 4x, so we are optimistic about the +performance of replaying and syncing from scratch benchmarks, however it is +important to notice that due to the nature of UTxO HD we will still be +slower than the baseline.
  • The final draft of the Genesis implementation specification is ready for +review.
  • We implemented a prototype for the happy path of Genesis' ChainSync Jumping +(CSJ). The prototype is slower than the baseline, however it is not the latest +version of the prototype and the jump interval is very small.
  • Work on integrating Conway has stopped since +priorities have changed.
  • We started work on benchmarking epoch-boundaries and epoch overhead +pr-4014. To this end, we made use of a modified version of our +db-analyser tool. We ran the new benchmarking setup using the Cardano +mainnet chain, and we can see that block tick and application take +substantially longer at epoch boundaries, although there are a couple of slots +during an epoch in which these computations take more than normal. We notified +the ledger team about these findings. We will use this modified version of +db-analyser to investigate the epoch overhead.
  • Workstreams

    UTxO HD

    • Spent quite some time investigating the root cause of the degradation in +performance observed in the benchmarks. We run the make forge-stress +benchmarks locally in order to debug this behavior.

      • Transaction batching doesn't make a notable difference in the outcome +(considering we are using the in-memory backend).

      • The mempool batching implementation required asynchronous transaction +validation which is a violation of the LocalTxSubmission protocol +contract and therefore if we continued on that route, the impact would +have been quite big.

      • The STM logic we implemented by using a TMVar for the mempool internal +state was buggy and under certain circumstances it seemed to lock. +Reverting the mempool internal state to be stored in a TVar seems to +solve this problem.

      • The results we get after this change look almost identical to the ones +from the baseline.

    • The anti-diff prototype (PR +#3997) has +been reviewed and is close to being merged.

      • A follow-up issue (issue +#4010) +to integrate the anti-diff prototype in the various consensus packages +was created. A first version of the integration exists, and all tests +pass. A next step is to get some indication of the "real" performance gain +by profiling db-analyser (or cardano-node).

    Genesis

    • Final draft of the Genesis implementation specification, now up for review.

    • Local benchmark setup for parameter tuning via the happy path ChainSync +Jumping (CSJ) prototype (Issue 3987).

      • Context: Our Genesis design requires us to check in with a large (~20) +number of servers periodically while syncing. These servers are offered +jump requests via the ChainSync protocol (hence the name), which they can +accept or decline. If a peer declines, the Genesis rule allows us to +determine whether a node actually has a better chain.

      • The "happy path" is when no peer declines a jump. We want this to have +close to no overhead compared to status quo, i.e. syncing without Genesis.

      • We implemented a prototype for this happy path, and are now starting to +test in various configurations (number of peers, latency, bandwidth) to +tune the performance of ChainSync jumping, i.e. how complicated our logic +of choosing when to jump needs to be.

        Example:

      • Simulated connection: 50 MBit/s, 50ms latency

      • Jump interval: 3000 slots (on the low end, could be increased to up to +3k/f)

      • Red: baseline (1.35.3), one peer in topology file

      • Blue: Preliminary version of our prototype, with 10 peers.

        It is slower by about ~30%, but it is not the latest version of the +prototype, and the jump interval is very small, making CSJ more of a +bottleneck.

    Technical debt

    • Fix flakiness in ChainDB QSM tests (PR 3990).
    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[DB Sync Team Update]]> + 2022-09-19-db-sync + + 2022-09-19T00:00:00.000Z + + DBSync Update

    New Tag

    We created a new db-sync tag 13.0.5 which addresses shortcomings of the last +release 13.0.4. It is currently under testing. +The Changelog is +here and in more details:

    • We fixed fees for tx with phase 2 failure that didn't include a total collateral field. +1248

    • We fixed an issue that could cause db-sync to crash if a specific rollback occured. +1247

    • DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but +could result in the wrong CBOR encoding being inserted. +1217

    • All the fixes above come with unit tests which validates the fix.

    • Added support for preprod and preview from docker. DBSync no longer needs to include the configs +for different networks, these are directly fetched from the cardano world. +1254

    • We added better support from docker for the new disable options and the overall documentation. +1260

    All the above were also backported to the master branch

    Open source

    We made the db-sync board public, so +everyone can have access on the issues we prioritise. +We also added new tasks to the board, some of them could be approachable to newcomers or people who +want to contribute.

    Progress on tech debt and new features

    • 1223 was merged, which removes the +foreign keys from the db schema. This opens the road to a number of optimizations.

    • An additional fix on top of the previous work was added +1250

    • An initial version where DBSync does not rollback on restart is done here +1266. +This allows db-sync to restart much faster, without the need to delete data and reinsert them. In +the future it can also facilitate migrations in cases where the ledger snapshots have a breaking +change, without the need to resync everything from genesis.

    ]]>
    + + Kostas Dermentzis + https://github.com/kderme + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-09-16-ledger + + 2022-09-16T00:00:00.000Z + + Ledger Update

    We have been focused nearly entirely on addressing technical debt.

    • We introduced more consistent naming across eras, this time for the auxiliary data. +See 3032.
    • We made clear how the consumed functions differs between eras (which was a previous source of +confusion), and added some related support to the fledgling ledger API. +See 3016.
    • We added clarity and organizational consistency to the main ledger era type synonyms. +See 3017.
    • We removed code duplication related to the input data hashes. +See 3018.
    • We split up a large module into smaller components. The large module was actually causing our +CI to time out. +See 3020.
    • We cleaned up stale information in our cabal files, and upgraded cabal 3.8. +See 3023, +3031, +and 3028.
    • We made consistent, standalone TxOut (transaction output) modules for every era. +See 3024.
    • We brought consistency to a maddening inconsistent use of type variables indicating the specific +choice of cryptographic primitives. In particular, all uses of crypto have been renamed to c. +See 3027.
    • We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric +types that will compose better in the future and which simplifies the constraints. +See 3029.
    • We consolidated some existing fragmented logic regarding how we gather the scripts needed for a +given transaction. This is a much needed cleanup to prevent future mistakes. +See 3019.
    • We fixed a problem with our generators that was causing a fair number of our property tests to +fail in CI. +See 3039.
    • We have started the work to update Plutus. This will bring support for SECP in the next major +protocol version, and also address a +problem +that we current have evolving the cost models. +See 3030.
    • We addressed a small issue that came up when integrating the conway era downstream, namely +the lack of some serialization instances. +See 3022.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-09-01-ledger + + 2022-09-01T00:00:00.000Z + + Ledger Update

    Since finishing up support for the Vasil Hardfork, the ledger team has been +focused on two main things: a new ledger era and technical debt.

    New minimal ledger era

    We have implemented a new ledger era named conway which is nearly identical +to the babbage era. This has been the first time that we have been able to see +what a minimal ledger era looks like. We have finished this task, modulo any +integration issues that might come up. The only thing that the conway era +does differently from the babbage era is provide support for rotating +the master keys using the hardfork combinator's state translation. +We may end up adding features to the conway era, but it is a nice exercise +seeing what it looks like to get a minimal ledger era supported in all the +downstream components.

    Addressing technical debt

    We have been addressing technical debt, mostly in an effort to make the +repository a more friendly code base to work in.

    • We have begun work on a ledger API, called cardano-ledger-api.
    • We have done a big re-design of the major type classes used in the ledger. +With hindsight on our side, we now have something much more organized and +easier to use.
    • We have done a lot of re-naming. The names across eras are now much more +uniform, avoid certain confusions that plagued us, and are clearer in where +they are from.
    • We have reduced a lot of code duplication that could lead to bugs if you +do not have the whole code base in your head.
    • We have added a handful of performance improvements.
    • We added type safety in a number of locations. In particular, the type of +values that can be minted in a transaction no longer allow for Lovelace +in the type, and some functions which used to handle both timelock scripts +and plutus script now correctly enoforce at the type level that only one of +them can be used.
    • We made our generators so that they now produce a much richer set of +valid serializations. There is room within CBOR to serialize the same +data structure in multiple ways, and it is helpful to have the generators +use a wide variety.
    • We have begun re-organizing our test suites.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Consensus Team Update]]> + 2022-08-31-consensus + + 2022-08-31T00:00:00.000Z + + Executive summary
    • We did most of the heavy lifting required to integrate the Conway era.
    • We have property tests for the UTxO HD backing store API implementations. A +possible bug was identified. Work is ongoing to make sure the property-tests +cover all the relevant cases.
    • We implemented and benchmarked the "anti-diff" prototype to speed up the UTxO +HD functionality. Results show a rough speedup of 4x to 5.5x across +several scenarios. Note that: "Data reported by tasty-bench is only of +indicative and comparative significance.". +We are investigating additional performance improvements. The "anti-diff" +prototype and benchmarks are still pending code review.
    • We elaborated a draft specification for the Genesis implementation and +ChainSync jumping optimization.

    Workstreams

    Conway

    • Integration PR of the minimal Conway era (Issue #3963, PR +#3971).
    • Discussions with Ledger revealed possible sources of confusion about which +data should be changed in the Conway era. As a result, a new technical debt +issue was raised, which does not block the integration of the Conway era +(Issue #3976).

    UTxO HD

    • Issue #3954, branch: The functionality of a +backing store, which is the interface to the on-disk part of ledger state in +UTxO-HD, is tested at a high level through the OnDisk tests. However, some +functionalities remain untested, e.g., reads of ranges of keys. As such, we +have implemented quickcheck-state-machine tests that exercise backing stores +directly. The tests are reusable for different backing store implementations +because the tests are implementation-agnostic: Any backing store that conforms +to the backing store interface can be plugged into the tests. Work is still +ongoing to label/monitor the tests, such that we can verify that interesting +cases are being tested. Furthermore, a possible bug has been identified in the +LMDB backing store with respect to range reads, though the bug has not been +resolved yet.

    • Issue #3946, branch, PR #3882: The +"anti-diff" prototype proposes an alternative approach to keeping track of +sequences (more specifically, FingerTrees) of diffs. These diff sequences +are a component of the in-memory parts of the ledger state in UTxO-HD. Since +the consensus code often requires the cumulative diff of a sequence of diffs, +the current implementation "caches" cumulative diffs of each subtree in the +diff sequence. This caching allows relatively fast reconstruction of the total +cumulative diff, but this caching proved to incur a non-negligible cost: when +we manipulate diff sequences through splits and appends, we force re-computing +a logarithmic number of caches. This is problematic, since we often split and +append in consensus: we split when we flush diffs to a backing store or when +we roll back blocks, and we append when pushing blocks. The new approach +should reduce the overhead of this caching.

      We implemented micro-benchmarks for the "anti-diff" prototype: we +first generate a sequence of commands (Forward, Push, Flush, or +Rollback) through a simulation, after which we measure the performance of +applying the commands to a diff sequence. In this context, Forward means +forwarding of values through a diff, whereas Rollback means switching to +a different fork by rolling back diffs/blocks and pushing new ones. +Moreover, we compare the performance for the two implementations: the +"legacy" approach, and the anti-diff approach.

      Some preliminary results were positive, but we needed to revisit the +benchmark's configuration to obtain more definitive results. After a +discussion with @dcoutts and the consensus team about this configuration +(e.g., number of commands generated, choice of the security parameter k), +the benchmarks should now be closer to the realistic setting. The following +configuration specifies the default configuration that is used in the +benchmarking code:

      • Number of commands generated: 10_000
      • Security parameter k: 2160
      • Number of initial backing values: 100
      • Number of key-value pairs deleted by a push: 50
      • Number of key-value pairs inserted by a push: 50
      • Number of key-value pairs forwarded by a forward: 50
      • Probability of a large (in the range [1000, 2000]) rollback: 0.05
      • Probability of a small (in the range [1, 10]) rollback: 0.95
      • Order of commands:
        • An equal number of forward and pushes.
        • 1 flush every 10 pushes.
        • 1 rollback every 100 pushes

      Moreover, we run four benchmark scenarios:

      • Default configuration
      • Without rollbacks
      • With only small rollbacks
      • Without rollbacks, larger flushes (1 flush every 100 pushes)

      How to read results

      Note: this section uses documentation from the +tasty-bench package to +explain how to read the results of running our benchmarks.

      Running a benchmark scenario gives us the following (curated) output:

      ...
      AntiDiff: OK (18.27s)
      2.527 s ± 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x
      LegacyDiff: OK (32.73s)
      10.829 s ± 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory
      ...

      The output says that the first benchmark, which exercises the anti-diff +prototype, was repeatedly executed for 18.27 seconds (wall-clock time), +its predicted mean CPU time was 2.527 seconds and means of individual +samples do not often diverge from it further than ± 47 milliseconds +(double standard deviation). We also configure the RTS to collect GC +statistics, which enables tasty-bench to estimate and report memory usage. +This data is reported as per RTSStats fields: allocated_bytes, +copied_bytes and max_mem_in_use_bytes. So, the output of the first +benchmark says that a total of 2.1 GB of memory was allocated, that a +total of 544 MB of memory were copied, and that the peak memory in usage +was 2.2 GB. We read the output for the second benchmark in the same way.

      Furthermore, the benchmark compares the mean CPU times for +both the anti-diff and legacy approaches: In this case, the mean CPU time +for the anti-diff approach is ~0.23x the mean CPU time for the legacy +approach. Conversely, the mean CPU time for the legacy approach is +1 / 0.23 ~= 4.35x the mean CPU time for the anti-diff approach. We will +call 0.23x the improvement factor. We will call 4.35x the speedup.

      Note that these improvement factors (and reported results) are subject to +noise, randomness, the specific configuration parameters, and the whims +of statistics. Data reported by tasty-bench is only of indicative and +comparative significance.

      Results

      For each of the 4 scenarios, we list the results of running the anti-diff and +legacy approaches 5 times. We run the benchmarks 5 times to get an indication +of whether the results are similar across multiple runs. Furthermore, we +calculate the accompanying ranges (if applicable) of improvement factors and +speedups.

      Note also the decrease in total bytes allocated and total bytes copied for +the anti-diff approach compared to the legacy approach.

      Default configuration

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff2.533 s (0.23x)4.7 ms2.1 GB557 MB2.4 GB
      Run 1: LegacyDiff10.792 s162 ms6.8 GB2.3 GB2.4 GB
      Run 2: AntiDiff2.508 s (0.23x)245 ms2.1 GB515 MB2.2 GB
      Run 2: LegacyDiff10.850 s30 ms6.9 GB2.3 GB2.2 GB
      Run 3: AntiDiff2.562 s (0.23x)5.0 ms2.1 GB552 MB2.2 GB
      Run 3: LegacyDiff10.993 s149 ms6.9 GB2.3 GB2.2 GB
      Run 4: AntiDiff2.168 s (0.22x)5.3 ms1.8 GB434 MB2.0 GB
      Run 4: LegacyDiff9.976 s39 ms6.3 GB2.0 GB2.0 GB
      Run 5: AntiDiff2.527 s (0.23x)47 ms2.1 GB544 MB2.2 GB
      Run 5: LegacyDiff10.829 s148 ms6.8 GB2.3 GB2.2 GB
      • Improvement factor: [0.22, 0.23]
      • Speedup : [1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]

      No rollbacks

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.638 s (0.19x)36 ms1.4 GB181 MB2.4 GB
      Run 1: LegacyDiff8.656 s207 ms5.7 GB1.5 GB2.4 GB
      Run 2: AntiDiff1.638 s (0.19x)75 ms1.4 GB181 MB2.2 GB
      Run 2: LegacyDiff8.654 s322 ms5.7 GB1.5 GB2.2 GB
      Run 3: AntiDiff1.663 s (0.19x)74 ms1.4 GB181 MB2.2 GB
      Run 3: LegacyDiff8.799 s216 ms5.7 GB1.5 GB2.2 GB
      Run 4: AntiDiff1.645 s (0.19x)51 ms1.4 GB181 MB2.0 GB
      Run 4: LegacyDiff8.732 s261 ms5.7 GB1.5 GB2.0 GB
      Run 5: AntiDiff1.639 s (0.19x)19 ms1.4 GB181 MB2.2 GB
      Run 5: LegacyDiff8.653 s234 ms5.7 GB1.5 GB2.2 GB
      • Improvement factor: 0.19
      • Speedup : 1 / 0.19 ~= 5.25

    Only small rollbacks

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff1.833 s (0.18x)36 ms1.5 GB185 MB2.4 GB
    Run 1: LegacyDiff10.362 s867 ms5.8 GB1.6 GB2.4 GB
    Run 2: AntiDiff1.696 s (0.19x)30 ms1.5 GB185 MB2.2 GB
    Run 2: LegacyDiff8.822 s106 ms5.8 GB1.5 GB2.2 GB
    Run 3: AntiDiff1.702 s (0.19x)44 ms1.5 GB186 MB2.2 GB
    Run 3: LegacyDiff8.906 s147 ms5.8 GB1.5 GB2.2 GB
    Run 4: AntiDiff1.701 s (0.19x)47 ms1.5 GB185 MB2.0 GB
    Run 4: LegacyDiff8.949 s197 ms5.8 GB1.5 GB2.0 GB
    Run 5: AntiDiff1.677 s (0.19x)55 ms1.5 GB186 MB2.2 GB
    Run 5: LegacyDiff8.856 s177 ms5.8 GB1.5 GB2.2 GB
    • Improvement factor: [0.18, 0.19]

    • Speedup : [1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]

      No rollbacks, larger flushes (every 100 pushes)

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.643 s (0.25x)21 ms1.5 GB196 MB2.4 GB
      Run 1: LegacyDiff6.591 s351 ms4.0 GB1.4 GB2.4 GB
      Run 2: AntiDiff1.616 s (0.25x)47 ms1.5 GB196 MB2.2 GB
      Run 2: LegacyDiff6.520 s232 ms4.0 GB1.4 GB2.2 GB
      Run 3: AntiDiff1.640 s (0.25x)34 ms1.5 GB196 MB2.2 GB
      Run 3: LegacyDiff6.540 s150 ms4.0 GB1.4 GB2.2 GB
      Run 4: AntiDiff1.635 s (0.25x)76 ms1.5 GB196 MB2.0 GB
      Run 4: LegacyDiff6.589 s131 ms4.0 GB1.4 GB2.0 GB
      Run 5: AntiDiff1.628 s (0.25x)19 ms1.5 GB196 MB2.2 GB
      Run 5: LegacyDiff6.490 s5.9 ms4.0 GB1.4 GB2.2 GB
    • Improvement factor: 0.25

    • Speedup : 1 / 0.25 ~= 4

    Genesis

    • We elaborated a draft of the specification of the Genesis implementation and +the ChainSync Jumping optimization. In particular, this includes a proof +sketch that the latter preserves liveness and safety in all cases (Issue +3964).
      • @nfrisby's main realization during this sprint was that he had been +focusing so far on the case where the selected chain is an extension of +the intersection of our peers' ChainSync candidates.
      • This is the main case, ie an "absorbing" state, but it's not the only +case.
      • The new proof sketch begins by case splitting on that predicate, and +that made the sketch quite a bit easier to follow.
    • We continued working on the "happy path" ChainSync Jumping prototype (Issue +3960).

    Technical debt

    • We started working on the issues required to re-enable nightly CI runs.. +Nightly CI runs have far more lax time constraints, which gives the option to +run significantly more property tests than in our regular CI. To this end, we +merged a PR to easily adapt the number of tests globally (PR +#3947).
    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Network Team Update]]> + 2022-08-12-network + + 2022-08-12T00:00:00.000Z + + The networking team took an active part in the project iteration (PI) planning +session, see cardano-node backlog for detailed +outcomes.

    • We started working on a detailed design / implementation plan for gossip.

    • We merged input-output-hk/ouroboros-network#3859 which +sets the ouroboros-network repository for the single relay release.

    • We identified a bug in the network simulator, which is fixed in the +input-output-hk/ouroboros-network#3852. +The above PR was reviewed.

    • We set the tracing configuration for nodes which we deploy and fixed and +identified some deployment hiccups. We identified some bugs in the RT view +which were registered by the maintainers. +input-output-hk/ouroboros-network-ops#4

    • We fixed typos in network-mux library: +input-output-hk/ouroboros-network#3921

    • For easy of debugging we renamed a trace point: +input-output-hk/ouroboros-network#3922

    • Duncan iterated on his simulation / visualisation. He also was able to +identify and fix a bug in the simulator. The simulation contains 50 nodes. +Dashed lines indicate and established connection, while solid lines indicate +a TCP connection with fully open TCP window.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + \ No newline at end of file diff --git a/docs/category/tutorial---basics/index.html b/docs/category/tutorial---basics/index.html new file mode 100644 index 00000000000..32163d6cabe --- /dev/null +++ b/docs/category/tutorial---basics/index.html @@ -0,0 +1,24 @@ + + + + + +Tutorial - Basics | Cardano Development Updates + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/category/tutorial---extras/index.html b/docs/category/tutorial---extras/index.html new file mode 100644 index 00000000000..2cc858a7f42 --- /dev/null +++ b/docs/category/tutorial---extras/index.html @@ -0,0 +1,24 @@ + + + + + +Tutorial - Extras | Cardano Development Updates + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/intro/index.html b/docs/intro/index.html new file mode 100644 index 00000000000..bdb55319ee5 --- /dev/null +++ b/docs/intro/index.html @@ -0,0 +1,24 @@ + + + + + +Tutorial Intro | Cardano Development Updates + + + + + + + + + + + + +
    +

    Tutorial Intro

    Let's discover Docusaurus in less than 5 minutes.

    Getting Started

    Get started by creating a new site.

    Or try Docusaurus immediately with docusaurus.new.

    What you'll need

    • Node.js version 16.14 or above:
      • When installing Node.js, you are recommended to check all checkboxes related to dependencies.

    Generate a new site

    Generate a new Docusaurus site using the classic template.

    The classic template will automatically be added to your project after you run the command:

    npm init docusaurus@latest my-website classic

    You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor.

    The command also installs all necessary dependencies you need to run Docusaurus.

    Start your site

    Run the development server:

    cd my-website
    npm run start

    The cd command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there.

    The npm run start command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/.

    Open docs/intro.md (this page) and edit some lines: the site reloads automatically and displays your changes.

    + + + + \ No newline at end of file diff --git a/docs/tutorial-basics/congratulations/index.html b/docs/tutorial-basics/congratulations/index.html new file mode 100644 index 00000000000..e24d3f70e29 --- /dev/null +++ b/docs/tutorial-basics/congratulations/index.html @@ -0,0 +1,24 @@ + + + + + +Congratulations! | Cardano Development Updates + + + + + + + + + + + + +
    +

    Congratulations!

    You have just learned the basics of Docusaurus and made some changes to the initial template.

    Docusaurus has much more to offer!

    Have 5 more minutes? Take a look at versioning and i18n.

    Anything unclear or buggy in this tutorial? Please report it!

    What's next?

    + + + + \ No newline at end of file diff --git a/docs/tutorial-basics/create-a-blog-post/index.html b/docs/tutorial-basics/create-a-blog-post/index.html new file mode 100644 index 00000000000..3dc5ceb4039 --- /dev/null +++ b/docs/tutorial-basics/create-a-blog-post/index.html @@ -0,0 +1,24 @@ + + + + + +Create a Blog Post | Cardano Development Updates + + + + + + + + + + + + +
    +

    Create a Blog Post

    Docusaurus creates a page for each blog post, but also a blog index page, a tag system, an RSS feed...

    Create your first Post

    Create a file at blog/2021-02-28-greetings.md:

    blog/2021-02-28-greetings.md
    ---
    slug: greetings
    title: Greetings!
    authors:
    - name: Joel Marcey
    title: Co-creator of Docusaurus 1
    url: https://github.com/JoelMarcey
    image_url: https://github.com/JoelMarcey.png
    - name: Sébastien Lorber
    title: Docusaurus maintainer
    url: https://sebastienlorber.com
    image_url: https://github.com/slorber.png
    tags: [greetings]
    ---

    Congratulations, you have made your first post!

    Feel free to play around and edit this post as much you like.

    A new blog post is now available at http://localhost:3000/blog/greetings.

    + + + + \ No newline at end of file diff --git a/docs/tutorial-basics/create-a-document/index.html b/docs/tutorial-basics/create-a-document/index.html new file mode 100644 index 00000000000..8d076109567 --- /dev/null +++ b/docs/tutorial-basics/create-a-document/index.html @@ -0,0 +1,24 @@ + + + + + +Create a Document | Cardano Development Updates + + + + + + + + + + + + +
    +

    Create a Document

    Documents are groups of pages connected through:

    • a sidebar
    • previous/next navigation
    • versioning

    Create your first Doc

    Create a Markdown file at docs/hello.md:

    docs/hello.md
    # Hello

    This is my **first Docusaurus document**!

    A new document is now available at http://localhost:3000/docs/hello.

    Configure the Sidebar

    Docusaurus automatically creates a sidebar from the docs folder.

    Add metadata to customize the sidebar label and position:

    docs/hello.md
    ---
    sidebar_label: 'Hi!'
    sidebar_position: 3
    ---

    # Hello

    This is my **first Docusaurus document**!

    It is also possible to create your sidebar explicitly in sidebars.js:

    sidebars.js
    module.exports = {
    tutorialSidebar: [
    'intro',
    'hello',
    {
    type: 'category',
    label: 'Tutorial',
    items: ['tutorial-basics/create-a-document'],
    },
    ],
    };
    + + + + \ No newline at end of file diff --git a/docs/tutorial-basics/create-a-page/index.html b/docs/tutorial-basics/create-a-page/index.html new file mode 100644 index 00000000000..cae824af627 --- /dev/null +++ b/docs/tutorial-basics/create-a-page/index.html @@ -0,0 +1,24 @@ + + + + + +Create a Page | Cardano Development Updates + + + + + + + + + + + + +
    +

    Create a Page

    Add Markdown or React files to src/pages to create a standalone page:

    • src/pages/index.jslocalhost:3000/
    • src/pages/foo.mdlocalhost:3000/foo
    • src/pages/foo/bar.jslocalhost:3000/foo/bar

    Create your first React Page

    Create a file at src/pages/my-react-page.js:

    src/pages/my-react-page.js
    import React from 'react';
    import Layout from '@theme/Layout';

    export default function MyReactPage() {
    return (
    <Layout>
    <h1>My React page</h1>
    <p>This is a React page</p>
    </Layout>
    );
    }

    A new page is now available at http://localhost:3000/my-react-page.

    Create your first Markdown Page

    Create a file at src/pages/my-markdown-page.md:

    src/pages/my-markdown-page.md
    # My Markdown page

    This is a Markdown page

    A new page is now available at http://localhost:3000/my-markdown-page.

    + + + + \ No newline at end of file diff --git a/docs/tutorial-basics/deploy-your-site/index.html b/docs/tutorial-basics/deploy-your-site/index.html new file mode 100644 index 00000000000..b421bebeb25 --- /dev/null +++ b/docs/tutorial-basics/deploy-your-site/index.html @@ -0,0 +1,24 @@ + + + + + +Deploy your site | Cardano Development Updates + + + + + + + + + + + + +
    +

    Deploy your site

    Docusaurus is a static-site-generator (also called Jamstack).

    It builds your site as simple static HTML, JavaScript and CSS files.

    Build your site

    Build your site for production:

    npm run build

    The static files are generated in the build folder.

    Deploy your site

    Test your production build locally:

    npm run serve

    The build folder is now served at http://localhost:3000/.

    You can now deploy the build folder almost anywhere easily, for free or very small cost (read the Deployment Guide).

    + + + + \ No newline at end of file diff --git a/docs/tutorial-basics/markdown-features/index.html b/docs/tutorial-basics/markdown-features/index.html new file mode 100644 index 00000000000..21139e3489c --- /dev/null +++ b/docs/tutorial-basics/markdown-features/index.html @@ -0,0 +1,24 @@ + + + + + +Markdown Features | Cardano Development Updates + + + + + + + + + + + + +
    +

    Markdown Features

    Docusaurus supports Markdown and a few additional features.

    Front Matter

    Markdown documents have metadata at the top called Front Matter:

    my-doc.md
    ---
    id: my-doc-id
    title: My document title
    description: My document description
    slug: /my-custom-url
    ---

    ## Markdown heading

    Markdown text with [links](./hello.md)

    Regular Markdown links are supported, using url paths or relative file paths.

    Let's see how to [Create a page](/create-a-page).
    Let's see how to [Create a page](./create-a-page.md).

    Result: Let's see how to Create a page.

    Images

    Regular Markdown images are supported.

    You can use absolute paths to reference images in the static directory (static/img/docusaurus.png):

    ![Docusaurus logo](/img/docusaurus.png)

    Docusaurus logo

    You can reference images relative to the current file as well, as shown in the extra guides.

    Code Blocks

    Markdown code blocks are supported with Syntax highlighting.

    ```jsx title="src/components/HelloDocusaurus.js"
    function HelloDocusaurus() {
    return (
    <h1>Hello, Docusaurus!</h1>
    )
    }
    ```
    src/components/HelloDocusaurus.js
    function HelloDocusaurus() {
    return <h1>Hello, Docusaurus!</h1>;
    }

    Admonitions

    Docusaurus has a special syntax to create admonitions and callouts:

    :::tip My tip

    Use this awesome feature option

    :::

    :::danger Take care

    This action is dangerous

    :::
    My tip

    Use this awesome feature option

    Take care

    This action is dangerous

    MDX and React Components

    MDX can make your documentation more interactive and allows using any React components inside Markdown:

    export const Highlight = ({children, color}) => (
    <span
    style={{
    backgroundColor: color,
    borderRadius: '20px',
    color: '#fff',
    padding: '10px',
    cursor: 'pointer',
    }}
    onClick={() => {
    alert(`You clicked the color ${color} with label ${children}`)
    }}>
    {children}
    </span>
    );

    This is <Highlight color="#25c2a0">Docusaurus green</Highlight> !

    This is <Highlight color="#1877F2">Facebook blue</Highlight> !

    This is Docusaurus green !

    This is Facebook blue !

    + + + + \ No newline at end of file diff --git a/docs/tutorial-extras/manage-docs-versions/index.html b/docs/tutorial-extras/manage-docs-versions/index.html new file mode 100644 index 00000000000..b801999d3e0 --- /dev/null +++ b/docs/tutorial-extras/manage-docs-versions/index.html @@ -0,0 +1,24 @@ + + + + + +Manage Docs Versions | Cardano Development Updates + + + + + + + + + + + + +
    +

    Manage Docs Versions

    Docusaurus can manage multiple versions of your docs.

    Create a docs version

    Release a version 1.0 of your project:

    npm run docusaurus docs:version 1.0

    The docs folder is copied into versioned_docs/version-1.0 and versions.json is created.

    Your docs now have 2 versions:

    • 1.0 at http://localhost:3000/docs/ for the version 1.0 docs
    • current at http://localhost:3000/docs/next/ for the upcoming, unreleased docs

    Add a Version Dropdown

    To navigate seamlessly across versions, add a version dropdown.

    Modify the docusaurus.config.js file:

    docusaurus.config.js
    module.exports = {
    themeConfig: {
    navbar: {
    items: [
    {
    type: 'docsVersionDropdown',
    },
    ],
    },
    },
    };

    The docs version dropdown appears in your navbar:

    Docs Version Dropdown

    Update an existing version

    It is possible to edit versioned docs in their respective folder:

    • versioned_docs/version-1.0/hello.md updates http://localhost:3000/docs/hello
    • docs/hello.md updates http://localhost:3000/docs/next/hello
    + + + + \ No newline at end of file diff --git a/docs/tutorial-extras/translate-your-site/index.html b/docs/tutorial-extras/translate-your-site/index.html new file mode 100644 index 00000000000..8a234c4d98e --- /dev/null +++ b/docs/tutorial-extras/translate-your-site/index.html @@ -0,0 +1,24 @@ + + + + + +Translate your site | Cardano Development Updates + + + + + + + + + + + + +
    +

    Translate your site

    Let's translate docs/intro.md to French.

    Configure i18n

    Modify docusaurus.config.js to add support for the fr locale:

    docusaurus.config.js
    module.exports = {
    i18n: {
    defaultLocale: 'en',
    locales: ['en', 'fr'],
    },
    };

    Translate a doc

    Copy the docs/intro.md file to the i18n/fr folder:

    mkdir -p i18n/fr/docusaurus-plugin-content-docs/current/

    cp docs/intro.md i18n/fr/docusaurus-plugin-content-docs/current/intro.md

    Translate i18n/fr/docusaurus-plugin-content-docs/current/intro.md in French.

    Start your localized site

    Start your site on the French locale:

    npm run start -- --locale fr

    Your localized site is accessible at http://localhost:3000/fr/ and the Getting Started page is translated.

    caution

    In development, you can only use one locale at a same time.

    Add a Locale Dropdown

    To navigate seamlessly across languages, add a locale dropdown.

    Modify the docusaurus.config.js file:

    docusaurus.config.js
    module.exports = {
    themeConfig: {
    navbar: {
    items: [
    {
    type: 'localeDropdown',
    },
    ],
    },
    },
    };

    The locale dropdown now appears in your navbar:

    Locale Dropdown

    Build your localized site

    Build your site for a specific locale:

    npm run build -- --locale fr

    Or build your site to include all the locales at once:

    npm run build
    + + + + \ No newline at end of file diff --git a/feed.json b/feed.json new file mode 100644 index 00000000000..89c27065a89 --- /dev/null +++ b/feed.json @@ -0,0 +1,4558 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "Cardano Updates Feed", + "home_page_url": "https://input-output-hk.github.io/cardano-updates/", + "description": "Regular updates from Cardano Development Teams", + "items": [ + { + "id": "2023-12-06-ledger", + "content_html": "

    High level summary

    This period we reached a major milestone, namely we now have an initial version of Conway\nconformance testing working. We are now able to generate random valid data with the help\nof constraint based testing framework, apply that data to Conway Ledger rules and verify\nthat the output matches to the one produced by the executable version of the Formal Ledger\nSpecification, when it is applied to the same random data.

    We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get\nConstitutional Committee query is complete and tested. Various improvements to the\ntesting tools. Addition of more test cases.

    Low level summary

    Conway

    • pull-3888 - Add checks for valid ProtVer when a proposal is a HardFork
    • pull-3902 - Fix pvCanFollow usage in Conway and improve clarity in Shelley
    • pull-3855 - Remove unreachable proposals
    • pull-3903 - Add lenient decoder for Addr
    • pull-3878 - Committee query - implement next epoch change

    Testing

    • pull-3893 - Move tree-diff dependency to tests together with all instances
    • pull-3896 - Fix Brute force failure
    • pull-3904 - New ListWhere Pred added to the Constrained Solver.
    • pull-3907 - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file
    • pull-3883 - Committee QuerySpec Imp Test
    • pull-3909 - Make impAnn a bit more useful, by making the logs scoped by impAnn
    • pull-3908 - Use upstream testing instances for very basic types
    • pull-3912 - Removed call to tail, and the 'watchPulser' test
    • pull-3852 - Added constrained generators to conformance tests - Part 1

    Improvements and releasing

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-12-06-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-12-06T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-12-06-mithril", + "content_html": "

    High level overview

    This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking.

    Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io.

    Low level overview

    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Create a test network on Sanchonet #1173
    • Worked on the issue Upgrade breaking changes crates #1357
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Completed the issue Enhance aggregator REST API performances #1327
    • Completed the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Make mithril-client examples full crates #1385
    • Completed the issue Manual publication to crates.io with GitHub action #1380
    • Completed the issue Remove sqlite dependency from mithril-client crate #1390
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-12-06-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-12-06T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-12-04-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: Release benchmarking for node 8.7.0. Also, we performed the first-ever Conway benchmarks.
    • Development: Conway capability of our workload generator has been implemented and merged to master.
    • Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data.
    • Tracing: Quality-of-life improvements to tracing output and addition of a test suite.
    • Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.

    Low level overview

    Benchmarking

    A full set of benchmarks for node 8.7.0 has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of 8.7.0 over 8.6.0, and can confirm no regressions have been introduced.

    Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version.\nOnly Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty.

    Development

    Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era.\nCurrently, we're looking into adding Conway-exclusive features, such as DRep registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining DRep sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying.

    Infrastructure

    As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've\nimproved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data.

    Tracing

    The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages.\nAdditionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system.

    Nomad backend

    We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-12-04-performance-and-tracing", + "title": "Performance & Tracing Update", + "summary": "High level summary", + "date_modified": "2023-12-04T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-12-01-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team conducted a packed Monthly Review meeting,\nfeaturing demonstrations and the preparation of the monthly report. They\naddressed flakiness in tests and enhanced the logs json schema,\nimproving overall test reliability. Additionally, the team successfully\nbuilt MacOS ARM64 (aarch64-darwin) binaries in CI, expanding platform\nsupport. They further improved the network configuration by detecting\nincompatible persisted states, contributing to overall system\nrobustness. Finally, the team released version 0.14.0, highlighting\ntheir commitment to delivering regular updates and improvements.

    What did the team achieve this week

    • Monthly Review\nmeeting\npacked with demonstrations and prepared monthly report\n#1189
    • Fixed several flaky tests and improved the logs json schema\n#1188#1190#1192
    • Built MacOS ARM64 (aarch64-darwin) binaries in CI\n#1182
    • Improved network configuration by detecting incompatible persisted\nstates #1174
    • Released version 0.14.0

    What are the goals of next week

    • Start work on incremental decommit
    • Continue shepherding contributed PRs to completion
    • Finish stateless-observation work
    • Open a head on a Conway network
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-12-01-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-12-01T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-11-29-consensus", + "content_html": "

    High level summary

    The Consensus team implemented and tested a patch that does not propagate future headers.\nIt is under review, and we expect it can be released in the next Cardano node version.\nOn the UTxO-HD front, we finished prototyping the LedgerDB and BackingStore redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend.\nWith this prototype finished we can start integrating the rest of the code.\nWe investigated the unexpected performance degradation observed when acquiring the block context.\nWe also released Cardano node 8.7.0 and moved tree-diff outside cardano-ledger libraries.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-29-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-11-29T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-11-29-mithril", + "content_html": "

    High level overview

    This week, the Mithril team released the initial version of the Mithril client library, enabling developers to integrate core Mithril features into their applications. They also released a new distribution, 2347.0, which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements.

    The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance.

    Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users.

    Low level overview

    • Release of the mithril-client library crate
    • Publication of a dev blog post about the released Mithril library
    • Released the new distribution 2347.0
    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Support P2P relay in infrastructure #1361
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue mithril-client verbosity not following usage menu #1325
    • Completed the issue Error message for mithril-client snapshot download #1375
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-29-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-11-29T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-11-24-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team spent significant time opening a head among\nthemselves on mainnet using the release candidate, revealing and\naddressing lurking bugs such as\n#1174. Also\nrequired was this change to dynamically calculate the min utxo value\n#1176, a\nnecessary adjustment following the switch to inline datums. The team\nengaged with cardano-cli / cardano-api maintainers to discuss recent\nchanges and collaborated on drafting feature ideas, including providing\nConway support\nfor the Hydra roadmap. As part of ongoing improvements, they\nexperimented with writing the specification in markdown instead of\nLaTex.

    What did the team achieve this week

    • Opened head among us on mainnet and uncovered a few lurking bugs like\n#1174 in the\nrelease candidate
    • Calculate the min utxo value instead of hard-coding it\n#1176, which is\nneeded since we switched to inline datums.
    • Met with the cardano-cli / cardano-api maintainers to discuss\nrecent changes and way forward
    • Drafted features ideas to provide Conway\nsupport on the\nHydra roadmap
    • Experimented in writing the specification in markdown instead of LaTex

    What are the goals of next week

    • Have the Monthly review meeting with several demos
    • Release version 0.14.0 with this\nscope
    • Complete tidying up chain layer via stateless observation changes in\nhydra-node\n#1096
    • Update dependencies to prepare for Conway\n#1114
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-24-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-11-24T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-11-24-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • The cardano-node nixos service now supports SIGHUP p2p topology reloading when the useSystemdReload option is enabled

    Lower level summary

    Capkgs

    • Update cardano-db-sync and offchain-metadata-tools package paths and/or references: capkgs-compare

    Cardano-node

    • Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: cardano-node-pull-5537
      • Creates a useSystemdReload bool option for the cardano-node nixos service
      • This will move the topology file(s) to /etc/cardano-node/topology-$i.yaml and inject systemd reload hooks for p2p configured cardano-node instances
      • Moving topology files to /etc also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired

    Cardano-parts

    • Adds a metadata server profile and a number of other features and improvements: cardano-parts-pull-20
      • Adds a new metadata-service profile
      • Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile
      • Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish
      • Adds extra node list producers and public producers for cardano-node-topology profile
      • Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch
      • Adds select systemd metrics reporting to grafana-agent profile
      • Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS
      • Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation
      • Adds support for grafana recording rules in the template files
      • Improves cardano-group profile handling of producers with respect to multiple instance nodes
      • Improves grafana-agent profile metrics handling for multi-instance cardano-node servers
      • Improves smash service preStart handling while waiting for a node socket
      • Updates Justfile for ERA_CMD demo support
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Defaults cardano-postgres profile psqlrc use to false

    Cardano-playground

    • Adds a new testnet metadata server, cluster webserver, and other improvements: cardano-playground-pull-6
      • Adds a new metadata server
      • Adds a new webserver for the cluster's static virtualhost needs
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds systemd metrics monitoring to the cluster
      • Resizes sanchonet machines to support the growing chain
      • Completes migration of preprod from world
      • Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes
      • Updates Justfile for ERA_CMD demo support
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Migrates book static code to playground from world, with refactor, cleanup and updates
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules

    Offchain-metadata-tools

    • Adds db password option with obfuscation plus misc improvements: offchain-metadata-tools-pull-61
      • Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services
      • Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile
      • Moves from std use in the nix flake to standard flake schema
      • Fixes hydra CI failures
      • Builds update-docs in hydra to avoid long local build times
      • Removes deprecated tullia
      • Removes deprecated check-hydra from pkgs
      • Removes deprecated bors files and references
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-24-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-11-24T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-11-22-ledger", + "content_html": "

    High level summary

    Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of\nCDDL specification. Important bugfixes include:

    • Fix deserialization of ValueNotConservedUTxO predicate failure that could not\npreviously report zero ADA.
    • Fix deserialization of CostModels in the PParamsUpdate. Invalid CostModels are no\nlonger allowed, only CostModels for unrecognized Plutus versions are allowed starting\nwith Conway
    • Fix returning of Deposits for ProposalProcedures

    Testing tooling has been improved and new tests have been implemented for Conway era.

    Low level summary

    Conway

    • pull-3858 - Restructure computing Refunds and Deposits in a TxBody across all eras
    • pull-3860 - Removed mock/crypto.cddl, added optional tag to sets
    • pull-3864 - Fix Proposal deposits and add deposit tests to imp tests
    • pull-3859 - Rename ProposalsSnapshot to Proposals
    • pull-3867 - MaryValue fixes
    • pull-3869 - Indicate that tag 258 is optional for OSet. Fix rational CDDL
    • pull-3863 - Improve deposits refunds re-usability
    • pull-3861 - Fail PParamsUpdate deserialization for invalid costmodels in Conway
    • pull-3875 - Fix cddl spec for CostModels in Conway
    • pull-3876 - Change 4 PParam fields from EpochNo to EpochInterval
    • pull-3884 - Relax requirement on the Set tag 258 to be enforced in the next era

    Testing

    • pull-3868 - Improvements to support property tests on Traces with simple Tx with DRep related Certs
    • pull-3792 - RATIFY and GOV constraint tests
    • pull-3885 - Added a test for genTxAndNewEpoch
    • pull-3886 - QuickCheck Imp integration

    Improvements and releasing

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-22-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-11-22T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-11-22-mithril", + "content_html": "

    High level overview

    This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer.

    Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release.

    Low level overview

    • Completed the issue Prototype a P2P relay with libp2p #1326
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Worked on the issue Support P2P relay in infrastructure #1361
    • Completed the issue mithril-client fails to extract archive #1352
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-22-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-11-22T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-11-20-cip1694", + "content_html": "

    High level summary

    We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

    Initial CIP-1694 Security Analysis and Responses

    Section: The constitutional committee


    • “For example, if we consider the hypothetical Constitution rule \"The Cardano network must always be able to produce new blocks\" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

    There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


    Section: Size of the constitutional committee


    • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

    Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


    Section: Terms


    • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

    Thanks. Yes, that suggestion is a bit easier to read.


    Section: Registered DReps


    • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

    Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


    Section: Ratification


    • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

    These correspond exactly to the groups that are administered by the Parameter Committee.


    • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

    Yes, it’s not about harming the system, since Info\nactions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

    Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


    Section: Content


    • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

    Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


    Section: Protocol Parameter groups


    • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

    These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


    • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

    All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


    Section: Votes


    • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

    They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


    Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


    • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

    There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


    Section: Changes post Edinburgh workshop (July 2023)


    • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

    It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


    Section: Reduced deposits for some government actions


    • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

    Indeed. We have no plans for this at the moment.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-20-cip1694", + "title": "Initial CIP 1694 Security Analysis and Responses", + "summary": "High level summary", + "date_modified": "2023-11-20T00:00:00.000Z", + "author": { + "name": "Kevin Hammond", + "url": "https://github.com/kevinhammond" + }, + "tags": [ + "ledger", + "cip1694", + "security" + ] + }, + { + "id": "2023-11-17-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team made several impactful updates. They addressed\nmisleading errors regarding collect com transactions, resolved a security\nadvisory (CVE-2023-42806), and simplified the Hydra Head protocol by using\ninline datums. The team also tackled minor inconsistencies in specifications and\nimplementation, documented reasons for potentially dropped close transactions by\nthe cardano-node, and collaborated with SundaeLabs on an offline mode for\nhydra-node. Additionally, they engaged in discussions with researchers about\nincremental de-/commits.

    What did the team achieve this week

    • Removed misleading errors about collect com transactions #839
    • Addressed security advisory CVE-2023-42806 in PR #1161
    • Changed the head protocol to use inline datums, simplifying things in the hydra-node #1162
    • Addressed minor inconsistencies in spec and implementation #1104
    • Documented why close transacations might be dropped by the cardano-node (cant fix) #1039
    • Tidy up a few things here and there
    • Worked with SundaeLabs on the offline mode for hydra-node
    • Discussed incremental de-/commits with researchers

    What are the goals of next week

    • Start work on incremental decommits protocol specification #1057
    • Provide support to Hypix
    • Address all open bugs
    • Release version 0.14.0 with this scope
    • Update dependencies to prepare for Conway #1114
    • Shepherd off-line mode PR over the finish line
    • Complete tidying up chain layer via stateless observation changes in hydra-node #1096
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-17-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-11-17T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-11-17-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: Release benchmarking for node 8.6.0 as well as benchmarks scrutinizing GHC versions and the new tracing system.
    • Development: PlutusV3 capability of our workload generator has been implemented.
    • Tracing: First round of optimization of the cardano-tracer service has completed, awaiting validation.
    • Nomad backend: A significant PR has landed addressing automation features and debugging capabilites.
    • Workbench: Configurable remote environments and improvements to run documentation have been merged to master.

    Low level overview

    Benchmarking

    We've performed and analyzed a full set of benchmarks for node 8.6.0, both in comparison to recent release tags\nand mainnet version 8.1.2. A lot of development work has entered the system since then, so it is crucial\nwe can rule out any potential performance risks for the next mainnet release.

    Additionally, we've been benchmarking GHC9.6.3 builds of cardano-node. Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform.

    A last set of benchmarks was dedicated to the new tracing system with node 8.6.0. We were able to show that\nthere is no performance risk to enabling the new system, even when forwarding all trace messages to a cardano-tracer\nservice on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression.

    Development

    For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes\nto the execution budgets by developing specialized workloads.

    Tracing

    The cardano-tracer service has received its first batch of optimizations. Profiling output is promising; to measure\nperformance for a long service run time, we're currently equipping the service binary with the same capability to\nemit regular resource traces as cardano-node. Analysis of those will be the basis for validating this and possible future optimization efforts.

    Nomad backend

    Many improvements for the nomad backend have been implemented and merged to master. This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service,\nmore detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables\nour team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred.

    Workbench

    Our performance workbench has seen upgrades in documenting and reporting cardano-node builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler.\nWhen alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential.

    Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-17-performance-and-tracing", + "title": "Performance & Tracing Update", + "summary": "High level summary", + "date_modified": "2023-11-17T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-11-16-network", + "content_html": "

    High-level overview of sprint 48

    Bootstrap Peers

    We continued reviewing bootstrap peers, ouroboros-network#4555.

    IOClasses / IOSim

    We prepared slides for a Haskell meetup were we presented a talk on IOSimPOR.\nThe recording will be availble on YouTube.

    We also used the opportunity to do some refactoring of the IOSim code base: io-sim#117.\nWe released io-sim-1.3.0.0 on Hackage: io-sim#119.

    We also added forkFinally to MonadFork (not included in 1.3.0.0 release): io-sim#123.

    Tech debt

    We refactored Resource used by the DNS subsystem: ouroboros-network#4707.\nWe continued reviewing the ouroboros-network#4625 PR, which refactors\nRootPeersDNS module.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-16-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 48", + "date_modified": "2023-11-16T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-11-15-consensus", + "content_html": "

    High level summary

    Over the last two weeks, we managed to run a UTxO-HD capable node in legacy mode, which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does).\nThis legacy mode could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not.\nHowever, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter.\nOn the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node.\nTherefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend.

    On the Genesis front, we reviewed the peer simulator for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team.

    We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos.

    Javier Sagredo continues his cycle as release engineer, and he is working on version 8.7 of Cardano node.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-15-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-11-15T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-11-15-mithril", + "content_html": "

    High level overview

    This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Completed the issue Light Wallet: Release mithril-client library #1311
    • Completed the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Completed the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Fix certificate hashes re-computation in aggregator #1343
    • Completed the issue Remove unstable tag in unstable release #1235
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-15-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-11-15T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-11-14-node-cli-api", + "content_html": "

    2023-11-01 - 2023-11-14

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Improve golden tests
    • Clean-up of conway era commands

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-14-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-11-14T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-11-10-hydra", + "content_html": "

    High-level summary

    The last two weeks, the Hydra team achieved several milestones. They published\nthe monthly report for October, providing updates on project developments. The\nteam delivered a presentation and workshop at the Cardano Summit, contributing\nto community engagement. They implemented a \\\"dirt road\\\" solution for the\n\\\"Ignored init tx\\\" notification and moved the hydra-poll example project to a\ndedicated repository. Additionally, the team built a hydra-chain-observer tool\nfor Hydra Heads, updated the toolchain to GHC 9.6.3, and made various\nimprovements to tooling and code formatting. They addressed specific issues,\nsuch as fixing the gen-hydra-keys command and resolving concerns with the\nrewritten hydra-tui. The team also enhanced the hydra-cluster smoke test\nsuite by fetching network configurations dynamically. Lastly, they actively\nreviewed pull requests and architectural decision records from the community,\nincluding contributions from SundaeSwap. An experiment, the Hydra tally, was\ncompleted and successfully deployed to the mainnet by the Cardano Foundation.

    What did the team achieve this week

    • Published the monthly report for\noctober
    • Given a presentation / workshop at the Cardano summit\n#1109
    • Dirt road implementation for \\\"Ignored init tx\\\" notification\n#529 (without\nstateless observation)
    • Completed and moved hydra-poll example project into a\ndedicated\nrepository
    • Built a first version of a chain observation tool for Hydra Heads\n#1096
    • Switched toolchain to GHC 9.6.3 and various improvements on tooling\nand code formatting\n#1135#1152#1151#1154
    • Fix gen-hydra-keys command to not overwrite existing\nkeys #1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Fetch network configurations instead of packaging them into\nhydra-cluster (smoke) test suite\n#1156
    • Reviewing PRs and ADRs from the community (SundaeSwap)\n#1118#1157
    • Hydra tally experiment (Cardano Foundation) deployed to mainnet

    What are the goals of next week

    • Tackle reported bugs
    • Shepherd contributed off-line mode PR to the main codeline
    • Improve chain observation tool to include more data and refactor\nexisting code towards more stateless observation
    • Start work on incremental decommits
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-10-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-11-10T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-11-10-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the cardano-playground stack

    Lower level summary

    Capkgs

    Cardano-parts

    • General migration support PR for cardano-world to cardano-playground cardano-parts-pull-18
      • Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground
      • Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes
      • Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains
      • The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state
      • The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable
      • Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0
      • For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true
      • Template updates include:
        • Adds optional TF AZ declaration on ec2 resources
        • Adds a cardano node p2p dashboard to the grafana cloud stack
        • Adds a dbsync pool performance analysis query
        • Updates python distribute and delegation scripts from world for playground compatibility
        • Starts a python script lib to reduce shared code among the python scripts
        • Several justfile improvements and new recipes
      • More detail is available in the PR description
    • Update submit action script for 8.6 cardano-parts-pull-19
    • Update scripts for 8.6.0-pre cardano-parts-pull-21
      • Fixes subcommand names based on ERA_CMD
      • Adds deposits to some commands
      • Separates CC cold/hot key generation as host authorization has to occur after action is approved
      • CC voting enabled in vote job

    Cardano-playground

    • Migration PR to largely complete the network migration from cardano-world to cardano-playground: cardano-playground-pull-5
      • Adds re-spun private chain network
      • Migrates shelley-qa chain network from world
      • Justfile improvements and new recipes
      • Improve concurrent environment chain support
      • More detail is available in the PR description

    Iohk-nix

    • Migration to play: iohk-nix-pull-561
      • Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org
      • Remove deprecated cardano-lib p2p network environment
      • Update sanchonet chain with respin changes
      • Update private chain with respin changes
      • Bump private and shelley-qa chains to sanchonet equivalent conway genesis
      • Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing

    Sanchonet-demo

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-10-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-11-10T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-11-09-db-sync", + "content_html": "

    High level summary

    We have created new tag sancho-2-2-0, which integrates missing Conway feautures and some minor fix\ntags sancho-2-1-0, sancho-2-0-1.\nWe have completed the initial implementation for the bootstrap instance objective.

    Lower level summary

    • Add a new --disable-gov flag which disabled Conway ferautures\n#1558
    • Fix of the committee key size\n#1544
    • Workaround a ledger issue with unregistered pools\n#1542
    • Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs\n#1539
    • Rename offline to offchain\n#1533
    • Transfer existing tests to Conway era\n#1529#1547
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-09-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-11-09T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-11-08-ledger", + "content_html": "

    High level summary

    This update contains mostly improvements to quality of Conway era implementation and\ntooling that we use for testing Ledger. Major Conway bugs that were discovered and\nsquashed are:

    • PParamsUpdate proposals will now correctly use DRep thresholds for ratification
    • Treasury withdrawals are now properly enacted.
    • Corrected snapshotting and DRep Stake Distribution Pulser initialization
    • Delegation to non-existent Stake pool is no longer possible

    Other important quality of life improvements are addition of reusable interfaces for an\nordered set OSet and ordered map OMap. Which allowed us to disable duplicate\ncertificates and proposals in a transaction. As a precursor to PlutusV3 integration, a\nserious reorganization of Plutus related functionality was performed.

    Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on\nexpired proposals, addition of Anchor to Constitutional Committee resignation proposals.

    Significant improvements have been made to a specialized \"Imp\" test library that allows us\nwriting concise stateful unit tests for verifying the Ledger logic. Serious progress has\nbeen made on the conformance testing, where we can now interface with Haskell generated\ncode from the Agda specification. Serialization testing has been extended to increase\nbinary conformance coverage.

    Low level summary

    Conway

    • pull-3808 - Enhance CommitteeMembersState query to return quorum and NoConfidence
    • pull-3801 - Fix epoch rule and tests
    • pull-3803 - Fix delegation validation
    • pull-3759 - Reshuffle things to the DRepPulser incorporates some snap shot things
    • pull-3779 - Prevent duplicate certs and proposals
    • pull-3794 - Added anchor to resign certs
    • pull-3797 - Cleanup JSON instances for Conway governance
    • pull-3848 - Plutus modules restructure
    • pull-3840 - Fix anomalies in Deposits in the Conway Era
    • pull-3856 - Add governance related ledger events
    • pull-3825 - Prevent voting on expired GovActions
    • pull-3831 - Treasury withdrawal fix
    • pull-3791 - Use a Data.OMap.Strict to replace ProposalsSnapshot
    • pull-3836 - PParamsUpdate enactment fix
    • pull-3846 - Revert argument order swap.

    Testing

    • pull-3782 - Move ImpTest to Shelley testlib
    • pull-3842 - Imp improvements
    • pull-3844 - Add mappings to Agda types
    • pull-3853 - Fix strange assertion failure, which hides real Block too big problem.
    • pull-3809 - CDDL roundtrip testing
    • pull-3832 - Treasury withdrawals tests
    • pull-3839 - Added cardano-ledger-conformance
    • pull-3841 - Add sha256 to cardano-ledger-executable-spec

    Improvements and releasing

    • pull-3843 - Add ...WithLogs versions of evalScripts and friends
    • pull-3795 - Bump plutus to 1.15
    • pull-3798 - Bump urllib3 from 1.26.17 to 1.26.18 in /doc
    • pull-3799 - Changes needed for 8.6 release
    • pull-3807 - Add invalidBeforeL and invalidHereAfterL functions
    • pull-3819 - Fixups needed for a release
    • pull-3829 - Post release CHANGELOG version bumps
    • pull-3830 - Bump aeson to 2.2
    • pull-3833 - Backport release cardano-ledger-conway-1.10.1.0
    • pull-3828 - Add changelog for node release 8.6
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-08-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-11-08T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-11-08-mithril", + "content_html": "

    High level overview

    This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client Docker package is incorrect #1322
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-08-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-11-08T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-11-01-consensus", + "content_html": "

    High level summary

    This week the Consensus team made progress on two fronts: the question of survivable eclipse duration, which is part of our work supporting Genesis delivery, and how to improve the handling of blocks from the future.\nRegarding the UTxO-HD branch, we managed to run a node with legacy blocks, which is syncing with mainnet, up to including Alonzo.\nWe also investigated a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-01-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-11-01T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-11-01-mithril", + "content_html": "

    High level overview

    This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the release-mainnet aggregator.

    Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Fix devnet Mithril Docker images [#1272](https://github.com/input-output-hk/mithril/issues/1272
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client regressions in snapshot list and download #1321
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-11-01-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-11-01T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-10-27-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team fixed the gen-hydra-keys command to avoid\noverwriting existing keys, and resolved issues related to the rewritten\nhydra-tui. They also worked on a \\\"dirt road\\\" implementation for the\n\\\"Ignored init tx\\\" notification, improving the robustness of the system.

    The team finalized preparations for the Cardano Summit presentation, including\nimplementation of the hydra-poll example DApp.

    If you happen to read this and attend the Summit in Dubai, make sure to check\nout our Masterclass about \\\"Developing Hydra + Mithril for Scaling Cardano\\\" on\nFriday, November 3 at 14:00-15:30 local time in the \\\"Al Dar\\\" room!

    What did the team achieve this week

    • Fix gen-hydra-keys command to not overwrite existing keys\n#1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Finalized cardano summit preparation\n#1109
    • Implemented the hydra-poll example DApp link to\nrepository
    • Dirt road implementation for \\\"Ignored init tx\\\" notification\n#529

    What are the goals of next week

    • Attend cardano summit and deliver presentation
    • Clarify / close user created issues
    • Build aarch64-darwin binaries in CI
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-27-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-10-27T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-10-27-network", + "content_html": "

    High-level overview of sprint 47

    Bootstrap Peers

    We continued to review the process of bootstrap peers, see ouroboros-network#4555

    CI / Tests

    We investigated our CI issues. We found a memory leak in typed-protocols\nfunction used for testing codecs which triggered out of memory manager (OOM) on\nsome platforms (typed-protocols#43); we also found a bug in the connection manager which resulted in CI\ntimeouts (see connection-manager-fix).

    KeepAlive client

    We found two small issues with the keep-alive client, which were addressed\nby Karl Knutsson (Cardano Foundation), ouroboros-network#4689.

    Galois

    We merged two large PRs prepared by Galois:

    Cardano Network Service Assurance (CNSA)

    Galois made the following progress on CNSA:

    • a simple [InfuxDB] database backend has been added;
    • the documentation has been updated;
    • internal improvements to the code;
    • progress on a new \"CSNA analysis\" that provides, for each sampler node, the\nblock download throughput in bytes over time.

    New CHaP Release

    We cut a new release of ouroboros-netowrk packages to CHaP: chap#547

    More details

    CI / Tests

    We improved the memory footprint of some of our tests by analysing a stream of\nIOSim traces without retaining them, see ouroboros-network#4696

    As a safety measure, we introduced an upper bound for heap memory used by test\nartefacts in our nix tests. We use 200MB limit for all tests except for\nnetwork-mux tests which use 350MB limit, see ouroboros-network#4702.

    We refactored one of our tests to use ephemeral ports thus allowing it to\nrun concurrently, see ouroboros-network#4702.

    We merged ouroboros-network#4623 which fixes a bunch of test failures.

    All of them were due to a bug in test logic rather than a bug in production\ncode.

    Release Process

    We updated our release process & associated scripts, see\nouroboros-network#4705.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-27-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 47", + "date_modified": "2023-10-27T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-10-27-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the cardano-playground stack

    Lower level summary

    Capkgs

    • Adds offchain-metadata-tools, dbsync sanchonet updates: capkgs-compare

    Cardano-parts

    • General package updates, modules improvements and template recipes to support network migration from world to playground cardano-parts-pull-17
      • Bumps cardano-db-sync-ng to sancho-2-0-0 tag
      • Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play
      • Adds more machine system bins and devShell bins for scripting and debug purposes
      • Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module
      • Adds profile-cardano-node-topology module for a simplified interface to most common topology needs
      • Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs
      • Adds a topology function to filter self from group machines with an allowList for matching infixes
      • Adds metadata-server and related offchain-metadata-tools bins from capkgs
      • Updates justfile template with:
        • a new query-all recipe for getting status of multiple concurrent running environments
        • a new set-default-cardano-env recipe for fast switching between environments
        • a new start-demo recipe for forking a custom env into conway
        • a new start-node recipe for generic environment start
        • a new stop-node recipe for generic environment stop
        • updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions
        • updated query-tip recipe to a generic query tip compatible with each environment

    Cardano-playground

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-27-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-10-27T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-10-25-mithril", + "content_html": "

    High level overview

    This week, the Mithril team released a new distribution 2342.0. This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes.

    They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files.

    Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the release-mainnet aggregator, and enhanced the Mithril explorer UI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Completed the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Worked on the issue Fix devnet Mithril Docker images #1272
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Worked on the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Display a summary of signers before the full list in explorer #1133
    • Completed the issue Add certificates list in explorer #1184
    • Completed the issue CoreVerifier setup does not compute total_stake correctly #1306
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-25-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-10-25T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-10-24-node-cli-api", + "content_html": "

    2023-10-11 - 2023-10-24

    High level summary

    CARDANO-CLI

    • Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified.
    • stake-address-info now shows deposits balance.
    • Added conway governance action view to allow to inspect governance action files before submitting them on a transaction.
    • build-raw support for --vote-file and --proposal-file

    CARDANO-API

    • Support DRep extended keys
    • Support Plutus V1 in Conway

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-24-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-10-24T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-10-20-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023.

    In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON.\nThis improvement offers users greater flexibility and ease of interaction with the API.

    Finally, the team has followed up on the TUI brick upgrade to version 1.10.\nThis effort has resulted in addressing minor details and enhancing the overall user experience with the TUI.

    What did the team achieve this week

    • Prepare presentation and workshop for Cardano Summit.
    • More TUI fixes and improvements.
    • Upgrade GHC from 9.2.8 -> 9.6.2 #1105
    • Solved user issue related to submitting transactions in cbor format #1111.
    • Fix hydraw connection issue making it more stable #1121.

    What are the goals of next week

    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-20-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-10-20T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-10-18-consensus", + "content_html": "

    High level summary

    During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node.

    UTxO-HD

    • The Plutus workload benchmark for the in-memory backend showed no regressions for the metrics of interest, but it does show an increase in resource usage.
    • We got additional ad-hoc measurements on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB.
    • We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.

    Genesis

    • We produced the first draft for a Survivable Eclipse Duration Model (422).

    Support

    • Esgen finished his cycle as release engineer. Node 8.5.0 has been released.
    • We resumed work on the subpar handling of block from the future (4251).
    • We prepared the integration of new tracing events for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned issue).
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-18-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-10-18T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-10-18-mithril", + "content_html": "

    High level overview

    This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay.

    Finally, they enhanced the CI/CD to publish multiple packages to crates.io and started improving the developer experience with the Mithril devnet.

    Low level overview

    • Published the security advisory Mithril relay could expose Cardano block producer internal IP when updated #GHSA-9m3h-72xj-x2gq
    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Publish multiple packages to crates.io #1298
    • Completed the issue Rename public key published in releases #1292
    • Completed the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Fix devnet Mithril Docker images #1272
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-18-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-10-18T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-10-15-network", + "content_html": "

    High-level overview of sprint 46

    Bootstrap Peers

    We continued reviewing of bootstrap peers, see ouroboros-network#4555.

    Towards Typed Protocols 0.2.0.0

    We diagnosed the performance regression of the new design. The work on\ntyped-protocols will be postponed. For more details see the\ntyped-protocols#3. As an outcome of the performance debugging we prepared\nPR which updates the demo-ping-pong and\ndemo-chain-sync applications.

    Peer Sharing

    We made progress in review of ouroboros-network#4644, which simplifies the\npeer sharing and fixes the ouroboros-network#4642 issue.

    Tech Debt

    We reviewed the ouroboros-network#3836 PR which inspects all the uses of\nerror in ouroboros-network. The PR was prepared by Galois.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-15-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 46", + "date_modified": "2023-10-15T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-10-13-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity.

    They also completed the exploration of potentially moving the Plutus validator scripts to Aiken.

    Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project.

    What did the team achieve this week

    • Network Resilience Persistence (#1101)[https://github.com/input-output-hk/hydra/pull/1101].
    • Upgrade brick on TUI (#1103)[https://github.com/input-output-hk/hydra/pull/1103].
    • Aiken commit validator translation (#1072)[https://github.com/input-output-hk/hydra/pull/1072].
    • Fixed some bugs in our TUI client.

    What are the goals of next week

    • Prepare presentation and workshop for Cardano Summit.
    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-13-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-10-13T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-10-13-ledger", + "content_html": "

    High level summary

    The Ledger team has been shifting focus from implementing Conway related features to\ntesting. For this reason there is a very little amount features that are reported this\ntime aorund. Notable Conway related changes are a specialized ledger query for getting\nConstitutional Committee state and prevention of submitting proposal procedures that have\nno valid path to enactment.

    Testing related work was mainly on a constraint base system as well as on roundtrip\nserialization. As a result of this extra testing a bug in Conway Genesis serialization\nwas eliminated.

    Low level summary

    Conway era

    Integration and releasing

    Testing

    • pull-3769 - Add roundtrip testing by validating FlatTerm
    • pull-3783 - Update TranslationInstance.hs
    • pull-3775 - Refactor and improve constraint based STS tests
    • pull-3793 - Fix sums with negative RHS.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-13-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-10-13T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-10-13-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was updated to 8.5.0-pre.
    • Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring

    Lower level summary

    Capkgs

    • Various improvements and fixes including:
      • Add GHA cron schedule
      • Add nix auto-gc to avoid running out of storage during large package set builds
      • Add new packages to capkgs
      • Reduce runner storage requirement leaving more room for builds
      • Restructure capkgs attribute names to avoid package name collisions
      • Return to non-musl builds for cardano packages to retain journald compatability
      • Update cache usage to from file level to folder level to reduce network and latency overhead
      • Commit diff: capkgs-compare

    Cardano-parts

    • Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: cardano-parts-pull-16
    • Dbsync, smash, faucet and more: cardano-parts-pull-15
      • Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes
      • Adds nginx vhost metrics exporter profile
      • Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down
      • Adds bash *-ng autocompletion compatible wrappers
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds downstream grafana cloud dashboard as templates
      • Adds downstream grafana cloud alerts as templates
      • Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish
      • Updates the basic profile with IOG cache and commonly used bins
      • Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks
      • Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration
      • Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion
      • Updates the colmena template with dbsync, smash, faucet machines profiles and roles
      • Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns
      • Bumps capkgs node-ng to 8.5.0-pre

    Cardano-playground

    • Dbsync, smash, faucet and more: cardano-playground-pull-3
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts
      • Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change
      • Optimizes machine sizes
      • Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion
      • Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration

    Cardano-world

    Sanchonet-demo

    • Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: sanchonet-demo-commit
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-13-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-10-13T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-10-11-mithril", + "content_html": "

    High level overview

    This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on crates.io, the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures.

    Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI.

    Low level overview

    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Update Rust compiler in nix CI #1282
    • Worked on the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-11-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-10-11T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-10-10-node-cli-api", + "content_html": "

    2023-09-27 - 2023-10-10

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Depracated governance query commands and moved all governance related queries to cardano-cli <era> query
    • Drep registration certificates now allow to include an anchor
    • Integrated Drep retirement ceriticates
    • clean up of Drep registration certificates.

    CARDANO-API

    • Add support for committee hot key witnesses
    • Require conway onwards for voting
    • Conway drep registration: expose ledger anchor parameter
    • Add certs to txbody of Conway transactions

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-10-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-10-10T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-10-06-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums.

    The team also delivered the first version of the network resilience layer, significantly increasing head availability.

    Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra.

    Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra.

    What did the team achieve this week

    • Release 0.13.0
    • Published vulnerability reports #1088
    • Merged network resilience work part I #1074
    • Planning for Cardano Summit participation
    • Discussions with funded Catalyst projects wanting to build on Hydra for support
    • Merged typos fix PR from @omahs #1095

    What are the goals of next week

    • Complete Aiken commit validator script #1072
    • Complete Kupo integration #1078
    • Brick upgrade on TUI #1103
    • Clean backlog
    • Prepare and rehearse demo and talk for Cardano Summit
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-06-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-10-06T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-10-06-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system.
    • Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7.
    • Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store.
    • Tracing: The machine-readable tracer configuration has been merged. Optimization of cardano-tracer started.
    • Nomad backend: Ongoing variance analysis and refined cluster topology.

    Low level overview

    Benchmarking

    Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the\nperformance of the in-memory backing store and evaluate possible optimizations (or regressions) for it.

    Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results\nshow all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the cardano-tracer service.

    Consensus QTAs

    The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The\nfeedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype.

    Development

    Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort.

    PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time,\nwe'd like to validate the many improvements that have gone into the Plutus evaluator.

    Tracing

    The focus for further optimization of the new tracing system has shifted to cardano-tracer - the service\nreceiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in cardano-node is\nmore performance critical, the receiving service must still minimize its resource footprint. Moreover, it can\ngenerate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations.

    Nomad backend

    Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated\nthe same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-06-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-10-06T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-10-04-consensus", + "content_html": "

    High level summary

    The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the in-memory backend.

    On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain.\nWe also merged a fix for the Babbage to Conway transition, and released a new version of Consensus.

    Genesis

    • We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (392).

    Support

    • We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (366).
    • We enabled richer tracers in cardano-node that can be useful in future debugging (384).
    • Esgen continues with his release engineer activities, and created a new Consensus release.

    Fostering collaboration

    • We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (369).
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-04-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-10-04T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-10-04-mithril", + "content_html": "

    High level overview

    This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion on implementing Mithril in a light wallet to receive feedback and contributions from the community.

    They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks.

    Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs.

    Low level overview

    • Created the discussion Implement Mithril in a light wallet #1273
    • Completed the issue Run client in browser WASM PoC #1254
    • Completed the issue Benchmark aggregator performances #1220
    • Worked on the issue Add SPO tickers in explorer #1185
    • Completed the issue Add a non 404 status code on the aggregator endpoint #1103
    • Completed the issue Use source attribute in errors #1265
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Completed the issue Configure status page and alerting #1277
    • Completed the issue Upgrade dependencies #1274
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-04-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-10-04T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-10-02-network", + "content_html": "

    High-level overview of sprint 45

    Bootstrap Peers

    We started reviewing the bootstrap peers PR, ouroboros-network#4615.

    Towards Typed Protocols 0.2.0.0

    We discovered a performance regression when using typed-protocols-0.2.0.0, and we\nstarted investigating where it comes from. Currently, we see that\ntyped-protocols-0.2.0.0 can outperform typed-protocols-0.1.0.0 when running\nin isolation with a simple ping-pong protocol, so the regression might be in\nthe new block fetch implementation which comes with typed-protocols-0.2.0.0\nSee typed-protocols#3.

    Tech Debt

    We merged two PRs written by Galois engineers:

    • a pull request which refactors the main entry function for P2P, see ouroboros-network#3834;
    • a pull request which reviews usage of unsafe function in the network code based.

    Galois also made progress with the following two issues:

    IO-Sim

    IOSimPOR

    We found and fixed a bug in IOSimPOR. We'd like to thank Prof. John Hughes\n(Quviq AB) for helping us with debugging the issue.

    We also provided a more uniform API for IOSimPOR, and added ways to make the\ndebugging similar problems in the future easier.

    Technical Details on IOSim refactoring
    We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future.

    IOSim

    To prepare for the next release, we consolidate packages taking advantage of\nthe public sublibraries supported now both by cabal and Hackage. This is\na work in progress, io-sim#114.

    Cardano Newtork Service Assurance

    Galois made the following progress:

    • A test run of spinning up a CNSA instance was done, as a result documentation\nwas updated.
    • Based on the IOG code review of the CNSA code, updates to the CNSA code were\nmade.
    • Galois has started the design for adding a CNSA analysis for \"fetched bytes\nover time while node is syncing\".

    P2P adoption

    In the last two weeks, we've seen increase in P2P adoption.\n\"P2P

    The following graphs show several different versions of relays running on the mainnet. The\ngreen line NodeToNodeVersionV10.True denotes P2P relays.\n\"node

    Open Source

    We upstreamed our FFI bindings to Windows named pipes to Win32 package, the\nPR was accepted and merged.

    We also received an external contribution which enhanced our documentation, see\nouroboros-network#4676.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-10-02-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 45", + "date_modified": "2023-10-02T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-09-29-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    The team is currently formalising mini protocols and testing the\nperformance analysis tool

    Details

    • drafting processs calculus semantics of mini protocol programs

    • testing the new performance modelling tool

    • further work on specification of mini protocols

    • extension of mini protocol framework to support communication of\nprograms with local environments via synchronous channels

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-29-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-09-29T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-09-29-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team mainly focused on having a working new reliability\nnetwork layer; and specified its expected behavior in a new ADR.

    They also revisited the security policy and vulnerability disclosure policy on\nhow to handle security vulnerability within Hydra, and in particular how to\nhandle so-called \"Silent fixes\".

    What did the team achieve this week

    • Updated security policy and vulnerability disclosure policy #1088
    • Adr/network reliability #1082

    What are the goals of next week

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-29-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-09-29T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-09-29-ledger", + "content_html": "

    High level summary

    Few important Conway related features were completed in this two week period:

    • Constitutional Committee was the last missing Conway related entity that has now been\nfully implemented.
    • Treasury withdrawals governance actions have been fixed and now behave as expected.
    • Current treasury amount supplied in the transaction is now enforced by the rules.
    • DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no\nproposals to vote on.
    • Semantics of how CostModels are updated with Protocol Parameters have been changed to\nallow for individual Plutus language version updates, rather than requiring a complete\nreplacement of all CostModels

    Besides the new features there were also important performance and testing improvements:

    • In particular stake distribution computation and native script handling received some\noptimizations.
    • New testing DSL has been implemented that drastically simplifies writing unit tests for\nledger rules.
    • Integration tests and benchmarks are now possible for Conway era because of the overhaul\nof functionality for initial funds and staking injection whenever node starts up in\nConway, while bypassing all previous eras.

    Low level summary

    Conway era

    • pull-3729 - DRep expiry update after a contiguous set of epochs with no proposals to vote on
    • pull-3739 - Rename some PParams to be consistent with Agda specification
    • pull-3743 - Move DRepDistr from VState to ConwayGovState
    • pull-3746 - Implement tcTranslationContextL for Shelley
    • pull-3737 - Implement EraTransition
    • pull-3749 - Add predicate failure: current treasury value mismatch in LEDGER
    • pull-3748 - Apply enacted treasury withdrawals
    • pull-3745 - Constitutional Committee Ratification
    • pull-3763 - Plutus interface improvements
    • pull-3771 - Changed how costmodel updates are applied
    • pull-3766 - Prevent updating protocol version with PParamUpdate

    Performance

    • pull-3765 - Improve native script handling
    • pull-3747 - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin
    • pull-3758 - Cardano-Perf regression: UMap.size regression fix
    • pull-3754 - Use Alonzo-style TxOut encoder when possible

    Releasing

    • pull-3742 - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes
    • pull-3744 - Changelog 8.4
    • pull-3752 - Patch release of cardano ledger conway 1.8.1.0
    • pull-3753 - Minor cleanup and changelog entries
    • pull-3760 - Fixup issues for release
    • pull-3764 - Bump plutus deps to 1.13

    Testing

    • pull-3734 - Removed Shaped instance for Rep
    • pull-3735 - Simplify the implementations of hasOrd and hasEq
    • pull-3728 - STS tests based on constraints
    • pull-3714 - Implement the remaining upgradable families
    • pull-3733 - Add some unit tests for Conway features
    • pull-3762 - Update CDDL for praos headers.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-29-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-09-29T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-09-29-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node 8.4.0-pre.
    • The use of cardano-node docker hub will be deprecated in preference of GHCR

    Lower level summary

    Capkgs

    • Refactor parsing scripts, add github action automation, various bugfixes and cleanup: capkgs-compare

    Cardano-parts

    • Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: cardano-parts-pull-8

    Cardano-playground

    • Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: cardano-playground

    Cardano-world

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-29-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-09-29T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-09-27-mithril", + "content_html": "

    High level overview

    The Mithril team has released a new distribution 2337.0, which includes the following enhancements: support for zstandard compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator.

    They also completed the refactoring and standardization of the errors in the Mithril nodes and published an Architectural decision record on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure.

    Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs.

    Low level overview

    • Completed the issue Release new 2337 distribution #1219
    • Completed the issue Errors refactoring #798
    • Completed the issue Client traffic creates performance bottleneck in aggregator #1207
    • Completed the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Worked on the issue Spike: Run client in browser WASM PoC #1254
    • Worked on the issue Benchmark aggregator performances #1220
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-27-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-09-27T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-09-26-node-cli-api", + "content_html": "

    2023-09-13 - 2023-09-26

    High level summary

    • cardano-node 8.4.0-pre release suitable for SanchoNet.
    • CLI continues making progress integrating governance features. During this sprint we integrated the info and new-committee governance actions.
    • The team continued moving to the ERA top-level commands structure. Removed --conway-era flag from the legacy commands making conway era commands only accessible via cardano-cli conway.
    • stake-pool command is now under the ERA top level structure.
    • API continues integration with governance features, it is worth to higlight that now ProposeNewCommitee uses the right key type (cc-cold)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-26-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-09-26T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-09-22-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team conducted the monthly review meeting in\ncollaboration with Mithril, enhancing project coordination.

    The team improved the gen-hydra-key node command for smoother usability\nand identified concrete steps to enhance network resiliency in feature\nitems #188,\n#1080, and\n#1079.\nAdditionally, they contributed the aiken-mode editor integration to the\naiken-lang organization, updated dependencies to utilize cardano-api\n8.20, and published the Hydra security advisory CVE-2023-42806 with a\nworkaround available for users.

    These efforts demonstrate the team\\'s commitment to project improvement,\nsecurity, and open-source community collaboration.

    What did the team achieve this week

    • Conducted the monthly review meeting together with Mithril
    • Improved gen-hydra-key node command\n#1077
    • Established a clear plan to improve resiliency of network and manifested\nfeature items #188,\n#1080 and\n#1079
    • Moved aiken-mode (created by SN)\nto aiken-lang organization
    • Updated dependencies to using cardano-api 8.20\n#1075
    • Published security advisory\nCVE-2023-42806\n(workaround available)

    What are the goals of next week

    • Write-up the monthly report for September
    • Finish \"network resilience to disconnects\"\n#188
    • Finish kupo integration with hydra\n#1078
    • Discuss and decide on using aiken or not
    • Address the published security advisory\nCVE-2023-42806\n(to not require workaround)
    • Ideally, release 0.13.0
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-22-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-09-22T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-09-22-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters.
    • Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time.
    • Tracing: Work on machine-readable tracing of tracer configuration is ongoing.
    • Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster.
    • Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Blöndal!

    Low level overview

    Benchmarking

    As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking\nbackend with means to measure and document network latency for each run. Furthermore we've implemented means to\ncapture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences\nin the behaviour of the underlying networking stack at OS level.

    Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided\nto compare standard deviations instead to validate the measurements from nomad.

    Infrastructure

    Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline\nhave been merged to master. They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis.

    Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for trace-dispatcher and tx-generator we were able to address those issues.

    Tracing

    After various steps in constructing a configuration upon node startup, it is vital to document\nwhich runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML\ntrace message for that purpose.

    This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node.

    Nomad backend

    As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it\nproduces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an\nimpact on our measurements, as we'd be basically using two different instruments to take them.

    Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service\nor the slightly different system architecture of the new cluster.

    New team member

    Baldur Blöndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team.\nSo I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on cardano-tracer, the component receiving, processing and making available node traces and metrics.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-22-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-09-22T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-09-20-consensus", + "content_html": "

    High level summary

    We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks.\nWe are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough.\nOn the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain.\nWe also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway.

    UTxO-HD

    • We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (349). System level benchmark results are pending.
    • Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (344), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run.
    • We also brought the UTxO-HD branch up to date with node version 8.4.0.

    Genesis

    • We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain.\nWe are now drafting the final self-contained argument. (4157)

    Support

    • We debugged a bad parameter update on the Babbage to Conway transition in the SanchoNet testnet (339).\nA superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (340, 354, and 355)\nHowever we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ConsensusProtocol type class and the HardForkBlock combinator (345 and 346). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-20-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-09-20T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-09-20-mithril", + "content_html": "

    High level overview

    This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports.

    Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution.

    Low level overview

    • Completed the issue Add snapshot compression parameters in infrastructure deployments #1200
    • Completed the issue Add Cloudflare protection of infrastructure #986
    • Worked on the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Worked on the issue Error refactoring #798
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    • Worked on the issue Release new 2337 distribution #1219
    • Completed the issue Upgrade dependencies #1238
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-20-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-09-20T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-09-15-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype.

    Details

    • working on collating and open sourcing performance analysis prototype

    • improvements to Ouroboros Praos specification in Isabelle

    • working on formalising chain sync mini-protocol

    • reviewing an alternatice semantics for DeltaQ

    • Seminar talk at U. Bergen on algebraic properties of timeliness

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-15-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-09-15T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-09-15-hydra", + "content_html": "

    High-level summary

    This week, most of the Hydra team was attending a cardano scaling workshop in\nNantes, France. They used this oportunity to meet fellow mithril team and spend\nsome time together to hack on some code and, as always, reflect on the past work\nand find optimal path forward for both projects. They also fixed a bug that\ncaused hydra-node to crash when querying L1, worked on a new network resillience\nproof-of-concept and accepted a new ADR related to stateless transaction\nobservation.

    What did the team achieve this week

    • Cardano scaling workshop with members of hydra and mithril teams
    • Accepted user contribution for possible new use-case #1048
    • Fix for the hydra-node crash related to internal wallet query #1053
    • Collected experimental CI findings #1070
    • Propose first POC for the network resilience #1074

    What are the goals of next week

    • Monthly review meeting & report including updates from Mithril
    • Review POC and discuss our options for the network resilience
    • Update cardano-api to version 8.20
    • Address TODOs on aiken commit validator #1072
    • Complete hydra-support in kupo kupo#117
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-15-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-09-15T00:00:00.000Z", + "author": { + "name": "Sasha Bogicevic", + "url": "https://github.com/v0d1ch" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-09-15-ledger", + "content_html": "

    High level summary

    The Ledger team's focus is still mainly on the Conway era implementation.

    We were able to add ability to specify initial Constitutional Comittee and the initial\nversion of Constitution. Priority in which Governance Action are now enacted matches the\nspecification. DRep's deposits are now properly accounted for. Governance actions that are\nnot allowed to be voted on by Stake Pool operators and Constitutional Committee members\nare prevented by transaction submission failure, rather than simply being ignored. There\nwas a few important CDDL fixes as well as a lot of new round trip serialization\ntests. Constraint based testing framework has also received a lot of improvements.

    Low level summary

    Conway era

    • pull-3681 - Conway Genesis additions
    • pull-3690 - Preserve the order of ProposalProcedures
    • pull-3705 - Removed ProtVer from EnactState
    • pull-3700 - Add conway-specific certs to deposit/refunds
    • pull-3704 - Add comments on deprecating certs to Conway CDDL
    • pull-3698 - Reordering of governance actions
    • pull-3712 - Disallow empty fields in ConwayTxBodyRaw
    • pull-3716 - Abstract threshold calculation
    • pull-3725 - Fix mistaken use of dollar sign in cddl files
    • pull-3718 - Predicate failure for mismatched Voter GovAction
    • pull-3721 - Committee expiration, validation and modification

    Improvements and releasing

    Testing

    • pull-3730 - Implement Show instance for Rep using IsTypeable
    • pull-3697 - Rewrite testEql using Typeable to make it impossible to forget cases
    • pull-3709 - Add many new features to the Constrained modues in cardano-ledger-test
    • pull-3726 - Conway and other eras serialization roundtrip tests
    • pull-3713 - Improve CI resiliency against GitHub issues
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-15-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-09-15T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-09-15-network", + "content_html": "

    High-level overview of sprint 44

    Bootstrap Peers

    In this sprint, we focused on developing bootstrap peers.

    Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we\nidentified a possible improvement to bootstrap peers. A more detailed\ndescription is available here.

    Cardano-Node-8.4.0 Release

    We also were responsible for the cardano-node-8.4.0-pre release. A final\nintegration PR is currently being merged. We published\nnew versions of ouroboros-consensus, cardano-api and cardano-cli.

    Towards Typed Protocols 0.2.0.0

    We also updated the future typed-protocols-0.2.0.0 and its integration with\ncardano-node. This is towards our goal which we planned for the next\nquarter. The identified tasks are to fix breaking tests, and then measure and\naddress possible performance regressions.

    Tech Debt

    Mark Tullsen (Galois) submitted two more PRs: ouroboros-network-#4663,\nouroboros-network-#4664. We provided feedback on their other pull requests: ouroboros-network-#4661 and\nouroboros-network-#4660.

    P2P adoption

    In the last two weeks, there was a regression in P2P adoption concerning\nthe number of SPOs or stakes, although the number of overall P2P relays has\nincreased. Karl Knutsson (Cardano Foundation) is investigating\nthis issue.\n\"P2P

    The following graphs show several different versions of relays running on the mainnet. The\ngreen line NodeToNodeVersionV10.True denotes P2P relays, which slowly\nincrease over time. The V9 and earlier versions of the node-to-node\nthe protocol indicates nodes version 1.35.x or earlier.\n\"node

    Data has been kindly provided by Cardano Foundation and their mainnet\nmonitoring infrastructure.

    Open Source

    We are in the process of upstreaming our ffi to Windows Named Pipes API to the Win32 package, see [win32-220].

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-15-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 44", + "date_modified": "2023-09-15T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-09-15-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet environment was updated to 8.3.0-pre.
    • Cardano-parts now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is here.

    Lower level summary

    Capkgs

    • Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: capkgs-compare

    Cardano-ops

    Cardano-parts

    • Utilize content addressed binaries to significantly improve eval, build and devShell performance: cardano-parts-pull-8
    • Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: cardano-parts-pull-10
    • Fix warns thrown during some builds and devShell usage: cardano-parts-pull-11
    • Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: cardano-parts-pull-12
    • Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: cardano-parts-pull-13

    Cardano-perf

    • Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: cardano-perf-compare

    Cardano-playground

    Cardano-world

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-15-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-09-15T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-09-14-db-sync", + "content_html": "

    High level summary

    We have created a DBSync tag sancho-1-1-0 which can follow sanchonet. Also\nthe team has ran a number of benchmarks and tests for the new options/flavours of DBSync\nand prepared a blogpost which summorises them, for downstream components.

    Lower level summary

    • Integration of node-8.3.x and support for Sanchonet on Conway\n#1498
    • Simplifications of new feautures\n#1496
    • Makes it impossible to restart DBSync with different schema options and adds\ntests for them\n#1466
    • CI fixes\n#1494#1491
    • Prepared a blogpost about different DBSync options\nblog
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-14-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-09-14T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-09-12-node-cli-api", + "content_html": "

    2023-08-30 - 2023-09-12

    High level summary

    Release of Cardano-node 8.3.0-pre for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs.\nThis release completes phase 2 of SanchoNet feature roll out plan

    CLI continues on its migration to a era-based top-level commands. This sprint we moved text-view, key, query, genesis, node, stake-address, transaction and address into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints.

    We are moving the drep delegation-certificate to the stake-address command so delegating to a drep is done via stake-addres vote-delegation-certificate. Along the same lines, we are renaming\nstake-address delegation-certificate (delagating to a stake pool) to stake-address stake-delegation-certificate to distinguish between stake delegation to a pool and votes delegation to a drep. On top\nof that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly stake-address stake-and-vote-delegation-certificate. Note that change is not included on 8.3 but will come on 8.4.\nRemoving --conway-era flag from all the transaction sub-commands.

    Update description fields in delegation certificates from Stake Address Delegation Certificate to respectively (Conway onwards):

    • Stake Delegation Certificate
    • Vote Delegation Certificate
    • Stake and Vote Delegation Certificate

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-12-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-09-12T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-09-08-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team improved the commit process with support for inline\ndatums. They simplified the chain layer by refactoring how the chain state is\npersisted. Updates to the Hydra tutorial were completed, including CI workflows\nto keep it up-to-date. The team engaged in discussions with researchers about\nincremental commits & decommits, and drafted an architectural decision record\nfor a resource-based API. They also explored simpler solutions for the upcoming\nnetwork resilience feature.

    What did the team achieve this week

    • Support InlineScriptDatum in commit\n#1043
    • Refactored chain state persistency\n#1049
    • Completed tutorial updates (by adding CI and some cleanup)\n#997
    • Intersect Open Source committee meeting
    • Experimented with various models to better express the \\\"Network\nresilience problem\\\" to find a KISS solution for\n#188
    • Drafted and discussed incremental de-/commit features within team\nand with researchers\n#199 and\n#1057
    • Created ADR for a resource based overhaul of the API\n#1028

    What are the goals of next week

    • Meetup of Hydra & Mithril contributors in Nantes, France
    • Integrated cardano-api 8.15 to have GHC 9.6 support
    • A clear design for incremental commits (decommits are already\nunderstood)
    • An ADR for improving tx construction & observation to not need chain\nstate
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-08-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-09-08T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-09-07-mithril", + "content_html": "

    High level overview

    The Mithril team has released a new distribution 2335.0 which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information.

    They have also worked on snapshots enhancements: implementation of the zstandard compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes.

    Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client.

    Low level overview

    • Completed the issue Use 'zstandard' compression for snapshot archives #876
    • Completed the issue Design & implement stress test tool for aggregator - phase 2 #1155
    • Completed the issue Provide progress information with '--json' option in Client #1095
    • Completed the issue Make client download and extract the archive simultaneously #1115
    • Completed the issue Add aggregator Cardano node version in snapshot artifact #948
    • Completed the issue Make Cardano node version part of the Mithril network configuration #947
    • Completed the issue Post deployment 'mainnet' infrastructure #1091
    • Worked on the issue Errors refactoring #798
    • Worked on the issue Add Cloudflare protection of infrastructure #986
    • Completed the issue Failed to restore recent snapshot with strange error #1160
    • Completed the issue Update 'ed25519-dalek' to '2.0.0' #1188
    • Completed the issue Add target networks blocks in release notes #1151
    • Completed the issue Fix end to end 'wait_for_the_expected_time' test #1191
    • Completed the issue Fix docs 'git checkout' command #1174
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-07-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-09-07T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-09-07-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack.
    • Infrastructure: Various improvements of our analysis pipeline have been merged to master, supporting safe log truncation.
    • Tracing: Namespace consistency checks have been merged to master along with a curated configuration for benchmarking.
    • Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.

    Low level overview

    Benchmarking

    We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer.

    With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance.

    The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack.

    Infrastructure

    As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation\noperation that keeps the interdependencies of block events intact.

    Truncation might happen at a slightly different point\nin time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time.

    Tracing

    Consistency checking of namespace implementation and configuration when using the new system has been completed.\nThis feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a cardano-node shows inconsistencies with the namespaces the system provides - and hence needs attention.

    Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many\ndetailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable.

    Nomad backend

    The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the\nfirst real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-07-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-09-07T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-09-06-consensus", + "content_html": "

    High level summary

    We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation.\nOn the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers.\nThe Consensus release engineer finished his rotation: version 8.3.0-pre of cardano-node is releasing 2023 September 5.

    UTxO-HD

    • We ran the first successful system-level benchmarks for UTxO-HD (see #203) using the in-memory backend.
      • We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot.
      • After the mempool regression is fixed the benchmarks need to be ran again.
      • System-level UTxO-HD benchmarks with the LMDB are still pending.
    • UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see #344).
    • We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in GetUTxOByAddress (see this comment). Preliminary results are promising.
    • Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (#344), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.

    Tech debt

    • We added tests that Consensus emits valid CBOR (#3099). This helped us detect a couple of serialization bugs. The tests still need to be merged into the main branch (#323).

    Support

    • Nick Frisby finished his release engineer rotation; cardano-node 8.3.0-pre is releasing 2023 September 5.
    • We helped to investigate a protocol version bug in Sanchonet (see #3491).
    • We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see #91.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-06-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-09-06T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-09-01-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype.

    Details

    • finalising a presenting performance analysis internship work to the\nformal methods team

    • developed a new Isabelle mini-protocol framework and examples

    • planning an extended version of the ICE DeltaQ paper

    • working on algebraic rules for properisation of any-to-finish

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-01-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-09-01T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-09-01-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team focused primarily on changes needed in the network\nlayer and have the first draft document related to needed design. They also\nimproved the user experience by allowing a commit using inline datums.\nDiscussed the off-chain governance with researchers and improved internal model\ntests.

    What did the team achieve this week

    • Monthly report published
    • Small changes to hydraw and tutorial in light of the Masterclass
    • Investigated a bug and saw it was solved by recent developments
    • Improved the model tests by fully validating L1 transactions
    • Enhanced the /commit API to also allow commit from scripts with inline datums (user request)
    • Discussed off-chain governance with IOG and CF researchers
    • Drafted a first network specification document in the context of Network resilience

    What are the goals of next week

    • Have a clear understanding of the changes we need for the \"Improve network resiliency\" feature
    • Groomed and agreed plan on incremental commits/decommits
    • Updated tutorials including CI workflows to check consistency
    • Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-01-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-09-01T00:00:00.000Z", + "author": { + "name": "Sasha Bogicevic", + "url": "https://github.com/v0d1ch" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-09-01-ledger", + "content_html": "

    High level summary

    Broadly speaking the Ledger team focused on a few main areas of Conway era:

    • Creation of voting state snapshots in order to correctly delay ratification for one epoch
    • Validation of the Governance Actions sequencing and ordering
    • Proper expiry of DReps and Proposal Procedures
    • Expanding Conway Genesis functionality
    • Utilization of some of the new Protocol Parameters in ledger validation rules

    Low level summary

    Conway era

    • pull-3659 - Validate Network for ProposalProcedure and TreasuryWithdrawal
    • pull-3637 - Avoid using sequence of tuples, by adding GovActionId to GovActionState
    • pull-3651 - Inactive DReps
    • pull-3664 - Track proposal expiry
    • pull-3668 - Add min committee size predicate to NewCommittee
    • pull-3669 - Add Proposal deposit check against PParam
    • pull-3676 - Fix inactive PoolStake not counting as Drep Stake
    • pull-3635 - Make snapshots of GovActionsState
    • pull-3670 - Validate previously enacted govAction
    • pull-3694 - Improve error reporting on the positive coin decoder
    • pull-3674 - Added RATIFY thresholds
    • pull-3684 - Add proposal delaying, remove predicate failure from ENACT
    • pull-3688 - DRep Refunds and update evalTransactionBalance

    Improvements and releasing

    • pull-3677 - Minor patch that fixes the DRep distribution computation
    • pull-3686 - Post patch release fixup
    • pull-3695 - Changelog for cardano-node-8.3 release
    • pull-3683 - Add two new bench mark programs

    Testing

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-01-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-09-01T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-09-01-network", + "content_html": "

    High-level overview of sprint 43

    In this sprint, we received contributions from CF & Galois. Karl Knutsson\n(CF) has addressed various issues regarding peer churning in P2P, timeouts\nand our WireShark dissector. While the Galois developers focused on\naddressing issues from their review last year. See below for more details.

    We continued working on bootstrap peers ouroboros-network-#4661.

    We refactored our test suites: they are split into io-tests which require to\nbe run natively on all platforms (these tests mostly contain tests that\nrequire IO system calls) and sim-tests which are platform independent. We\nrun io-tests on all supported platforms (e.g. x86_64-linux,\nx86-64-darwin, aarch64-darwin and x86_64-w64-mingw32 (Windows)) natively.\nThe sim-tests are not executed on Windows due to memory limitations on\nGitHub Actions runners. ouroboros-network-#4653

    We also started rebasing typed-protocols refactoring branches.

    Marcin was appointed as the cardano-node release engineer for the 8.4.0-pre\nversion. So far he integrated cardano-ledger-conway-1.8 and\nouroboros-network-0.9.1.0 to ouroboros-consensus, cardano-cli and\ncardano-api. Once we will have an integration branch for cardano-node,\ncardano-ledger-conway-1.8 and ouroboros-consensus packages can be released\nto CHaP and PRs can be merged once they go through review & CI.

    We also fixed some smaller issues regarding peer sharing (both were discovered\nby Karl from CF). More details are included below.

    Progress on P2P addoption

    SPO relays

    There are currently ~2000 relays running P2P\nenabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On\n16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil\nAda.

    \"P2P

    The following graphs show several different versions of relays running on the mainnet. The\ngreen line NodeToNodeVersionV10.True denotes P2P relays, which slowly\nincrease over time. The V9 and earlier versions of the node-to-node\nthe protocol indicates nodes version 1.35.x or earlier.\n\"node

    Data has been kindly provided by CF and their mainnet monitoring\ninfrastructure.

    IOG relays

    As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all\nIOG relays will be running P2P.

    Detailed description

    In this sprint, we got a few contributions from CF:

    • Karl made peer churning mechanism less aggressive ouroboros-network-#4656; and
    • he added timeouts for idle states in ChainSync & KeepAlive\nminiprotocols. These timeouts help a node remove idle connections from the\nresponder (server) side ouroboros-network-#4648.
    • he improved the WireShark dissector by adding support for the peer-sharing mini-protocol ouroboros-network-#4656.

    Galois has been making progress in addressing some of the issues they raised in their review (last year):

    Peer Sharing

    • Light peer sharing is only enabled when peer sharing is turned on ouroboros-network-#4652;
    • Handshake incorrectly reports peer sharing value. It's supposed to relay the\nremote value, but instead, it returns the local value. ouroboros-network-#4642 (in review).

    Async Demotion Test Fix

    • We fixed an async demotion test failure which turned out to be a weakness of\nthe test itself rather than a bug in the connection manager. ouroboros-network-#4655
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-01-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 43", + "date_modified": "2023-09-01T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-09-01-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes
    • Work on a new capkgs repository started -- \"Content Addressed Packages\"
      • This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output
      • These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do
      • Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers

    Lower level summary

    Capkgs

    • Content addressed packages -- new repo: capkgs

    Cardano-ops

    • Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: cardano-ops-compare

    Cardano-parts

    Cardano-perf

    Cardano-world

    Sanchonet-demo

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-09-01-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-09-01T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-08-29-node-cli-api", + "content_html": "

    2023-08-16 - 2023-08-29

    High level summary

    CLI is making progress towards phases 3 and 4 of SanchoNet.

    • Ability to create info, no-confidence and new committee governance actions.

    • Voting as DREP is possible now on the CLI

    • API is now using Ledger's PParams and VotingProcedures

    • Expose following queries from consensus:

      - GetGovState
      - GetDRepState
      - GetDRepStakeDistr
      - GetCommitteeState
      - GetConstitution

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-29-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-08-29T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-08-28-mithril", + "content_html": "

    High level overview

    The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of zstandard compression of the snapshot archive, and streaming its download and decompression in the client.

    Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer.

    Low level overview

    • Completed the issue Create explorer page with registered signers #1097
    • Completed the issue Simplify logs on the Signer/Aggregator #1106
    • Completed the issue Refactor (de)serialization of crypto entities #668
    • Completed the issue Mithril client last snapshot download #1078
    • Completed the issue Use the '/signers/registered' route to verify if a signer is registered #1152
    • Worked on the issue Provide progress information with '--json' option in Client #1095
    • Worked on the issue Use 'zstandard' compression for snapshot archives #876
    • Worked on the issue Make client download and extract the archive simultaneously #1115
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-28-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-08-28T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-08-25-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team conducted the monthly review meeting for Agust,which\ncontinously ensures transparent communication and project evaluation.

    In terms of community engagement, the Hydra team gave a Hydra master-class at\nRareEvo workshop as an educational initiative for the community.\nAdditionally, the team updated the Hydra demo and tutorial to include Mithril\nand latest release changes.

    They also focused on exploring the Hydra network resiliance in order to improve\nhydra-node availability, as it becomes stuck very easily and that leads to a\nbad user experience.

    What did the team achieve this week

    • Hydra master-class at RareEvo workshop!
    • Monthly report & review meeting
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Groomed network resilience and explorer features #188
    • New ADR for “Resourced based API” #1028

    What are the goals of next week

    • Have a poc on network resilience working #188
    • Fix issue #931: “Chain state in head state not updated on replayed observation”
    • Fix issue #1039: \"Close transaction dropped from cardano-node\"
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-25-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-08-25T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-08-24-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: Benchmarking node version 8.2.1 has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD.
    • Infrastructure: Our analysis pipeline has received improvements reducing memory footprint.
    • Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing.
    • Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.

    Low level overview

    Benchmarking

    We've performed and analysed the benchmarks for the 8.2.1 version of cardano-node as part of our release benchmarking cycle.

    Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths.

    Infrastructure

    As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held\nin memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline.

    Tracing

    The next portion of optimizations has been completed and merged to master, getting rid of Haskell's native String representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by cardano-node.

    The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup.

    Nomad backend

    The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster\nand porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-24-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-08-24T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-08-23-consensus", + "content_html": "

    High level summary

    On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests.\nOn the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base.

    UTxO-HD

    • We addressed the issues that came from the benchmarking and testing phase (see #314).
      • We fixed the operational-certificate update exception (#305).

    Tech debt

    • We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see this branch).
    • We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see this branch).
    • We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see #275).
    • We decreased the flakiness for our test suite (#284).
    • We incorporated and merged the pull-request on query versioning (#273).
    • We started working on new performance-based regression tests for mempool operations.

    Support

    • Nick Frisby continues with his engineer responsibilities. Notably getting the Consensus release out for node pre-release 8.3. Nick also began integrating it into downstream branches (cardano{-api,-cli,-node}). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-23-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-08-23T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-08-18-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    The team is currently formalising mini protocols and also further\ndeveloping the performance modelling prototype.

    Details

    • Development of an automated prover for showing conformance of\nprograms to state machines (as part of the mini-protocol framework)

    • Completion of the documentation of the (current state of the)\nmini-protocol framework

    • Discussion about two DeltaQ lectures with two practical sessions as part\nof 4th year masters course on distributed systemsby colleagues at UC\nLouvain in the Autumn

    • Discussion about four DeltaQ lectures by colleagues at U. Bergen as part\nof a 5th year Masters course in the Autumn

    • Adapted original DeltaQ implementation to the new typeclasses and\nwrote property tests for its algebraic laws

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-18-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-08-18T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-08-18-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team released version 0.12.0, a significant update that\nbrings support for cardano-node 8.1.2, along with performance enhancements and\nvarious API improvements. Additionally, the team successfully onboarded a new\ncontributor who is now actively participating in operating a Hydra Head. They\ntook part in a meeting of the Intersect open source committee and prepared the\nHydra master-class for RareEvo, an educational initiative for the community.

    If you happen to be at RareEvo, register for the Hydra master-class using this\nform.\nWe hope to make it possible to follow along on-line as well and will announce\ndetails on the Hydra announcements channel on the IOG discord\nserver.

    What did the team achieve this week

    • Released version 0.12.0 which adds support for cardano-node 8.1.2, performance\nand several API improvements. Release notes
    • Replaced commit via websocket with external draft + submit. #954
    • Onboarded new contributor to the point where he actively participates in operating a Head now.
    • Joined a first meeting of the Intersect open source committee
    • Prepared the Hydra master-class for RareEvo.

    What are the goals of next week

    • Monthly review meeting
    • Run the Hydra master-class at RareEvo!
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Clear out red bin items (technical debt)
    • Groom network resilience and explorer features
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-18-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-08-18T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-08-18-ledger", + "content_html": "

    High level summary

    The ledger team made great progress in advancing Conway era forward. In particular, voting\nfor DRep and Stake Pool Operators is now at the state that can be used by downstream\ncomponents. Addition of new ledger state queries makes it possible to verify changes to\nthe governance state, such as placement of votes, submission of governance proposals,\ninspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the\nability to enact all of the governance actions, except for the hard fork initiation.

    Low level summary

    Conway progress

    • pull-3577 - Move PParams to GovState
    • pull-3609 - Adjust thresholds for sanchonet
    • pull-3604 - README: update CIP-1694 link
    • pull-3616 - Switch TreasuryWithdrawals to use RewardAcnt
    • pull-3599 - Add governance action well-formedness check
    • pull-3607 - Rename governance to gov
    • pull-3601 - Added DRep anchors
    • pull-3615 - Add optional previous GovActionId in some ProposalProcedures
    • pull-3596 - Upgradeable families
    • pull-3625 - Change constitution to use Anchor
    • pull-3592 - Added pulsing incremental computation of the DRep distribution
    • pull-3523 - Treasury donations
    • pull-3633 - Prevent state changes on phase2 failure
    • pull-3634 - Disable serialization of protocolVersion param update
    • pull-3630 - Implemented DRep refreshing
    • pull-3640 - Remove crypto parameterization from AnchorData
    • pull-3636 - Implement DRep ratification with an \"always passing\"; threshold
    • pull-3648 - Governance queries
    • pull-3650 - Change environment for ShelleyPOOLREAP rule
    • pull-3658 - Set DRep ratify threshold to 51%
    • pull-3628 - DELEG, POOL, GOVCERT conformance with Spec v0.8

    Testing

    Improvements and releasing

    • pull-3660 - Fix bounds and versions
    • pull-3661 - Adjust versions, bounds and CHANGELOGs to account for the latest release
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-18-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-08-18T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-08-18-network", + "content_html": "

    High-level overview of sprint 42

    Eclipse Evasion

    We merged and released a new version of the ouroboros-network package (version\n0.9.0.0) which includes big ledger peers feature.\nThis is the primary peer selection mechanism to defend against eclipses. We\nalso prepared a PR to updated ouroboros-cosnensus\nand ekg-forward packages.

    CDDL specs for protocol codecs

    We made the cddl spec for network codec more inline with the implementation\nwhich is highly polymorphic. cddl doesn't have the notion of polymorphism,\nbut has any which can generate any valid cbor term. We matched it with an\nAny type on the Haskell side and made all remaining tests & specs use it.\nThis simplified the specifications and made it easier to understand which parts\nare defined in the spec, and which parts are left unspecified. See\nouroboros-network#4595.

    Ouroboros-Network-Framework API changes

    We also released ouroboros-network-framework and other network components.\nThe ouroboros-network-framework package contains a redesign of API exposed to\nouroboros-consensus. We consolidated, cleaned it and made it easier to\nextend in the future if there will be new arguments that need to be passed to\nmini-protocol initiator and responders which comes from the low-level network\nlayer.

    Nix setup (CI)

    We also made a major review of our nix setup. With help from our DevX team\nwe ended up with a clean flake.nix file which can:

    • compile & test the code on x86_64-linux, x86_64-darwin and aarch64-darwin
    • cross-compile to Windows on x86_64-linux

    And provides a shell which contains all the build tools, including ghc-9.6,\nhls, cddl, and more. See ouroboros-network#4640,\nouroboros-network#4643.

    Other contributions

    Cardano Network Service Assurance

    • The work and writeup in finishing up the CNSA, first stage (first\ncontract).
    • Getting Sam Cowger (Galois Inc) up to speed.
    • The IOG Networking team carried a reivew of CNSA project progress: a limitted\ncode & design review.

    Galois Review

    Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues

    scoping, requirements, and getting started.

    CI

    We added a nightly run for GitHub actions and made the GitHub actions test be\nexecuted with extra concurrency ouroboros-network#4637, ouroboros-network#4649.

    We also added GitHub's dependabot ouroboros-network#4650.

    Bootstrap Peers

    We settled on implementation design of bootstrap peers which is being\nimplemented, ouroboros-network#4615.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-18-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 42", + "date_modified": "2023-08-18T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-08-18-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet and shelley-qa environments were updated to 8.2.1-pre.
    • Work on two new repos utilizing flake parts for cardano cluster generation, automation and operation.

    Lower level summary

    Cardano-ops

    Cardano-parts

    Cardano-perf

    Cardano-playground

    Cardano-world

    Inputs-check

    • A flake parts module to check input closure sizes recursively for optimization considerations: inputs-check
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-18-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-08-18T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-08-17-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Include MuSig2 description in cryptography handbook
    • kes_agent: Finilising test and CI. Working on KES binary

    Low level summary

    Mithril

    • Full Node Verifier merged #939.

    MuSig2

    • Started describing MuSig2 to include it as part of the cryptography handbook

    Sidechains

    • Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in this fork.

    KES agent

    • KES agent is ready:
      • CI ready #19
      • Receipt confirmation message #20
      • KES agent binary ready #21
      • Control client implemented #11
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-17-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-08-17T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-08-17-db-sync", + "content_html": "

    High level summary

    We have integrated many new Conway feutures and allow db-sync to sync sanchonet.\nWe also continued testing and improving the new db-sync options.

    Lower level summary

    • Conway integration\n#1484
    • Support for Sanchonet\n#1476
    • Stake distribution is computed earlier\n#1484
    • Deposit ledger events are now used. This reduces the db queries and makes syncing faster\n#1484
    • Testing new db-sync options\n#1466
    • Added support for ghc-9.6\n#1479
    • Tech debt: improve exceptions\n#1471
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-17-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-08-17T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-08-17-secp-issue", + "content_html": "

    Security Issue Report: SECP256k1 bug

    Date Occurred: July 15, 2022\nSeverity: Potentially Very High if exploited on Mainnet\nAuthors: Iñigo Querejeta Azurmendi

    Date of Report: August 17, 2023

    Summary of Issue

    Criticality Level

    Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet\nContext

    New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains.\nHow was the Issue Detected

    The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there.

    What Action was Taken

    The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod).\nFixes were applied to prevent the use of the primitives.\nA full security audit was carried out on the bindings.\nThe rollout of the primitives was postponed to a new hard fork (Valentine)

    Potential Effect

    The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction.

    Actual Effect

    • Delay to the Vasil hard-fork
    • Temporary removal of SECP256k1 primitives
    • Additional hard-fork to introduce SECP256k1 primitives

    Ongoing Mitigations Needed, if any

    None

    Responsibility for Mitigations

    Core team

    Detailed description of Incident

    New Plutus secp256k1 cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet.

    The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing.

    • This is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an expected structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely.
    • The same happened with the Schnorr verification function. It takes as input a SECP256k1_xonly_pubkey, which is again an opaque structure that holds a parsed and valid public key.

    The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated.

    The fix was addressed in this PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts.

    Recommendations

    • Check all new Plutus bindings for correct use.
    • Audit all new Plutus built-in bindings.
    • Continue to develop specific End-to-End tests for all new Plutus features.
    • Do not assume that any existing library functions are \"safe\". Treat all external calls circumspectly.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-17-secp-issue", + "title": "SECP bindings Security Issue Report", + "summary": "Security Issue Report: SECP256k1 bug", + "date_modified": "2023-08-17T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-08-15-node-cli-api", + "content_html": "

    2023-08-02 - 2023-08-15

    High level summary

    • cardano-node 8.2.1 (pre-release) to SanchoNet
    • Continue moving CLI into era-based top level command structure
    • Wire-up DREP key generation,
    • Fix DREP deregistration certificates
    • Implement Constitutional Committee Key generation on the CLI
    • Introducing era-based protocol parameters on the API
    • Removing depracated functions and types on the API

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    Fix broken links in docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-15-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-08-15T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-08-11-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team updated hydra-node to support cardano-node version\n8.1.2, ensuring compatibility with the latest mainnet release. The team also\nparticipated in discussions about a \"cardanonical\" JSON schema and added it as a\nsubmodule to the project, contributing to improved data modeling and\ninteroperability.

    In terms of community engagement, the team successfully onboarded a new\ncontributor, also participated in a RareEvo Twitter space, and continued\npreparations for the Hydra master-class.

    What did the team achieve this week

    • Updated dependencies to support cardano-node 8.1.2 #1007
    • Engaged in discussions about a cardanonical json schema and\nadd it as submodule to the project\n#1013
    • Onboarded a new contributor to the hydra project (@locallycompact)
    • Joined RareEvo twitter space and continued preparation of hydra master-class

    What are the goals of next week

    • Update & streamline tutorial to work with latest version of hydra-node
    • Remove the internal commit functionality #954
    • Release 0.12.0
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-11-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-08-11T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-08-11-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We've concluded benchmarking node version 8.2.0.
    • Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration.
    • Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.

    Low level overview

    Benchmarking

    As part of our release benchmarking cycle, we've completed and analysed the runs for the 8.2.0 version of cardano-node. In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version.

    Tracing

    A significant amount of optimizations for the new tracing system has finally been merged to master. At the moment,\nwe're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding\ninsight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward.

    Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing.

    Nomad backend

    The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent\nand reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were\nable to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks.

    A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to master.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-11-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-08-11T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-08-10-mithril", + "content_html": "

    High level overview

    The Mithril team completed the Mithril protocol’s mainnet beta launch: the release-mainnet network is now consistently producing new certificates and snapshots! The team has released a new distribution 2331.1 which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the mainnet infrastructure.

    Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network.

    Low level overview

    • Released the new distribution 2331.1
    • Completed the epic Release 'mainnet' Mithril network #918
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Completed the issue Design & implement basic stress test tool for aggregator - phase 1 #991
    • Worked on the epic Post deployment 'mainnet' infrastructure #1091:
      • Completed the issue Create Production Infrastructure Runbook #1085
      • Completed the issue Ingest 'mainnet' metrics/logs in Grafana #1122
    • Worked on optimizations:
      • Completed the issue Add a 'clean' file to extracted database in client #1131
      • Worked on the issue Create explorer page with registered signers #1097
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on bugs:
      • Completed the issue Client fails to unpack some snapshot archive #1137
      • Completed the issue The 'release-preprod' network stopped producing certificates #1114
      • Completed the issue The 'release-mainnet' network does not show up in the explorer #1111
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.2' #1090
    • Worked on troubleshooting:
      • Completed the issue Signer can't sign with 'Invalid signature for party' error #1125
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-10-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-08-10T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-08-09-consensus", + "content_html": "

    High level summary

    This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of fs-sim and fs-api, and released strict-checked-vars.

    UTxO-HD

    • Rebased UTxO-HD on top of node 8.2 (issue)
    • Address new Maybe translations for UTxOs in Conway 1.6. (PR).
    • Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory.
    • Fixed an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully.
    • Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running QueryUTxOByAddress (PR).
    • Measured the speed of QueryUTxOByAddress under different queryBatchSize values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution.
    • Refactored and implemented ledgertable-related classes for the general HardforkBlock.

    Genesis

    • Frisby and Esgen continue to engage with the Researchers on grinding against the Genesis design.

    Fostering collaboration

    • Drafted a document explaining versioning of local state queries #273.

    Support

    • Frisby is the release engineer this cycle.
    • Successfully created work-in-progress ouroboros-consensus and cardano-api commits that integrate the 2023 Aug 7 tip of cardano-ledger. This will require a release of ouroboros-consensus, which hasn't happened yet.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-09-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-08-09T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-08-04-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Finalised the missing fuzz tests
    • kes_agent: engineer on PTO. Work halted

    Low level summary

    Mithril

    • Work on a mithril flaky test #1105
    • Keep working on Full Node Verifier #939.\nShould be merged in the coming week.

    MuSig2

    • Finalised the fuzz tests #43

    Sidechains

    • Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-04-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-08-04T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-08-04-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    The team is formalising mini protocols and also further developing the\nperformance modelling prototype.

    Details

    • Developing new framework for specification and verification of\nmini-protocols which is closer to the Haskell implementation.

    • Developed a new internal representation for the DeltaQ algebra that\nallows for more modularity in backend implementations

    • Discussions regarding the Cardano networking specification

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-04-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-08-04T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-08-04-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team achieved notable progress in various aspects of the\nproject. The team updated the use case section for auctions on the /unstable\nbranch of the website, improving the understanding of Hydras applicability.

    From the development side, the team successfully completed event-sourced\npersistence, a key enhancement in the projects architecture which improves\noff-chain transaction processing performance. They also added a\nsubmit-transaction endpoint to the API.

    In addition to project-related progress, the team actively engaged in community\nreviews for several catalyst proposals related to Hydra and Mithril,\ncontributing to the wider Cardano ecosystem.

    Finally, the full report for the month of July was also published here.

    What did the team achieve this week

    • Published the monthly report for July
    • Updated the use case section for auctions (published on /unstable branch)
    • Completed event sourced persistence #913
    • Added a submit-transaction endpoint to the API #966
    • Community reviews for several catalyst proposals related to Hydra and Mithril
    • Created a network testing tool (hydra-net) #1006

    What are the goals of next week

    • Update hydra-node to work with cardano-node version 8.x
    • Remove the internal commit functionality
    • Release version 0.12.0
    • Update & streamline tutorial to work with latest version of hydra-node
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-04-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-08-04T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-08-04-ledger", + "content_html": "

    High level summary

    The ledger team was working almost exclusively on the Conway era implementation. In\nparticular, the main focus was directed towards solidifying transaction related types and\ntheir binary representation. We also directed some effort into unblocking Plutus team with\nrespect to PlutusV3 integration.

    Low level summary

    Conway progress

    • pull-3552 - Allow Constitutional Committee Hot Key to be ScriptHash
    • pull-3581 - Make Constitutional Committee Cold Key to be ScriptHash
    • pull-3571 - Implement a portion of the TICKF rule.
    • pull-3556 - Add Script to Constitution
    • pull-3576 - Add optional Anchor to ConwayRegDRep certificate
    • pull-3495 - Implement refund logic for Proposal deposits
    • pull-3579 - Change voting procedure in the transaction to a nested Map
    • pull-3585 - Rename CommitteeCert into a GovCert
    • pull-3587 - Remove DelegStakeTxCert from the COMPLETE pragma for TxCert
    • pull-3586 - Add CurrentTreasuryValue to TxBody
    • pull-3588 - Rename key roles
    • pull-3557 - Update NewCommittee action to use RewardAcnt and add more info
    • pull-3595 - Add ConwayUpdateDRep constructor to ConwayTxCertGov type
    • pull-3600 - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway
    • pull-3597 - Update ProposalProcedure return address to be a RewardAcnt

    Testing

    • pull-3374 - New features for generation subject to constraints
    • pull-3519 - Basic Conway features test

    Bugfixes

    Plutus integration

    • issue-3538 - A fairly complete specification was created for the PlutusV3 context
    • pull-3593 - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality

    Improvements and releasing

    • pull-3574 - Improve clarity and performance of collateral Non-ADA validation:
    • pull-3573 - Update top-level CHANGELOG.md with cardano-node relevant changes
    • pull-3555 - Bump pygments from 2.12.0 to 2.15.0 in /doc
    • pull-3575 - Bump certifi from 2022.12.7 to 2023.7.22 in /doc
    • pull-3567 - Backport mint field translation bugfix
    • pull-3568 - Fixed typo in byron ledger spec
    • pull-3572 - Release/backport tickf bugfix
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-04-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-08-04T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-08-04-network", + "content_html": "

    High-level overview of sprint 41

    24th July - 6th August 2023

    We started the implementation of bootstrap peers. Bootstrap peers are designed\nto provide a safety guarantee for nodes joining the network while still taking\nadvantage of the distributed network for nodes that are synced. This will be\nan intermediate step before Genesis which will allow for further distribute the\nsystem. The bootstrap peers will be run by some trusted partners like CF,\nEmurgo or IOG. They are primarily designed for leaf nodes (e.g. full node\nwallets), which often end up syncing and require access to the honest chain. See\nouroboros-network#4615 for a more detailed implementation plan.

    Other contributions

    We started to use nothunks library to discover if we have any unevaluated\nthunks which can lead to memory leaks ouroboros-network#4633. We found\na small one in the peer metric component of the P2P networking stack. Fixing\nit put us on a small detour of fixing the API of the strict-checked-vars\npackage: cardano-base#431, cardano-base#432, as well as adding NFData\ninstance to io-classes. We also improved nothunks\nlibrary to make debugging easier and we provided a NoThunks instance for\nThreadId which we will need in the future (see nothunks#33).

    We released a new version of io-classes (version 1.2.0.0) and related\npackages to Hackage.

    We addressed all review comments on the eclipse evasion PR which introduces big\nledger peers, ouroboros-network#3886.

    We fixed how SIGHUP signal handlers are registered, so it's not possible to\nshutdown a node which was starting while trying to update network topology,\nsee cardano-node#5421.

    I didn't mention that in the previous update, so here it goes: in the previous\nsprint we released ouroboros-network-0.8.2.0 and\nouroboros-network-framework-0.7.0.0.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-04-network", + "title": "Network Team Update", + "summary": "High-level overview of sprint 41", + "date_modified": "2023-08-04T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-08-04-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version 8.2.0.
    • Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing.
    • Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6.
    • Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.

    Low level overview

    Benchmarking

    The 8.2.0 version of cardano-node required adjustment of some of the sanity checks that are part of our benchmarking\ncluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version.

    Tracing

    The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint\nwhen using it as default for a running node.

    A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any\ninconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node.\nThis feature adds another layer of robustness to the whole system.

    Infrastructure

    A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler\nversions. We've future-proofed our benchmarking code.

    Nomad backend

    The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend\naccordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant.

    The validation phase is ongoing. We were able to perform successful runs and analyses for various 8.x node versions, including 8.2.0-pre. With parallel runs on the current cluster, we hope to measure the same effects we've observed with the\nnomad backend - which will be a big step towards production use.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-04-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-08-04T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-08-04-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Preprod and preview envionments were updated to 8.1.2.
    • Sanchonet and shelley-qa environments were updated to 8.2.0-pre.
    • Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.

    Lower level summary

    Cardano-ops

    Cardano-perf

    Cardano-world

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-04-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-08-04T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-08-01-node-cli-api", + "content_html": "

    2023-07-19 - 2023-08-01

    High level summary

    • Release of Node 8.2.0
      • Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694.
      • This release is phase 1 of the SanchoNet roll out
      • Allows SPOs to vote on changes to the on-chain constitution.
      • Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag.
      • Updates to the networking packages prepare the road for peer sharing.
    • cardano-cli and cardano-api continue to integrate Conway era features
    • Continue refactoring of cardano-testnet

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-08-01-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-08-01T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-07-31-network", + "content_html": "

    Network Update (Sprints 39 & 40)

    The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away.\nIt was great to see and talk to so many of the community members.

    Sprint 39 (Jun 26 - Jul 09)

    Major changes

    Now the following list of traces will be turned on by default:

    node-to-client protocol
    • LocalConnectionManagerTracer
    • LocalInboundGovernor
    • LocalHandshake
    • LocalServer
    node-to-node protocol
    • Server

    See cardano-node#5353. This will be released in node-8.2.0.

    We made sure that cardano-client-0.1.0.x library (which is db-sync) is not using the experimental node-to-client protocol.\nThe cardano-client-0.2.0.0 was not affected.\nSee ouroboros-network#4612.

    We merged the dynamic block production feature to ouroboros-consensus (also available in the cardano-node-8.2.0 release).\nDynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes.\nSee ouroboros-network#3159, [ouroboros-consensu#140].

    We continued to review the implementation of big ledger peers for eclipse evasion, see ouroboros-network#4462.

    Minor changes

    Sprint 40 (Jul 09 - Jul 23)

    Major changes

    We integrated ouroboros-network-0.8.2.0 with the master branch of cardano-node for the 8.2.0 release (the version match between ouroboros-network and cardano-node is purely accidental).\nThis includes:

    • integration with dynamic block production feature.\nThis feature is documented in the following PR.
    • Warm valency for local root peers (see below).

    For the full list of features included in the 8.2.0 release from the network side, please take a look at the pre-release nodes.

    We improved the memory footprint of peer metrics measured by the P2P stack.\nPeer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation).\nSee ouroboros-network#4620.\nThe improvement will be available in cardano-node-8.2.0.

    We added an optional explicit warm valency to local root peers of the P2P topology file.\nPreviously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to.\nThe hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones.\nWarm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses.\nSee ouroboros-network#4575, cardano-node#5409.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-31-network", + "title": "Network Team Update", + "summary": "Network Update (Sprints 39 & 40)", + "date_modified": "2023-07-31T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-07-28-hydra", + "content_html": "

    High-level summary

    During this week, the Hydra team achieved significant progress in various areas.\nThey conducted the monthly review meeting for July, which continously ensures\ntransparent communication and project evaluation. The team migrated the core\nlogic of the node to an event-sourced architecture and incremental writes of\nevents to persistence, enhancing the projects performance and maintainability.\nFurthermore, the team added the ability to read protocol parameters via the API\nand fixed the CI workflows to support pull requests from forks of external\ncontributors, streamlining the development process for community involvement.

    What did the team achieve this week

    • Held the monthly review meeting for July (recording)
    • Migrate the core logic of the node to an event-sourced architecture #999
    • Updated persistence to faster incremental writes of events #1000
    • Added ability to read protocol parameters via API #735
    • Fix CI workflows to support pull requests from forks of external contributors #993
    • Updated to GHC 9.2.8 #1005
    • Prepared an updated use cases section on https://hydra.family (published with next release)

    What are the goals of next week

    • Publish monthly report
    • Complete user transaction submission work #966
    • Remove commit from internal wallet (deprecated) #954
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-28-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-07-28T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-07-27-mithril", + "content_html": "

    High level overview

    The Mithril team launched Mithril protocol’s mainnet beta: the release-mainnet network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch.

    They have released a new distribution 2329.0, which is running on the release-mainnet network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator.

    Finally, they have worked on enhancing the documentation for onboarding SPOs and setting up a Mithril signer, and fixing installation bugs of the binary artifacts produced in the CI.

    Low level overview

    • Created the dev blog post Mithril Protocol’s Mainnet Beta Launch
    • Released the new distribution 2329.0
    • Closed the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Deploy 'mainnet' infrastructure #988
      • Completed the issue Handle Secrets management #989
    • Worked on the epic Release 'mainnet' Mithril network #918
      • Completed the issue Prepare SPO on-boarding guide #1049
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Enhance the configuration of Mithril relay #1080
      • Completed the issue Remove legacy store adapters from aggregator #1053
      • Completed the issue Add a 'sign' sub-command to 'genesis' command in aggregator #1081
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on documentation:
      • Completed the issue Enhance 'Run a Mithril Signer node (SPO)' guide #1055
    • Worked on bugs:
      • Completed the issue Shared library error in CI binaries #1073
      • Completed the issue Debian package does not install cleanly on older ubuntu versions #834
      • Completed the issue Aggregator panics with new (de)serialization of 'ProtocolVerificationKey' #1083
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-27-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-07-27T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-07-26-consensus", + "content_html": "

    High level summary

    The db-sync team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now.\nWe also focused on completing tracing support for UTxO-HD in cardano-node.\nCurrently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further.

    The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ChainSync client as part of the onboarding efforts for the team that will implement Genesis.

    The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team.

    Genesis liaising

    Improvements to the ChainSync client:

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-26-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-07-26T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-07-21-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team updated the specification to align with recent\noff-chain protocol changes, completed refactoring the snapshot emission\nin preparation for event-sourced protocol logic, and updated to GHC\n9.2.7, resulting in improved compile times and slightly smaller Plutus\nscripts.

    What did the team achieve this week

    • Updated the specification to match the recent off-chain protocol\nchanges to complete\n#728
    • Refactored the snapshot emission logic in preparation for event\nsourced protocol logic.
    • Updated to GHC 9.2.7, which led to improved compile times and\nslightly smaller plutus scripts.

    What are the goals of next week

    • Monthly review meeting next wednesday and July report
    • Reflect latest information onto our roadmap.
    • Actual implemention of event-sourced persistence\n#913.
    • Update the use cases section on https://hydra.family
    • Remove deprecated internal commit\n#954.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-21-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-07-21T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-07-21-ledger", + "content_html": "

    High level summary

    Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet.\nAll members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era.\nWe also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release).\nAdditionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available.\nWe also made progress on the constraint-based generators, which can now generate valid transactions and ledger states.

    What we achieved

    • [pull-3521] [pull-3554] Improved Governance model (GovernanceProcedures, ProposalProcedure)
    • [pull-3520] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert )
    • [pull-3531] Refactored and simplified code interacting with Plutus
    • [pull-3558] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix.
    • [pull-3550] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed.
    • [pull-3551] [pull-3546] [pull-3472] Updated tools and added some small improvements
    • [issue-3146] [pull-3498] Introduced Conway protocol parameters
    • [issue-2948] [pull-3499] Implemented ConwayGenesis with the new protocol parameters

    What is currently in progress

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-21-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-07-21T00:00:00.000Z", + "author": { + "name": "Alexey Kuleshevich", + "url": "https://github.com/lehins" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-07-21-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent improvements include:

    • Re-spin sanchonet for testing a new node version followed by fork to Conway
    • Deploying a sanchonet compatible faucet to sanchonet
    • Migrate shelley qa legacy environment to cardano-world

    Lower level summary

    Cardano-node

    Cardano-ops

    • Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: cardano-ops-compare

    Cardano-world

    Iohk-nix

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-21-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-07-21T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-07-20-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    The team is working on formalising mini protocols, the performance\nmodelling prototype and also finishing off their ICE papers.

    Details

    • Formalization of the chain synchronization mini-protocol in the\nthorn calculus

    • Final pre-publication steps for ICE 2023 papers

    • Developing approach for specification and verification of\nmini-protocols

    • Started work on porting the DeltaQ framework to a new, more concrete\nbackend based on piecewise-polynomials

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-20-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-07-20T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-07-18-node-cli-api", + "content_html": "

    2023-07-05 - 2023-07-18

    High level summary

    • Integrate Conway certificates in cardano-api
    • Prepare cardano-cli and cardano-api for cardano-node 8.1.2
    • Tagged cardano-cli 8.3.0.0
      • Query for the hash of the constitution (Conway)
      • Ability to create votes and governance actions
    • Tagged cardano-cli 8.3.1.0
      • Make it build with ghc-9.6
    • Upgrade to optparse-applicative-fork-0.18.1.0 for parsing command line options

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-18-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-07-18T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-07-14-hydra", + "content_html": "

    High-level summary

    This week the team focused on exploring the event sourced persistence in order\nto improve hydra-node performance. Because of this work the team noticed we\nneed to refactor the emit snapshot emission logic and update the spec in the\nlight of new changes. They also took the time to revisit their goals and product\nplans for the next quarter as well as doing some security fixes related to\nmultisignatures.

    What did the team achieve this week

    • Finished spike about performance improvements of event sourced persistence #963.
    • Refactor snapshot emission in protocol logic.
    • Revisited our roadmap and goals.
    • Prepared and conducated a learning session on lean-waste.
    • Improve security of multi-signature checks, see this Github security advisory.
    • Implemented a cache friendly way to version our binaries #962.

    What are the goals of next week

    • Implement Event sourced persistence #913.
    • Remove deprecated internal commit #954 and close #728.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-14-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-07-14T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-07-13-mithril", + "content_html": "

    High level overview

    The Mithril team created a new 2327.0 distribution. They focused on preparing the beta launch on the mainnet: they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the mainnet infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library.

    Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs.

    Low level overview

    • Released the new distribution 2327.0
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Add infrastructure monitoring #987
      • Worked on the issue Deploy 'mainnet' infrastructure #988
      • Worked on the issue Handle Secrets management #989
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Remove certificate hash from Artifact #932
      • Completed the issue Check vulnerabilities in CI #1037
      • Completed the issue Add 'created_at' in Mithril Stake Distribution messages #1030
      • Completed the issue Add a 'run-only' option in end to end test #1048
    • Worked on refactoring:
      • Completed the issue Factorize protocol crypto operations #669
      • Completed the issue Refactor aggregator dependency injection and services #1058
      • Completed the issue Build static binaries in CI #874
    • Worked on documentation:
      • Completed the issue Prepare SPO on-boarding guide #1049
      • Completed the issue Add instructions to set firewall using iptables #1040
      • Completed the issue Update ufw command to set firewall on Mithril Signer installation instructions #1041
    • Worked on bugs:
      • Completed the issue Aggregator does not detect certificate chain epoch gap #952
      • Completed the issue 'testing-preview' network does not create certificates #1015
      • Completed the issue SQLite compatibility in aggregator #837
      • Completed the issue Q&A followup fixes #1035
      • Completed the issue E2E tests are flaky in CI #1023
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-13-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-07-13T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-07-12-consensus", + "content_html": "

    High level summary

    This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a proposed fix. The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine.

    The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility.

    On the support front, the team drafted an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-12-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-07-12T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-07-12-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed.
    • Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends.
    • Tracing: Optimization of the new tracing system is ongoing and yielding good performance results.
    • Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.

    Low level overview

    Benchmarking

    Our analysis of the GHC9 build of cardano-node has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation.

    In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into cardano-node. This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle.

    Infrastructure

    We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in master.

    Tracing

    Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance.

    Nomad backend

    For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run.

    Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to master.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-12-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-07-12T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-07-07-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: First version of snark-based ATMS
    • mithril: Full node verifier
    • kes_agent: Keep progress, and prepare CIP and CPS
    • CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP

    Low level summary

    kes_agent

    Mithril

    • Final review of the implementation of Full Node Verifier #939.\nIncluded benchmarks and further tests.

    Sidechains

    • Schnorr signature implemented
    • ATMS signature implemented
    • First benchmarks show that for the committe size we expect, we need 2^21 constraints.

    CIPs and community

    • Addressed some review comments in #PR506
    • Worked with the communityt on #PR524 to include Keccak as part of the next Plutus release.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-07-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-07-07T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-07-07-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the teams have been working on finalising their ICE papers\nfor publication in EPTCS, formalising concensus, and investigating chain\nsync.

    Details

    • Preparing final versions of ICE papers

    • Reviewing the chain sync design and documentation

    • Refactoring the thorn calculus

    • First draft of Praos specification

    • Developing bounding factors on timeouts

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-07-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-07-07T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-07-07-hydra", + "content_html": "

    High-level summary

    This week the Hydra team accomplished some nice progress. They secured the\nnetwork layer further by implementing authentication of the messages between the\npeers in the Head protocol. In the process they also managed to separate\nHeartBeat messages from the protocol ones which somewhat improved the quality of\ncode in Hydra. The team also finished work related to sending only transaction\nids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark\npublishing on the website.

    What did the team achieve this week

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Add new endpoint for submitting client transactions
    • Remove commit from internal wallet
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-07-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-07-07T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-07-07-sre", + "content_html": "

    High level summary

    The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance.

    Some notable recent improvements include:

    • Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment
    • Explorer component updates
    • Spongix caching server rewrite for R2 Cloudflare support and various performance improvements

    Lower level summary

    Cardano-node

    Cardano-ogmios

    Cardano-ops

    • Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: cardano-ops-compare

    Cardano-rosetta

    Cardano-world

    Spongix

    • Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: spongix-simple-branch
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-07-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-07-07T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-07-06-developer-experience", + "content_html": "

    High level summary

    The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements.

    Lower level summary

    build support & maintainance

    The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions.

    compiler upgrades

    Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests.

    Hydra Tools

    Our repository, input-output-hk/actions, has seen quite some improvements to facility the hydra <-> github integration.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of preliminary GHC 9.8 support.

    devx

    The devx repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our actions/devx GitHub Actions, we have a consistent set of tooling for

    • nix develop shells
    • GitHub CodeSpaces integration
    • VSCode DevContainer support
    • GitHub Actions integration

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-06-developer-experience", + "title": "Developer Experience Update", + "summary": "High level summary", + "date_modified": "2023-07-06T00:00:00.000Z", + "author": { + "name": "Moritz Angermann", + "url": "https://github.com/angerman" + }, + "tags": [ + "devx" + ] + }, + { + "id": "2023-07-04-db-sync", + "content_html": "

    High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested
    • Many devx issues resolved

    Lower level summary

    • We have improved and validated the design for the Conway integration in db-sync
    • Improved the initial integration of the UTxO-HD feauture branches which are under test
    • Prepared a new release 13.1.1.3 which supports node 8.1.1\n#1455.
    • This also fixes a bug\n#1451
    • Added new tests to the new tx_out options\n#1429
    • Fixed a chronic issue in db-sync related to exception handling and concurrency\nThis fixes many other issues and simplifies the logic in db-sync\n#1447
    • A number of fixes and improvements in ci, docker, devx, docs\n#1436#1442#1448#1452
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-04-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-07-04T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-07-04-node-cli-api", + "content_html": "

    2023-06-21 - 2023-07-04

    High level summary

    • Started integration of conway era into the cardano-api,
    • Pre-release of cardano-cli 8.2.1 which enables creating goveranance \"Update constitution\" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.
    • Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities.
    • Continue refactoring cardano-testnet
    • CI and docs house keeping on the new cardnao-cli and cardano-api repositories

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-07-04-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-07-04T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-06-30-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team wrote and published the monthly report for June,\nimplemented the end-to-end functionality for external commits, and tested it on\nthe preview environment. They also listed Hydra as a tool on the Cardano\ndeveloper portal, providing more visibility for the project. The team clarified\nthe path forward for L2 protocol improvements and explored an alternative CI\napproach using cabal instead of nix. Additionally, they released version 0.11.0,\nmarking another milestone in the projects development.

    What did the team achieve this week

    • Written and published the monthly report for June
    • Implemented external commits end-to-end incl. tested it on preview #215
    • Listed Hydra as a tool on cardano developer portal
    • Cleared up path forward on L2 protocol improvements #728
    • Established an alternative CI using more cabal tools #923
    • Release version 0.11.0

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Complete ReqSn only sends transaction ids #728
    • Groom and plan last items for 0.12.0 (remove internal commit)
    • Improve reliability of benchmarks
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-30-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-06-30T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-06-29-mithril", + "content_html": "

    High level overview

    The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano mainnet infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator.

    Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1.

    Low level overview

    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Add infrastructure monitoring #987
    • Completed the epic Prepare Mithril Signer deployment model for SPO #862:
      • Completed the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
      • Completed the issue Adapt infrastructure to use Mithril Relay #1018
      • Completed the issue Announce the new signer deployment model in a dev blog post #1017
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on bugs:
      • Completed the issue Aggregator does not exit on critical error #993
      • Completed the issue Computation of master certificate of an epoch is incorrect #1006
      • Completed the issue End to end tests are flaky #954
      • Worked on the issue 'testing-preview' network does not create certificates #1015
    • Worked on optimizations:
      • Completed the issue Dates format is not standardized #946
      • Completed the issue Add 'recompute-certificates-hash' command to aggregator #1001
      • Completed the issue Add a retry mechanism for artifact creation in aggregator #984
      • Completed the issue Log node version at startup in Aggregator/Signer #944
      • Completed the issue Reactivate Publish Results job in CI #978
      • Completed the issue Clean 'pending_snapshot' directory of aggregator #983
      • Completed the issue Update OpenAPI spec examples #1000
    • Worked on refactoring:
      • Completed the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Refactoring client #982
      • Completed the issue Refactor download code in client #1010
      • Worked on the issue Factorize protocol crypto operations #669
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.1' #973
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-29-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-06-29T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-06-28-consensus", + "content_html": "

    High level summary

    During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team.

    The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components.

    Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node.

    Genesis

    • We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.

    • We decided on an approach of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team.

    UTxO-HD

    • We merged the last of the PRs that were part of UTxO-HD improvements for version 0.1: expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size.
    • We added a new \"legacy\" cardano block in a new ouroboros-consensus-cardano-legacy-block package that should ease the transition for some downstream packages to UTxO-HD, like db-sync. This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block.
    • We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-28-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-06-28T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-06-28-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9.
    • Infrastructure: The first batch of refactoring and documentation for our tx-generator has been merged to master.
    • Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown.
    • Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.

    Low level overview

    Benchmarking

    The compiler switch to GHC9 as the default build platform for cardano-node and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard.

    Using the forge-stress approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node.

    Infrastructure

    The tx-generator is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to master. Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base.

    Tracing

    The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue.

    Nomad backend

    With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress.

    Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-28-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-06-28T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-06-23-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the teams presented two papers at ICE 2023.

    Details

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-23-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-06-23T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-06-23-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team shared progress updates during the monthly review\nmeeting (monthly report and video recording available soon) and started\nexperimenting on preview network with the new commit from external wallet\nfeature.

    What did the team achieve this week

    • Monthly report & review meeting, demonstrating commit from external\nwallet
    • Published regular benchmarks for\nHydra
    • Moved forward the journey for external commits using multiple script UTxOs\n#903
    • Changed the API to only put transaction id in snapshots, instead of the full\ntransactions #922 -> this\nis now evolved into fully addressing #728
    • Fuel marking is now optional as one can now commit from an external wallet\n#924
    • Add flag option to display node version on tui\n#934

    What are the goals of next week

    • Complete external commits using multiple script UTxOs #903
    • New release 0.11.0
    • Dirtroad solution of improved persistence performance #913
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-23-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-06-23T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-06-23-network", + "content_html": "

    Network Update

    Key contributions

    We held a series of session to review the implementation of big ledger peers\n(eclipse evasion). See #4462.

    We get a request from a 3rd party to clarify an inconsistency between CDDL spec\nand protocol implementation. We worked out a nice solution which takes\nadvantage of the any notion available in CDDL. On the Haskell side we\nprovide Any type which gen generate almost any CBOR term (some are excluded\nonly because they are not decoded back to the same form, and we relay on that\nproperty). See #4580.

    We fixed a bunch of problems of the cardano-cli ping command. It also now has\na limited support of node-to-client mini-protocol (the -c option is\nignored, as it cannot be supported by node-to-client protocol). Note that\nthe format of messages has changed, timestamps are printed in ISO8601 format.\nSee #4601, #5326, #5313, #30

    In order to provide a new flag in the topology file which enables ledger peers\nwhen the chain is close to the tip, we continued to work on #4530. This is\ncurrently in review, the consensus team will need to provide us with the new\napi. This feature is useful for two reasons: makes it easier to maintain\na topology file, it will also limit the traffic on public roots generated by\nfor example full node wallets and distribute it to ledger peers.

    We also continued to work on a blog post which describes the journey of design\n& implementation of the dynamic P2P network layer. Too be announced soon :).

    Other smaller changes

    We limit the concurrency of resolving dns names. Up to 8 root peers or ledger\npeers DNS names are resolved concurrently, and at most 2 local root peer DNS\nnames. See #4596.

    We fixed handshake query timeout in #4603.

    We renamed one of the block-fetch decision constructors as requested by the\nconsensus team, see #4608.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-23-network", + "title": "Network Team Update", + "summary": "Network Update", + "date_modified": "2023-06-23T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-06-23-sre", + "content_html": "

    High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:

    • A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality
    • Cardano Sanchonet environment was stood up to test Conway era functionality
    • Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case
    • Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments

    Lower level summary

    Cardano-node

    • Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: cardano-node-pull-5318

    Cardano-ops

    Cardano-world

    Ci-ops

    Ci-world

    • Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ci-world-compare

    Devx-ci

    • A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: devx-ci-repo

    Iohk-nix

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-23-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-06-23T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-06-16-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team focused their efforts on continuing to investigate and\nexperiment operating a head on mainnet. They collected several bugs and issues\nand worked on fixing them. Now the team is soon to release a new version,\n0.11.0, which comes with a lot of improvements and bug fixes.

    What did the team achieve this week

    • Restored and fixed a bug which stalled our head on mainnet #927
    • Solved one user issue #914
    • Reduced significantly local state size and logs by removing the full scripts from it #928
    • (pending review) Reduced snapshot size in the API, by only including tx ids #922

    What are the goals of next week

    • New release 0.11.0
    • Monthly report & review meeting.
    • Fix some minor bugs discovered when operating our head on mainnet
    • Complete journey for external commits using multiple script UTxOs #903
    • Publish benchmarks and provide regular benchmarks for Hydra #186
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-16-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-06-16T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-06-15-mithril", + "content_html": "

    High level overview

    The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client’s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet.

    Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI.

    Low level overview

    • Completed on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Create the sub-command for 'Mithril Stake Distribution' in client #896
      • Completed the issue Adapt end to end tests to handle new types of data #899
      • Completed the issue Update client documentation #897
      • Completed the issue Update architecture documentations for new types of data #898
      • Completed the issue Refactoring client #960
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Enhance terraform infrastructure #930
    • Completed the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Check performance impact of new stake distribution command on the 'mainnet' #962
    • Worked on the epic Prepare Mithril Signer deployment model for SPO #862:
      • Worked on the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
    • Worked on bugs and optimizations:
      • Completed the issue Aggregator does not always detect new immutable file #953
      • Completed the issue CI tests fail with Rust '1.70.0' #958
      • Worked on the issue End to end tests are flaky #954
      • Worked on the issue Certificate dates in metadata are not on the same timezone #946
      • Worked on the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Fix 'Mithril Client multi-platform test' with new client interface #956
      • Completed the issue Enhance 'ImmutableDigesterError::NotEnoughImmutable' error #969
      • Completed the issue Client 'snapshot download' command fails with option '--download-dir' #979
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-15-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-06-15T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-06-14-consensus", + "content_html": "

    High level summary

    The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the Byron and TPraos eras do not need to be checkpointed for an MVP.\nThere is one remaining question (which applies also to the Praos era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated \"Limit on Patience\" timeout sufficiently bounds how long the adversary can inflate a victim's overall sync time.

    On the UTxO-HD front, the prototype branch was rebased on top of the latest ouroboros-consensus main branch and integrated on top of cardano-node 8.1.1-pre. As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD.\nWe managed to run a node again with UTxO-HD enabled.\nWe also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for cardano-node, which uncovered a performance regression on the Network component when using GHC-9.2/9.4. This is being addressed.

    Regarding our support activities, we Released fs-sim-0.2.0.0 and are in the process of preparing the 8.2 release of cardano-node. We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-14-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-06-14T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-06-14-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We've continued release benchmarking and established a new baseline for 8.0.0.
    • New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined.
    • Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.

    Low level overview

    Benchmarking

    In our release benchmarking cycle, we established a new performance baseline for 8.0.0. Additionally, we've measured\nperformance under various workloads for 8.1.1-pre; the results look promising and validate the optimization efforts\ndone on several system components.

    In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for\nbenchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper.

    Tracing

    The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be\nmeaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific\ntrace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles.

    Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD.

    Nomad backend

    As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs.

    This means the backend is entering validation phase, where we systematically compare all metrics taken from the new\ninfrastructure to the existing ones, including determining reproducibility and variance.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-14-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-06-14T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-06-12-network", + "content_html": "

    Network Update

    Key contributions and advances

    We merged light peer sharing feature, which allows to include inbound peers\ninto outbound governor known peers. This is the primary way for new\nunregistered nodes to enter the network, which then can be shared using peer\nsharing. Note that peer sharing is an experimental feature which is disabled\nuntil genesis & eclipse evasion as fully implemented. See #3596.

    We are making progress reviewing eclipse evasion, #3886.

    We fixed another bug in local root peers. We found out that if the local roots\nwhere ignored until the first domain name was resolved, see #4583. The bug\nfix was backported and released in ouroboros-network-0.8.1.1.

    We re-started working on dynamically enabling block forging to address issue\n#3159, which will enable us to release P2P on block producing nodes. See #140.

    New cardano-ping / cardano-cli ping release

    We prepared a new release of cardano-ping library which supports the new\nquery feature (query supported versions). See #4589, #4593 and #5313.\nThe new version of cardano-cli ping will use ISO8601 formatted\ntimestamps; also the formatting of ping results is slightly improved, and it\nwill introduce the new --query-versions (-Q) switch. If the remote site\nsupports the query parameter, the command will print:

    redacted-ip:port network rtt: 0.064
    redacted-ip:port handshake rtt: 0.064010896s
    redacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat
    orAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]

    otherwise it will print the negotiation results

    redacted-ip:port network rtt: 0.045
    redacted-ip:port handshake rtt: 0.101867615s
    redacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder

    Note that in that case cardano-cli ping offers InitiatorAndResponder, which\nallows us to detect whether the remote side is an InitiatorOnly or\nInitiatorAndResponder. Also cardano-cli ping will no longer announce\nitself as InitiatorAndResponder, except for the case mentioned above.

    Other smaller contributions

    On a request from the Marlow Team, we published haddocks of typed-protocols,\nwhich are now available here (#40, #41).

    We made a new release of strict-stm-1.1.0.1 on Hackage, which fixed a bug in\npackage description file, #101 .

    We also helped to debug a deadlock when using named pipes on Windows in the new\nRawBearer API. The API is being used to store secret keys only in memory.\nThe PR #4395 is under review.

    We also have two more PRs which are under review:

    • #4530: enabling ledger peers on a fixed number of slots before the tip of the chain;
    • #4580: a PR which fixes inconsistencies in one of our cddl specs.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-12-network", + "title": "Network Team Update", + "summary": "Network Update", + "date_modified": "2023-06-12T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-06-09-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: E2E tests for BLS bindings and KES agent
    • Sidechains: Implement ECC chip and Rescue hash primitives for ATMS
    • mithril: Full node verifier

    Low level summary

    cardano-base

    • RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); blocked due to issue with windows' localSnocket. Trying to resolve.
    • Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors #317.
    • Above, blocked by the simplification of typeclasses #404.
    • Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings

    Mithril

    • Implementation of Full Node Verifier #939

    Sidechains

    • ECC chip implemented for JubJub over BLS12-381
    • Rescue chip implemented for hashing.
    • Currently working on Schnorr signature (which uses the above constraints)
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-09-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-06-09T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-06-09-developer-experience", + "content_html": "

    High level summary

    The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements.

    Lower level summary

    build support & maintainance

    Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure LoadDLL errors to blst integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like cardano-base experiencing significant reductions in CI complexity.

    compiler upgrades

    After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility.

    CHaP (cardano-haskell-packages)

    We relocated the underlying tooling, (foliage), for CHaP into the IOG organization. Furthermore, we have introduced improved tooling to quickly add constraints to packages, better error reporting for add-revision and better hackage url compatibility to facilitate easer usage of CHaP.

    GitHub Actions

    Our repository, input-output-hk/actions, now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the base and haskell install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking cabal.

    iohk-nix

    The iohk-nix repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, sodium, blst, and secp256k1, are also fixed to certain revisions within the iohk-nix repository.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to gmp.

    devx

    The relatively new devx repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The devx repository's readme has been updated to reflect its purpose and usage guidelines.

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-09-developer-experience", + "title": "Developer Experience Update", + "summary": "High level summary", + "date_modified": "2023-06-09T00:00:00.000Z", + "author": { + "name": "Moritz Angermann", + "url": "https://github.com/angerman" + }, + "tags": [ + "devx" + ] + }, + { + "id": "2023-06-09-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team worked on multiple fronts. They finished the\ninvestigation about the broken head on mainnet and re-opened their persistent\nhead instance. The team also fixed the monthly report publication on their\nwebsite and started sketching ideas and further improvements. Also, they are on\nthe last mile to deliver a new feature which will allow parties to commit funds\nfrom extern wallets. Finally the team started to work on optimizing the\nperformance on their benchmarks.

    What did the team achieve this week

    • Finished investigation on broken head on mainnet #897 and re-opened it.
    • Added support for externally committing regular utxo #887
    • Fix monthly report publication on docs website and published the monthly report. Odd problems when publishing monthly report:
      • Make us think about if we should change something about the website #908
      • Open issue to docusaurus #9036
    • Fixed a bug in the benchmark process #910
    • Explored performance of the hydra-node{.verbatim} and identified a\nbottleneck.
    • Timed transaction feature is being used by the auction project 🎉

    What are the goals of next week

    • Complete performance analysis and start/plan improvements and provide\nregular benchmarks for Hydra #186
    • Add hydra as tool to developer platform #872.
    • Authenticate network messages #727.
    • Complete journey for external commits using multiple script UTxOs #903
    • Start implementing Option B for external commits #215.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-09-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-06-09T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-06-08-db-sync", + "content_html": "

    High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2
    • A new hire will help us with devx issues.

    Lower level summary

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-08-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-06-08T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-06-08-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has been working on giving and preparing public\ntalks, also on preparing final versions of their ICE 2023 papers, and\non analysing chain selection.

    This sprint the team has been working on final revisions for the\npre-proceedings versions of two ICE 2023 papers.

    Details

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-08-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-06-08T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-06-08-sre", + "content_html": "

    High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer.

    Lower level summary

    Bitte

    • Equinix bare metal capability was added to bitte: bitte-pull-194
    • Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: bitte-pull-201

    Bitte-cells

    Cardano-graphql

    Cardano-node

    Cardano-ops

    Cardano-world

    Ci-ops

    • Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ci-ops-pull-108

    Ci-world

    Cicero

    • Implement a cicero webhook backoff with exponential decay plus jitter: cicero-pull-79

    Iohk-nix

    Openziti

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-08-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-06-08T00:00:00.000Z", + "author": { + "name": "John Lotoski", + "url": "https://github.com/johnalotoski" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-06-08-system-test", + "content_html": "

    High level summary

    Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.7 and 8.0.0 releases.

    Workstreams

    Full list of closed PRs

    Framework improvements:

    • Make cardano-submit-api REST API service available and run corresponding regression tests by default
    • Update cabal build testing for 8.0.0
    • Add support for testing governance SPO poll
    • Use Poetry for Python dependency management
    • Check status of known GH issues during tests runtime and finish the test accordingly
    • Generate topology files with both IP addresses and DNS names
    • Log issues like failure to start a cluster instance and report errors during tests runtime

    Testing improvements

    • Add rollback testing:
      1. global consensus is reached after rollback, in situation where less than securityParam blocks were produced since cluster split
      2. global consensus is not reached when more than securityParam blocks were produced, and the result is permanent fork
    • Add tests to governance SPO poll commands

    Node:

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-08-system-test", + "title": "System Test Team Update", + "summary": "High level summary", + "date_modified": "2023-06-08T00:00:00.000Z", + "author": { + "name": "Martin Kourim", + "url": "https://github.com/mkoura" + }, + "tags": [ + "system-test" + ] + }, + { + "id": "2023-06-07-node-cli-api", + "content_html": "

    2023-06-07 - 2023-06-20

    High level summary

    • Completed cardano-cli migration to input-output-hk/cardano-cli
    • cardano-cli ping now uses cardano-ping-0.2.0.5
    • New queries on API:
      • queryCurrentEpochState
      • queryDebugLedgerState
      • queryGenesisParameters
      • queryPoolDistribution
      • queryPoolState
      • queryProtocolParameters
      • queryProtocolParametersUpdate
      • queryProtocolState
      • queryStakeAddresses
      • queryStakeDistribution
      • queryStakePoolParameters
      • queryStakeSnapshot
    • Deprecate:
      • queryPparams
    • Export query API as functions
      • genFeatureValueInEra
      • featureInShelleyBasedEra
      • isFeatureValue
      • valueOrDefault
      • asFeatureValue
      • asFeatureValueInShelleyBasedEra
      • queryEpoch
      • requireShelleyBasedEra
    • Restructure cardano-testnet (WIP)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-07-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-06-07T00:00:00.000Z", + "author": { + "name": "Carlos LopezDeLara", + "url": "https://github.com/CarlosLopezDeLara" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-06-02-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team has put their effort on finding solutions on many\ndifferent problems, such as our broken head on mainnet\n#897, our fragile monthly\nreport publications on the website and implementing Option A for\nexternal commits #215.\nAlthough most of these items are still open, huge progress has been made. To\naccelerate the investigation, they improved their logging to give more precise\nerrors when a transition requirement fails, and to reduce duplication on effets\nlogged content. Last but not least, the team is exploring formal methods and\nattended a workshop on formalizing cryptographic protocols in Agda.

    What did the team achieve this week

    • Continued investigating broken head and opened an issue to keep track #897.

      As part of this issue, improvements were made to the node logs:

      • Give a precise error when a transition requirement fails #895.

      • Reduce duplication for effects logged content by using sequential eventId and effectId pair #896.

    • Fixed references in the hydra specification #893.

    • Attended a workshop on formal methods and crypto in Agda.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete journey for external commits implementing Option A and start implementing Option B #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.
    • Fix monthly report publication on docs website.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-02-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-06-02T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-06-01-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2321.1 distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots.

    Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks.

    Low level overview

    • Released the new distribution 2321.1
    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Enhance MessageAdapter for Artifact in aggregator REST API #925
      • Completed the issue Create the sub-command for 'Cardano Immutable Files Full' in client #895
      • Completed the issue Enhance state machines Aggregator/Signer #933
      • Completed the issue Adapt the aggregator REST API to list certificates #892
      • Worked on the issue Adapt end to end tests to handle new types of data #899
      • Worked on the issue Update client documentation #897
      • Worked on the issue Update architecture documentations for new types of data #898
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Enhance terraform infrastructure #930
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Upgrade Cardano node to '8.0.0' #920
    • Completed the issue Add export path in Client CLI #512
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-06-01-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-06-01T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-05-31-consensus", + "content_html": "

    High level summary

    During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see this issue). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain.

    On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano.

    UTxO-HD

    • We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking SOP classes like HPure and HAp . In short, we implement generalised versions of important classes like Applicative and Traversable.

    Support

    • fs-sim-0.1.0.2 and fs-api-0.1.0.2 were released, which makes them now compatible with GHC up to 9.6.
    • ouroboros-consensus-0.7.0.0 was released for cardano-node 8.1, including query serialization fixes for backwards compatibility.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-31-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-05-31T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-05-31-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster.
    • New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism.
    • Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.

    Low level overview

    Benchmarking

    The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build\nconfiguration: As it stands, the ghc-bignum package is using the Haskell native-backend as a default. We strive\nto benchmark a build with the gmp-backend next.

    A variant of our forge-stress local benchmark has been set up to serve as an early indicator for the resource usage profile\nwe'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way\nshorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great\nsupport when evaluating different compiler versions or RTS flags incrementally.

    Tracing

    The hub of the new tracing system cardano-tracer is designed with a fixed output behaviour, which is limited to various\nlogging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to\ndirectly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all.

    Nomad backend

    We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with\njob definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing\nbenchmarking run required us to fine-tune communications with the nomad server.

    Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible\nand offers more detailed insight than the previous iteration in cardano-ops. The backend will enable you to formulate\nvery specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-31-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-05-31T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-05-26-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has been working on final revisions for the\npre-proceedings versions of two ICE 2023 papers.

    Details

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-26-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-05-26T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-05-26-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team accomplished several important tasks. They held their\nmonthly review meeting and drafted the report for May. They made progress on\nimplementing the first end-to-end journey for external commits using \"Option A\"\nfor normal UTxOs, while still considering \"Option B\". The team also integrated a\nSpanish translation contributed by the community, created micro-benchmarks for\ntransaction validation and deserialization, and made improvements to\nhydra-node's version reporting. Last but not least, they implemented the ability\nto commit multiple UTxOs to a head at once.

    What did the team achieve this week

    • Held the monthly review meeting (recording + slides) & drafted the report for May.
    • Have a first end-to-end journey for external commits implementing Option A\nfor normal UTxOs #887 (still considering Option B).
    • Integrated the spanish translation #866.
    • Created micro-benchmarks for transaction validation and deserialization #884.
    • Improve hydra-node version reporting on non-released builds #849
    • Some minor CI improvements following up last weeks changes.
    • Allow commit transactions with multiple UTxO #774.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete external commits with script UTxOs #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-26-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-05-26T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-05-26-ledger", + "content_html": "

    High level summary

    The ledger team made progress on the conway ledger era. In particular, the design and implementation\nof the new certificates is near complete, we refactored some of our data structures\nto be able to support DReps, we cleaned up the serialization format, and renamed things to make\nclearer the differences with Shelley.

    The team also completed integration work for the next node release, namely 8.1.0.\nAnd, as always, we continue to address technical debt.

    Low level summary

    Conway progress

    • pull-3408 - Improve conway delegation certificates
    • pull-3428 - Get rid of Constitutional in favor of Genesis and Committee
    • pull-3426 - Add DRep to internal data struture (UMap)
    • pull-3425 - Improve witness logic needed for conway
    • pull-3423 - Rename ShelleyDelegCerts constructors to distinguish them from Conway
    • pull-3421 - Rename DCert -> TxCert
    • pull-3454 - conway CDDL minor fixes

    Improve testing

    • pull-3403 - Add Plutus script context golden tests

    Integration work

    • pull-3410 - Update chaps index
    • pull-3416 - Bump cardano-ledger-alonzo-test version
    • pull-3414 - Bump cardano-ledger-shelley-test minor version
    • pull-3420 - Bump cardano-ledger-shelley-ma-test version
    • pull-3441 - Release cardano-ledger-[alonzo|babbage]-1.2.1

    Technical debt

    • pull-3409 - Unit test - no such thing as a reference datum
    • pull-3407 - Fixup release process documentation
    • pull-3404 - Create TotalDeposits events during all eras
    • pull-3402 - Fix broken references in the Shelley spec
    • pull-3424 - Remove no longer used cardano-ledger-shelley-ma package
    • pull-3432 - Add an example on how to bump up versions in the changelog
    • pull-3440 - Revert back to the group serialization for ProtVer for PParams
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-26-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-05-26T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-05-26-network", + "content_html": "

    High level summary

    We continued working on eclipse-evasion. We also analysed and fixed a bug\nwhen using DNS names in local root peers. We continued working on engineering\nblog post about P2P. We released a new version of packages for\ncardano-node-8.1.0 release.

    We improved our CI, removed obsolete scripts add extra validation which checks\nif CHANGELOG.md files were updated.

    We also improved release scripts.

    Detailed summary

    • Eclipse evasion: #4462
    • Local root peers bug fix: #4559
    • Release to CHaP: #4573
    • CI improvements: #4572
    • Release script improvements: #4573
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-26-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2023-05-26T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-05-24-node-cli-api", + "content_html": "

    2023-05-24 - 2023-06-06

    High level summary

    • The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released.
    • We provided assitance where needed in the release
    • An integration repository https://github.com/input-output-hk/fusion-flamingo was created to enable my team to more easily work on cardano-cli and cardano-api

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-24-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-05-24T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-05-19-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the \"Coding Standards\" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.

    What did the team achieve this week

    • Complete validation of timed transactions feature #196.
    • Write ops instructions and troubleshooting #569 and improve logs.
    • Remove --ledger-genesis argument to hydra-node options #863.
    • Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows #877.
    • Use nix to build test binaries to increase CI speed #867.
    • Updated our Coding Standards.

    What are the goals of next week

    • Monthly report & review meeting.
    • Have a first end-to-end journey for external commits implementing \"Option A\" #215.
    • Integrate spanish translation #866.
    • Improve and provide regular benchmarks for Hydra #186.
    • Allow commit transactions with multiple UTxO #774.
    • Explored stateless observation and refined hydra explorer ticket #696.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-19-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-05-19T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-05-17-consensus", + "content_html": "

    High level summary

    During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the [Genesis][#genesis] section for more details.

    Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our main branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain.

    We improved our tooling by releasing an immutable DB server, which can be used for testing and benchmarking purposes, and a db-truncater program, which can be used in disaster recovery and benchmarking scenarios.

    Genesis

    The consensus team working on Genesis:

    • Improved the genesis selection rule as a result of our interaction with IO Research.
    • Studied how the hard-fork combinator handles forecasting at era transitions, and improved our documentation.
    • Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP.
    • Elaborated concrete proposal for the Genesis State Machine.
    • Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).

    The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-17-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-05-17T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-05-17-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2318.0 distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types.

    Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node 8.0.0 (along with the backward compatibility for previous 1.35.x versions).

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the handling of multiple types of signed entity in the aggregator runtime #907
      • Completed the adaptation of the signer runtime to use the signable builder service #854
      • Completed the adaptation of the aggregator runtime to use the artifact builder service #869
      • Completed the appending of the next AVK to all protocol messages #888
      • Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced #893
      • Completed the adaptation of the explorer to handle new artifact routes of the aggregator #927
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the implementation of the new stake distribution computation in the chain observer #919
      • Worked on upgrading the Cardano node to 8.0.0 #920
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-17-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-05-17T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-05-17-performance-and-tracing", + "content_html": "

    High level summary

    • Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes.
    • New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due.
    • Analysis pipeline: First steps on implementing incremental analysis have been untertaken.
    • Open Sourcing: Exhaustive dataflow charts for both our analysis tool locli and our workbanch have been merged to master
    • Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster.
    • P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland.
    • Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.

    Low level overview

    Benchmarking

    As a compiler switch to GHC 9.2.7 for cardano-node's default build environment is around the corner, we're setting up our benchmarking cluster to\nhandle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This\nalso involves choosing a reliable baseline as reference point for inter-version comparisons.

    Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet,\nwe strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to\nbe balanced against resource demand for all our cluster's nodes.

    Tracing

    For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some\nquality-of-life details that have changed required us to revision the system documentation.

    Analysis

    As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been\nnormally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a\nhuge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken.

    Open Sourcing

    A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking\ncopmonents more accessible. As a result, detailed charts for both our LogObject CLI locli and our workbench have been merged to master.

    Nomad backend

    While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting\nthose profiles of our workbench that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality\nof the nomad cloud backend.

    Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster.

    Performance & Tracing Meetup

    We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive\ndays together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future.\nAlso, it was a great opportunity to finally meet in person.

    Offboarding

    Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation\nof team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-17-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-05-17T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-05-12-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: Include final tests for BLS signature. Further adaptations for KES agent.
    • Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.

    Low level summary

    cardano-base

    Sidechains

    • Opened PR in halo2curves to include BLS12-381 and JubJub, #38
    • Addition constraint over JubJub merged #10
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-12-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-05-12T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-05-12-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team had two paper accepted for ICE 2023\n(https://www.discotec.org/2023/ice). The event will be held in Lisbon\non 19th June 2023. The papers will be published in EPTCS.

    Details

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-12-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-05-12T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-05-12-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team achieved a number of milestones, including the release\nof the first mainnet compatible version. Besides this they also addressed\ninconsistencies in rollback handling, added an architecture page to the website,\nreducing the size of logs using event IDs. They also had productive discussions\nwith researchers on plans for incremental commits/decommits and had a whiteboard\nsession on DeFi and lending protocols. The goals for next week include\ncompleting the validation of the timed transactions feature, exploring stateless\nobservation, refining the Hydra explorer ticket, writing ops instructions and\ntroubleshooting, and implementing the first end-to-end journey for external\ncommits.

    What did the team achieve this week

    • Released first mainnnet compatible version 0.10.0
    • Addressed inconsist handling of rollbacks #784
    • Added architecture page and fixed haddock links on our website #838
    • Opened a new hydra head on mainnet
    • Talked with researchers on initial plan for incremental commits/decommits
    • Had a Whiteboard session on DeFi and lending protocols
    • Reduced size of logs using event ids #859
    • Published the monthly report for April

    What are the goals of next week

    • Complete validation of timed transactions feature #196
    • Explored stateless observation and refined hydra explorer ticket #696
    • Write ops instructions and troubleshooting #569 and improve logs
    • Have a first end-to-end journey for external commits implemented #215
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-12-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-05-12T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-05-12-network", + "content_html": "

    High level summary

    We started working on a new way to switch between root & ledger peers (see\nbelow). We continued to work on eclipse-evasion. We merged changes to\nHandshake contributed by Galois Inc. We made improvements to our tests (fixed\na flaky test, added cddl specs for NodeToNodeVersionData and\nNodeToClientVersionData). We improved our CI and automated the process of\nreleasing new package version to CHaP.

    Detailed summary

    We continued to work on testing eclipse-evasion.

    We came up with an idea to limit how full node wallets relay on root peers\n(currently operated by IOG, in future also CF and Emurgo). We designed\na switch to use ledger peers if the node tip is close enough to the current\ntime. For more details see #4530.

    We merged changes to the handshake mini-protocol which allow one to query\nserver's node-to-node / node-to-client parameters. We are grateful to\nGalois Inc. for implementing it, #4256 and #4538. We published new version\nof packages to CHaP chap-#253.

    We added DiffusionError wrapper. Thanks to it, ouroboros-consensus will\nnot duplicate diffusion errors messages in the log, #4537.

    We fixed an issue which caused one of our tests to be flaky, #4515.

    We added cddl tests for NodeToNodeVersionData and NodeToClientVersionData:\n#4540, #4544 (in review).

    We wrote scripts which will help us release packages as well as verify that we\nreleased all the package necessary to build the newest set of packages,\n#4542.

    We renamed the consensus startup tracer and make sure it doesn't log\nExitSuccess exceptions, consensus-#71.

    We reviewed PR which adds RawBearer API, #4395.

    We made series of improvements to our CI:

    • #4539: we don't need to install cryptographic libraries in CI;
    • #4545: Javier Sagredo (consensus) cleaned up CI after consensus moved\nto a new repo;
    • #4546: we switched to use GitHub merge queues;
    • #4549: we made it possible to trigger building haddocks manually;
    • #4553: we fixed and enhanced caching of building dependencies.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-12-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2023-05-12T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-05-05-ledger", + "content_html": "

    High level summary

    The ledger team focused mainly on the conway ledger era and node integration.\nFor conway, we completed a large structural change that now allows\nfor delegation certificates to be parameterized by era, and introducing\nnew certificates for the first time since Shelley.\nWe also continue to build out our contraint based generators that we will\nuse to property test the conway era.\nIn particular, we can now generate an entire ledger state and a\ntransaction which is balanced with respect to the ledger state.

    Low level summary

    Conway certificates

    Certificiates are now abstracted as a type family in the ledger codebase.\nMoreover, there are new certificates in the Conway era to support CIP-1694,\nand MIR certificates have been removed.

    Constraint based testing

    Our plan for property testing in the conway era is to no longer use the trace generators,\nbut instead generate ledger states and transactions based on constraints.\nWe hit a milestone this week, namely the ability to generate a balanced transaction in the context\nof a ledger state, all based on our ever growing constaint language.

    Integration work

    Technical debt

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-05-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-05-05T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-05-05-node-cli-api", + "content_html": "

    2023-05-05 - 2023-05-23

    High level summary

    • Golden tests for cardano-cli command help output were added.
    • Documentation was updated with new libsodium installation instructions.
    • There were several updates for the cardano-cli:
      • Deletion of the deprecated shelley command group.
      • Addition of golden tests for CLI help.
      • An improvement to avoid bare IO in tests, allowing better error reporting in failed tests.
      • Generation of UTCTime test values without leap seconds (avoids erroneous test failures)
      • Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32.
    • The cardano-api underwent multiple refinements:
      • Implementing deposit handling when balancing transactions (necessary for Conway)
      • Cleaning up socket file path code.
    • Several changes were made to the cardano-testnet:
      • Adding golden tests for cardano-testnet help.
      • Removing all hardcoded yaml files in cardano-testnet
      • Improving cardano-testnet help output.
      • Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-05-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-05-05T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-05-04-mithril", + "content_html": "

    High level overview

    The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version 1.35.7.

    Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain.

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the implementation of the Certifier service in the aggregator #850
      • Completed the implementation of the signable builder for the Mithril Stake Distribution #851
      • Completed the implementation of the artifact builder for the Mithril Stake Distribution #870
      • Completed the implementation of the signable builder for the Full Immutables Snapshot #852
      • Completed the implementation of the artifact builder for the Full Immutables Snapshot #871
      • Completed the adaptation of the aggregator runtime to use the signable builder service #853
      • Worked on the adaptation of the signer runtime to use the signable builder service #854
      • Completed the definition of the entity service interface for verification/restoration #868
      • Completed the refactoring of the OpenMessage type #878
    • Completed the epic that simplifies the multi-signer in the aggregator #398:
      • Completed the extraction of the single signature registration from the multi-signer #643
    • Completed the upgrade of the Cardano node to version 1.35.7 #881
    • Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators #873
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-04-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-05-04T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-05-03-consensus", + "content_html": "

    High level summary

    During the past two weeks we made some important progress in the Genesis design.\nIt seems the BlockFetch logic need not be modified for Genesis, although this\nneeds to be confirmed. We started a DoS mitigation handbook and updated our\nconceptual component diagram to guide the Genesis design. We engaged with the\nIOG researchers to work on the Limit on Patience attack vector, work in this\narea is still ongoing. We sketched a design to decouple the CPU load of the node\nfrom its responsiveness to the socket. Finally, we discussed with Networking our\napproach to lower the performance impact of the BlockFetch decision logic, and\ngot green light from them.

    We migrated the consensus code to a new\nrepository, splitting\nit from the ouroboros-network repository, and released version 0.6 of\nConsensus.

    We also merged the mempool fairness improvement to main branch.

    Another significant enhancement to our documentation was the addition of an\nexplanation of the hardfork combinator forecast horizon.

    See the sections below for more details.

    Genesis

    We reviewed the BlockFetch design documentation, and added some source-code\ncomments that emphasize certain properties of the decisions the BlockFetch\nlogic makes that are helping us confirm that Genesis does not require any\nchanges to BlockFetch. We are waiting on input from our former system\narchitect to verify this.

    We migrated and updated the conceptual component diagram in the ouroboros-consensus\nrepository which helps us situate the Genesis design and argument.

    We engaged with the IOG researchers about the Genesis design. We sketched out a\nway to address the concern that the Limit on Patiente (LoP) attack vector duty\ncycle is indeed low, but it's still non-trivial to ultimately conclude it's\nsufficiently low.

    We also sketched a design to decouple the CPU load of the node from its\nresponsiveness to the socket, since the LoP is a relatively tight timeout, and\nnode performance bugs inducing seconds-worth of latency are unfortunately\nfamiliar phenomena.

    Fostering collaboration

    We added an\nexplanation of\na question that we had to explain many times about the exact behavior of the\nhardfork combinator forecast horizon.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-03-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-05-03T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-05-03-performance-and-tracing", + "content_html": "
    • Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.
    • New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint.
    • Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on.
    • Infrastructure: The plutus-apps flake input for cardano-node has finally been removed.
    • Nomad backend: A PR implementing placement of benchmarking clusters has been merged.

    Benchmarking

    The performance investigations on the 8.0 release branch have lead to pinpointing and addressing incosistent behaviour. For that,\nwe created yet another local reproduction with the workbench's forge-stress benchmark.

    Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into 8.0 and\nsubsequent releases.

    Additionally, we've refined the trace-bench family of profiles that target benchmarking our own new tracing system.

    Tracing

    Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally\nintended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant\nconversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system.

    Infrastructure & Analysis

    Dataflow documentation

    The LogObject CLI locli is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate\nfurther development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting.

    Remove redundant Plutus flake input

    This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input,\nwe simplify the dependency graph for cardano-node, as well as enable immediate feedback when developing Plutus benchmarks.

    Nomad backend

    Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking.\nThis capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along\nwith various quality-of-life improvements, has been merged to master.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-03-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "* Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.", + "date_modified": "2023-05-03T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-05-01-db-sync", + "content_html": "

    High level summary

    Lower level summary

    • Prepared a schema change which is expected to speed up queries and help clients\n#1389.
    • Ran a big number of benchmarks on the above to evaluate if this change is reasonable.
    • Performance optimization related to rewards\n#1382
    • Using the cache in more places to reduce recourses usage\n#1380
    • Evaluated risks related to UTXO-HD integration
    • Worked on a feauture request to split the tx_out to an address table\n#1396
    • Worked on another feauture request to prune the consumed entries from the tx_out table\n#1398
    • Prepared for CIP-1694 integration
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-05-01-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-05-01T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-04-28-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library.
    • KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction.
    • Sidechains: Started implementing ECC chip of JubJub over BLS12-381.

    Low level summary

    cardano-base

    • #255 finally merged 🎉
    • Additional tests for BLS bindings #384
    • Open PR for including test vectors created with zkscrypto's library, PR#397

    KES agent

    • Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period PR#389.
    • Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) #317.
    • Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim
    • Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes
    • Refactor MonadSodium into MonadMLock PR#388.

    Sidechains

    • Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)
    • Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-28-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-04-28T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-04-28-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    The team is working on porting an existing formalisation of Ouroboros\nPraos to a newer foundation.

    Details

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-28-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-04-28T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-04-28-network", + "content_html": "

    High level summary

    The networking team has released the following packages to Hackage:

    We published an announcement blog post. We made progress\nalso on another blog post which will describes the design of the P2P networking\nlayer.

    After moving ouroboros-consensus to its own repository, we made\nouroboros-network compatible with GHC 9.4 and 9.6.

    We made cardano-client library independent of\nouroboros-consensus-diffusion.

    We prepared release of network packages for cardano-node-8.0.

    Detailed log

    Ouroboros-Network

    IO-Sim

    • io-classes-1.0.0.0, and following up releases: 1.0.0.1 (ghc-9.6\nsupport), 1.1.0.0 (documentation fix).
    • Fixed timeouts and delays in io-sim in a series of PRs: io-sim#81,\nio-sim#82, io-sim#86, io-sim#87.
    • Renamed a module: io-sim#88.
    • Fixed a failing registerDelayCancellable test: [io-sim#80].
    • Use GitHub merge queue in io-sim repository.
    • CI: download stylish-haskell: io-sim#83.

    Typed Protocols

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-28-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2023-04-28T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-04-27-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team held their Monthly review meeting and drafted the\nreport which likely is published next week. They put the spec into the\nrepository and website, addressed a user issue and fixed the TUI peer list.\nFurthermore, they updated dependencies, conducted a Twitter space on Auctions\nuse cases, covered the rollback bug with tests and implemented a solution.\nLooking ahead, their goals for next week include releasing 0.10.0, implementing\ntimed transactions support, writing a Query API ADR, and grooming work items\nlike off-chain benchmarks.

    What did the team achieve this week

    • Held the Monthly review meeting and drafted the report (to be published next week)
    • Added the spec into the repository\n#693 and published on\nthe\nwebsite
    • Groom and addressed user issue #823
    • Covered the rollback bug with tests and implemented a solution (to be reviewed) #784
    • Fixed the TUI peer list
    • Updated dependencies to match cardano-node master
    • Conducted a twitter space on Auctions use cases

    What are the goals of next week

    • Release 0.10.0
    • Support timed transactions solution drafted and validated API with users
    • Write Query API ADR and groom a concrete step
    • Groom and solve PostTxOnChainFailed UX problem #832
    • Groom off-chain benchmarks idea #186 and turn it into a feature
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-27-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-04-27T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-04-21-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team worked on several fronts, including fixing state\nmachine continuity on-chain, discussing voting project solutions, exploring\nadding Hydra support to kupo, and improving API navigation with a sidebar. The\nteam also updated dependencies and fixed issues in their test suites. Moving\nforward, the team plans to hold the next monthly review meeting, address a user\nissue, prepare for the 0.10.0 release, and work on a dirt road fix for the\nrollbacks issue with proper test coverage.

    What did the team achieve this week

    • Fixed scripts to enforce state machine continuity on-chain #777.
    • Took part in a twitter space on Scaling Cardano.
    • Joined a CBIA meeting to discuss Cardano network protocols & how to specify them.
    • Discussed potential solutions of ensuring vote uniqueness in the voting project.
    • Updated dependencies to match cardano-node master to prepare for upcoming releases and hard-forks
    • Explored adding Hydra support to kupo, a lightweight Cardano chain indexer - some more work required.
    • Improved navigation of the API Reference with a sidebar, see unstable API version.
    • Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)

    What are the goals of next week

    • Monthly review meeting (join via Discord or AddEvent) & report
    • Dirt road fix for rollbacks #784 properly covered by a test.
    • Groom and ideally address user issue #823.
    • Put the spec into the repo #693 and prepare release 0.10.0.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-21-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-04-21T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-04-21-ledger", + "content_html": "

    High level summary

    We continued to make progress on CIP-1694 and the conway ledger era.\nIn particular, the conway era now supports Plutus V3.\nFinally, we made small improvements to the ledger API and now host\nour Haskell code documentation (haddocks) on github pages.

    Low level summary

    Conway ledger era

    Haddocks hosted on github pages

    Small improvements to the API

    Technical Debt

    • [pull-3367] Fix cost model json instances.
    • [pull-3371] UMap cleanup.
    • [pull-3373] Upgrade to ghc 9.2.7 and cabal 3.10.1.
    • [pull-3375] Sadly, we had to revert the TICKF optimizations. There was a regression we do not yet understand.
    • [pull-3377] Fix cabal warnings.
    • [pull-3383] Fix multi-asset test.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-21-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-04-21T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-04-20-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2315.0 distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures.

    Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network.

    Low level overview

    • Released the new distribution 2315.0
    • Completed the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the signed_entity table #816
      • Completed the creation of the signer table #814
      • Completed the migration/adaptation of the single_signature table #829
    • Worked on the epic that designs and implement generic signing/verification of entity services #780:
      • Completed the definition of the interface of the generic entity service for signing #847
      • Worked on the implementation of the Certifier service in the aggregator #850
      • Completed the extension of the SignedEntityType type #848
      • Completed the implementation of the Tick service in the aggregator #849
      • Worked on implementing the signable builder for the Mithril Stake Distribution #851
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-20-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-04-20T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-04-20-node-cli-api", + "content_html": "

    2023-04-20 - 2023-05-04

    High level summary

    • Various fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-20-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-04-20T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-04-19-consensus", + "content_html": "

    High level summary

    This week the consensus team continued working on the improved DB lock mechanism\nfor UTxO-HD, and modifications to the mempool benchmarks that this prototype\nrequires.

    On the Genesis front we validated that the fragment size calculation in\nBlockFetch is a major performance sink for ChainSync Jumping. By removing it\nwe will get performance that is acceptably close to that of the baseline. We\nalso started investigating a performance fix that does not alter the existing\nbaseline behavior too much. In addition we reviewed our Genesis attack vector\ncalculations.

    On the support front we released Consensus 0.4, and we are working on improving\nour release process, to support the Cardano-wide efforts in this area. We also\nperformed an analysis on the number of file descriptors that consensus use. This\ninformation can be used by the node operators to check if the number of file\ndescriptors they want to support are enough.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-19-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-04-19T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-04-19-performance-and-tracing", + "content_html": "
    • Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.
    • New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois.
    • Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run.
    • Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench.
    • Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.

    Benchmarking

    We have performed various cluster runs targeting the 8.0 release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile epoch-transition for local reproduction of what we observed on the benchmarking cluster.

    Furthermore, we bridged the gap between the run data from the 1.35.x releases to the the new 8.0.x release branch. This included walking the\nmaster branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial\nin locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of\nbenchmarks.

    Tracing

    In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still\nongoing.

    In coordination with Galois, who are developing a system assurance service by observing a number of cardano-nodes, we're working with the implementation\nof data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational\nburden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether cardano-tracer could be extended with a richer\nfeature set to that end.

    Infrastructure & Analysis

    Detailed manifest

    A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with.\nThese dependencies come from different package sources, have different versioning policies, and an identical package version might provide different\nperformance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated\nby making all component bumps visible and accessible.

    GHC profiling inside workbench

    The workbench has been equipped with a new -profnix profile flavour. This enforces a -fprof-auto build for all node-related packages. The type of\nprofiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already\nbeen merged to master.

    Nomad backend

    The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances.\nThis results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-19-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "* Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.", + "date_modified": "2023-04-19T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-04-17-ledger", + "content_html": "

    Incident reporting: Cardano block production temporary outage

    On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a ‘critical’ incident, thus warranting immediate response and investigation by IOG engineers.\nThe investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue – a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite.\nFollowing successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version.\nWith the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue.

    Further Details

    You can read more details on the incident and how it was managed from SundaeSwap’s Pi Lanningham here. Thanks again to all the community for its support in identifying and fixing this bug.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-17-ledger", + "title": "Incident Report", + "summary": "Incident reporting: Cardano block production temporary outage", + "date_modified": "2023-04-17T00:00:00.000Z", + "author": { + "name": "Kevin Hammond", + "url": "https://github.com/kevinhammond" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-04-14-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has submitted two papers for publication, carried\nout consultancy with other teams and has an opening for an intern.

    Details

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-14-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-04-14T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-04-14-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team focused on improving the smoke test, fixing developer\ntooling, and improving the API for voting use cases. They reviewed progress on\nauction, payments, and voting projects and made worked on reproducing a bug with\nhandling rollbacks. Moving forward, the team plans to update dependencies,\nimplement a dirt road fix for the rollbacks bug, and explore adding Hydra\nsupport to kupo.

    What did the team achieve this week

    • Reviewed progress on auction, payments and voting projects
    • Improved smoke tests so they can run on mainnet
    • Fixed a regression in the development environment and updated cardano-node\nused in tests
    • Improved API with more configurability to unblock voting use case
      • Exclude utxo in SnapshotConfirmed outputs #808
      • Addressed a user request by only sending Greetings once #813
    • Reproduced the rollback bug by improving our model-based test suite #784

    What are the goals of next week

    • Update dependencies to match cardano-node master
    • Dirt road fix for rollbacks #784
    • Update Hydraw to maintain state locally
    • Explore adding Hydra support to kupo
    • Put disclaimer texts and closing mainnet compatibility feature #713
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-14-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-04-14T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-04-07-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team published the monthly report for March, created\nseparate links for different versions of documentation, and clarified potential\nsolutions for the Rollbacks bug. The team also discussed Query API requests for\nthe Hydra Voting project and met with community members to answer questions\nabout Hydra. Moving forward, the team plans to integrate the specification into\nthe repository, implement a short-term fix for the Rollbacks issue, and draft a\nQuery API ADR.

    What did the team achieve this week

    • Published monthly reports on website
    • Separate last released and latest versions of docs (e.g. normal released vs. /unstable)
    • Discussed Query API concerns from Hydra Voting project (link)
    • Clarified rollbacks bug and defined possible solutions (short and long term) #784
    • Met with community members to answer questions about Hydra

    What are the goals of next week

    • Finally get the docs integrated into the repository #693
    • Dirt road fix for rollbacks #784
    • Disclaimer text and detail known issues about mainnet compatibility\n#713
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-07-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-04-07T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-04-06-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2313.0 distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages.

    Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to 1.35.6.

    Low level overview

    • Released the new distribution 2313.0
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the epoch_settings table #813
      • Completed the migration/adaptation of the signed-entity-type table #815
      • Completed the migration/adaptation of the certificate table #817
      • Completed the migration/adaptation of the open_message table #827
      • Completed the migration/adaptation of the signer_registration table #828
    • Completed the refactoring of the dependency injection of the aggregator #823
    • Completed the cleanup of the multi-signer of the aggregator #824
    • Completed the upgrade of the Cardano node to 1.35.6 #843
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-06-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-04-06T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-04-05-consensus", + "content_html": "

    High level summary

    This week the consensus team finished the UTxO-HD prototype refactoring. We are\nnow working on improving the DB lock mechanism to improve performance. We also\nintroduced several improvements to the file system abstraction and simulation\nlayer (fs-sim), which culminated in the release of fs-sim-0.1.0.0 and\nfs-api-0.1.0.0 to CHaP.

    On the Genesis front we distributed the updated Genesis design document,\nsoliciting feedback from Networking Team and IOG Researchers. We also opened up\na PR for the adversarial leader schedule QuickCheck generator, which is being\nreviewed.

    On the support front, we got a new Consensus version that can use different\nfundamental VRF crypto primitives for Babbage and Conway eras.

    On the tech debt front we fixed an bug in the followers logic, which was\ndiscovered by our QuickCheck property tests.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-05-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-04-05T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-04-05-node-cli-api", + "content_html": "

    2023-04-05 - 2023-04-19

    High level summary

    • Introduce new governance commands create, answer and verify. This allows us to have onchain polls.
    • Begin making changes in cardano-api to accomodate for CIP-1694
    • Rename TestEnableDevelopmentHardForkEras to ExperimentalHardForksEnabled and TestEnableDevelopmentNetworkProtocols to ExperimentalProtocolsEnabled
    • Various bug fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-05-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-04-05T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-04-05-performance-and-tracing", + "content_html": "
    • Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.
    • New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput.
    • Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged.
    • Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added.
    • Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.

    Benchmarking

    We have adapted our benchmarking cluster to the requirements of the 8.0 release branch. Testing runs of a very early feature branch for 8.0\nhelped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for 8.0 soon.

    Tracing

    Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very\ndetailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing\nthe highest possible throughput of data for forwarding to cardano-tracer.

    Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions\nfor tunneling trace forwarding from a node to cardano-tracer via an easy to manage system service, which will match the production setup of most users.

    Infrastructure & Analysis

    General

    Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance\nanalysis can be fed back and serve as an additional point of comparison.

    Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations.

    Plutus library

    We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles.\nThis will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile.\nIt is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit.

    Nomad backend

    The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is\nbeing improved to minimize any friction for the backend user.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-04-05-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "* Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.", + "date_modified": "2023-04-05T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-03-31-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Started looking into full-node verifier
    • cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties.
    • KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent.
    • Sidechains: Included BLS12-381 & JubJub to halo2curves
    • MuSig2: Final modifs to C version.

    Low level summary

    Mithril

    • Started designing how a full-node verifier would work. Issue comming in the next couple of weeks.

    cardano-base

    • BLS12-381 branch merged PR#266.
    • Testing strategy for BLS bindings:
      • Test-vectors for Groth16, and simple BLS signatures ready.
      • Test-vectors with different library, and created by different engineer.

    KES agent

    • Resolved issues of circular dependency
    • Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same.
    • Opened a PR for raw bearer branch in ouroboros network PR4395
    • Resolved a bug where the agent node did not properly closed connections
    • Updated version of IOSim allowed us to finish a first version of KES agent.

    Sidechains

    • Included BLS12-381 curve to our branch of halo2curves
    • Included JubJub to our branch of halo2curves

    MuSig2

    • Minor reorg PR#42
    • Started including fuzz testing for deserialisation PR#
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-31-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-03-31T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-03-31-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has been working on final drafts of two papers\nfor internal review and planning next steps of analysis of consensus\ndesign refiniments.

    Details

    • Preparing final draft of DeltaQSD algebra paper for internal review

    • Preparing final draft of verifying design refinements for\ndistributed system design for internal review

    • Planning next phase of consensus design refinement analysis

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-31-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-03-31T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-03-31-hydra", + "content_html": "

    High-level summary

    This week, the Hydra continued work on finishing mainnet compatibility. The\nsemi-automated smoke tests and some missing documentation is still preventing\nfrom calling that fully done. They fixed smaller issues and made a step in the\nHead protocol more robust. Besides development, they met with interested people\nfrom the community who want to get started collaborating on communication and\nmarketing materials.

    What did the team achieve this week

    • Groomed and followed-up on GetUTxO user request discussion #797
    • Fixed hydra-node crashes after forks #560
    • Made collectCom more robust and aligned with spec #786
    • Completed configurable API feature #380
    • Met potential contributors about Hydra communication and marketing materials
    • Versioned documentation: we have a unstable bleeding edge version available as well now, seperate from the last released version

    What are the goals of next week

    • Follow-up backlog and roadmap clean-up
    • Complete mainnet compatibility feature #713 (documentation updates)
    • Integrate Hydra specification into repository #693
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-31-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-03-31T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-03-31-ledger", + "content_html": "

    High level summary

    We are still heavily involved in work related to preparing the next release.\nThe other main thing we have worked on is experimentation about how we will\nhandle the DRep stake distribution for CIP-1694 in the conway ledger era.\nLastly, we merged a fix for\nnode-4826\ninto our main branch (there will be a post-mortem shortly).

    Low level summary

    Support for the next release

    • pull-3363 - Fix problems relating to Arbitrary instances used by consensus.
    • pull-3361 - Remove the alonze genesis from the conway genesis.
    • pull-3360 - Translate bad pointer addresses to valid ones in conway.
    • pull-3357 - Fix a bug relating to zero valued ADA in the script context.
    • pull-3356 - Added needed instances (Arbitrary and Serialization) for conway integration.
    • pull-3345 - Added helper functions for the CLI.
    • pull-3342 - Fix a bug with a CLI helper function (having to do with deposit tracking).

    Experiments for DRep stake distribution

    Adding another stake distribution to the ledger state presents some new challenges.\nWe would like to be able to use the current stake distribution at the epoch boundary\nfor DRep voting so that people can always vote themselves in time for any proposal.\nTo this end, we have a prototype of an incremental computation based on the incremental\nlambda calculus, together with tests and benchmarks (which are very promising).\nSee pull-3344.

    Additionally, more of the ledger state is going to need to be rearranged to accomodate\nthe new incremental computations.\nWe have two draft PRs up for possibles solution.\nSee pull-3353 and pull-3364.

    Technical debt and bug fixes

    Documentation changes

    • pull-3354 - Rename \"optional datums\" with \"supplemental datums\" in the alonzo spec.
    • pull-3352 - Add a section to the Shelly errata about the individual deposit tracking.
    • pull-3351 - Further clarify the details regarding the script integrity hash.
    • pull-3350 - Some cleanup of the Babbage spec.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-31-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-03-31T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-03-27-system-test", + "content_html": "

    High level summary

    Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.5 and 1.35.6 releases (and their predecessing release candidates) and ran tests on branch with the UTxO-HD functionality.

    Workstreams

    Framework improvements:

    • improvements in searching for unexpected error messages in log files during test run
    • added support for UTxO-HD testing
    • added support for the new P2P topology format
    • added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)
    • added preliminary support for the Conway era
    • added support for running tests on the Preview testnet

    Full list of closed PRs

    Node:

    • ran tests on node branch with the UTxO-HD functionality
    • tested the 1.35.5 release
    • tested the 1.35.6 release

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-27-system-test", + "title": "System Test Team Update", + "summary": "High level summary", + "date_modified": "2023-03-27T00:00:00.000Z", + "author": { + "name": "Martin Kourim", + "url": "https://github.com/mkoura" + }, + "tags": [ + "system-test" + ] + }, + { + "id": "2023-03-24-hydra", + "content_html": "

    High-level summary

    This week, the Hydra had a team workshop and conducted the monthly review\nmeeting for March. They demonstrated a Hydra Head on mainnet, which was running\nthe hydraw demo application. While this marks an important milestone, they also\nemphasized that more features are still to be added as needed for applications\nto run on Hydra. Besides this, the roadmap is getting cleaned up to encourage\ndiscussions and provide more space for user requests.

    What did the team achieve this week

    • Monthly review meeting slides/recording, full report of March next week
      • Opened a head on mainnet with hydraw demonstration
      • Hydra pay updates
    • Team workshop in Austria
      • Hydra presentation at the Cardano Foundation in Zurich
      • In-person grooming session, marked many items as candidates to be rather :idea: dicussions
      • Improved head protocol #786 and investigated a potential bug in rollback handling #784
      • Team building and retrospective

    What are the goals of next week

    • Follow-up on backlog and roadmap clean-up
    • Complete mainnet compatibility feature (documentation updates)
    • Make API more configurable #380
    • Integrate Hydra specification into repository #693
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-24-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-03-24T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-03-23-db-sync", + "content_html": "

    High level summary

    The DBSync team worked in performance enhancements issues, on providing new db-sync options and on\ntechnical debt and bug fixing. The DBSync team also on boarded a new member.

    Low level summary

    • Worked on an issue which causes ada_pots tables to include the values related not only to an\nepoch, but also the first epoch of the last epoch.\n#1367
    • Fixed an issue where the epoch table didn't rollback and caused wrong values\n#1370
    • Fixed an issue were users with disable-ledger option had to provide the state dir option, even\nthough it was never used. Also refactored the no ledger part of the codebase.\n#1378
    • Improved the perforance by using the cache more. Also provided many new options which enables or\ndisables parts of db-sync. In addition a new --turbo mode is enables which allows db-sync to sync\nmainnet in hours.\n#1379
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-23-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-03-23T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-03-23-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2310.0 distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images.

    Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano mainnet and they have fixed some bugs.

    Low level overview

    • Completed the epic that implements eras behavior switch #707:
      • Completed handling the API version switch at era transition #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed on the migration/adaptation of the stake_pool table #787
      • Worked on the migration/adaptation of the epoch_settings table #813
      • Worked on the migration/adaptation of the signed-entity-type table #815
      • Completed the creation of a stake distribution service #799
    • Completed the testing of Mithril with Cardano mainnet network #777
    • Completed qualifying the computation of the stake distribution #810
    • Completed the testing of the Docker client in the Mithril Client multi-platform test workflow #794
    • Worked on bugs and optimizations:
      • Fixed a bug that made computation of the stake distribution occur multiple times during an epoch #804
      • Fixed a bug that created deadlocks on the SQLite connection #807
      • Optimized the error message and the behavior of the signer node when KES keys have expired #820
      • Upgraded the infrastructure of the testing-preview and pre-release-preview networks #801
      • Re-genesis of the testing-preview network #803
      • Re-genesis of the pre-release-preview network #818
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-23-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-03-23T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-03-22-consensus", + "content_html": "

    High level summary

    This week the consensus team continued working on the refactoring of the UTxO HD\nprototype, and design and testing of Genesis. We also extracted the fs-sim\npackage, which provides a file-system abstraction layer that can be used for\ntesting and simulation. This makes the Consensus code base smaller, while\nproviding a package that the community can reuse and contribute to. We also\nfixed a failing property test related to iterators. We are also working on\nmempool and VRF improvements.

    Low-level details

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-22-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-03-22T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-03-22-node-cli-api", + "content_html": "

    2023-03-22 - 2023-04-05

    High level summary

    • Added new cardano-cli ping command which allows users to ping remote cardano-nodes.
    • The transaction build command now can automatically balance multiassets
    • New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-22-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-03-22T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-03-22-performance-and-tracing", + "content_html": "
    • Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.
    • New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users.
    • Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery.
    • Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks.
    • Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing.
    • Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.

    Performance

    New tracing

    The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe\na slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use.

    GHC RTS parametrization

    We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies\non different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use.

    Open Sourcing

    Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases.

    Tracing

    For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well\nas a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points\nfor users of the new system, depending on their wants and needs.

    Infrastructure & Analysis

    General

    Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will\nincrease confidence in specific metrics.

    Nomad backend

    We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis\nis patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-22-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "* Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.", + "date_modified": "2023-03-22T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-03-21-network", + "content_html": "

    High level summary

    In the last spring we released cardano-node-1.35.6 with dynamic P2P\nfunctionality.

    We received reports from some SPOs who encountered problems with their non\nP2P block producing nodes not being able to connect to their P2P relay. Karl\nKnutsson (from Cardano Foundation) reproduced this issue between two nodes (a\nnon P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed\nit and found a bug in the legacy non p2p code. The bug is only possible to\ntrigger with a P2P node which is binding its outbound connection port to\na fixed IP address and port (default in p2p). A possible solution was found.\nFor more information see #4465.

    We released cardano-ping-0.1.0.0 package to CHaP. cardano-ping is no\nlonger available as a standalone binary, but instead it will become part of\ncardano-cli (see #4664)

    We are testing cardano-node with peer sharing functionality (#4019).

    We are working on eclipse evasion. We added new class of peers: big ledger\npeers to the outbound governor, implemented tests and fixed found issues\n(#4462). We also made the information if a given peer plays the role of\na big ledger peer to the mini-protocols. This will allow to modify\nmini-protocol applications for such peers. As part of this functionality we\nrefactored some core types in the network code which simplifies exposed API.

    Together with Moritz Angerman we started to update io-sim to ghc-9.6.1 (see\n#73).

    We merged a fix of configuration of accepted connections limit in\ncardano-node (see #4902).

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-21-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2023-03-21T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-03-17-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: RFP finished. Code ready for audit.
    • cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams.
    • KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing.
    • Sidechains: Preparing proving system to use the curves needed for main-net PoC.

    Low level summary

    Mithril

    • Merged PR#783
    • RFP for crypto audit ready.

    cardano-base

    • BLS12-381 branch approved PR#266. Blocker is Windown's CI. Working on it
    • Testing strategy for BLS bindings:
      • Preparing test-vectors for Groth16, and simple BLS signatures
      • Finding community projects to help write their use cases
      • Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)
    • Wrote blogpost on how using the same key for ed25519 and VRF completely breaks the security of both systems

    KES agent

    • Started integration of sockets interface used in consensus
    • Use that for de/ser
    • Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim
    • Results in having to parametrise for IOSim in KES and DSIGN for testing

    Sidechains

    • Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages.
    • Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS.
    • EdDSA over JubJub ready
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-17-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-03-17T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-03-17-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team has continued work on the mainnet compatibility of the\nhydra-node. They added a golden test suite for hydra-plutus scripts, added\nsome detection of hydra-node misconfiguration, established a limit of 100 ADA\nper commit and other smaller tasks to prepare for a mainnet beta release.

    Next week there will be a small team workshop to push for demonstrating a Hydra\nHead on the Cardano mainnet, ideally just in time for the monthly review\nmeeting. See the hydra channels on the IOG Technical Community discord server\nfor details.

    What did the team achieve this week

    • Implement a 100 ADA hard-coded commit limit in the hydra-node\n#763
    • Pay back funds to faucet after smoke-test run\n#773
    • Setup custom github runner for smoke-tests on mainnet\n#775
    • Created golden tests to assure the script hash stays the same between\nchanges #772
    • Removed hardcoded error codes in plutus scripts\n#768
    • Detect misconfiguration of a hydra-node given persistent state\n#767
    • Met with potential users for hydra-pay
    • Prepared hydra workshop

    What are the goals of next week

    • Hydra monthly meeting
    • Open a multi-party head on mainnet
    • Complete mainnet compatibility feature
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-17-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-03-17T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-03-17-ledger", + "content_html": "

    High level summary

    We made further progress on the conway ledger era.\nIn particular, we expanded the ledger API significantly, including lots of governance features.\nWe also made progress on the specification and corresponding work in the Haskell implementation.

    We also continued to integrate the latest ledger packages into cardano node and addressed\ntechnical debt.

    Low level summary

    Expanded ledger API

    The ledger API was significantly expanded to include:

    • a lot of protocol parameter support
    • versioning support (type level ledger eras and protocol versions)
    • auxiliary data support
    • many new lenses
    • support for witnesses
    • support for conway governance

    See pull-3328.

    Conway ledger rules

    We have made progress on the formal ledger specification for the Conway era.\nMoreover, the corresponding Haskell updates were also completed:

    Incremental SPO/DRep stake distribution computation

    We have a working (and correct) proof of concept for how to use the incremental lambda calculus\nto maintain several of the stake distributions incrementally.\nFor the per-SPO distribution, this is a performance improvement.\nFor the (conway) per-DRep distribution, this is will allow those who have delegated their votes\nto a DRep to have time to react to any votes that they disapprove of.\n(Sorry, no code to share just yet, more to come.)

    Technical debt

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-17-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-03-17T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-03-16-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has been working on drafts of two papers\nimproving the deltaQ tutorial, consulting on performance design, and\nthe final version of the Djed paper.

    Details

    • Preparing draft of DeltaQSD algebra paper for ICE 2023

    • Successful outcome of Marlowe consultancy leading to substantial\nimprovement in performance

    • Preparing sections on the communication language and bisimulation\nproofs for draft paper about verifying design refinements for\ndistributed system design

    • Camera ready version of Djed paper under preparation

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-16-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-03-16T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-03-10-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team addressed issues with committing complex UTxOs into a\nHydra Head, prepared the hydra-node to be run on mainnet (soon) and improved\nthe test suite of the hydra-plutus scripts. The specification is constantly\ngetting improved upon reviewer feedback on overleaf - this week the graphical\nnotation was refined to be more transaction-focused.

    What did the team achieve this week

    • Clarified bug of committing UTxOs with reference scripts to a Hydra head #737
    • Prepare usage of hydra-node on mainnet by updating command line options #715
    • Improved our mutation test suite to all expected errors #705
    • Re-opened our persistent hydraw demo head on preprod using version 0.9.0
    • Updated on-chain graphs to be more transaction-focused in the specification

    What are the goals of next week

    • Complete mainnet compatibility feature
    • Prepare the Hydra workshop
    • Address all todo’s in the Hydra specification
    • Unblock the auctions project with commit from script a solution
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-10-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-03-10T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-03-09-mithril", + "content_html": "

    High level overview

    The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano mainnet and computes the stake distribution with the optimized unreleased Cardano CLI command.

    Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup.

    Low level overview

    • Worked on the epic that implements eras behavior switch #707:
      • Completed the deployment of the era behavior switch to the test networks #752
      • Completed the enhancement of datum generation for era markers #786
      • Worked on handling the API version with an era switch #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Worked on the migration/adaptation of the stake_pool table #787
    • Completed the refactoring of errors in the signer and aggregator state machines #665
    • Worked on testing Mithril with a mainnet Cardano network #777
    • Worked on fixing bugs with the Docker client image:
      • Fixed a bug that made the Docker client container crash at startup #769
      • Fixed a bug that prevented the restoration of a snapshot with a Docker client #791
      • Worked on testing the Docker client in the Mithril Client multi-platform test workflow #794
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-09-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-03-09T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-03-08-consensus", + "content_html": "

    High level summary

    The Consensus team continued working on refactoring and improving the UTxO-HD\nprototype, and introducing improvements to the lmdb related packages. In\nparticular we identified an opportunity to gain performance by handling locks in\na more optimal way.

    On the Genesis front, we sketched a mitigation for an issue that PNSol and\nResearchers caught. We also came op with a road map for not only testing the\nGenesis prototypes, but also for enriching the tests we already have.

    Regarding technical debt, next to some minor improvements, we created\ncomponent-level micro-benchmarks for adding transactions to the mempool. The\nresults of these benchmarks will be published in the ouroboros-consensus web\npage.

    We also finished moving the Consensus documentation to the ouroboros-consensus\nrepository, released ouroboros-consensus 0.3.0.0, and reduced the time\nGitHub actions take in ouroboros-network.

    Workstreams

    UTxO HD Prototype

    We continued working on refactoring and improving the UTxO-HD prototype. As a\nresult of the first round of sytem-level benchmarks, we identified an\nopportunity to optimise the way we handle locks to improve performance\n(#4393).

    Also, we introduced several improvements to the lmdb related packages:

    Genesis

    We sketched out a mitigation of the issue that PNSol and Researchers caught in\nthe Genesis design.

    We came up with a road map for testing the Genesis prototypes, including early\nmilestones that are applicable to today's master branch, ie tests that are\nuseful before Genesis, and that will be nicely enriched when we do add Genesis.

    We developed the aforementioned tests, specifically a QuickCheck generator for\nthe Honest leader schedule and one as-aggressive-as-possible Adversarial\nleader schedule that together satisfy the Praos properties that the Consensus\ndesign takes as invariants.

    We investigated why the improved ChainDB queueing implementation behaves\ndifferently in the baseline compared to the prototype, and we are close to\nhaving a full picture of how the Consensus components interact during bulk sync.

    Technical debt

    We created component-level micro-benchmarks for adding transactions\nto the mempool. We plan on extending this to more mempool actions and different\ntypes of blocks. We store the benchmark data to make it available\nto the GitHub action that publishes the benchmarks results.

    Other minor improvements include:

    • Removal of Test.Util.Classify in favour of Test.StateMachine.Labelling.
    • Addition of -Wunused-packages to the default ghc-options for Consensus\npackages.

    Fostering collaboration

    We finished moving the Consensus documentation from\nouroboros-network to ouroboros-consensus, in preparation for\nmigrating the code to the latter repository.

    Support

    We released ouroboros-consensus 0.3.0.0.

    We reduced the load in the ouroboros-network GitHub actions,\nthereby reducing the time CI jobs take.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-08-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-03-08T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-03-08-node-cli-api", + "content_html": "

    2023-03-08 - 2023-03-21

    High level summary

    General bug fixes and some refactoring

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-08-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-03-08T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-03-08-performance-and-tracing", + "content_html": "
    • Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.
    • New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users.
    • Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination.
    • Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation.
    • Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.

    Performance

    1.35.6 release

    Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health.

    Analysis pipeline

    Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better\ndifferentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance.\nAdditionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking\ndata more easily accessible.

    Open Sourcing

    As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable\nthird parties to make use of that data much more easily, by having reliable guidelines and a working example.

    Tracing

    The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make\nthe switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process.

    Infrastructure

    Nomad backend

    The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-08-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "* Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.", + "date_modified": "2023-03-08T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-03-03-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit.
    • cardano-base: BLS branch is now ready for review. We are workign forward its merge.
    • KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase.
    • Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs

    Low level summary

    Mithril

    • Bumped to version 0.2.0 the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using mlock.
    • Opened PR#783 to update dependency
    • Improved testing for batch opening of mtree, PR#773
    • Improved testing for batch verification of STM sigs PR#774
    • RFP for crypto audit almost ready.

    cardano-base

    • BLS12-381 branch finally ready for review PR#266

    KES agent

    Team off for one week. Other progress:

    • Learning about raw direct-bearer abstraction. An interface for sockets in consensus.
    • use that for direct ser/deser
    • written those syntaxes for ouroboros (coming PR)
    • the kes agent will depend on that. \t

    Sidechains

    Progress with familiarisation of Halo2 library to write circuits.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-03-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-03-03T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-03-03-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one\ntechnical report, improving the deltaQ tutorial, consulting on\nperformance design, and the Djed paper has been accepted for\npublication.

    Details

    • Preparing draft of DeltaQSD algebra paper for FORTE 2023

    • Extending the technical report on which the above paper is based

    • Consulting with an external company on performance engineering of Plutus contracts

    • Planning improvements and collecting material for the deltaQ\ntutorial based on experience with systems that manage risk at\nmultiple timescales

    • Preparing sections on the communication language and idempontency\nlaws for draft paper about verifying design refinements for\ndistributed system design

    • Studying Cardano chain sync protocol

    • \"Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin\nProtocol\" has been accepted for publication at IEEE ICBC 2023

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-03-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-03-03T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-03-03-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team released version\n0.9.0 - a version\nof the hydra-node with fully specified behavior of on-chain scripts and\noff-chain head-logic, decreased costs for opening/closing a Head and scalable\ncontestation deadline semantics. Check out the full release notes for details.

    Furthermore, they published the monthly\nreport of the Hydra project\nand conducted a review meeting with an increasingly wider audience. The team\nplans to extend invitations through the new Hydra\n#announcements discord channel for the next\nmonths, stay tuned!

    What did the team achieve this week

    • Monthly review meeting with report published on website
    • Fixed smoke tests #726
    • Reduced the cost of opening/closing a Head (error codes #748 + head reference script #701)
    • Released version 0.9.0
    • Conducted a first experiment on mainnet compatibility #713
    • New discord category with #announcements channel
    • Received a demo about the Hydra for Voting project
    • Lightning talk on mutation-based testing (to be shared)
    • New themes view in on our roadmap and some rearranging as we align it with high-level objectives
    • Clarified things with researchers, but mostly identified action items for them

    What are the goals of next week

    • Redraw transaction graphs and address TODOs specification
    • Run hydraw with 0.9.0 on preprod
    • Make smoke tests on mainnet possible
    • Groom the explorer item
    • Unblock the auctions projecth with commit from script a solution
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-03-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-03-03T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-03-03-ledger", + "content_html": "

    High level summary

    We have focused the last two weeks on CIP-1694, integration of the last several months of ledger\nwork into consensus and node, and testing infrastrutcture that we will use in the conway ledger era.

    Low level summary

    Conway rules

    We made a major update to the conway era so that the implementation is now in sync with the spec\nwith respect to the ratification and enactment logic.

    See the notes in pull-3291 for more details.

    Constraint based generators

    This week we hit a major milestone in our efforts to build out better property based testing\nsupport for the main ledger properties.\nThe new constraint based generators can now generate full ledger states with what is probably\nvery close to the real constraints (if anything, it is under constrained).\nNext we will work on generating a transaction in the context of a ledger state, which would allow\nus to actually start using these generators for real tests.

    See pull-3219.

    Preparing a release, now with proper versioning

    After quite some time, we are ready to release a version of ledger that will work with a new\nversion of consensus, using CHaPs.

    See pull-3308.

    Technical debt

    • We cleaned up the redeemer serialization code (to prevent future mistakes). See pull-3269.
    • We added a note to the Alonzo spec, specifying that the transaction inputs are\nlexicographically ordered in the Plutus script context. See pull-3306.
    • We fixed a problem with the address deserialiazation\n(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway).\nSee pull-3307.
    • We fixed a problem with our nix build. See pull-3311.
    • We fixed a problem with our NoThunks tests. See pull-3310.
    • We improved our nightly tests. See pull-3316.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-03-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-03-03T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-03-02-network", + "content_html": "

    High level summary

    In the current sprint the networking team focused on fixing bugs and pushing\nforward implementation of eclipse evasion. We also found a bug in our\nsimulation testing setup (in integration of test node). We also overviewed the\nwork on extending handshake protocol which is delivered by Galois Inc.

    We published ouroboros-network-0.4.0.1 and\nouroboros-network-protocols-0.3.0.0 to CHaP.

    We also fixed a bug in cardano-node which results in not being able to\nconfigure inbound connection limits, see PR #4902.

    Together with Karl Knutsson (CF) we realised an issue in cardano-cli: it's\nvalidation of DNS names, IP address & ports when registering a stake pool\nshould be more strict to protect against common mistakes which we identified on\nthe chain. See issue #4929.

    Detailed work log

    In PR #4385 we fixed two bugs in peer state actions. First one results in\na busy loop if demotion from hot to warm times outs. This busy loop is\neventually exited when mux exits (we reported this in our previous report).\nThis fix made it to 1.35.6 release as well.

    In addition the PR #4385 also fixes another bug which results in hot -> warm\n-> hot demotion / promotion busy loop.

    The PR #4385 also fixed a bug in a node only used in simulation which\nresulted in not using chain-sync or block-fetch mini-protocols. In the\nreview process, we realised that the header-body split in the simulated node\nrequires further work (see PR #4419, which is under review).

    The PR #4385 also extend our generators, which together with the above fix,\ncover the hot -> warm -> hot demotion / promotion busy loop.

    In PR #4419 we introduce a ChainDB for our simulation node, which plays\nsimilar role to ChainDB in the ouroboros-consensus: a persistent (across\nsimulated restarts) store of blocks which does chain selection. This ensures\nthat the simulated node is using block-fetch to download blocks announced by\nchain-sync mini-protocol.

    We also made progress with reviewing PR #4019 - peer sharing.

    We also fixed issue #4370 - a connection manager test failure, see PR #4384.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-03-02-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2023-03-02T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-02-24-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team continue closing many gaps and aligning the\nimplementation with the specification. More over, they have groomed a plan to\nmake Hydra Mainnet compatible. Also, they continue moving forward with the\ninternal auditing and have published some auditing guidelines to receive\ncontributions from the community.

    What did the team achieve this week

    • Completed #452 (what is\nremaining in there)
    • Aligned the Head protocol logic implementation with the specification
    • Completed full minting policy implementation and spec\n#720
    • Clarified message authentication with researchers
    • Groomed what is left to do for Mainnet compatibility\n#713 and drafted a\n0.10.0 version
    • Added a tutorial by @perturbing to the\nwebsite LINK
    • Published auditing guidelines\nLINK
    • Made hydra-node work for macos\n#746 and added support\nfor building on aarch64\n#673
    • Met with a potential customer of Hydra for Payments

    What are the goals of next week

    • Have the monthly review meeting incl. the report
    • Have smoke tests fixed and running regularly
    • Release 0.9.0 with updated scripts
    • Redraw transaction graphs for specification
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-24-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-02-24T00:00:00.000Z", + "author": { + "name": "Franco Testagrossa", + "url": "https://github.com/ffakenz" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-02-23-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2306.0 distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes’ CLI that allows generating and signing an era marker’s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI.

    Low level overview

    • Released the new distribution 2306.0
    • Completed the epic that implements signer versions deployment monitoring #718:
      • Completed the implementation an event producer/consumer via channel #738
      • Completed the creation of a database and its configuration to save the events on the consumer side #740
      • Completed the creation of events and sending them on the channel on the producer side #741
      • Completed the creation of the signer registration event #742
      • Completed the creation a query to extract the node versions stakes distribution #743
    • Worked on the epic that implements eras behavior switch #707:
      • Completed the loading of era reader adapters from config in the signer and the aggregator #732
      • Completed the implementation of an era cli command in the aggregator #755
      • Completed the implementation of a dynamic matrix of cases in CI end to end tests #760
    • Fixed some bugs:
      • Fixed the unsupported unixepoch() function #757
      • Fixed the problem that prevented some signers from signing on the testing-preview network #730
      • Update SQLite version to 3.40 in aggregator infrastructure #765
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-23-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-02-23T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-02-23-performance-and-tracing", + "content_html": "
    • SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.
    • Release benchmarking: we performed a round of benchmarks for the 1.35.6 release.
    • UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup.
    • New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities.
    • Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure.
    • Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.

    Performance

    SECP

    1. For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead.
    2. The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run.
    3. The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking.

    UTxO-HD

    1. After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop.
    2. We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.

    1.35.6 release

    Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health.

    Tracing

    Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible.

    Infrastructure

    Nomad backend

    1. Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients.
    2. Locality assumptions were removed and job monitoring was refactored.
    3. To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster.
    4. We're currently evaluating different options for genesis distribution in said cluster.

    NixOps backend

    The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-23-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "* SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.", + "date_modified": "2023-02-23T00:00:00.000Z", + "author": { + "name": "Michael Karg", + "url": "https://github.com/mgmeier" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-02-22-consensus", + "content_html": "

    High level summary

    During the past two weeks we got the results from the system level benchmarks\nfor UTxO HD. They showed a substantial performance regression, so we spent some\ntime analyzing the results. We found out the frequency at which ledger snapshots\nwere taken was too high, so we requested the benchmarking team a new run with a\nmore realistic snapshotting policy. We continued refactoring and improving the\nprototype, and we released UTxO-HD related packages to CHaP.

    We met with IOG researchers and networking specialists to discuss the Genesis\ndesign, which was well received. We continued working on testing and\nbenchmarking different Genesis prototypes.

    We are also working on solving a test failure related to iterators. This work\nderived in several improvements such as better documentation, a framework for\nwriting unit (and regression) tests, and the possibility of debugging\nQuickCheck counter examples in the REPL.

    Finally, we released ouroboros-consensus 0.2.0.0 and\nouroboros-consensus-cardano 0.3.0.0 to CHaP

    Workstreams

    UTxO HD Prototype

    We got the results of the first system level benchmarks for UTxO HD. They seemed\nto indicate a significant regression in performance. After looking into the\nbenchmark logs we found that the benchmark runs took ledger state snapshots too\noften, due to the default snapshotting policy depending on k, and k being so\nsmall in the benchmark runs. Therefore, the next step is to re-run the\nbenchmarks with a snapshotting policy that more closely resembles the one from\nmainnet.

    At the same time, we continued refactoring and cleaning up the prototype.

    Also, we prepared the anti-diff packages (fingertree-rm, diff-containers,\nsimple-semigroupoids) and the lmdb related packages (cardano-lmdb and\ncardano-lmdb-simple) to CHaP.

    Genesis

    The Genesis design was presented to the IOG researchers and Peter Thompson from\nNSol. It was well received. They pointed out one blindspot, but we think it'll\nbe relatively simple to mitigate.

    In parallel, we continued developing test and benchmarks for the Genesis\nprototypes. I particular we tested and implemented a potential fix for\nincreased ChainDB dequeue timings, which partly\nbehaved as we expected, but still needs further investigation. Also we obtained\nnew benchmarking data for the prototype.

    Technical debt

    Related to #4183, we developed a DSL for specifying\nChainDB unit tests. This will allow us to better understand the\ncounter-examples returned by QuickCheck tests, and to write regression\ntests for them. Also, we added a module to enable\nQuickCheck counter-examples to be run on the REPL, allowing for faster debugging\nfeedback. Also, we improved the documentation related to followers\n(#4372).

    We are also working on a design for optimizing the way we handle blocks from the\nfuture.

    Support

    We released ouroboros-consensus 0.2.0.0 and ouroboros-consensus-cardano\n0.3.0.0 to CHaP. Remember that we decided to split the packages related to\nConsensus into two bundles, one with the core functionality, Cardano-agnostic\ncode, and another bundle with instantiations specific to Cardano.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-22-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-02-22T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-02-22-node-cli-api", + "content_html": "

    2023-02-22 - 2023-03-07

    High level summary

    General bug fixes

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    Documentation

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-22-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-02-22T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-02-21-db-sync", + "content_html": "

    High level summary

    The db-sync team created a new tag 13.1.0.2 which is ready to release.\nWe also investigated and had the first working UTxO-HD integration which is one\nof the potential future risks for db-sync.

    Low level summary

    • Integrated the UTxO-HD feauture branch in kderme/utxo-hd-1. This doesn't\nuse the full on disk storage but keeps things in memory and the plan is to keep\nit this way for the first iteration. The integration still has some performance\nissues which we investigate
    • Created tag 13.1.0.2 which upgrades the dependencies of db-sync
    • Fixed an issue related to errors appearing in SMASH\n#1353
    • Continued with ghc-9.2 integration\n#1339
    • Worked on an new fixing procedure for\n#1348.\nWe try to make these procedures work also on older schema version, without the\nneed to migrate to newer schema, which can be very useful for fixing existing\nsnapshots.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-21-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-02-21T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-02-17-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration.
    • cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: started implementation in rust.

    Low level summary

    Mithril

    • Transmute helpers merged PR#722
    • We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope.
    • We are working in a modification of KES to require caller to allocate the secret key buffer.
    • Proposed a solution for signer registration of Mithril.

    cardano-base

    • Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 proof.
      • Results are promising, with using only 23% of the execution budget to verify a realistic proof.
      • Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril.
    • KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this.
    • Conversion finally merged PR#344.

    KES agent

    • Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation
    • Figuring out how to go from fake file descriptor to write the raw bytes

    MuSig2

    • Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-17-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-02-17T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-02-17-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one\ntechnical report, distributivity properties of deltaQ, and consulting\non performance design with the Marlowe team.

    Details

    • Processing reviews on performance engineering paper and planning\npaper revisions accordingly

    • Investigating distributivity properties of DeltaQ

    • Preparing sections on the thorn calculus and idempotency laws for\ndraft paper about verifying design refinements for distributed\nsystem design

    • Consulting on performance design with Marlowe team

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-17-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-02-17T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-02-17-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team completed work on dealing differently with contests\nduring the contestation period. These will now always push out the deadline and\nhence contestation periods are easier to pick (depending on the network a Head\nruns on). Furthermore, they added an important acceptance test and completed\ninternal refactoring of the protocol logic making future changes easier.

    What did the team achieve this week

    • Push contestation deadline on each contest #716
    • Wrote an acceptance (property) test can always close/fanout when collect is successful
    • Internal refactoring of our HeadLogic
    • Groomed remaining things from #452 into dedicated features

    What are the goals of next week

    • Complete full minting policy #720
    • Release 0.9.0 with updated scripts
    • Plan mainnet milestone and a 0.10.0 version
    • Redraw transaction graphs for specification (upon feedback)
    • Have smoke tests fixed and running regularly
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-17-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-02-17T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-02-17-ledger", + "content_html": "

    High level summary

    This past two weeks saw many months worth of ledger changes integrated with the cardano-base\nand ouroboros-network repositories.\nThe vast majority of the effort involved all the changes to the ledger serialization libraries\n(and the interplay with cardano-base) which now support proper versioning.\nSupporting the conway ledger era, and in particular allowing the ledger state to transition\nto a whole new system of governance, also played a noticeable part in the integration.

    Besides the integration work, the team continues to address technical debt, improve the\ndocumentation, make our testing infrastructure better (such as experimenting with better\nnightly tests), and formally specifying more parts of CIP-1694.

    Lower level summary

    Integration work

    Below is all the integration work completed, which will enable a release to node from\nthe current ledger master. Many thanks to\nAlexey for this colossal undertaking!

    Technical debt

    Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted\nin the CBOR specification. See pull-3241.

    We now have our .cabal files being checked for a consistent formatting given by\ncabal format in our CI. See pull-3286.

    We are still experimenting with better nightly tests for our long running\nproperty based tests. See pull-3276 and pull-3296.

    Small documentation improvements

    The hand proofs of the preservation ADA property have been added back to the\nShelley ledger specification. See pull-3295.

    We have clarified how the script integrity hash is computed in the CDDL description.\nSee pull-3290.

    Specifying CIP-1694

    Our new formal specifications backed by Agda have seen a lot of progress!\nUpgrading to Agda 2.6.3 fixed our main build infrastructure problems,\nand we no longer have to rely on our custom fork. See pull-50.

    Our progress on formally specifying CIP-1694 can be followed here:

    Constraint based testing

    We are still actively working on our new constraint based property testing framework.\nWe have nearly all of the constraints for an entire ledger state\nhooked into generators, and tests that the generators do indeed obey the constraints.\nThe variable count in the constraints is over 100!\nThere is still much work to do on shrinking, making the generators faster,\nand writing actual property tests for the ledger, but the approach still seems viable and\nwe are hopeful that it could replace our trace generators.\nThe WIP can be followed here: pull-3219.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-17-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-02-17T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-02-17-network", + "content_html": "

    High level summary

    Recently QA found a bug in P2P code, which results in busy loops. We added one\nfix to 1.35.6 release, another one will likely be part of next release. The\nfirst one is already included in ouroboros-network-0.3.0.1 release. These\nbugs could only affect nodes which are out of sync and thus should not impose\nrisk on well maintained nodes on mainnet. We also advertise to deploy at most\none of the relays as a P2P node, which shields from possible consequences.

    We recently finished design phase of eclipse evasion and we started\nimplementing it (see issue #3886 for progress).

    Galois finished implementing Handshake extension which will allow to query\nnetwork protocol versions (see pr #4256).

    We also recently released a newer set of network packages to be integrated with\ncardano-node master branch, this includes:

    * monoidal-synchronisation-0.1.0.2
    * cardano-client-0.1.0.2
    * network-mux-0.3.0.0
    * ouroboros-network-api-0.1.0.0
    * ouroboros-network-protocols-0.2.0.0
    * ouroboros-network-testing-0.2.0.1
    * ouroboros-network-mock-0.1.0.0
    * ouroboros-network-framework-0.3.0.0
    * ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included
    in `0.3.0.1`)
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-17-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2023-02-17T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2023-02-10-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team closed several gaps to align the Hydra scripts\nimplementation further with the specification. This also resulted in a slight\nimprovement on Hydra script size and costs. They consequently analysed the\nasymptotic complexity of collect and fanout and how they relate. Also plutus-tx\nprofiling toolchain was evaluated and set up for future improvements on Hydra\non-chain performance. In discussions with researchers and internal auditors,\nthey also uncovered next steps on further securing the Head protocl using a\n\"full\" minting policy.

    What did the team achieve this week

    • Closed several gaps to align script implementation with specification #452
      • Allow contest only once #680
      • Optimization through head output at index 0 #700
      • Value is preserved #702 + optimized exact value equality #709
    • Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to #721
    • Fixed our tooling around the Haskell language server
    • Discussed full minting policy with researchers
    • Started grooming “what we need for mainnet” on this idea ticket and milestone

    What are the goals of next week

    • Implement full minting policy
    • All remaining protocol discrepancies are implemented or groomed as individual features
    • Ideally release 0.9.0 with updated scripts
    • Discuss what we need for mainnet (milestone planning)
    • Redraw transaction graphs for specification (upon feedback)
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-10-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-02-10T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-02-09-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2304.1 distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store.

    Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version 1.35.5 on their devnet and infrastructure.

    Low level overview

    • Released the new distribution 2304.1
    • Fixed a bug that prevented some signers to sign with 2304.0-prerelease #716
    • Completed the implementation of an EraChecker that checks if an era is active #708
    • Completed the implementation of an EraReader that gathers era activation data #709
    • Completed the implementation of an EraReader adapter with on chain transaction as source #710
    • Completed the relational design of the aggregator store #476
    • Completed adding a new SPO on the testing-preview network #729
    • Completed the upgrade of the Cardano node to 1.35.5 #725
    • Fixed flakiness in the CI #734
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-09-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-02-09T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-02-08-consensus", + "content_html": "

    High level summary

    We continue refactoring the UTxO HD prototype while we wait for the system level\nbenchmarks. We have created a new repository that contains the anti-diff\npackages used in this prototype.

    On the Genesis front, we are preparing another meeting with the researchers to\naudit the implementation design, and we continued working on basic tests and\nsimplifications.

    During the past two weeks we also introduced two new tools. One for dumping CBOR\nencoded blocks to JSON, and another to serve a local immutable DB.

    Workstreams

    UTxO HD Prototype

    We are in the process of refactoring the UTxO HD prototype, while we wait for\nthe system level benchmarks to confirm if the performance of the prototype is\nsatisfactory.

    We also set up a repository for the anti-diff package, which\nrequired us to refactor the code, write documentation, and prepare a release to\nCHaP.

    Genesis

    We worked on basic tests for the Limit on Eagerness property of\nGenesis. We also introduced further robustness and simplifications in the\nGenesis Density governor. Finally, we developed a presentation to engage again\nwith the researchers on our Genesis implementation design.

    Technical debt

    Fostering collaboration

    We are in the process of polishing the ouroboros-consensus\ndocumentation site, which we will use a the entry point for Consensus related\ndocumentation. The first version will not be complete, but we plan on\nsystematically improving it.

    Support

    We added a tool to ouroboros-consensus-cardano-tools which allows\nto dump the Chain DB blocks or any given CBOR encoded blocks as JSON.

    We also added another tool that serves an existing immutable DB via\nBlockFetch and ChainSync. This tool can help in assisting our local benchmarking\nefforts (for instance Genesis' ChainSync jumping prototype).

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-08-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-02-08T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-02-08-node-cli-api", + "content_html": "

    2023-02-08 - 2023-02-21

    High level summary

    More maintenance and resolving raised issues.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-08-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-02-08T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-02-08-performance-and-tracing", + "content_html": "

    High level summary

    1. SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions.
    2. Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks.
    3. New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node.
    4. New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide.
    5. Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live.
    6. Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on.
    7. Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.

    Performance

    We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:

    • we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,
    • after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,
    • finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.

    In addition, we started benchmarks of the 1.35.6 release.

    Tracing

    A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way.

    Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting.

    Infrastructure

    On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders.

    The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment.

    The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-08-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-02-08T00:00:00.000Z", + "author": { + "name": "Serge Kosyrev", + "url": "https://github.com/deepfire" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-02-03-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril.
    • cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.

    Low level summary

    Mithril

    • Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing PR#722
    • We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper.
    • We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.

    cardano-base

    • There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381.
    • The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner.
    • The update VRF PR#341 is finally merged, and we are ready to merge PR#344, which implements conversion functions from the compatible types between Praos and PraosBatchCompat.

    KES agent

    • Use of snockets to send the data directly from the socket to secure memory.
    • We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives
    • Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.

    MuSig2

    The GitHub Action linelint is used to check the files.

    • A new job for linting is added to the file /.github/workflows/ci.yml. The rules are configured in the file /.github/workflows/.linelint.yml. Some files from the configuration of libsecp were failing, so in the rules in .linelint.yml the failing files are denoted to be ignored by the linter.
    • Folders are reorganized. We created a folder to handle the example. This folder includes the examplemusig2.c, a distinct config.h, and helper.c. The example is enhanced by implementing the functions in the helper for the configuration given in config.h. The number of messages is different than the tests. The example is made more generic to run with a loop.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-03-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-02-03T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-02-03-goedel", + "content_html": "

    The team works on applied research and consulting in formal methods\nthat is directly applicable to evidence based engineering in Core Tech\nand beyond.

    High level summary

    This sprint the team has been preparing several papers for peer review\nand knowledge sharing and consulting within IO and the community.

    Details

    • R&D Seminar on experience participating in a member based organisation
    • Full day tutorial on performance engineering presented at HiPEAC\n2023 conference
    • Finished preparing and submitted a paper on performance engineering\nto an ACM workshop
    • Preparing a draft paper for future submission about verifying design\nrefinements for distributed system design
    • Consulting on performance design of other IO projects
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-03-goedel", + "title": "Goedel Team Update", + "summary": "The team works on applied research and consulting in formal methods", + "date_modified": "2023-02-03T00:00:00.000Z", + "author": { + "name": "James Chapman", + "url": "https://github.com/jmchapman" + }, + "tags": [ + "goedel" + ] + }, + { + "id": "2023-02-03-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team completed the Hydra specification with a section about\nrollbacks and updated graphs\n(#448). In a next step,\nthe specification will be made more approachable and an open standard. They\nimproved their hydra-cluster tool to launch a local --devnet sandbox\nenvironment and continued aligning the hydra-plutus scripts with the\nspecification by hardening the checks on close and contest transactions.

    What did the team achieve this week

    • Completed the specification with a section about rollbacks and updated graphs\n#448, with a follow-up on making it more approachable and an open standard.
    • Continued spec review with internal auditor and incorporated changes.
    • Talked to TxPipe about how Demeter and Hydra could work together
    • The hydra-cluster executable can be used to launch a local --devnet sandbox environment.
    • Reproduced the “head being stuck on network outage” bug
      • relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed.
    • Progressed with higher velocity by addressing more and more gaps #677

    What are the goals of next week

    • Upstream our JSON instances to the ledger
    • Close all transaction security related on-chain gaps
    • Ideally release 0.9.0 with updated scripts
    • Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-03-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-02-03T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-02-02-ledger", + "content_html": "

    High level summary

    Much of the work the past two weeks involved integration efforts,\ncleaning up and debugging some serialization issues,\nadding tests, and work on large projects that are still ongoing.\nWe also released a CIP this week that aims to make the ledger\na registered CIP category.

    Lower level summary

    Ledger evolution CIP

    We published a\nCIP\nthat will make the Cardano ledger a registered category of the CIP process.

    Serialization issues

    We had previously thought that we had found a serialization problem with the redeemers,\nbut it turned out to just be particularly confusing code.\nWe have now clarified the issue for the future.

    See pull-3263, pull-3269, and pull-3268.

    Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps.

    See pull-3277.

    New tests

    We added a new property test suite for some of our custom containers.

    See pull-3270.

    Progress on a better cost model serialization situation.

    We are still working our way through issue-2902.\nTowards this end, we are now properly gating the new flexible encoders\nuntil version 9.

    See pull-3274.

    Nightly tests

    We are still experimenting with moving more CI actions to GitHub actions.

    See pull-3276.

    Constraint based generators

    We continue to add to our proof of concept for constraint based generators.\nSee the previous ledger update for more information about this project.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-02-02-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-02-02T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-01-27-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team had a monthly review meeting with their stakeholders,\ncontributors and interested people from the community. The monthly repot for\nJanuary 2023 is a digest\nof the things presented and also includes a summary of the meeting. The Hydra\nspecification was getting discussed and the team is incorporating suggested\nchanges of reviewers. Last but not least, they compute and publish script\ninformation on every PR and also on the\nwebsite\nnow.

    What did the team achieve this week

    • Had the monthly review meeting with a broader audience
    • Published the monthly report for January 2023
    • Reviewed the spec and discussed individual aborts with researchers
    • Compute and publish script information along benchmarks on every PR and website

    What are the goals of next week

    • Add rollback section to Hydra spec, update pictures and publish it as part of repository
    • Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository.
    • Groom & plan actions required for a maintainable Head explorer + break down align gaps feature.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-27-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-01-27T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-01-26-mithril", + "content_html": "

    High level overview

    The Mithril team released a new 2302.0 distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes.

    Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node.

    Low level overview

    • Released the new distribution 2302.0
    • Implemented a backward/forward compatibility mechanism for API messages #688:
      • Implement the mechanism for the signer registration #689
      • Implement the mechanism for the signature registration #693
      • Implement the mechanism for epoch settings #695
      • Implement the mechanism for certificate pending #696
      • Implement the mechanism for certificate #697
      • Implement the mechanism for snapshots list #698
      • Implement the mechanism for snapshot #699
      • Update enforcement of API version with Semver #705
    • Completed the PoC implementation of backward compatibility with protobuf #677
    • Completed the PoC implementation of backward compatibility with avro #678
    • Completed the PoC to Read/Write transaction on chain for Era activations #672
    • Completed the upgrade Cardano devnet to 1.35.4 #523
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-26-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-01-26T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-01-25-consensus", + "content_html": "

    High level summary

    During the past two weeks, the consensus team finished the testing activities\naround the UTxO-HD prototype. This is a very important milestone which will\nenable us to run system-level tests and benchmarks, as well as start refactoring\nand cleaning the prototype. Regarding our Genesis workstream, we elaborated a\nroadmap that gives an indication of the remaining work. We also continued our\nwork on benchmarking chain-sync-jumping. We also continued working on improving\nthe way we handle blocks from the future, and advancing the integration of the\nnew VRF and KES crypto.

    Workstreams

    UTxO HD Prototype

    As the prototype is nearing its completion, it was important to have enough\nconfidence that we will be able to move additional parts of the ledger state\nonto disk. We worked together with the Ledger team to elaborate a\nsketch on how the UTxO-HD design would accommodate the migration of\nadditional data from memory to disk. This gave us enough confidence that the\ncurrent architecture will be extensible in the future.

    On the testing front, we added property-based tests for the UTxO-HD\ntype classes.

    We also enabled disabled components, and addressed several\ntechnical debt issues:

    • Implement splitSized anti-diff split (#4269), and integrate it\ninto consensus (#4273).
    • Renaming of peekVal to peekMDBVal (#7).

    We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We\nfound a race condition in the LMDB backing store, which we fixed.\nAfter the fix we were able to successfully run these benchmarks. The results\nwere published by this pull request.

    We used our db-analyser tool to benchmark the cost of reading keys and\nflushing values to disk. The following plot shows the duration of these disk\noperation in relation to the main ledger operations, where we can see that the\ncost of the former are comparatively low. The spike at the beginning of the\ngraph is when, at the start of the Shelley era, the entire UTxO set is flushed\nto disk.

    \"UTxO-HD

    After months of hard work adding tests for the prototype, we are ready to run\nend-to-end tests on the node, and system level benchmarks. This signals a very\nimportant milestone for the UTxO-HD workstream 🎉.

    Genesis

    We elaborated a high-level decomposition of the remaining\nwork for Genesis. We also continued benchmarking the chain-sync-jumping\nhappy-path.

    Technical debt

    We continued working on improving the way we handle blocks from the future.

    Support

    We completed the mapping of Crypto to HeaderCrypto and body Crypto.\nHeaderCrypto is moved to cardano-protocol-tpraos. We created a draft pull\nrequest to facilitate compiling consensus.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-25-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-01-25T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-01-25-node-cli-api", + "content_html": "

    2023-01-25 - 2023-02-07

    High level summary

    General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the cardano-cli query stake-snapshot command.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-25-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2023-01-25T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2023-01-20-crypto", + "content_html": "

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We explored whether some uses of transmute could be removed, but it resulted in considerable regression.
    • cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision.
    • KES agent: An inconsistency between contra-tracer available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the contra-tracer used by consensus.

    Low level summary

    Mithril

    • We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average PR#675. We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing.
    • We are writing a RFP for the audit of the core library.

    cardano-base

    • A problem with Nix is blocking merge of PR#341
    • Plutus team ran benchmarks of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution.
    • Team is fully digesting the Plonk paper.
    • There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used.

    KES agent

    • A little unforseen delay has been caused by a mismatch in the use of contra-tracer. The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are doing the change, but still the CI is not happy.
    • The same was needed for the KES agents prerequisites PR#317.
    • We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-20-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-01-20T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-01-20-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1\nspecification. Of which a first version has been aggregated and is currently\nunder review. They aligned the on-chain scripts of reimbursing funds on abort\nlike defined in the specification, improved the mutation test framework to have\nmore control when testing plutus scripts. The added HeadId in the API and the\nTUI example client make hydra-node easier to use and a first experiment of a\nHydra Head explorer was showing the utility of this - see what Heads exist on\nthe preview network here.

    What did the team achieve this week

    • HeadId to API and display in the TUI #678
    • Experiment of creating a hydra explorer, first result hosted here
    • Improved mutation framework allowing to fail for the right reason #679
    • Correctly reimburse funds in abort (matching the spec) #670
    • Finished a first write-up of the Hydra HeadV1 spec: Read it on overleaf (Communication channels for feedback)

    What are the goals of next week

    • Monthly review meeting with a broader audience
    • Groom & plan actions required for a maintainable Head explorer
    • Break “align gaps” feature into smaller chunks (at least on- /off-chain) and groom it
    • Review the spec & discuss individual aborts with researchers (a bigger open question)
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-20-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-01-20T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-01-20-network", + "content_html": "

    High level summary

    We have been working towards cardano-node-1.35.5 release. QA & benchmarking\nteams gave a green light for the release, and we made decent progress with some\nCI problem which we encountered on the way (PR #4612). We are also working on\npeer sharing, making improvements in our testing infrastructure, reducing\ntechnical debt and making progress towards io-sim-1.0.0.0. Galois is making\nprogress on Handshake improvements.

    Low level summary

    Our diffusion simulation network now includes a mixed network of initiator\nonly and initiator and responder nodes. issue #4222

    We are now reviewing the peer sharing pull request.

    We are also reviewing pull request which introduces handshake query flag. PR #4256

    We fixed a bug in our network simulator. The bug was triggered when a node\ndied when performing a simultaneous TCP open (a corner case of a corner case!). PR #4265

    We also refactored Snocket interface and removed the bearer construction from\nits methods. PR #4260

    We are working towards releasing io-sim-1.0.0.0 on Hackage, which includes\nreviewing two PRs: PR #57 and PR #60 as well as writing an announcement\nblog post.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-20-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2023-01-20T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network", + "release" + ] + }, + { + "id": "2023-01-20-sre", + "content_html": "

    High level summary

    The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing\nsupport for cardano-world.

    Lower level summary

    Cicero

    • Fixed various race conditions around transformers.
    • Brought our CI up to date.
    • Migrated to the Nomad exec driver with Nix support for many actions.
    • Moved Nix builds to the Nomad clients for much better cache locality.
    • Ongoing work on vastly improving the action matching and evaluation speed.

    Tullia

    • Made it easier to support cloning from a PR's fork
    • Update to latest std
    • Add workaround for cgroup issue: nomad#12877
    • github preset: add github.ci.remote and (read|get)Repository functions
    • Fix various issues around CUE handling

    Bitte

    • Upgrade to NixOS 22.11
    • Prototype usage of Colmena for deploys instead of deploy-rs
    • Finalized work on Equinix Metal support
    • Prototype better secrets management with ragenix instead of sops-nix
    • Improve CI and bring it up to date

    cardano-world

    • Fixd various OOM issues on preview and preprod
    • Rotated KES keys on preview and preprod
    • Optimize mainnet db-sync to cope with higher load
    • Fix an issue where PostgreSQL would fail after a reboot

    bitte-world

    • Updated to NixOS 22.11

    ci-world

    • Updated to NixOS 22.11
    • Added Equnix cluster
    • Improve caching of Nix builds
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-20-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2023-01-20T00:00:00.000Z", + "author": { + "name": "Michael Fellinger", + "url": "https://github.com/manveru" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2023-01-19-ledger", + "content_html": "

    High level summary

    The ledger team completed some preliminary ground work in preparation for CIP-1694\n(restructuring the ledger state),\nfixed the PDF hosting problem (mostly the formal specs),\nbuilt out more of the new user-friendly ledger API,\nfinished a proof of concept for constraint-based generators for property tests\n(with the hopes of being able to replace our trace generators one day),\nand addressed technical debt.

    Lower level summary

    Restructuring the ledger state

    The existing governance structures will be replace in the conway ledger era,\nas described in CIP-1694.\nIn particular, the ledger rules will be restructured as follows:

       BBODY
    |
    |-------------------------------|
    v v
    TICK LEDGERS
    | |
    |---------| |
    v v v
    RUPD ~NEWEPOCH~ ~LEDGER~
    | |
    |----------| |--------|-------------------|-----------|
    v v v v v
    ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+
    | | |
    |---------|------------| v |
    v v v DELPL v
    SNAP POOLREAP -UPEC- | UTXO
    |--------| |
    v v v
    POOL DELEG ~UTXOS~

    -..- Removed
    +..+ Added
    ~..~ Modified

    Moreover, the ledger state will also be restructured in accordance with the new rules.\nIn the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT.\nWe have also adapted all the data structures in the ledger state.

    See:

    PDF hosting

    We now build all of our PDFs using a GitHub action which is triggered by pushing a tag\nwith a specific form, cardano-ledger-spec-YYYY-MM-DD.\nThe action creates a GitHub release containing the PDFs.\nThe links in the main ledger README now point to the PDFs in the latest release.

    See:

    Powering the new ledger API

    We have now removed all the HasField instances from the protocol parameter data types,\nand replaced them with lenses.\nThis is probably the last major restructuring that the ledger team will do on the code base\nfor the API for a while\n(the Plutus tools team will be working on it next, see here).\nWe also added a new helpful function ensureMinCoinTxOut.

    See:

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks\nwhich span several epochs, mimicking a real network.\nThese tests are, in theory, excellent for checking properties.\nThey are, however, very difficult to maintain and are not as random as we would like\n(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We would like to switch to tests which instead generate a random ledger state representative\nof not just an initial state, generate a single random valid block, and then test our properties.\nThe hope is that these will be much more random and easier to maintain.

    We have finished a proof of concept are encouraged that this approach could work!

    See:

    Technical debt

    • pull-3244 massive CI speedup
    • pull-3249 better types for fees in the protocol parameters
    • pull-3264 move our annotator code to the cardano-ledger-binary package where it belongs
    • pull-3239 move the Wdrls type to the Core module.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-19-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-01-19T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2023-01-14-db-sync", + "content_html": "

    High level summary

    After spending the last months on improving DBSync and releasing 13.1.0.0 the DBSync team focused\nthe last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the\nnew leger core and ghc-9.2.4

    Lower level summary

    • Integrate CHaP\n#1331
    • Integrate new ledger core 0.1.1.1 and ghc-9.2\n#1332
    • Technical debt: Add code formatter fourmolu\n#1334
    • Preparing and tracking Conway and UTxO integration
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-14-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2023-01-14T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2023-01-13-hydra", + "content_html": "

    High-level summary

    Since last weekly update before christmas, the Hydra team worked on the\ntechnical specification, closed gaps in hydra-plutus scripts, made the unique\nheadId available to Hydra clients through the API, allow the hydra-node to\nexplicitly synchronize from genesis (if configured), and fixed smaller log and\nbuild issues reported by new users.

    Besides this, a retrospective blog\npost\nwas published by Matthias Benkort (CF) on Hydra, summarizing our progress made\nin 2022 also an outlook where Hydra is headed for in 2023. Also, the team had\nsome first sessions on the voting project with Catalyst and the CF.

    A full digest monthly digest for December 2022 can be found on the hydra\nwebsite.

    What did the team achieve this week

    • Had some first sessions on the voting project with Catalyst and CF
    • Published retrospective blog\npost\nby Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also\nan outlook where Hydra is headed for in 2023.
    • Worked on the LaTeX spec for HydraHeadV1, not final or published yet - latest\nversion in this repository.
    • Add unique headId to API and hence make it available to clients.
    • Allow hydra-node to explicitly synchronize from genesis using --start-chain-from 0.
    • Closed gaps in hydra-plutus scripts
      • bounded transaction validity (ADR21)
      • enforcing contract continuity via state token in output
    • Fixed JSON for some logs and smaller build issues reported by new users.

    What are the goals of next week

    • Reach out to have hydra-tutorial integrated.
    • Plan the next couple of months.
    • Complete checking reimbursing of commits in head validator.
    • Align plutus scripts to spec and simplify them (identified some simplifications)
    • Improve mutation framework to be sure we fail tests for the right reasons
    • Complete the spec except the open points (<5) and also discuss them with researchers.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-13-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2023-01-13T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2023-01-13-release", + "content_html": "

    Node Reelease Update

    2022-11-02 - 2023-01-13

    Executive Summary

    A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on\nrelease/1.35 branch and does not bump cardano-ledger.

    The team successfully integrated an interim release bump of ledger and consensus into cardano-node master.\nThis work will not be released in a node version, but will be continued by the current dependency bump in progress.

    We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again.

    The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress.

    Completed

    In Progress

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-13-release", + "title": "Node Release Team Update", + "summary": "Node Reelease Update", + "date_modified": "2023-01-13T00:00:00.000Z", + "author": { + "name": "Samuel Leathers", + "url": "https://github.com/disassembler" + }, + "tags": [ + "release" + ] + }, + { + "id": "2023-01-13-system-test", + "content_html": "

    High level summary

    During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the P2P Single\nRelay functionality.

    We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level.

    Workstreams

    Framework improvements:

    • extended the cardano-node-tests with the ability for anybody to fork the repo and run all our System Tests on GitHub Actions
    • added 2 new nightly pipelines - nightly-mixed and nightly-p2p - details here
    • some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;

    === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) ===\n to\n === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===

    Node:

    • ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled
    • started the preparations for testing the next tag - details here

    DB-Sync:

    • some improvements on db-sync sync tests
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-13-system-test", + "title": "System Test Team Update", + "summary": "High level summary", + "date_modified": "2023-01-13T00:00:00.000Z", + "author": { + "name": "Dorin Solomon", + "url": "https://github.com/dorin100" + }, + "tags": [ + "system-test" + ] + }, + { + "id": "2023-01-12-mithril", + "content_html": "

    High level overview

    The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ADR. They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible.

    Finally, they have worked on upgrading the devnet and fixing some flakiness in the end to end tests of the CI.

    Low level overview

    • Implemented the redaction of an ADR for handling graceful updates of the Mithril Network #671
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with protobuf #677
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with avro #678
    • Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction #672
    • Worked on upgrading the Cardano node of the Mithril devnet, as well as fixing flakiness of the CI #523
    • Prepared and tested the new 2302 distribution pre-release 2302.0-prerelease
    • Updated the documentation for SPO to build a signer node in order to better reflect the new release process #681
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-12-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2023-01-12T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2023-01-11-consensus", + "content_html": "

    High level summary

    The consensus team is resuming its activities after the Christmas break. During\nthese weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and\ndiscussing with the Ledger team the changes that might be required for the next\niterations. The pull request that adds the Conway era is waiting for a second\nreview round and we hope to merge it soon. On the technical debt side we are\nlooking into a property-test failure found in the iterators. We are\ninvestigating if this is an error in the model or in the implementation. We also\nimproved the documentation of our testing code.

    Workstreams

    UTxO HD Prototype

    We worked with the Ledger team to start preparing the next versions of UTxO-HD.\nThe Ledger team is concerned that for the remaining maps we might need the full\nledger state on epoch boundaries. Since the main consumer of the ledger rules is\nConsensus, the code that requires access to a full state could be moved from the\nledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take\nplace in such bridge, instead of querying the ledger for the values that are\nrequired in the epoch-transition computations.

    We relocated some UTxO-HD definitions, in preparation for merging\nthe prototype into master.

    We also completed updated local benchmarks comparing the replay time and memory\nconsumption of:

    • the baseline node (f2fc76ef45647275c98634da1718290b976ff364)
    • the UTxO-HD node with the in-memory backend
    • the UTxO-HD node with the LMDB backend

    The following plot shows the results: we can see that the LMDB node barely\nreaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The\nin-memory backend is about 30 minutes faster, but still slower than the baseline\nversion. We are aware of this phenomenon and it is inherent to the problem of\nmaintaining sequences of differences of the last k ledger states that allows\nus to perform rollback and roll-forward. We are in the process of measuring\nsyncing from scratch times.

    We also added StaticEither accessors that helped us to simplify\nthe UTxO-HD prototype.

    New Conway era

    We incorporated the feedback of the pull request, and rebased this\nbranch on top of master. The PR is pending a second review round and we hope\nto merge this soon.

    Technical debt

    We are investigating a property-testing failure involving\niterators. Solving this requires understanding the expected behavior of\niterators in the counterexample found by QuickCheck to determine if the error\nis in the model or in the implementation.

    Fostering collaboration

    We moved the contents of docs/Testing.md closer to the code, so that the\nexplanations about the tests are easier to find in the relevant modules, and the\ndocumentation is easier to keep up to date.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-11-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2023-01-11T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2023-01-11-performance-and-tracing", + "content_html": "

    High level summary

    Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:

    1. SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress.
    2. The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over.
    3. Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks.
    4. New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs.
    5. Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench.
    6. Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.

    Performance

    The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on.

    Tracing

    The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done.

    Infrastructure

    Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components.

    On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters.\nWe now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes.

    We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development.\nOnce this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-11-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2023-01-11T00:00:00.000Z", + "author": { + "name": "Serge Kosyrev", + "url": "https://github.com/deepfire" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2023-01-06-crypto", + "content_html": "

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: The API features (error handling) has been merged.
    • Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI.
    • KES agent: We keep progressing with KES secure forgetting implementation.

    We also started working in the cryptography engineering handbook, which will be a cross team effort.

    Low level summary

    MuSig2

    • Merged the more granular error handling mechanism PR#33

    Mithril

    • Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in Version 0.1.1, which was published in crates.io.
    • Updated new KES format to mithril library PR 674
    • We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync PR 531
    • We keep progressing on reducing the use of transmute in mithril-stm.

    cardano-base

    • Nothing new to report. Still working in merging these PRs. We are only missing nix merge of PR#520 and the updates on VRF will be merged.

    KES agent

    • We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests PR#255.

    Cryptography handbook

    We have made available the (temporary) cryptography handbook https://input-output-hk.github.io/cryptography_spec/, and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-06-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2023-01-06T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2023-01-05-ledger", + "content_html": "

    High level summary

    The ledger team finished up the remaining work for tracking individual depots,\nbuilt out the new Conway era transaction body (in line with CIP-1694),\ngreatly reduce some problematically large calculations on the epoch boundary,\nand addressed technical debt.

    Lower level summary

    Finishing the deposit tracking

    The initial work on the individual deposit tracking project focused only on correctness.\nAs this is a large data structure\n(since its size is linear with respect to the number of registered stake credentials),\nit is very important that we also reduce the memory overhead as much as possible.\nFortunately, we were able to add very little overhead for the deposits by using existing\nefficient data structures. The extra tracking now only incurs one word (8 bytes)\nper registered stake credential.

    See:

    New Conway era transaction

    We implemented the Conway era transaction body, which is in line with CIP-1694.\nNote that the Conway era implements, losing speaking, the parts of CIP-1694 that are not\nrelated to the liquid democracy (the \"DReps\").\nThe new transaction body adds the new governance actions and votes,\nwhile also deprecating the old governance structures\n(i.e. the old protocol parameter updates and MIR certificates).

    We also now have the wire specification (CDDL file) and serialization code in place.\nThe wire specification is still subject to change while we work on the Conway era,\nbut it is now usable and has proper testing support\n(so that, for example, the serialization round-trips, etc).

    See:

    Optimizing the TICKF transition

    Every since the release of the Shelley era, we have been working to reduce the computational load\nplaced on the node by the ledger at the epoch boundary.\nWhile still not perfect, we believe that we have removed one of the final problematically long\nepoch boundary computations that exacerbate situations like\nthis.\nIn particular, the problem involved the way in which the consensus layer obtains a view of the\nledger for the purposes of checking the leadership schedule in a new epoch.\nWe implemented a stopgap measure which now only incurs a single multi-second cost once per epoch\ninstead of potentially several multi-second costs while the networks waits for the first block\nof a new epoch to be minted.

    See:

    Technical debt

    We closed the year out with a lot of reduction to the technical debt!

    Improved ledger event

    • pull-3212 - The ledger events are not guaranteed to appear in any given order within a block.\nFor this reason, motivated by the use case in db-sync, the TotalDeposits event now\nincludes a transaction ID and emits the change in deposits instead of the value.

    Improved type saftey

    • pull-3208 - We replaced NominalDiffTime with a newtype wrapper. The problem was that our CBOR\nencoders and decoders were using the wrong level of precision, having to due with with\nthe Shelley genesis file. We removed the potential problem with a newtype wrapper.
    • pull-3167 - We now use a GADT to ensure consistency of the Plutus language in the types\nfor TransactionScriptFailure and PlutusDebug.

    Code/Module organization

    • pull-3175 - The Allegra and Mary eras had an unusual relationship in our codebase,\ndue to the uncertainly of release dates while we were implementing them.\nIn particular, they were coupled in way that is different from the rest of the code base.\nWith hindsight on our side, we split the combined shelley-ma Haskell package into two\nseparate ledger era packages, which is now consistent with the rest of the repository\nand module structure.
    • pull-3184 - We created a core test sub-library, cleaning up a lot of our property test\ngenerator code.
    • pull-3210 - We moved the KeyPair type to the test library. Outside of testing,\nthe ledger does not need to deal with signing keys, and since this is a topic that\ndeserves the utmost care, it is best to make it clear that our use of signing keys\nis only for testing.
    • pull-3229 - We split the Cardano.Ledger.Alonzo.Data module, which is more consistent with the rest\nof the codebase.

    Revert pointer address deprecation

    Thanks to one of our excellent internal auditors,\n@jmhrpr,\nwe now have a better plan for deprecating pointer addresses.\nThis meant that we had to revert the previous work to deprecate them.

    See:

    Miscellaneous

    • pull-3205 - We removed deprecated type synonyms.
    • pull-3218 - We cleaned up the address deserialization.
    • pull-3223 - We fixed faulty address deserialization tests.
    • pull-3222 - We switched to a general type family TxOut from concrete ones,\nreducing many constraints.
    • pull-3224 - ShelleyGenesis is now parameterized by crypto instead of by era.
    • pull-3170 - We set the cabal-version to 3.0 in our projects.
    • pull-3172 - We removed the now useless EncodeMint/DecodeMint classes.
    • pull-3225 - We switch from ormolu to\nfourmolu.\nThe reason was to be able to finally have more diff friendly code!
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2023-01-05-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2023-01-05T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-12-28-node-cli-api", + "content_html": "

    2022-12-28 - 2023-01-10

    High level summary

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-28-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2022-12-28T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2022-12-16-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on the website and reduced the cost for commit transactions by ~30% with the help of reference scripts.

    The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023.

    What did the team achieve this week

    • Kicked-off Hydra Voting project with Catalyst, CF, and IO Research.
    • Reduce commit transaction costs by ~30% with reference scripts.
    • Prepared an RFP for external audit of the Hydra Head solution.
    • Fixed transaction cost benchmarks for abort tx #631.
    • Recorded decision to use model-based testing (ADR22) and improved Model documentation.
      • Concluding the first increment on Validate coordinated Head protocol #194.
      • Formulated next step / follow-up on testing the Soundness property of our protocol #656.
    • Switched to using nix flakes for development setup and CI build #646.

    What are the goals of next week

    • Push ADR21 & tx validity gap over the finish line (smoke tests missing).
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Close & recap on the year with another monthly report (+ blog post).
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-16-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2022-12-16T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-12-15-mithril", + "content_html": "

    High level overview

    The Mithril team has released the new distribution 2248.1 of their nodes. They have published the first version of the Mithril cryptographic library on crates.io, the Rust community’s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots.

    Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities.

    Low level overview

    • Implemented removing verification key and stake from single signatures #619
    • Completed the extraction of the signer registration from the multi-signer #642
    • Completed the extraction of the certificate creation from the multi-signer #638
    • Implemented a workflow to test client binaries (Linux / MacOS / Windows) #601
    • Completed the signature of the artifacts produced by the CI #587
    • Fixed the protocol parameters transition #627
    • Worked on optimizing the snapshot digest computation #510
    • Worked on enforcing the API protocol versions in the client and signer #633
    • Worked on deactivating the non certified signer registration mode #621
    • Worked on the re-genesis of the test networks #651
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-15-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2022-12-15T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2022-12-14-consensus", + "content_html": "

    High level summary

    During the past two weeks, the Consensus team finalized the QSM tests for the\nbacking store and Mempool on the UTxO-HD branch with important discoveries\nregarding parallel QSM testing. We also worked with the Ledger team to envisage\nthe modifications that are required in Ledger and Consensus to accommodate the\nchanges in the crypto VRF and KES. The db-analyser now supports bechmarking\nthe ledger operations, which will allow us to identify, debug, and profile\npotential performance problems. We drafted a document that defines how to manage\nthe versions of Consensus-related packages. The top level documentation of\nouroboros-network now features a description of the consensus components and\nprovides a hyperlinked map to the modules documentation.

    Workstreams

    UTxO HD prototype

    Whereas we had passing sequential state-machine tests for the mempool, the\nparallel case proved to be more challenging than we thought. The operation of\nadding a list of transactions to the mempool is not atomic and, as a result,\nwhen adding a list of transactions, transactions from other processes can be\nadded in between. The mempool implementation handles this correctly, however\nthis required us to redesign the parallel model we had to take\nthe lack of atomicity into account.

    Backing store property tests

    We finished refactoring the backing store property tests. The second review\nround is ongoing.

    LSM tree implementation

    We are working on benchmarking (in terms of time and number of IO operations)\nfetching/looking up data from disk.

    Genesis

    We worked on the design of a mechanism to prevent a DoS attack on our Genesis\ndesign related to rollbacks. This was arguably the biggest outstanding question.

    During the discussions around Genesis, we noticed a design boundary that nicely\ndelineates a fundamental component. We almost have a full Haskell prototype of\nit. It will be very nicely self-contained, perhaps even usable in the ultimate\nimplementation!

    New VRF and KES crypto integration

    We collaborated with the Ledger team on preparing the ledger state and crypto\ntypes to avoid huge allocation on the epoch boundary when changing aspects of\nthe crypto that will only manifest in headers, not in the ledger states.

    Technical debt

    We merged the pull-request that adds a support to db-analyser for\nbenchmarking ledger operations. This will allow us to identify, debug, and\nprofile potential performance problems. The benchmark focus on the main 5 ledger\noperations that are involved in chain syncing, block forging, and block\nvalidation, namely:

    1. Forecast.
    2. Header tick.
    3. Header application.
    4. Block tick.
    5. Block application.

    The following figure shows a plot of the benchmarking results for the first 65\nmillion blocks (approximately) of the Cardano chain. The thin yellow lines under\nthe x-axis show the epoch boundaries, whereas the thick yellow lines correspond\nto the era transitions.

    As we can see in this figure, era and epoch boundaries require more computation\ntime. The ledger team are aware of this problem, and we are working to improve\nthis situation.

    Fostering collaboration

    We drafted a document motivating and defining how Consensus (and\npossibly other core teams) will/should manage our package versions. This\npull-request garnered many great discussions from our team members and other\nteams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et\nal. We want to thank you all for your input, and we found this discussion very\nenlightening!

    We merged the pull request that adds an overview of consensus to\nthe top level\ndocumentation of\nouroboros-network. This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-14-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2022-12-14T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-12-14-db-sync", + "content_html": "

    High level summary

    The DBSync team continued testing release 13.1.0.0. The QA team has reported that no issues have\nbeen found. The DBSync team also worked on cherry-picks back to master and on fixing bugs.

    Lower level summary

    • Release is cherry-picked back to master, which uses the new rollback mechanism which uses\nreverse indexes, same as the release\n#1320\nThis also fixes a bug number of issues on master.
    • Depenencies upgrade and CHaP integration\n#1324
    • AdaPots fix #1323. This\nfixes an issue where the per epoch AdaPots didn't match the epoch boundary, but\nthey also included changes from the first block of the epoch.
    • Deposits Event fix #3212. This pr\nadjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the\nnumber of queries that db-sync does during syncing an make syncing faster.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-14-db-sync", + "title": "DB-sync Team Update", + "summary": "High level summary", + "date_modified": "2022-12-14T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2022-12-14-node-cli-api", + "content_html": "

    2022-12-14 - 2022-12-27

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-14-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2022-12-14T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2022-12-14-performance-and-tracing", + "content_html": "

    High level summary

    1. SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment.
    2. A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery.
    3. The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals.
    4. Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started.
    5. Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.

    Performance

    The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload.

    We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling.

    Tracing

    After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical.

    To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:

    1. We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration.
    2. The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.

    All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further.

    In addition, we're still pursuing our performance-enhancing rework of the new tracing internals.

    Infrastructure

    After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends.

    Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it.\nThis means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis.\nThis will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports.

    A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches.\nPreviously we only had automation for two aspects separately, so we only could either:

    • compare individual runs (used for different node configurations / versions)
    • collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version)\nNaturally, combining these two capabilities was a long-desired feature of our analysis pipeline.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-14-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2022-12-14T00:00:00.000Z", + "author": { + "name": "Serge Kosyrev", + "url": "https://github.com/deepfire" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2022-12-12-network", + "content_html": "

    High level summary

    In last sprint the team focused on preparations for the conference talk at\nOPODIS 2022. We also worked on preparations to publish io-sim and related\npackages on Hackage (PR #57, PR #60).

    We also started reviewing:

    • ouroboros-network
    • cardano-node
    • cardano-ledger\nrepositories for open-source readiness (PR #4128).

    We prepared a PR which changes how node-to-node and node-to-client protocol\nversiones are serialised in cardano-node log (PR #4691).

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-12-network", + "title": "Network Team Update", + "summary": "High level summary", + "date_modified": "2022-12-12T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network", + "release" + ] + }, + { + "id": "2022-12-09-crypto", + "content_html": "

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency.
    • Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack.
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • [Still in progress] We are introducing a more granular error handling mechanism PR#33
    • We merged the API redesig PR#35
    • We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future PR#36

    Mithril

    • We merged the individual signature PR#620
    • We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (kes repo)

    cardano-base

    • Nothing new to report. Still working in merging these PRs.
    • We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a bug in GHC

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Fixed a 'use-after-free' bug in the KES agent.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-09-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2022-12-09T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2022-12-09-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team has worked on completing to \"Validate coordinated head protocol against formal model\", this is a huge step to verify the implementation is secure. They also worked on implementing ADR21 related to bounded tx validity which is now under review. HydraPay project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of issues they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced.

    What did the team achieve this week

    • Document model based testing #194 & #641
    • Got ADR21, reducing gaps between implementation and specification, under review.
    • Complete review on hydra-tutorial.
    • Complete first round of review on HydraPay work #634
    • Meeting with Director of CyberSecurity frio IOG to unblock \"the RFP prepared for the external audit\" #606
    • Remove vasil-dev and testnet from smoke-test because they were not working #630
    • Fix flaky plutus-merkle-tree test #642
    • Refactor NetworkSpec to improve legilibility.
    • Fix benchmark cost for abortTx #631
    • Adapt nix.conf to the recent hydra-ci nix cache migration.

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation.
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Get Cicero (new CI) working.
    • Use reference inputs to reduce the cost of the commitTx.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-09-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2022-12-09T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-12-09-ledger", + "content_html": "

    High level summary

    The Plutus tools team at IOG has started helping the ledger team to build out a user friendly\ncardano-ledger-api package!\nA GitHub project\nwill be filled out in the days ahead,\npeople interested in the API can use it to follow along and join in on the conversations.

    The ledger team has started using\narchitectural decision records\nto leave a record of important decisions that the team makes.\nWe will retroactively go back through past decisions and make ADRs for them.

    The logic to track individual deposits is now nearly in place.\nWe are prioritizing correctness with our first pull request, and will follow up with\nperformance optimizations and general cleanup next.

    Pointer addresses are being deprecated with the Cardano major protocol version 8.\nSee CPS-0002\nfor more context.

    Lower level summary

    Cardano ledger API

    The Plutus tools team has taken our minimal cardano-ledger-api package and started filling it\nout and adding much needed documentation.\nThey have also added doctests!\nIn the days to come, the Plutus tools team will map out a lot more work for the API and record\nit in this\nGitHub project.

    See

    Architectural Decision Records (ADRs)

    We are now providing more context and leaving a record of important decisions that are made\nin the ledger. The first ADR explains the very lightweight process.

    See

    Tracking individual deposits

    See ADR-3\nfor background.\nWe now have the logic in place to track individual deposits, and a host of property tests\nto make sure that the logic is correct.\nThe current implementation uses more memory than it needs to, and we will address that next,\nwith our hope being to only use one word (8 bytes) per registered stake credential.\nThere is a fair amount of other cleanup needed for general maintainability.

    See

    Removing pointer addresses

    Pointer addresses, which have never seen any real use\n(there are something like eleven on mainnet), are being deprecated starting at Cardano major\nversion 9.\nCPS-0002 gives the context.\nWe are disabling them by first preventing transaction outputs containing them\nfrom being serialized by the node at the moment we switch to version 9.\nAt the hard fork after that, we will translate the existing few pointer addresses\nto enterprise addresses.

    See

    Technical debt

    • pull-3162 - Sometimes we have to put safeguards in place for hard forks which may never\nbe exercised. After we have passed the given hardfork, we are able to clean up the code\nand simplify our logic. We removed all of the ones that we are currently easily able to.
    • pull-3165 - We improved the type safety of our code while also discovering and fixing\na serialization bug.
    • pull-3172 - We removed dead code.
    • pull-3175 - The Allegra and the Mary code used to be coupled in a particular way the we grew to\ndislike. We made these two ledger eras now uniform with the rest of our code base.
    • pull-3184 - We organized our property testing code.
    • pull-3200 - The Plutus tools teams fixed an outstanding bug in the translation from the\nledger state to the Plutus script context.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-09-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2022-12-09T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-12-02-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team has worked on cleaning up several things in progress\nafter last week's summit. They have extended their model-based testing (MBT)\napproach with transaction creation & observation\n#410, solved\nAcquirePointTooOld problems of the hydra-node with by changing the wallet\ninitialization #439.\nAlso, the Hydra researchers updated the security proofs of the Coordinated Hydra\nHead, which are bound to be included in the Hydra HeadV1 specification.

    What did the team achieve this week

    • Monthly review & report - will also be published on our website #644
    • Extended the model-based testing (MBT) with transaction creation/observation #410
    • Solve AcquirePointTooOld problems with new wallet initialization #439
    • Fixed our hydraw deployments (EC2 instances)
    • Created & discussed ADR21 within tx validity work
    • Received & discussed security proofs of Coordinated Hydra Head (requires more work)

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation
    • Complete review & integrate the Hydra tutorial
    • Review latest hydra-pay work
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec
    • Get Cicero (new CI) working
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-02-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2022-12-02T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-12-01-db-sync", + "content_html": "

    High level summary

    The DB Sync team prepared a release 13.1.0.0-rc2 which includes many improvements for db-sync,\nit makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces\nmigrations. This release finalises the objectives that were set for db-sync for the previous\n3 months period and part of the syncing speed objective set for the next period\nChangelog

    Lower level summary

    • Branch release/13.1.0.x\nincludes all the improvements related to the release. The release is passing through the testing\nphase and a number of bugs and issues have been fixed, like\n#1312\n#1311.\nAlso many new unit tests have been added.

    • Part of the release branch is cherry-picked back into master, in a way that it respects the new\nrelease and development process, so that it takes into account migrations\nrelease process

    • The DB Sync team has also tagged release 13.0.6 which better supports preview and preprod for\ndocker.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-01-db-sync", + "title": "DB sync Team Update", + "summary": "High level summary", + "date_modified": "2022-12-01T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2022-12-01-mithril", + "content_html": "

    High level overview

    The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes.

    Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer.

    Low level overview

    • Implemented custom Mithril SPOs on testing/pre-release networks #563
    • Deprecated Signer Declarative Pool Id registration mode #585
    • Completed the second stage of the store automatic migration process #600
    • Completed the deployment pipelines to crates.io registry #588
    • Completed automatic generation of nodes/libraries versions manifest in releases notes #599
    • Completed CI/CD handling of PR from forks #597
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #586
    • Worked on signing the artifacts released in the distributions by the CI/CD #587
    • Worked on multi-platforms end to end test #601
    • Worked on the refactorizaton of the aggregator multi-signer engine #398
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-01-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2022-12-01T00:00:00.000Z", + "author": { + "name": "Jean-Philippe Raynaud", + "url": "https://github.com/jpraynaud" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2022-12-01-system-test", + "content_html": "

    High level summary

    During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the P2P Single\nRelay functionality, and also tested some DB-Sync tags.

    Workstreams

    Framework improvements:

    • moved the System Test CLI Pipelines from BuildKite to Github Actions
    • improved the reporting tools to support the rerun of the failled tests and update of the reports
    • added support for Github API in report-aggregator, so reports will be generated from the GitHub nightly jobs from now on
    • added support for mixed topology - P2P, legacy, mixed topologies
    • planned the P2P Single Relay system test activities
    • added support to start regression tests with PV8 + better selection of tests

    DB-Sync:

    • confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)
    • tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-12-01-system-test", + "title": "System Test Team Update", + "summary": "High level summary", + "date_modified": "2022-12-01T00:00:00.000Z", + "author": { + "name": "Dorin Solomon", + "url": "https://github.com/dorin100" + }, + "tags": [ + "system-test" + ] + }, + { + "id": "2022-11-30-consensus", + "content_html": "

    High level summary

    During the past two weeks, the consensus team merged improvements to the monadic\ncursor API that was needed to implement LMDB range reads, which is in turn\nrequired for the implementation of the UTxO HD feature. We added tables to\nseveral tests in for the UTxO HD feature, which increases our confidence in the\ncorrectness of the prototype. The mempool property tests are close to being\ncompleted. Also, we finished the LSM tree tuning algorithm.

    On the Genesis front we started simplifying the BlockFetch logic with\nCSJ-specific workloads in mind.

    We are also documenting the Block Diffusion Pipelining feature, and added a\nhigh-level overview of consensus to the top level documentation of\nouroboros-network.

    Workstreams

    UTxO HD prototype

    We merged the implementation of a monadic cursor API (#1)) which was\nneeded to solve a bug with LMDB range-reads. After this PR was merged, we focused on\nbridging the gap between the lmdb-simple interface and consensus by facilitating\nusing lmdb-simple's cursor API without Serialise constraints (#3).

    We refactored the backing store property tests to use quickcheck-lockstep\n(#4081).

    We added tables to the mock ledger in the UTxO-HD feature branch\n(#4184). Every test that used to run with SimpleBlocks now uses\ntables. This will enable us to exercise the UTxO HD mempool integration by\nleveraging the existing mempool property-tests. The new state-machine\nproperty-tests are still needed for testing the parallel behaviour of the\nmempool.

    Our work on the mempool state-machine tests revealed the need for improvements\nin the quickcheck-state-machine library. Parallel testing assumed that the\nstate machine did not have access to mutable references. However, the mempool\ntests require the use of such mutable references for mocking the ledger\ninterface. As a result, our parallel tests were failing with rather obscure\nmessages. @Jasagredo submitted a pull request (#12) that allows for\nnew mutable references to be created at each run of the state machine.

    Backing store property tests

    LSM tree implementation

    We finished the LSM Tree tuning algorithm. We are currently tidying up the code\nand gathering results (i.e., plots and their interpretation).

    CSJ prototype

    We started simplifying the BlockFetch logic with CSJ-specific workloads in mind.

    New VRF and KES crypto integration

    Started working on supporting new version of StandardCrypto which uses compact\nKES and batched VRF (#4151).

    Technical debt

    We reviewed the existing state of the Block Diffusion Pipelining document. We\nare now working on the \"Implementation\" section (#4020).

    Fostering collaboration

    We cleared up our understanding of the error dynamics of forecasting\n(#4146 and #4174).

    We submitted a pull request that adds an overview of consensus to the top level\ndocumentation of\nouroboros-network (#4197). This overview describes the consensus components and adds a\nhyperlinked map to the modules documentation.

    https://github.com/input-output-hk/ouroboros-network/pull/4197

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-30-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2022-11-30T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-11-30-node-cli-api", + "content_html": "

    2022-11-30 - 2022-12-13

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-30-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2022-11-30T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2022-11-30-performance-and-tracing", + "content_html": "

    High level summary

    1. Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release.
    2. SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench.
    3. The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks.
    4. Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started.
    5. Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.

    Performance

    We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release.

    Tracing

    For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them.\nThe idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time.

    To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics.

    Infrastructure

    Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation.

    In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model.

    The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged.\nWe are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration.

    We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability.

    We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP.

    As usual, a number of smaller workbench, data analysis & reporting improvements have been made.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-30-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2022-11-30T00:00:00.000Z", + "author": { + "name": "Serge Kosyrev", + "url": "https://github.com/deepfire" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2022-11-28-network", + "content_html": "

    Stake-Driven Data Diffusion Release for Relays

    IOG networking team decided to release the Stake-Driven Data Diffusion with\nRobust Optimised Peer Selection also more commonly known as P2P. In the\nlast update, we informed about a performance regression, but it turns out it\nonly affects block producers, and thus we highly advise against running it on\nsuch nodes. Further investigation is required to find the cause of it.

    On IOG's benchmarking cluster we have seen quite a good performance improvement\non block propagation itself. The cluster is running a static topology with\nvalency 6 (each node is connected to 6 other nodes). In which every of the 50\nnodes are block producers. The setup of this network is the same as mainnet.\nWe've seen 40-50% performance improvement on block propagation comparing to the\nsame cluster deployed with the same topology but using non-P2P nodes. We think\nthis performance improvement is caused by using full duplex connections. Quite\nlikely the transaction traffic floating in both directions on the same TCP\nconnection helps to keep the TCP window open. Note that in a cluster of 50\nnodes with valency 6 the probability of having at least one duplex connection\nis more than 50%. We don't expect the same improvement on mainnet because the\nnetwork is much wider and the transaction traffic is not as large.

    Just before the release we squashed two small bugs:

    • issue #4163 - top level integration bug in keep-alive;
    • issue #4177 - a bug in outbound-governor;
    • PR #4165 - a fix cardano-ping support of NodeToNodeV_10.

    Peer Sharing

    We were carrying a review of peer sharing PR.

    DeltaQ

    Neil Davies was invited to give a guest lecture entitled Avoiding System Catastrophes at UCLouvain.

    What have we achieve last sprint

    • issue #4163: we found out that a control message is not passed to the\nkeep-alive mini-protocol, this results in every demotion executing demotion\ntimeout rather than a graceful termination. With the fix the node will no longer log:

      { \"kind\": \"PeerStatusChangeFailure\"
      , \"peerStatusChangeType\": \"WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})\"
      , \"reason\": \"TimeoutError\"
      }
    • issue #4177: we fixed an assertion failure in the outbound-governor; now\nwe don't try demoted peers which are being demoted already.

    • PR #4155: we refactored ouroboros-network packages. There's a top level\nouroboros-consensus-diffusion package which integrates network\n& consensus code. We also introduced:

      • ouroboros-network-api package which contains the API shared between\nnetwork & conensus;
      • ouroboros-network-mock package which contains mock API used for testing\n(e.g. a mock chain & chain producer, etc.)
      • ouroboros-network-protocols package which contains implementation of all\n(but handshake) mini-protocols, exposes a testlib and contains test\nand cddl components.

      This made the dependency tree of network & consensus packages much\ncleaner.

    • PR #4169: we described the usage of release branches in CONTRIBUTING.md\ndoc.

    • PR #4165: we fixed cardano-ping support of NodeToNodeV_10 protocol.

    DeltaQ

    The abstract of the talk:

    An essential step to ensuring that distributed systems are fit for\npurpose.

    Distributed systems have become an integral part of our society and\ndaily lives. We are, both implicitly and explicitly, individually as well as\ncollectively, placing ever more trust in them.

    Are they worthy of this trust? Our need for them to be ‘fit-for-purpose’ goes\nwell beyond notions of functional correctness (i.e. never getting the wrong\nanswer). We need them to deliver the desired outcomes in a timely, robust,\nreliable, resilient fashion, at scale and in a sustainable way (both\neconomically and environmentally).

    This all sounds like a worthy aspiration, but what would be a practical\napproach to capturing and reasoning about these issues? How can we ensure that\nsystems can meet their fit-for-purpose objectives, not just in their design but\nas they are deployed, encounter the imperfect world, are scaled to become\neconomic, and proceed into ongoing maintenance?

    This talk will illustrate how the notions of Outcomes and Quality Attenuation\n(as captured by ‘∆Q’) are being used to both frame the necessary notions and\nprovide a basis for assuring the refinement and reification of such systems,\nfrom initial concept to operational infrastructure.

    You can download the slides from here.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-28-network", + "title": "Network Team Update", + "summary": "Stake-Driven Data Diffusion Release for Relays", + "date_modified": "2022-11-28T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network", + "release" + ] + }, + { + "id": "2022-11-25-crypto", + "content_html": "

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team.
    • Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes
    • cardano-base: The VRF and BLS branchs are still open and in progress
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library PR#31
    • We are introducing a more granular error handling mechanism PR#33
    • We rethought the API and made it more consistent with the underlying secp256k1 library PR#35

    Mithril

    • The mithril crates in general will be published in crates.io, and we adapted the core library's README PR#616
    • We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information PR#620

    cardano-base

    • We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) PR#341
    • SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions PR#344
    • Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus PR#266

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-25-crypto", + "title": "Crypto Team Update", + "summary": "High level summary", + "date_modified": "2022-11-25T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2022-11-25-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a presentation about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas.

    What did the team achieve this week

    What are the goals of next week

    • Monthly report & review meeting
    • Tie up several loose ends / branches.
    • Resolve Tx validity discussions & PRs.
    • Review cicero PR & try it out.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-25-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2022-11-25T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-11-23-ledger", + "content_html": "

    High level summary

    We released CIP-1694,\nour proposal for entering the Voltaire phase.\nPlease come join the discussion, this will be an incredibly exciting transition for\nCardano and we want everyone to participate!

    We now have a sensible way to version all of the serialization schemes used in the ledger.\nThe draft pull request was polished, reviewed, and merged this week.\nThis solves many problems that have vexed us since the beginning of the Shelley ledger era.

    Everyone working on the Cardano node is working together to improve our release process,\nand the ledger team in particular dedicated one engineer to help with these efforts\nfor the next release.

    Lower level summary

    The Conway ledger era

    The current proposal in CIP-1694 encompasses two new ledger eras.\nThe first era will be called Conway, after the English mathematician John Horton Conway.\nThe community facing aspects of the Conway ledger era will be very minimal,\nbut it will pave the way for introducing liquid democracy.\nThe details can be viewed here.\nWe do not yet have a formal specification for the Conway era.\nOur plan is to debut the\nformal ledger model.\nBriefly, the Conway ledger era will:

    • introduce SPO voting for hard forks (in the spirit of the now abandoned CIP-47)
    • provide an on-chain mechanism for rotating the governance keys
    • re-plumb the ledger rules involving governance to be in line with CIP-1694

    Versioned CBOR

    We now have the ability to easily tie our serialization schemes to the Cardano\nmajor protocol version.\nWe still aim to preserve backwards compatibility as much as possible, but we now have a principled\nplan for resolving problems (see CIP-ledger-cbor).\nIn particular, we can now address several long standing issues, such as\nissue-2444, issue-2965, and issue-3003.

    The final (and massive!) pull request which brought us the versioning is pull-3138.

    Deposit tracking

    The draft pull request which was exploring how best to track individual deposits\nis much closer now to being ready to take out of draft (pull-3127).\nFor background on the issue, see issue-3113.\nThis is quite an invasive change which effects many of our tests, which we are now addressing.

    Technical debt

    As always, we keep working on technical debt.\nWe have deduplicated a some things: pull-3129, pull-3162.\nWe have memoized a problematic computation (though more due diligence is needed before we can\nmerge): pull-3141.

    Node release

    We have been helping with the node release efforts. See pull-4608.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-23-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2022-11-23T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-11-18-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team released version 0.8.1, which includes several fixes and a user-wished extension of the persistence introduced by 0.8.0 of replaying server outputs to make clients like the hydra-tui be aware of the latest hydra-node state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from hydra-poc to hydra!

    What did the team achieve this week

    • Implemented replaying of server outputs to address #580
    • Released version 0.8.1 containing this and other fixes Release notes
    • Worked on the bounded tx validity as one of the on-chain script fixes, but couldnt finish it just yet #615
    • Collaborated with the education team on a Hydra tutorial.
    • Discovered and discussed issues with the seen ledger.
    • Renamed the Hydra repository hydra-poc -> hydra

    What are the goals of next week

    • Create and discuss an ADR about handling tx validity correctly.
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: \"Developing Hydra\" on Day 2, Nov 21st, 13:50 CET
    • Have a team workshop / hackathon after the summit:
      • Retrospective
      • Roadmapping session
      • Hack on something complex or useful
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-18-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2022-11-18T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-11-18-mithril", + "content_html": "

    High level overview

    The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks.

    Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer.

    Low level overview

    • Released a new Mithril distribution 2246.1
    • Completed the first stage of the store migrations process #562
    • Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes #565
    • Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage #576
    • Prepared a Daedalus synchronization benchmark video with/without Mithril #606
    • Upgraded the Cardano nodes of the testing Mithril networks to 1.35.4 #594
    • Worked on implementing SPO tests nodes on testing Mithril networks #563
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #588
    • Worked on the refactorizaton of the aggregator multi signer engine #398
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-18-mithril", + "title": "Mithril Team Update", + "summary": "High level overview", + "date_modified": "2022-11-18T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2022-11-16-consensus", + "content_html": "

    High-level summary

    During the past two weeks, the consensus team started documenting the\nimplementation of the UTxO HD feature and continued developing tests for it. As\npart of our work on UTxO HD, we improved the Haskell support for LMDB. We also\nspent time working on the LSM tree prototype, and designed a parameter tuning\nalgorithm for it. Regarding our work on Genesis, our investigation of the\n\"plateaus\" pointed at the TICKF slowdown on era boundaries as culprit. This\nled us to developing a caching strategy that will not only remove the\naforementioned \"plateaus\", but can help alleviating the growing block production\ndelay on epoch switch. We also helped reviewing the block forge credential\nhotswap feature, which is intended for use in the adoption of P2P.

    We also worked on paying technical debt and fostering collaboration. In\nparticular, we improved the io-sim framework, which is crucial for testing and\nsimulating Cardano components. We also removed thunks that appeared on era\ntranslations, and improved our diffusion pipelining feature. We are working on a\npresentation for explaining Praos and Genesis.

    High-level status report

    • Finish the UTxO HD prototype: in progress.
      • We added documentation for this feature.
      • We developed the second version of the mempool tests.
      • We fixed benchmarks that were inflating the speedup we observed in the\nanti-diff implementation of sequences of differences. Speedups are now in the\nrange of [3.33, 4.75], which remain significant.
      • We continued improving Haskell LMDB support.
      • We finished implementing a \"parameter tuning algorithm\" for the LSM tree\nprototype. This enables us to run experiments to check the correctness of\nthe algorithm.
    • Genesis: in progress.
      • Work investigating the \"plateaus\" in the ChainSync jumping prototype\npointed to the TICKF slowdown on era boundaries as culprit.
    • Tech debt:
      • We improved the capabilities of our io-sim library, which is crucial for\ntesting and simulating Cardano components.
      • We removed thunks from epoch translations in the ledger.
      • We added Linux CI support for lmdb-simple.
      • We got pending diffusion pipelining improvements merged.
    • Fostering collaboration:
      • We are working on a explanation of Praos and Genesis protocols.
    • Support:
      • Investigation of CSJ \"plateaus\" led us to developing a caching strategy for\nTICKF that will not only remove these \"plateaus\", but can help alleviating\nthe growing block production delay on epoch switch.
      • We reviewed the block forge credential hotswapping feature which is intended\nfor use in the adoption of P2P.

    Workstreams

    Finish the UTxO HD prototype

    We merged PR #4060, which adds a report documenting the UTxO HD\nfeature, and puts emphasis in explaining how the mempool works in combination\nwith UTxO HD.

    We opened a draft PR with the second iteration of the property tests for the\nmempool (#4076).

    We fixed the Arbitrary instances for keys and values in DiffSeq benchmarks\n(#4143). The problem was that we were testing with mostly small\nvalues, which artificially boosted the performance gains we saw on benhcmarks.\nSpeedups are now in the range of [3.33, 4.75] across the different\nconfigurations.

    Backing store property tests

    We focused on incorporating feedback on the monadic cursor API PR (#1).\nThis required us to make small tweaks to quickcheck-lockstep to test the new\nAPI. We also updated the backing store property tests to use the new version of\nthe monadic cursor API.

    LSM tree implementation

    We worked on the LSM tree prototype. In particular: finished implementing a\n\"parameter tuning algorithm\" that adapts the LSM tree design based on factors\nlike:

    • workload
    • machine specs,
    • and characteristics of the data being stored.

    We are now running experiments to gather results and cross-reference them with\nexisting experimental results from the LSM tree paper to see if the algorithm is\nworking correctly.

    Benchmarking the CSJ prototype

    We focused on investigating the \"plateaus\" in the ChainSync tip, which turned\nout to be due to the TICKF bug which we previously were only aware of in the\ncontext of the long forging times near epoch boundaries. For the most drastic\npatch by @nfrisby to speed up TICKF, full sync is speeding up by 7%.

    The following plot shows that by caching the TICKF the ChainSync tip and the\nVolatileDB tip progress at the same rate.

    The plot below shows the speedup observed by caching the TICKF rule wrt the\nbaseline.

    Technical debt

    After addressing the PR comments, we merged PR #16, which implements\nthe MonadCatch instance for STM. This extends the capability of our io-sim\nlibrary, which is crucial for testing and simulating Cardano components PR #16\nclosed #1461. This new feature was published as version 0.4.0.0\nof io-sim.

    We continued with our work fixing the NoThunk errors required for enabling\nnightly tests, with the help of TVarInvariant checks in strict-stm and\nnothunks libraries. We proposed fixes in cardano-ledger that took care of\nthunks that appeared in era translations (#3143). The fixes will be\nintegrated back into consensus when cardano-ledger approves and publish the\nchanges introduced in #3143.

    We added CI support for lmdb-simple (#2). We currently test the build on\na Linux environment only.

    We got pending diffusion pipelining PRs (#3857, #3860,\n#3856) merged, after rebasing and addressing feedback.

    Fostering collaboration

    @nfrisby finished a visualisation tool and outlined scripts for the Praos and\nGenesis explanation presentations. The idea is to produce a video that gives an\noverview of these protocols.

    Support

    We started working on caching the computation of the TICKF rule\n(#4054), since this was blocking our benchmarking work for\nGenesis. In addition, this issue has the Cardano community quite\nconcerned, so we are hoping the work done in caching the\ncomputation of the TICKF rule can help alleviating the growing block\nproduction delay on epoch switch.

    We reviewed the block forge credential hotswapping PR #3800 from the\nnetworking team, which is intended for use in the adoption of P2P.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-16-consensus", + "title": "Consensus Team Update", + "summary": "High-level summary", + "date_modified": "2022-11-16T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-11-16-node-cli-api", + "content_html": "

    2022-11-16 - 2022-11-29

    High level summary

    Completed

    docs

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-16-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2022-11-16T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2022-11-16-performance-and-tracing", + "content_html": "

    High level summary

    1. P2P performance investigation is ongoing, in support of the networking team.
    2. SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support.
    3. Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing.
    4. On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started.
    5. We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.

    Performance

    We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes.

    Tracing

    We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis.

    Infrastructure

    The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends.

    We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing.

    A number of smaller workbench, data analysis & reporting improvements have been made.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-16-performance-and-tracing", + "title": "Performance & tracing update", + "summary": "High level summary", + "date_modified": "2022-11-16T00:00:00.000Z", + "author": { + "name": "Serge Kosyrev", + "url": "https://github.com/deepfire" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2022-11-11-crypto", + "content_html": "

    High level overview

    The SECP primitives AC has been met, and the test-vectors PR has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool PR has been merged, and we've adapted the KES secure PR to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (PR#). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork.

    Low level overview

    • With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation.
    • We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool.
    • In parallel, we keep progressing on the KES agent
    • VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification.
    • Our libsodium fork now links directly to upstream libsodium.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-11-crypto", + "title": "Crypto Team Update", + "summary": "High level overview", + "date_modified": "2022-11-11T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2022-11-11-hydra", + "content_html": "

    High-level summary

    This week, the Hydra team published together with Obsidian Systems a light paper\non our \"Hydra for Payments\" project (Link). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of hydra-node processes.

    What did the team achieve this week

    • Published Hydra for Payments light paper (Link)
    • Have a draft RFP ready for a first review internally
    • Answered the internal auditors questions
    • Fixed a bug with following the chain when starting with persistence (#599)
    • Minor improvements to logging for better observability (#598, #600)
    • Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (#590)

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Close more gaps #452
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: \"Developing Hydra\" on Day 2, Nov 21st, 13:50 CET
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-11-hydra", + "title": "Hydra Team Update", + "summary": "High-level summary", + "date_modified": "2022-11-11T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-11-11-ledger", + "content_html": "

    High level summary

    I am extremely excited to say that we now have a pull request up which introduces our new versioned\nCBOR serialization. This was an enormous effort, but it will solve a host of problems that we have\nhad since the Shelley phase. It will take time to properly review it, and we will\nneed to put in a lot of effort to integrate it with the downstream components, but this is a huge\nmilestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction\nserialization schemes.

    We also have a draft pull request that reworks how deposits are tracked. Users of the system will\nnot notice any difference, but it is a necessary change needed to prepare the way for\ndecentralizing the governance of Cardano.

    Finally, we continued to address technical debt. In particular, we continued to make progress on\nbringing coherency and consistency to the code base with a common naming convention, and\nimproving some error messages.

    Lower level summary

    • We have a pull request up for our new versioned CBOR serialization.\nWhen we encounter a problem with our deserializers, it can be very difficult to implement a fix.\nIt is difficult because we can only fix such issues during a hard fork, and leading up to the\nhard fork we must maintain two serializations for the same type in order to not cause unintended\nnetwork splitting (the problematic version must be used before the hard fork,\nand the fixed version is used afterwards).\nThis can be especially tricky with the FromCBOR typeclass, since it is not always easy to\nsearch for where all the problematic uses are located.\nThe new versioned CBOR serialization allows us to gracefully handle this transition.\nSee [pull-3138].
    • We proposed a CIP for backwards compatibility of the transaction serialization schemes.\nSee [pull-372].
    • We have draft for the new deposit tracking.\nThis draft is not as memory efficient as the final version will be,\nbut it is a sufficient proof of concept that we can write property tests against, ensuring\nthat we have not changed the semantics.\nWe will optimize after we are sure of the correctness.\nSee [pull-3127].
    • We now provide better support for debugging failed Plutus scripts in an important helper\nfunction, named evaluateTransactionExecutionUnits.\nIn particular, it now returns all the information needed to rerun the script with exactly the\nsame arguments. This feature will end up appearing in the CLI and other tools from the Plutus\ntools team.\nSee [pull-3135].
    • We did a lot more renaming to bring coherency and consistency to the code base.\nSee [pull-3126], [pull-3120], [pull-3118], and [pull-3116].
    • We have added a few things to the ledger repository to make it conform to the\nCardano Engineering Handbook\nSee [pull-3139].
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-11-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2022-11-11T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-11-11-network", + "content_html": "

    High-level summary

    In last sprint we got a performance report of P2P performance testing cluster\n(which consists of 50 nodes). There is a performance regression in the header\nnotification metric. The P2P cluster is constructed with the same\ntopology as the non-p2p reference one this indicates some regression which\nneeds to be further investigated. This poses a risk for releasing P2P.

    We also continued to work on peer sharing: pull #4019.

    We continued working on dynamic block production which is required for P2P\nrelease for BP nodes: pull #3159.

    We simplified the P2P topology format: issue #4559, pull #3888.

    We added a new trace point for asynchronous demotions of local peers with\nWarning severity. This trace is important for SPOs.

    Detail description

    Performance regression

    Below we include a graph which shows the performance regression of the P2P code base vs non P2P.

    On the x axis is time in seconds which measures the delay from the start of\nthe slot to when a header was received. The y axis is the percentile of nodes\nthat received a header. We are currently investigating possible causes of the\nregression.

    New P2P topology form

    The new topology file format is described in this issue #4559.

    Tracing improvements

    • We improved a handshake error reporting, pull #4136
    • We added TraceDemoteLocalAsynchronous rendered as DemoteLocalAsynchronous\nin json format, pull #4127. Such demotions should be investigated by the\npool operator. They can indicate a problem in the deployed system, but also\nthey could indicate a remote problem in arranged connections with other SPOs.

    Open Source Improvements

    We improved documentation of io-sim and typed-protocols for open-source\ncontributors and/or maintenance tasks: pull #22, pull #45, pull #48.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-11-network", + "title": "Network Team Update", + "summary": "High-level summary", + "date_modified": "2022-11-11T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2022-11-04-hydra", + "content_html": "

    High level summary

    This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun preview network, see 0.8.0 release notes. They also completed implementation of ADR18 and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates #195 and alignment of the specification document with auditors.

    What did the team achieve this week

    • Complete and merge ADR18 #579
    • Re-deploy hydra scripts to respun preview network, see 0.8.0 release notes #595
    • Have first gap of #452 in review.
    • Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot.
    • Engineering meeting to discuss hard forks and protocol parameter updates #195
    • Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions.
    • Drafted project scope for an external audit RFP.

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Answer the internal auditors questions
    • Have a draft RFP ready for a first review internally
    • Close some gaps #452
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-04-hydra", + "title": "Hydra Team Update", + "summary": "High level summary", + "date_modified": "2022-11-04T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-11-04-mithril", + "content_html": "

    This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.

    Low level overview

    • We have been moving forward on the implementation of the release process #500:
      • Setup of the new hosted environments for testing-preview, pre-release-preview and release-preprod with their terraform and GitHub environments #542
      • Adapted the CI workflows to work with the new release process #543
      • Publication of an ADR3
      • Publication of a dev blog post about Mithril networks evolution
      • Releasing our first Mithril distribution 2244.0
    • Worked on the API versioning mechanism #565
    • Worked on the implementation of the stores migration process for the signer and aggregator nodes #562
    • Prepared a Mithril devnet video demo #526
    • Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably #484
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-04-mithril", + "title": "Mithril Team Update", + "summary": "This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.", + "date_modified": "2022-11-04T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "mithril" + ] + }, + { + "id": "2022-10-31-open-source", + "content_html": "

    High Level Summary

    • We've been working toward publishing Cardano Backlog, currently its in\nreview by the IOG communication team.
    • We identified a number of libraries which can be published.
    • We setup and enhanced cardano-updates.

    Detailed description

    I am glad to announce that I was given the role of open-source advocate for\ncardano project. In last few weeks we were making steps towards publishing our\nbacklog. It's currently under review by the communication team, although most\nof the issues are already visible across various repositories.

    The open-source initiatives have their own\nproject. It is set up\nto help us track our major open-source activities. Right now there are two\nwork streams:

    We identifies a number of libraries across all the teams which contribute to\nCardano which we would like publish to publish, see the following\nlink. Arnauld Bailly recently published\nquickcheck-dynamic\nlibrary on Hackage. The networking team is slowly progressing towards\npublishing io-sim and related packages, checkout the progress\nhere.

    Thanks to Arnaud Bailly our Cardano Updates website has\na new look & feel! It's using docusaurus.io.

    Christian Taylor carried recently a detailed analysis of our open-source\nrepositories. He collected many interesting metrics, which allows us to see\nwhere we need to improve as an open-source project to make the Cardano project\nand many smaller related libraries which we maintain be more open and available\nfor open-source contributors.

    The graph below shows which documents the 55 most important Cardano\nrepositories are missing the most:\n\"Documentation\nYou can expect we will improve in these metrics in the coming weeks.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-31-open-source", + "title": "Open-Source Team", + "summary": "High Level Summary", + "date_modified": "2022-11-04T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "open-source" + ] + }, + { + "id": "2022-11-03-embedding-quality", + "content_html": "

    High level summary

    We made good progress on most of the Action Items we agreed on Lisbon, like:

    • Cardano System Tests was fully open to public (tools, tests, results)\nSee cardano-node-tests webpage.
    • We defined an user-facing-functionality template that is used with the cardano-cli team
      • this includes acceptance criteria & user stories, and definition of done
    • We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)
    • We started to apply a labelling convention on cardano-node issues that will be used to generate some visual dashboards with some metrics [TBD]
    • Ziyand Liu started an End-to-End Development and Testing Process for Plutus Features
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-03-embedding-quality", + "title": "Embedding Quality Workstream", + "summary": "High level summary", + "date_modified": "2022-11-03T00:00:00.000Z", + "author": { + "name": "Dorin Solomon", + "url": "https://github.com/dorin100" + }, + "tags": [ + "embedding-quality" + ] + }, + { + "id": "2022-10-02-consensus", + "content_html": "

    High-level summary

    During the past two weeks, the consensus team continued its work on testing the\nUTxO HD prototype. We completed the era-transition and backing store tests, and\nthe mempool tests are advancing at a steady pace. Regarding our work in the\nGenesis design, we continued our collaboration with the research and networking\nteams, and we continue investigating strategies for making the chain-sync\njumping prototype faster.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We worked on state-machine tests for the mempool, and spotted potential bugs\nin the implementation. Investigation is ongoing.
      • We have a set of property tests for the backing store. We still need to\nincorporate the improvements to the LMDB cursor API that these tests\nmade possible.
      • We merged the era-transition tests PR.
    • Genesis: on track.
      • Design work around Genesis continues in collaboration with researchers and\nthe networking team.
      • We continued trying to improve the performance of the chain-sync jumping\nprototype. We gained additional insight on which parameters to tweak next.\nIn spite of the baseline still being faster, the current prototype already\nachieves a significant speedup when compared to the naive approach of simply\nrunning full chain-sync with all peers.
    • Tech debt: on track.
      • We clarified a common source of confusion around VRF tie-breaking and\ncross-era chain selection.

    Workstreams

    Finish the UTxO HD prototype

    We continued working on property-tests for the UTxO HD prototype. In particular\nwe merged the era-transition tests\nPR.

    Backing store property tests

    The backing store property tests\nPR has been\nreviewed. The next steps are:

    • Improve error handling and command generation.
    • Add coverage testing to check that we are not failing to cover interesting\ntest cases.

    The monadic cursor API\nwent through its first review round. The API is in a relatively stable state.\nThis PR also unifies the cborg and serialise-based interfaces to LMDB\noperations. The next steps are:

    • Write\nquickcheck-dynamic\nstate-machine tests for this API.
    • Adapt the changes in the serialisation interface in the backing store property\ntests. This will involve adding boilerplate code in consensus to make up for\nthe removal of the cborg-based interface.

    LSM tree implementation

    We worked on the LSM tree\nprototype. In\nparticular, we focused on tuning the LSM tree design to the different workloads\nthat consensus has (eg syncing, normal node operation, etc).

    Benchmarking the CSJ prototype

    Work on improving the chain-sync jumping performance is ongoing. In particular\nwe compared the performance of different jump intervals, which, somewhat\nsurprisingly, do not make a significant difference. In particular, we are seeing\nperiodic \"plateaus\" where the chain-sync tip does not progress, but they are\nmuch longer for the prototype. Our hypothesis is that this seem to be due to a\ncombination of the garbage collector (GC) pauses, and the actual time it takes\nthe non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo\nfragment.

    In the coming weeks we will try to shorten these plateaus via a combination of\ntweaking GC options and less synchronisation in the CSJ governor.

    The following plot shows the performance of the chain-sync jumping prototype\nusing different jumping intervals. It compares the syncing progress by plotting\nthe slots of adopted blocks against time. The baseline is still faster, however\nit is worth noting that the current prototype already achieves a significant\nspeedup when compared to the naive approach of simply running full chain-sync\nwith all peers.

    The second plot shows the syncing progress sliced to a chosen ~5min interval,\nand includes, in addition to the slots of adopted blocks, the slots of the tip\nof the ChainSync fragment. This allows us to see how far ahead of the selected\ntip the CS dynamo is, i.e. how much room we have for BlockFetch not to get\nstalled. It shows periodic behaviour (due to the forecasting limit), and shows\nthat the CS fragment tip is not progressing for significant periods\n(\"plateaus\").

    Technical debt

    We clarified a\ncommon source of confusion around VRF tie-breaking and cross-era chain\nselection. This PR involved correcting potentially misleading names of\nVRF-related functions, and providing context for a particular VRF value is\nused for tie-breaking.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-02-consensus", + "title": "Consensus Team Update", + "summary": "High-level summary", + "date_modified": "2022-11-02T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-11-02-ledger", + "content_html": "

    High level summary

    We have made the decision to use the\nformal ledger repository\nin place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure\nto the model. In particular, we now have a lot of support for axiomatic set theory.\nWhile the next ledger era is still in the design phase, most of the team remains working\non technical debt.\nIn particular, we have moved a lot more code out of the Shelley specific modules and into\na ledger core module, we have finished up our benchmarking around the problematic TICKF\nledger transition (while improving the performance), made conveniences to the development\nenvironment, cleaned up all the recent changes to the cost model, added a lot of documentation,\nfixed some flaky tests, and deleted some dead code.

    Lower level summary

    Axiomatic Set Theory

    The formal ledger model now has support for much of the set theory that we make use of in\nthe formal ledger specifications. See [pull-20].

    Completed Technical Debt

    • We have addressed issues with two of our most problematic and flaky tests.\nSee [pull-3039] and [pull-3093].
    • We have added more documentation and tests to the Twiddler module. This is a module which\nmakes our CBOR serialization round-trip tests much more robust, and will also hopefully\nhelp enforce the mandate for downstream libraries to never re-serialize data that needs\nto be hashed. See [pull-3073] and [pull-3095]\n(we cannot merge 3095 just yet, due to a preference for merging other features).
    • We have finished our long analysis of the problematic TICKF transition.\nWe now have a lot of benchmarks surrounding this code, and have added performance improvements.\nSee [pull-3068] and [issue-3035].
    • We have restored support for\nghcid\nin our repository. This is a tool for developing with Haskell that many of us find greatly\nimproves our productivity by providing us with constant feedback from the type checker.\nSee [pull-3112].
    • After much activity on the cost model, we have done some final clean up of the code.\nSee [pull-3075] and [pull-3101].
    • We moved a lot of the existing user facing documentation regarding native tokens into the\nledger repository, and cleaned it up\n(most of the heavy lifting was done by our amazing technical writers).\nSee [pull-3091].
    • We removed dead code. See [pull-3089].
    • We moved a lot of code from the Shelley specific libraries to the ledger core library.\nSee [pull-3109] and [pull-3110].
    • We've removed more of the awkward legacy template Haskell names.\nSee [pull-3108].
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-02-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2022-11-02T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-11-02-node-cli-api", + "content_html": "

    2022-11-02 - 2022-11-15

    High level summary

    • Documentation improvments
    • Merged community contributions
    • Exposing types from cardano-api requested by the community/other teamss
    • Test output has been improved so diagnosing failures is now easier
    • Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)
    • Refactoring of cardano-testnet making it more useable as a library (ongoing)
    • Release 1.35.4 was merged & released

    Completed

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-02-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2022-11-02T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2022-11-02-release", + "content_html": "

    Node Reelease Update

    2022-10-19 - 2022-11-02

    Executive Summary

    The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset,\na temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8.

    1.35.4 release candidates have been created and are being tested internally and externally.

    Completed

    In Progress

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-02-release", + "title": "Node Release Team Update", + "summary": "Node Reelease Update", + "date_modified": "2022-11-02T00:00:00.000Z", + "author": { + "name": "Samuel Leathers", + "url": "https://github.com/disassembler" + }, + "tags": [ + "release" + ] + }, + { + "id": "2022-11-02-system-test", + "content_html": "

    High level summary

    We have been focused on:

    • Fully opening our test results (on top of the existing tests & tools):
      See cardano-node-tests webpage.
    • Started to test and automate the new functionalities added in the 1.35.4-rc1 node tag
      See test results tracking page.
    • Made some improvements to the automated db-sync sync tests
      See db-sync tests.
    • Multiple cleanups and updates to the cardano-node-tests framework
    • Updated the nightly pipelines for the cardano-node-tests after the Babbage HF
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-02-system-test", + "title": "System Test Team Update", + "summary": "High level summary", + "date_modified": "2022-11-02T00:00:00.000Z", + "author": { + "name": "Dorin Solomon", + "url": "https://github.com/dorin100" + }, + "tags": [ + "system-test" + ] + }, + { + "id": "2022-11-01-db-sync", + "content_html": "

    High level summary

    The DBSync team is preparing a release which introduces schema simplifications, removes indexes,\nunique and foreign keys. It also provides a way to fix older values and migrates without the need to\nresync from genesis.

    Lower level summary

    Schema simplifications

    Indexes, Unique and Foreign keys are removed in order to speedup syncing\n#1295\nThe same pr also introduces a different way to rollback, which doesn't rely on foreign keys and\nindexes.

    Performance

    The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A\nconservative number of these will be included in the next release and the rest can be found in\nperformance view.

    Migrations and resyncing

    The next release will be 13.1.0, it will enable a migration without the need to resync. It will also\nintroduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases\n#1294

    Release

    The release has been mostly cherry-picked from master\n#1294 and its scope can be seen\nrelease view

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-11-01-db-sync", + "title": "DB Sync Team Update", + "summary": "High level summary", + "date_modified": "2022-11-01T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2022-10-28-hydra", + "content_html": "

    High level summary

    This week, the hydra team completed several user experience improvements to the\nhydra-tui and hydra-node, and delivered a first version of persisted head\nstates by publishing release version\n0.8.0.\nBesides this, they met with researchers on topic of the HeadV1 specification and\nkicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation.

    What did the team achieve this week

    • Completed the UX improvements on the hydra-tui
    • Released version 0.8.0, which delivers a first version of persisted head states
    • Met with researchers on the HeadV1 specification
    • Started work on the RFP for our external audit

    What are the goals of next week

    • Complete ADR18 implementation and get it merged
    • Start work on event-sourced persistence #580
    • Have a first plutus script gap closed #452
    • Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-28-hydra", + "title": "Hydra Team Update", + "summary": "High level summary", + "date_modified": "2022-10-28T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-10-28-network", + "content_html": "

    High-level summary

    The team has focused on debuging & fixing bugs for the P2P single relay release, which included

    • diagnosing, fixing and writing tests for a bug in peer-state-actions which\nfortunately hasn't been released;
    • diagnosing & preventing misconfiguration of DNS

    We also focused on developing peer sharing. We also held a session with\nthe scientists on eclipse evasion.

    Detailed description

    P2P Network Stack

    During the past two weeks the team focused on p2p single relay release and peer\nsharing. We found and fixed an important bug recently introduced in one of the\ncomponents of p2p networking stack (fortunately never released). Together with\na fix, we designed a unit test diffusion simulation as well as quickcheck\nproperty test (both could reproduce it). We also changed the code in a way that\nif such a bug is reintroduced in the future, it will be obvious to diagnose.\nFor more see:

    Initial benchmarking run of the P2P code was executed. The results where\nunlike what we see on the mainnet. We found a possible misconfiguration of the\ncluster (caused by 0 TTL on domain names), which could be the direct cause of\nit. We wrote a PR which rules out such misconfiguration. We are awaiting on\nthe next benchmarking results. See more at:

    ouroboros-network#4106

    We also started working on P2P single relay release. The PR\nouroboros-network#4120\nincludes 108 patches cherry-picked from the master branch. We started\nworking toward integration these changes against the release branch of\ncardano-node. Early next week we ought to be able to have an early version\nof cardano-node with non experimental P2P support!

    For more detailed release plan please see P2P - Single\nRelay\nissue.

    Consensus

    We identified and fixed missing error reporting in consensus\ninitialisation phase. See more at\nouroboros-network#4015

    Cardano Node

    We also made changes in cardano-node in order to give better experience for\nnode operators. This includes updating severities of some of the traces as\nwell as implementing new format of the p2p topology file. For more see:

    Peer Sharing

    We continued working on implementation of peer sharing. We have an early\nimplementation which will be reviewed and analysed in next weeks. We started\nworking on cardano-node integration. We need\nPR #4392 to be merged\nbefore such integration will be able to land in cardano-node, although this\nis not blocking us currently. See more at:

    Eclipse Evasion

    We held a session which included Alexander Russel, Sandro Coretti-Drayton and\nNick Frisby from the consensus team. We discussed high lever design of the\neclipse evasion scheme, which is important for the design and implementation of\nouroboros-genesis. We got a positive feedback from the researchers.

    IO-Sim

    In this period we made little progress towards releasing IO-Sim on Hackage.\nA single PR which added\na few missing instances of the STM monad.

    Open Source

    We made sure the CI runs for PRs which comes from forks (which is important to\naccept contributions from 3rd parties).

    Mithril Cardano Integration

    We held initial discussions with Arnaud Bailly about possible path to integrate\nmithril to cardano-node and take advantage of the ouroboros-network\ndiffusion layer.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-28-network", + "title": "Network Team Update", + "summary": "High-level summary", + "date_modified": "2022-10-28T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2022-10-28-performance-and-tracing", + "content_html": "

    High level summary

    On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline.

    On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario.

    Executive summary

    • The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale.
    • The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment.
    • The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-28-performance-and-tracing", + "title": "Performance & Tracing Team Update", + "summary": "High level summary", + "date_modified": "2022-10-28T00:00:00.000Z", + "author": { + "name": "Serge Kosyrev", + "url": "https://github.com/deepfire" + }, + "tags": [ + "performance-tracing" + ] + }, + { + "id": "2022-08-12-sre", + "content_html": "

    High level summary

    The SRE team is heavily working on the Equinix Metal migration, replacing Hydra\nwith Cicero, and a new version of Spongix.

    Lower level summary

    OpenZiti

    • Work is ongoing on our OpenZiti integration into Bitte in [bitte-zt].
    • CI-World deployment of Darwin CI Ziti service in [ci-world-commit-d40f4d].
    • Multiple issues filed, and a lot of discussion with the OpenZiti developers,\nwe're making pretty rapid progress thanks to them.
    • Work on getting Equinix baremetal machines integrated into AWS World Bitte\nclusters utilizing a Ziti ZTNA network overlay to bridge the networking of\nthe two environments and get IAM extension to Equinix machine for Nomad\nclient onboarding.
    • A Nix Flake for most of our OpenZiti dependencies including the Console,\nController, Edge Tunnel, and Router is now at [openziti-bins].
    • The Flake also includes a WiP NixOS modules for these components.
    • Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with\nno issues seen so far
    • Moved the console to traefik routing service (zac.$DOMAIN) and\ncontroller/edge router stay at zt.$DOMAIN, but have registered consul\nservices

    Cicero & Tullia Integrations

    Cicero & Tullia Features

    • Improvements to Tullia task aggregation to make [cardano-addresses] build\ncorrectly.
    • Better tullia CUE lib default for tags [tullia-commit-4df3c5d].
    • Put cache.nixos.org back in cache.iog.io's upstreams. This is now\nconsidered a public cache again, and without it some Cicero evaluations had\nto build huge packages.
    • Started working on a flake-parts module for Tullia.
    • Started working on cutting down Tullia task build time by putting facts in\nJSON files.
    • Fixed running into kernel arg limit by reading tullia's DAG from a file
    • Merged [tullia-pull-9] that fixes several issues related to error reporting.\nand escaping.
    • Added Mac builders in Cicero on CI-World.
    • Started work on Tullia invocation caching.

    Spongix

    • A lot of progress on an SQlite backed version of Spongix, it already supports\nthe full HTTP binary cache protocol but still lacks comprehensive testing and\nsome tuning, as well as recursive lookups.
    • First steps in the implementation of the nix-daemon ssh-ng protocol so\nSpongix can be used via SSH and we can get rid of basic auth.

    Bugs

    • Discovered Cicero bug where Nomad reschedules cause the Github commit status\nto get stuck in pending
    • Discovered Cicero race condition bug around concurrent transactions for\ncodependent actions.
    • Fixed tullia task order bug in [cardano-addresses]
    • Diagnose Cicero action not triggered in [abcirdc]
    • Fixed meta/description of the Tullia package in [tullia-pull-7]
    • Add Vault token loop alerts in [bitte-cells-pull-40]
    • Ongoing investigation on recurring Patroni and nomad-follower issues related\nto token rotation.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-08-12-sre", + "title": "SRE Team Update", + "summary": "High level summary", + "date_modified": "2022-10-28T00:00:00.000Z", + "author": { + "name": "Michael Fellinger", + "url": "https://github.com/manveru" + }, + "tags": [ + "sre" + ] + }, + { + "id": "2022-10-27-crypto", + "content_html": "

    High level overview

    The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to\nmeeting the acceptance criteria in cardano-base,\nwhich lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and\nwe are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution,\nbut also progressing on the implementation.

    Low level overview

    SECP built-ins

    • (missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in PR 313
    • CIP-0049 was addressed in the editors meeting, and PR 250 was merged
    • The unit-tests PR 320 is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.

    KES agent

    • We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them.
    • We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-27-crypto", + "title": "Crypto Team Update", + "summary": "High level overview", + "date_modified": "2022-10-27T00:00:00.000Z", + "author": { + "name": "Iñigo Querejeta Azurmendi", + "url": "https://github.com/iquerejeta" + }, + "tags": [ + "crypto" + ] + }, + { + "id": "2022-10-21-hydra", + "content_html": "

    High level summary

    This week, the hydra team reviewed and addressed several open comments on the\nnew HeadV1 specification, completing a list the of identified gaps between\nspecification and implementation while doing so. In the wake of the recent\ndemonstration of SundaeSwap running their DEX in a Hydra Head, they met with\nthem to capture feature ideas & incorporate their feedback on the roadmap, as\nwell as potential research avenues.

    What did the team achieve this week

    What are the goals of next week

    • Complete the last two items required for a version 0.8.0.
    • Cut the next release, version 0.8.0
    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Have the CI build macos artifacts
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-21-hydra", + "title": "Hydra Team Update", + "summary": "High level summary", + "date_modified": "2022-10-21T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-10-19-node-cli-api", + "content_html": "

    2022-10-19 - 2022-11-01

    High level summary

    This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:

    • Ask the node about the current mempool's capacity and sizes
    • Request the next transaction from the mempool's current list
    • Query if a particular transaction exists in the mempool

    Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric tx_submit_fail_count has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:

    • Documentation improvments
    • Release 1.35.4 was merged & released
    • Exported various types from cardano-api that were requested by community members

    Completed

    cardano-cli

    cardano-api

    cardano-submit-api

    cardano-node

    cardano-testnet

    • None

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-19-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "High level summary", + "date_modified": "2022-10-19T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2022-10-18-consensus", + "content_html": "

    High-level summary

    During the past two weeks, the consensus team worked on adding property test for\ndifferent aspects of the UTxO HD prototype: era transitions, mempool, and\nbacking store. Thanks to these tests we were able to uncover a bug in the\nprototype. On the Genesis front, we benchmarked a different version of the\nChainSync jumping prototype to try to improve its performance, but this did not\nresult in any noticeable speedup.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We focused on increasing test coverage for the UTxO-HD prototype:
        • We started implementing Cadano-eras transition property-tests.
        • We started implementing state-machine property-tests for the mempool.
        • We merged the mempool rewrite.
        • We started working on state-machine tests for the backing store. This\nuncovered a bug in the range-read implementation of the LMDB backing\nstore.
    • Genesis: on track.
      • We benchmarked a version of the Genesis ChainSync Jumping prototype that\nspreads out the ChainSync updates over a longer period of time. This did not\nresult in any noticeable speedup.
      • We investigated the overhead introduced by non-ChainSync components, but no\nconclusions could be drawn from the benchmarks we ran.

    Workstreams

    Finish the UTxO HD prototype

    We focused on increasing test coverage for the UTxO HD prototype. We also merged\nthe mempool\nrewrite.

    Era transition property tests

    We started implementing Cardano era transition property\ntests,\nwhich are needed for making sure that the ledger tables get updated in the\nright way when we move from one era to the next. There are at the moment two\nimportant transitions.

    • Byron to Shelley: where all the UTxO is transferred from in-memory Byron\nstate (which has no tables) to the ledger tables of the Shelley state.
    • Shelley to Allegra: where the AVVM addresses must be deleted.

    We have tests for the Byron to Shelley transitions. We are working on adding\nthe remaining ones.

    Mempool state-machine tests

    We started implementing state-machine property tests for the\nmempool.\nThe mempool is currently tested via pure property tests, and use a ledger\nstate without tables. With the introduction of UTxO HD, testing the concurrent\nbehavior of the mempool became of crucial importance (eg now we have to\nacquire locks to flush the backing store). In addition, we need to test a\nledger state with tables. These needs led to the creation of a new set of\nproperty tests. In particular we aim to run parallel state-machine tests that\nexercise the mempool in a way similar to how the node would make use of it.

    Backing store property tests

    We started working on state-machine tests for the backing\nstore that UTxO\nHD uses. The property tests uncovered errors in the range-reads implementation\nof the LMDB backing store. To facilitate fixing this bug, we made\nchanges to the Haskell\nLMDB bindings.

    Benchmarking the CSJ prototype

    Prompted by previous benchmarks showing significant improvements in sync time by\nusing more capabilities, we implemented a way to spread out the ChainSync\nupdates over a larger period instead of firing them all at the same time. This\ndidn't result in a noticeable speedup.

    We also benchmarked the prototype with CSJ disabled (such that just the dynamo\npeer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule\nout/confirm overhead by non-ChainSync (mainly BlockFetch) related components.\nThis results in era-specific behavior (speed is like the prototype in Byron, but\nlike the baseline in Shelley). This deserves a closer look in the future.

    This diagram shows the respective syncing progress, starting at Genesis and\ncontinuing a good part into Shelley (with the dashed line indicating the\nByron-to-Shelley transition).

    • Red: baseline
    • Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps.
    • Blue: like Green, jumps are spread out.
    • Orange: variant with no jumping, to measure unrelated overhead.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-18-consensus", + "title": "Consensus Team Update", + "summary": "High-level summary", + "date_modified": "2022-10-18T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-10-14-hydra", + "content_html": "

    High level summary

    This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the hydra-node over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks \"past the opening of a Head\". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.

    What did the team achieve this week

    • Last week we thought we were done with ADR18, but were not ...
    • ... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence.
    • Implemented a first version for persistence #187 in response.
    • Enhanced CI to publish test results on our website
    • Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!
    • Pulled static executable feature #200 into scope, implemented it and merged it!
    • Received and read through a project proposal by a vendor (building a Hydra platform).

    What are the goals of next week

    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Cut the next release, version 0.8.0
    • Address open comments on specification document & complete the list of identified gaps between specification and implementation #452
    • Have the CI build macos artifacts
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-14-hydra", + "title": "Hydra Team Update", + "summary": "High level summary", + "date_modified": "2022-10-14T00:00:00.000Z", + "author": { + "name": "Sebastian Nagel", + "url": "https://github.com/ch1bo" + }, + "tags": [ + "hydra" + ] + }, + { + "id": "2022-10-14-ledger", + "content_html": "

    High level summary

    The ledger team is still primarily focused on addressing\ntechnical\ndebt.\nWe now have the infrastructure for versioning our serialization schemes,\nwhich we continue to put into action.\nWe have made first steps towards getting proper support for the\nformal ledger repository\n(in particular, we've added nix builds and\ncontinuous integration support).\nWe are wrapping up an investigation of the performance of a critical\nfunction used by the consensus layer for leader checks.\nFinally, we are improving the packaging and versioning of our code.

    Lower level summary

    Completed Technical Debt

    • Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of\nour code lives in the cardano-ledger-shelley package, though with hindsight we can say that\nmuch of it should live in cardano-ledger-core.\nWe continue to move things to cardano-ledger-core, and have much more to come. [pull-3059]
    • We now have the infrastructure to support versioned serialization schemes.\nThe inability to do this has caused us a lot difficulties,\nsuch as [issue-3003], [issue-2965] and [issue-2444].\nWe are still in the process of switching to the versioned serialization scheme\n(such as [pull-3078]),\nbut the infrastructure was completed in [pull-3063].
    • We now have proper nix and CI support for the formal ledger project. [pull-19]
    • A separate team is helping bring support for\nCHaP\nto all the cardano-node repositories.\nWe have been helping out with this effort.
    • A separate team continues working on upgrading all the\ncardano-node repositories to work with ghc 9.2.4.\nWe have been helping out with this effort.

    In-progress Technical Debt

    We also have several fairly large pull-requests in review\nthat we are working on.

    • In an on-going attempt to build out a more user-friendly API,\nwe continue to remove HasField instances in place of using micro-lenses.\nThe protocol parameters, in particular, are being worked on. [pull-3045]
    • We are also renaming record fields to be consistent across the repository. [pull-3062]
    • We are now cleaning up all the work we did to understand the performance\nof the TICKF transition. We have some improvements to the computatation\nas well. [pull-3068]
    • We are adding more documentation, in particular to our Twiddler functionality. [pull-3073]
    • The formal ledger is adding support for finite set theory. [pull-20]
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-14-ledger", + "title": "Ledger Team Update", + "summary": "High level summary", + "date_modified": "2022-10-14T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-10-05-consensus", + "content_html": "

    High level summary

    During the past two weeks, the consensus team worked on improving the\nperformance of the ChainSync jumping logic, which is needed for Genesis. We also\nrewrote the implementation of the mempool in the UTxO HD prototype which solved\nthe issues that prevented us from running system level benchmarks. Also on the\nUTxO HD front, we have an improved implementation of the sequence-of-differences\n(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for\nthe UTxO HD feature.

    Executive summary

    • With the latest implementation of ChainSync jumping we are closer to the\nbaseline performance. In particular, the prototype seems to benefit from the\nextra concurrency provided by additional capabilities.
    • We rewrote the implementation of the mempool in the UTxO HD prototype. This\nrewrite was required due to performance problems we observed when running the\nworkbench.\nThese performance problems prevented us from running system level benchmarks.\nThe rewrite solved these issues. After the UTxO-HD: mempool\nrewrite PR is\nmerged, we will contact the Benchmarking team so that they run the system\nlevel benchmarks.
    • The implementation of sequences of differences based on anti-diffs was\nintegrated into the UTxO HD prototype. It is pending\nreview and\nwe also need to run replay and syncing benchmarks to confirm that this will\ndeliver a performance improvement, as observed in our micro-benchmarks.
    • The UTxO HD prototype\ninspection\nresulted in a list of\ntests\nneeded for consensus to consider the UTxO HD prototype as fully tested.

    Additional information

    Genesis

    Benchmarking setup: 50MBit/s, 50ms latency

    • Red: baseline
    • Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.

    As ChainSync Jumping involves many concurrent network operations at every jump,\nwe tried to run the node with 6 instead of the default 2 capabilties.

    • Orange: baseline with 6 capabilities
    • Blue: CSJ prototype with 6 capabilities

    This diagram shows the respective syncing progress, starting at Genesis and\ncontinuing a good part into Shelley (with the dashed line indicating the\nByron-to-Shelley transition).

    Further work includes whether we can tune the prototype to better handle few\ncapabilities, or to adapt the default number of capabilities (potentially just\nwhile syncing).

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-05-consensus", + "title": "Consensus Team Update", + "summary": "High level summary", + "date_modified": "2022-10-05T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-10-04-db-sync", + "content_html": "

    DBSync Update

    Fast restarts

    We fixed a long overdue issue in db-sync which caused long delays on restarts\n1266. This has been\none of db-sync main objectives for this period. Restarts are now very fast,\nbecause db-sync deletes almost nothing from the db, it just replays the ledger rules until it\nreaches the tip of the db. The fix also improves reconnection speed, in cases where the node\nrestarts or the connection is temporarily lost. It also speeds up even more in cases where due to a\ndeployment mess up a very old snapshot or no snapshot at all is used.

    Property based testing

    We added stateful property based testing, using quickcheck-state-machine\n1269. These tests use empty or\nalmost empty blocks to test the new behaviour of restarts and rollbacks.

    These tests generate arbitrarily a list of symbolic commands from these:

    RollForward Int
    RollBack BlockNo
    StopDBSync
    StartDBSync
    RestartNode
    AssertBlockNo BlockNo

    The commands are translated into real commands. For example RollForward Int will forge a new block\nthat fits on the current chain. These real commands are executed against db-sync using the mock\nchain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync\nwhich looks like this:

      Model
    { serverTip :: BlockNo
    , dbSyncTip :: BlockNo
    , dbSynsIsOn :: Bool
    , dbSynsHasSynced :: Bool
    }

    Finally a number of postconditions are checked, related to the eventual block number of db-sync.

    Tech Debt

    We handled a number of tech debt in\n1275\nThis improves the code format of db-sync, deletes many queries that were never used and groups the\nothers. This tech debt resolution not only improves the experience of working in db-sync, but can\nfacilitate some of our other objectives, as it makes it very explicit which queries are used\nduring syncing and which indexes are necessary.

    Smash

    We worked on fixing an issue related to fetching pool metadata\n1276.\nThe issue which is described in\n1270

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-04-db-sync", + "title": "DB Sync Team Update", + "summary": "DBSync Update", + "date_modified": "2022-10-04T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2022-10-04-node-cli-api", + "content_html": "

    Node-Api-Cli Update

    2022-10-04 - 2022-10-18

    Executive Summary

    The majority of the team's time was spent between getting 1.34.4 ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to cardano-cli.

    Completed

    cardano-cli

    cardano-api

    cardano-node

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-10-04-node-cli-api", + "title": "Node API & CLI Team Update", + "summary": "Node-Api-Cli Update", + "date_modified": "2022-10-04T00:00:00.000Z", + "author": { + "name": "Jordan Millar", + "url": "https://github.com/Jimbo4350" + }, + "tags": [ + "cli-api" + ] + }, + { + "id": "2022-09-30-ledger", + "content_html": "

    Ledger Update

    We have continued focusing nearly entirely on addressing technical debt.\nA lot of design work has begun for the next ledger era,\nbut we do not yet have anything concrete to share.

    Technical debt issues completed

    • [issue-1676][pull-2992] We have finally removed the ledger dependency on the\ncardano-prelude package. It was barely used in the ledger repository, and it added a dependency\nthat we did not want to maintain. It was a bit difficult to remove, and we had\nto coordinate removing it from cardano-base.\nA lot ended up going into pull-2992, due to the coordination effort, and we ended\nup updating Plutus as well.\nThis means that we've now also made a lot of progress on the problematic cost model serialization\nissues described in issue-2902.\nIn particular, after we resolve issue-3014, we will not have to wait an epoch before\nreleasing a cost model for a new version of Plutus, as we had to do for the Vasil HF.
    • [issue-3046][pull-3055] We moved a module that is now only used in Byron to a Byron package.
    • [issue-3047][pull-3054] We improved the interface to the Value (multi-asset) type.
    • [pull-3044] We debugged and fixed a tricky compilation issue. Certain kinds of field updates\nwere adding approximately 20 minutes to our compile time!
    • [issue-2932][pull-3036] As a part of our ongoing re-organization of the codebase, we\nhave added a Cardano.Ledger.[Era].Core module to each ledger era that has a TxBody class.\nMost classes defined in the era should go in this new module.\nWe also re-export the Cardno.Ledger.Core module and the previous Cardano.Ledger.[Era].Core\nmodules from each era.

    Technical debt in progress

    • [issue-3034][issue-3035][node-issue-4421] We are continuing to write benchmarks to understand exactly where\nall the time is being spent on executing the TICKF transition.\nThe consolidation of the per-stake-credential stake distribution to the per-stake-pool\ndistribution does seem to account for a large amount of time (near a second as written, which we\nhave down to about half a second with some optimizations),\nbut this does not account for everything.\nApplying the reward update may also be a big contributing factor.
    • [pull-3033][pull-3038][pull-3041] A separate team is working on upgrading all the\ncardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort.
    • The nix scripts used to build our new\nformal ledger model\ndo not work consistently for everyone, and we have been working on fixing these issues.
    • [issue-3014] We are still working on adding a versioning scheme to all of the ledger\nserializers.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-09-30-ledger", + "title": "Ledger Team Update", + "summary": "Ledger Update", + "date_modified": "2022-09-30T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-09-27-network", + "content_html": "

    Network Update

    Ouroboros Network

    Ouroboros Consensus

    • Recently we found out that the consensus does not log exceptions thrown during\nintiialisation. This was fixed in\nPR input-output-hk/ouroboros-network#4015\nAs part of this pull request we also changed that all exceptions rethrown by\nthe connection handler thread are wrapped in ExceptionInHandler.

    Some older items, which were not announced

    • We identified and fixed an issue related to socket activation (socket options\nwhere not set for sockets passed through socket activation).\nPR input-output-hk/cardano-node#3979\nThis fix will be released in the next cardano-node release.

    Cardano Node

    • We extended the NixOs service module so that one can modify socketPath,\nruntimeDir, databasePath, traceSocketPathAccept,\ntraceSocketPathConnect and stateDir options.\nPR input-output-hk/cardano-node#4196

    IO-Sim

    We resolved a number of issues before release of io-sim on hackage:

    See PR #24.

    We also improved experience for contributors of io-sim and typed-protocols by adding issue templates:

    Typed Protocols

    Input Endorsers Simulation

    New features include:

    • Histograms of block arrival frequency, for both network (inbound) and CPU\n(block validation). This is interesting to check that we're not overloading\nthe CPU block validation capacity, or network link capacity. Or alternatively\nto observe the behaviour in an overload situation if we set the block\ngeneration rate high enough.

    • Pie chart of utilisation of TCP links. This shows how small a fraction of\nlinks are being used at any one time, and shows that once the system \"warms\nup\" and is operating stably, most block delivery is ballistic.

    • Showing off the new screen layout combinators, that let us put multiple\ncharts, titles etc on screen at once and scale them to whatever screen or\nvideo resolution we like without having to tweak numbers (this example is\nscaled to fit 1080HD video resolution).

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-09-27-network", + "title": "Network Team Update", + "summary": "Network Update", + "date_modified": "2022-09-27T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + }, + { + "id": "2022-09-20-consensus", + "content_html": "
    • We proposed a fix for the performance degradation observed when running\ndistributed multi-node benchmarks in the UTxO HD feature branch. While this\nfixed the problems observed when running local benchmarks, it broke the\nThreadNet tests due to concurrency issues. Therefore, we think it is wise to\nstart redesigning the UTxO HD mempool integration.
    • We did several rounds of code review on the alternative implementation of\ndiff-sequences required by the UTxO HD feature based on the idea of\nanti-diffs. This alternative implementation is close to being merged, and the\nnext step is to integrate this to the UTxO HD branch, so that we can run\nad-hoc replaying and syncing from scratch benchmarks and compare these with\nthe baseline. The micro-benchmarks we elaborated for the alternative\nimplementation show speedups of up to 4x, so we are optimistic about the\nperformance of replaying and syncing from scratch benchmarks, however it is\nimportant to notice that due to the nature of UTxO HD we will still be\nslower than the baseline.
    • The final draft of the Genesis implementation specification is ready for\nreview.
    • We implemented a prototype for the happy path of Genesis' ChainSync Jumping\n(CSJ). The prototype is slower than the baseline, however it is not the latest\nversion of the prototype and the jump interval is very small.
    • Work on integrating Conway has stopped since\npriorities have changed.
    • We started work on benchmarking epoch-boundaries and epoch overhead\npr-4014. To this end, we made use of a modified version of our\ndb-analyser tool. We ran the new benchmarking setup using the Cardano\nmainnet chain, and we can see that block tick and application take\nsubstantially longer at epoch boundaries, although there are a couple of slots\nduring an epoch in which these computations take more than normal. We notified\nthe ledger team about these findings. We will use this modified version of\ndb-analyser to investigate the epoch overhead.

    Workstreams

    UTxO HD

    • Spent quite some time investigating the root cause of the degradation in\nperformance observed in the benchmarks. We run the make forge-stress\nbenchmarks locally in order to debug this behavior.

      • Transaction batching doesn't make a notable difference in the outcome\n(considering we are using the in-memory backend).

      • The mempool batching implementation required asynchronous transaction\nvalidation which is a violation of the LocalTxSubmission protocol\ncontract and therefore if we continued on that route, the impact would\nhave been quite big.

      • The STM logic we implemented by using a TMVar for the mempool internal\nstate was buggy and under certain circumstances it seemed to lock.\nReverting the mempool internal state to be stored in a TVar seems to\nsolve this problem.

      • The results we get after this change look almost identical to the ones\nfrom the baseline.

    • The anti-diff prototype (PR\n#3997) has\nbeen reviewed and is close to being merged.

      • A follow-up issue (issue\n#4010)\nto integrate the anti-diff prototype in the various consensus packages\nwas created. A first version of the integration exists, and all tests\npass. A next step is to get some indication of the \"real\" performance gain\nby profiling db-analyser (or cardano-node).

    Genesis

    • Final draft of the Genesis implementation specification, now up for review.

    • Local benchmark setup for parameter tuning via the happy path ChainSync\nJumping (CSJ) prototype (Issue 3987).

      • Context: Our Genesis design requires us to check in with a large (~20)\nnumber of servers periodically while syncing. These servers are offered\njump requests via the ChainSync protocol (hence the name), which they can\naccept or decline. If a peer declines, the Genesis rule allows us to\ndetermine whether a node actually has a better chain.

      • The \"happy path\" is when no peer declines a jump. We want this to have\nclose to no overhead compared to status quo, i.e. syncing without Genesis.

      • We implemented a prototype for this happy path, and are now starting to\ntest in various configurations (number of peers, latency, bandwidth) to\ntune the performance of ChainSync jumping, i.e. how complicated our logic\nof choosing when to jump needs to be.

        Example:

      • Simulated connection: 50 MBit/s, 50ms latency

      • Jump interval: 3000 slots (on the low end, could be increased to up to\n3k/f)

      • Red: baseline (1.35.3), one peer in topology file

      • Blue: Preliminary version of our prototype, with 10 peers.

        It is slower by about ~30%, but it is not the latest version of the\nprototype, and the jump interval is very small, making CSJ more of a\nbottleneck.

    Technical debt

    • Fix flakiness in ChainDB QSM tests (PR 3990).
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-09-20-consensus", + "title": "Consensus Team Update", + "summary": "- We proposed a fix for the performance degradation observed when running", + "date_modified": "2022-09-20T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-09-19-db-sync", + "content_html": "

    DBSync Update

    New Tag

    We created a new db-sync tag 13.0.5 which addresses shortcomings of the last\nrelease 13.0.4. It is currently under testing.\nThe Changelog is\nhere and in more details:

    • We fixed fees for tx with phase 2 failure that didn't include a total collateral field.\n1248

    • We fixed an issue that could cause db-sync to crash if a specific rollback occured.\n1247

    • DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but\ncould result in the wrong CBOR encoding being inserted.\n1217

    • All the fixes above come with unit tests which validates the fix.

    • Added support for preprod and preview from docker. DBSync no longer needs to include the configs\nfor different networks, these are directly fetched from the cardano world.\n1254

    • We added better support from docker for the new disable options and the overall documentation.\n1260

    All the above were also backported to the master branch

    Open source

    We made the db-sync board public, so\neveryone can have access on the issues we prioritise.\nWe also added new tasks to the board, some of them could be approachable to newcomers or people who\nwant to contribute.

    Progress on tech debt and new features

    • 1223 was merged, which removes the\nforeign keys from the db schema. This opens the road to a number of optimizations.

    • An additional fix on top of the previous work was added\n1250

    • An initial version where DBSync does not rollback on restart is done here\n1266.\nThis allows db-sync to restart much faster, without the need to delete data and reinsert them. In\nthe future it can also facilitate migrations in cases where the ledger snapshots have a breaking\nchange, without the need to resync everything from genesis.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-09-19-db-sync", + "title": "DB Sync Team Update", + "summary": "DBSync Update", + "date_modified": "2022-09-19T00:00:00.000Z", + "author": { + "name": "Kostas Dermentzis", + "url": "https://github.com/kderme" + }, + "tags": [ + "db-sync" + ] + }, + { + "id": "2022-09-16-ledger", + "content_html": "

    Ledger Update

    We have been focused nearly entirely on addressing technical debt.

    • We introduced more consistent naming across eras, this time for the auxiliary data.\nSee 3032.
    • We made clear how the consumed functions differs between eras (which was a previous source of\nconfusion), and added some related support to the fledgling ledger API.\nSee 3016.
    • We added clarity and organizational consistency to the main ledger era type synonyms.\nSee 3017.
    • We removed code duplication related to the input data hashes.\nSee 3018.
    • We split up a large module into smaller components. The large module was actually causing our\nCI to time out.\nSee 3020.
    • We cleaned up stale information in our cabal files, and upgraded cabal 3.8.\nSee 3023,\n3031,\nand 3028.
    • We made consistent, standalone TxOut (transaction output) modules for every era.\nSee 3024.
    • We brought consistency to a maddening inconsistent use of type variables indicating the specific\nchoice of cryptographic primitives. In particular, all uses of crypto have been renamed to c.\nSee 3027.
    • We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric\ntypes that will compose better in the future and which simplifies the constraints.\nSee 3029.
    • We consolidated some existing fragmented logic regarding how we gather the scripts needed for a\ngiven transaction. This is a much needed cleanup to prevent future mistakes.\nSee 3019.
    • We fixed a problem with our generators that was causing a fair number of our property tests to\nfail in CI.\nSee 3039.
    • We have started the work to update Plutus. This will bring support for SECP in the next major\nprotocol version, and also address a\nproblem\nthat we current have evolving the cost models.\nSee 3030.
    • We addressed a small issue that came up when integrating the conway era downstream, namely\nthe lack of some serialization instances.\nSee 3022.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-09-16-ledger", + "title": "Ledger Team Update", + "summary": "Ledger Update", + "date_modified": "2022-09-16T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-09-01-ledger", + "content_html": "

    Ledger Update

    Since finishing up support for the Vasil Hardfork, the ledger team has been\nfocused on two main things: a new ledger era and technical debt.

    New minimal ledger era

    We have implemented a new ledger era named conway which is nearly identical\nto the babbage era. This has been the first time that we have been able to see\nwhat a minimal ledger era looks like. We have finished this task, modulo any\nintegration issues that might come up. The only thing that the conway era\ndoes differently from the babbage era is provide support for rotating\nthe master keys using the hardfork combinator's state translation.\nWe may end up adding features to the conway era, but it is a nice exercise\nseeing what it looks like to get a minimal ledger era supported in all the\ndownstream components.

    Addressing technical debt

    We have been addressing technical debt, mostly in an effort to make the\nrepository a more friendly code base to work in.

    • We have begun work on a ledger API, called cardano-ledger-api.
    • We have done a big re-design of the major type classes used in the ledger.\nWith hindsight on our side, we now have something much more organized and\neasier to use.
    • We have done a lot of re-naming. The names across eras are now much more\nuniform, avoid certain confusions that plagued us, and are clearer in where\nthey are from.
    • We have reduced a lot of code duplication that could lead to bugs if you\ndo not have the whole code base in your head.
    • We have added a handful of performance improvements.
    • We added type safety in a number of locations. In particular, the type of\nvalues that can be minted in a transaction no longer allow for Lovelace\nin the type, and some functions which used to handle both timelock scripts\nand plutus script now correctly enoforce at the type level that only one of\nthem can be used.
    • We made our generators so that they now produce a much richer set of\nvalid serializations. There is room within CBOR to serialize the same\ndata structure in multiple ways, and it is helpful to have the generators\nuse a wide variety.
    • We have begun re-organizing our test suites.
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-09-01-ledger", + "title": "Ledger Team Update", + "summary": "Ledger Update", + "date_modified": "2022-09-01T00:00:00.000Z", + "author": { + "name": "Jared Corduan", + "url": "https://github.com/JaredCorduan" + }, + "tags": [ + "ledger" + ] + }, + { + "id": "2022-08-31-consensus", + "content_html": "

    Executive summary

    • We did most of the heavy lifting required to integrate the Conway era.
    • We have property tests for the UTxO HD backing store API implementations. A\npossible bug was identified. Work is ongoing to make sure the property-tests\ncover all the relevant cases.
    • We implemented and benchmarked the \"anti-diff\" prototype to speed up the UTxO\nHD functionality. Results show a rough speedup of 4x to 5.5x across\nseveral scenarios. Note that: \"Data reported by tasty-bench is only of\nindicative and comparative significance.\".\nWe are investigating additional performance improvements. The \"anti-diff\"\nprototype and benchmarks are still pending code review.
    • We elaborated a draft specification for the Genesis implementation and\nChainSync jumping optimization.

    Workstreams

    Conway

    • Integration PR of the minimal Conway era (Issue #3963, PR\n#3971).
    • Discussions with Ledger revealed possible sources of confusion about which\ndata should be changed in the Conway era. As a result, a new technical debt\nissue was raised, which does not block the integration of the Conway era\n(Issue #3976).

    UTxO HD

    • Issue #3954, branch: The functionality of a\nbacking store, which is the interface to the on-disk part of ledger state in\nUTxO-HD, is tested at a high level through the OnDisk tests. However, some\nfunctionalities remain untested, e.g., reads of ranges of keys. As such, we\nhave implemented quickcheck-state-machine tests that exercise backing stores\ndirectly. The tests are reusable for different backing store implementations\nbecause the tests are implementation-agnostic: Any backing store that conforms\nto the backing store interface can be plugged into the tests. Work is still\nongoing to label/monitor the tests, such that we can verify that interesting\ncases are being tested. Furthermore, a possible bug has been identified in the\nLMDB backing store with respect to range reads, though the bug has not been\nresolved yet.

    • Issue #3946, branch, PR #3882: The\n\"anti-diff\" prototype proposes an alternative approach to keeping track of\nsequences (more specifically, FingerTrees) of diffs. These diff sequences\nare a component of the in-memory parts of the ledger state in UTxO-HD. Since\nthe consensus code often requires the cumulative diff of a sequence of diffs,\nthe current implementation \"caches\" cumulative diffs of each subtree in the\ndiff sequence. This caching allows relatively fast reconstruction of the total\ncumulative diff, but this caching proved to incur a non-negligible cost: when\nwe manipulate diff sequences through splits and appends, we force re-computing\na logarithmic number of caches. This is problematic, since we often split and\nappend in consensus: we split when we flush diffs to a backing store or when\nwe roll back blocks, and we append when pushing blocks. The new approach\nshould reduce the overhead of this caching.

      We implemented micro-benchmarks for the \"anti-diff\" prototype: we\nfirst generate a sequence of commands (Forward, Push, Flush, or\nRollback) through a simulation, after which we measure the performance of\napplying the commands to a diff sequence. In this context, Forward means\nforwarding of values through a diff, whereas Rollback means switching to\na different fork by rolling back diffs/blocks and pushing new ones.\nMoreover, we compare the performance for the two implementations: the\n\"legacy\" approach, and the anti-diff approach.

      Some preliminary results were positive, but we needed to revisit the\nbenchmark's configuration to obtain more definitive results. After a\ndiscussion with @dcoutts and the consensus team about this configuration\n(e.g., number of commands generated, choice of the security parameter k),\nthe benchmarks should now be closer to the realistic setting. The following\nconfiguration specifies the default configuration that is used in the\nbenchmarking code:

      • Number of commands generated: 10_000
      • Security parameter k: 2160
      • Number of initial backing values: 100
      • Number of key-value pairs deleted by a push: 50
      • Number of key-value pairs inserted by a push: 50
      • Number of key-value pairs forwarded by a forward: 50
      • Probability of a large (in the range [1000, 2000]) rollback: 0.05
      • Probability of a small (in the range [1, 10]) rollback: 0.95
      • Order of commands:
        • An equal number of forward and pushes.
        • 1 flush every 10 pushes.
        • 1 rollback every 100 pushes

      Moreover, we run four benchmark scenarios:

      • Default configuration
      • Without rollbacks
      • With only small rollbacks
      • Without rollbacks, larger flushes (1 flush every 100 pushes)

      How to read results

      Note: this section uses documentation from the\ntasty-bench package to\nexplain how to read the results of running our benchmarks.

      Running a benchmark scenario gives us the following (curated) output:

      ...
      AntiDiff: OK (18.27s)
      2.527 s ± 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x
      LegacyDiff: OK (32.73s)
      10.829 s ± 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory
      ...

      The output says that the first benchmark, which exercises the anti-diff\nprototype, was repeatedly executed for 18.27 seconds (wall-clock time),\nits predicted mean CPU time was 2.527 seconds and means of individual\nsamples do not often diverge from it further than ± 47 milliseconds\n(double standard deviation). We also configure the RTS to collect GC\nstatistics, which enables tasty-bench to estimate and report memory usage.\nThis data is reported as per RTSStats fields: allocated_bytes,\ncopied_bytes and max_mem_in_use_bytes. So, the output of the first\nbenchmark says that a total of 2.1 GB of memory was allocated, that a\ntotal of 544 MB of memory were copied, and that the peak memory in usage\nwas 2.2 GB. We read the output for the second benchmark in the same way.

      Furthermore, the benchmark compares the mean CPU times for\nboth the anti-diff and legacy approaches: In this case, the mean CPU time\nfor the anti-diff approach is ~0.23x the mean CPU time for the legacy\napproach. Conversely, the mean CPU time for the legacy approach is\n1 / 0.23 ~= 4.35x the mean CPU time for the anti-diff approach. We will\ncall 0.23x the improvement factor. We will call 4.35x the speedup.

      Note that these improvement factors (and reported results) are subject to\nnoise, randomness, the specific configuration parameters, and the whims\nof statistics. Data reported by tasty-bench is only of indicative and\ncomparative significance.

      Results

      For each of the 4 scenarios, we list the results of running the anti-diff and\nlegacy approaches 5 times. We run the benchmarks 5 times to get an indication\nof whether the results are similar across multiple runs. Furthermore, we\ncalculate the accompanying ranges (if applicable) of improvement factors and\nspeedups.

      Note also the decrease in total bytes allocated and total bytes copied for\nthe anti-diff approach compared to the legacy approach.

      Default configuration

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff2.533 s (0.23x)4.7 ms2.1 GB557 MB2.4 GB
      Run 1: LegacyDiff10.792 s162 ms6.8 GB2.3 GB2.4 GB
      Run 2: AntiDiff2.508 s (0.23x)245 ms2.1 GB515 MB2.2 GB
      Run 2: LegacyDiff10.850 s30 ms6.9 GB2.3 GB2.2 GB
      Run 3: AntiDiff2.562 s (0.23x)5.0 ms2.1 GB552 MB2.2 GB
      Run 3: LegacyDiff10.993 s149 ms6.9 GB2.3 GB2.2 GB
      Run 4: AntiDiff2.168 s (0.22x)5.3 ms1.8 GB434 MB2.0 GB
      Run 4: LegacyDiff9.976 s39 ms6.3 GB2.0 GB2.0 GB
      Run 5: AntiDiff2.527 s (0.23x)47 ms2.1 GB544 MB2.2 GB
      Run 5: LegacyDiff10.829 s148 ms6.8 GB2.3 GB2.2 GB
      • Improvement factor: [0.22, 0.23]
      • Speedup : [1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]

      No rollbacks

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.638 s (0.19x)36 ms1.4 GB181 MB2.4 GB
      Run 1: LegacyDiff8.656 s207 ms5.7 GB1.5 GB2.4 GB
      Run 2: AntiDiff1.638 s (0.19x)75 ms1.4 GB181 MB2.2 GB
      Run 2: LegacyDiff8.654 s322 ms5.7 GB1.5 GB2.2 GB
      Run 3: AntiDiff1.663 s (0.19x)74 ms1.4 GB181 MB2.2 GB
      Run 3: LegacyDiff8.799 s216 ms5.7 GB1.5 GB2.2 GB
      Run 4: AntiDiff1.645 s (0.19x)51 ms1.4 GB181 MB2.0 GB
      Run 4: LegacyDiff8.732 s261 ms5.7 GB1.5 GB2.0 GB
      Run 5: AntiDiff1.639 s (0.19x)19 ms1.4 GB181 MB2.2 GB
      Run 5: LegacyDiff8.653 s234 ms5.7 GB1.5 GB2.2 GB
      • Improvement factor: 0.19
      • Speedup : 1 / 0.19 ~= 5.25

    Only small rollbacks

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff1.833 s (0.18x)36 ms1.5 GB185 MB2.4 GB
    Run 1: LegacyDiff10.362 s867 ms5.8 GB1.6 GB2.4 GB
    Run 2: AntiDiff1.696 s (0.19x)30 ms1.5 GB185 MB2.2 GB
    Run 2: LegacyDiff8.822 s106 ms5.8 GB1.5 GB2.2 GB
    Run 3: AntiDiff1.702 s (0.19x)44 ms1.5 GB186 MB2.2 GB
    Run 3: LegacyDiff8.906 s147 ms5.8 GB1.5 GB2.2 GB
    Run 4: AntiDiff1.701 s (0.19x)47 ms1.5 GB185 MB2.0 GB
    Run 4: LegacyDiff8.949 s197 ms5.8 GB1.5 GB2.0 GB
    Run 5: AntiDiff1.677 s (0.19x)55 ms1.5 GB186 MB2.2 GB
    Run 5: LegacyDiff8.856 s177 ms5.8 GB1.5 GB2.2 GB
    • Improvement factor: [0.18, 0.19]

    • Speedup : [1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]

      No rollbacks, larger flushes (every 100 pushes)

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.643 s (0.25x)21 ms1.5 GB196 MB2.4 GB
      Run 1: LegacyDiff6.591 s351 ms4.0 GB1.4 GB2.4 GB
      Run 2: AntiDiff1.616 s (0.25x)47 ms1.5 GB196 MB2.2 GB
      Run 2: LegacyDiff6.520 s232 ms4.0 GB1.4 GB2.2 GB
      Run 3: AntiDiff1.640 s (0.25x)34 ms1.5 GB196 MB2.2 GB
      Run 3: LegacyDiff6.540 s150 ms4.0 GB1.4 GB2.2 GB
      Run 4: AntiDiff1.635 s (0.25x)76 ms1.5 GB196 MB2.0 GB
      Run 4: LegacyDiff6.589 s131 ms4.0 GB1.4 GB2.0 GB
      Run 5: AntiDiff1.628 s (0.25x)19 ms1.5 GB196 MB2.2 GB
      Run 5: LegacyDiff6.490 s5.9 ms4.0 GB1.4 GB2.2 GB
    • Improvement factor: 0.25

    • Speedup : 1 / 0.25 ~= 4

    Genesis

    • We elaborated a draft of the specification of the Genesis implementation and\nthe ChainSync Jumping optimization. In particular, this includes a proof\nsketch that the latter preserves liveness and safety in all cases (Issue\n3964).
      • @nfrisby's main realization during this sprint was that he had been\nfocusing so far on the case where the selected chain is an extension of\nthe intersection of our peers' ChainSync candidates.
      • This is the main case, ie an \"absorbing\" state, but it's not the only\ncase.
      • The new proof sketch begins by case splitting on that predicate, and\nthat made the sketch quite a bit easier to follow.
    • We continued working on the \"happy path\" ChainSync Jumping prototype (Issue\n3960).

    Technical debt

    • We started working on the issues required to re-enable nightly CI runs..\nNightly CI runs have far more lax time constraints, which gives the option to\nrun significantly more property tests than in our regular CI. To this end, we\nmerged a PR to easily adapt the number of tests globally (PR\n#3947).
    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-08-31-consensus", + "title": "Consensus Team Update", + "summary": "Executive summary", + "date_modified": "2022-08-31T00:00:00.000Z", + "author": { + "name": "Damian Nadales", + "url": "https://github.com/dnadales" + }, + "tags": [ + "consensus" + ] + }, + { + "id": "2022-08-12-network", + "content_html": "

    The networking team took an active part in the project iteration (PI) planning\nsession, see cardano-node backlog for detailed\noutcomes.

    • We started working on a detailed design / implementation plan for gossip.

    • We merged input-output-hk/ouroboros-network#3859 which\nsets the ouroboros-network repository for the single relay release.

    • We identified a bug in the network simulator, which is fixed in the\ninput-output-hk/ouroboros-network#3852.\nThe above PR was reviewed.

    • We set the tracing configuration for nodes which we deploy and fixed and\nidentified some deployment hiccups. We identified some bugs in the RT view\nwhich were registered by the maintainers.\ninput-output-hk/ouroboros-network-ops#4

    • We fixed typos in network-mux library:\ninput-output-hk/ouroboros-network#3921

    • For easy of debugging we renamed a trace point:\ninput-output-hk/ouroboros-network#3922

    • Duncan iterated on his simulation / visualisation. He also was able to\nidentify and fix a bug in the simulator. The simulation contains 50 nodes.\nDashed lines indicate and established connection, while solid lines indicate\na TCP connection with fully open TCP window.

    ", + "url": "https://input-output-hk.github.io/cardano-updates/2022-08-12-network", + "title": "Network Team Update", + "summary": "The networking team took an active part in the project iteration (PI) planning", + "date_modified": "2022-08-12T00:00:00.000Z", + "author": { + "name": "Marcin Szamotulski", + "url": "https://github.com/coot" + }, + "tags": [ + "network" + ] + } + ] +} \ No newline at end of file diff --git a/images/consensus/2022-11-02-csj-vs-baseline-sliced.svg b/images/consensus/2022-11-02-csj-vs-baseline-sliced.svg new file mode 100644 index 00000000000..e75d1eaf09c --- /dev/null +++ b/images/consensus/2022-11-02-csj-vs-baseline-sliced.svg @@ -0,0 +1,2041 @@ + + + + + + + + 1980-01-01T00:00:00+00:00 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/consensus/2022-11-02-csj-vs-baseline.svg b/images/consensus/2022-11-02-csj-vs-baseline.svg new file mode 100644 index 00000000000..8c8eeb6606f --- /dev/null +++ b/images/consensus/2022-11-02-csj-vs-baseline.svg @@ -0,0 +1,2277 @@ + + + + + + + + 1980-01-01T00:00:00+00:00 + image/svg+xml + + + Matplotlib v3.5.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/consensus/2022-11-16-comparing-TICKF-batch.png b/images/consensus/2022-11-16-comparing-TICKF-batch.png new file mode 100644 index 0000000000000000000000000000000000000000..15e1c6e0b0b28d28530cb9d683cf98d8be10e659 GIT binary patch literal 33248 zcma%jbx@UE^z|jA8ziKZMx?t{S{jt@?(Xi85|O-w2!cv?H_{>9-Cff4o$LGi&3rT8 zKOgTf@646^+~+xGpS{;wd+i&kq#%Wf_6!XIfndr=i>p8&2u~moxF!@N@QS$ctTgx^ zqWK&7HxNi!9QvIh_(#ZdV`&w62*isH0tpC#KyJWG0oxFWD;or|YXE@=q(C4<4(avE zLf{{ejAW(6A&;>CzBc72fLBl*q&1x(5UdW^FI>0%4-@cqh>ZA~_a3wR3+_H2HdeY% zhU;$4>_4-?8{%JNa*+L~{Znr)F`}hiIQ!jg`a#Qf&#Fje??;8zLJ$L=a%!KRVJL~@ zbCWp1;iI_i-zW?r(DV?WrIM+mbL&j+A?M7k9{Iz|OmpHq%d`mCk92`)MLir9?8k^X z6do7+#H%S}zZM5SxrwR_IIveNHwe&RFNkaL|9|{R_ynef-NQ+of2qw32anBkz|zrH zPMipph{!|A9*Kw#U$)Zrr&G6s*^@3(dyNJ8f1imG8f33o@4}cN;7Y~J98@tu z`hGYVTSVh%{`K?LLEfc-<+k9W!*Bm?TNv%h(&^tZMTBE;k>iUwd&-mAzP@)N*X#Hn zKYrYvE~BQFjBedKm(-(VHxh4JGat^30rwGv&Qe+*_3v@d83?#qcP9!`1zcaEqN2JS z%qBiQT(&?OuU4aS^YbY$($)1mLq&XV{^Uqu7eHBIZ&Hb)dq$aKz}BPaf1}zJL)tBP z)Y#F1Ejm!BS<%zev)qPEDYVb;eX(!&aChzX?m6r|gP-5Fv1>JXafgP6-d%NzcG=Y+ zEIZX*wPE|UZe{uVO*`xP-@B$O&?nHzm)Bpz-a-}r=Q!KA()ZR4LMNBv&|@8Dh=YOT z$cMG4Hpb<-7Q>su=ST(aS&dg8wkzv6XivI(%qk3tk)nuLMSfvlM-eg`-Ci8r?I`+} z*YEsy$?q#--4@HOfzviTi@ui&IRXz8>iXYx8{9BRI68OpqF~EPmXt~0(+?ho;ngdX z!8C4&(AfZ|hY*EiESZd+9>vVej9e;5sP|!A`0A=r7#8`*;Vt8Zde{AhhGei3oGR)P z5>F_7j^TJ0J*dMBH5R!4?QMq&!&MTu^<=5rfffW@s(19eEZp|^Pkc{LPsqI6obCGN z=ILoa>)GAeFg_)vqMaR!C|I7|i7Ka!cSsn-t?RuBMTbeS8|=X)F%zrVfBNsb_(7Wl zuoojLozR~Ad&r{nw}G%1q?z&~yOx&Eo}h+zD3?sFl&(2U|13J!UXZ}$f2WX74jl{| zCMvCGq;mSAQ(Pa%?dQ+7>q;6H*u7Q>q9aB!dzsYA8X@L1s&miPux9Q@;a|;vZ*_FE zBg6XJ{M7Od9-d9W48xH&R6hH)g3aJdf>%1VpFR|*Nn9Xau_y|iATH_g{S*twl1t|s z*|me+Q$!`hARWQ}Tuofo{k}OFpF_aX-6ro6DH?^(@f#;+XBk=9s4pMX)tUZ#CbAqe ze6+*nTRS?%%z*?&5zq0hd5^Uixiqfc|Jkfci$SCFY!XhhQo{};yZRlv0_eX*7~R!) z$o-m|8v@&>+oKlBxNc{;Es=+-H6ie8Vq(H(GtE}qc=}FG z{U@8?>C-afZmeYk1_nmP?9$TXl--xi%(Mh(@hK@5rpd5FC$2>%E7q3bzNmS$Wxys4 zP6v^W1Dv{!qeSiAB~ub|(NU|beR)mURHFv}0$cF=_X#y#3GrB!w?RZ~jI41F?G!xFH&#~Z z6S@SJTp-9bK(vcD=P5lOJ!K$>;L?dA7NG$#=cMsMw5{DWME26*s|othxZ9uGR|VR% zqpRSLz+sFsnpDG?E&FJ&q7|f_Y;a>uRdTJPXY>?JJT~>;dF8S;Yn7_?AkALbL$%S9 zyJ}TfKF-O)bdLtlYZ?Eq_T*lpBBR*pDmcukz(3J{%iz!{W-FsPJt}}VSIo3nEcTDzxru0JJE>#d*~-gNCJgB2^38*JwPZoam`xYr`K#yN%#aX+h%MDs!ePaUXG^xch@7SiN6uinrTW`oZFGz$WHjQ zZ8&1>avUpe4o2{3H~s-y-B8L4Y+`Lplm zP!ATQYdvn`u|fTwb7_lTz?X_En_g8Zv}=wa3;egrJ~c`K%hel*H9j&1dmJd&aXy8H z9hnRG=2P)}vzKkhbQ%j@xcq4UGP6^J!v zVqBC6uhb}jQvXk!RjTBbeEgFcgNR0GoODR#V?b}l;4y7%+dISO6uvq@9>iQ%G$AkA z8GWtoxp&4)(^>DiO`lU}7b_i=1AG3_k15SoL32sC^Eb3@woI)Uloz!n>gY};t{o$u z4AtvyYP=b{v(L|_Kz0AM@P1+voArC5YX|ggwu9KO|6OnehrE){tvACc2O1I%!;&aZ zVm%6l3j||Xs2w){c1Os7avah@r@u~A<}gTc>i%W*EIii3#!CewS#jUYH9vb3jqfu)N^eNUPQYN`YTOL zEPBE06WLLot=6mi`rHv}`qW~6Mq;Ed$x~VjKJkQ7u+Uu>H%JR{E1|Ar%4(f74Z+^$ zTg|?RR^SuBY9H|=uD)_9&{k+Wbh7e24@Y30Db0#YJ``G?p5I68y0Gv6L_y-AbKzA& z64n+^Cl%G>{_o&eX2T-vwi;)?Jmk-zPkZ8TDZbIx%n3~M%Y;&Mx8F&h3~d|ar*(CH zk7C|x)Vi@YT&VkQo%EjADUi=+ie#u-Kncw)=Oh%~|BDo6>DtB!*!mSdVpP=sjp!yh zVBH!b^c+Yj@9Gut!?4vk`{lK42ySZPNT4(l&Yt$V!>`(_|vt^5oZV(4G7v! z+WQAyYZgn$+R$QR9%~V~WVM@~CAGe^BIILaEZr9ts)m|Pua{ltb|ytqm3=vOrud)c zi@kW=`R?EIs-fMW+UUNs7?vC;UqHOH3;OyP5l-rce1UcEc>XL-xPWvzJ&D_QY>0!f zc%gsR7I|7#=f0_%G_0+)*iw#cGH|{S(S`>T70;68-+@ols6B;bAM}HZzV$ew8wfZO zjN`R&Bg+U|-sVE_HskG2#$0Hw37XopGyBjMcqBBmQ#vL>odnixdz2?Wo#!N%&g+$J zLj+mozo*XOL_Jtiu$a;cf)e4*)|?B*@ub^f*i%)HWAO=Mb!KuxIyS2EHu7YuSl=IQ zh3o4}IBMQELCD-l`BP8UUEgIZ<`a~w7)PFL8;42DX1f=Fm853tc+uW)hH9t(#$Zon z;N!iN&}7mmg?V=%F-Ym0PR#lo1YZr*`SpugSEKH}iNUu{f$JIHn#WJECuWkXItbdT z@oI}dlZI_E&AayR-Y8FPscKzGvfC%5CGE^kTLjSzX4d^k@|CQCYAQBf6%foN4)(Q2m+byY-&t@R`(KGfK^ zJ#(n+2RVZ{tl~Pl$p7|?xv{}RP{e<`w4~cJ!^JXLI=MO$V<-NN*Jp0ARPo#sE~wI{ ztSlJUk=E2C5evh(UQ}{8YPvk_V=6fYpPn8Pf=J=93^!S*+2K4aoR6shLOXtZ5EI2N zT?!Psx3mq-XBOHzXcy^lAou*^n{$D#B`?1$S3dy8usD+ZEDliA6i9YAuJ^K zVT0E-E~f%?Yo*o}pL!w-HA8}w7&^(_=i4eR$F4dkAC8;4j~1JtM0y^9f`_%i{j4oy z0T%~z&L_W#INc9*0P`_-1t@48(J)Lb%_0&vCPPnE~CTt{!lMYQ`hSX z;Xq+ubD=cftuu4xsrRi&k}btWRr`J7fOb{*u-akXFFJ?LH4sPS6|24PB42Qii0O3` z2-H-${Zz#*i`~fn`t@r-ex}#QWPQKuAK~}=;Q6nvJOHrTOWaytFLgg!M5_61SF>Uf zLjJU6G5tIHE&!{B6(q!A*_XD~hG`-1+*XDk2_7fEhxA`K<(5ofCKIV|y#V>9Yoyw| zB8{}vS)bP5!wWTVIolawpC?!(V{AJE`nG$(!)dm2%}w)x{rRuv2eJ|3BW+CiB>ar; zEtu^qZ0?Jm^i%r&!Wn|@bi^1G6P~oRwBZ>_>7PEeHv8T_o6oG3)O+)SpFdA|k0^e7 z?DhiDEbQk@{m0$G{vSGLB-wqV)D*kY(zJQ~2CKKR-5Co{Ufl)My1Mg6P3^DryLzJ{ zc0fYf>A0JpKfL~-_q^v_l&M9DT>Tae=T~neN4>pGE-ug=p_;IjdR zh{E4=)F%WUv6_Xt)b>eRdsRqWsn#dMinVHd5Q!L@+~Ug+`eYyip|w=)LFedFK1E`5D{D2VWU8OSZ? z3@j{pKqA1jQ{=P3LkrDW9CoNJ){jxHiQvK-<6@U@vR6c0DHld`-@u=*{G>EuhC=R_ z-n4SMY_WtbRiivTCTQ$oL|qcvPG>-|@ib>E=eyvwh2@Ke3rbHXXRB|};)BoIlOmDn zJgAj2CwObcw`UYsHO2ldu36O2w(PH`!~#J91hfVmz3?xIk_fnL z;|}jl6cA-AMf{E;;s4F!O ziPX^R^t#|u^Ycm*jX#;IR#w<&U%cEMxrc{m9Hi^U49yK{xNck(a_p1Gr6D-D{1izK zbamU`qIU1eFpxZt+mK24ooN1}G!M5&=KV>`cOV-f?y5c8U1;F-znxp^>F=keqYD$g zTfy$^>T;UYG}naDnzFZiufH0g23Aqx&NiS9Q2VRe$o6%Pc=E*#6i=6XX_RXzJtsDL z*lqGT-cUfhRQEeN!D@(s(;Xuo7tYWlSJfJvhu~TYFt6@~k_);4e%od*i_x*19Zs>j z3AHy{?}?v2aQpoEv&Y{NDH&<$()v08-)Q98CA5#X{NEa^y+t86Y;5cZZIV|fBfnYO z=EBj|*)7wh`*@K&aoSt{Rz#=%ETREfY+JhQCvwVzdd7OKW zYe})XI?qSu#*Fi4KE<%zR06TaPX^pgJFOtLa98PyMRGX6f`EQZk2JfVuX60 zX1Ko6^4>0=p-9d+B>&ti7x{v^S4_bS{(#fS(TacGIO)^!lL1N1=dEU(((*ACFo7aZ zLWr?+Cbluhs5_Rt$SyM?f~)+`qWqQm;EVUQNMr6-GBwq?a_PcdEBgZQ9o7qUI^G`( zu1!2&JhZmGkVAfHrCC?^@J=d~kv(0c5JAklx@}Db1b}r_1PlllDgK8c00xWx(_9oT z+~v@{3ebc4BIC4*pvL5+(zMCMrqO1}Vn=z*ZL?OmFI9Bh zwr8*0pl=kQ9;Z&KJ%jI_m#Cs)H59?A&_M%@VGPO3!8~KLAUc#N>8O81Ckf?X?w!Gc z6e16E$g-gt76%5nBgajwt`S$7u(7dqTa0jdo}-t>y*IwEW|Ul}^WpSmh!tk`i>I2u`wv)7ON$svfDIYRSkY&j((&>RsaM_*-Rm29}SgL zBMb!QDg&H)HRU7iaGxK-giUr@zw&n(1cFqY<=_`isz*lV(``?ofu^GkzW91P4~=S-REoloEThv z_;Yzek*C6KFOZr7pK{GeqXZ-D+(sxx*^Oc$)jk1U(C^`WC0O@}EOJ<6QcOvlVw5)St|a!WNl2k!fKm)jwU8MQ+$Y{p*{)k)K3ahv|e{ElY%;JX4AWca}FUm3vl=Zk_4Oz{JwwNv? z7kTqjnGB0$3iESY0$j_Bf0t2uBl@or)U0IzwWRUyW@ZUv>Q*oJ2CFqU!$l{1BAngSMKh4?)^V5ai^;N^`dk z&O1CClDeeoVXl?t(!g7XF?g#jVRd`F zGGTtwsZZ#RF8gs$osl4NW9tbUp#;g-KYpN!!v}WQt&O)Gq;heD6W2U^iHsm)y{CJM zYx#R%7R^f3Kgpnt2pJs{LA^z$Has0W%(cUzxrf!LtFdT*UR|?9h`X&LZum$HAhiBj zIx44c%HUL3esBLh_apP3&1~aAI<-mHUZ{h$D`|9bw0cmhHbz}^MyKQzCv6yK_!e8O z6cR;p65&(aNIH-!;wQVfPFOwhm&!>D{HofL7ec+KLu*eJ%3Mm|e$2&O#VDdviFSLD z>9|?(f^!r+Xl6SnF8&`aE|NC5H@{MEmaR2W&m911VK{`ejNV*(ve?%9rKiv4v%Z(U zh;I$w8sc{ZoJnpuoi4kj@jj;-?fI*%CZ5ZUa`Q9emL_m8s#)1$d0zAa z+JvBrNPLV*p)ne|BB>rHlTE9#_J7LS*b;bmK$~KAKQ%HXzS)Ef!mLQ$&OSN(GS`}YRfXAdDvcTWYHN?_TnI|2H!qj=>l z6_uJbPxjZmJfxB-YgbO74bwdK&0G;Sk zs1Q2#r$qLddire4xcHu$ARcbK7!c0i$;zhk*gmtKEX@A)4Zdb>ur(0j`g+)3K~Hbd zJyXzeRs3zXQd9X#NBEil=VT?~LlEQ#0ouytc7dZCrLl~+9R9nPRzJ_fJ-io_q_1~6 z1RUC?ho)`41VD(Vb3^%`=+8B{vxXUdN=?0P>Q4IdrPSy*8V3hQPha1^_LqEnixpOL zD67OKHu0i(BYwW&a8FgPFn2S~qn9;z0oq4uQyyqrV!o@n&7)0$eKKf-g__}_i9Fsp ztCi>t7V9=#U9H8{9aPV4PZrHxW?puSKCqv*I6FCA?ddD49v!`!heNLLiSV23au>A7UZ5}m%CCcyw}$!+u{?$6iZk8z!NH2Z(} z2y4mUQcL2HlF9-$&~iO!U;A*g=lOVlDf8}~m6G7Iqqvqp!`C|L4JUTrBE&V%yq0dF zs>|%VL{E-{`MBsEw>5LqeX2|g(4P_{oiub4sa#C-y)DzDPX<9*A-QE$`$=PU5Bt#3 zQEO9eU4ta=`oNdA=p1Mv?6$L95BEp@oNoKmIU*&1I&%*31;d&$n3?8EYHGntl+j*U z{|kBd7Y`#C*5a>K$< zrm%P6VNith`;--&!0+~J+81sMa(b{Mlqw(ne+c%b$jNiY1@9gfT9P+y(hriQW;l*~(H& zfSh<7U5C^G^&or7D`zSn&~oR_*bs#+!oM@ep9oSD6|c5z%*TjI7jPIra~moTncS4&e#2}z%{@hw0X;A$*!7D2+ z{;hLV2^^4Krjo|?DAs0aQ&U=S7%|8NzQDq0e?Pc?y2^HrFl(6TnxB?7G!&iabl!P* z{9ohfW zbxA^8;UDxMWb^$n?sLVEoncL73M57k#U_%D4cpOb5WbliO_{^$hsElClRdF=6bS|S z2!Kun0C+ErkDk2$&Fn%fq(2J6X5$7+o&3u-7|?_#R8Xrfuz)6MsB~_YtHQL6%UM`*Evo^uP4|i!j zu$pxMjhsmse78hffmCIQ$QyJtO2;$vlO9=)mC{yQj^^3SYIcRoy5nI%3un9_0awIC zqM7qhAOIIOs{(=r2g53oW@?A|H^EYf{tv{~%oGJdG{D z7G^BdebJuUsG)oIIwjvFCB)a~V94Yf1JFvUoGIh>6)*rEBD<6k?R2Pz=3;_`@NhEw z4$UobiYe}dkI&tOB_GS~CT0YLjVDZaj6}nKEKj{^_CXk^muU=J2=rcm%I6(xJ(_fP z7W3g8{!Ox5B#cY-2G6d#SR4j`N&=%E>wKw!T0U9A@&;q=05r<0&*v1kW+si%*iKiq zeEjg__ZRgi)0Gt%0U9L<)$ec9Cx}&I~GlroFl2;N8LFEPpHJtwReWV19t*>^qpSE(X z9bL$0Ol(tXtgsaawZg9_%HIO&J{DHFHGs?CS$oc;2R<(L!3f+p6KAx4FZ3$8#o3{5 zo9V~(%D^G*en5ZQ9CRV z_=G!*nEl!kiq_P<`4Ab%d1NwA&GNgH`yuV|x2ecWt2=NkpW~qz31iu%%>&6=zCy4( zA|m|?_N-VP7~u@JfBoMxd+jZonJ8dqCfK)+WZNfHuB?3*^gQX1M-)R2XELSnuDkyX zmnH`~2FfsSddh6(%J`d;;zg;qaqd87Qn2?O=5#^@>HQ73;VrY0t%}43Y`rBjwrYQE zy0{(j!YRvhX0WOF(cqBv@FGt7huM!jvRN}Vzhrl~Ad53!r!}xoE4yX&t^KL@oOql$ zqnCc;a|WUH`2nn#_yxQR1*cf(^+CQO-fSJ6idmd&JNKp**#W70?I+9j`HfJUC2d}F zgNL+wST?EMA1{vHTbkURqXuZ0599;O4LSI|%~kEc9C_5t7qaJt=u?!jWqdwp5T=RFc_9gEUN%lwG#DCTb?vUMn7Pg?_iyv27hKu=)29KSbn5(;NuMO}%r;8s7l`?ko+3#R|@NZy`ib7-z2Bof= zJ)Vr|lQLG->;#$Ly$4MJ=SlRcoNUi zfgcB$0%%tA>{eZp{n*UhN>)+!bx2XMbAyNRtJhOp7&#}Ia-d00#w;uLMp+rxJkyiz z>C>k`4Sk!9^YiD=dDki3bkEJyB~QCIZ{S34M&hQ+jFA=c@#DHX?k|^yw?}e{fMCo; zZRSeSOlyy$!Ar!)mpV0)&3ec#+DQnVXP9E1{xEd$t=<=_Swo!w6_F)BMpoglZ`#jR znGk3~n*c>DpL^9^E_##jIXq`%Wc>2wi^H(+<#Ck$T@V}s(x=2k*Xc9RxTu+TLI)l- z;ETcmEau4n(K}Bb+J#K%^V-R2?Jk=rKIw%{efaAKdc;ZJXp&=zK1@ZS!xf^n{YgH3 z3P9kmj*v+;nk^}pG?Y*RK$p`_sD#%tlA^#q4k$1$fV_Wla+2=U#~7cLkdRQflLz(K zE2`-k9u_rX&;Ully{VF|RP)RiFJ8a}=-=-;UTZl~{eJME)~{=A>0Sp}jj$rx`GuBR>6dl1xV%>7#g zK6BqBq8tP=T#gp+Bf8hOw$>c@h=n{Ha$m8t#{=Z~IV;QFl}J1{68Jwr3}w7-Bf>eI z@*d1wKp&2XD*L|4HG3`!L{B17zS^|-4!i%+NAkp=9{)Yyr4?cJ@(y z`}gnJd~aOJD=OkVe89%b$jI=KokO#dk|dRtm4oM2&IKHK+s)p%HDGqIMZ`^&!o^$s zT4)UUWm<7!tB+}RwTvDXSabH=C_FueslhvV*Nty~+9tf&o~huz@x&6Y0R1EN7{LVv zUu~OaOYzRUgP#3pLS^F*X;o*w-HR)W=$0CGFr(8RLik#f}#D z{ud?Q0@ze1x&4lLRf5HP(>AV@@XdZpNI`~XLrlv>is-vVG=Hl?Gw7+t4!UF*lp^W93G|c~SL5UF`}+H_8Cij4i#lh; zI!67&_3>@6@=?~*9u-{|Q18!A)agdwr9M0ZUF{Y9YYNcXIoIdHAmc}H#1=pXV%h|x z``Rxm${F|u8JP;qoDE47hqSsgS8rSe4tQ?d6gF}nW?byEqWdk!Zgo1}qN3`x<~BB7 z!1_ad`~!dJh3{hDs^7qzr>g+8R@^@6tQ z&P+xAgf31z13*t5ExW$(P@*>sN=MusP2#@{Z0B93hOdT#$Ux8MN zlB%j$joku-7&Nlo8ZrRKa2n*Ef*gZLEBC&%13hnJU~i*&7ZhrJQj#KJvGuH3xNsP7 zrh-QrvJ5GMTH|j{O%Bs0ho^5BwHt$dzjKER)6uqdnC82f8q~P_i(TpW;Nvs>A3QgQ zGWrAH5TxI|gS9DO2N34iI~x`ib()7IqyHs2fQINe4|31@Ki(q-zgb;dyWSFg?ERsf zL(FaUrON%ic&sb{K(oVH*Do=~&1DDMW~_yV>~h%mM{dunKvVV6&zo8B@&m=GR^gP4 zotluZV7{|Ti(EREH$pMY*V72@2RvEFVv{$_Vw{+m2uzR;WAeO?BN9X_=M*}1##hHH z>+9qC3dhxRb~(TkJCMd51x&{T_wWfW|5;)<^W?g`lB&Y-Az~2+M1kuym2P$@HZ1xj&7d}ZG(!ZSuy8~Hm zLq76MfNV8`dAWR6YJT}~m%G6C&Ek~{CnfX3Z(hn+0dhCV^IntpM{)u+F+;lmO;It& z1DL^;3MAF>A%D1v`bxbzm^Aw*%3=L4!Z*=?$KTjI;ECFrFjtLr(s}c!#k|e%_C`wH z;Fc-yk>xcuroVn3An78jS~g=-tHXkaheu_4W6eMn!=mE}Sqgf@n?E&ea_S%t_C9{X z=N*Gg?X`D*#8kABdU-lioo|<-1RN;t!U$d17Tuo40=QeQTE5!A!j6sRN(y-{IC7Q@${I5vycQ z`INKYZi_cQ=v5DY+V*BJyj-MLf*kAC&1lKGp8_snzSQiSlJ`bSi-!lAB$$-<6zvHk z%c7W!3@Rv&Ku;Xy1D-Nf!ADPEbU{WZXPFNk`aN+O{X>K#px$2i;bPV4w1zUhavwA< zCYcf{B;9D3M~u&zadCg<13@vayWsWnq|!O^S{*wpt6iS`_Y64k+h|XYnE`j*#om27 zH@CS$;!0bcJMcsIC2(5QFGB*AQWkCtcAo?_XQ8wyUwt{f=A6-q>OOf4XHIKTL0B;0n^W4{IzFg-KORy zN3Z0m2!V1gH`aM{x#Cnuolx!Dtd*`n#G~yJUYHpHu=ILuO7lyfEKw;}11e|-z2{CfAJ-t7^3 z?rY?egSi^VlivxRJKv{vrpxewV1wK z=Mh?GJoygU)s1T#l^bF$(*^)4ozTWoIzU%aK0y8|+aT`eVrTz(Z9#1b4Gc)^UsJQ%Djj1-n-veF2@!ChSGoEta=~%>Tv|iC^WFUo=CXQA zJ=5vg{>;&7!_q=q80Oy2NX`TP+U~B^z8k6CWjs;fj~_o;cU+cF$R7H?r=?jz8W&TJ zY}DoCFn}JH6?^3clpcyW=jldKhz^?fa5yuYS0P^G&N?zHQQ)`Gp<;VUz04(rWnveS4h^m=Yl4PXbErw?q|> z`U=lK@YXu;EeM#)gcwHm**9El z_9<34NER<}en5lG(qMpIF6)7fs)F)v3<0ZXTdB4yPfgeRFL0+D381VJyaF-NOwfyZd2x` zi{%K=lu)|8c0Ru(ckpt+6u>q=Qq8Fzw_qdK+=$~j9T{ye$!CDTis)ZMaz0mw1~v9f zRq;+cUWaMSptiM=Jq=={PA&)PDuB7;1dr~>m3S!)HV1g?&L^{u|A@tLnDi(?cD=Waq=Gd!hv}+E}{S;(nLFa`y0C>ArFK<(Lk6`VFr~G+^h0(LK&pv*<_?((L zQTgbY76D2t8C9+E(?D)YocZQ&ptKeUW|paz(wc}LXaQ|3`H{ug*%0(gseAi7vkyqd zShevZC2~JlCR22`_=~jdnsI6P_y{HIdC}T8o;1`A8wx=)b)_pI7lzD(~!S}-_5O~{-!OdTiGDTaL?1JvRaFcqb&rzdG-wE6-+ z+57LdjN3)opt-Za-jS(s1xd(T*ClCybncmVN5AjAC?Lcn8O<}0vw{1=!g71i)d ztLmuh!=N+QNwY%X^l8Rm3zCS@BRn@0>Gi!vSciwdrU;NoD@P zModFiObVZv)spo2GoIf?#T+#gQsS2{N-9oY7y0$J?w^&;k=iS!VUY_M5F;JTR++DMauznn$iq}RU`vHBFk92V;K^&bSVniF zFK$fObE9>WH2)n6jD&Z4gH;5FC57slpO;r|D!l*695rGIyyKu&r@u` zUZ*^-R*(Uc&6389! z#Zt-$6!Gn*OS6+j?+Pl>8q0)U&~_Ngl`%*7)8vgk#Ba_~vm_FOMea0RQxYMQFqCaO z=N9i=ZMV=)`FN!bFuIJqyz%9suFLkP4(=&AxaZ);!03%W5C$IC26^@KL4yONJ^;61 zLufHt43OHj*rn5a(S^Ye>bh^CJgJcVIrUC(Ocb}33{sY&EsJzut}6e(<`*7KEJj8; z1VrkPv%&`n%}S;N*6C1Ep3f?7Yt= zNi6g~3)VZ?g8!OM{|_~*U+d+yo0pc8gJ)+yk#`CIR`SEb-lSJCV0?U>+D@R_c1{h@ zTKU@x@}42Pe!v+bVq&6R32J@#An~S+?pHxUZ;ypozCvC2I4%mJMvEW$hYufUXlWCm zbNn1q&k4|!Rh$CW*9rFB1XmnV5RgC0$jP#i&mnb)Ba~Cpek{I)t;%P^;oPPMK(2KYdyZXl2Fyb+`{`mfKn@7s zB%qjB(zYie9}oIxFOI>Hu?W%YMpg75|Ino;Mst3Y?bmF{;ZjM8UpJi(sE$5_N~BNC z9QR3pw<-hdlfFH`_KGk4y_dGqTBGpE)8`sr~2)1ENNaqT{Mkl*|{0+v5M0a*`y+}z>5 zwxHw!UF*-TUu3108D9vX4!@S}TBM(|rP~S7FG&xi)=0T71#WE>#v#IoFLYhgZ=5ER zN;%9hE)bx=M#nz=z@`N3mk1HEVh2G)D9L1Gea5nOQI}sRjb(>o`?xR2 zewcMNG9!x7_47=I#)4iAZ$`4zC04K65^Pr2G9U-*$x-7O7ATi5At2uL?^cOCgfhLl z->a#Wd!1YPUH9u#xFP^}rP1iY4rbEmz;JE0SU827#%K+*MrnY(ec7krdj;f}@T|wXE#L|LoRH9QxX|#kxOfv(lNB(s`#9uW(r_q{ zu3&CLBpASM+;!ZFfUV&`D)9>M@0z{{{^O}TTSvBZ*@}Ft@SRb*u9U=qO6V<9-Q#!D z@vGh9HMdzldpQ<-r0U;07R}I4krC2sKY#tABEypMi;awIv#Z&(e+$?bYx5NutlstZ z_Kr_Z9*?WWae_44)Aw;`?6d>q#78uYksSx--Xia65by+5pb7e`A{hARp} z6s!kx?$7DyHc6+B*UqjZqM|ykx+Fz`2NxjkbOmIJxMVPI3{zQLyE{9_ZwGw%q{z|e zE4pG7jBVKrPQ(6gMJc(eb5QrEuWk(^0NdiD4B7n02qBDE{>yPWn{R z;X!H=xZ&*-BX3?#?-ppb*>G?xv3!aQ*Smc&+Na)N4>;zDV zH(*=^R3uVvg2soN0-?Wue3v{2G|e;mb=~hX#}p}t<$3SFFcsGdoNB#kGkdtG@z$ue zL8XWz8skDmLIC5)FGU|t6nh5-jJl$EujiHySH={HB;h4&Z82N!Hf+JXV<14L%Jpss zU5b8A2z!%7!s|EgOZVn<3PNjwbJJhxpOk>%)Ax3(z}LHbzwcC63ns2pg}r&St8KE? zOZ1fMVtXPx3mJ1ZbNumN>Zq2?!?+o4vQa0EU2FeQ;BvKn~)(;Ui(#`BO7h>ZJ3yukvr*u zAx=PX@GlOSR?E6Gzxm!`#ZO7bi9}kC*%i3ojbIGgA0KCfY3Jhs&f!waF}jaYQN4YA z-xRY%bi5C$OiWF=E42WKj2JWnLetTbk|mhx@Oiifri8IDa56cZ)_aij)pKc4o<3DN zd+12{KnrV7(;coPFZb+FR_&45{Zs}yW%@x=M<}}h9ymwE!7&@Hwq4k&1~tSHP!b@f z0sGt-QW(b1TX>J7Md4REd|4oAt-1*8Ocn_mcPq56@Lefa0{G{?lpzDc9gLsz^Jfr? zKA5boV)=c20MpnSl@=m-mZN~Lb;Sr?M|30xwL$cK$|4-s=sta3rNcov9ul+%W^`fz z3i=v7v*N)-LT9A8`0QiV=%@-HLga2oixQyFN0V??FCrh=gM}!V>M9A}CEK~O_gW5Y z!6hOZUV3~$p%`w%66M6OgO$bZ5XO0r@lb5uuC|z90bHangHXFNXh@wZC@o z+cqgm-%drpQ~X9f)?j4pJmAfSO`yZ3_Zz{4F>HVzOq5eNH^Bz+Z~pG+cy7Qbug_K) z$hSaRvf&}k@_*nT%U9gmEhyQH6+E<%PKHE8IUA>qP+|emx^xEPbAoYf3x{RmfKtHe zwY^f^w)}t+4g}gSJ0B296Wff_fxECFdUQK==Or5xOFkVNrFi((i|K~frecN-?nxqkljtFOysDA~h?_oKAc50om?%gYTwD$yYH1D;?Wn^r8HPw>& zaW^5w80!hBISoh6P~bv3UJk~_qokztv<2-7n4WugVDE1XmcRSGJ(z0Zop(Us=jVsH zNNyL`M6cHqyn2rTmPC#dIz>sKSF}4u6K^v}QDT_?>f9350SBh^TSQ&%5@ibT=UXz$ zXCA4PDrr?VZ4zWhbG1w9^YBp+l&@;4z#t0~&q01;U-v9CGDJGU)p?KherKl4E_G${ zul@AKFLb1$pTktl8FRXqZKdpsHDPeEc^dCutmk_@^oLv!lAYj4xn0&H!L{AbwYpz5 z2jQ5OSWs~efafV^J$I{IPl8qw;8=5rEFZ2ZinOtaV8@mpm8@Sz_}zW_!5m z_NFpi3q*eC17VPupY>qR^}vKs3amSz=|(O;kb5#QkC(}LxFm(}0 zpLw;2+SU3Z?jxA{X$LMO%`zj2V6iv0wvZOlY1np6?X|CzDu39B@>+0$N528BgHZqL zfu1oqhJb>IuJU0o?9N$;ZCwfz(un4GBW zYmTaX@2ZFfGrrB*AnDn!u@>V@H$PkY#lPe!S86dfGSyw4BUoyI9~gr!U4Nn9J-_*H zy1odV5&%7drw1EraiS*eA*$e83!b#Dov0|4!o(S%$i`Wwc{J&vp`rBvfk{hCATS^c z2o2GI+vNG)rk5OgFN|e{qHm3TmsJP!hVj)rNu669MH47~z3ibu6+;5Nr~IQEP9p{C z6oT${$X{zcM8SCd`mX}No?_k5c;}l-%2wd55|@`hf3dX4`(=0w`8f;A!;j$;uO|K4JEPn@TtslfHb84cIM*b=_-`WX@bxR#sOdaem?-K0F0o z)%i;-QUSa%Fo85yZdxk-tqTLc=aFFPGcS9AEcI_m8xFt)q+AbM!5oI?&4SO%U-$7G zpf~^tAQdn@isVH_&_wSA?cL14Eu5E&UY*8Z)PZWrApF9<69UrRQg^=i{oQ-V9ruqLdmPU>nMoxlvGt! zA3uL*5i6f`i>^;#VYFn8Zvrdq4^xpdb8(Wy!~L2Nx7mK25I`W4+G%;Zs9=2}nHpKmvle*PJ zled|4T0wGvGb*59*6md??h3RBQsj@Alhrijn`S3Yb7|h)deZg?7PaF;;>jsL2FqXH zy(JnJ!1a{uyw-Fq9~0gemYT`}+0dqgIR>=%7G&a1KpO0@)u{$)gQb{T#{n5!C2k$b zHB)xHh(Z%^GX;-ZFGAe;P*wFJvK+$J7MYbG3};Z+hX;%n=6-nocgO7N33m+2r$fY` zjLoZDg0%?y6Xs+i2u_Y*ru%F=Q3XpVLU4iDrG-#v?DpO&I_0^kbgT}eH+ON8B=OYi za_rF$qf_)wq#;B-2aV*QYTJ0NV1-swlnIu+cwW@3(E;Q>+a2F*7KBMjMfhN_K7qR6 z_L?N*Jug z?QK2Joc8-K<<8P?NzF7@hy2+3Wtj<$cl@L&kE2qg3B36%KieJAiUc$WXa!6 zkqes&XqMQ%6OWdCO`0$(nf2_o_~zehQ1J2K5m^@OqV5ml_nk8;ky)cm06+{qr^fZ^ zarY(G0u4>gLc1w(_yJ~`7dy)_vhX}Pqjw&5iOh-PU%223$)Y7fYH#?5cB$Ph;LJey z_BKbiB>!p8oz=1>=i6v;pS_8s&R`*fb{R_jdjJC(hN3ePzo{w4v@E12QAbn>(-Oh{ zQ0&K6m!YzOK^H{D`NLM^WR@Gy^#%!OdT*Ygw|w7YblFXh z_1Z%uvm>(X8ca%Xxk9NH0_#Tj^VT93_MY@N7WSXc%+7{I?Hx}KLe^G&Z4ROt?$XIu z(~G5Y4kX-Yg%#OTrXp|M)Q(|mfmIbv6Jd0-ii77%BY*cK!v|9*4?b}d$WskP-e-PZ z#Q6HUl z+dcpDiXUg*(Ub~0y!N%IF%A{U(nbA5GP=u%$y!LM)_W(lnr|UPq_*!^5`0|OBjxW4 zI~XO%A1$;-7zJ0p>y;{{q$Yx25(9#uyRGML>YsbW=oaqrI+^#>#abQmhpaB8e}m|^ zS3jEUa3Lrbvj>LM?*wi@!GGfSDd`X|Lq=R3HD<|?+jAR&teycfiQNInS4OgA7`TwE5#6bStwwniad%=&w}~NK;zr#GTs8`xD1;DxSTz+cEWgX zKUXg%xAfrSyoNl7=Y7{-$&;WTpM))9p62dMxDp~9@d6B!1E?v&0Am1auIuu*=F+vQ z!|c^`|EsUC!7;Ke8GRCq_@(F*VJH94hO*zXvizw#3yCl?4Wh#W?v6~q7z!;kgQS*K zKmZ;Pn5OK6p>RZ{GLo%2a|m`7kE&-!CptIy`F&Cdux}-WO1SUR7W52(Zv~+*L8^yC zxrBNclq_ANw$;{-hBC3Br$B-2gY>!@$mWqhB6U!n$heC@B*gLfr%k93g8~vUIGLzN~LFE&fc>6Xy=D-^S4B?3wPMp(8`jv_3@D>5}F* zOG6k&tJg)zh`9WnfVke~Ab-YNYrl;2d_egl>ms-whlw1np z{6*FsJtw>Ipp-r%ansz8k+GMVBa9#-0w)lWbQ`!~<3&p)K=+;Ji3`&c%OZhVADX$X z?b-TaO0_}$KMk3^{g;0Ik2p8#uN+-4tgHTWj>!-``p@9j%^_{MimH(`G`tieZ$*WZ zPP|g1%`EoY(K4ndjr_kRU28`*=^6H`EG`(~o0}ukxl5x~g0Fu)%2{V+ODrY#*;G4`kG+}%rkFB;i%pGx8Wu$IA}G^hU|#TNi-+;KRd+?2bOGAhYHDf zt$w`J9YN;)laF8YkOt1sUjU@kMK;Ocs}R4B2vx$k1gZD-X+WqVyt)YM$(r|%*O{@5 zNx4IpI3&Ls3PvRj5T^TH2!IL#KU8CKBDJ;UJ8?rvu3hv0C{i9=C-M6Rf%CHcprJa= zV}KB8l^3(9QcOG99ax~L!lEo3_n?R(%|womR0wn)cEZ7I7WAA#~R(hBCIEn%+IkwpH+_FDpf<_XaV!cFlo4N^7zDuH2lpTSfBVsWmYaT z@Nfp5S%hf1R}}I>S~Z;Yk%uQAe(Mt7nN9UW3DecxWdj#B`9}Zy@7gZi(kTlEtM&s& zYxHWv*8qB(@>0ndj*%EG_*^W{TTF|a9v2K6s-G#&n46EcI&R@w?PmNs-6%*9mo&dS zGY1eU5YX$^zeR32=x^R@)K)*=t-WnT<#Nw3pm6R@M!%sp*(4O|J@qBh37$2-oi2aM ze*-CUkb>A3^6rq(e}#R4A|IBU-rim+NiXrczO?Aa-L6}I_`tMy_XlQ7tPt?@VXaX{4GibP*S4t*`ZiBJ#0AlR6MoL3@n9j17BL&EkD`_@7 zH>Dp(T-kfSW$zShz=&8#2LBAK*c(yVt!603OJt_>qbcCRiI_#+;+ThhT;**PuSvss zhzrV{Rz!chZq0Rrw#*k+abZ=bHjec7A3oHsFgFpL^K!YT1dBCZJ#Y4E8JtuLpQRI7FeSGhR8t8OMCn{R_hG9A?$Nu4ySRQ9 zph_=$v2e%OI2qKffiYFjo{hWv*r}rx>%iKv9#qEkY{zz3zcw!EQofh0{xO-K6XNd4 zDu+cFkc0?R)37QYAA1Ziq0SX(TB0xO-@%!D{iN+vQZ3%FQIf!vym+Ix>lq8ppDDhIgbDPlP#Z#gVb}-f}ARLXkwW2b!JT#njF9Tk* z!KOsz%V`x8m+zqN9`&cRCWf6d!g@x7!>$%Q1j7VLdi&W3%^NQ3Mv%iDU(?qRU}k<@ zP;f)OFI&jB9H5@@@$on%%p~Wh_Hb!DPQoDE)8k%0_-t50ORjZDTKv!q)5yhSBhib- zYYbw4di=O$&`9>pmSfCEQ+IcBFZ!W>dJmFC^jS3X5*+UV$#l$y%}B8AaKNlDo=@bP z_N_n0kiR`z_mfODtoA}QxkD=x)#X-mT?re9$Jsi?*Hkqiu~O!^G(YyE5cr`NuuAei zIgM|js078v!T;i~6!-vraywd5a__41k^2?c(181T~BW zkM;A>j;9phqiPrzsSBj^>~S9nVgeLaqqON>?KjitoS3J$GY!#_UdPj6@*%=wG3MIp}zW@6n+Q>X<*3)#{`!WXH_Iy16!W?6g`!8XVX zjHaS&Y>Wtg!KTYrm==^Nbn36IvX_kRd4e^Lr}lE1VQ*o}Z{J1x%9h4TvYq!;K6>2h zG7rX;-b?3o0!xJfGn&xb`wW4?%5q$(y%7B|O4i$$7?G!|d!L(WcmnegcxEB=tllfN zU6ox|fWQ{Wzqj)eq}i%tBiqMu36qY`5hp!)8PVJBie=HbPFjTE3o zjBf_^`$>mHtZkX&tqh}lBr2Kt(vQilCM544KLzv_+r{(Z++vbHKJiG1vgo3pAot@Q z;1;<;z+8s4IfrQ!sL&*~L18E0;r-6`hJuT8k05GHk*2!JgmHzx$Q4m1#}C1(B!g$A z=VRNd>nJ&-k6135SvjsbR-ag4Y-z4d)o7Zk$&O(HEs9xen+MzH+FKlLduZ@r4`)MH_GVe-*OG6?ROGf#&&$` zS!ph`NAuZUn6iVS7(N#A_RAdbb_z&%bjEudd0jdWoRCR+NA*XGUN&8Bf4CaEQg{2<@S^%xC@1HC5)Wo@1`Pap46(>LR64q;lX5#*$tJU(4p|bufrCuoA;M)E zDmsq>cp=CY-jKfSY~3Z-+}b_j${y1rsCkm^q{fKsgEf?rZ^tJ5Oe6$F_t#ZizYA+` zXn5mSr*nl!@V8oMvN*;J@oGM;QU|T%i6E!SB$!3RxTye0oSO`aq1PoAMHY0dzS4bG z-K&TwXMXv~VN@Cn))tP=NLUk#4KahpGs#0@Gj%)^q$?(uZ-|TT{JrZ@no8m$*lJ)? znITC(xIrw7Ac{pupYFdGpm}-p1AwD=K3pmMxl>X1zKjz`F3*6l+$h$OEYKUC$_ksa z=Q1pB;r>g33sb#lM2rsh;IDDAByR&6aoa3icfu8-&CtCmnhE0xP7C%L&PWm>RU0D0 z_LwP>n@QqCQj)0E9!-;nE&dPCN!Lf;N|NAAF7~%KBk`lie;bODp@7S^mywmC zx`uE_fenaC1@Ol5$5jny^|R2Zcm2w@5bCtu@aAeAuU|D{tD*$X9rl{K(--*MVQj!? z5`wvuED*VdRj=>7)M~2Uwgvzv=H#;dMerl5eBIkpF9*5>70%JjD@gXRX`$7TVP~dL z@7Hi~>NDn1yBW$T@L{9G(TC~W!U2Zg-%2zJjmO&b=86UV`e)||h?vxcw@1Ia zJTducF$u;%EM(^zT0T-TXKmd0#{>mf$I_>I=2`C7;Li6lA@@gQg3^}c+E?96Es$fO zrTa_gop3^u#GRML&(%|(LrGYZLw9!EA@35&<-+k-3_`v8-BCjyZrBqa*V+$itCLOE zUlsehi)}w-4F`WKm9;EqH4_=5fyv5@3T*S~POITYu@Eyh>Ek*L+N*0D%+7VOQK+bs zp(e9QMSwI@QkIT9iCph|iSLI)j^*;yCKC$L4JG!>mM+ErFtTJJ*=|)Z?rjOta8^UE zc%usYdsY=8tEWV$?=#;^aT49f90&IAbQl)n`hfTA$HA+rA#30NToik_@s|@8@{&O~ zUVT~caXsXO2o5)n`*hXqe2A;Y6pMNMo1e^;-IuT*iLgiR(d9eIw=XBy)_U`C?wy-l zbY=zMYO}hby(?E})whd=j080iWaZ(p^WVzO@ZDUIvuF7gqy9{F#8$)J&bLaX)OB=X`_W;x5CKjf9u1cgO|{O7f|$=^)WIzcsJu*VrJ0pt^|p|+HxHHlAy7Nw>laBl%R4ZN81k=-3Z zp^{ZMXOF$A`}N<~uXnn?1OORI`1#-Ij<}zbpef1w&5)P#4hyrq(`Zq|wV|1If*u#S z->S`-QaHx-z8g@vi0$a`4dp2rwHBsr7OI%FvohogAEt5?lC8S5 zc2R3jMSo&iH9+j(9)WEA>DNlp5}$XAW$S~*`WIpE7Cg2r4X4T`9M@UH8>F#SbxDMj z>fZEm<#Cx!7@2w?A+}n&;u8REH#9aPnXkLV5)GhkYy`!FT{)UClb<`+c#bY-W`>H> zMm;=pydvns0S|`J(DLKNQ+{#ng=W1_i#nJZf$7@#PT>$WKYBH|JUyf)`HSoqykg(I zoR)y5*=OGvY^AUFnM~a5OH&9uf;^Br7#`~{Y3kL&c8E&IM(_1vc18x!>2A)Ct^F5z zQA5|UJXX5&1@Wc431TxU-t~~`#Kj?^M+_OFf6B&BpW}9S8!#OF@QxDjax<1}Yk!u# znpSiXPRd>=sdhYmH~OTEcqJFZ+;~mALdr8YV|Q!QFOEqv6clx{=}x$PEaW$GR=*Zq zOtUbFW!pd0n87lQW&J7a-Cj+P4?u2F<2zE|UIl3Z*yXa~daw0&c?T%Ba-)F6Jx%Z7 z^?KR16xX^+PporR0fFb=g4emJobR}#0h(-}rC=FBYXT_wg2+Mc{(X!| zTkk^}NHZhFJ_Ka12D`0KQm+vkBXl|#gN+vp8yi1tld{TxEh4r7;cvnm7rINAk}=2% zuE8earX?MX(??7&Wq&`5Gvvtf#mSF$ORAsre3pTjqWb7L3WV_!NR|sjSxc+sPiGu+ zGXnZAUo8uajeR}czO}jOvf0XZhAe!T^KK!pc5k>3BAR#?)-nGntD!e5gL4%59@Ac^ z=QpNHj~=buMG{=S+%P=1jnhAU z;f<^NIK|ORUPZrzB)y-qFF}PRor+gHq|8VGDu7PUi}Gakt2O*i_`WMcLV>U*9j&&? zkVgyq#vY(-rBl^=xRrYut9T5q>S+`BWKFOD`y85o%yBvcX22(R0qQ_q zi@A_S@h=j^$9~>%M<#AP&x--&u0z!Ia!w$FzVA(F)C$%ou+OF?hMPMM!k0?xTqR`q zU`j?b8F%;yoqr{cZZDca@afP`$cRFS@m~KhD}R=yu>={Jxy#{UvI{!H|KWF^@! z)T9mtmKW$ke}sS}y*@AJvF&|yell$4eb ze)2ZT5)TK~0KNj&D-m0H0L1`Qim5k~gSM@$e1krf#_hgdMMXAy zi-@37{D%-x`3dzqI1H`(^?oxMSQ?$IMYfzMh%F(#B>qQKaG8D9&^9NzsMpV!N>A)7 zn_}~~ZdnM^NWnx8&9+{;y8v(wP}<4QBw$Ko}zBfDcGINZz{gpo~f@APMKx;rQs$;X!?0 z;Ma|}sM4cfxv^S+KVa(ZnD2|B4Lfbu{G0*VA-6nxZm~Jfm(;f#% z%0m`B`rf2Zbea#ITtjgSf8_^8bXNJJ7THi+bCE+>F;=c z{rwwLZRb#63k)T7u-ZZm*zyEmy?Tl6r5=?WUF1fFa|@p;`_o3~3PGZEcm)M$w|G~w zkRKsRn#-7s%){-!3bzETz;iF1iru@OtkJeT_)CEs2hd>MLzaA2yD7K4ZSNC?R#wI) z$T-G*)Q3u-p5haEWJpBHC4Y+87!w8n83oO<*zJf^`dDz0HfBsG) z2d6S17i>yK7t@N)n<-EiGaO&wUGgPN*uE>==8C%I?f(k>qyqM*D1_@Z+IYNC8saq+ z2IuTAAQ|cR3QQ`#mpC zAPB_#;^S$d!c(mRt02e&Eghp`ul8vM+m07HN($?_G%1KI_WQz`T2XFCgZhd`zgqE} z7itmzxf!1uHkE&p0ByM5tkAyqKATJ%6rdi0t{JpgG5wvEkscQegR%u@=shsL?{BY3 zq&HFi9v)tDo%C*p$p$ol8(EwT#PKx8s5~Ljr27PE@>)NH;MuTq9Tm!czY&ho474ugc$FA!=LYiAoywJxlM6Jf$ zHc%sG4Z6L!VQGKthG0A1K3>A~d>O2mND@sW&Y>+JSH|}hlm|^rh>pLDa&w1Ny6*{= zjyD}n+Zs`kP!4XJu6HW?)P*Lc+7w@5v+g>;%iUi~YN<^7Bz*BaSfh`Q-brn*?H(&p zN-NS1K$b%H0)QZ=7CK zG_sfmbkhg_ixS{J$YI}CP^rAe$@w)qn}vIIlI8_en?aP*vH0gE4YUk7pY1`6(lzJzm5C)zaDd1ZfKdf+<$m9sp7w3D&~m z;@U0J6U^WV#RlWS`KVuSpWI! z?ldS}57ES_DB2CJzBi3ay9Jq_qJb*|Fs3-3`7E}xY)X#5acr7}BXewEK|yS!WX}+R z+VO4@v}VDgYLG9Zb04i>ra$?cj@=PoeRFdQY(G@}Y=s-69K9VDpTEhqrvx-H5t<)_ zV+Q2bjD$ie0ulth&N#1tIXJFcM2D*PxzOyWf+TuKE#8vjD>6<25hc(NyT<>1oy78Q zW_lX%*etKygw#J6@xX6js=P;lkni9{q0BD)a-X8YpE|?+@glV=weR82FVcYzp6z#M zJCa8Y7F1`i4qa$={?FGp!q=13(q)~uIk{z zYOyqR+(Pz(4R`Rd*+3p2a-HTf8R;Dpq-FrH}LB8xg!P51x5qC z59CqMqd?eQDSNN1o8dP?j{cfYkTDv)%tpEW@8HAE$MqAwpEmw|xGYJ6kHUe>km=CU zTm_q1Ztxi*IJ9d?!R^D~qAyZMlH>o(hRvmAR4)$bEeuEt1u&PJR}NMKR<_mG6UEY8 z{^Q`N>P6eTlCojsP{iwp`fz17H`_NLBO&w4_LAfn3B5wEG`&OKY&*#zIdqR8AWH0SeFN0rLzy_)*!j+qZY)V*8PA7O~2fRf|o*?1e~5)C13 zWCo1ofKRZOT3~>K43%HfUO(*kXr_2>&dML_6$GDY$Di`fb~OGTZ16@_y>C#3Pr|6N zb6Zb*VLem)gk~?Sx)RF=mdmjh1`K1|IX93RD$|5Q@+WL0s+II0=rg?FW4V8o%KocI z#S1nb&!U*yyjZvAz6T(w;&`I7MTzvl3m==y|1@wA`gLH|^w^W+CQk1^_ayD^93~M- z(`i>$HC>X0ior0a!jKV>M<7^`qyRVT4+^drL#yD=t_;*;z~eD;wVV2b(oS^ zey2s%%og$OEF1jG?mgGrPW?oE;ZkmG^)}Zhn?VzYnc|9rWgQd%3y>ly9shKWO&W5b zMRxeuogWvn(*A_A)eyWkUbpX9xb9|6rhXG+j9aY4Aocdy;Oa?M{waSzQ5mGIUP3xN z5}jP}t@XmAsr=FX)&tM^k6-@By9nMo<*@++8ufA}MBLyf-5JbJlqZy)?n4d`Kj9UB zn;btjPT6Oq`{Z1-k;8g*tje3tG7(q+JQ!oX@@bSPBM*ooFC18q_b>tU(?CV*_Xjo} zu7EJd=2ms+zXwAApX>fe(3@TB#_A(F)Vn))6^4Cm1;kQ&yZ1GOl+M0F*-iDQJT%dI zCg}xfpE?0TgG~AW3+K%ghb^ihF7)D`vv?0rUI{-I55akGqX}!wt5(UeM(vKZB`zVp zIO)_L4swBWwXYh(`h9obe27-zf8VaO()K>lI@{)~Uu6+yr^&uDJ2^-ci?J{<+;$e< zHcuanJ0QHDm7sbldHMF(AWMzq^uN<=d_JEn<`y!)$jI_B0yPSf8#B%RvV7;cMd+(*`8{%SS#2I-E>N{^h^=}iR zWkF%`N1BHlhp!1m_sYSd{3@AI#`cz+&>;ru!H2DR-Xp8FcFWIR5~LztXL*(K@f0R5 zxqqGX@`Bya|5GQuNJW7zu!Lo1zJqu{rVSLeU?>H58NHf5$d93<3sF|ia<4HqCPt*h zu6r5vC@RCAweMss4#RWhY>F5t6d(_x;=?RQ8`yqHMwAhthO;}1l|g>r1oxa-((g|4 z-NjfD2UbX=K~F%f;V<<%Cw~iPu<%hCjd$BzC7bPv<7d^7<#wjQ3`(RB-T{X}2kA5f zVhUiliEp+r2hmH!0^jRih&%KH(Jpu5a`@AMF$oSo9tLRic@CF|1@!k|cjL7jxQ>h& zNU3F4ruZ3uq`*`T#vSD7vtu!5Fb_r^A*LSFgODc4!{P3ygSm7d59EfTCnAho$}P_w zXGw;ifr4;)OE*0FrijH>_j^!m>}3f4X|!E4L=^Ft9cHb`tR5UdDo{|NdBHnSK>H{LC=Prgy0^D3V-_JUIo>7vnC#aoWK&Al%=ZOs9 z|Eu1%Z_ft(|51nBE@Q`Yv1IkAdfv-l#>-9_j>}|H?H8cu39tWMQ&Rw&!0Z3>Epz#07;I%QXJx8qWn^ckg5?tCC@nM#bn9zu zY<#4t+4tRA*GkaS8|d0^?_5Cy|0l=e9;h6kPb0|-j~SzgUt_S{)+`wP_pOPMEcX#F6C8sfu4gBIOkx|`2u4A zaCw`s-9@wjS#fN=ChYfwK7*u}||K}GbJhfz1oyJ(@jUJAT!ST^JWKP&%~1JV2ew3q!cEZ-3>`~DI1&Ieg)F76gv<#+fBWt{16>|9)U#->NyZv4(0+g zqYl=xA}W0BURkOljXllw1(7}>2SGYxN*`Gf%fs=!ej}KDmsg26)Pg!6C zit>}cu6X}`Kn0Tg=_v*!6WH>wb4!2YFFTd@camE0k>g(u=$@;PL<@1tJ1qFp* zI6l~PPkoGvasX%<5M$iIoWr1trVXQzN&Xa;nwDk~`{&9u^}~k`TU%Q4{~f?bXw#Hi zed6}2mJz0B7W&ZUMb>~Kb~tJlF){Q>3jOf@@Y}^BqT{D2V6`noI z>{qyG5k}A_ppZpl|Je;3sr#^gH9~1b#*c{3Wp~&-AT)Fi=G0q{bAcH~j3}&zOYNDV zLo)2C-l-``TmpbMSS?x*UL~}*@n{DtR6TroCz7#OQp(#K$@ALblt`cyc`(vbN~(}3 z9y2rZ7-^)8sB*!9T?#G;D5=MOgGud~r6nwvK;R(`{b;Fa8urHm+91mwm1kC$Fv%(@ z0mv0zIwGAM|8En5g$m?Y;Htg3b0sV8;?8#vwW_M97$f<>)Jwg8o-p-ZM>d^*4!Qt)GKH^QWO9Vpg8bO#e$EL*4fh=)YLIBaVL51#(X&j@aq85 zy)pK!tU8b6_z|AO?KeJZ`Emmqh*y2SBR|EbFDfTPlUY0T&z>bqc;Apk6$I z%LLVu1Q_+bIl4k#8-a#E_iO~&Sc|T0r3@p<4`BO^NIxfnPnM;77=L=yK<9 zAdSO((0nkLbedod=nEllSga9DCkWCwQN*|Q5q2m66|WDNc|Rh*@Xb^f0HG8jf1dtD zvR?(y`mcdD1*BM zDk?S#cdr(DU;|mqJJkw`Y{+RL8+q93gMkGTnGfOF^?DTUZ)s`y`GDVJ9SkTR!L$f&+{TvhmtaUk@^o;( z_%(2YAS|t@1=da-M|%9luX!K{JA#>M?j2_?T(E`ckpk;cL9>o%DM;vHAR0(AHpRz~ z$J4W`#RljrfDEdSS8M@vQ;1Qz-TN?x*BBGr_W0*;2=f05211GK0X*+BZ+-#_LXHtN z4_(Dj(04pj=n*>)PiS3TUCRSmWL*cJD6|ECv$?t1avBVAM)gEDSgAsOa6z6AI$-#O z(22pk*aFwBdQUICuN5va^}+Cz-TSC0=SOo;#Sr+I2-q{cE0CWW?>5Mz^a0JD+bl5d zZ!_LzC$F2b%U?PjEl>IQsE(JQWO2&asqI^Cywsow#{Xk|LXn zLGN(tH}t6e6C8wPT<5*%qvIwHybYSND65QZY)x+^H6I)tl+TT$(Z>#v8d=4~k#nx( zG8==H&CSg;SIsJ&1>-!|&S5ihJiu6IeyqKl?0I;2Xz%8BIi+VFJux`@Tdcsti3jEJ zapMZ31=>a^tisn@-N>>+Mvb z&3v>(rr)%dMVU|@B41E)I)%eQ?d|Ou{m+2?MG9Zm)z$TRaH+Aszdv^xqo!nC#&oiJ zdwrcmJ5mOIK+BLjiZ7{K=$?CGQWA4}LCe#!2=>=~^aGRr0DfgwN9xZSz?)+^! z|I_4~|7Z5^UBUjPKYj$XKECLhD4X6F;8cFx9JF-3(~N(2cXzzt(Y1&iXHt3wh7_Hg zrrO$C+iuQxOa_LA)ARFBO^;`1ueKEg)z{bSpK_s&lpkQAP%K^h@JlR;94M4e0|zz= z^>TwlAzKOcjwUuS&!;)R`qC=ZYIfB#?Hw$IIZ%!@Z3!H3z9 z58r+M#Q24UtqtQN3+pE+J`rJFE?z$P>k%)n=-FSKXMb0CoL~zdp+-KUW^4As+4%Vr jl(Vxlw}p+RgQ>CI6Xc8IR>d#Fn^5;<6s2?T7`^&$(4J(p literal 0 HcmV?d00001 diff --git a/images/consensus/2022-11-16-removed-stuttering.png b/images/consensus/2022-11-16-removed-stuttering.png new file mode 100644 index 0000000000000000000000000000000000000000..606656fac379b3ba9875c41ff83e1098207b44f6 GIT binary patch literal 52161 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 literal 0 HcmV?d00001 diff --git a/images/consensus/2022-12-14-ledger-ops-benchmark.png b/images/consensus/2022-12-14-ledger-ops-benchmark.png new file mode 100644 index 0000000000000000000000000000000000000000..69a3758ff57f0fbb2a14196e4f12324e415b3ff7 GIT binary patch literal 83821 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

    Pz0QB z2$2a}$Gy_z(=iNv4q6GOOuA=O412-SV9AplcEnl$zNe~4ICdfBH2%^_1 zdLnTw$|B(m54^W?cKD6SfmA6VN>7@CDlu{|Hf6(&wd z9S$Kha&#MfGNUTruY};4NN!eWVE9us)RX--{F76DXJ^$dl$~hM8-pjD_alx6I)Nu5 z*X%yO?IfM%zhNUySI(mV#*j5JpU-MLwBPeL-cRZSog5!b-_HCy9kc@dlP&+q;ouIx z%%_!LF8*80`#{b+B;!aKIiJ$@+@uX2A|A?~6czE z+CDeaeB@_xd#4`2t9{7KF;cI6!w$ba@`g7#(a`+@l4~68#P+@!IJ&~1+2$} z731bp-KQ63NwAO

    (j+yZaAekd%0rP;h+A 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¼=NXsWJGbtVa8!?LYS(p*Y*4j$ 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 literal 0 HcmV?d00001 diff --git a/images/consensus/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks.png b/images/consensus/2023-Q2-utxo-hd-sync-ad-hoc-benchmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..75c58abe23aac7e25b8f90b1b90fe98cf29f0857 GIT binary patch literal 58311 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 z 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 Q(2tKFH9t~t`1kAo1G&!N{{R30 literal 0 HcmV?d00001 diff --git a/images/happy-path-csj-prototype-bench-1.svg b/images/happy-path-csj-prototype-bench-1.svg new file mode 100644 index 00000000000..71262d6b9fa --- /dev/null +++ b/images/happy-path-csj-prototype-bench-1.svg @@ -0,0 +1,1812 @@ + + + + + + + + 2022-10-05T14:01:43.231609 + image/svg+xml + + + Matplotlib v3.5.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/happy-path-csj-prototype-bench-2.svg b/images/happy-path-csj-prototype-bench-2.svg new file mode 100644 index 00000000000..bdfae76e616 --- /dev/null +++ b/images/happy-path-csj-prototype-bench-2.svg @@ -0,0 +1,1888 @@ + + + + + + + + 2022-10-19T12:30:35.894508 + image/svg+xml + + + Matplotlib v3.5.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/happy-path-csj-prototype-prelim.svg b/images/happy-path-csj-prototype-prelim.svg new file mode 100644 index 00000000000..a35a5935f8e --- /dev/null +++ b/images/happy-path-csj-prototype-prelim.svg @@ -0,0 +1,1424 @@ + + + + + + + + 2022-09-21T14:18:47.635974 + image/svg+xml + + + Matplotlib v3.5.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/haskell-logo.png b/images/haskell-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..97c0937482e1c82c0e2a778f3ab3c4db99edcc4f GIT binary patch literal 5674 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 IGWYuDe^AuAqW}N^ literal 0 HcmV?d00001 diff --git a/images/network/2022-11-11-noticed-headers.png b/images/network/2022-11-11-noticed-headers.png new file mode 100644 index 0000000000000000000000000000000000000000..98f661897e5bdabfd5dbbe08a78c27f186852139 GIT binary patch literal 27290 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 literal 0 HcmV?d00001 diff --git a/images/network/2023-07-06-p2p-progress.png b/images/network/2023-07-06-p2p-progress.png new file mode 100644 index 0000000000000000000000000000000000000000..59cde79f6ac2a5c0eae2975bd3970cf80281dd5d GIT binary patch literal 85638 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


    F4(nrNGyyt}(O4?^| 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 z

    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 literal 0 HcmV?d00001 diff --git a/images/network/2023-08-31-relay-versions.png b/images/network/2023-08-31-relay-versions.png new file mode 100644 index 0000000000000000000000000000000000000000..a9721ebe815108a053785483916143108abfd2a7 GIT binary patch literal 356758 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≶JABg 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ⅈsQ8!3(E)2Y)lp?6s;6mRZsgSus^#sTq+j5g_0?EXaBYV}tWc~tMOs!Hs zJ-2PW;-`nq6Gk5iQ(0#lb_%sRYOK{lAkCj1Ts%Uc6U&6>yF_J3+D8xQ69uqhoq_-( z3va;a!))$}a%WG#V(4AoFxW8L6BqxC`U6A^5M4_O zV{AtoM#QUl3_s-4&g83NFWt!+1y5MHM4)5>UZf*l-u2giUPLn{I0?MSoirtND60e( zeID3Y5-G|M70AwL{!7SC{Qg{ZFOH4%B^4#5*~S=&`RF>6xokImO1^c%AbwjK!-o&S zYrBUzkD-mP-j_bthC{?wX%zeXV5kun0w)$2iq5;=a2gCPwrn4ws%*6jBX{)n-rp(I z?3B~Ls?wQj-r~NzYEF8({QK#jft|n$aSUBtWZ-7|p)C_!#poy32x2dQ%Y*w=OlOuP zasK0y^+66Mv{9h`hbDO1JP8eQuo3e9;UV#mO+v2VAGNt@w^KN^(e>ZIoV-Ev^;_aX zrhao0_jw&c4>!EuSDwH1SAn5Wl>3$rcffy*EZwY(1EhVvz*iLDdiG-JW4so|wp}Gv z7Qf-teo|xYsif_G;>GidgW~1=e`)gt*QtEgUlfyg802QlD@W1C<)tV6!9%Ez*=y>W z%m=g~Y$}!{dNkUsl=o&np--kvYL>wGG`AV{wM78Lxz zV~H@kpC{pSew<{LeW7(9aQejf0mmyz)Z1-3{)|01fIB-oTTNYk@#%(Tq(0a;pl@iI z0{c2ae5R}e%!;&JU8~~a;R*=FalmsN@ZD2R3fk9i3n=C;NVDorOZ|Abty zYV^AbQ&~Z%&l?_|gnsbtPU-?5@I*o89-8>RegbWbN?ELU2cDNB8M(0{He0Utw$xXX za>W19K6clrq{OMl2YdqVe* zrixx-r!t?rQ_+L=lL3Abn`s$l3)Xa+(L9~)FG?bPHlbqgW=&aolQf>gP+3cF-lCTj zZjb&W5p18IK3<3T0fl-eU`lT__y<6G>%f>NmMpqXT?-s8^EH@3G|5DFU1@#2#)k}l z^)H

    exld}{9$e+I^Y+=S0}Ff2SQVbI3lzups- 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

    Zvq!Z)R7h*ZlXdp}Pa&!zl(l|C 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�dOG~{xMILhzK8tFlA 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%0DOWRBDul#=gC*m8a>#LqxwSgY{F1tXqS=<4wyq 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 UYx=w`L-0R!Rh^Z|E6n%(5A0f9fB*mh literal 0 HcmV?d00001 diff --git a/images/network/2023-10-04-relay-versions.png b/images/network/2023-10-04-relay-versions.png new file mode 100644 index 0000000000000000000000000000000000000000..afcec848767b7b1d4e6a08edc57ad693e2f5a33e GIT binary patch literal 377636 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%0DU>*FZ&R)R(O%KCWBi^U>u*0M;j? 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�fodQCaRD#XK|-wd()U-2E9 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 z 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
    +

    · 2 min read
    Alexey Kuleshevich

    High level summary

    This period we reached a major milestone, namely we now have an initial version of Conway +conformance testing working. We are now able to generate random valid data with the help +of constraint based testing framework, apply that data to Conway Ledger rules and verify +that the output matches to the one produced by the executable version of the Formal Ledger +Specification, when it is applied to the same random data.

    We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get +Constitutional Committee query is complete and tested. Various improvements to the +testing tools. Addition of more test cases.

    Low level summary

    Conway

    • pull-3888 - Add checks for valid ProtVer when a proposal is a HardFork
    • pull-3902 - Fix pvCanFollow usage in Conway and improve clarity in Shelley
    • pull-3855 - Remove unreachable proposals
    • pull-3903 - Add lenient decoder for Addr
    • pull-3878 - Committee query - implement next epoch change

    Testing

    • pull-3893 - Move tree-diff dependency to tests together with all instances
    • pull-3896 - Fix Brute force failure
    • pull-3904 - New ListWhere Pred added to the Constrained Solver.
    • pull-3907 - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file
    • pull-3883 - Committee QuerySpec Imp Test
    • pull-3909 - Make impAnn a bit more useful, by making the logs scoped by impAnn
    • pull-3908 - Use upstream testing instances for very basic types
    • pull-3912 - Removed call to tail, and the 'watchPulser' test
    • pull-3852 - Added constrained generators to conformance tests - Part 1

    Improvements and releasing

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking.

    Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io.

    Low level overview

    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Create a test network on Sanchonet #1173
    • Worked on the issue Upgrade breaking changes crates #1357
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Completed the issue Enhance aggregator REST API performances #1327
    • Completed the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Make mithril-client examples full crates #1385
    • Completed the issue Manual publication to crates.io with GitHub action #1380
    • Completed the issue Remove sqlite dependency from mithril-client crate #1390

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: Release benchmarking for node 8.7.0. Also, we performed the first-ever Conway benchmarks.
    • Development: Conway capability of our workload generator has been implemented and merged to master.
    • Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data.
    • Tracing: Quality-of-life improvements to tracing output and addition of a test suite.
    • Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.

    Low level overview

    Benchmarking

    A full set of benchmarks for node 8.7.0 has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of 8.7.0 over 8.6.0, and can confirm no regressions have been introduced.

    Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version. +Only Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty.

    Development

    Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era. +Currently, we're looking into adding Conway-exclusive features, such as DRep registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining DRep sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying.

    Infrastructure

    As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've +improved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data.

    Tracing

    The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages. +Additionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system.

    Nomad backend

    We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases.

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team conducted a packed Monthly Review meeting, +featuring demonstrations and the preparation of the monthly report. They +addressed flakiness in tests and enhanced the logs json schema, +improving overall test reliability. Additionally, the team successfully +built MacOS ARM64 (aarch64-darwin) binaries in CI, expanding platform +support. They further improved the network configuration by detecting +incompatible persisted states, contributing to overall system +robustness. Finally, the team released version 0.14.0, highlighting +their commitment to delivering regular updates and improvements.

    What did the team achieve this week

    • Monthly Review +meeting +packed with demonstrations and prepared monthly report +#1189
    • Fixed several flaky tests and improved the logs json schema +#1188#1190#1192
    • Built MacOS ARM64 (aarch64-darwin) binaries in CI +#1182
    • Improved network configuration by detecting incompatible persisted +states #1174
    • Released version 0.14.0

    What are the goals of next week

    • Start work on incremental decommit
    • Continue shepherding contributed PRs to completion
    • Finish stateless-observation work
    • Open a head on a Conway network

    · One min read
    Damian Nadales

    High level summary

    The Consensus team implemented and tested a patch that does not propagate future headers. +It is under review, and we expect it can be released in the next Cardano node version. +On the UTxO-HD front, we finished prototyping the LedgerDB and BackingStore redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend. +With this prototype finished we can start integrating the rest of the code. +We investigated the unexpected performance degradation observed when acquiring the block context. +We also released Cardano node 8.7.0 and moved tree-diff outside cardano-ledger libraries.

    + + + + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html new file mode 100644 index 00000000000..7b559619eff --- /dev/null +++ b/markdown-page/index.html @@ -0,0 +1,24 @@ + + + + + +Markdown page example | Cardano Development Updates + + + + + + + + + + + + +
    +

    Markdown page example

    You don't need React to write simple standalone pages.

    + + + + \ No newline at end of file diff --git a/p2p-relay3.mp4 b/p2p-relay3.mp4 new file mode 100644 index 00000000000..ea8958a9979 --- /dev/null +++ b/p2p-relay3.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fdf115e9488b153cec95afca51015740fc394722e82937d06eec7387d95e058 +size 67109177 diff --git a/page/10/index.html b/page/10/index.html new file mode 100644 index 00000000000..f0e0fe28274 --- /dev/null +++ b/page/10/index.html @@ -0,0 +1,54 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Alexey Kuleshevich

    High level summary

    Few important Conway related features were completed in this two week period:

    • Constitutional Committee was the last missing Conway related entity that has now been +fully implemented.
    • Treasury withdrawals governance actions have been fixed and now behave as expected.
    • Current treasury amount supplied in the transaction is now enforced by the rules.
    • DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no +proposals to vote on.
    • Semantics of how CostModels are updated with Protocol Parameters have been changed to +allow for individual Plutus language version updates, rather than requiring a complete +replacement of all CostModels

    Besides the new features there were also important performance and testing improvements:

    • In particular stake distribution computation and native script handling received some +optimizations.
    • New testing DSL has been implemented that drastically simplifies writing unit tests for +ledger rules.
    • Integration tests and benchmarks are now possible for Conway era because of the overhaul +of functionality for initial funds and staking injection whenever node starts up in +Conway, while bypassing all previous eras.

    Low level summary

    Conway era

    • pull-3729 - DRep expiry update after a contiguous set of epochs with no proposals to vote on
    • pull-3739 - Rename some PParams to be consistent with Agda specification
    • pull-3743 - Move DRepDistr from VState to ConwayGovState
    • pull-3746 - Implement tcTranslationContextL for Shelley
    • pull-3737 - Implement EraTransition
    • pull-3749 - Add predicate failure: current treasury value mismatch in LEDGER
    • pull-3748 - Apply enacted treasury withdrawals
    • pull-3745 - Constitutional Committee Ratification
    • pull-3763 - Plutus interface improvements
    • pull-3771 - Changed how costmodel updates are applied
    • pull-3766 - Prevent updating protocol version with PParamUpdate

    Performance

    • pull-3765 - Improve native script handling
    • pull-3747 - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin
    • pull-3758 - Cardano-Perf regression: UMap.size regression fix
    • pull-3754 - Use Alonzo-style TxOut encoder when possible

    Releasing

    • pull-3742 - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes
    • pull-3744 - Changelog 8.4
    • pull-3752 - Patch release of cardano ledger conway 1.8.1.0
    • pull-3753 - Minor cleanup and changelog entries
    • pull-3760 - Fixup issues for release
    • pull-3764 - Bump plutus deps to 1.13

    Testing

    • pull-3734 - Removed Shaped instance for Rep
    • pull-3735 - Simplify the implementations of hasOrd and hasEq
    • pull-3728 - STS tests based on constraints
    • pull-3714 - Implement the remaining upgradable families
    • pull-3733 - Add some unit tests for Conway features
    • pull-3762 - Update CDDL for praos headers.

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node 8.4.0-pre.
    • The use of cardano-node docker hub will be deprecated in preference of GHCR

    Lower level summary

    Capkgs

    • Refactor parsing scripts, add github action automation, various bugfixes and cleanup: capkgs-compare

    Cardano-parts

    • Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: cardano-parts-pull-8

    Cardano-playground

    • Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: cardano-playground

    Cardano-world

    · One min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has released a new distribution 2337.0, which includes the following enhancements: support for zstandard compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator.

    They also completed the refactoring and standardization of the errors in the Mithril nodes and published an Architectural decision record on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure.

    Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs.

    Low level overview

    • Completed the issue Release new 2337 distribution #1219
    • Completed the issue Errors refactoring #798
    • Completed the issue Client traffic creates performance bottleneck in aggregator #1207
    • Completed the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Worked on the issue Spike: Run client in browser WASM PoC #1254
    • Worked on the issue Benchmark aggregator performances #1220
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230

    · 2 min read
    Carlos LopezDeLara

    2023-09-13 - 2023-09-26

    High level summary

    • cardano-node 8.4.0-pre release suitable for SanchoNet.
    • CLI continues making progress integrating governance features. During this sprint we integrated the info and new-committee governance actions.
    • The team continued moving to the ERA top-level commands structure. Removed --conway-era flag from the legacy commands making conway era commands only accessible via cardano-cli conway.
    • stake-pool command is now under the ERA top level structure.
    • API continues integration with governance features, it is worth to higlight that now ProposeNewCommitee uses the right key type (cc-cold)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team conducted the monthly review meeting in +collaboration with Mithril, enhancing project coordination.

    The team improved the gen-hydra-key node command for smoother usability +and identified concrete steps to enhance network resiliency in feature +items #188, +#1080, and +#1079. +Additionally, they contributed the aiken-mode editor integration to the +aiken-lang organization, updated dependencies to utilize cardano-api +8.20, and published the Hydra security advisory CVE-2023-42806 with a +workaround available for users.

    These efforts demonstrate the team\'s commitment to project improvement, +security, and open-source community collaboration.

    What did the team achieve this week

    • Conducted the monthly review meeting together with Mithril
    • Improved gen-hydra-key node command +#1077
    • Established a clear plan to improve resiliency of network and manifested +feature items #188, +#1080 and +#1079
    • Moved aiken-mode (created by SN) +to aiken-lang organization
    • Updated dependencies to using cardano-api 8.20 +#1075
    • Published security advisory +CVE-2023-42806 +(workaround available)

    What are the goals of next week

    • Write-up the monthly report for September
    • Finish "network resilience to disconnects" +#188
    • Finish kupo integration with hydra +#1078
    • Discuss and decide on using aiken or not
    • Address the published security advisory +CVE-2023-42806 +(to not require workaround)
    • Ideally, release 0.13.0
    + + + + \ No newline at end of file diff --git a/page/11/index.html b/page/11/index.html new file mode 100644 index 00000000000..11096c6edc4 --- /dev/null +++ b/page/11/index.html @@ -0,0 +1,50 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters.
    • Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time.
    • Tracing: Work on machine-readable tracing of tracer configuration is ongoing.
    • Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster.
    • Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Blöndal!

    Low level overview

    Benchmarking

    As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking +backend with means to measure and document network latency for each run. Furthermore we've implemented means to +capture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences +in the behaviour of the underlying networking stack at OS level.

    Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided +to compare standard deviations instead to validate the measurements from nomad.

    Infrastructure

    Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline +have been merged to master. They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis.

    Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for trace-dispatcher and tx-generator we were able to address those issues.

    Tracing

    After various steps in constructing a configuration upon node startup, it is vital to document +which runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML +trace message for that purpose.

    This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node.

    Nomad backend

    As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it +produces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an +impact on our measurements, as we'd be basically using two different instruments to take them.

    Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service +or the slightly different system architecture of the new cluster.

    New team member

    Baldur Blöndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team. +So I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on cardano-tracer, the component receiving, processing and making available node traces and metrics.

    · 2 min read
    Damian Nadales

    High level summary

    We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks. +We are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough. +On the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain. +We also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway.

    UTxO-HD

    • We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (349). System level benchmark results are pending.
    • Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (344), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run.
    • We also brought the UTxO-HD branch up to date with node version 8.4.0.

    Genesis

    • We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain. +We are now drafting the final self-contained argument. (4157)

    Support

    • We debugged a bad parameter update on the Babbage to Conway transition in the SanchoNet testnet (339). +A superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (340, 354, and 355) +However we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ConsensusProtocol type class and the HardForkBlock combinator (345 and 346). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports.

    Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution.

    Low level overview

    • Completed the issue Add snapshot compression parameters in infrastructure deployments #1200
    • Completed the issue Add Cloudflare protection of infrastructure #986
    • Worked on the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Worked on the issue Error refactoring #798
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    • Worked on the issue Release new 2337 distribution #1219
    • Completed the issue Upgrade dependencies #1238

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • working on collating and open sourcing performance analysis prototype

    • improvements to Ouroboros Praos specification in Isabelle

    • working on formalising chain sync mini-protocol

    • reviewing an alternatice semantics for DeltaQ

    • Seminar talk at U. Bergen on algebraic properties of timeliness

    · One min read
    Sasha Bogicevic
    Sebastian Nagel

    High-level summary

    This week, most of the Hydra team was attending a cardano scaling workshop in +Nantes, France. They used this oportunity to meet fellow mithril team and spend +some time together to hack on some code and, as always, reflect on the past work +and find optimal path forward for both projects. They also fixed a bug that +caused hydra-node to crash when querying L1, worked on a new network resillience +proof-of-concept and accepted a new ADR related to stateless transaction +observation.

    What did the team achieve this week

    • Cardano scaling workshop with members of hydra and mithril teams
    • Accepted user contribution for possible new use-case #1048
    • Fix for the hydra-node crash related to internal wallet query #1053
    • Collected experimental CI findings #1070
    • Propose first POC for the network resilience #1074

    What are the goals of next week

    • Monthly review meeting & report including updates from Mithril
    • Review POC and discuss our options for the network resilience
    • Update cardano-api to version 8.20
    • Address TODOs on aiken commit validator #1072
    • Complete hydra-support in kupo kupo#117
    + + + + \ No newline at end of file diff --git a/page/12/index.html b/page/12/index.html new file mode 100644 index 00000000000..6d9604b0386 --- /dev/null +++ b/page/12/index.html @@ -0,0 +1,60 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Alexey Kuleshevich

    High level summary

    The Ledger team's focus is still mainly on the Conway era implementation.

    We were able to add ability to specify initial Constitutional Comittee and the initial +version of Constitution. Priority in which Governance Action are now enacted matches the +specification. DRep's deposits are now properly accounted for. Governance actions that are +not allowed to be voted on by Stake Pool operators and Constitutional Committee members +are prevented by transaction submission failure, rather than simply being ignored. There +was a few important CDDL fixes as well as a lot of new round trip serialization +tests. Constraint based testing framework has also received a lot of improvements.

    Low level summary

    Conway era

    • pull-3681 - Conway Genesis additions
    • pull-3690 - Preserve the order of ProposalProcedures
    • pull-3705 - Removed ProtVer from EnactState
    • pull-3700 - Add conway-specific certs to deposit/refunds
    • pull-3704 - Add comments on deprecating certs to Conway CDDL
    • pull-3698 - Reordering of governance actions
    • pull-3712 - Disallow empty fields in ConwayTxBodyRaw
    • pull-3716 - Abstract threshold calculation
    • pull-3725 - Fix mistaken use of dollar sign in cddl files
    • pull-3718 - Predicate failure for mismatched Voter GovAction
    • pull-3721 - Committee expiration, validation and modification

    Improvements and releasing

    Testing

    • pull-3730 - Implement Show instance for Rep using IsTypeable
    • pull-3697 - Rewrite testEql using Typeable to make it impossible to forget cases
    • pull-3709 - Add many new features to the Constrained modues in cardano-ledger-test
    • pull-3726 - Conway and other eras serialization roundtrip tests
    • pull-3713 - Improve CI resiliency against GitHub issues

    · 2 min read
    Marcin Szamotulski

    High-level overview of sprint 44

    Bootstrap Peers

    In this sprint, we focused on developing bootstrap peers.

    Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we +identified a possible improvement to bootstrap peers. A more detailed +description is available here.

    Cardano-Node-8.4.0 Release

    We also were responsible for the cardano-node-8.4.0-pre release. A final +integration PR is currently being merged. We published +new versions of ouroboros-consensus, cardano-api and cardano-cli.

    Towards Typed Protocols 0.2.0.0

    We also updated the future typed-protocols-0.2.0.0 and its integration with +cardano-node. This is towards our goal which we planned for the next +quarter. The identified tasks are to fix breaking tests, and then measure and +address possible performance regressions.

    Tech Debt

    Mark Tullsen (Galois) submitted two more PRs: ouroboros-network-#4663, +ouroboros-network-#4664. We provided feedback on their other pull requests: ouroboros-network-#4661 and +ouroboros-network-#4660.

    P2P adoption

    In the last two weeks, there was a regression in P2P adoption concerning +the number of SPOs or stakes, although the number of overall P2P relays has +increased. Karl Knutsson (Cardano Foundation) is investigating +this issue. +P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

    Data has been kindly provided by Cardano Foundation and their mainnet +monitoring infrastructure.

    Open Source

    We are in the process of upstreaming our ffi to Windows Named Pipes API to the Win32 package, see [win32-220].

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet environment was updated to 8.3.0-pre.
    • Cardano-parts now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is here.

    Lower level summary

    Capkgs

    • Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: capkgs-compare

    Cardano-ops

    Cardano-parts

    • Utilize content addressed binaries to significantly improve eval, build and devShell performance: cardano-parts-pull-8
    • Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: cardano-parts-pull-10
    • Fix warns thrown during some builds and devShell usage: cardano-parts-pull-11
    • Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: cardano-parts-pull-12
    • Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: cardano-parts-pull-13

    Cardano-perf

    • Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: cardano-perf-compare

    Cardano-playground

    Cardano-world

    · One min read
    Kostas Dermentzis

    High level summary

    We have created a DBSync tag sancho-1-1-0 which can follow sanchonet. Also +the team has ran a number of benchmarks and tests for the new options/flavours of DBSync +and prepared a blogpost which summorises them, for downstream components.

    Lower level summary

    • Integration of node-8.3.x and support for Sanchonet on Conway +#1498
    • Simplifications of new feautures +#1496
    • Makes it impossible to restart DBSync with different schema options and adds +tests for them +#1466
    • CI fixes +#1494#1491
    • Prepared a blogpost about different DBSync options +blog

    · 3 min read
    Carlos LopezDeLara

    2023-08-30 - 2023-09-12

    High level summary

    Release of Cardano-node 8.3.0-pre for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs. +This release completes phase 2 of SanchoNet feature roll out plan

    CLI continues on its migration to a era-based top-level commands. This sprint we moved text-view, key, query, genesis, node, stake-address, transaction and address into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints.

    We are moving the drep delegation-certificate to the stake-address command so delegating to a drep is done via stake-addres vote-delegation-certificate. Along the same lines, we are renaming +stake-address delegation-certificate (delagating to a stake pool) to stake-address stake-delegation-certificate to distinguish between stake delegation to a pool and votes delegation to a drep. On top +of that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly stake-address stake-and-vote-delegation-certificate. Note that change is not included on 8.3 but will come on 8.4. +Removing --conway-era flag from all the transaction sub-commands.

    Update description fields in delegation certificates from Stake Address Delegation Certificate to respectively (Conway onwards):

    • Stake Delegation Certificate
    • Vote Delegation Certificate
    • Stake and Vote Delegation Certificate

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    + + + + \ No newline at end of file diff --git a/page/13/index.html b/page/13/index.html new file mode 100644 index 00000000000..1441e057091 --- /dev/null +++ b/page/13/index.html @@ -0,0 +1,52 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team improved the commit process with support for inline +datums. They simplified the chain layer by refactoring how the chain state is +persisted. Updates to the Hydra tutorial were completed, including CI workflows +to keep it up-to-date. The team engaged in discussions with researchers about +incremental commits & decommits, and drafted an architectural decision record +for a resource-based API. They also explored simpler solutions for the upcoming +network resilience feature.

    What did the team achieve this week

    • Support InlineScriptDatum in commit +#1043
    • Refactored chain state persistency +#1049
    • Completed tutorial updates (by adding CI and some cleanup) +#997
    • Intersect Open Source committee meeting
    • Experimented with various models to better express the \"Network +resilience problem\" to find a KISS solution for +#188
    • Drafted and discussed incremental de-/commit features within team +and with researchers +#199 and +#1057
    • Created ADR for a resource based overhaul of the API +#1028

    What are the goals of next week

    • Meetup of Hydra & Mithril contributors in Nantes, France
    • Integrated cardano-api 8.15 to have GHC 9.6 support
    • A clear design for incremental commits (decommits are already +understood)
    • An ADR for improving tx construction & observation to not need chain +state

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has released a new distribution 2335.0 which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information.

    They have also worked on snapshots enhancements: implementation of the zstandard compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes.

    Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client.

    Low level overview

    • Completed the issue Use 'zstandard' compression for snapshot archives #876
    • Completed the issue Design & implement stress test tool for aggregator - phase 2 #1155
    • Completed the issue Provide progress information with '--json' option in Client #1095
    • Completed the issue Make client download and extract the archive simultaneously #1115
    • Completed the issue Add aggregator Cardano node version in snapshot artifact #948
    • Completed the issue Make Cardano node version part of the Mithril network configuration #947
    • Completed the issue Post deployment 'mainnet' infrastructure #1091
    • Worked on the issue Errors refactoring #798
    • Worked on the issue Add Cloudflare protection of infrastructure #986
    • Completed the issue Failed to restore recent snapshot with strange error #1160
    • Completed the issue Update 'ed25519-dalek' to '2.0.0' #1188
    • Completed the issue Add target networks blocks in release notes #1151
    • Completed the issue Fix end to end 'wait_for_the_expected_time' test #1191
    • Completed the issue Fix docs 'git checkout' command #1174

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack.
    • Infrastructure: Various improvements of our analysis pipeline have been merged to master, supporting safe log truncation.
    • Tracing: Namespace consistency checks have been merged to master along with a curated configuration for benchmarking.
    • Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.

    Low level overview

    Benchmarking

    We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer.

    With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance.

    The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack.

    Infrastructure

    As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation +operation that keeps the interdependencies of block events intact.

    Truncation might happen at a slightly different point +in time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time.

    Tracing

    Consistency checking of namespace implementation and configuration when using the new system has been completed. +This feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a cardano-node shows inconsistencies with the namespaces the system provides - and hence needs attention.

    Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many +detailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable.

    Nomad backend

    The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the +first real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend.

    · 3 min read
    Damian Nadales

    High level summary

    We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation. +On the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers. +The Consensus release engineer finished his rotation: version 8.3.0-pre of cardano-node is releasing 2023 September 5.

    UTxO-HD

    • We ran the first successful system-level benchmarks for UTxO-HD (see #203) using the in-memory backend.
      • We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot.
      • After the mempool regression is fixed the benchmarks need to be ran again.
      • System-level UTxO-HD benchmarks with the LMDB are still pending.
    • UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see #344).
    • We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in GetUTxOByAddress (see this comment). Preliminary results are promising.
    • Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (#344), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.

    Tech debt

    • We added tests that Consensus emits valid CBOR (#3099). This helped us detect a couple of serialization bugs. The tests still need to be merged into the main branch (#323).

    Support

    • Nick Frisby finished his release engineer rotation; cardano-node 8.3.0-pre is releasing 2023 September 5.
    • We helped to investigate a protocol version bug in Sanchonet (see #3491).
    • We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see #91.

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • finalising a presenting performance analysis internship work to the +formal methods team

    • developed a new Isabelle mini-protocol framework and examples

    • planning an extended version of the ICE DeltaQ paper

    • working on algebraic rules for properisation of any-to-finish

    + + + + \ No newline at end of file diff --git a/page/14/index.html b/page/14/index.html new file mode 100644 index 00000000000..bfff9289d10 --- /dev/null +++ b/page/14/index.html @@ -0,0 +1,57 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Sasha Bogicevic

    High-level summary

    This week, the Hydra team focused primarily on changes needed in the network +layer and have the first draft document related to needed design. They also +improved the user experience by allowing a commit using inline datums. +Discussed the off-chain governance with researchers and improved internal model +tests.

    What did the team achieve this week

    • Monthly report published
    • Small changes to hydraw and tutorial in light of the Masterclass
    • Investigated a bug and saw it was solved by recent developments
    • Improved the model tests by fully validating L1 transactions
    • Enhanced the /commit API to also allow commit from scripts with inline datums (user request)
    • Discussed off-chain governance with IOG and CF researchers
    • Drafted a first network specification document in the context of Network resilience

    What are the goals of next week

    • Have a clear understanding of the changes we need for the "Improve network resiliency" feature
    • Groomed and agreed plan on incremental commits/decommits
    • Updated tutorials including CI workflows to check consistency
    • Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)

    · 2 min read
    Alexey Kuleshevich

    High level summary

    Broadly speaking the Ledger team focused on a few main areas of Conway era:

    • Creation of voting state snapshots in order to correctly delay ratification for one epoch
    • Validation of the Governance Actions sequencing and ordering
    • Proper expiry of DReps and Proposal Procedures
    • Expanding Conway Genesis functionality
    • Utilization of some of the new Protocol Parameters in ledger validation rules

    Low level summary

    Conway era

    • pull-3659 - Validate Network for ProposalProcedure and TreasuryWithdrawal
    • pull-3637 - Avoid using sequence of tuples, by adding GovActionId to GovActionState
    • pull-3651 - Inactive DReps
    • pull-3664 - Track proposal expiry
    • pull-3668 - Add min committee size predicate to NewCommittee
    • pull-3669 - Add Proposal deposit check against PParam
    • pull-3676 - Fix inactive PoolStake not counting as Drep Stake
    • pull-3635 - Make snapshots of GovActionsState
    • pull-3670 - Validate previously enacted govAction
    • pull-3694 - Improve error reporting on the positive coin decoder
    • pull-3674 - Added RATIFY thresholds
    • pull-3684 - Add proposal delaying, remove predicate failure from ENACT
    • pull-3688 - DRep Refunds and update evalTransactionBalance

    Improvements and releasing

    • pull-3677 - Minor patch that fixes the DRep distribution computation
    • pull-3686 - Post patch release fixup
    • pull-3695 - Changelog for cardano-node-8.3 release
    • pull-3683 - Add two new bench mark programs

    Testing

    · 3 min read
    Marcin Szamotulski

    High-level overview of sprint 43

    In this sprint, we received contributions from CF & Galois. Karl Knutsson +(CF) has addressed various issues regarding peer churning in P2P, timeouts +and our WireShark dissector. While the Galois developers focused on +addressing issues from their review last year. See below for more details.

    We continued working on bootstrap peers ouroboros-network-#4661.

    We refactored our test suites: they are split into io-tests which require to +be run natively on all platforms (these tests mostly contain tests that +require IO system calls) and sim-tests which are platform independent. We +run io-tests on all supported platforms (e.g. x86_64-linux, +x86-64-darwin, aarch64-darwin and x86_64-w64-mingw32 (Windows)) natively. +The sim-tests are not executed on Windows due to memory limitations on +GitHub Actions runners. ouroboros-network-#4653

    We also started rebasing typed-protocols refactoring branches.

    Marcin was appointed as the cardano-node release engineer for the 8.4.0-pre +version. So far he integrated cardano-ledger-conway-1.8 and +ouroboros-network-0.9.1.0 to ouroboros-consensus, cardano-cli and +cardano-api. Once we will have an integration branch for cardano-node, +cardano-ledger-conway-1.8 and ouroboros-consensus packages can be released +to CHaP and PRs can be merged once they go through review & CI.

    We also fixed some smaller issues regarding peer sharing (both were discovered +by Karl from CF). More details are included below.

    Progress on P2P addoption

    SPO relays

    There are currently ~2000 relays running P2P +enabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On +16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil +Ada.

    P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

    Data has been kindly provided by CF and their mainnet monitoring +infrastructure.

    IOG relays

    As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all +IOG relays will be running P2P.

    Detailed description

    In this sprint, we got a few contributions from CF:

    • Karl made peer churning mechanism less aggressive ouroboros-network-#4656; and
    • he added timeouts for idle states in ChainSync & KeepAlive +miniprotocols. These timeouts help a node remove idle connections from the +responder (server) side ouroboros-network-#4648.
    • he improved the WireShark dissector by adding support for the peer-sharing mini-protocol ouroboros-network-#4656.

    Galois has been making progress in addressing some of the issues they raised in their review (last year):

    Peer Sharing

    • Light peer sharing is only enabled when peer sharing is turned on ouroboros-network-#4652;
    • Handshake incorrectly reports peer sharing value. It's supposed to relay the +remote value, but instead, it returns the local value. ouroboros-network-#4642 (in review).

    Async Demotion Test Fix

    • We fixed an async demotion test failure which turned out to be a weakness of +the test itself rather than a bug in the connection manager. ouroboros-network-#4655

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes
    • Work on a new capkgs repository started -- "Content Addressed Packages"
      • This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output
      • These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do
      • Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers

    Lower level summary

    Capkgs

    • Content addressed packages -- new repo: capkgs

    Cardano-ops

    • Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: cardano-ops-compare

    Cardano-parts

    Cardano-perf

    Cardano-world

    Sanchonet-demo

    · 2 min read
    Carlos LopezDeLara

    2023-08-16 - 2023-08-29

    High level summary

    CLI is making progress towards phases 3 and 4 of SanchoNet.

    • Ability to create info, no-confidence and new committee governance actions.

    • Voting as DREP is possible now on the CLI

    • API is now using Ledger's PParams and VotingProcedures

    • Expose following queries from consensus:

      - GetGovState
      - GetDRepState
      - GetDRepStakeDistr
      - GetCommitteeState
      - GetConstitution

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    + + + + \ No newline at end of file diff --git a/page/15/index.html b/page/15/index.html new file mode 100644 index 00000000000..3a4061bc4c1 --- /dev/null +++ b/page/15/index.html @@ -0,0 +1,42 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of zstandard compression of the snapshot archive, and streaming its download and decompression in the client.

    Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer.

    Low level overview

    • Completed the issue Create explorer page with registered signers #1097
    • Completed the issue Simplify logs on the Signer/Aggregator #1106
    • Completed the issue Refactor (de)serialization of crypto entities #668
    • Completed the issue Mithril client last snapshot download #1078
    • Completed the issue Use the '/signers/registered' route to verify if a signer is registered #1152
    • Worked on the issue Provide progress information with '--json' option in Client #1095
    • Worked on the issue Use 'zstandard' compression for snapshot archives #876
    • Worked on the issue Make client download and extract the archive simultaneously #1115

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team conducted the monthly review meeting for Agust,which +continously ensures transparent communication and project evaluation.

    In terms of community engagement, the Hydra team gave a Hydra master-class at +RareEvo workshop as an educational initiative for the community. +Additionally, the team updated the Hydra demo and tutorial to include Mithril +and latest release changes.

    They also focused on exploring the Hydra network resiliance in order to improve +hydra-node availability, as it becomes stuck very easily and that leads to a +bad user experience.

    What did the team achieve this week

    • Hydra master-class at RareEvo workshop!
    • Monthly report & review meeting
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Groomed network resilience and explorer features #188
    • New ADR for “Resourced based API” #1028

    What are the goals of next week

    • Have a poc on network resilience working #188
    • Fix issue #931: “Chain state in head state not updated on replayed observation”
    • Fix issue #1039: "Close transaction dropped from cardano-node"

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: Benchmarking node version 8.2.1 has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD.
    • Infrastructure: Our analysis pipeline has received improvements reducing memory footprint.
    • Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing.
    • Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.

    Low level overview

    Benchmarking

    We've performed and analysed the benchmarks for the 8.2.1 version of cardano-node as part of our release benchmarking cycle.

    Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths.

    Infrastructure

    As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held +in memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline.

    Tracing

    The next portion of optimizations has been completed and merged to master, getting rid of Haskell's native String representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by cardano-node.

    The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup.

    Nomad backend

    The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster +and porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend.

    · 2 min read
    Damian Nadales

    High level summary

    On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests. +On the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base.

    UTxO-HD

    • We addressed the issues that came from the benchmarking and testing phase (see #314).
      • We fixed the operational-certificate update exception (#305).

    Tech debt

    • We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see this branch).
    • We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see this branch).
    • We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see #275).
    • We decreased the flakiness for our test suite (#284).
    • We incorporated and merged the pull-request on query versioning (#273).
    • We started working on new performance-based regression tests for mempool operations.

    Support

    • Nick Frisby continues with his engineer responsibilities. Notably getting the Consensus release out for node pre-release 8.3. Nick also began integrating it into downstream branches (cardano{-api,-cli,-node}). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • Development of an automated prover for showing conformance of +programs to state machines (as part of the mini-protocol framework)

    • Completion of the documentation of the (current state of the) +mini-protocol framework

    • Discussion about two DeltaQ lectures with two practical sessions as part +of 4th year masters course on distributed systemsby colleagues at UC +Louvain in the Autumn

    • Discussion about four DeltaQ lectures by colleagues at U. Bergen as part +of a 5th year Masters course in the Autumn

    • Adapted original DeltaQ implementation to the new typeclasses and +wrote property tests for its algebraic laws

    + + + + \ No newline at end of file diff --git a/page/16/index.html b/page/16/index.html new file mode 100644 index 00000000000..2f226ef8207 --- /dev/null +++ b/page/16/index.html @@ -0,0 +1,61 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team released version 0.12.0, a significant update that +brings support for cardano-node 8.1.2, along with performance enhancements and +various API improvements. Additionally, the team successfully onboarded a new +contributor who is now actively participating in operating a Hydra Head. They +took part in a meeting of the Intersect open source committee and prepared the +Hydra master-class for RareEvo, an educational initiative for the community.

    If you happen to be at RareEvo, register for the Hydra master-class using this +form. +We hope to make it possible to follow along on-line as well and will announce +details on the Hydra announcements channel on the IOG discord +server.

    What did the team achieve this week

    • Released version 0.12.0 which adds support for cardano-node 8.1.2, performance +and several API improvements. Release notes
    • Replaced commit via websocket with external draft + submit. #954
    • Onboarded new contributor to the point where he actively participates in operating a Head now.
    • Joined a first meeting of the Intersect open source committee
    • Prepared the Hydra master-class for RareEvo.

    What are the goals of next week

    • Monthly review meeting
    • Run the Hydra master-class at RareEvo!
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Clear out red bin items (technical debt)
    • Groom network resilience and explorer features

    · 2 min read
    Alexey Kuleshevich

    High level summary

    The ledger team made great progress in advancing Conway era forward. In particular, voting +for DRep and Stake Pool Operators is now at the state that can be used by downstream +components. Addition of new ledger state queries makes it possible to verify changes to +the governance state, such as placement of votes, submission of governance proposals, +inspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the +ability to enact all of the governance actions, except for the hard fork initiation.

    Low level summary

    Conway progress

    • pull-3577 - Move PParams to GovState
    • pull-3609 - Adjust thresholds for sanchonet
    • pull-3604 - README: update CIP-1694 link
    • pull-3616 - Switch TreasuryWithdrawals to use RewardAcnt
    • pull-3599 - Add governance action well-formedness check
    • pull-3607 - Rename governance to gov
    • pull-3601 - Added DRep anchors
    • pull-3615 - Add optional previous GovActionId in some ProposalProcedures
    • pull-3596 - Upgradeable families
    • pull-3625 - Change constitution to use Anchor
    • pull-3592 - Added pulsing incremental computation of the DRep distribution
    • pull-3523 - Treasury donations
    • pull-3633 - Prevent state changes on phase2 failure
    • pull-3634 - Disable serialization of protocolVersion param update
    • pull-3630 - Implemented DRep refreshing
    • pull-3640 - Remove crypto parameterization from AnchorData
    • pull-3636 - Implement DRep ratification with an "always passing"; threshold
    • pull-3648 - Governance queries
    • pull-3650 - Change environment for ShelleyPOOLREAP rule
    • pull-3658 - Set DRep ratify threshold to 51%
    • pull-3628 - DELEG, POOL, GOVCERT conformance with Spec v0.8

    Testing

    Improvements and releasing

    • pull-3660 - Fix bounds and versions
    • pull-3661 - Adjust versions, bounds and CHANGELOGs to account for the latest release

    · 3 min read
    Marcin Szamotulski

    High-level overview of sprint 42

    Eclipse Evasion

    We merged and released a new version of the ouroboros-network package (version +0.9.0.0) which includes big ledger peers feature. +This is the primary peer selection mechanism to defend against eclipses. We +also prepared a PR to updated ouroboros-cosnensus +and ekg-forward packages.

    CDDL specs for protocol codecs

    We made the cddl spec for network codec more inline with the implementation +which is highly polymorphic. cddl doesn't have the notion of polymorphism, +but has any which can generate any valid cbor term. We matched it with an +Any type on the Haskell side and made all remaining tests & specs use it. +This simplified the specifications and made it easier to understand which parts +are defined in the spec, and which parts are left unspecified. See +ouroboros-network#4595.

    Ouroboros-Network-Framework API changes

    We also released ouroboros-network-framework and other network components. +The ouroboros-network-framework package contains a redesign of API exposed to +ouroboros-consensus. We consolidated, cleaned it and made it easier to +extend in the future if there will be new arguments that need to be passed to +mini-protocol initiator and responders which comes from the low-level network +layer.

    Nix setup (CI)

    We also made a major review of our nix setup. With help from our DevX team +we ended up with a clean flake.nix file which can:

    • compile & test the code on x86_64-linux, x86_64-darwin and aarch64-darwin
    • cross-compile to Windows on x86_64-linux

    And provides a shell which contains all the build tools, including ghc-9.6, +hls, cddl, and more. See ouroboros-network#4640, +ouroboros-network#4643.

    Other contributions

    Cardano Network Service Assurance

    • The work and writeup in finishing up the CNSA, first stage (first +contract).
    • Getting Sam Cowger (Galois Inc) up to speed.
    • The IOG Networking team carried a reivew of CNSA project progress: a limitted +code & design review.

    Galois Review

    Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues

    scoping, requirements, and getting started.

    CI

    We added a nightly run for GitHub actions and made the GitHub actions test be +executed with extra concurrency ouroboros-network#4637, ouroboros-network#4649.

    We also added GitHub's dependabot ouroboros-network#4650.

    Bootstrap Peers

    We settled on implementation design of bootstrap peers which is being +implemented, ouroboros-network#4615.

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet and shelley-qa environments were updated to 8.2.1-pre.
    • Work on two new repos utilizing flake parts for cardano cluster generation, automation and operation.

    Lower level summary

    Cardano-ops

    Cardano-parts

    Cardano-perf

    Cardano-playground

    Cardano-world

    Inputs-check

    • A flake parts module to check input closure sizes recursively for optimization considerations: inputs-check

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Include MuSig2 description in cryptography handbook
    • kes_agent: Finilising test and CI. Working on KES binary

    Low level summary

    Mithril

    • Full Node Verifier merged #939.

    MuSig2

    • Started describing MuSig2 to include it as part of the cryptography handbook

    Sidechains

    • Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in this fork.

    KES agent

    • KES agent is ready:
      • CI ready #19
      • Receipt confirmation message #20
      • KES agent binary ready #21
      • Control client implemented #11
    + + + + \ No newline at end of file diff --git a/page/17/index.html b/page/17/index.html new file mode 100644 index 00000000000..226a48f4961 --- /dev/null +++ b/page/17/index.html @@ -0,0 +1,51 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Kostas Dermentzis

    High level summary

    We have integrated many new Conway feutures and allow db-sync to sync sanchonet. +We also continued testing and improving the new db-sync options.

    Lower level summary

    • Conway integration +#1484
    • Support for Sanchonet +#1476
    • Stake distribution is computed earlier +#1484
    • Deposit ledger events are now used. This reduces the db queries and makes syncing faster +#1484
    • Testing new db-sync options +#1466
    • Added support for ghc-9.6 +#1479
    • Tech debt: improve exceptions +#1471

    · 4 min read
    Iñigo Querejeta Azurmendi

    Security Issue Report: SECP256k1 bug

    Date Occurred: July 15, 2022 +Severity: Potentially Very High if exploited on Mainnet +Authors: Iñigo Querejeta Azurmendi

    Date of Report: August 17, 2023

    Summary of Issue

    Criticality Level

    Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet +Context

    New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains. +How was the Issue Detected

    The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there.

    What Action was Taken

    The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod). +Fixes were applied to prevent the use of the primitives. +A full security audit was carried out on the bindings. +The rollout of the primitives was postponed to a new hard fork (Valentine)

    Potential Effect

    The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction.

    Actual Effect

    • Delay to the Vasil hard-fork
    • Temporary removal of SECP256k1 primitives
    • Additional hard-fork to introduce SECP256k1 primitives

    Ongoing Mitigations Needed, if any

    None

    Responsibility for Mitigations

    Core team

    Detailed description of Incident

    New Plutus secp256k1 cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet.

    The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing.

    • This is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an expected structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely.
    • The same happened with the Schnorr verification function. It takes as input a SECP256k1_xonly_pubkey, which is again an opaque structure that holds a parsed and valid public key.

    The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated.

    The fix was addressed in this PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts.

    Recommendations

    • Check all new Plutus bindings for correct use.
    • Audit all new Plutus built-in bindings.
    • Continue to develop specific End-to-End tests for all new Plutus features.
    • Do not assume that any existing library functions are "safe". Treat all external calls circumspectly.

    · 2 min read
    Carlos LopezDeLara

    2023-08-02 - 2023-08-15

    High level summary

    • cardano-node 8.2.1 (pre-release) to SanchoNet
    • Continue moving CLI into era-based top level command structure
    • Wire-up DREP key generation,
    • Fix DREP deregistration certificates
    • Implement Constitutional Committee Key generation on the CLI
    • Introducing era-based protocol parameters on the API
    • Removing depracated functions and types on the API

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    Fix broken links in docs

    CI & project maintenance

    · One min read
    Franco Testagrossa
    Sebastian Nagel

    High-level summary

    This week, the Hydra team updated hydra-node to support cardano-node version +8.1.2, ensuring compatibility with the latest mainnet release. The team also +participated in discussions about a "cardanonical" JSON schema and added it as a +submodule to the project, contributing to improved data modeling and +interoperability.

    In terms of community engagement, the team successfully onboarded a new +contributor, also participated in a RareEvo Twitter space, and continued +preparations for the Hydra master-class.

    What did the team achieve this week

    • Updated dependencies to support cardano-node 8.1.2 #1007
    • Engaged in discussions about a cardanonical json schema and +add it as submodule to the project +#1013
    • Onboarded a new contributor to the hydra project (@locallycompact)
    • Joined RareEvo twitter space and continued preparation of hydra master-class

    What are the goals of next week

    • Update & streamline tutorial to work with latest version of hydra-node
    • Remove the internal commit functionality #954
    • Release 0.12.0

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We've concluded benchmarking node version 8.2.0.
    • Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration.
    • Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.

    Low level overview

    Benchmarking

    As part of our release benchmarking cycle, we've completed and analysed the runs for the 8.2.0 version of cardano-node. In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version.

    Tracing

    A significant amount of optimizations for the new tracing system has finally been merged to master. At the moment, +we're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding +insight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward.

    Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing.

    Nomad backend

    The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent +and reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were +able to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks.

    A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to master.

    + + + + \ No newline at end of file diff --git a/page/18/index.html b/page/18/index.html new file mode 100644 index 00000000000..c019f21ad1f --- /dev/null +++ b/page/18/index.html @@ -0,0 +1,37 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the Mithril protocol’s mainnet beta launch: the release-mainnet network is now consistently producing new certificates and snapshots! The team has released a new distribution 2331.1 which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the mainnet infrastructure.

    Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network.

    Low level overview

    • Released the new distribution 2331.1
    • Completed the epic Release 'mainnet' Mithril network #918
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Completed the issue Design & implement basic stress test tool for aggregator - phase 1 #991
    • Worked on the epic Post deployment 'mainnet' infrastructure #1091:
      • Completed the issue Create Production Infrastructure Runbook #1085
      • Completed the issue Ingest 'mainnet' metrics/logs in Grafana #1122
    • Worked on optimizations:
      • Completed the issue Add a 'clean' file to extracted database in client #1131
      • Worked on the issue Create explorer page with registered signers #1097
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on bugs:
      • Completed the issue Client fails to unpack some snapshot archive #1137
      • Completed the issue The 'release-preprod' network stopped producing certificates #1114
      • Completed the issue The 'release-mainnet' network does not show up in the explorer #1111
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.2' #1090
    • Worked on troubleshooting:
      • Completed the issue Signer can't sign with 'Invalid signature for party' error #1125

    · 2 min read
    Damian Nadales

    High level summary

    This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of fs-sim and fs-api, and released strict-checked-vars.

    UTxO-HD

    • Rebased UTxO-HD on top of node 8.2 (issue)
    • Address new Maybe translations for UTxOs in Conway 1.6. (PR).
    • Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory.
    • Fixed an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully.
    • Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running QueryUTxOByAddress (PR).
    • Measured the speed of QueryUTxOByAddress under different queryBatchSize values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution.
    • Refactored and implemented ledgertable-related classes for the general HardforkBlock.

    Genesis

    • Frisby and Esgen continue to engage with the Researchers on grinding against the Genesis design.

    Fostering collaboration

    • Drafted a document explaining versioning of local state queries #273.

    Support

    • Frisby is the release engineer this cycle.
    • Successfully created work-in-progress ouroboros-consensus and cardano-api commits that integrate the 2023 Aug 7 tip of cardano-ledger. This will require a release of ouroboros-consensus, which hasn't happened yet.

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Finalised the missing fuzz tests
    • kes_agent: engineer on PTO. Work halted

    Low level summary

    Mithril

    • Work on a mithril flaky test #1105
    • Keep working on Full Node Verifier #939. +Should be merged in the coming week.

    MuSig2

    • Finalised the fuzz tests #43

    Sidechains

    • Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is formalising mini protocols and also further developing the +performance modelling prototype.

    Details

    • Developing new framework for specification and verification of +mini-protocols which is closer to the Haskell implementation.

    • Developed a new internal representation for the DeltaQ algebra that +allows for more modularity in backend implementations

    • Discussions regarding the Cardano networking specification

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team achieved notable progress in various aspects of the +project. The team updated the use case section for auctions on the /unstable +branch of the website, improving the understanding of Hydras applicability.

    From the development side, the team successfully completed event-sourced +persistence, a key enhancement in the projects architecture which improves +off-chain transaction processing performance. They also added a +submit-transaction endpoint to the API.

    In addition to project-related progress, the team actively engaged in community +reviews for several catalyst proposals related to Hydra and Mithril, +contributing to the wider Cardano ecosystem.

    Finally, the full report for the month of July was also published here.

    What did the team achieve this week

    • Published the monthly report for July
    • Updated the use case section for auctions (published on /unstable branch)
    • Completed event sourced persistence #913
    • Added a submit-transaction endpoint to the API #966
    • Community reviews for several catalyst proposals related to Hydra and Mithril
    • Created a network testing tool (hydra-net) #1006

    What are the goals of next week

    • Update hydra-node to work with cardano-node version 8.x
    • Remove the internal commit functionality
    • Release version 0.12.0
    • Update & streamline tutorial to work with latest version of hydra-node
    + + + + \ No newline at end of file diff --git a/page/19/index.html b/page/19/index.html new file mode 100644 index 00000000000..149fc2bc2fe --- /dev/null +++ b/page/19/index.html @@ -0,0 +1,54 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Alexey Kuleshevich

    High level summary

    The ledger team was working almost exclusively on the Conway era implementation. In +particular, the main focus was directed towards solidifying transaction related types and +their binary representation. We also directed some effort into unblocking Plutus team with +respect to PlutusV3 integration.

    Low level summary

    Conway progress

    • pull-3552 - Allow Constitutional Committee Hot Key to be ScriptHash
    • pull-3581 - Make Constitutional Committee Cold Key to be ScriptHash
    • pull-3571 - Implement a portion of the TICKF rule.
    • pull-3556 - Add Script to Constitution
    • pull-3576 - Add optional Anchor to ConwayRegDRep certificate
    • pull-3495 - Implement refund logic for Proposal deposits
    • pull-3579 - Change voting procedure in the transaction to a nested Map
    • pull-3585 - Rename CommitteeCert into a GovCert
    • pull-3587 - Remove DelegStakeTxCert from the COMPLETE pragma for TxCert
    • pull-3586 - Add CurrentTreasuryValue to TxBody
    • pull-3588 - Rename key roles
    • pull-3557 - Update NewCommittee action to use RewardAcnt and add more info
    • pull-3595 - Add ConwayUpdateDRep constructor to ConwayTxCertGov type
    • pull-3600 - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway
    • pull-3597 - Update ProposalProcedure return address to be a RewardAcnt

    Testing

    • pull-3374 - New features for generation subject to constraints
    • pull-3519 - Basic Conway features test

    Bugfixes

    Plutus integration

    • issue-3538 - A fairly complete specification was created for the PlutusV3 context
    • pull-3593 - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality

    Improvements and releasing

    • pull-3574 - Improve clarity and performance of collateral Non-ADA validation:
    • pull-3573 - Update top-level CHANGELOG.md with cardano-node relevant changes
    • pull-3555 - Bump pygments from 2.12.0 to 2.15.0 in /doc
    • pull-3575 - Bump certifi from 2022.12.7 to 2023.7.22 in /doc
    • pull-3567 - Backport mint field translation bugfix
    • pull-3568 - Fixed typo in byron ledger spec
    • pull-3572 - Release/backport tickf bugfix

    · 2 min read
    Marcin Szamotulski

    High-level overview of sprint 41

    24th July - 6th August 2023

    We started the implementation of bootstrap peers. Bootstrap peers are designed +to provide a safety guarantee for nodes joining the network while still taking +advantage of the distributed network for nodes that are synced. This will be +an intermediate step before Genesis which will allow for further distribute the +system. The bootstrap peers will be run by some trusted partners like CF, +Emurgo or IOG. They are primarily designed for leaf nodes (e.g. full node +wallets), which often end up syncing and require access to the honest chain. See +ouroboros-network#4615 for a more detailed implementation plan.

    Other contributions

    We started to use nothunks library to discover if we have any unevaluated +thunks which can lead to memory leaks ouroboros-network#4633. We found +a small one in the peer metric component of the P2P networking stack. Fixing +it put us on a small detour of fixing the API of the strict-checked-vars +package: cardano-base#431, cardano-base#432, as well as adding NFData +instance to io-classes. We also improved nothunks +library to make debugging easier and we provided a NoThunks instance for +ThreadId which we will need in the future (see nothunks#33).

    We released a new version of io-classes (version 1.2.0.0) and related +packages to Hackage.

    We addressed all review comments on the eclipse evasion PR which introduces big +ledger peers, ouroboros-network#3886.

    We fixed how SIGHUP signal handlers are registered, so it's not possible to +shutdown a node which was starting while trying to update network topology, +see cardano-node#5421.

    I didn't mention that in the previous update, so here it goes: in the previous +sprint we released ouroboros-network-0.8.2.0 and +ouroboros-network-framework-0.7.0.0.

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version 8.2.0.
    • Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing.
    • Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6.
    • Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.

    Low level overview

    Benchmarking

    The 8.2.0 version of cardano-node required adjustment of some of the sanity checks that are part of our benchmarking +cluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version.

    Tracing

    The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint +when using it as default for a running node.

    A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any +inconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node. +This feature adds another layer of robustness to the whole system.

    Infrastructure

    A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler +versions. We've future-proofed our benchmarking code.

    Nomad backend

    The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend +accordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant.

    The validation phase is ongoing. We were able to perform successful runs and analyses for various 8.x node versions, including 8.2.0-pre. With parallel runs on the current cluster, we hope to measure the same effects we've observed with the +nomad backend - which will be a big step towards production use.

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Preprod and preview envionments were updated to 8.1.2.
    • Sanchonet and shelley-qa environments were updated to 8.2.0-pre.
    • Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.

    Lower level summary

    Cardano-ops

    Cardano-perf

    Cardano-world

    · 2 min read
    Carlos LopezDeLara

    2023-07-19 - 2023-08-01

    High level summary

    • Release of Node 8.2.0
      • Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694.
      • This release is phase 1 of the SanchoNet roll out
      • Allows SPOs to vote on changes to the on-chain constitution.
      • Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag.
      • Updates to the networking packages prepare the road for peer sharing.
    • cardano-cli and cardano-api continue to integrate Conway era features
    • Continue refactoring of cardano-testnet

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    + + + + \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 00000000000..f9996bda93f --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,51 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team released the initial version of the Mithril client library, enabling developers to integrate core Mithril features into their applications. They also released a new distribution, 2347.0, which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements.

    The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance.

    Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users.

    Low level overview

    • Release of the mithril-client library crate
    • Publication of a dev blog post about the released Mithril library
    • Released the new distribution 2347.0
    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Support P2P relay in infrastructure #1361
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue mithril-client verbosity not following usage menu #1325
    • Completed the issue Error message for mithril-client snapshot download #1375

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team spent significant time opening a head among +themselves on mainnet using the release candidate, revealing and +addressing lurking bugs such as +#1174. Also +required was this change to dynamically calculate the min utxo value +#1176, a +necessary adjustment following the switch to inline datums. The team +engaged with cardano-cli / cardano-api maintainers to discuss recent +changes and collaborated on drafting feature ideas, including providing +Conway support +for the Hydra roadmap. As part of ongoing improvements, they +experimented with writing the specification in markdown instead of +LaTex.

    What did the team achieve this week

    • Opened head among us on mainnet and uncovered a few lurking bugs like +#1174 in the +release candidate
    • Calculate the min utxo value instead of hard-coding it +#1176, which is +needed since we switched to inline datums.
    • Met with the cardano-cli / cardano-api maintainers to discuss +recent changes and way forward
    • Drafted features ideas to provide Conway +support on the +Hydra roadmap
    • Experimented in writing the specification in markdown instead of LaTex

    What are the goals of next week

    • Have the Monthly review meeting with several demos
    • Release version 0.14.0 with this +scope
    • Complete tidying up chain layer via stateless observation changes in +hydra-node +#1096
    • Update dependencies to prepare for Conway +#1114

    · 4 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • The cardano-node nixos service now supports SIGHUP p2p topology reloading when the useSystemdReload option is enabled

    Lower level summary

    Capkgs

    • Update cardano-db-sync and offchain-metadata-tools package paths and/or references: capkgs-compare

    Cardano-node

    • Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: cardano-node-pull-5537
      • Creates a useSystemdReload bool option for the cardano-node nixos service
      • This will move the topology file(s) to /etc/cardano-node/topology-$i.yaml and inject systemd reload hooks for p2p configured cardano-node instances
      • Moving topology files to /etc also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired

    Cardano-parts

    • Adds a metadata server profile and a number of other features and improvements: cardano-parts-pull-20
      • Adds a new metadata-service profile
      • Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile
      • Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish
      • Adds extra node list producers and public producers for cardano-node-topology profile
      • Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch
      • Adds select systemd metrics reporting to grafana-agent profile
      • Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS
      • Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation
      • Adds support for grafana recording rules in the template files
      • Improves cardano-group profile handling of producers with respect to multiple instance nodes
      • Improves grafana-agent profile metrics handling for multi-instance cardano-node servers
      • Improves smash service preStart handling while waiting for a node socket
      • Updates Justfile for ERA_CMD demo support
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Defaults cardano-postgres profile psqlrc use to false

    Cardano-playground

    • Adds a new testnet metadata server, cluster webserver, and other improvements: cardano-playground-pull-6
      • Adds a new metadata server
      • Adds a new webserver for the cluster's static virtualhost needs
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds systemd metrics monitoring to the cluster
      • Resizes sanchonet machines to support the growing chain
      • Completes migration of preprod from world
      • Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes
      • Updates Justfile for ERA_CMD demo support
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Migrates book static code to playground from world, with refactor, cleanup and updates
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules

    Offchain-metadata-tools

    • Adds db password option with obfuscation plus misc improvements: offchain-metadata-tools-pull-61
      • Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services
      • Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile
      • Moves from std use in the nix flake to standard flake schema
      • Fixes hydra CI failures
      • Builds update-docs in hydra to avoid long local build times
      • Removes deprecated tullia
      • Removes deprecated check-hydra from pkgs
      • Removes deprecated bors files and references

    · 2 min read
    Alexey Kuleshevich

    High level summary

    Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of +CDDL specification. Important bugfixes include:

    • Fix deserialization of ValueNotConservedUTxO predicate failure that could not +previously report zero ADA.
    • Fix deserialization of CostModels in the PParamsUpdate. Invalid CostModels are no +longer allowed, only CostModels for unrecognized Plutus versions are allowed starting +with Conway
    • Fix returning of Deposits for ProposalProcedures

    Testing tooling has been improved and new tests have been implemented for Conway era.

    Low level summary

    Conway

    • pull-3858 - Restructure computing Refunds and Deposits in a TxBody across all eras
    • pull-3860 - Removed mock/crypto.cddl, added optional tag to sets
    • pull-3864 - Fix Proposal deposits and add deposit tests to imp tests
    • pull-3859 - Rename ProposalsSnapshot to Proposals
    • pull-3867 - MaryValue fixes
    • pull-3869 - Indicate that tag 258 is optional for OSet. Fix rational CDDL
    • pull-3863 - Improve deposits refunds re-usability
    • pull-3861 - Fail PParamsUpdate deserialization for invalid costmodels in Conway
    • pull-3875 - Fix cddl spec for CostModels in Conway
    • pull-3876 - Change 4 PParam fields from EpochNo to EpochInterval
    • pull-3884 - Relax requirement on the Set tag 258 to be enforced in the next era

    Testing

    • pull-3868 - Improvements to support property tests on Traces with simple Tx with DRep related Certs
    • pull-3792 - RATIFY and GOV constraint tests
    • pull-3885 - Added a test for genTxAndNewEpoch
    • pull-3886 - QuickCheck Imp integration

    Improvements and releasing

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer.

    Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release.

    Low level overview

    • Completed the issue Prototype a P2P relay with libp2p #1326
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Worked on the issue Support P2P relay in infrastructure #1361
    • Completed the issue mithril-client fails to extract archive #1352
    + + + + \ No newline at end of file diff --git a/page/20/index.html b/page/20/index.html new file mode 100644 index 00000000000..9ab41397933 --- /dev/null +++ b/page/20/index.html @@ -0,0 +1,57 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Marcin Szamotulski

    Network Update (Sprints 39 & 40)

    The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away. +It was great to see and talk to so many of the community members.

    Sprint 39 (Jun 26 - Jul 09)

    Major changes

    Now the following list of traces will be turned on by default:

    node-to-client protocol
    • LocalConnectionManagerTracer
    • LocalInboundGovernor
    • LocalHandshake
    • LocalServer
    node-to-node protocol
    • Server

    See cardano-node#5353. This will be released in node-8.2.0.

    We made sure that cardano-client-0.1.0.x library (which is db-sync) is not using the experimental node-to-client protocol. +The cardano-client-0.2.0.0 was not affected. +See ouroboros-network#4612.

    We merged the dynamic block production feature to ouroboros-consensus (also available in the cardano-node-8.2.0 release). +Dynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes. +See ouroboros-network#3159, [ouroboros-consensu#140].

    We continued to review the implementation of big ledger peers for eclipse evasion, see ouroboros-network#4462.

    Minor changes

    Sprint 40 (Jul 09 - Jul 23)

    Major changes

    We integrated ouroboros-network-0.8.2.0 with the master branch of cardano-node for the 8.2.0 release (the version match between ouroboros-network and cardano-node is purely accidental). +This includes:

    • integration with dynamic block production feature. +This feature is documented in the following PR.
    • Warm valency for local root peers (see below).

    For the full list of features included in the 8.2.0 release from the network side, please take a look at the pre-release nodes.

    We improved the memory footprint of peer metrics measured by the P2P stack. +Peer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation). +See ouroboros-network#4620. +The improvement will be available in cardano-node-8.2.0.

    We added an optional explicit warm valency to local root peers of the P2P topology file. +Previously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to. +The hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones. +Warm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses. +See ouroboros-network#4575, cardano-node#5409.

    · 2 min read
    Sebastian Nagel

    High-level summary

    During this week, the Hydra team achieved significant progress in various areas. +They conducted the monthly review meeting for July, which continously ensures +transparent communication and project evaluation. The team migrated the core +logic of the node to an event-sourced architecture and incremental writes of +events to persistence, enhancing the projects performance and maintainability. +Furthermore, the team added the ability to read protocol parameters via the API +and fixed the CI workflows to support pull requests from forks of external +contributors, streamlining the development process for community involvement.

    What did the team achieve this week

    • Held the monthly review meeting for July (recording)
    • Migrate the core logic of the node to an event-sourced architecture #999
    • Updated persistence to faster incremental writes of events #1000
    • Added ability to read protocol parameters via API #735
    • Fix CI workflows to support pull requests from forks of external contributors #993
    • Updated to GHC 9.2.8 #1005
    • Prepared an updated use cases section on https://hydra.family (published with next release)

    What are the goals of next week

    • Publish monthly report
    • Complete user transaction submission work #966
    • Remove commit from internal wallet (deprecated) #954

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team launched Mithril protocol’s mainnet beta: the release-mainnet network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch.

    They have released a new distribution 2329.0, which is running on the release-mainnet network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator.

    Finally, they have worked on enhancing the documentation for onboarding SPOs and setting up a Mithril signer, and fixing installation bugs of the binary artifacts produced in the CI.

    Low level overview

    • Created the dev blog post Mithril Protocol’s Mainnet Beta Launch
    • Released the new distribution 2329.0
    • Closed the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Deploy 'mainnet' infrastructure #988
      • Completed the issue Handle Secrets management #989
    • Worked on the epic Release 'mainnet' Mithril network #918
      • Completed the issue Prepare SPO on-boarding guide #1049
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Enhance the configuration of Mithril relay #1080
      • Completed the issue Remove legacy store adapters from aggregator #1053
      • Completed the issue Add a 'sign' sub-command to 'genesis' command in aggregator #1081
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on documentation:
      • Completed the issue Enhance 'Run a Mithril Signer node (SPO)' guide #1055
    • Worked on bugs:
      • Completed the issue Shared library error in CI binaries #1073
      • Completed the issue Debian package does not install cleanly on older ubuntu versions #834
      • Completed the issue Aggregator panics with new (de)serialization of 'ProtocolVerificationKey' #1083

    · One min read
    Damian Nadales

    High level summary

    The db-sync team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now. +We also focused on completing tracing support for UTxO-HD in cardano-node. +Currently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further.

    The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ChainSync client as part of the onboarding efforts for the team that will implement Genesis.

    The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team.

    Genesis liaising

    Improvements to the ChainSync client:

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team updated the specification to align with recent +off-chain protocol changes, completed refactoring the snapshot emission +in preparation for event-sourced protocol logic, and updated to GHC +9.2.7, resulting in improved compile times and slightly smaller Plutus +scripts.

    What did the team achieve this week

    • Updated the specification to match the recent off-chain protocol +changes to complete +#728
    • Refactored the snapshot emission logic in preparation for event +sourced protocol logic.
    • Updated to GHC 9.2.7, which led to improved compile times and +slightly smaller plutus scripts.

    What are the goals of next week

    • Monthly review meeting next wednesday and July report
    • Reflect latest information onto our roadmap.
    • Actual implemention of event-sourced persistence +#913.
    • Update the use cases section on https://hydra.family
    • Remove deprecated internal commit +#954.
    + + + + \ No newline at end of file diff --git a/page/21/index.html b/page/21/index.html new file mode 100644 index 00000000000..547e7e8d561 --- /dev/null +++ b/page/21/index.html @@ -0,0 +1,39 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Alexey Kuleshevich

    High level summary

    Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet. +All members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era. +We also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release). +Additionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available. +We also made progress on the constraint-based generators, which can now generate valid transactions and ledger states.

    What we achieved

    • [pull-3521] [pull-3554] Improved Governance model (GovernanceProcedures, ProposalProcedure)
    • [pull-3520] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert )
    • [pull-3531] Refactored and simplified code interacting with Plutus
    • [pull-3558] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix.
    • [pull-3550] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed.
    • [pull-3551] [pull-3546] [pull-3472] Updated tools and added some small improvements
    • [issue-3146] [pull-3498] Introduced Conway protocol parameters
    • [issue-2948] [pull-3499] Implemented ConwayGenesis with the new protocol parameters

    What is currently in progress

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent improvements include:

    • Re-spin sanchonet for testing a new node version followed by fork to Conway
    • Deploying a sanchonet compatible faucet to sanchonet
    • Migrate shelley qa legacy environment to cardano-world

    Lower level summary

    Cardano-node

    Cardano-ops

    • Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: cardano-ops-compare

    Cardano-world

    Iohk-nix

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is working on formalising mini protocols, the performance +modelling prototype and also finishing off their ICE papers.

    Details

    • Formalization of the chain synchronization mini-protocol in the +thorn calculus

    • Final pre-publication steps for ICE 2023 papers

    • Developing approach for specification and verification of +mini-protocols

    • Started work on porting the DeltaQ framework to a new, more concrete +backend based on piecewise-polynomials

    · 2 min read
    Carlos LopezDeLara

    · One min read
    Franco Testagrossa
    Sasha Bogicevic

    High-level summary

    This week the team focused on exploring the event sourced persistence in order +to improve hydra-node performance. Because of this work the team noticed we +need to refactor the emit snapshot emission logic and update the spec in the +light of new changes. They also took the time to revisit their goals and product +plans for the next quarter as well as doing some security fixes related to +multisignatures.

    What did the team achieve this week

    • Finished spike about performance improvements of event sourced persistence #963.
    • Refactor snapshot emission in protocol logic.
    • Revisited our roadmap and goals.
    • Prepared and conducated a learning session on lean-waste.
    • Improve security of multi-signature checks, see this Github security advisory.
    • Implemented a cache friendly way to version our binaries #962.

    What are the goals of next week

    • Implement Event sourced persistence #913.
    • Remove deprecated internal commit #954 and close #728.
    + + + + \ No newline at end of file diff --git a/page/22/index.html b/page/22/index.html new file mode 100644 index 00000000000..85513f7fbd0 --- /dev/null +++ b/page/22/index.html @@ -0,0 +1,29 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team created a new 2327.0 distribution. They focused on preparing the beta launch on the mainnet: they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the mainnet infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library.

    Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs.

    Low level overview

    • Released the new distribution 2327.0
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Add infrastructure monitoring #987
      • Worked on the issue Deploy 'mainnet' infrastructure #988
      • Worked on the issue Handle Secrets management #989
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Remove certificate hash from Artifact #932
      • Completed the issue Check vulnerabilities in CI #1037
      • Completed the issue Add 'created_at' in Mithril Stake Distribution messages #1030
      • Completed the issue Add a 'run-only' option in end to end test #1048
    • Worked on refactoring:
      • Completed the issue Factorize protocol crypto operations #669
      • Completed the issue Refactor aggregator dependency injection and services #1058
      • Completed the issue Build static binaries in CI #874
    • Worked on documentation:
      • Completed the issue Prepare SPO on-boarding guide #1049
      • Completed the issue Add instructions to set firewall using iptables #1040
      • Completed the issue Update ufw command to set firewall on Mithril Signer installation instructions #1041
    • Worked on bugs:
      • Completed the issue Aggregator does not detect certificate chain epoch gap #952
      • Completed the issue 'testing-preview' network does not create certificates #1015
      • Completed the issue SQLite compatibility in aggregator #837
      • Completed the issue Q&A followup fixes #1035
      • Completed the issue E2E tests are flaky in CI #1023

    · One min read
    Damian Nadales

    High level summary

    This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a proposed fix. The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine.

    The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility.

    On the support front, the team drafted an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed.
    • Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends.
    • Tracing: Optimization of the new tracing system is ongoing and yielding good performance results.
    • Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.

    Low level overview

    Benchmarking

    Our analysis of the GHC9 build of cardano-node has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation.

    In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into cardano-node. This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle.

    Infrastructure

    We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in master.

    Tracing

    Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance.

    Nomad backend

    For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run.

    Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to master.

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: First version of snark-based ATMS
    • mithril: Full node verifier
    • kes_agent: Keep progress, and prepare CIP and CPS
    • CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP

    Low level summary

    kes_agent

    Mithril

    • Final review of the implementation of Full Node Verifier #939. +Included benchmarks and further tests.

    Sidechains

    • Schnorr signature implemented
    • ATMS signature implemented
    • First benchmarks show that for the committe size we expect, we need 2^21 constraints.

    CIPs and community

    • Addressed some review comments in #PR506
    • Worked with the communityt on #PR524 to include Keccak as part of the next Plutus release.

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the teams have been working on finalising their ICE papers +for publication in EPTCS, formalising concensus, and investigating chain +sync.

    Details

    • Preparing final versions of ICE papers

    • Reviewing the chain sync design and documentation

    • Refactoring the thorn calculus

    • First draft of Praos specification

    • Developing bounding factors on timeouts

    + + + + \ No newline at end of file diff --git a/page/23/index.html b/page/23/index.html new file mode 100644 index 00000000000..da847b87877 --- /dev/null +++ b/page/23/index.html @@ -0,0 +1,37 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Franco Testagrossa
    Sasha Bogicevic

    High-level summary

    This week the Hydra team accomplished some nice progress. They secured the +network layer further by implementing authentication of the messages between the +peers in the Head protocol. In the process they also managed to separate +HeartBeat messages from the protocol ones which somewhat improved the quality of +code in Hydra. The team also finished work related to sending only transaction +ids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark +publishing on the website.

    What did the team achieve this week

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Add new endpoint for submitting client transactions
    • Remove commit from internal wallet

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance.

    Some notable recent improvements include:

    • Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment
    • Explorer component updates
    • Spongix caching server rewrite for R2 Cloudflare support and various performance improvements

    Lower level summary

    Cardano-node

    Cardano-ogmios

    Cardano-ops

    • Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: cardano-ops-compare

    Cardano-rosetta

    Cardano-world

    Spongix

    • Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: spongix-simple-branch

    · 2 min read
    Moritz Angermann

    High level summary

    The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements.

    Lower level summary

    build support & maintainance

    The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions.

    compiler upgrades

    Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests.

    Hydra Tools

    Our repository, input-output-hk/actions, has seen quite some improvements to facility the hydra <-> github integration.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of preliminary GHC 9.8 support.

    devx

    The devx repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our actions/devx GitHub Actions, we have a consistent set of tooling for

    • nix develop shells
    • GitHub CodeSpaces integration
    • VSCode DevContainer support
    • GitHub Actions integration

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    · One min read
    Kostas Dermentzis

    High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested
    • Many devx issues resolved

    Lower level summary

    • We have improved and validated the design for the Conway integration in db-sync
    • Improved the initial integration of the UTxO-HD feauture branches which are under test
    • Prepared a new release 13.1.1.3 which supports node 8.1.1 +#1455.
    • This also fixes a bug +#1451
    • Added new tests to the new tx_out options +#1429
    • Fixed a chronic issue in db-sync related to exception handling and concurrency +This fixes many other issues and simplifies the logic in db-sync +#1447
    • A number of fixes and improvements in ci, docker, devx, docs +#1436#1442#1448#1452

    · 2 min read
    Carlos LopezDeLara

    2023-06-21 - 2023-07-04

    High level summary

    • Started integration of conway era into the cardano-api,
    • Pre-release of cardano-cli 8.2.1 which enables creating goveranance "Update constitution" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.
    • Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities.
    • Continue refactoring cardano-testnet
    • CI and docs house keeping on the new cardnao-cli and cardano-api repositories

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    + + + + \ No newline at end of file diff --git a/page/24/index.html b/page/24/index.html new file mode 100644 index 00000000000..ea7084b34e2 --- /dev/null +++ b/page/24/index.html @@ -0,0 +1,32 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team wrote and published the monthly report for June, +implemented the end-to-end functionality for external commits, and tested it on +the preview environment. They also listed Hydra as a tool on the Cardano +developer portal, providing more visibility for the project. The team clarified +the path forward for L2 protocol improvements and explored an alternative CI +approach using cabal instead of nix. Additionally, they released version 0.11.0, +marking another milestone in the projects development.

    What did the team achieve this week

    • Written and published the monthly report for June
    • Implemented external commits end-to-end incl. tested it on preview #215
    • Listed Hydra as a tool on cardano developer portal
    • Cleared up path forward on L2 protocol improvements #728
    • Established an alternative CI using more cabal tools #923
    • Release version 0.11.0

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Complete ReqSn only sends transaction ids #728
    • Groom and plan last items for 0.12.0 (remove internal commit)
    • Improve reliability of benchmarks

    · 3 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano mainnet infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator.

    Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1.

    Low level overview

    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Add infrastructure monitoring #987
    • Completed the epic Prepare Mithril Signer deployment model for SPO #862:
      • Completed the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
      • Completed the issue Adapt infrastructure to use Mithril Relay #1018
      • Completed the issue Announce the new signer deployment model in a dev blog post #1017
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on bugs:
      • Completed the issue Aggregator does not exit on critical error #993
      • Completed the issue Computation of master certificate of an epoch is incorrect #1006
      • Completed the issue End to end tests are flaky #954
      • Worked on the issue 'testing-preview' network does not create certificates #1015
    • Worked on optimizations:
      • Completed the issue Dates format is not standardized #946
      • Completed the issue Add 'recompute-certificates-hash' command to aggregator #1001
      • Completed the issue Add a retry mechanism for artifact creation in aggregator #984
      • Completed the issue Log node version at startup in Aggregator/Signer #944
      • Completed the issue Reactivate Publish Results job in CI #978
      • Completed the issue Clean 'pending_snapshot' directory of aggregator #983
      • Completed the issue Update OpenAPI spec examples #1000
    • Worked on refactoring:
      • Completed the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Refactoring client #982
      • Completed the issue Refactor download code in client #1010
      • Worked on the issue Factorize protocol crypto operations #669
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.1' #973

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team.

    The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components.

    Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node.

    Genesis

    • We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.

    • We decided on an approach of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team.

    UTxO-HD

    • We merged the last of the PRs that were part of UTxO-HD improvements for version 0.1: expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size.
    • We added a new "legacy" cardano block in a new ouroboros-consensus-cardano-legacy-block package that should ease the transition for some downstream packages to UTxO-HD, like db-sync. This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block.
    • We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9.
    • Infrastructure: The first batch of refactoring and documentation for our tx-generator has been merged to master.
    • Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown.
    • Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.

    Low level overview

    Benchmarking

    The compiler switch to GHC9 as the default build platform for cardano-node and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard.

    Using the forge-stress approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node.

    Infrastructure

    The tx-generator is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to master. Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base.

    Tracing

    The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue.

    Nomad backend

    With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress.

    Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend.

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the teams presented two papers at ICE 2023.

    Details

    + + + + \ No newline at end of file diff --git a/page/25/index.html b/page/25/index.html new file mode 100644 index 00000000000..a227c71db50 --- /dev/null +++ b/page/25/index.html @@ -0,0 +1,56 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Franco Testagrossa
    Pascal Grange

    High-level summary

    This week, the Hydra team shared progress updates during the monthly review +meeting (monthly report and video recording available soon) and started +experimenting on preview network with the new commit from external wallet +feature.

    What did the team achieve this week

    • Monthly report & review meeting, demonstrating commit from external +wallet
    • Published regular benchmarks for +Hydra
    • Moved forward the journey for external commits using multiple script UTxOs +#903
    • Changed the API to only put transaction id in snapshots, instead of the full +transactions #922 -> this +is now evolved into fully addressing #728
    • Fuel marking is now optional as one can now commit from an external wallet +#924
    • Add flag option to display node version on tui +#934

    What are the goals of next week

    • Complete external commits using multiple script UTxOs #903
    • New release 0.11.0
    • Dirtroad solution of improved persistence performance #913

    · 2 min read
    Marcin Szamotulski

    Network Update

    Key contributions

    We held a series of session to review the implementation of big ledger peers +(eclipse evasion). See #4462.

    We get a request from a 3rd party to clarify an inconsistency between CDDL spec +and protocol implementation. We worked out a nice solution which takes +advantage of the any notion available in CDDL. On the Haskell side we +provide Any type which gen generate almost any CBOR term (some are excluded +only because they are not decoded back to the same form, and we relay on that +property). See #4580.

    We fixed a bunch of problems of the cardano-cli ping command. It also now has +a limited support of node-to-client mini-protocol (the -c option is +ignored, as it cannot be supported by node-to-client protocol). Note that +the format of messages has changed, timestamps are printed in ISO8601 format. +See #4601, #5326, #5313, #30

    In order to provide a new flag in the topology file which enables ledger peers +when the chain is close to the tip, we continued to work on #4530. This is +currently in review, the consensus team will need to provide us with the new +api. This feature is useful for two reasons: makes it easier to maintain +a topology file, it will also limit the traffic on public roots generated by +for example full node wallets and distribute it to ledger peers.

    We also continued to work on a blog post which describes the journey of design +& implementation of the dynamic P2P network layer. Too be announced soon :).

    Other smaller changes

    We limit the concurrency of resolving dns names. Up to 8 root peers or ledger +peers DNS names are resolved concurrently, and at most 2 local root peer DNS +names. See #4596.

    We fixed handshake query timeout in #4603.

    We renamed one of the block-fetch decision constructors as requested by the +consensus team, see #4608.

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:

    • A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality
    • Cardano Sanchonet environment was stood up to test Conway era functionality
    • Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case
    • Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments

    Lower level summary

    Cardano-node

    • Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: cardano-node-pull-5318

    Cardano-ops

    Cardano-world

    Ci-ops

    Ci-world

    • Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ci-world-compare

    Devx-ci

    • A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: devx-ci-repo

    Iohk-nix

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team focused their efforts on continuing to investigate and +experiment operating a head on mainnet. They collected several bugs and issues +and worked on fixing them. Now the team is soon to release a new version, +0.11.0, which comes with a lot of improvements and bug fixes.

    What did the team achieve this week

    • Restored and fixed a bug which stalled our head on mainnet #927
    • Solved one user issue #914
    • Reduced significantly local state size and logs by removing the full scripts from it #928
    • (pending review) Reduced snapshot size in the API, by only including tx ids #922

    What are the goals of next week

    • New release 0.11.0
    • Monthly report & review meeting.
    • Fix some minor bugs discovered when operating our head on mainnet
    • Complete journey for external commits using multiple script UTxOs #903
    • Publish benchmarks and provide regular benchmarks for Hydra #186

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client’s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet.

    Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI.

    Low level overview

    • Completed on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Create the sub-command for 'Mithril Stake Distribution' in client #896
      • Completed the issue Adapt end to end tests to handle new types of data #899
      • Completed the issue Update client documentation #897
      • Completed the issue Update architecture documentations for new types of data #898
      • Completed the issue Refactoring client #960
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Enhance terraform infrastructure #930
    • Completed the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Check performance impact of new stake distribution command on the 'mainnet' #962
    • Worked on the epic Prepare Mithril Signer deployment model for SPO #862:
      • Worked on the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
    • Worked on bugs and optimizations:
      • Completed the issue Aggregator does not always detect new immutable file #953
      • Completed the issue CI tests fail with Rust '1.70.0' #958
      • Worked on the issue End to end tests are flaky #954
      • Worked on the issue Certificate dates in metadata are not on the same timezone #946
      • Worked on the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Fix 'Mithril Client multi-platform test' with new client interface #956
      • Completed the issue Enhance 'ImmutableDigesterError::NotEnoughImmutable' error #969
      • Completed the issue Client 'snapshot download' command fails with option '--download-dir' #979
    + + + + \ No newline at end of file diff --git a/page/26/index.html b/page/26/index.html new file mode 100644 index 00000000000..ee71bfa560b --- /dev/null +++ b/page/26/index.html @@ -0,0 +1,52 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Damian Nadales

    High level summary

    The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the Byron and TPraos eras do not need to be checkpointed for an MVP. +There is one remaining question (which applies also to the Praos era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated "Limit on Patience" timeout sufficiently bounds how long the adversary can inflate a victim's overall sync time.

    On the UTxO-HD front, the prototype branch was rebased on top of the latest ouroboros-consensus main branch and integrated on top of cardano-node 8.1.1-pre. As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD. +We managed to run a node again with UTxO-HD enabled. +We also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for cardano-node, which uncovered a performance regression on the Network component when using GHC-9.2/9.4. This is being addressed.

    Regarding our support activities, we Released fs-sim-0.2.0.0 and are in the process of preparing the 8.2 release of cardano-node. We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests.

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We've continued release benchmarking and established a new baseline for 8.0.0.
    • New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined.
    • Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.

    Low level overview

    Benchmarking

    In our release benchmarking cycle, we established a new performance baseline for 8.0.0. Additionally, we've measured +performance under various workloads for 8.1.1-pre; the results look promising and validate the optimization efforts +done on several system components.

    In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for +benchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper.

    Tracing

    The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be +meaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific +trace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles.

    Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD.

    Nomad backend

    As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs.

    This means the backend is entering validation phase, where we systematically compare all metrics taken from the new +infrastructure to the existing ones, including determining reproducibility and variance.

    · 3 min read
    Marcin Szamotulski

    Network Update

    Key contributions and advances

    We merged light peer sharing feature, which allows to include inbound peers +into outbound governor known peers. This is the primary way for new +unregistered nodes to enter the network, which then can be shared using peer +sharing. Note that peer sharing is an experimental feature which is disabled +until genesis & eclipse evasion as fully implemented. See #3596.

    We are making progress reviewing eclipse evasion, #3886.

    We fixed another bug in local root peers. We found out that if the local roots +where ignored until the first domain name was resolved, see #4583. The bug +fix was backported and released in ouroboros-network-0.8.1.1.

    We re-started working on dynamically enabling block forging to address issue +#3159, which will enable us to release P2P on block producing nodes. See #140.

    New cardano-ping / cardano-cli ping release

    We prepared a new release of cardano-ping library which supports the new +query feature (query supported versions). See #4589, #4593 and #5313. +The new version of cardano-cli ping will use ISO8601 formatted +timestamps; also the formatting of ping results is slightly improved, and it +will introduce the new --query-versions (-Q) switch. If the remote site +supports the query parameter, the command will print:

    redacted-ip:port network rtt: 0.064
    redacted-ip:port handshake rtt: 0.064010896s
    redacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat
    orAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]

    otherwise it will print the negotiation results

    redacted-ip:port network rtt: 0.045
    redacted-ip:port handshake rtt: 0.101867615s
    redacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder

    Note that in that case cardano-cli ping offers InitiatorAndResponder, which +allows us to detect whether the remote side is an InitiatorOnly or +InitiatorAndResponder. Also cardano-cli ping will no longer announce +itself as InitiatorAndResponder, except for the case mentioned above.

    Other smaller contributions

    On a request from the Marlow Team, we published haddocks of typed-protocols, +which are now available here (#40, #41).

    We made a new release of strict-stm-1.1.0.1 on Hackage, which fixed a bug in +package description file, #101 .

    We also helped to debug a deadlock when using named pipes on Windows in the new +RawBearer API. The API is being used to store secret keys only in memory. +The PR #4395 is under review.

    We also have two more PRs which are under review:

    • #4530: enabling ledger peers on a fixed number of slots before the tip of the chain;
    • #4580: a PR which fixes inconsistencies in one of our cddl specs.

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: E2E tests for BLS bindings and KES agent
    • Sidechains: Implement ECC chip and Rescue hash primitives for ATMS
    • mithril: Full node verifier

    Low level summary

    cardano-base

    • RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); blocked due to issue with windows' localSnocket. Trying to resolve.
    • Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors #317.
    • Above, blocked by the simplification of typeclasses #404.
    • Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings

    Mithril

    • Implementation of Full Node Verifier #939

    Sidechains

    • ECC chip implemented for JubJub over BLS12-381
    • Rescue chip implemented for hashing.
    • Currently working on Schnorr signature (which uses the above constraints)

    · 3 min read
    Moritz Angermann

    High level summary

    The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements.

    Lower level summary

    build support & maintainance

    Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure LoadDLL errors to blst integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like cardano-base experiencing significant reductions in CI complexity.

    compiler upgrades

    After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility.

    CHaP (cardano-haskell-packages)

    We relocated the underlying tooling, (foliage), for CHaP into the IOG organization. Furthermore, we have introduced improved tooling to quickly add constraints to packages, better error reporting for add-revision and better hackage url compatibility to facilitate easer usage of CHaP.

    GitHub Actions

    Our repository, input-output-hk/actions, now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the base and haskell install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking cabal.

    iohk-nix

    The iohk-nix repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, sodium, blst, and secp256k1, are also fixed to certain revisions within the iohk-nix repository.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to gmp.

    devx

    The relatively new devx repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The devx repository's readme has been updated to reflect its purpose and usage guidelines.

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    + + + + \ No newline at end of file diff --git a/page/27/index.html b/page/27/index.html new file mode 100644 index 00000000000..8798f5c8410 --- /dev/null +++ b/page/27/index.html @@ -0,0 +1,46 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team worked on multiple fronts. They finished the +investigation about the broken head on mainnet and re-opened their persistent +head instance. The team also fixed the monthly report publication on their +website and started sketching ideas and further improvements. Also, they are on +the last mile to deliver a new feature which will allow parties to commit funds +from extern wallets. Finally the team started to work on optimizing the +performance on their benchmarks.

    What did the team achieve this week

    • Finished investigation on broken head on mainnet #897 and re-opened it.
    • Added support for externally committing regular utxo #887
    • Fix monthly report publication on docs website and published the monthly report. Odd problems when publishing monthly report:
      • Make us think about if we should change something about the website #908
      • Open issue to docusaurus #9036
    • Fixed a bug in the benchmark process #910
    • Explored performance of the hydra-node{.verbatim} and identified a +bottleneck.
    • Timed transaction feature is being used by the auction project 🎉

    What are the goals of next week

    • Complete performance analysis and start/plan improvements and provide +regular benchmarks for Hydra #186
    • Add hydra as tool to developer platform #872.
    • Authenticate network messages #727.
    • Complete journey for external commits using multiple script UTxOs #903
    • Start implementing Option B for external commits #215.

    · One min read
    Kostas Dermentzis

    High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2
    • A new hire will help us with devx issues.

    Lower level summary

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on giving and preparing public +talks, also on preparing final versions of their ICE 2023 papers, and +on analysing chain selection.

    This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

    Details

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer.

    Lower level summary

    Bitte

    • Equinix bare metal capability was added to bitte: bitte-pull-194
    • Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: bitte-pull-201

    Bitte-cells

    Cardano-graphql

    Cardano-node

    Cardano-ops

    Cardano-world

    Ci-ops

    • Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ci-ops-pull-108

    Ci-world

    Cicero

    • Implement a cicero webhook backoff with exponential decay plus jitter: cicero-pull-79

    Iohk-nix

    Openziti

    · 2 min read
    Martin Kourim

    High level summary

    Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.7 and 8.0.0 releases.

    Workstreams

    Full list of closed PRs

    Framework improvements:

    • Make cardano-submit-api REST API service available and run corresponding regression tests by default
    • Update cabal build testing for 8.0.0
    • Add support for testing governance SPO poll
    • Use Poetry for Python dependency management
    • Check status of known GH issues during tests runtime and finish the test accordingly
    • Generate topology files with both IP addresses and DNS names
    • Log issues like failure to start a cluster instance and report errors during tests runtime

    Testing improvements

    • Add rollback testing:
      1. global consensus is reached after rollback, in situation where less than securityParam blocks were produced since cluster split
      2. global consensus is not reached when more than securityParam blocks were produced, and the result is permanent fork
    • Add tests to governance SPO poll commands

    Node:

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests
    + + + + \ No newline at end of file diff --git a/page/28/index.html b/page/28/index.html new file mode 100644 index 00000000000..379fe6663e2 --- /dev/null +++ b/page/28/index.html @@ -0,0 +1,44 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Carlos LopezDeLara

    2023-06-07 - 2023-06-20

    High level summary

    • Completed cardano-cli migration to input-output-hk/cardano-cli
    • cardano-cli ping now uses cardano-ping-0.2.0.5
    • New queries on API:
      • queryCurrentEpochState
      • queryDebugLedgerState
      • queryGenesisParameters
      • queryPoolDistribution
      • queryPoolState
      • queryProtocolParameters
      • queryProtocolParametersUpdate
      • queryProtocolState
      • queryStakeAddresses
      • queryStakeDistribution
      • queryStakePoolParameters
      • queryStakeSnapshot
    • Deprecate:
      • queryPparams
    • Export query API as functions
      • genFeatureValueInEra
      • featureInShelleyBasedEra
      • isFeatureValue
      • valueOrDefault
      • asFeatureValue
      • asFeatureValueInShelleyBasedEra
      • queryEpoch
      • requireShelleyBasedEra
    • Restructure cardano-testnet (WIP)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team has put their effort on finding solutions on many +different problems, such as our broken head on mainnet +#897, our fragile monthly +report publications on the website and implementing Option A for +external commits #215. +Although most of these items are still open, huge progress has been made. To +accelerate the investigation, they improved their logging to give more precise +errors when a transition requirement fails, and to reduce duplication on effets +logged content. Last but not least, the team is exploring formal methods and +attended a workshop on formalizing cryptographic protocols in Agda.

    What did the team achieve this week

    • Continued investigating broken head and opened an issue to keep track #897.

      As part of this issue, improvements were made to the node logs:

      • Give a precise error when a transition requirement fails #895.

      • Reduce duplication for effects logged content by using sequential eventId and effectId pair #896.

    • Fixed references in the hydra specification #893.

    • Attended a workshop on formal methods and crypto in Agda.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete journey for external commits implementing Option A and start implementing Option B #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.
    • Fix monthly report publication on docs website.

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2321.1 distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots.

    Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks.

    Low level overview

    • Released the new distribution 2321.1
    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Enhance MessageAdapter for Artifact in aggregator REST API #925
      • Completed the issue Create the sub-command for 'Cardano Immutable Files Full' in client #895
      • Completed the issue Enhance state machines Aggregator/Signer #933
      • Completed the issue Adapt the aggregator REST API to list certificates #892
      • Worked on the issue Adapt end to end tests to handle new types of data #899
      • Worked on the issue Update client documentation #897
      • Worked on the issue Update architecture documentations for new types of data #898
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Enhance terraform infrastructure #930
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Upgrade Cardano node to '8.0.0' #920
    • Completed the issue Add export path in Client CLI #512

    · One min read
    Damian Nadales

    High level summary

    During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see this issue). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain.

    On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano.

    UTxO-HD

    • We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking SOP classes like HPure and HAp . In short, we implement generalised versions of important classes like Applicative and Traversable.

    Support

    • fs-sim-0.1.0.2 and fs-api-0.1.0.2 were released, which makes them now compatible with GHC up to 9.6.
    • ouroboros-consensus-0.7.0.0 was released for cardano-node 8.1, including query serialization fixes for backwards compatibility.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster.
    • New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism.
    • Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.

    Low level overview

    Benchmarking

    The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build +configuration: As it stands, the ghc-bignum package is using the Haskell native-backend as a default. We strive +to benchmark a build with the gmp-backend next.

    A variant of our forge-stress local benchmark has been set up to serve as an early indicator for the resource usage profile +we'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way +shorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great +support when evaluating different compiler versions or RTS flags incrementally.

    Tracing

    The hub of the new tracing system cardano-tracer is designed with a fixed output behaviour, which is limited to various +logging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to +directly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all.

    Nomad backend

    We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with +job definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing +benchmarking run required us to fine-tune communications with the nomad server.

    Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible +and offers more detailed insight than the previous iteration in cardano-ops. The backend will enable you to formulate +very specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met.

    + + + + \ No newline at end of file diff --git a/page/29/index.html b/page/29/index.html new file mode 100644 index 00000000000..a079f713418 --- /dev/null +++ b/page/29/index.html @@ -0,0 +1,43 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

    Details

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team accomplished several important tasks. They held their +monthly review meeting and drafted the report for May. They made progress on +implementing the first end-to-end journey for external commits using "Option A" +for normal UTxOs, while still considering "Option B". The team also integrated a +Spanish translation contributed by the community, created micro-benchmarks for +transaction validation and deserialization, and made improvements to +hydra-node's version reporting. Last but not least, they implemented the ability +to commit multiple UTxOs to a head at once.

    What did the team achieve this week

    • Held the monthly review meeting (recording + slides) & drafted the report for May.
    • Have a first end-to-end journey for external commits implementing Option A +for normal UTxOs #887 (still considering Option B).
    • Integrated the spanish translation #866.
    • Created micro-benchmarks for transaction validation and deserialization #884.
    • Improve hydra-node version reporting on non-released builds #849
    • Some minor CI improvements following up last weeks changes.
    • Allow commit transactions with multiple UTxO #774.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete external commits with script UTxOs #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.

    · 2 min read
    Jared Corduan

    High level summary

    The ledger team made progress on the conway ledger era. In particular, the design and implementation +of the new certificates is near complete, we refactored some of our data structures +to be able to support DReps, we cleaned up the serialization format, and renamed things to make +clearer the differences with Shelley.

    The team also completed integration work for the next node release, namely 8.1.0. +And, as always, we continue to address technical debt.

    Low level summary

    Conway progress

    • pull-3408 - Improve conway delegation certificates
    • pull-3428 - Get rid of Constitutional in favor of Genesis and Committee
    • pull-3426 - Add DRep to internal data struture (UMap)
    • pull-3425 - Improve witness logic needed for conway
    • pull-3423 - Rename ShelleyDelegCerts constructors to distinguish them from Conway
    • pull-3421 - Rename DCert -> TxCert
    • pull-3454 - conway CDDL minor fixes

    Improve testing

    • pull-3403 - Add Plutus script context golden tests

    Integration work

    • pull-3410 - Update chaps index
    • pull-3416 - Bump cardano-ledger-alonzo-test version
    • pull-3414 - Bump cardano-ledger-shelley-test minor version
    • pull-3420 - Bump cardano-ledger-shelley-ma-test version
    • pull-3441 - Release cardano-ledger-[alonzo|babbage]-1.2.1

    Technical debt

    • pull-3409 - Unit test - no such thing as a reference datum
    • pull-3407 - Fixup release process documentation
    • pull-3404 - Create TotalDeposits events during all eras
    • pull-3402 - Fix broken references in the Shelley spec
    • pull-3424 - Remove no longer used cardano-ledger-shelley-ma package
    • pull-3432 - Add an example on how to bump up versions in the changelog
    • pull-3440 - Revert back to the group serialization for ProtVer for PParams

    · One min read
    Marcin Szamotulski

    High level summary

    We continued working on eclipse-evasion. We also analysed and fixed a bug +when using DNS names in local root peers. We continued working on engineering +blog post about P2P. We released a new version of packages for +cardano-node-8.1.0 release.

    We improved our CI, removed obsolete scripts add extra validation which checks +if CHANGELOG.md files were updated.

    We also improved release scripts.

    Detailed summary

    • Eclipse evasion: #4462
    • Local root peers bug fix: #4559
    • Release to CHaP: #4573
    • CI improvements: #4572
    • Release script improvements: #4573

    · One min read
    Jordan Millar

    2023-05-24 - 2023-06-06

    High level summary

    • The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released.
    • We provided assitance where needed in the release
    • An integration repository https://github.com/input-output-hk/fusion-flamingo was created to enable my team to more easily work on cardano-cli and cardano-api

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    + + + + \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 00000000000..d1d827c2396 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,50 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 6 min read
    Kevin Hammond

    High level summary

    We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

    Initial CIP-1694 Security Analysis and Responses

    Section: The constitutional committee


    • “For example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

    There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


    Section: Size of the constitutional committee


    • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

    Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


    Section: Terms


    • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

    Thanks. Yes, that suggestion is a bit easier to read.


    Section: Registered DReps


    • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

    Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


    Section: Ratification


    • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

    These correspond exactly to the groups that are administered by the Parameter Committee.


    • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

    Yes, it’s not about harming the system, since Info +actions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

    Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


    Section: Content


    • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

    Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


    Section: Protocol Parameter groups


    • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

    These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


    • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

    All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


    Section: Votes


    • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

    They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


    Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


    • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

    There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


    Section: Changes post Edinburgh workshop (July 2023)


    • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

    It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


    Section: Reduced deposits for some government actions


    • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

    Indeed. We have no plans for this at the moment.

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team made several impactful updates. They addressed +misleading errors regarding collect com transactions, resolved a security +advisory (CVE-2023-42806), and simplified the Hydra Head protocol by using +inline datums. The team also tackled minor inconsistencies in specifications and +implementation, documented reasons for potentially dropped close transactions by +the cardano-node, and collaborated with SundaeLabs on an offline mode for +hydra-node. Additionally, they engaged in discussions with researchers about +incremental de-/commits.

    What did the team achieve this week

    • Removed misleading errors about collect com transactions #839
    • Addressed security advisory CVE-2023-42806 in PR #1161
    • Changed the head protocol to use inline datums, simplifying things in the hydra-node #1162
    • Addressed minor inconsistencies in spec and implementation #1104
    • Documented why close transacations might be dropped by the cardano-node (cant fix) #1039
    • Tidy up a few things here and there
    • Worked with SundaeLabs on the offline mode for hydra-node
    • Discussed incremental de-/commits with researchers

    What are the goals of next week

    • Start work on incremental decommits protocol specification #1057
    • Provide support to Hypix
    • Address all open bugs
    • Release version 0.14.0 with this scope
    • Update dependencies to prepare for Conway #1114
    • Shepherd off-line mode PR over the finish line
    • Complete tidying up chain layer via stateless observation changes in hydra-node #1096

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: Release benchmarking for node 8.6.0 as well as benchmarks scrutinizing GHC versions and the new tracing system.
    • Development: PlutusV3 capability of our workload generator has been implemented.
    • Tracing: First round of optimization of the cardano-tracer service has completed, awaiting validation.
    • Nomad backend: A significant PR has landed addressing automation features and debugging capabilites.
    • Workbench: Configurable remote environments and improvements to run documentation have been merged to master.

    Low level overview

    Benchmarking

    We've performed and analyzed a full set of benchmarks for node 8.6.0, both in comparison to recent release tags +and mainnet version 8.1.2. A lot of development work has entered the system since then, so it is crucial +we can rule out any potential performance risks for the next mainnet release.

    Additionally, we've been benchmarking GHC9.6.3 builds of cardano-node. Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform.

    A last set of benchmarks was dedicated to the new tracing system with node 8.6.0. We were able to show that +there is no performance risk to enabling the new system, even when forwarding all trace messages to a cardano-tracer +service on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression.

    Development

    For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes +to the execution budgets by developing specialized workloads.

    Tracing

    The cardano-tracer service has received its first batch of optimizations. Profiling output is promising; to measure +performance for a long service run time, we're currently equipping the service binary with the same capability to +emit regular resource traces as cardano-node. Analysis of those will be the basis for validating this and possible future optimization efforts.

    Nomad backend

    Many improvements for the nomad backend have been implemented and merged to master. This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service, +more detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables +our team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred.

    Workbench

    Our performance workbench has seen upgrades in documenting and reporting cardano-node builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler. +When alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential.

    Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance.

    · One min read
    Marcin Szamotulski

    High-level overview of sprint 48

    Bootstrap Peers

    We continued reviewing bootstrap peers, ouroboros-network#4555.

    IOClasses / IOSim

    We prepared slides for a Haskell meetup were we presented a talk on IOSimPOR. +The recording will be availble on YouTube.

    We also used the opportunity to do some refactoring of the IOSim code base: io-sim#117. +We released io-sim-1.3.0.0 on Hackage: io-sim#119.

    We also added forkFinally to MonadFork (not included in 1.3.0.0 release): io-sim#123.

    Tech debt

    We refactored Resource used by the DNS subsystem: ouroboros-network#4707. +We continued reviewing the ouroboros-network#4625 PR, which refactors +RootPeersDNS module.

    · 2 min read
    Damian Nadales

    High level summary

    Over the last two weeks, we managed to run a UTxO-HD capable node in legacy mode, which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does). +This legacy mode could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not. +However, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter. +On the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node. +Therefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend.

    On the Genesis front, we reviewed the peer simulator for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team.

    We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos.

    Javier Sagredo continues his cycle as release engineer, and he is working on version 8.7 of Cardano node.

    + + + + \ No newline at end of file diff --git a/page/30/index.html b/page/30/index.html new file mode 100644 index 00000000000..e51b5fb4ee8 --- /dev/null +++ b/page/30/index.html @@ -0,0 +1,37 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the "Coding Standards" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.

    What did the team achieve this week

    • Complete validation of timed transactions feature #196.
    • Write ops instructions and troubleshooting #569 and improve logs.
    • Remove --ledger-genesis argument to hydra-node options #863.
    • Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows #877.
    • Use nix to build test binaries to increase CI speed #867.
    • Updated our Coding Standards.

    What are the goals of next week

    • Monthly report & review meeting.
    • Have a first end-to-end journey for external commits implementing "Option A" #215.
    • Integrate spanish translation #866.
    • Improve and provide regular benchmarks for Hydra #186.
    • Allow commit transactions with multiple UTxO #774.
    • Explored stateless observation and refined hydra explorer ticket #696.

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the [Genesis][#genesis] section for more details.

    Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our main branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain.

    We improved our tooling by releasing an immutable DB server, which can be used for testing and benchmarking purposes, and a db-truncater program, which can be used in disaster recovery and benchmarking scenarios.

    Genesis

    The consensus team working on Genesis:

    • Improved the genesis selection rule as a result of our interaction with IO Research.
    • Studied how the hard-fork combinator handles forecasting at era transitions, and improved our documentation.
    • Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP.
    • Elaborated concrete proposal for the Genesis State Machine.
    • Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).

    The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine.

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2318.0 distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types.

    Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node 8.0.0 (along with the backward compatibility for previous 1.35.x versions).

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the handling of multiple types of signed entity in the aggregator runtime #907
      • Completed the adaptation of the signer runtime to use the signable builder service #854
      • Completed the adaptation of the aggregator runtime to use the artifact builder service #869
      • Completed the appending of the next AVK to all protocol messages #888
      • Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced #893
      • Completed the adaptation of the explorer to handle new artifact routes of the aggregator #927
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the implementation of the new stake distribution computation in the chain observer #919
      • Worked on upgrading the Cardano node to 8.0.0 #920

    · 4 min read
    Michael Karg

    High level summary

    • Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes.
    • New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due.
    • Analysis pipeline: First steps on implementing incremental analysis have been untertaken.
    • Open Sourcing: Exhaustive dataflow charts for both our analysis tool locli and our workbanch have been merged to master
    • Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster.
    • P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland.
    • Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.

    Low level overview

    Benchmarking

    As a compiler switch to GHC 9.2.7 for cardano-node's default build environment is around the corner, we're setting up our benchmarking cluster to +handle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This +also involves choosing a reliable baseline as reference point for inter-version comparisons.

    Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet, +we strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to +be balanced against resource demand for all our cluster's nodes.

    Tracing

    For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some +quality-of-life details that have changed required us to revision the system documentation.

    Analysis

    As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been +normally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a +huge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken.

    Open Sourcing

    A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking +copmonents more accessible. As a result, detailed charts for both our LogObject CLI locli and our workbench have been merged to master.

    Nomad backend

    While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting +those profiles of our workbench that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality +of the nomad cloud backend.

    Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster.

    Performance & Tracing Meetup

    We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive +days together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future. +Also, it was a great opportunity to finally meet in person.

    Offboarding

    Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation +of team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: Include final tests for BLS signature. Further adaptations for KES agent.
    • Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.

    Low level summary

    cardano-base

    Sidechains

    • Opened PR in halo2curves to include BLS12-381 and JubJub, #38
    • Addition constraint over JubJub merged #10
    + + + + \ No newline at end of file diff --git a/page/31/index.html b/page/31/index.html new file mode 100644 index 00000000000..6fe5adfadd7 --- /dev/null +++ b/page/31/index.html @@ -0,0 +1,66 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team had two paper accepted for ICE 2023 +(https://www.discotec.org/2023/ice). The event will be held in Lisbon +on 19th June 2023. The papers will be published in EPTCS.

    Details

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team achieved a number of milestones, including the release +of the first mainnet compatible version. Besides this they also addressed +inconsistencies in rollback handling, added an architecture page to the website, +reducing the size of logs using event IDs. They also had productive discussions +with researchers on plans for incremental commits/decommits and had a whiteboard +session on DeFi and lending protocols. The goals for next week include +completing the validation of the timed transactions feature, exploring stateless +observation, refining the Hydra explorer ticket, writing ops instructions and +troubleshooting, and implementing the first end-to-end journey for external +commits.

    What did the team achieve this week

    • Released first mainnnet compatible version 0.10.0
    • Addressed inconsist handling of rollbacks #784
    • Added architecture page and fixed haddock links on our website #838
    • Opened a new hydra head on mainnet
    • Talked with researchers on initial plan for incremental commits/decommits
    • Had a Whiteboard session on DeFi and lending protocols
    • Reduced size of logs using event ids #859
    • Published the monthly report for April

    What are the goals of next week

    • Complete validation of timed transactions feature #196
    • Explored stateless observation and refined hydra explorer ticket #696
    • Write ops instructions and troubleshooting #569 and improve logs
    • Have a first end-to-end journey for external commits implemented #215

    · 2 min read
    Marcin Szamotulski

    High level summary

    We started working on a new way to switch between root & ledger peers (see +below). We continued to work on eclipse-evasion. We merged changes to +Handshake contributed by Galois Inc. We made improvements to our tests (fixed +a flaky test, added cddl specs for NodeToNodeVersionData and +NodeToClientVersionData). We improved our CI and automated the process of +releasing new package version to CHaP.

    Detailed summary

    We continued to work on testing eclipse-evasion.

    We came up with an idea to limit how full node wallets relay on root peers +(currently operated by IOG, in future also CF and Emurgo). We designed +a switch to use ledger peers if the node tip is close enough to the current +time. For more details see #4530.

    We merged changes to the handshake mini-protocol which allow one to query +server's node-to-node / node-to-client parameters. We are grateful to +Galois Inc. for implementing it, #4256 and #4538. We published new version +of packages to CHaP chap-#253.

    We added DiffusionError wrapper. Thanks to it, ouroboros-consensus will +not duplicate diffusion errors messages in the log, #4537.

    We fixed an issue which caused one of our tests to be flaky, #4515.

    We added cddl tests for NodeToNodeVersionData and NodeToClientVersionData: +#4540, #4544 (in review).

    We wrote scripts which will help us release packages as well as verify that we +released all the package necessary to build the newest set of packages, +#4542.

    We renamed the consensus startup tracer and make sure it doesn't log +ExitSuccess exceptions, consensus-#71.

    We reviewed PR which adds RawBearer API, #4395.

    We made series of improvements to our CI:

    • #4539: we don't need to install cryptographic libraries in CI;
    • #4545: Javier Sagredo (consensus) cleaned up CI after consensus moved +to a new repo;
    • #4546: we switched to use GitHub merge queues;
    • #4549: we made it possible to trigger building haddocks manually;
    • #4553: we fixed and enhanced caching of building dependencies.

    · 2 min read
    Jared Corduan

    High level summary

    The ledger team focused mainly on the conway ledger era and node integration. +For conway, we completed a large structural change that now allows +for delegation certificates to be parameterized by era, and introducing +new certificates for the first time since Shelley. +We also continue to build out our contraint based generators that we will +use to property test the conway era. +In particular, we can now generate an entire ledger state and a +transaction which is balanced with respect to the ledger state.

    Low level summary

    Conway certificates

    Certificiates are now abstracted as a type family in the ledger codebase. +Moreover, there are new certificates in the Conway era to support CIP-1694, +and MIR certificates have been removed.

    Constraint based testing

    Our plan for property testing in the conway era is to no longer use the trace generators, +but instead generate ledger states and transactions based on constraints. +We hit a milestone this week, namely the ability to generate a balanced transaction in the context +of a ledger state, all based on our ever growing constaint language.

    Integration work

    Technical debt

    · 2 min read
    Jordan Millar

    2023-05-05 - 2023-05-23

    High level summary

    • Golden tests for cardano-cli command help output were added.
    • Documentation was updated with new libsodium installation instructions.
    • There were several updates for the cardano-cli:
      • Deletion of the deprecated shelley command group.
      • Addition of golden tests for CLI help.
      • An improvement to avoid bare IO in tests, allowing better error reporting in failed tests.
      • Generation of UTCTime test values without leap seconds (avoids erroneous test failures)
      • Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32.
    • The cardano-api underwent multiple refinements:
      • Implementing deposit handling when balancing transactions (necessary for Conway)
      • Cleaning up socket file path code.
    • Several changes were made to the cardano-testnet:
      • Adding golden tests for cardano-testnet help.
      • Removing all hardcoded yaml files in cardano-testnet
      • Improving cardano-testnet help output.
      • Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    + + + + \ No newline at end of file diff --git a/page/32/index.html b/page/32/index.html new file mode 100644 index 00000000000..043b1663692 --- /dev/null +++ b/page/32/index.html @@ -0,0 +1,63 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version 1.35.7.

    Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain.

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the implementation of the Certifier service in the aggregator #850
      • Completed the implementation of the signable builder for the Mithril Stake Distribution #851
      • Completed the implementation of the artifact builder for the Mithril Stake Distribution #870
      • Completed the implementation of the signable builder for the Full Immutables Snapshot #852
      • Completed the implementation of the artifact builder for the Full Immutables Snapshot #871
      • Completed the adaptation of the aggregator runtime to use the signable builder service #853
      • Worked on the adaptation of the signer runtime to use the signable builder service #854
      • Completed the definition of the entity service interface for verification/restoration #868
      • Completed the refactoring of the OpenMessage type #878
    • Completed the epic that simplifies the multi-signer in the aggregator #398:
      • Completed the extraction of the single signature registration from the multi-signer #643
    • Completed the upgrade of the Cardano node to version 1.35.7 #881
    • Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators #873

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks we made some important progress in the Genesis design. +It seems the BlockFetch logic need not be modified for Genesis, although this +needs to be confirmed. We started a DoS mitigation handbook and updated our +conceptual component diagram to guide the Genesis design. We engaged with the +IOG researchers to work on the Limit on Patience attack vector, work in this +area is still ongoing. We sketched a design to decouple the CPU load of the node +from its responsiveness to the socket. Finally, we discussed with Networking our +approach to lower the performance impact of the BlockFetch decision logic, and +got green light from them.

    We migrated the consensus code to a new +repository, splitting +it from the ouroboros-network repository, and released version 0.6 of +Consensus.

    We also merged the mempool fairness improvement to main branch.

    Another significant enhancement to our documentation was the addition of an +explanation of the hardfork combinator forecast horizon.

    See the sections below for more details.

    Genesis

    We reviewed the BlockFetch design documentation, and added some source-code +comments that emphasize certain properties of the decisions the BlockFetch +logic makes that are helping us confirm that Genesis does not require any +changes to BlockFetch. We are waiting on input from our former system +architect to verify this.

    We migrated and updated the conceptual component diagram in the ouroboros-consensus +repository which helps us situate the Genesis design and argument.

    We engaged with the IOG researchers about the Genesis design. We sketched out a +way to address the concern that the Limit on Patiente (LoP) attack vector duty +cycle is indeed low, but it's still non-trivial to ultimately conclude it's +sufficiently low.

    We also sketched a design to decouple the CPU load of the node from its +responsiveness to the socket, since the LoP is a relatively tight timeout, and +node performance bugs inducing seconds-worth of latency are unfortunately +familiar phenomena.

    Fostering collaboration

    We added an +explanation of +a question that we had to explain many times about the exact behavior of the +hardfork combinator forecast horizon.

    · 2 min read
    Michael Karg
    • Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.
    • New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint.
    • Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on.
    • Infrastructure: The plutus-apps flake input for cardano-node has finally been removed.
    • Nomad backend: A PR implementing placement of benchmarking clusters has been merged.

    Benchmarking

    The performance investigations on the 8.0 release branch have lead to pinpointing and addressing incosistent behaviour. For that, +we created yet another local reproduction with the workbench's forge-stress benchmark.

    Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into 8.0 and +subsequent releases.

    Additionally, we've refined the trace-bench family of profiles that target benchmarking our own new tracing system.

    Tracing

    Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally +intended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant +conversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system.

    Infrastructure & Analysis

    Dataflow documentation

    The LogObject CLI locli is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate +further development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting.

    Remove redundant Plutus flake input

    This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input, +we simplify the dependency graph for cardano-node, as well as enable immediate feedback when developing Plutus benchmarks.

    Nomad backend

    Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking. +This capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along +with various quality-of-life improvements, has been merged to master.

    · One min read
    Kostas Dermentzis

    High level summary

    Lower level summary

    • Prepared a schema change which is expected to speed up queries and help clients +#1389.
    • Ran a big number of benchmarks on the above to evaluate if this change is reasonable.
    • Performance optimization related to rewards +#1382
    • Using the cache in more places to reduce recourses usage +#1380
    • Evaluated risks related to UTXO-HD integration
    • Worked on a feauture request to split the tx_out to an address table +#1396
    • Worked on another feauture request to prune the consumed entries from the tx_out table +#1398
    • Prepared for CIP-1694 integration

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library.
    • KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction.
    • Sidechains: Started implementing ECC chip of JubJub over BLS12-381.

    Low level summary

    cardano-base

    • #255 finally merged 🎉
    • Additional tests for BLS bindings #384
    • Open PR for including test vectors created with zkscrypto's library, PR#397

    KES agent

    • Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period PR#389.
    • Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) #317.
    • Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim
    • Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes
    • Refactor MonadSodium into MonadMLock PR#388.

    Sidechains

    • Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)
    • Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo
    + + + + \ No newline at end of file diff --git a/page/33/index.html b/page/33/index.html new file mode 100644 index 00000000000..eccbde9be7a --- /dev/null +++ b/page/33/index.html @@ -0,0 +1,53 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is working on porting an existing formalisation of Ouroboros +Praos to a newer foundation.

    Details

    · 2 min read
    Marcin Szamotulski

    High level summary

    The networking team has released the following packages to Hackage:

    We published an announcement blog post. We made progress +also on another blog post which will describes the design of the P2P networking +layer.

    After moving ouroboros-consensus to its own repository, we made +ouroboros-network compatible with GHC 9.4 and 9.6.

    We made cardano-client library independent of +ouroboros-consensus-diffusion.

    We prepared release of network packages for cardano-node-8.0.

    Detailed log

    Ouroboros-Network

    IO-Sim

    • io-classes-1.0.0.0, and following up releases: 1.0.0.1 (ghc-9.6 +support), 1.1.0.0 (documentation fix).
    • Fixed timeouts and delays in io-sim in a series of PRs: io-sim#81, +io-sim#82, io-sim#86, io-sim#87.
    • Renamed a module: io-sim#88.
    • Fixed a failing registerDelayCancellable test: [io-sim#80].
    • Use GitHub merge queue in io-sim repository.
    • CI: download stylish-haskell: io-sim#83.

    Typed Protocols

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team held their Monthly review meeting and drafted the +report which likely is published next week. They put the spec into the +repository and website, addressed a user issue and fixed the TUI peer list. +Furthermore, they updated dependencies, conducted a Twitter space on Auctions +use cases, covered the rollback bug with tests and implemented a solution. +Looking ahead, their goals for next week include releasing 0.10.0, implementing +timed transactions support, writing a Query API ADR, and grooming work items +like off-chain benchmarks.

    What did the team achieve this week

    • Held the Monthly review meeting and drafted the report (to be published next week)
    • Added the spec into the repository +#693 and published on +the +website
    • Groom and addressed user issue #823
    • Covered the rollback bug with tests and implemented a solution (to be reviewed) #784
    • Fixed the TUI peer list
    • Updated dependencies to match cardano-node master
    • Conducted a twitter space on Auctions use cases

    What are the goals of next week

    • Release 0.10.0
    • Support timed transactions solution drafted and validated API with users
    • Write Query API ADR and groom a concrete step
    • Groom and solve PostTxOnChainFailed UX problem #832
    • Groom off-chain benchmarks idea #186 and turn it into a feature

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team worked on several fronts, including fixing state +machine continuity on-chain, discussing voting project solutions, exploring +adding Hydra support to kupo, and improving API navigation with a sidebar. The +team also updated dependencies and fixed issues in their test suites. Moving +forward, the team plans to hold the next monthly review meeting, address a user +issue, prepare for the 0.10.0 release, and work on a dirt road fix for the +rollbacks issue with proper test coverage.

    What did the team achieve this week

    • Fixed scripts to enforce state machine continuity on-chain #777.
    • Took part in a twitter space on Scaling Cardano.
    • Joined a CBIA meeting to discuss Cardano network protocols & how to specify them.
    • Discussed potential solutions of ensuring vote uniqueness in the voting project.
    • Updated dependencies to match cardano-node master to prepare for upcoming releases and hard-forks
    • Explored adding Hydra support to kupo, a lightweight Cardano chain indexer - some more work required.
    • Improved navigation of the API Reference with a sidebar, see unstable API version.
    • Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)

    What are the goals of next week

    • Monthly review meeting (join via Discord or AddEvent) & report
    • Dirt road fix for rollbacks #784 properly covered by a test.
    • Groom and ideally address user issue #823.
    • Put the spec into the repo #693 and prepare release 0.10.0.

    · One min read
    Jared Corduan

    High level summary

    We continued to make progress on CIP-1694 and the conway ledger era. +In particular, the conway era now supports Plutus V3. +Finally, we made small improvements to the ledger API and now host +our Haskell code documentation (haddocks) on github pages.

    Low level summary

    Conway ledger era

    Haddocks hosted on github pages

    Small improvements to the API

    Technical Debt

    • [pull-3367] Fix cost model json instances.
    • [pull-3371] UMap cleanup.
    • [pull-3373] Upgrade to ghc 9.2.7 and cabal 3.10.1.
    • [pull-3375] Sadly, we had to revert the TICKF optimizations. There was a regression we do not yet understand.
    • [pull-3377] Fix cabal warnings.
    • [pull-3383] Fix multi-asset test.
    + + + + \ No newline at end of file diff --git a/page/34/index.html b/page/34/index.html new file mode 100644 index 00000000000..40e569e7dc1 --- /dev/null +++ b/page/34/index.html @@ -0,0 +1,51 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2315.0 distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures.

    Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network.

    Low level overview

    • Released the new distribution 2315.0
    • Completed the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the signed_entity table #816
      • Completed the creation of the signer table #814
      • Completed the migration/adaptation of the single_signature table #829
    • Worked on the epic that designs and implement generic signing/verification of entity services #780:
      • Completed the definition of the interface of the generic entity service for signing #847
      • Worked on the implementation of the Certifier service in the aggregator #850
      • Completed the extension of the SignedEntityType type #848
      • Completed the implementation of the Tick service in the aggregator #849
      • Worked on implementing the signable builder for the Mithril Stake Distribution #851

    · One min read
    Jordan Millar

    · One min read
    Damian Nadales

    High level summary

    This week the consensus team continued working on the improved DB lock mechanism +for UTxO-HD, and modifications to the mempool benchmarks that this prototype +requires.

    On the Genesis front we validated that the fragment size calculation in +BlockFetch is a major performance sink for ChainSync Jumping. By removing it +we will get performance that is acceptably close to that of the baseline. We +also started investigating a performance fix that does not alter the existing +baseline behavior too much. In addition we reviewed our Genesis attack vector +calculations.

    On the support front we released Consensus 0.4, and we are working on improving +our release process, to support the Cardano-wide efforts in this area. We also +performed an analysis on the number of file descriptors that consensus use. This +information can be used by the node operators to check if the number of file +descriptors they want to support are enough.

    · 3 min read
    Michael Karg
    • Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.
    • New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois.
    • Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run.
    • Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench.
    • Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.

    Benchmarking

    We have performed various cluster runs targeting the 8.0 release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile epoch-transition for local reproduction of what we observed on the benchmarking cluster.

    Furthermore, we bridged the gap between the run data from the 1.35.x releases to the the new 8.0.x release branch. This included walking the +master branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial +in locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of +benchmarks.

    Tracing

    In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still +ongoing.

    In coordination with Galois, who are developing a system assurance service by observing a number of cardano-nodes, we're working with the implementation +of data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational +burden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether cardano-tracer could be extended with a richer +feature set to that end.

    Infrastructure & Analysis

    Detailed manifest

    A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with. +These dependencies come from different package sources, have different versioning policies, and an identical package version might provide different +performance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated +by making all component bumps visible and accessible.

    GHC profiling inside workbench

    The workbench has been equipped with a new -profnix profile flavour. This enforces a -fprof-auto build for all node-related packages. The type of +profiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already +been merged to master.

    Nomad backend

    The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances. +This results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing.

    · 2 min read
    Kevin Hammond

    Incident reporting: Cardano block production temporary outage

    On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a ‘critical’ incident, thus warranting immediate response and investigation by IOG engineers. +The investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue – a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite. +Following successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version. +With the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue.

    Further Details

    You can read more details on the incident and how it was managed from SundaeSwap’s Pi Lanningham here. Thanks again to all the community for its support in identifying and fixing this bug.

    + + + + \ No newline at end of file diff --git a/page/35/index.html b/page/35/index.html new file mode 100644 index 00000000000..232b6442f5b --- /dev/null +++ b/page/35/index.html @@ -0,0 +1,49 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has submitted two papers for publication, carried +out consultancy with other teams and has an opening for an intern.

    Details

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team focused on improving the smoke test, fixing developer +tooling, and improving the API for voting use cases. They reviewed progress on +auction, payments, and voting projects and made worked on reproducing a bug with +handling rollbacks. Moving forward, the team plans to update dependencies, +implement a dirt road fix for the rollbacks bug, and explore adding Hydra +support to kupo.

    What did the team achieve this week

    • Reviewed progress on auction, payments and voting projects
    • Improved smoke tests so they can run on mainnet
    • Fixed a regression in the development environment and updated cardano-node +used in tests
    • Improved API with more configurability to unblock voting use case
      • Exclude utxo in SnapshotConfirmed outputs #808
      • Addressed a user request by only sending Greetings once #813
    • Reproduced the rollback bug by improving our model-based test suite #784

    What are the goals of next week

    • Update dependencies to match cardano-node master
    • Dirt road fix for rollbacks #784
    • Update Hydraw to maintain state locally
    • Explore adding Hydra support to kupo
    • Put disclaimer texts and closing mainnet compatibility feature #713

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team published the monthly report for March, created +separate links for different versions of documentation, and clarified potential +solutions for the Rollbacks bug. The team also discussed Query API requests for +the Hydra Voting project and met with community members to answer questions +about Hydra. Moving forward, the team plans to integrate the specification into +the repository, implement a short-term fix for the Rollbacks issue, and draft a +Query API ADR.

    What did the team achieve this week

    • Published monthly reports on website
    • Separate last released and latest versions of docs (e.g. normal released vs. /unstable)
    • Discussed Query API concerns from Hydra Voting project (link)
    • Clarified rollbacks bug and defined possible solutions (short and long term) #784
    • Met with community members to answer questions about Hydra

    What are the goals of next week

    • Finally get the docs integrated into the repository #693
    • Dirt road fix for rollbacks #784
    • Disclaimer text and detail known issues about mainnet compatibility +#713

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2313.0 distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages.

    Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to 1.35.6.

    Low level overview

    • Released the new distribution 2313.0
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the epoch_settings table #813
      • Completed the migration/adaptation of the signed-entity-type table #815
      • Completed the migration/adaptation of the certificate table #817
      • Completed the migration/adaptation of the open_message table #827
      • Completed the migration/adaptation of the signer_registration table #828
    • Completed the refactoring of the dependency injection of the aggregator #823
    • Completed the cleanup of the multi-signer of the aggregator #824
    • Completed the upgrade of the Cardano node to 1.35.6 #843

    · One min read
    Damian Nadales

    High level summary

    This week the consensus team finished the UTxO-HD prototype refactoring. We are +now working on improving the DB lock mechanism to improve performance. We also +introduced several improvements to the file system abstraction and simulation +layer (fs-sim), which culminated in the release of fs-sim-0.1.0.0 and +fs-api-0.1.0.0 to CHaP.

    On the Genesis front we distributed the updated Genesis design document, +soliciting feedback from Networking Team and IOG Researchers. We also opened up +a PR for the adversarial leader schedule QuickCheck generator, which is being +reviewed.

    On the support front, we got a new Consensus version that can use different +fundamental VRF crypto primitives for Babbage and Conway eras.

    On the tech debt front we fixed an bug in the followers logic, which was +discovered by our QuickCheck property tests.

    + + + + \ No newline at end of file diff --git a/page/36/index.html b/page/36/index.html new file mode 100644 index 00000000000..c22e1b90414 --- /dev/null +++ b/page/36/index.html @@ -0,0 +1,42 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jordan Millar

    2023-04-05 - 2023-04-19

    High level summary

    • Introduce new governance commands create, answer and verify. This allows us to have onchain polls.
    • Begin making changes in cardano-api to accomodate for CIP-1694
    • Rename TestEnableDevelopmentHardForkEras to ExperimentalHardForksEnabled and TestEnableDevelopmentNetworkProtocols to ExperimentalProtocolsEnabled
    • Various bug fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 3 min read
    Michael Karg
    • Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.
    • New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput.
    • Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged.
    • Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added.
    • Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.

    Benchmarking

    We have adapted our benchmarking cluster to the requirements of the 8.0 release branch. Testing runs of a very early feature branch for 8.0 +helped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for 8.0 soon.

    Tracing

    Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very +detailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing +the highest possible throughput of data for forwarding to cardano-tracer.

    Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions +for tunneling trace forwarding from a node to cardano-tracer via an easy to manage system service, which will match the production setup of most users.

    Infrastructure & Analysis

    General

    Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance +analysis can be fed back and serve as an additional point of comparison.

    Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations.

    Plutus library

    We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles. +This will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile. +It is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit.

    Nomad backend

    The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is +being improved to minimize any friction for the backend user.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Started looking into full-node verifier
    • cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties.
    • KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent.
    • Sidechains: Included BLS12-381 & JubJub to halo2curves
    • MuSig2: Final modifs to C version.

    Low level summary

    Mithril

    • Started designing how a full-node verifier would work. Issue comming in the next couple of weeks.

    cardano-base

    • BLS12-381 branch merged PR#266.
    • Testing strategy for BLS bindings:
      • Test-vectors for Groth16, and simple BLS signatures ready.
      • Test-vectors with different library, and created by different engineer.

    KES agent

    • Resolved issues of circular dependency
    • Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same.
    • Opened a PR for raw bearer branch in ouroboros network PR4395
    • Resolved a bug where the agent node did not properly closed connections
    • Updated version of IOSim allowed us to finish a first version of KES agent.

    Sidechains

    • Included BLS12-381 curve to our branch of halo2curves
    • Included JubJub to our branch of halo2curves

    MuSig2

    • Minor reorg PR#42
    • Started including fuzz testing for deserialisation PR#

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on final drafts of two papers +for internal review and planning next steps of analysis of consensus +design refiniments.

    Details

    • Preparing final draft of DeltaQSD algebra paper for internal review

    • Preparing final draft of verifying design refinements for +distributed system design for internal review

    • Planning next phase of consensus design refinement analysis

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra continued work on finishing mainnet compatibility. The +semi-automated smoke tests and some missing documentation is still preventing +from calling that fully done. They fixed smaller issues and made a step in the +Head protocol more robust. Besides development, they met with interested people +from the community who want to get started collaborating on communication and +marketing materials.

    What did the team achieve this week

    • Groomed and followed-up on GetUTxO user request discussion #797
    • Fixed hydra-node crashes after forks #560
    • Made collectCom more robust and aligned with spec #786
    • Completed configurable API feature #380
    • Met potential contributors about Hydra communication and marketing materials
    • Versioned documentation: we have a unstable bleeding edge version available as well now, seperate from the last released version

    What are the goals of next week

    • Follow-up backlog and roadmap clean-up
    • Complete mainnet compatibility feature #713 (documentation updates)
    • Integrate Hydra specification into repository #693
    + + + + \ No newline at end of file diff --git a/page/37/index.html b/page/37/index.html new file mode 100644 index 00000000000..4975f5fa38c --- /dev/null +++ b/page/37/index.html @@ -0,0 +1,51 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jared Corduan

    High level summary

    We are still heavily involved in work related to preparing the next release. +The other main thing we have worked on is experimentation about how we will +handle the DRep stake distribution for CIP-1694 in the conway ledger era. +Lastly, we merged a fix for +node-4826 +into our main branch (there will be a post-mortem shortly).

    Low level summary

    Support for the next release

    • pull-3363 - Fix problems relating to Arbitrary instances used by consensus.
    • pull-3361 - Remove the alonze genesis from the conway genesis.
    • pull-3360 - Translate bad pointer addresses to valid ones in conway.
    • pull-3357 - Fix a bug relating to zero valued ADA in the script context.
    • pull-3356 - Added needed instances (Arbitrary and Serialization) for conway integration.
    • pull-3345 - Added helper functions for the CLI.
    • pull-3342 - Fix a bug with a CLI helper function (having to do with deposit tracking).

    Experiments for DRep stake distribution

    Adding another stake distribution to the ledger state presents some new challenges. +We would like to be able to use the current stake distribution at the epoch boundary +for DRep voting so that people can always vote themselves in time for any proposal. +To this end, we have a prototype of an incremental computation based on the incremental +lambda calculus, together with tests and benchmarks (which are very promising). +See pull-3344.

    Additionally, more of the ledger state is going to need to be rearranged to accomodate +the new incremental computations. +We have two draft PRs up for possibles solution. +See pull-3353 and pull-3364.

    Technical debt and bug fixes

    Documentation changes

    • pull-3354 - Rename "optional datums" with "supplemental datums" in the alonzo spec.
    • pull-3352 - Add a section to the Shelly errata about the individual deposit tracking.
    • pull-3351 - Further clarify the details regarding the script integrity hash.
    • pull-3350 - Some cleanup of the Babbage spec.

    · One min read
    Martin Kourim

    High level summary

    Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.5 and 1.35.6 releases (and their predecessing release candidates) and ran tests on branch with the UTxO-HD functionality.

    Workstreams

    Framework improvements:

    • improvements in searching for unexpected error messages in log files during test run
    • added support for UTxO-HD testing
    • added support for the new P2P topology format
    • added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)
    • added preliminary support for the Conway era
    • added support for running tests on the Preview testnet

    Full list of closed PRs

    Node:

    • ran tests on node branch with the UTxO-HD functionality
    • tested the 1.35.5 release
    • tested the 1.35.6 release

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra had a team workshop and conducted the monthly review +meeting for March. They demonstrated a Hydra Head on mainnet, which was running +the hydraw demo application. While this marks an important milestone, they also +emphasized that more features are still to be added as needed for applications +to run on Hydra. Besides this, the roadmap is getting cleaned up to encourage +discussions and provide more space for user requests.

    What did the team achieve this week

    • Monthly review meeting slides/recording, full report of March next week
      • Opened a head on mainnet with hydraw demonstration
      • Hydra pay updates
    • Team workshop in Austria
      • Hydra presentation at the Cardano Foundation in Zurich
      • In-person grooming session, marked many items as candidates to be rather :idea: dicussions
      • Improved head protocol #786 and investigated a potential bug in rollback handling #784
      • Team building and retrospective

    What are the goals of next week

    • Follow-up on backlog and roadmap clean-up
    • Complete mainnet compatibility feature (documentation updates)
    • Make API more configurable #380
    • Integrate Hydra specification into repository #693

    · One min read
    Kostas Dermentzis

    High level summary

    The DBSync team worked in performance enhancements issues, on providing new db-sync options and on +technical debt and bug fixing. The DBSync team also on boarded a new member.

    Low level summary

    • Worked on an issue which causes ada_pots tables to include the values related not only to an +epoch, but also the first epoch of the last epoch. +#1367
    • Fixed an issue where the epoch table didn't rollback and caused wrong values +#1370
    • Fixed an issue were users with disable-ledger option had to provide the state dir option, even +though it was never used. Also refactored the no ledger part of the codebase. +#1378
    • Improved the perforance by using the cache more. Also provided many new options which enables or +disables parts of db-sync. In addition a new --turbo mode is enables which allows db-sync to sync +mainnet in hours. +#1379

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2310.0 distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images.

    Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano mainnet and they have fixed some bugs.

    Low level overview

    • Completed the epic that implements eras behavior switch #707:
      • Completed handling the API version switch at era transition #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed on the migration/adaptation of the stake_pool table #787
      • Worked on the migration/adaptation of the epoch_settings table #813
      • Worked on the migration/adaptation of the signed-entity-type table #815
      • Completed the creation of a stake distribution service #799
    • Completed the testing of Mithril with Cardano mainnet network #777
    • Completed qualifying the computation of the stake distribution #810
    • Completed the testing of the Docker client in the Mithril Client multi-platform test workflow #794
    • Worked on bugs and optimizations:
      • Fixed a bug that made computation of the stake distribution occur multiple times during an epoch #804
      • Fixed a bug that created deadlocks on the SQLite connection #807
      • Optimized the error message and the behavior of the signer node when KES keys have expired #820
      • Upgraded the infrastructure of the testing-preview and pre-release-preview networks #801
      • Re-genesis of the testing-preview network #803
      • Re-genesis of the pre-release-preview network #818
    + + + + \ No newline at end of file diff --git a/page/38/index.html b/page/38/index.html new file mode 100644 index 00000000000..5720d05fd23 --- /dev/null +++ b/page/38/index.html @@ -0,0 +1,53 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Damian Nadales

    High level summary

    This week the consensus team continued working on the refactoring of the UTxO HD +prototype, and design and testing of Genesis. We also extracted the fs-sim +package, which provides a file-system abstraction layer that can be used for +testing and simulation. This makes the Consensus code base smaller, while +providing a package that the community can reuse and contribute to. We also +fixed a failing property test related to iterators. We are also working on +mempool and VRF improvements.

    Low-level details

    · One min read
    Jordan Millar

    2023-03-22 - 2023-04-05

    High level summary

    • Added new cardano-cli ping command which allows users to ping remote cardano-nodes.
    • The transaction build command now can automatically balance multiassets
    • New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 3 min read
    Michael Karg
    • Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.
    • New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users.
    • Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery.
    • Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks.
    • Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing.
    • Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.

    Performance

    New tracing

    The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe +a slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use.

    GHC RTS parametrization

    We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies +on different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use.

    Open Sourcing

    Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases.

    Tracing

    For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well +as a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points +for users of the new system, depending on their wants and needs.

    Infrastructure & Analysis

    General

    Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will +increase confidence in specific metrics.

    Nomad backend

    We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis +is patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries.

    · 2 min read
    Marcin Szamotulski

    High level summary

    In the last spring we released cardano-node-1.35.6 with dynamic P2P +functionality.

    We received reports from some SPOs who encountered problems with their non +P2P block producing nodes not being able to connect to their P2P relay. Karl +Knutsson (from Cardano Foundation) reproduced this issue between two nodes (a +non P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed +it and found a bug in the legacy non p2p code. The bug is only possible to +trigger with a P2P node which is binding its outbound connection port to +a fixed IP address and port (default in p2p). A possible solution was found. +For more information see #4465.

    We released cardano-ping-0.1.0.0 package to CHaP. cardano-ping is no +longer available as a standalone binary, but instead it will become part of +cardano-cli (see #4664)

    We are testing cardano-node with peer sharing functionality (#4019).

    We are working on eclipse evasion. We added new class of peers: big ledger +peers to the outbound governor, implemented tests and fixed found issues +(#4462). We also made the information if a given peer plays the role of +a big ledger peer to the mini-protocols. This will allow to modify +mini-protocol applications for such peers. As part of this functionality we +refactored some core types in the network code which simplifies exposed API.

    Together with Moritz Angerman we started to update io-sim to ghc-9.6.1 (see +#73).

    We merged a fix of configuration of accepted connections limit in +cardano-node (see #4902).

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: RFP finished. Code ready for audit.
    • cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams.
    • KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing.
    • Sidechains: Preparing proving system to use the curves needed for main-net PoC.

    Low level summary

    Mithril

    • Merged PR#783
    • RFP for crypto audit ready.

    cardano-base

    • BLS12-381 branch approved PR#266. Blocker is Windown's CI. Working on it
    • Testing strategy for BLS bindings:
      • Preparing test-vectors for Groth16, and simple BLS signatures
      • Finding community projects to help write their use cases
      • Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)
    • Wrote blogpost on how using the same key for ed25519 and VRF completely breaks the security of both systems

    KES agent

    • Started integration of sockets interface used in consensus
    • Use that for de/ser
    • Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim
    • Results in having to parametrise for IOSim in KES and DSIGN for testing

    Sidechains

    • Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages.
    • Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS.
    • EdDSA over JubJub ready
    + + + + \ No newline at end of file diff --git a/page/39/index.html b/page/39/index.html new file mode 100644 index 00000000000..7f253fc6355 --- /dev/null +++ b/page/39/index.html @@ -0,0 +1,56 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has continued work on the mainnet compatibility of the +hydra-node. They added a golden test suite for hydra-plutus scripts, added +some detection of hydra-node misconfiguration, established a limit of 100 ADA +per commit and other smaller tasks to prepare for a mainnet beta release.

    Next week there will be a small team workshop to push for demonstrating a Hydra +Head on the Cardano mainnet, ideally just in time for the monthly review +meeting. See the hydra channels on the IOG Technical Community discord server +for details.

    What did the team achieve this week

    • Implement a 100 ADA hard-coded commit limit in the hydra-node +#763
    • Pay back funds to faucet after smoke-test run +#773
    • Setup custom github runner for smoke-tests on mainnet +#775
    • Created golden tests to assure the script hash stays the same between +changes #772
    • Removed hardcoded error codes in plutus scripts +#768
    • Detect misconfiguration of a hydra-node given persistent state +#767
    • Met with potential users for hydra-pay
    • Prepared hydra workshop

    What are the goals of next week

    • Hydra monthly meeting
    • Open a multi-party head on mainnet
    • Complete mainnet compatibility feature

    · 2 min read
    Jared Corduan

    High level summary

    We made further progress on the conway ledger era. +In particular, we expanded the ledger API significantly, including lots of governance features. +We also made progress on the specification and corresponding work in the Haskell implementation.

    We also continued to integrate the latest ledger packages into cardano node and addressed +technical debt.

    Low level summary

    Expanded ledger API

    The ledger API was significantly expanded to include:

    • a lot of protocol parameter support
    • versioning support (type level ledger eras and protocol versions)
    • auxiliary data support
    • many new lenses
    • support for witnesses
    • support for conway governance

    See pull-3328.

    Conway ledger rules

    We have made progress on the formal ledger specification for the Conway era. +Moreover, the corresponding Haskell updates were also completed:

    Incremental SPO/DRep stake distribution computation

    We have a working (and correct) proof of concept for how to use the incremental lambda calculus +to maintain several of the stake distributions incrementally. +For the per-SPO distribution, this is a performance improvement. +For the (conway) per-DRep distribution, this is will allow those who have delegated their votes +to a DRep to have time to react to any votes that they disapprove of. +(Sorry, no code to share just yet, more to come.)

    Technical debt

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers +improving the deltaQ tutorial, consulting on performance design, and +the final version of the Djed paper.

    Details

    • Preparing draft of DeltaQSD algebra paper for ICE 2023

    • Successful outcome of Marlowe consultancy leading to substantial +improvement in performance

    • Preparing sections on the communication language and bisimulation +proofs for draft paper about verifying design refinements for +distributed system design

    • Camera ready version of Djed paper under preparation

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team addressed issues with committing complex UTxOs into a +Hydra Head, prepared the hydra-node to be run on mainnet (soon) and improved +the test suite of the hydra-plutus scripts. The specification is constantly +getting improved upon reviewer feedback on overleaf - this week the graphical +notation was refined to be more transaction-focused.

    What did the team achieve this week

    • Clarified bug of committing UTxOs with reference scripts to a Hydra head #737
    • Prepare usage of hydra-node on mainnet by updating command line options #715
    • Improved our mutation test suite to all expected errors #705
    • Re-opened our persistent hydraw demo head on preprod using version 0.9.0
    • Updated on-chain graphs to be more transaction-focused in the specification

    What are the goals of next week

    • Complete mainnet compatibility feature
    • Prepare the Hydra workshop
    • Address all todo’s in the Hydra specification
    • Unblock the auctions project with commit from script a solution

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano mainnet and computes the stake distribution with the optimized unreleased Cardano CLI command.

    Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup.

    Low level overview

    • Worked on the epic that implements eras behavior switch #707:
      • Completed the deployment of the era behavior switch to the test networks #752
      • Completed the enhancement of datum generation for era markers #786
      • Worked on handling the API version with an era switch #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Worked on the migration/adaptation of the stake_pool table #787
    • Completed the refactoring of errors in the signer and aggregator state machines #665
    • Worked on testing Mithril with a mainnet Cardano network #777
    • Worked on fixing bugs with the Docker client image:
      • Fixed a bug that made the Docker client container crash at startup #769
      • Fixed a bug that prevented the restoration of a snapshot with a Docker client #791
      • Worked on testing the Docker client in the Mithril Client multi-platform test workflow #794
    + + + + \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 00000000000..fa1ac49642b --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,59 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Completed the issue Light Wallet: Release mithril-client library #1311
    • Completed the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Completed the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Fix certificate hashes re-computation in aggregator #1343
    • Completed the issue Remove unstable tag in unstable release #1235
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312

    · 2 min read
    Carlos LopezDeLara

    2023-11-01 - 2023-11-14

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Improve golden tests
    • Clean-up of conway era commands

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Sebastian Nagel

    High-level summary

    The last two weeks, the Hydra team achieved several milestones. They published +the monthly report for October, providing updates on project developments. The +team delivered a presentation and workshop at the Cardano Summit, contributing +to community engagement. They implemented a \"dirt road\" solution for the +\"Ignored init tx\" notification and moved the hydra-poll example project to a +dedicated repository. Additionally, the team built a hydra-chain-observer tool +for Hydra Heads, updated the toolchain to GHC 9.6.3, and made various +improvements to tooling and code formatting. They addressed specific issues, +such as fixing the gen-hydra-keys command and resolving concerns with the +rewritten hydra-tui. The team also enhanced the hydra-cluster smoke test +suite by fetching network configurations dynamically. Lastly, they actively +reviewed pull requests and architectural decision records from the community, +including contributions from SundaeSwap. An experiment, the Hydra tally, was +completed and successfully deployed to the mainnet by the Cardano Foundation.

    What did the team achieve this week

    • Published the monthly report for +october
    • Given a presentation / workshop at the Cardano summit +#1109
    • Dirt road implementation for \"Ignored init tx\" notification +#529 (without +stateless observation)
    • Completed and moved hydra-poll example project into a +dedicated +repository
    • Built a first version of a chain observation tool for Hydra Heads +#1096
    • Switched toolchain to GHC 9.6.3 and various improvements on tooling +and code formatting +#1135#1152#1151#1154
    • Fix gen-hydra-keys command to not overwrite existing +keys #1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Fetch network configurations instead of packaging them into +hydra-cluster (smoke) test suite +#1156
    • Reviewing PRs and ADRs from the community (SundaeSwap) +#1118#1157
    • Hydra tally experiment (Cardano Foundation) deployed to mainnet

    What are the goals of next week

    • Tackle reported bugs
    • Shepherd contributed off-line mode PR to the main codeline
    • Improve chain observation tool to include more data and refactor +existing code towards more stateless observation
    • Start work on incremental decommits

    · 3 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the cardano-playground stack

    Lower level summary

    Capkgs

    Cardano-parts

    • General migration support PR for cardano-world to cardano-playground cardano-parts-pull-18
      • Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground
      • Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes
      • Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains
      • The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state
      • The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable
      • Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0
      • For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true
      • Template updates include:
        • Adds optional TF AZ declaration on ec2 resources
        • Adds a cardano node p2p dashboard to the grafana cloud stack
        • Adds a dbsync pool performance analysis query
        • Updates python distribute and delegation scripts from world for playground compatibility
        • Starts a python script lib to reduce shared code among the python scripts
        • Several justfile improvements and new recipes
      • More detail is available in the PR description
    • Update submit action script for 8.6 cardano-parts-pull-19
    • Update scripts for 8.6.0-pre cardano-parts-pull-21
      • Fixes subcommand names based on ERA_CMD
      • Adds deposits to some commands
      • Separates CC cold/hot key generation as host authorization has to occur after action is approved
      • CC voting enabled in vote job

    Cardano-playground

    • Migration PR to largely complete the network migration from cardano-world to cardano-playground: cardano-playground-pull-5
      • Adds re-spun private chain network
      • Migrates shelley-qa chain network from world
      • Justfile improvements and new recipes
      • Improve concurrent environment chain support
      • More detail is available in the PR description

    Iohk-nix

    • Migration to play: iohk-nix-pull-561
      • Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org
      • Remove deprecated cardano-lib p2p network environment
      • Update sanchonet chain with respin changes
      • Update private chain with respin changes
      • Bump private and shelley-qa chains to sanchonet equivalent conway genesis
      • Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing

    Sanchonet-demo

    · One min read
    Kostas Dermentzis

    High level summary

    We have created new tag sancho-2-2-0, which integrates missing Conway feautures and some minor fix +tags sancho-2-1-0, sancho-2-0-1. +We have completed the initial implementation for the bootstrap instance objective.

    Lower level summary

    • Add a new --disable-gov flag which disabled Conway ferautures +#1558
    • Fix of the committee key size +#1544
    • Workaround a ledger issue with unregistered pools +#1542
    • Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs +#1539
    • Rename offline to offchain +#1533
    • Transfer existing tests to Conway era +#1529#1547
    + + + + \ No newline at end of file diff --git a/page/40/index.html b/page/40/index.html new file mode 100644 index 00000000000..bcfd7419218 --- /dev/null +++ b/page/40/index.html @@ -0,0 +1,68 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Damian Nadales

    High level summary

    The Consensus team continued working on refactoring and improving the UTxO-HD +prototype, and introducing improvements to the lmdb related packages. In +particular we identified an opportunity to gain performance by handling locks in +a more optimal way.

    On the Genesis front, we sketched a mitigation for an issue that PNSol and +Researchers caught. We also came op with a road map for not only testing the +Genesis prototypes, but also for enriching the tests we already have.

    Regarding technical debt, next to some minor improvements, we created +component-level micro-benchmarks for adding transactions to the mempool. The +results of these benchmarks will be published in the ouroboros-consensus web +page.

    We also finished moving the Consensus documentation to the ouroboros-consensus +repository, released ouroboros-consensus 0.3.0.0, and reduced the time +GitHub actions take in ouroboros-network.

    Workstreams

    UTxO HD Prototype

    We continued working on refactoring and improving the UTxO-HD prototype. As a +result of the first round of sytem-level benchmarks, we identified an +opportunity to optimise the way we handle locks to improve performance +(#4393).

    Also, we introduced several improvements to the lmdb related packages:

    Genesis

    We sketched out a mitigation of the issue that PNSol and Researchers caught in +the Genesis design.

    We came up with a road map for testing the Genesis prototypes, including early +milestones that are applicable to today's master branch, ie tests that are +useful before Genesis, and that will be nicely enriched when we do add Genesis.

    We developed the aforementioned tests, specifically a QuickCheck generator for +the Honest leader schedule and one as-aggressive-as-possible Adversarial +leader schedule that together satisfy the Praos properties that the Consensus +design takes as invariants.

    We investigated why the improved ChainDB queueing implementation behaves +differently in the baseline compared to the prototype, and we are close to +having a full picture of how the Consensus components interact during bulk sync.

    Technical debt

    We created component-level micro-benchmarks for adding transactions +to the mempool. We plan on extending this to more mempool actions and different +types of blocks. We store the benchmark data to make it available +to the GitHub action that publishes the benchmarks results.

    Other minor improvements include:

    • Removal of Test.Util.Classify in favour of Test.StateMachine.Labelling.
    • Addition of -Wunused-packages to the default ghc-options for Consensus +packages.

    Fostering collaboration

    We finished moving the Consensus documentation from +ouroboros-network to ouroboros-consensus, in preparation for +migrating the code to the latter repository.

    Support

    We released ouroboros-consensus 0.3.0.0.

    We reduced the load in the ouroboros-network GitHub actions, +thereby reducing the time CI jobs take.

    · One min read
    Jordan Millar

    · 2 min read
    Michael Karg
    • Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.
    • New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users.
    • Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination.
    • Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation.
    • Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.

    Performance

    1.35.6 release

    Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health.

    Analysis pipeline

    Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better +differentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance. +Additionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking +data more easily accessible.

    Open Sourcing

    As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable +third parties to make use of that data much more easily, by having reliable guidelines and a working example.

    Tracing

    The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make +the switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process.

    Infrastructure

    Nomad backend

    The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit.
    • cardano-base: BLS branch is now ready for review. We are workign forward its merge.
    • KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase.
    • Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs

    Low level summary

    Mithril

    • Bumped to version 0.2.0 the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using mlock.
    • Opened PR#783 to update dependency
    • Improved testing for batch opening of mtree, PR#773
    • Improved testing for batch verification of STM sigs PR#774
    • RFP for crypto audit almost ready.

    cardano-base

    • BLS12-381 branch finally ready for review PR#266

    KES agent

    Team off for one week. Other progress:

    • Learning about raw direct-bearer abstraction. An interface for sockets in consensus.
    • use that for direct ser/deser
    • written those syntaxes for ouroboros (coming PR)
    • the kes agent will depend on that.

    Sidechains

    Progress with familiarisation of Halo2 library to write circuits.

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, improving the deltaQ tutorial, consulting on +performance design, and the Djed paper has been accepted for +publication.

    Details

    • Preparing draft of DeltaQSD algebra paper for FORTE 2023

    • Extending the technical report on which the above paper is based

    • Consulting with an external company on performance engineering of Plutus contracts

    • Planning improvements and collecting material for the deltaQ +tutorial based on experience with systems that manage risk at +multiple timescales

    • Preparing sections on the communication language and idempontency +laws for draft paper about verifying design refinements for +distributed system design

    • Studying Cardano chain sync protocol

    • "Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin +Protocol" has been accepted for publication at IEEE ICBC 2023

    + + + + \ No newline at end of file diff --git a/page/41/index.html b/page/41/index.html new file mode 100644 index 00000000000..9a621c37fad --- /dev/null +++ b/page/41/index.html @@ -0,0 +1,77 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team released version +0.9.0 - a version +of the hydra-node with fully specified behavior of on-chain scripts and +off-chain head-logic, decreased costs for opening/closing a Head and scalable +contestation deadline semantics. Check out the full release notes for details.

    Furthermore, they published the monthly +report of the Hydra project +and conducted a review meeting with an increasingly wider audience. The team +plans to extend invitations through the new Hydra +#announcements discord channel for the next +months, stay tuned!

    What did the team achieve this week

    • Monthly review meeting with report published on website
    • Fixed smoke tests #726
    • Reduced the cost of opening/closing a Head (error codes #748 + head reference script #701)
    • Released version 0.9.0
    • Conducted a first experiment on mainnet compatibility #713
    • New discord category with #announcements channel
    • Received a demo about the Hydra for Voting project
    • Lightning talk on mutation-based testing (to be shared)
    • New themes view in on our roadmap and some rearranging as we align it with high-level objectives
    • Clarified things with researchers, but mostly identified action items for them

    What are the goals of next week

    • Redraw transaction graphs and address TODOs specification
    • Run hydraw with 0.9.0 on preprod
    • Make smoke tests on mainnet possible
    • Groom the explorer item
    • Unblock the auctions projecth with commit from script a solution

    · 2 min read
    Jared Corduan

    High level summary

    We have focused the last two weeks on CIP-1694, integration of the last several months of ledger +work into consensus and node, and testing infrastrutcture that we will use in the conway ledger era.

    Low level summary

    Conway rules

    We made a major update to the conway era so that the implementation is now in sync with the spec +with respect to the ratification and enactment logic.

    See the notes in pull-3291 for more details.

    Constraint based generators

    This week we hit a major milestone in our efforts to build out better property based testing +support for the main ledger properties. +The new constraint based generators can now generate full ledger states with what is probably +very close to the real constraints (if anything, it is under constrained). +Next we will work on generating a transaction in the context of a ledger state, which would allow +us to actually start using these generators for real tests.

    See pull-3219.

    Preparing a release, now with proper versioning

    After quite some time, we are ready to release a version of ledger that will work with a new +version of consensus, using CHaPs.

    See pull-3308.

    Technical debt

    • We cleaned up the redeemer serialization code (to prevent future mistakes). See pull-3269.
    • We added a note to the Alonzo spec, specifying that the transaction inputs are +lexicographically ordered in the Plutus script context. See pull-3306.
    • We fixed a problem with the address deserialiazation +(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway). +See pull-3307.
    • We fixed a problem with our nix build. See pull-3311.
    • We fixed a problem with our NoThunks tests. See pull-3310.
    • We improved our nightly tests. See pull-3316.

    · 2 min read
    Marcin Szamotulski

    High level summary

    In the current sprint the networking team focused on fixing bugs and pushing +forward implementation of eclipse evasion. We also found a bug in our +simulation testing setup (in integration of test node). We also overviewed the +work on extending handshake protocol which is delivered by Galois Inc.

    We published ouroboros-network-0.4.0.1 and +ouroboros-network-protocols-0.3.0.0 to CHaP.

    We also fixed a bug in cardano-node which results in not being able to +configure inbound connection limits, see PR #4902.

    Together with Karl Knutsson (CF) we realised an issue in cardano-cli: it's +validation of DNS names, IP address & ports when registering a stake pool +should be more strict to protect against common mistakes which we identified on +the chain. See issue #4929.

    Detailed work log

    In PR #4385 we fixed two bugs in peer state actions. First one results in +a busy loop if demotion from hot to warm times outs. This busy loop is +eventually exited when mux exits (we reported this in our previous report). +This fix made it to 1.35.6 release as well.

    In addition the PR #4385 also fixes another bug which results in hot -> warm +-> hot demotion / promotion busy loop.

    The PR #4385 also fixed a bug in a node only used in simulation which +resulted in not using chain-sync or block-fetch mini-protocols. In the +review process, we realised that the header-body split in the simulated node +requires further work (see PR #4419, which is under review).

    The PR #4385 also extend our generators, which together with the above fix, +cover the hot -> warm -> hot demotion / promotion busy loop.

    In PR #4419 we introduce a ChainDB for our simulation node, which plays +similar role to ChainDB in the ouroboros-consensus: a persistent (across +simulated restarts) store of blocks which does chain selection. This ensures +that the simulated node is using block-fetch to download blocks announced by +chain-sync mini-protocol.

    We also made progress with reviewing PR #4019 - peer sharing.

    We also fixed issue #4370 - a connection manager test failure, see PR #4384.

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team continue closing many gaps and aligning the +implementation with the specification. More over, they have groomed a plan to +make Hydra Mainnet compatible. Also, they continue moving forward with the +internal auditing and have published some auditing guidelines to receive +contributions from the community.

    What did the team achieve this week

    • Completed #452 (what is +remaining in there)
    • Aligned the Head protocol logic implementation with the specification
    • Completed full minting policy implementation and spec +#720
    • Clarified message authentication with researchers
    • Groomed what is left to do for Mainnet compatibility +#713 and drafted a +0.10.0 version
    • Added a tutorial by @perturbing to the +website LINK
    • Published auditing guidelines +LINK
    • Made hydra-node work for macos +#746 and added support +for building on aarch64 +#673
    • Met with a potential customer of Hydra for Payments

    What are the goals of next week

    • Have the monthly review meeting incl. the report
    • Have smoke tests fixed and running regularly
    • Release 0.9.0 with updated scripts
    • Redraw transaction graphs for specification

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2306.0 distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes’ CLI that allows generating and signing an era marker’s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI.

    Low level overview

    • Released the new distribution 2306.0
    • Completed the epic that implements signer versions deployment monitoring #718:
      • Completed the implementation an event producer/consumer via channel #738
      • Completed the creation of a database and its configuration to save the events on the consumer side #740
      • Completed the creation of events and sending them on the channel on the producer side #741
      • Completed the creation of the signer registration event #742
      • Completed the creation a query to extract the node versions stakes distribution #743
    • Worked on the epic that implements eras behavior switch #707:
      • Completed the loading of era reader adapters from config in the signer and the aggregator #732
      • Completed the implementation of an era cli command in the aggregator #755
      • Completed the implementation of a dynamic matrix of cases in CI end to end tests #760
    • Fixed some bugs:
      • Fixed the unsupported unixepoch() function #757
      • Fixed the problem that prevented some signers from signing on the testing-preview network #730
      • Update SQLite version to 3.40 in aggregator infrastructure #765
    + + + + \ No newline at end of file diff --git a/page/42/index.html b/page/42/index.html new file mode 100644 index 00000000000..ec2c82f20ca --- /dev/null +++ b/page/42/index.html @@ -0,0 +1,70 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Michael Karg
    • SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.
    • Release benchmarking: we performed a round of benchmarks for the 1.35.6 release.
    • UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup.
    • New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities.
    • Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure.
    • Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.

    Performance

    SECP

    1. For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead.
    2. The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run.
    3. The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking.

    UTxO-HD

    1. After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop.
    2. We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.

    1.35.6 release

    Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health.

    Tracing

    Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible.

    Infrastructure

    Nomad backend

    1. Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients.
    2. Locality assumptions were removed and job monitoring was refactored.
    3. To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster.
    4. We're currently evaluating different options for genesis distribution in said cluster.

    NixOps backend

    The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery.

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks we got the results from the system level benchmarks +for UTxO HD. They showed a substantial performance regression, so we spent some +time analyzing the results. We found out the frequency at which ledger snapshots +were taken was too high, so we requested the benchmarking team a new run with a +more realistic snapshotting policy. We continued refactoring and improving the +prototype, and we released UTxO-HD related packages to CHaP.

    We met with IOG researchers and networking specialists to discuss the Genesis +design, which was well received. We continued working on testing and +benchmarking different Genesis prototypes.

    We are also working on solving a test failure related to iterators. This work +derived in several improvements such as better documentation, a framework for +writing unit (and regression) tests, and the possibility of debugging +QuickCheck counter examples in the REPL.

    Finally, we released ouroboros-consensus 0.2.0.0 and +ouroboros-consensus-cardano 0.3.0.0 to CHaP

    Workstreams

    UTxO HD Prototype

    We got the results of the first system level benchmarks for UTxO HD. They seemed +to indicate a significant regression in performance. After looking into the +benchmark logs we found that the benchmark runs took ledger state snapshots too +often, due to the default snapshotting policy depending on k, and k being so +small in the benchmark runs. Therefore, the next step is to re-run the +benchmarks with a snapshotting policy that more closely resembles the one from +mainnet.

    At the same time, we continued refactoring and cleaning up the prototype.

    Also, we prepared the anti-diff packages (fingertree-rm, diff-containers, +simple-semigroupoids) and the lmdb related packages (cardano-lmdb and +cardano-lmdb-simple) to CHaP.

    Genesis

    The Genesis design was presented to the IOG researchers and Peter Thompson from +NSol. It was well received. They pointed out one blindspot, but we think it'll +be relatively simple to mitigate.

    In parallel, we continued developing test and benchmarks for the Genesis +prototypes. I particular we tested and implemented a potential fix for +increased ChainDB dequeue timings, which partly +behaved as we expected, but still needs further investigation. Also we obtained +new benchmarking data for the prototype.

    Technical debt

    Related to #4183, we developed a DSL for specifying +ChainDB unit tests. This will allow us to better understand the +counter-examples returned by QuickCheck tests, and to write regression +tests for them. Also, we added a module to enable +QuickCheck counter-examples to be run on the REPL, allowing for faster debugging +feedback. Also, we improved the documentation related to followers +(#4372).

    We are also working on a design for optimizing the way we handle blocks from the +future.

    Support

    We released ouroboros-consensus 0.2.0.0 and ouroboros-consensus-cardano +0.3.0.0 to CHaP. Remember that we decided to split the packages related to +Consensus into two bundles, one with the core functionality, Cardano-agnostic +code, and another bundle with instantiations specific to Cardano.

    · 2 min read
    Jordan Millar

    2023-02-22 - 2023-03-07

    High level summary

    General bug fixes

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    Documentation

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · One min read
    Kostas Dermentzis

    High level summary

    The db-sync team created a new tag 13.1.0.2 which is ready to release. +We also investigated and had the first working UTxO-HD integration which is one +of the potential future risks for db-sync.

    Low level summary

    • Integrated the UTxO-HD feauture branch in kderme/utxo-hd-1. This doesn't +use the full on disk storage but keeps things in memory and the plan is to keep +it this way for the first iteration. The integration still has some performance +issues which we investigate
    • Created tag 13.1.0.2 which upgrades the dependencies of db-sync
    • Fixed an issue related to errors appearing in SMASH +#1353
    • Continued with ghc-9.2 integration +#1339
    • Worked on an new fixing procedure for +#1348. +We try to make these procedures work also on older schema version, without the +need to migrate to newer schema, which can be very useful for fixing existing +snapshots.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration.
    • cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: started implementation in rust.

    Low level summary

    Mithril

    • Transmute helpers merged PR#722
    • We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope.
    • We are working in a modification of KES to require caller to allocate the secret key buffer.
    • Proposed a solution for signer registration of Mithril.

    cardano-base

    • Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 proof.
      • Results are promising, with using only 23% of the execution budget to verify a realistic proof.
      • Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril.
    • KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this.
    • Conversion finally merged PR#344.

    KES agent

    • Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation
    • Figuring out how to go from fake file descriptor to write the raw bytes

    MuSig2

    • Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.
    + + + + \ No newline at end of file diff --git a/page/43/index.html b/page/43/index.html new file mode 100644 index 00000000000..eb888a511d5 --- /dev/null +++ b/page/43/index.html @@ -0,0 +1,73 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, distributivity properties of deltaQ, and consulting +on performance design with the Marlowe team.

    Details

    • Processing reviews on performance engineering paper and planning +paper revisions accordingly

    • Investigating distributivity properties of DeltaQ

    • Preparing sections on the thorn calculus and idempotency laws for +draft paper about verifying design refinements for distributed +system design

    • Consulting on performance design with Marlowe team

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team completed work on dealing differently with contests +during the contestation period. These will now always push out the deadline and +hence contestation periods are easier to pick (depending on the network a Head +runs on). Furthermore, they added an important acceptance test and completed +internal refactoring of the protocol logic making future changes easier.

    What did the team achieve this week

    • Push contestation deadline on each contest #716
    • Wrote an acceptance (property) test can always close/fanout when collect is successful
    • Internal refactoring of our HeadLogic
    • Groomed remaining things from #452 into dedicated features

    What are the goals of next week

    • Complete full minting policy #720
    • Release 0.9.0 with updated scripts
    • Plan mainnet milestone and a 0.10.0 version
    • Redraw transaction graphs for specification (upon feedback)
    • Have smoke tests fixed and running regularly

    · 3 min read
    Jared Corduan

    High level summary

    This past two weeks saw many months worth of ledger changes integrated with the cardano-base +and ouroboros-network repositories. +The vast majority of the effort involved all the changes to the ledger serialization libraries +(and the interplay with cardano-base) which now support proper versioning. +Supporting the conway ledger era, and in particular allowing the ledger state to transition +to a whole new system of governance, also played a noticeable part in the integration.

    Besides the integration work, the team continues to address technical debt, improve the +documentation, make our testing infrastructure better (such as experimenting with better +nightly tests), and formally specifying more parts of CIP-1694.

    Lower level summary

    Integration work

    Below is all the integration work completed, which will enable a release to node from +the current ledger master. Many thanks to +Alexey for this colossal undertaking!

    Technical debt

    Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted +in the CBOR specification. See pull-3241.

    We now have our .cabal files being checked for a consistent formatting given by +cabal format in our CI. See pull-3286.

    We are still experimenting with better nightly tests for our long running +property based tests. See pull-3276 and pull-3296.

    Small documentation improvements

    The hand proofs of the preservation ADA property have been added back to the +Shelley ledger specification. See pull-3295.

    We have clarified how the script integrity hash is computed in the CDDL description. +See pull-3290.

    Specifying CIP-1694

    Our new formal specifications backed by Agda have seen a lot of progress! +Upgrading to Agda 2.6.3 fixed our main build infrastructure problems, +and we no longer have to rely on our custom fork. See pull-50.

    Our progress on formally specifying CIP-1694 can be followed here:

    Constraint based testing

    We are still actively working on our new constraint based property testing framework. +We have nearly all of the constraints for an entire ledger state +hooked into generators, and tests that the generators do indeed obey the constraints. +The variable count in the constraints is over 100! +There is still much work to do on shrinking, making the generators faster, +and writing actual property tests for the ledger, but the approach still seems viable and +we are hopeful that it could replace our trace generators. +The WIP can be followed here: pull-3219.

    · One min read
    Marcin Szamotulski

    High level summary

    Recently QA found a bug in P2P code, which results in busy loops. We added one +fix to 1.35.6 release, another one will likely be part of next release. The +first one is already included in ouroboros-network-0.3.0.1 release. These +bugs could only affect nodes which are out of sync and thus should not impose +risk on well maintained nodes on mainnet. We also advertise to deploy at most +one of the relays as a P2P node, which shields from possible consequences.

    We recently finished design phase of eclipse evasion and we started +implementing it (see issue #3886 for progress).

    Galois finished implementing Handshake extension which will allow to query +network protocol versions (see pr #4256).

    We also recently released a newer set of network packages to be integrated with +cardano-node master branch, this includes:

    * monoidal-synchronisation-0.1.0.2
    * cardano-client-0.1.0.2
    * network-mux-0.3.0.0
    * ouroboros-network-api-0.1.0.0
    * ouroboros-network-protocols-0.2.0.0
    * ouroboros-network-testing-0.2.0.1
    * ouroboros-network-mock-0.1.0.0
    * ouroboros-network-framework-0.3.0.0
    * ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included
    in `0.3.0.1`)

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team closed several gaps to align the Hydra scripts +implementation further with the specification. This also resulted in a slight +improvement on Hydra script size and costs. They consequently analysed the +asymptotic complexity of collect and fanout and how they relate. Also plutus-tx +profiling toolchain was evaluated and set up for future improvements on Hydra +on-chain performance. In discussions with researchers and internal auditors, +they also uncovered next steps on further securing the Head protocl using a +"full" minting policy.

    What did the team achieve this week

    • Closed several gaps to align script implementation with specification #452
      • Allow contest only once #680
      • Optimization through head output at index 0 #700
      • Value is preserved #702 + optimized exact value equality #709
    • Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to #721
    • Fixed our tooling around the Haskell language server
    • Discussed full minting policy with researchers
    • Started grooming “what we need for mainnet” on this idea ticket and milestone

    What are the goals of next week

    • Implement full minting policy
    • All remaining protocol discrepancies are implemented or groomed as individual features
    • Ideally release 0.9.0 with updated scripts
    • Discuss what we need for mainnet (milestone planning)
    • Redraw transaction graphs for specification (upon feedback)
    + + + + \ No newline at end of file diff --git a/page/44/index.html b/page/44/index.html new file mode 100644 index 00000000000..63916a6eb46 --- /dev/null +++ b/page/44/index.html @@ -0,0 +1,42 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2304.1 distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store.

    Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version 1.35.5 on their devnet and infrastructure.

    Low level overview

    • Released the new distribution 2304.1
    • Fixed a bug that prevented some signers to sign with 2304.0-prerelease #716
    • Completed the implementation of an EraChecker that checks if an era is active #708
    • Completed the implementation of an EraReader that gathers era activation data #709
    • Completed the implementation of an EraReader adapter with on chain transaction as source #710
    • Completed the relational design of the aggregator store #476
    • Completed adding a new SPO on the testing-preview network #729
    • Completed the upgrade of the Cardano node to 1.35.5 #725
    • Fixed flakiness in the CI #734

    · 2 min read
    Damian Nadales

    High level summary

    We continue refactoring the UTxO HD prototype while we wait for the system level +benchmarks. We have created a new repository that contains the anti-diff +packages used in this prototype.

    On the Genesis front, we are preparing another meeting with the researchers to +audit the implementation design, and we continued working on basic tests and +simplifications.

    During the past two weeks we also introduced two new tools. One for dumping CBOR +encoded blocks to JSON, and another to serve a local immutable DB.

    Workstreams

    UTxO HD Prototype

    We are in the process of refactoring the UTxO HD prototype, while we wait for +the system level benchmarks to confirm if the performance of the prototype is +satisfactory.

    We also set up a repository for the anti-diff package, which +required us to refactor the code, write documentation, and prepare a release to +CHaP.

    Genesis

    We worked on basic tests for the Limit on Eagerness property of +Genesis. We also introduced further robustness and simplifications in the +Genesis Density governor. Finally, we developed a presentation to engage again +with the researchers on our Genesis implementation design.

    Technical debt

    Fostering collaboration

    We are in the process of polishing the ouroboros-consensus +documentation site, which we will use a the entry point for Consensus related +documentation. The first version will not be complete, but we plan on +systematically improving it.

    Support

    We added a tool to ouroboros-consensus-cardano-tools which allows +to dump the Chain DB blocks or any given CBOR encoded blocks as JSON.

    We also added another tool that serves an existing immutable DB via +BlockFetch and ChainSync. This tool can help in assisting our local benchmarking +efforts (for instance Genesis' ChainSync jumping prototype).

    · 2 min read
    Jordan Millar

    · 3 min read
    Serge Kosyrev

    High level summary

    1. SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions.
    2. Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks.
    3. New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node.
    4. New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide.
    5. Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live.
    6. Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on.
    7. Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.

    Performance

    We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:

    • we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,
    • after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,
    • finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.

    In addition, we started benchmarks of the 1.35.6 release.

    Tracing

    A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way.

    Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting.

    Infrastructure

    On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders.

    The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment.

    The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops.

    · 3 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril.
    • cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.

    Low level summary

    Mithril

    • Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing PR#722
    • We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper.
    • We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.

    cardano-base

    • There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381.
    • The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner.
    • The update VRF PR#341 is finally merged, and we are ready to merge PR#344, which implements conversion functions from the compatible types between Praos and PraosBatchCompat.

    KES agent

    • Use of snockets to send the data directly from the socket to secure memory.
    • We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives
    • Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.

    MuSig2

    The GitHub Action linelint is used to check the files.

    • A new job for linting is added to the file /.github/workflows/ci.yml. The rules are configured in the file /.github/workflows/.linelint.yml. Some files from the configuration of libsecp were failing, so in the rules in .linelint.yml the failing files are denoted to be ignored by the linter.
    • Folders are reorganized. We created a folder to handle the example. This folder includes the examplemusig2.c, a distinct config.h, and helper.c. The example is enhanced by implementing the functions in the helper for the configuration given in config.h. The number of messages is different than the tests. The example is made more generic to run with a loop.
    + + + + \ No newline at end of file diff --git a/page/45/index.html b/page/45/index.html new file mode 100644 index 00000000000..0619f21babf --- /dev/null +++ b/page/45/index.html @@ -0,0 +1,56 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been preparing several papers for peer review +and knowledge sharing and consulting within IO and the community.

    Details

    • R&D Seminar on experience participating in a member based organisation
    • Full day tutorial on performance engineering presented at HiPEAC +2023 conference
    • Finished preparing and submitted a paper on performance engineering +to an ACM workshop
    • Preparing a draft paper for future submission about verifying design +refinements for distributed system design
    • Consulting on performance design of other IO projects

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team completed the Hydra specification with a section about +rollbacks and updated graphs +(#448). In a next step, +the specification will be made more approachable and an open standard. They +improved their hydra-cluster tool to launch a local --devnet sandbox +environment and continued aligning the hydra-plutus scripts with the +specification by hardening the checks on close and contest transactions.

    What did the team achieve this week

    • Completed the specification with a section about rollbacks and updated graphs +#448, with a follow-up on making it more approachable and an open standard.
    • Continued spec review with internal auditor and incorporated changes.
    • Talked to TxPipe about how Demeter and Hydra could work together
    • The hydra-cluster executable can be used to launch a local --devnet sandbox environment.
    • Reproduced the “head being stuck on network outage” bug
      • relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed.
    • Progressed with higher velocity by addressing more and more gaps #677

    What are the goals of next week

    • Upstream our JSON instances to the ledger
    • Close all transaction security related on-chain gaps
    • Ideally release 0.9.0 with updated scripts
    • Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap

    · 2 min read
    Jared Corduan

    High level summary

    Much of the work the past two weeks involved integration efforts, +cleaning up and debugging some serialization issues, +adding tests, and work on large projects that are still ongoing. +We also released a CIP this week that aims to make the ledger +a registered CIP category.

    Lower level summary

    Ledger evolution CIP

    We published a +CIP +that will make the Cardano ledger a registered category of the CIP process.

    Serialization issues

    We had previously thought that we had found a serialization problem with the redeemers, +but it turned out to just be particularly confusing code. +We have now clarified the issue for the future.

    See pull-3263, pull-3269, and pull-3268.

    Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps.

    See pull-3277.

    New tests

    We added a new property test suite for some of our custom containers.

    See pull-3270.

    Progress on a better cost model serialization situation.

    We are still working our way through issue-2902. +Towards this end, we are now properly gating the new flexible encoders +until version 9.

    See pull-3274.

    Nightly tests

    We are still experimenting with moving more CI actions to GitHub actions.

    See pull-3276.

    Constraint based generators

    We continue to add to our proof of concept for constraint based generators. +See the previous ledger update for more information about this project.

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team had a monthly review meeting with their stakeholders, +contributors and interested people from the community. The monthly repot for +January 2023 is a digest +of the things presented and also includes a summary of the meeting. The Hydra +specification was getting discussed and the team is incorporating suggested +changes of reviewers. Last but not least, they compute and publish script +information on every PR and also on the +website +now.

    What did the team achieve this week

    • Had the monthly review meeting with a broader audience
    • Published the monthly report for January 2023
    • Reviewed the spec and discussed individual aborts with researchers
    • Compute and publish script information along benchmarks on every PR and website

    What are the goals of next week

    • Add rollback section to Hydra spec, update pictures and publish it as part of repository
    • Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository.
    • Groom & plan actions required for a maintainable Head explorer + break down align gaps feature.

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2302.0 distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes.

    Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node.

    Low level overview

    • Released the new distribution 2302.0
    • Implemented a backward/forward compatibility mechanism for API messages #688:
      • Implement the mechanism for the signer registration #689
      • Implement the mechanism for the signature registration #693
      • Implement the mechanism for epoch settings #695
      • Implement the mechanism for certificate pending #696
      • Implement the mechanism for certificate #697
      • Implement the mechanism for snapshots list #698
      • Implement the mechanism for snapshot #699
      • Update enforcement of API version with Semver #705
    • Completed the PoC implementation of backward compatibility with protobuf #677
    • Completed the PoC implementation of backward compatibility with avro #678
    • Completed the PoC to Read/Write transaction on chain for Era activations #672
    • Completed the upgrade Cardano devnet to 1.35.4 #523
    + + + + \ No newline at end of file diff --git a/page/46/index.html b/page/46/index.html new file mode 100644 index 00000000000..c318e5f322c --- /dev/null +++ b/page/46/index.html @@ -0,0 +1,70 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks, the consensus team finished the testing activities +around the UTxO-HD prototype. This is a very important milestone which will +enable us to run system-level tests and benchmarks, as well as start refactoring +and cleaning the prototype. Regarding our Genesis workstream, we elaborated a +roadmap that gives an indication of the remaining work. We also continued our +work on benchmarking chain-sync-jumping. We also continued working on improving +the way we handle blocks from the future, and advancing the integration of the +new VRF and KES crypto.

    Workstreams

    UTxO HD Prototype

    As the prototype is nearing its completion, it was important to have enough +confidence that we will be able to move additional parts of the ledger state +onto disk. We worked together with the Ledger team to elaborate a +sketch on how the UTxO-HD design would accommodate the migration of +additional data from memory to disk. This gave us enough confidence that the +current architecture will be extensible in the future.

    On the testing front, we added property-based tests for the UTxO-HD +type classes.

    We also enabled disabled components, and addressed several +technical debt issues:

    • Implement splitSized anti-diff split (#4269), and integrate it +into consensus (#4273).
    • Renaming of peekVal to peekMDBVal (#7).

    We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We +found a race condition in the LMDB backing store, which we fixed. +After the fix we were able to successfully run these benchmarks. The results +were published by this pull request.

    We used our db-analyser tool to benchmark the cost of reading keys and +flushing values to disk. The following plot shows the duration of these disk +operation in relation to the main ledger operations, where we can see that the +cost of the former are comparatively low. The spike at the beginning of the +graph is when, at the start of the Shelley era, the entire UTxO set is flushed +to disk.

    UTxO-HD read and flush benchmarks

    After months of hard work adding tests for the prototype, we are ready to run +end-to-end tests on the node, and system level benchmarks. This signals a very +important milestone for the UTxO-HD workstream 🎉.

    Genesis

    We elaborated a high-level decomposition of the remaining +work for Genesis. We also continued benchmarking the chain-sync-jumping +happy-path.

    Technical debt

    We continued working on improving the way we handle blocks from the future.

    Support

    We completed the mapping of Crypto to HeaderCrypto and body Crypto. +HeaderCrypto is moved to cardano-protocol-tpraos. We created a draft pull +request to facilitate compiling consensus.

    · 2 min read
    Jordan Millar

    2023-01-25 - 2023-02-07

    High level summary

    General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the cardano-cli query stake-snapshot command.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We explored whether some uses of transmute could be removed, but it resulted in considerable regression.
    • cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision.
    • KES agent: An inconsistency between contra-tracer available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the contra-tracer used by consensus.

    Low level summary

    Mithril

    • We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average PR#675. We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing.
    • We are writing a RFP for the audit of the core library.

    cardano-base

    • A problem with Nix is blocking merge of PR#341
    • Plutus team ran benchmarks of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution.
    • Team is fully digesting the Plonk paper.
    • There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used.

    KES agent

    • A little unforseen delay has been caused by a mismatch in the use of contra-tracer. The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are doing the change, but still the CI is not happy.
    • The same was needed for the KES agents prerequisites PR#317.
    • We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1 +specification. Of which a first version has been aggregated and is currently +under review. They aligned the on-chain scripts of reimbursing funds on abort +like defined in the specification, improved the mutation test framework to have +more control when testing plutus scripts. The added HeadId in the API and the +TUI example client make hydra-node easier to use and a first experiment of a +Hydra Head explorer was showing the utility of this - see what Heads exist on +the preview network here.

    What did the team achieve this week

    • HeadId to API and display in the TUI #678
    • Experiment of creating a hydra explorer, first result hosted here
    • Improved mutation framework allowing to fail for the right reason #679
    • Correctly reimburse funds in abort (matching the spec) #670
    • Finished a first write-up of the Hydra HeadV1 spec: Read it on overleaf (Communication channels for feedback)

    What are the goals of next week

    • Monthly review meeting with a broader audience
    • Groom & plan actions required for a maintainable Head explorer
    • Break “align gaps” feature into smaller chunks (at least on- /off-chain) and groom it
    • Review the spec & discuss individual aborts with researchers (a bigger open question)

    · 2 min read
    Marcin Szamotulski

    High level summary

    We have been working towards cardano-node-1.35.5 release. QA & benchmarking +teams gave a green light for the release, and we made decent progress with some +CI problem which we encountered on the way (PR #4612). We are also working on +peer sharing, making improvements in our testing infrastructure, reducing +technical debt and making progress towards io-sim-1.0.0.0. Galois is making +progress on Handshake improvements.

    Low level summary

    Our diffusion simulation network now includes a mixed network of initiator +only and initiator and responder nodes. issue #4222

    We are now reviewing the peer sharing pull request.

    We are also reviewing pull request which introduces handshake query flag. PR #4256

    We fixed a bug in our network simulator. The bug was triggered when a node +died when performing a simultaneous TCP open (a corner case of a corner case!). PR #4265

    We also refactored Snocket interface and removed the bearer construction from +its methods. PR #4260

    We are working towards releasing io-sim-1.0.0.0 on Hackage, which includes +reviewing two PRs: PR #57 and PR #60 as well as writing an announcement +blog post.

    + + + + \ No newline at end of file diff --git a/page/47/index.html b/page/47/index.html new file mode 100644 index 00000000000..aac3d4a982d --- /dev/null +++ b/page/47/index.html @@ -0,0 +1,69 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Michael Fellinger

    High level summary

    The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing +support for cardano-world.

    Lower level summary

    Cicero

    • Fixed various race conditions around transformers.
    • Brought our CI up to date.
    • Migrated to the Nomad exec driver with Nix support for many actions.
    • Moved Nix builds to the Nomad clients for much better cache locality.
    • Ongoing work on vastly improving the action matching and evaluation speed.

    Tullia

    • Made it easier to support cloning from a PR's fork
    • Update to latest std
    • Add workaround for cgroup issue: nomad#12877
    • github preset: add github.ci.remote and (read|get)Repository functions
    • Fix various issues around CUE handling

    Bitte

    • Upgrade to NixOS 22.11
    • Prototype usage of Colmena for deploys instead of deploy-rs
    • Finalized work on Equinix Metal support
    • Prototype better secrets management with ragenix instead of sops-nix
    • Improve CI and bring it up to date

    cardano-world

    • Fixd various OOM issues on preview and preprod
    • Rotated KES keys on preview and preprod
    • Optimize mainnet db-sync to cope with higher load
    • Fix an issue where PostgreSQL would fail after a reboot

    bitte-world

    • Updated to NixOS 22.11

    ci-world

    • Updated to NixOS 22.11
    • Added Equnix cluster
    • Improve caching of Nix builds

    · 3 min read
    Jared Corduan

    High level summary

    The ledger team completed some preliminary ground work in preparation for CIP-1694 +(restructuring the ledger state), +fixed the PDF hosting problem (mostly the formal specs), +built out more of the new user-friendly ledger API, +finished a proof of concept for constraint-based generators for property tests +(with the hopes of being able to replace our trace generators one day), +and addressed technical debt.

    Lower level summary

    Restructuring the ledger state

    The existing governance structures will be replace in the conway ledger era, +as described in CIP-1694. +In particular, the ledger rules will be restructured as follows:

       BBODY
    |
    |-------------------------------|
    v v
    TICK LEDGERS
    | |
    |---------| |
    v v v
    RUPD ~NEWEPOCH~ ~LEDGER~
    | |
    |----------| |--------|-------------------|-----------|
    v v v v v
    ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+
    | | |
    |---------|------------| v |
    v v v DELPL v
    SNAP POOLREAP -UPEC- | UTXO
    |--------| |
    v v v
    POOL DELEG ~UTXOS~

    -..- Removed
    +..+ Added
    ~..~ Modified

    Moreover, the ledger state will also be restructured in accordance with the new rules. +In the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT. +We have also adapted all the data structures in the ledger state.

    See:

    PDF hosting

    We now build all of our PDFs using a GitHub action which is triggered by pushing a tag +with a specific form, cardano-ledger-spec-YYYY-MM-DD. +The action creates a GitHub release containing the PDFs. +The links in the main ledger README now point to the PDFs in the latest release.

    See:

    Powering the new ledger API

    We have now removed all the HasField instances from the protocol parameter data types, +and replaced them with lenses. +This is probably the last major restructuring that the ledger team will do on the code base +for the API for a while +(the Plutus tools team will be working on it next, see here). +We also added a new helpful function ensureMinCoinTxOut.

    See:

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We would like to switch to tests which instead generate a random ledger state representative +of not just an initial state, generate a single random valid block, and then test our properties. +The hope is that these will be much more random and easier to maintain.

    We have finished a proof of concept are encouraged that this approach could work!

    See:

    Technical debt

    • pull-3244 massive CI speedup
    • pull-3249 better types for fees in the protocol parameters
    • pull-3264 move our annotator code to the cardano-ledger-binary package where it belongs
    • pull-3239 move the Wdrls type to the Core module.

    · One min read
    Kostas Dermentzis

    High level summary

    After spending the last months on improving DBSync and releasing 13.1.0.0 the DBSync team focused +the last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the +new leger core and ghc-9.2.4

    Lower level summary

    • Integrate CHaP +#1331
    • Integrate new ledger core 0.1.1.1 and ghc-9.2 +#1332
    • Technical debt: Add code formatter fourmolu +#1334
    • Preparing and tracking Conway and UTxO integration

    · 2 min read
    Sebastian Nagel

    High-level summary

    Since last weekly update before christmas, the Hydra team worked on the +technical specification, closed gaps in hydra-plutus scripts, made the unique +headId available to Hydra clients through the API, allow the hydra-node to +explicitly synchronize from genesis (if configured), and fixed smaller log and +build issues reported by new users.

    Besides this, a retrospective blog +post +was published by Matthias Benkort (CF) on Hydra, summarizing our progress made +in 2022 also an outlook where Hydra is headed for in 2023. Also, the team had +some first sessions on the voting project with Catalyst and the CF.

    A full digest monthly digest for December 2022 can be found on the hydra +website.

    What did the team achieve this week

    • Had some first sessions on the voting project with Catalyst and CF
    • Published retrospective blog +post +by Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also +an outlook where Hydra is headed for in 2023.
    • Worked on the LaTeX spec for HydraHeadV1, not final or published yet - latest +version in this repository.
    • Add unique headId to API and hence make it available to clients.
    • Allow hydra-node to explicitly synchronize from genesis using --start-chain-from 0.
    • Closed gaps in hydra-plutus scripts
      • bounded transaction validity (ADR21)
      • enforcing contract continuity via state token in output
    • Fixed JSON for some logs and smaller build issues reported by new users.

    What are the goals of next week

    • Reach out to have hydra-tutorial integrated.
    • Plan the next couple of months.
    • Complete checking reimbursing of commits in head validator.
    • Align plutus scripts to spec and simplify them (identified some simplifications)
    • Improve mutation framework to be sure we fail tests for the right reasons
    • Complete the spec except the open points (<5) and also discuss them with researchers.

    · One min read
    Samuel Leathers

    Node Reelease Update

    2022-11-02 - 2023-01-13

    Executive Summary

    A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on +release/1.35 branch and does not bump cardano-ledger.

    The team successfully integrated an interim release bump of ledger and consensus into cardano-node master. +This work will not be released in a node version, but will be continued by the current dependency bump in progress.

    We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again.

    The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress.

    Completed

    In Progress

    + + + + \ No newline at end of file diff --git a/page/48/index.html b/page/48/index.html new file mode 100644 index 00000000000..739e1d3d109 --- /dev/null +++ b/page/48/index.html @@ -0,0 +1,58 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Dorin Solomon

    High level summary

    During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the P2P Single +Relay functionality.

    We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level.

    Workstreams

    Framework improvements:

    • extended the cardano-node-tests with the ability for anybody to fork the repo and run all our System Tests on GitHub Actions
    • added 2 new nightly pipelines - nightly-mixed and nightly-p2p - details here
    • some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;

    === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) === + to + === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===

    Node:

    • ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled
    • started the preparations for testing the next tag - details here

    DB-Sync:

    • some improvements on db-sync sync tests

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ADR. They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible.

    Finally, they have worked on upgrading the devnet and fixing some flakiness in the end to end tests of the CI.

    Low level overview

    • Implemented the redaction of an ADR for handling graceful updates of the Mithril Network #671
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with protobuf #677
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with avro #678
    • Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction #672
    • Worked on upgrading the Cardano node of the Mithril devnet, as well as fixing flakiness of the CI #523
    • Prepared and tested the new 2302 distribution pre-release 2302.0-prerelease
    • Updated the documentation for SPO to build a signer node in order to better reflect the new release process #681

    · 3 min read
    Damian Nadales

    High level summary

    The consensus team is resuming its activities after the Christmas break. During +these weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and +discussing with the Ledger team the changes that might be required for the next +iterations. The pull request that adds the Conway era is waiting for a second +review round and we hope to merge it soon. On the technical debt side we are +looking into a property-test failure found in the iterators. We are +investigating if this is an error in the model or in the implementation. We also +improved the documentation of our testing code.

    Workstreams

    UTxO HD Prototype

    We worked with the Ledger team to start preparing the next versions of UTxO-HD. +The Ledger team is concerned that for the remaining maps we might need the full +ledger state on epoch boundaries. Since the main consumer of the ledger rules is +Consensus, the code that requires access to a full state could be moved from the +ledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take +place in such bridge, instead of querying the ledger for the values that are +required in the epoch-transition computations.

    We relocated some UTxO-HD definitions, in preparation for merging +the prototype into master.

    We also completed updated local benchmarks comparing the replay time and memory +consumption of:

    • the baseline node (f2fc76ef45647275c98634da1718290b976ff364)
    • the UTxO-HD node with the in-memory backend
    • the UTxO-HD node with the LMDB backend

    The following plot shows the results: we can see that the LMDB node barely +reaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The +in-memory backend is about 30 minutes faster, but still slower than the baseline +version. We are aware of this phenomenon and it is inherent to the problem of +maintaining sequences of differences of the last k ledger states that allows +us to perform rollback and roll-forward. We are in the process of measuring +syncing from scratch times.

    We also added StaticEither accessors that helped us to simplify +the UTxO-HD prototype.

    New Conway era

    We incorporated the feedback of the pull request, and rebased this +branch on top of master. The PR is pending a second review round and we hope +to merge this soon.

    Technical debt

    We are investigating a property-testing failure involving +iterators. Solving this requires understanding the expected behavior of +iterators in the counterexample found by QuickCheck to determine if the error +is in the model or in the implementation.

    Fostering collaboration

    We moved the contents of docs/Testing.md closer to the code, so that the +explanations about the tests are easier to find in the relevant modules, and the +documentation is easier to keep up to date.

    · 2 min read
    Serge Kosyrev

    High level summary

    Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:

    1. SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress.
    2. The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over.
    3. Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks.
    4. New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs.
    5. Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench.
    6. Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.

    Performance

    The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on.

    Tracing

    The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done.

    Infrastructure

    Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components.

    On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters. +We now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes.

    We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development. +Once this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: The API features (error handling) has been merged.
    • Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI.
    • KES agent: We keep progressing with KES secure forgetting implementation.

    We also started working in the cryptography engineering handbook, which will be a cross team effort.

    Low level summary

    MuSig2

    • Merged the more granular error handling mechanism PR#33

    Mithril

    • Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in Version 0.1.1, which was published in crates.io.
    • Updated new KES format to mithril library PR 674
    • We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync PR 531
    • We keep progressing on reducing the use of transmute in mithril-stm.

    cardano-base

    • Nothing new to report. Still working in merging these PRs. We are only missing nix merge of PR#520 and the updates on VRF will be merged.

    KES agent

    • We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests PR#255.

    Cryptography handbook

    We have made available the (temporary) cryptography handbook https://input-output-hk.github.io/cryptography_spec/, and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives.

    + + + + \ No newline at end of file diff --git a/page/49/index.html b/page/49/index.html new file mode 100644 index 00000000000..87cf1b93659 --- /dev/null +++ b/page/49/index.html @@ -0,0 +1,112 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 5 min read
    Jared Corduan

    High level summary

    The ledger team finished up the remaining work for tracking individual depots, +built out the new Conway era transaction body (in line with CIP-1694), +greatly reduce some problematically large calculations on the epoch boundary, +and addressed technical debt.

    Lower level summary

    Finishing the deposit tracking

    The initial work on the individual deposit tracking project focused only on correctness. +As this is a large data structure +(since its size is linear with respect to the number of registered stake credentials), +it is very important that we also reduce the memory overhead as much as possible. +Fortunately, we were able to add very little overhead for the deposits by using existing +efficient data structures. The extra tracking now only incurs one word (8 bytes) +per registered stake credential.

    See:

    New Conway era transaction

    We implemented the Conway era transaction body, which is in line with CIP-1694. +Note that the Conway era implements, losing speaking, the parts of CIP-1694 that are not +related to the liquid democracy (the "DReps"). +The new transaction body adds the new governance actions and votes, +while also deprecating the old governance structures +(i.e. the old protocol parameter updates and MIR certificates).

    We also now have the wire specification (CDDL file) and serialization code in place. +The wire specification is still subject to change while we work on the Conway era, +but it is now usable and has proper testing support +(so that, for example, the serialization round-trips, etc).

    See:

    Optimizing the TICKF transition

    Every since the release of the Shelley era, we have been working to reduce the computational load +placed on the node by the ledger at the epoch boundary. +While still not perfect, we believe that we have removed one of the final problematically long +epoch boundary computations that exacerbate situations like +this. +In particular, the problem involved the way in which the consensus layer obtains a view of the +ledger for the purposes of checking the leadership schedule in a new epoch. +We implemented a stopgap measure which now only incurs a single multi-second cost once per epoch +instead of potentially several multi-second costs while the networks waits for the first block +of a new epoch to be minted.

    See:

    Technical debt

    We closed the year out with a lot of reduction to the technical debt!

    Improved ledger event

    • pull-3212 - The ledger events are not guaranteed to appear in any given order within a block. +For this reason, motivated by the use case in db-sync, the TotalDeposits event now +includes a transaction ID and emits the change in deposits instead of the value.

    Improved type saftey

    • pull-3208 - We replaced NominalDiffTime with a newtype wrapper. The problem was that our CBOR +encoders and decoders were using the wrong level of precision, having to due with with +the Shelley genesis file. We removed the potential problem with a newtype wrapper.
    • pull-3167 - We now use a GADT to ensure consistency of the Plutus language in the types +for TransactionScriptFailure and PlutusDebug.

    Code/Module organization

    • pull-3175 - The Allegra and Mary eras had an unusual relationship in our codebase, +due to the uncertainly of release dates while we were implementing them. +In particular, they were coupled in way that is different from the rest of the code base. +With hindsight on our side, we split the combined shelley-ma Haskell package into two +separate ledger era packages, which is now consistent with the rest of the repository +and module structure.
    • pull-3184 - We created a core test sub-library, cleaning up a lot of our property test +generator code.
    • pull-3210 - We moved the KeyPair type to the test library. Outside of testing, +the ledger does not need to deal with signing keys, and since this is a topic that +deserves the utmost care, it is best to make it clear that our use of signing keys +is only for testing.
    • pull-3229 - We split the Cardano.Ledger.Alonzo.Data module, which is more consistent with the rest +of the codebase.

    Revert pointer address deprecation

    Thanks to one of our excellent internal auditors, +@jmhrpr, +we now have a better plan for deprecating pointer addresses. +This meant that we had to revert the previous work to deprecate them.

    See:

    Miscellaneous

    • pull-3205 - We removed deprecated type synonyms.
    • pull-3218 - We cleaned up the address deserialization.
    • pull-3223 - We fixed faulty address deserialization tests.
    • pull-3222 - We switched to a general type family TxOut from concrete ones, +reducing many constraints.
    • pull-3224 - ShelleyGenesis is now parameterized by crypto instead of by era.
    • pull-3170 - We set the cabal-version to 3.0 in our projects.
    • pull-3172 - We removed the now useless EncodeMint/DecodeMint classes.
    • pull-3225 - We switch from ormolu to +fourmolu. +The reason was to be able to finally have more diff friendly code!

    · 2 min read
    Jordan Millar

    2022-12-28 - 2023-01-10

    High level summary

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on the website and reduced the cost for commit transactions by ~30% with the help of reference scripts.

    The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023.

    What did the team achieve this week

    • Kicked-off Hydra Voting project with Catalyst, CF, and IO Research.
    • Reduce commit transaction costs by ~30% with reference scripts.
    • Prepared an RFP for external audit of the Hydra Head solution.
    • Fixed transaction cost benchmarks for abort tx #631.
    • Recorded decision to use model-based testing (ADR22) and improved Model documentation.
      • Concluding the first increment on Validate coordinated Head protocol #194.
      • Formulated next step / follow-up on testing the Soundness property of our protocol #656.
    • Switched to using nix flakes for development setup and CI build #646.

    What are the goals of next week

    • Push ADR21 & tx validity gap over the finish line (smoke tests missing).
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Close & recap on the year with another monthly report (+ blog post).

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has released the new distribution 2248.1 of their nodes. They have published the first version of the Mithril cryptographic library on crates.io, the Rust community’s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots.

    Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities.

    Low level overview

    • Implemented removing verification key and stake from single signatures #619
    • Completed the extraction of the signer registration from the multi-signer #642
    • Completed the extraction of the certificate creation from the multi-signer #638
    • Implemented a workflow to test client binaries (Linux / MacOS / Windows) #601
    • Completed the signature of the artifacts produced by the CI #587
    • Fixed the protocol parameters transition #627
    • Worked on optimizing the snapshot digest computation #510
    • Worked on enforcing the API protocol versions in the client and signer #633
    • Worked on deactivating the non certified signer registration mode #621
    • Worked on the re-genesis of the test networks #651

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks, the Consensus team finalized the QSM tests for the +backing store and Mempool on the UTxO-HD branch with important discoveries +regarding parallel QSM testing. We also worked with the Ledger team to envisage +the modifications that are required in Ledger and Consensus to accommodate the +changes in the crypto VRF and KES. The db-analyser now supports bechmarking +the ledger operations, which will allow us to identify, debug, and profile +potential performance problems. We drafted a document that defines how to manage +the versions of Consensus-related packages. The top level documentation of +ouroboros-network now features a description of the consensus components and +provides a hyperlinked map to the modules documentation.

    Workstreams

    UTxO HD prototype

    Whereas we had passing sequential state-machine tests for the mempool, the +parallel case proved to be more challenging than we thought. The operation of +adding a list of transactions to the mempool is not atomic and, as a result, +when adding a list of transactions, transactions from other processes can be +added in between. The mempool implementation handles this correctly, however +this required us to redesign the parallel model we had to take +the lack of atomicity into account.

    Backing store property tests

    We finished refactoring the backing store property tests. The second review +round is ongoing.

    LSM tree implementation

    We are working on benchmarking (in terms of time and number of IO operations) +fetching/looking up data from disk.

    Genesis

    We worked on the design of a mechanism to prevent a DoS attack on our Genesis +design related to rollbacks. This was arguably the biggest outstanding question.

    During the discussions around Genesis, we noticed a design boundary that nicely +delineates a fundamental component. We almost have a full Haskell prototype of +it. It will be very nicely self-contained, perhaps even usable in the ultimate +implementation!

    New VRF and KES crypto integration

    We collaborated with the Ledger team on preparing the ledger state and crypto +types to avoid huge allocation on the epoch boundary when changing aspects of +the crypto that will only manifest in headers, not in the ledger states.

    Technical debt

    We merged the pull-request that adds a support to db-analyser for +benchmarking ledger operations. This will allow us to identify, debug, and +profile potential performance problems. The benchmark focus on the main 5 ledger +operations that are involved in chain syncing, block forging, and block +validation, namely:

    1. Forecast.
    2. Header tick.
    3. Header application.
    4. Block tick.
    5. Block application.

    The following figure shows a plot of the benchmarking results for the first 65 +million blocks (approximately) of the Cardano chain. The thin yellow lines under +the x-axis show the epoch boundaries, whereas the thick yellow lines correspond +to the era transitions.

    As we can see in this figure, era and epoch boundaries require more computation +time. The ledger team are aware of this problem, and we are working to improve +this situation.

    Fostering collaboration

    We drafted a document motivating and defining how Consensus (and +possibly other core teams) will/should manage our package versions. This +pull-request garnered many great discussions from our team members and other +teams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et +al. We want to thank you all for your input, and we found this discussion very +enlightening!

    We merged the pull request that adds an overview of consensus to +the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    + + + + \ No newline at end of file diff --git a/page/5/index.html b/page/5/index.html new file mode 100644 index 00000000000..c8f1d419b6f --- /dev/null +++ b/page/5/index.html @@ -0,0 +1,46 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Alexey Kuleshevich

    High level summary

    This update contains mostly improvements to quality of Conway era implementation and +tooling that we use for testing Ledger. Major Conway bugs that were discovered and +squashed are:

    • PParamsUpdate proposals will now correctly use DRep thresholds for ratification
    • Treasury withdrawals are now properly enacted.
    • Corrected snapshotting and DRep Stake Distribution Pulser initialization
    • Delegation to non-existent Stake pool is no longer possible

    Other important quality of life improvements are addition of reusable interfaces for an +ordered set OSet and ordered map OMap. Which allowed us to disable duplicate +certificates and proposals in a transaction. As a precursor to PlutusV3 integration, a +serious reorganization of Plutus related functionality was performed.

    Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on +expired proposals, addition of Anchor to Constitutional Committee resignation proposals.

    Significant improvements have been made to a specialized "Imp" test library that allows us +writing concise stateful unit tests for verifying the Ledger logic. Serious progress has +been made on the conformance testing, where we can now interface with Haskell generated +code from the Agda specification. Serialization testing has been extended to increase +binary conformance coverage.

    Low level summary

    Conway

    • pull-3808 - Enhance CommitteeMembersState query to return quorum and NoConfidence
    • pull-3801 - Fix epoch rule and tests
    • pull-3803 - Fix delegation validation
    • pull-3759 - Reshuffle things to the DRepPulser incorporates some snap shot things
    • pull-3779 - Prevent duplicate certs and proposals
    • pull-3794 - Added anchor to resign certs
    • pull-3797 - Cleanup JSON instances for Conway governance
    • pull-3848 - Plutus modules restructure
    • pull-3840 - Fix anomalies in Deposits in the Conway Era
    • pull-3856 - Add governance related ledger events
    • pull-3825 - Prevent voting on expired GovActions
    • pull-3831 - Treasury withdrawal fix
    • pull-3791 - Use a Data.OMap.Strict to replace ProposalsSnapshot
    • pull-3836 - PParamsUpdate enactment fix
    • pull-3846 - Revert argument order swap.

    Testing

    • pull-3782 - Move ImpTest to Shelley testlib
    • pull-3842 - Imp improvements
    • pull-3844 - Add mappings to Agda types
    • pull-3853 - Fix strange assertion failure, which hides real Block too big problem.
    • pull-3809 - CDDL roundtrip testing
    • pull-3832 - Treasury withdrawals tests
    • pull-3839 - Added cardano-ledger-conformance
    • pull-3841 - Add sha256 to cardano-ledger-executable-spec

    Improvements and releasing

    • pull-3843 - Add ...WithLogs versions of evalScripts and friends
    • pull-3795 - Bump plutus to 1.15
    • pull-3798 - Bump urllib3 from 1.26.17 to 1.26.18 in /doc
    • pull-3799 - Changes needed for 8.6 release
    • pull-3807 - Add invalidBeforeL and invalidHereAfterL functions
    • pull-3819 - Fixups needed for a release
    • pull-3829 - Post release CHANGELOG version bumps
    • pull-3830 - Bump aeson to 2.2
    • pull-3833 - Backport release cardano-ledger-conway-1.10.1.0
    • pull-3828 - Add changelog for node release 8.6

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client Docker package is incorrect #1322

    · One min read
    Damian Nadales

    High level summary

    This week the Consensus team made progress on two fronts: the question of survivable eclipse duration, which is part of our work supporting Genesis delivery, and how to improve the handling of blocks from the future. +Regarding the UTxO-HD branch, we managed to run a node with legacy blocks, which is syncing with mainnet, up to including Alonzo. +We also investigated a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release.

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the release-mainnet aggregator.

    Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Fix devnet Mithril Docker images [#1272](https://github.com/input-output-hk/mithril/issues/1272
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client regressions in snapshot list and download #1321

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team fixed the gen-hydra-keys command to avoid +overwriting existing keys, and resolved issues related to the rewritten +hydra-tui. They also worked on a \"dirt road\" implementation for the +\"Ignored init tx\" notification, improving the robustness of the system.

    The team finalized preparations for the Cardano Summit presentation, including +implementation of the hydra-poll example DApp.

    If you happen to read this and attend the Summit in Dubai, make sure to check +out our Masterclass about \"Developing Hydra + Mithril for Scaling Cardano\" on +Friday, November 3 at 14:00-15:30 local time in the \"Al Dar\" room!

    What did the team achieve this week

    • Fix gen-hydra-keys command to not overwrite existing keys +#1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Finalized cardano summit preparation +#1109
    • Implemented the hydra-poll example DApp link to +repository
    • Dirt road implementation for \"Ignored init tx\" notification +#529

    What are the goals of next week

    • Attend cardano summit and deliver presentation
    • Clarify / close user created issues
    • Build aarch64-darwin binaries in CI
    + + + + \ No newline at end of file diff --git a/page/50/index.html b/page/50/index.html new file mode 100644 index 00000000000..d9241abe3e4 --- /dev/null +++ b/page/50/index.html @@ -0,0 +1,41 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Kostas Dermentzis

    High level summary

    The DBSync team continued testing release 13.1.0.0. The QA team has reported that no issues have +been found. The DBSync team also worked on cherry-picks back to master and on fixing bugs.

    Lower level summary

    • Release is cherry-picked back to master, which uses the new rollback mechanism which uses +reverse indexes, same as the release +#1320 +This also fixes a bug number of issues on master.
    • Depenencies upgrade and CHaP integration +#1324
    • AdaPots fix #1323. This +fixes an issue where the per epoch AdaPots didn't match the epoch boundary, but +they also included changes from the first block of the epoch.
    • Deposits Event fix #3212. This pr +adjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the +number of queries that db-sync does during syncing an make syncing faster.

    · 2 min read
    Jordan Millar

    2022-12-14 - 2022-12-27

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 4 min read
    Serge Kosyrev

    High level summary

    1. SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment.
    2. A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery.
    3. The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals.
    4. Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started.
    5. Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.

    Performance

    The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload.

    We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling.

    Tracing

    After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical.

    To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:

    1. We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration.
    2. The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.

    All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further.

    In addition, we're still pursuing our performance-enhancing rework of the new tracing internals.

    Infrastructure

    After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends.

    Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it. +This means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis. +This will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports.

    A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches. +Previously we only had automation for two aspects separately, so we only could either:

    • compare individual runs (used for different node configurations / versions)
    • collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version) +Naturally, combining these two capabilities was a long-desired feature of our analysis pipeline.

    · One min read
    Marcin Szamotulski

    High level summary

    In last sprint the team focused on preparations for the conference talk at +OPODIS 2022. We also worked on preparations to publish io-sim and related +packages on Hackage (PR #57, PR #60).

    We also started reviewing:

    • ouroboros-network
    • cardano-node
    • cardano-ledger +repositories for open-source readiness (PR #4128).

    We prepared a PR which changes how node-to-node and node-to-client protocol +versiones are serialised in cardano-node log (PR #4691).

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency.
    • Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack.
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • [Still in progress] We are introducing a more granular error handling mechanism PR#33
    • We merged the API redesig PR#35
    • We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future PR#36

    Mithril

    • We merged the individual signature PR#620
    • We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (kes repo)

    cardano-base

    • Nothing new to report. Still working in merging these PRs.
    • We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a bug in GHC

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Fixed a 'use-after-free' bug in the KES agent.
    + + + + \ No newline at end of file diff --git a/page/51/index.html b/page/51/index.html new file mode 100644 index 00000000000..bfc1162f7ec --- /dev/null +++ b/page/51/index.html @@ -0,0 +1,78 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has worked on completing to "Validate coordinated head protocol against formal model", this is a huge step to verify the implementation is secure. They also worked on implementing ADR21 related to bounded tx validity which is now under review. HydraPay project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of issues they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced.

    What did the team achieve this week

    • Document model based testing #194 & #641
    • Got ADR21, reducing gaps between implementation and specification, under review.
    • Complete review on hydra-tutorial.
    • Complete first round of review on HydraPay work #634
    • Meeting with Director of CyberSecurity frio IOG to unblock "the RFP prepared for the external audit" #606
    • Remove vasil-dev and testnet from smoke-test because they were not working #630
    • Fix flaky plutus-merkle-tree test #642
    • Refactor NetworkSpec to improve legilibility.
    • Fix benchmark cost for abortTx #631
    • Adapt nix.conf to the recent hydra-ci nix cache migration.

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation.
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Get Cicero (new CI) working.
    • Use reference inputs to reduce the cost of the commitTx.

    · 3 min read
    Jared Corduan

    High level summary

    The Plutus tools team at IOG has started helping the ledger team to build out a user friendly +cardano-ledger-api package! +A GitHub project +will be filled out in the days ahead, +people interested in the API can use it to follow along and join in on the conversations.

    The ledger team has started using +architectural decision records +to leave a record of important decisions that the team makes. +We will retroactively go back through past decisions and make ADRs for them.

    The logic to track individual deposits is now nearly in place. +We are prioritizing correctness with our first pull request, and will follow up with +performance optimizations and general cleanup next.

    Pointer addresses are being deprecated with the Cardano major protocol version 8. +See CPS-0002 +for more context.

    Lower level summary

    Cardano ledger API

    The Plutus tools team has taken our minimal cardano-ledger-api package and started filling it +out and adding much needed documentation. +They have also added doctests! +In the days to come, the Plutus tools team will map out a lot more work for the API and record +it in this +GitHub project.

    See

    Architectural Decision Records (ADRs)

    We are now providing more context and leaving a record of important decisions that are made +in the ledger. The first ADR explains the very lightweight process.

    See

    Tracking individual deposits

    See ADR-3 +for background. +We now have the logic in place to track individual deposits, and a host of property tests +to make sure that the logic is correct. +The current implementation uses more memory than it needs to, and we will address that next, +with our hope being to only use one word (8 bytes) per registered stake credential. +There is a fair amount of other cleanup needed for general maintainability.

    See

    Removing pointer addresses

    Pointer addresses, which have never seen any real use +(there are something like eleven on mainnet), are being deprecated starting at Cardano major +version 9. +CPS-0002 gives the context. +We are disabling them by first preventing transaction outputs containing them +from being serialized by the node at the moment we switch to version 9. +At the hard fork after that, we will translate the existing few pointer addresses +to enterprise addresses.

    See

    Technical debt

    • pull-3162 - Sometimes we have to put safeguards in place for hard forks which may never +be exercised. After we have passed the given hardfork, we are able to clean up the code +and simplify our logic. We removed all of the ones that we are currently easily able to.
    • pull-3165 - We improved the type safety of our code while also discovering and fixing +a serialization bug.
    • pull-3172 - We removed dead code.
    • pull-3175 - The Allegra and the Mary code used to be coupled in a particular way the we grew to +dislike. We made these two ledger eras now uniform with the rest of our code base.
    • pull-3184 - We organized our property testing code.
    • pull-3200 - The Plutus tools teams fixed an outstanding bug in the translation from the +ledger state to the Plutus script context.

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has worked on cleaning up several things in progress +after last week's summit. They have extended their model-based testing (MBT) +approach with transaction creation & observation +#410, solved +AcquirePointTooOld problems of the hydra-node with by changing the wallet +initialization #439. +Also, the Hydra researchers updated the security proofs of the Coordinated Hydra +Head, which are bound to be included in the Hydra HeadV1 specification.

    What did the team achieve this week

    • Monthly review & report - will also be published on our website #644
    • Extended the model-based testing (MBT) with transaction creation/observation #410
    • Solve AcquirePointTooOld problems with new wallet initialization #439
    • Fixed our hydraw deployments (EC2 instances)
    • Created & discussed ADR21 within tx validity work
    • Received & discussed security proofs of Coordinated Hydra Head (requires more work)

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation
    • Complete review & integrate the Hydra tutorial
    • Review latest hydra-pay work
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec
    • Get Cicero (new CI) working

    · One min read
    Kostas Dermentzis

    High level summary

    The DB Sync team prepared a release 13.1.0.0-rc2 which includes many improvements for db-sync, +it makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces +migrations. This release finalises the objectives that were set for db-sync for the previous +3 months period and part of the syncing speed objective set for the next period +Changelog

    Lower level summary

    • Branch release/13.1.0.x +includes all the improvements related to the release. The release is passing through the testing +phase and a number of bugs and issues have been fixed, like +#1312 +#1311. +Also many new unit tests have been added.

    • Part of the release branch is cherry-picked back into master, in a way that it respects the new +release and development process, so that it takes into account migrations +release process

    • The DB Sync team has also tagged release 13.0.6 which better supports preview and preprod for +docker.

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes.

    Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer.

    Low level overview

    • Implemented custom Mithril SPOs on testing/pre-release networks #563
    • Deprecated Signer Declarative Pool Id registration mode #585
    • Completed the second stage of the store automatic migration process #600
    • Completed the deployment pipelines to crates.io registry #588
    • Completed automatic generation of nodes/libraries versions manifest in releases notes #599
    • Completed CI/CD handling of PR from forks #597
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #586
    • Worked on signing the artifacts released in the distributions by the CI/CD #587
    • Worked on multi-platforms end to end test #601
    • Worked on the refactorizaton of the aggregator multi-signer engine #398
    + + + + \ No newline at end of file diff --git a/page/52/index.html b/page/52/index.html new file mode 100644 index 00000000000..f39e5934e43 --- /dev/null +++ b/page/52/index.html @@ -0,0 +1,97 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Dorin Solomon

    High level summary

    During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the P2P Single +Relay functionality, and also tested some DB-Sync tags.

    Workstreams

    Framework improvements:

    • moved the System Test CLI Pipelines from BuildKite to Github Actions
    • improved the reporting tools to support the rerun of the failled tests and update of the reports
    • added support for Github API in report-aggregator, so reports will be generated from the GitHub nightly jobs from now on
    • added support for mixed topology - P2P, legacy, mixed topologies
    • planned the P2P Single Relay system test activities
    • added support to start regression tests with PV8 + better selection of tests

    DB-Sync:

    • confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)
    • tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks, the consensus team merged improvements to the monadic +cursor API that was needed to implement LMDB range reads, which is in turn +required for the implementation of the UTxO HD feature. We added tables to +several tests in for the UTxO HD feature, which increases our confidence in the +correctness of the prototype. The mempool property tests are close to being +completed. Also, we finished the LSM tree tuning algorithm.

    On the Genesis front we started simplifying the BlockFetch logic with +CSJ-specific workloads in mind.

    We are also documenting the Block Diffusion Pipelining feature, and added a +high-level overview of consensus to the top level documentation of +ouroboros-network.

    Workstreams

    UTxO HD prototype

    We merged the implementation of a monadic cursor API (#1)) which was +needed to solve a bug with LMDB range-reads. After this PR was merged, we focused on +bridging the gap between the lmdb-simple interface and consensus by facilitating +using lmdb-simple's cursor API without Serialise constraints (#3).

    We refactored the backing store property tests to use quickcheck-lockstep +(#4081).

    We added tables to the mock ledger in the UTxO-HD feature branch +(#4184). Every test that used to run with SimpleBlocks now uses +tables. This will enable us to exercise the UTxO HD mempool integration by +leveraging the existing mempool property-tests. The new state-machine +property-tests are still needed for testing the parallel behaviour of the +mempool.

    Our work on the mempool state-machine tests revealed the need for improvements +in the quickcheck-state-machine library. Parallel testing assumed that the +state machine did not have access to mutable references. However, the mempool +tests require the use of such mutable references for mocking the ledger +interface. As a result, our parallel tests were failing with rather obscure +messages. @Jasagredo submitted a pull request (#12) that allows for +new mutable references to be created at each run of the state machine.

    Backing store property tests

    LSM tree implementation

    We finished the LSM Tree tuning algorithm. We are currently tidying up the code +and gathering results (i.e., plots and their interpretation).

    CSJ prototype

    We started simplifying the BlockFetch logic with CSJ-specific workloads in mind.

    New VRF and KES crypto integration

    Started working on supporting new version of StandardCrypto which uses compact +KES and batched VRF (#4151).

    Technical debt

    We reviewed the existing state of the Block Diffusion Pipelining document. We +are now working on the "Implementation" section (#4020).

    Fostering collaboration

    We cleared up our understanding of the error dynamics of forecasting +(#4146 and #4174).

    We submitted a pull request that adds an overview of consensus to the top level +documentation of +ouroboros-network (#4197). This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    https://github.com/input-output-hk/ouroboros-network/pull/4197

    · 2 min read
    Jordan Millar

    · 2 min read
    Serge Kosyrev

    High level summary

    1. Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release.
    2. SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench.
    3. The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks.
    4. Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started.
    5. Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.

    Performance

    We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release.

    Tracing

    For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them. +The idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time.

    To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics.

    Infrastructure

    Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation.

    In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model.

    The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged. +We are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration.

    We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability.

    We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP.

    As usual, a number of smaller workbench, data analysis & reporting improvements have been made.

    · 4 min read
    Marcin Szamotulski

    Stake-Driven Data Diffusion Release for Relays

    IOG networking team decided to release the Stake-Driven Data Diffusion with +Robust Optimised Peer Selection also more commonly known as P2P. In the +last update, we informed about a performance regression, but it turns out it +only affects block producers, and thus we highly advise against running it on +such nodes. Further investigation is required to find the cause of it.

    On IOG's benchmarking cluster we have seen quite a good performance improvement +on block propagation itself. The cluster is running a static topology with +valency 6 (each node is connected to 6 other nodes). In which every of the 50 +nodes are block producers. The setup of this network is the same as mainnet. +We've seen 40-50% performance improvement on block propagation comparing to the +same cluster deployed with the same topology but using non-P2P nodes. We think +this performance improvement is caused by using full duplex connections. Quite +likely the transaction traffic floating in both directions on the same TCP +connection helps to keep the TCP window open. Note that in a cluster of 50 +nodes with valency 6 the probability of having at least one duplex connection +is more than 50%. We don't expect the same improvement on mainnet because the +network is much wider and the transaction traffic is not as large.

    Just before the release we squashed two small bugs:

    • issue #4163 - top level integration bug in keep-alive;
    • issue #4177 - a bug in outbound-governor;
    • PR #4165 - a fix cardano-ping support of NodeToNodeV_10.

    Peer Sharing

    We were carrying a review of peer sharing PR.

    DeltaQ

    Neil Davies was invited to give a guest lecture entitled Avoiding System Catastrophes at UCLouvain.

    What have we achieve last sprint

    • issue #4163: we found out that a control message is not passed to the +keep-alive mini-protocol, this results in every demotion executing demotion +timeout rather than a graceful termination. With the fix the node will no longer log:

      { "kind": "PeerStatusChangeFailure"
      , "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"
      , "reason": "TimeoutError"
      }
    • issue #4177: we fixed an assertion failure in the outbound-governor; now +we don't try demoted peers which are being demoted already.

    • PR #4155: we refactored ouroboros-network packages. There's a top level +ouroboros-consensus-diffusion package which integrates network +& consensus code. We also introduced:

      • ouroboros-network-api package which contains the API shared between +network & conensus;
      • ouroboros-network-mock package which contains mock API used for testing +(e.g. a mock chain & chain producer, etc.)
      • ouroboros-network-protocols package which contains implementation of all +(but handshake) mini-protocols, exposes a testlib and contains test +and cddl components.

      This made the dependency tree of network & consensus packages much +cleaner.

    • PR #4169: we described the usage of release branches in CONTRIBUTING.md +doc.

    • PR #4165: we fixed cardano-ping support of NodeToNodeV_10 protocol.

    DeltaQ

    The abstract of the talk:

    An essential step to ensuring that distributed systems are fit for +purpose.

    Distributed systems have become an integral part of our society and +daily lives. We are, both implicitly and explicitly, individually as well as +collectively, placing ever more trust in them.

    Are they worthy of this trust? Our need for them to be ‘fit-for-purpose’ goes +well beyond notions of functional correctness (i.e. never getting the wrong +answer). We need them to deliver the desired outcomes in a timely, robust, +reliable, resilient fashion, at scale and in a sustainable way (both +economically and environmentally).

    This all sounds like a worthy aspiration, but what would be a practical +approach to capturing and reasoning about these issues? How can we ensure that +systems can meet their fit-for-purpose objectives, not just in their design but +as they are deployed, encounter the imperfect world, are scaled to become +economic, and proceed into ongoing maintenance?

    This talk will illustrate how the notions of Outcomes and Quality Attenuation +(as captured by ‘∆Q’) are being used to both frame the necessary notions and +provide a basis for assuring the refinement and reification of such systems, +from initial concept to operational infrastructure.

    You can download the slides from here.

    + + + + \ No newline at end of file diff --git a/page/53/index.html b/page/53/index.html new file mode 100644 index 00000000000..0b161fe4d3d --- /dev/null +++ b/page/53/index.html @@ -0,0 +1,50 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team.
    • Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes
    • cardano-base: The VRF and BLS branchs are still open and in progress
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library PR#31
    • We are introducing a more granular error handling mechanism PR#33
    • We rethought the API and made it more consistent with the underlying secp256k1 library PR#35

    Mithril

    • The mithril crates in general will be published in crates.io, and we adapted the core library's README PR#616
    • We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information PR#620

    cardano-base

    • We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) PR#341
    • SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions PR#344
    • Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus PR#266

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a presentation about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas.

    What did the team achieve this week

    What are the goals of next week

    • Monthly report & review meeting
    • Tie up several loose ends / branches.
    • Resolve Tx validity discussions & PRs.
    • Review cicero PR & try it out.

    · 3 min read
    Jared Corduan

    High level summary

    We released CIP-1694, +our proposal for entering the Voltaire phase. +Please come join the discussion, this will be an incredibly exciting transition for +Cardano and we want everyone to participate!

    We now have a sensible way to version all of the serialization schemes used in the ledger. +The draft pull request was polished, reviewed, and merged this week. +This solves many problems that have vexed us since the beginning of the Shelley ledger era.

    Everyone working on the Cardano node is working together to improve our release process, +and the ledger team in particular dedicated one engineer to help with these efforts +for the next release.

    Lower level summary

    The Conway ledger era

    The current proposal in CIP-1694 encompasses two new ledger eras. +The first era will be called Conway, after the English mathematician John Horton Conway. +The community facing aspects of the Conway ledger era will be very minimal, +but it will pave the way for introducing liquid democracy. +The details can be viewed here. +We do not yet have a formal specification for the Conway era. +Our plan is to debut the +formal ledger model. +Briefly, the Conway ledger era will:

    • introduce SPO voting for hard forks (in the spirit of the now abandoned CIP-47)
    • provide an on-chain mechanism for rotating the governance keys
    • re-plumb the ledger rules involving governance to be in line with CIP-1694

    Versioned CBOR

    We now have the ability to easily tie our serialization schemes to the Cardano +major protocol version. +We still aim to preserve backwards compatibility as much as possible, but we now have a principled +plan for resolving problems (see CIP-ledger-cbor). +In particular, we can now address several long standing issues, such as +issue-2444, issue-2965, and issue-3003.

    The final (and massive!) pull request which brought us the versioning is pull-3138.

    Deposit tracking

    The draft pull request which was exploring how best to track individual deposits +is much closer now to being ready to take out of draft (pull-3127). +For background on the issue, see issue-3113. +This is quite an invasive change which effects many of our tests, which we are now addressing.

    Technical debt

    As always, we keep working on technical debt. +We have deduplicated a some things: pull-3129, pull-3162. +We have memoized a problematic computation (though more due diligence is needed before we can +merge): pull-3141.

    Node release

    We have been helping with the node release efforts. See pull-4608.

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team released version 0.8.1, which includes several fixes and a user-wished extension of the persistence introduced by 0.8.0 of replaying server outputs to make clients like the hydra-tui be aware of the latest hydra-node state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from hydra-poc to hydra!

    What did the team achieve this week

    • Implemented replaying of server outputs to address #580
    • Released version 0.8.1 containing this and other fixes Release notes
    • Worked on the bounded tx validity as one of the on-chain script fixes, but couldnt finish it just yet #615
    • Collaborated with the education team on a Hydra tutorial.
    • Discovered and discussed issues with the seen ledger.
    • Renamed the Hydra repository hydra-poc -> hydra

    What are the goals of next week

    • Create and discuss an ADR about handling tx validity correctly.
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
    • Have a team workshop / hackathon after the summit:
      • Retrospective
      • Roadmapping session
      • Hack on something complex or useful

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level overview

    The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks.

    Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer.

    Low level overview

    • Released a new Mithril distribution 2246.1
    • Completed the first stage of the store migrations process #562
    • Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes #565
    • Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage #576
    • Prepared a Daedalus synchronization benchmark video with/without Mithril #606
    • Upgraded the Cardano nodes of the testing Mithril networks to 1.35.4 #594
    • Worked on implementing SPO tests nodes on testing Mithril networks #563
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #588
    • Worked on the refactorizaton of the aggregator multi signer engine #398
    + + + + \ No newline at end of file diff --git a/page/54/index.html b/page/54/index.html new file mode 100644 index 00000000000..20a2c1134f9 --- /dev/null +++ b/page/54/index.html @@ -0,0 +1,85 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 6 min read
    Damian Nadales

    High-level summary

    During the past two weeks, the consensus team started documenting the +implementation of the UTxO HD feature and continued developing tests for it. As +part of our work on UTxO HD, we improved the Haskell support for LMDB. We also +spent time working on the LSM tree prototype, and designed a parameter tuning +algorithm for it. Regarding our work on Genesis, our investigation of the +"plateaus" pointed at the TICKF slowdown on era boundaries as culprit. This +led us to developing a caching strategy that will not only remove the +aforementioned "plateaus", but can help alleviating the growing block production +delay on epoch switch. We also helped reviewing the block forge credential +hotswap feature, which is intended for use in the adoption of P2P.

    We also worked on paying technical debt and fostering collaboration. In +particular, we improved the io-sim framework, which is crucial for testing and +simulating Cardano components. We also removed thunks that appeared on era +translations, and improved our diffusion pipelining feature. We are working on a +presentation for explaining Praos and Genesis.

    High-level status report

    • Finish the UTxO HD prototype: in progress.
      • We added documentation for this feature.
      • We developed the second version of the mempool tests.
      • We fixed benchmarks that were inflating the speedup we observed in the +anti-diff implementation of sequences of differences. Speedups are now in the +range of [3.33, 4.75], which remain significant.
      • We continued improving Haskell LMDB support.
      • We finished implementing a "parameter tuning algorithm" for the LSM tree +prototype. This enables us to run experiments to check the correctness of +the algorithm.
    • Genesis: in progress.
      • Work investigating the "plateaus" in the ChainSync jumping prototype +pointed to the TICKF slowdown on era boundaries as culprit.
    • Tech debt:
      • We improved the capabilities of our io-sim library, which is crucial for +testing and simulating Cardano components.
      • We removed thunks from epoch translations in the ledger.
      • We added Linux CI support for lmdb-simple.
      • We got pending diffusion pipelining improvements merged.
    • Fostering collaboration:
      • We are working on a explanation of Praos and Genesis protocols.
    • Support:
      • Investigation of CSJ "plateaus" led us to developing a caching strategy for +TICKF that will not only remove these "plateaus", but can help alleviating +the growing block production delay on epoch switch.
      • We reviewed the block forge credential hotswapping feature which is intended +for use in the adoption of P2P.

    Workstreams

    Finish the UTxO HD prototype

    We merged PR #4060, which adds a report documenting the UTxO HD +feature, and puts emphasis in explaining how the mempool works in combination +with UTxO HD.

    We opened a draft PR with the second iteration of the property tests for the +mempool (#4076).

    We fixed the Arbitrary instances for keys and values in DiffSeq benchmarks +(#4143). The problem was that we were testing with mostly small +values, which artificially boosted the performance gains we saw on benhcmarks. +Speedups are now in the range of [3.33, 4.75] across the different +configurations.

    Backing store property tests

    We focused on incorporating feedback on the monadic cursor API PR (#1). +This required us to make small tweaks to quickcheck-lockstep to test the new +API. We also updated the backing store property tests to use the new version of +the monadic cursor API.

    LSM tree implementation

    We worked on the LSM tree prototype. In particular: finished implementing a +"parameter tuning algorithm" that adapts the LSM tree design based on factors +like:

    • workload
    • machine specs,
    • and characteristics of the data being stored.

    We are now running experiments to gather results and cross-reference them with +existing experimental results from the LSM tree paper to see if the algorithm is +working correctly.

    Benchmarking the CSJ prototype

    We focused on investigating the "plateaus" in the ChainSync tip, which turned +out to be due to the TICKF bug which we previously were only aware of in the +context of the long forging times near epoch boundaries. For the most drastic +patch by @nfrisby to speed up TICKF, full sync is speeding up by 7%.

    The following plot shows that by caching the TICKF the ChainSync tip and the +VolatileDB tip progress at the same rate.

    The plot below shows the speedup observed by caching the TICKF rule wrt the +baseline.

    Technical debt

    After addressing the PR comments, we merged PR #16, which implements +the MonadCatch instance for STM. This extends the capability of our io-sim +library, which is crucial for testing and simulating Cardano components PR #16 +closed #1461. This new feature was published as version 0.4.0.0 +of io-sim.

    We continued with our work fixing the NoThunk errors required for enabling +nightly tests, with the help of TVarInvariant checks in strict-stm and +nothunks libraries. We proposed fixes in cardano-ledger that took care of +thunks that appeared in era translations (#3143). The fixes will be +integrated back into consensus when cardano-ledger approves and publish the +changes introduced in #3143.

    We added CI support for lmdb-simple (#2). We currently test the build on +a Linux environment only.

    We got pending diffusion pipelining PRs (#3857, #3860, +#3856) merged, after rebasing and addressing feedback.

    Fostering collaboration

    @nfrisby finished a visualisation tool and outlined scripts for the Praos and +Genesis explanation presentations. The idea is to produce a video that gives an +overview of these protocols.

    Support

    We started working on caching the computation of the TICKF rule +(#4054), since this was blocking our benchmarking work for +Genesis. In addition, this issue has the Cardano community quite +concerned, so we are hoping the work done in caching the +computation of the TICKF rule can help alleviating the growing block +production delay on epoch switch.

    We reviewed the block forge credential hotswapping PR #3800 from the +networking team, which is intended for use in the adoption of P2P.

    · One min read
    Jordan Millar

    · 2 min read
    Serge Kosyrev

    High level summary

    1. P2P performance investigation is ongoing, in support of the networking team.
    2. SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support.
    3. Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing.
    4. On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started.
    5. We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.

    Performance

    We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes.

    Tracing

    We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis.

    Infrastructure

    The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends.

    We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing.

    A number of smaller workbench, data analysis & reporting improvements have been made.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level overview

    The SECP primitives AC has been met, and the test-vectors PR has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool PR has been merged, and we've adapted the KES secure PR to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (PR#). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork.

    Low level overview

    • With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation.
    • We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool.
    • In parallel, we keep progressing on the KES agent
    • VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification.
    • Our libsodium fork now links directly to upstream libsodium.

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team published together with Obsidian Systems a light paper +on our "Hydra for Payments" project (Link). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of hydra-node processes.

    What did the team achieve this week

    • Published Hydra for Payments light paper (Link)
    • Have a draft RFP ready for a first review internally
    • Answered the internal auditors questions
    • Fixed a bug with following the chain when starting with persistence (#599)
    • Minor improvements to logging for better observability (#598, #600)
    • Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (#590)

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Close more gaps #452
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
    + + + + \ No newline at end of file diff --git a/page/55/index.html b/page/55/index.html new file mode 100644 index 00000000000..b6fddfb26c4 --- /dev/null +++ b/page/55/index.html @@ -0,0 +1,90 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Jared Corduan

    High level summary

    I am extremely excited to say that we now have a pull request up which introduces our new versioned +CBOR serialization. This was an enormous effort, but it will solve a host of problems that we have +had since the Shelley phase. It will take time to properly review it, and we will +need to put in a lot of effort to integrate it with the downstream components, but this is a huge +milestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction +serialization schemes.

    We also have a draft pull request that reworks how deposits are tracked. Users of the system will +not notice any difference, but it is a necessary change needed to prepare the way for +decentralizing the governance of Cardano.

    Finally, we continued to address technical debt. In particular, we continued to make progress on +bringing coherency and consistency to the code base with a common naming convention, and +improving some error messages.

    Lower level summary

    • We have a pull request up for our new versioned CBOR serialization. +When we encounter a problem with our deserializers, it can be very difficult to implement a fix. +It is difficult because we can only fix such issues during a hard fork, and leading up to the +hard fork we must maintain two serializations for the same type in order to not cause unintended +network splitting (the problematic version must be used before the hard fork, +and the fixed version is used afterwards). +This can be especially tricky with the FromCBOR typeclass, since it is not always easy to +search for where all the problematic uses are located. +The new versioned CBOR serialization allows us to gracefully handle this transition. +See [pull-3138].
    • We proposed a CIP for backwards compatibility of the transaction serialization schemes. +See [pull-372].
    • We have draft for the new deposit tracking. +This draft is not as memory efficient as the final version will be, +but it is a sufficient proof of concept that we can write property tests against, ensuring +that we have not changed the semantics. +We will optimize after we are sure of the correctness. +See [pull-3127].
    • We now provide better support for debugging failed Plutus scripts in an important helper +function, named evaluateTransactionExecutionUnits. +In particular, it now returns all the information needed to rerun the script with exactly the +same arguments. This feature will end up appearing in the CLI and other tools from the Plutus +tools team. +See [pull-3135].
    • We did a lot more renaming to bring coherency and consistency to the code base. +See [pull-3126], [pull-3120], [pull-3118], and [pull-3116].
    • We have added a few things to the ledger repository to make it conform to the +Cardano Engineering Handbook +See [pull-3139].

    · 2 min read
    Marcin Szamotulski

    High-level summary

    In last sprint we got a performance report of P2P performance testing cluster +(which consists of 50 nodes). There is a performance regression in the header +notification metric. The P2P cluster is constructed with the same +topology as the non-p2p reference one this indicates some regression which +needs to be further investigated. This poses a risk for releasing P2P.

    We also continued to work on peer sharing: pull #4019.

    We continued working on dynamic block production which is required for P2P +release for BP nodes: pull #3159.

    We simplified the P2P topology format: issue #4559, pull #3888.

    We added a new trace point for asynchronous demotions of local peers with +Warning severity. This trace is important for SPOs.

    Detail description

    Performance regression

    Below we include a graph which shows the performance regression of the P2P code base vs non P2P.

    On the x axis is time in seconds which measures the delay from the start of +the slot to when a header was received. The y axis is the percentile of nodes +that received a header. We are currently investigating possible causes of the +regression.

    New P2P topology form

    The new topology file format is described in this issue #4559.

    Tracing improvements

    • We improved a handshake error reporting, pull #4136
    • We added TraceDemoteLocalAsynchronous rendered as DemoteLocalAsynchronous +in json format, pull #4127. Such demotions should be investigated by the +pool operator. They can indicate a problem in the deployed system, but also +they could indicate a remote problem in arranged connections with other SPOs.

    Open Source Improvements

    We improved documentation of io-sim and typed-protocols for open-source +contributors and/or maintenance tasks: pull #22, pull #45, pull #48.

    · One min read
    Sebastian Nagel

    High level summary

    This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun preview network, see 0.8.0 release notes. They also completed implementation of ADR18 and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates #195 and alignment of the specification document with auditors.

    What did the team achieve this week

    • Complete and merge ADR18 #579
    • Re-deploy hydra scripts to respun preview network, see 0.8.0 release notes #595
    • Have first gap of #452 in review.
    • Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot.
    • Engineering meeting to discuss hard forks and protocol parameter updates #195
    • Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions.
    • Drafted project scope for an external audit RFP.

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Answer the internal auditors questions
    • Have a draft RFP ready for a first review internally
    • Close some gaps #452

    · 2 min read
    Iñigo Querejeta Azurmendi

    This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.

    Low level overview

    • We have been moving forward on the implementation of the release process #500:
      • Setup of the new hosted environments for testing-preview, pre-release-preview and release-preprod with their terraform and GitHub environments #542
      • Adapted the CI workflows to work with the new release process #543
      • Publication of an ADR3
      • Publication of a dev blog post about Mithril networks evolution
      • Releasing our first Mithril distribution 2244.0
    • Worked on the API versioning mechanism #565
    • Worked on the implementation of the stores migration process for the signer and aggregator nodes #562
    • Prepared a Mithril devnet video demo #526
    • Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably #484

    · 2 min read
    Marcin Szamotulski

    High Level Summary

    • We've been working toward publishing Cardano Backlog, currently its in +review by the IOG communication team.
    • We identified a number of libraries which can be published.
    • We setup and enhanced cardano-updates.

    Detailed description

    I am glad to announce that I was given the role of open-source advocate for +cardano project. In last few weeks we were making steps towards publishing our +backlog. It's currently under review by the communication team, although most +of the issues are already visible across various repositories.

    The open-source initiatives have their own +project. It is set up +to help us track our major open-source activities. Right now there are two +work streams:

    We identifies a number of libraries across all the teams which contribute to +Cardano which we would like publish to publish, see the following +link. Arnauld Bailly recently published +quickcheck-dynamic +library on Hackage. The networking team is slowly progressing towards +publishing io-sim and related packages, checkout the progress +here.

    Thanks to Arnaud Bailly our Cardano Updates website has +a new look & feel! It's using docusaurus.io.

    Christian Taylor carried recently a detailed analysis of our open-source +repositories. He collected many interesting metrics, which allows us to see +where we need to improve as an open-source project to make the Cardano project +and many smaller related libraries which we maintain be more open and available +for open-source contributors.

    The graph below shows which documents the 55 most important Cardano +repositories are missing the most: +Documentation Adoption +You can expect we will improve in these metrics in the coming weeks.

    + + + + \ No newline at end of file diff --git a/page/56/index.html b/page/56/index.html new file mode 100644 index 00000000000..a482243c86f --- /dev/null +++ b/page/56/index.html @@ -0,0 +1,106 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Dorin Solomon

    High level summary

    We made good progress on most of the Action Items we agreed on Lisbon, like:

    • Cardano System Tests was fully open to public (tools, tests, results) +See cardano-node-tests webpage.
    • We defined an user-facing-functionality template that is used with the cardano-cli team
      • this includes acceptance criteria & user stories, and definition of done
    • We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)
    • We started to apply a labelling convention on cardano-node issues that will be used to generate some visual dashboards with some metrics [TBD]
    • Ziyand Liu started an End-to-End Development and Testing Process for Plutus Features

    · 4 min read
    Damian Nadales

    High-level summary

    During the past two weeks, the consensus team continued its work on testing the +UTxO HD prototype. We completed the era-transition and backing store tests, and +the mempool tests are advancing at a steady pace. Regarding our work in the +Genesis design, we continued our collaboration with the research and networking +teams, and we continue investigating strategies for making the chain-sync +jumping prototype faster.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We worked on state-machine tests for the mempool, and spotted potential bugs +in the implementation. Investigation is ongoing.
      • We have a set of property tests for the backing store. We still need to +incorporate the improvements to the LMDB cursor API that these tests +made possible.
      • We merged the era-transition tests PR.
    • Genesis: on track.
      • Design work around Genesis continues in collaboration with researchers and +the networking team.
      • We continued trying to improve the performance of the chain-sync jumping +prototype. We gained additional insight on which parameters to tweak next. +In spite of the baseline still being faster, the current prototype already +achieves a significant speedup when compared to the naive approach of simply +running full chain-sync with all peers.
    • Tech debt: on track.
      • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    Workstreams

    Finish the UTxO HD prototype

    We continued working on property-tests for the UTxO HD prototype. In particular +we merged the era-transition tests +PR.

    Backing store property tests

    The backing store property tests +PR has been +reviewed. The next steps are:

    • Improve error handling and command generation.
    • Add coverage testing to check that we are not failing to cover interesting +test cases.

    The monadic cursor API +went through its first review round. The API is in a relatively stable state. +This PR also unifies the cborg and serialise-based interfaces to LMDB +operations. The next steps are:

    • Write +quickcheck-dynamic +state-machine tests for this API.
    • Adapt the changes in the serialisation interface in the backing store property +tests. This will involve adding boilerplate code in consensus to make up for +the removal of the cborg-based interface.

    LSM tree implementation

    We worked on the LSM tree +prototype. In +particular, we focused on tuning the LSM tree design to the different workloads +that consensus has (eg syncing, normal node operation, etc).

    Benchmarking the CSJ prototype

    Work on improving the chain-sync jumping performance is ongoing. In particular +we compared the performance of different jump intervals, which, somewhat +surprisingly, do not make a significant difference. In particular, we are seeing +periodic "plateaus" where the chain-sync tip does not progress, but they are +much longer for the prototype. Our hypothesis is that this seem to be due to a +combination of the garbage collector (GC) pauses, and the actual time it takes +the non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo +fragment.

    In the coming weeks we will try to shorten these plateaus via a combination of +tweaking GC options and less synchronisation in the CSJ governor.

    The following plot shows the performance of the chain-sync jumping prototype +using different jumping intervals. It compares the syncing progress by plotting +the slots of adopted blocks against time. The baseline is still faster, however +it is worth noting that the current prototype already achieves a significant +speedup when compared to the naive approach of simply running full chain-sync +with all peers.

    The second plot shows the syncing progress sliced to a chosen ~5min interval, +and includes, in addition to the slots of adopted blocks, the slots of the tip +of the ChainSync fragment. This allows us to see how far ahead of the selected +tip the CS dynamo is, i.e. how much room we have for BlockFetch not to get +stalled. It shows periodic behaviour (due to the forecasting limit), and shows +that the CS fragment tip is not progressing for significant periods +("plateaus").

    Technical debt

    We clarified a +common source of confusion around VRF tie-breaking and cross-era chain +selection. This PR involved correcting potentially misleading names of +VRF-related functions, and providing context for a particular VRF value is +used for tie-breaking.

    · 3 min read
    Jared Corduan

    High level summary

    We have made the decision to use the +formal ledger repository +in place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure +to the model. In particular, we now have a lot of support for axiomatic set theory. +While the next ledger era is still in the design phase, most of the team remains working +on technical debt. +In particular, we have moved a lot more code out of the Shelley specific modules and into +a ledger core module, we have finished up our benchmarking around the problematic TICKF +ledger transition (while improving the performance), made conveniences to the development +environment, cleaned up all the recent changes to the cost model, added a lot of documentation, +fixed some flaky tests, and deleted some dead code.

    Lower level summary

    Axiomatic Set Theory

    The formal ledger model now has support for much of the set theory that we make use of in +the formal ledger specifications. See [pull-20].

    Completed Technical Debt

    • We have addressed issues with two of our most problematic and flaky tests. +See [pull-3039] and [pull-3093].
    • We have added more documentation and tests to the Twiddler module. This is a module which +makes our CBOR serialization round-trip tests much more robust, and will also hopefully +help enforce the mandate for downstream libraries to never re-serialize data that needs +to be hashed. See [pull-3073] and [pull-3095] +(we cannot merge 3095 just yet, due to a preference for merging other features).
    • We have finished our long analysis of the problematic TICKF transition. +We now have a lot of benchmarks surrounding this code, and have added performance improvements. +See [pull-3068] and [issue-3035].
    • We have restored support for +ghcid +in our repository. This is a tool for developing with Haskell that many of us find greatly +improves our productivity by providing us with constant feedback from the type checker. +See [pull-3112].
    • After much activity on the cost model, we have done some final clean up of the code. +See [pull-3075] and [pull-3101].
    • We moved a lot of the existing user facing documentation regarding native tokens into the +ledger repository, and cleaned it up +(most of the heavy lifting was done by our amazing technical writers). +See [pull-3091].
    • We removed dead code. See [pull-3089].
    • We moved a lot of code from the Shelley specific libraries to the ledger core library. +See [pull-3109] and [pull-3110].
    • We've removed more of the awkward legacy template Haskell names. +See [pull-3108].

    · 2 min read
    Jordan Millar

    2022-11-02 - 2022-11-15

    High level summary

    • Documentation improvments
    • Merged community contributions
    • Exposing types from cardano-api requested by the community/other teamss
    • Test output has been improved so diagnosing failures is now easier
    • Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)
    • Refactoring of cardano-testnet making it more useable as a library (ongoing)
    • Release 1.35.4 was merged & released

    Completed

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    · One min read
    Samuel Leathers

    Node Reelease Update

    2022-10-19 - 2022-11-02

    Executive Summary

    The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset, +a temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8.

    1.35.4 release candidates have been created and are being tested internally and externally.

    Completed

    In Progress

    + + + + \ No newline at end of file diff --git a/page/57/index.html b/page/57/index.html new file mode 100644 index 00000000000..405075c0945 --- /dev/null +++ b/page/57/index.html @@ -0,0 +1,76 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · One min read
    Dorin Solomon

    High level summary

    We have been focused on:

    • Fully opening our test results (on top of the existing tests & tools):
      See cardano-node-tests webpage.
    • Started to test and automate the new functionalities added in the 1.35.4-rc1 node tag
      See test results tracking page.
    • Made some improvements to the automated db-sync sync tests
      See db-sync tests.
    • Multiple cleanups and updates to the cardano-node-tests framework
    • Updated the nightly pipelines for the cardano-node-tests after the Babbage HF

    · One min read
    Kostas Dermentzis

    High level summary

    The DBSync team is preparing a release which introduces schema simplifications, removes indexes, +unique and foreign keys. It also provides a way to fix older values and migrates without the need to +resync from genesis.

    Lower level summary

    Schema simplifications

    Indexes, Unique and Foreign keys are removed in order to speedup syncing +#1295 +The same pr also introduces a different way to rollback, which doesn't rely on foreign keys and +indexes.

    Performance

    The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A +conservative number of these will be included in the next release and the rest can be found in +performance view.

    Migrations and resyncing

    The next release will be 13.1.0, it will enable a migration without the need to resync. It will also +introduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases +#1294

    Release

    The release has been mostly cherry-picked from master +#1294 and its scope can be seen +release view

    · One min read
    Sebastian Nagel

    High level summary

    This week, the hydra team completed several user experience improvements to the +hydra-tui and hydra-node, and delivered a first version of persisted head +states by publishing release version +0.8.0. +Besides this, they met with researchers on topic of the HeadV1 specification and +kicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation.

    What did the team achieve this week

    • Completed the UX improvements on the hydra-tui
    • Released version 0.8.0, which delivers a first version of persisted head states
    • Met with researchers on the HeadV1 specification
    • Started work on the RFP for our external audit

    What are the goals of next week

    • Complete ADR18 implementation and get it merged
    • Start work on event-sourced persistence #580
    • Have a first plutus script gap closed #452
    • Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)

    · 3 min read
    Marcin Szamotulski

    High-level summary

    The team has focused on debuging & fixing bugs for the P2P single relay release, which included

    • diagnosing, fixing and writing tests for a bug in peer-state-actions which +fortunately hasn't been released;
    • diagnosing & preventing misconfiguration of DNS

    We also focused on developing peer sharing. We also held a session with +the scientists on eclipse evasion.

    Detailed description

    P2P Network Stack

    During the past two weeks the team focused on p2p single relay release and peer +sharing. We found and fixed an important bug recently introduced in one of the +components of p2p networking stack (fortunately never released). Together with +a fix, we designed a unit test diffusion simulation as well as quickcheck +property test (both could reproduce it). We also changed the code in a way that +if such a bug is reintroduced in the future, it will be obvious to diagnose. +For more see:

    Initial benchmarking run of the P2P code was executed. The results where +unlike what we see on the mainnet. We found a possible misconfiguration of the +cluster (caused by 0 TTL on domain names), which could be the direct cause of +it. We wrote a PR which rules out such misconfiguration. We are awaiting on +the next benchmarking results. See more at:

    ouroboros-network#4106

    We also started working on P2P single relay release. The PR +ouroboros-network#4120 +includes 108 patches cherry-picked from the master branch. We started +working toward integration these changes against the release branch of +cardano-node. Early next week we ought to be able to have an early version +of cardano-node with non experimental P2P support!

    For more detailed release plan please see P2P - Single +Relay +issue.

    Consensus

    We identified and fixed missing error reporting in consensus +initialisation phase. See more at +ouroboros-network#4015

    Cardano Node

    We also made changes in cardano-node in order to give better experience for +node operators. This includes updating severities of some of the traces as +well as implementing new format of the p2p topology file. For more see:

    Peer Sharing

    We continued working on implementation of peer sharing. We have an early +implementation which will be reviewed and analysed in next weeks. We started +working on cardano-node integration. We need +PR #4392 to be merged +before such integration will be able to land in cardano-node, although this +is not blocking us currently. See more at:

    Eclipse Evasion

    We held a session which included Alexander Russel, Sandro Coretti-Drayton and +Nick Frisby from the consensus team. We discussed high lever design of the +eclipse evasion scheme, which is important for the design and implementation of +ouroboros-genesis. We got a positive feedback from the researchers.

    IO-Sim

    In this period we made little progress towards releasing IO-Sim on Hackage. +A single PR which added +a few missing instances of the STM monad.

    Open Source

    We made sure the CI runs for PRs which comes from forks (which is important to +accept contributions from 3rd parties).

    Mithril Cardano Integration

    We held initial discussions with Arnaud Bailly about possible path to integrate +mithril to cardano-node and take advantage of the ouroboros-network +diffusion layer.

    · 2 min read
    Serge Kosyrev

    High level summary

    On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline.

    On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario.

    Executive summary

    • The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale.
    • The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment.
    • The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.
    + + + + \ No newline at end of file diff --git a/page/58/index.html b/page/58/index.html new file mode 100644 index 00000000000..62a5268d72f --- /dev/null +++ b/page/58/index.html @@ -0,0 +1,95 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 4 min read
    Michael Fellinger

    High level summary

    The SRE team is heavily working on the Equinix Metal migration, replacing Hydra +with Cicero, and a new version of Spongix.

    Lower level summary

    OpenZiti

    • Work is ongoing on our OpenZiti integration into Bitte in [bitte-zt].
    • CI-World deployment of Darwin CI Ziti service in [ci-world-commit-d40f4d].
    • Multiple issues filed, and a lot of discussion with the OpenZiti developers, +we're making pretty rapid progress thanks to them.
    • Work on getting Equinix baremetal machines integrated into AWS World Bitte +clusters utilizing a Ziti ZTNA network overlay to bridge the networking of +the two environments and get IAM extension to Equinix machine for Nomad +client onboarding.
    • A Nix Flake for most of our OpenZiti dependencies including the Console, +Controller, Edge Tunnel, and Router is now at [openziti-bins].
    • The Flake also includes a WiP NixOS modules for these components.
    • Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with +no issues seen so far
    • Moved the console to traefik routing service (zac.$DOMAIN) and +controller/edge router stay at zt.$DOMAIN, but have registered consul +services

    Cicero & Tullia Integrations

    Cicero & Tullia Features

    • Improvements to Tullia task aggregation to make [cardano-addresses] build +correctly.
    • Better tullia CUE lib default for tags [tullia-commit-4df3c5d].
    • Put cache.nixos.org back in cache.iog.io's upstreams. This is now +considered a public cache again, and without it some Cicero evaluations had +to build huge packages.
    • Started working on a flake-parts module for Tullia.
    • Started working on cutting down Tullia task build time by putting facts in +JSON files.
    • Fixed running into kernel arg limit by reading tullia's DAG from a file
    • Merged [tullia-pull-9] that fixes several issues related to error reporting. +and escaping.
    • Added Mac builders in Cicero on CI-World.
    • Started work on Tullia invocation caching.

    Spongix

    • A lot of progress on an SQlite backed version of Spongix, it already supports +the full HTTP binary cache protocol but still lacks comprehensive testing and +some tuning, as well as recursive lookups.
    • First steps in the implementation of the nix-daemon ssh-ng protocol so +Spongix can be used via SSH and we can get rid of basic auth.

    Bugs

    • Discovered Cicero bug where Nomad reschedules cause the Github commit status +to get stuck in pending
    • Discovered Cicero race condition bug around concurrent transactions for +codependent actions.
    • Fixed tullia task order bug in [cardano-addresses]
    • Diagnose Cicero action not triggered in [abcirdc]
    • Fixed meta/description of the Tullia package in [tullia-pull-7]
    • Add Vault token loop alerts in [bitte-cells-pull-40]
    • Ongoing investigation on recurring Patroni and nomad-follower issues related +to token rotation.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level overview

    The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to +meeting the acceptance criteria in cardano-base, +which lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and +we are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution, +but also progressing on the implementation.

    Low level overview

    SECP built-ins

    • (missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in PR 313
    • CIP-0049 was addressed in the editors meeting, and PR 250 was merged
    • The unit-tests PR 320 is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.

    KES agent

    • We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them.
    • We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).

    · One min read
    Sebastian Nagel

    High level summary

    This week, the hydra team reviewed and addressed several open comments on the +new HeadV1 specification, completing a list the of identified gaps between +specification and implementation while doing so. In the wake of the recent +demonstration of SundaeSwap running their DEX in a Hydra Head, they met with +them to capture feature ideas & incorporate their feedback on the roadmap, as +well as potential research avenues.

    What did the team achieve this week

    What are the goals of next week

    • Complete the last two items required for a version 0.8.0.
    • Cut the next release, version 0.8.0
    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Have the CI build macos artifacts

    · 2 min read
    Jordan Millar

    2022-10-19 - 2022-11-01

    High level summary

    This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:

    • Ask the node about the current mempool's capacity and sizes
    • Request the next transaction from the mempool's current list
    • Query if a particular transaction exists in the mempool

    Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric tx_submit_fail_count has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:

    • Documentation improvments
    • Release 1.35.4 was merged & released
    • Exported various types from cardano-api that were requested by community members

    Completed

    cardano-cli

    cardano-api

    cardano-submit-api

    cardano-node

    cardano-testnet

    • None

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    · 4 min read
    Damian Nadales

    High-level summary

    During the past two weeks, the consensus team worked on adding property test for +different aspects of the UTxO HD prototype: era transitions, mempool, and +backing store. Thanks to these tests we were able to uncover a bug in the +prototype. On the Genesis front, we benchmarked a different version of the +ChainSync jumping prototype to try to improve its performance, but this did not +result in any noticeable speedup.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We focused on increasing test coverage for the UTxO-HD prototype:
        • We started implementing Cadano-eras transition property-tests.
        • We started implementing state-machine property-tests for the mempool.
        • We merged the mempool rewrite.
        • We started working on state-machine tests for the backing store. This +uncovered a bug in the range-read implementation of the LMDB backing +store.
    • Genesis: on track.
      • We benchmarked a version of the Genesis ChainSync Jumping prototype that +spreads out the ChainSync updates over a longer period of time. This did not +result in any noticeable speedup.
      • We investigated the overhead introduced by non-ChainSync components, but no +conclusions could be drawn from the benchmarks we ran.

    Workstreams

    Finish the UTxO HD prototype

    We focused on increasing test coverage for the UTxO HD prototype. We also merged +the mempool +rewrite.

    Era transition property tests

    We started implementing Cardano era transition property +tests, +which are needed for making sure that the ledger tables get updated in the +right way when we move from one era to the next. There are at the moment two +important transitions.

    • Byron to Shelley: where all the UTxO is transferred from in-memory Byron +state (which has no tables) to the ledger tables of the Shelley state.
    • Shelley to Allegra: where the AVVM addresses must be deleted.

    We have tests for the Byron to Shelley transitions. We are working on adding +the remaining ones.

    Mempool state-machine tests

    We started implementing state-machine property tests for the +mempool. +The mempool is currently tested via pure property tests, and use a ledger +state without tables. With the introduction of UTxO HD, testing the concurrent +behavior of the mempool became of crucial importance (eg now we have to +acquire locks to flush the backing store). In addition, we need to test a +ledger state with tables. These needs led to the creation of a new set of +property tests. In particular we aim to run parallel state-machine tests that +exercise the mempool in a way similar to how the node would make use of it.

    Backing store property tests

    We started working on state-machine tests for the backing +store that UTxO +HD uses. The property tests uncovered errors in the range-reads implementation +of the LMDB backing store. To facilitate fixing this bug, we made +changes to the Haskell +LMDB bindings.

    Benchmarking the CSJ prototype

    Prompted by previous benchmarks showing significant improvements in sync time by +using more capabilities, we implemented a way to spread out the ChainSync +updates over a larger period instead of firing them all at the same time. This +didn't result in a noticeable speedup.

    We also benchmarked the prototype with CSJ disabled (such that just the dynamo +peer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule +out/confirm overhead by non-ChainSync (mainly BlockFetch) related components. +This results in era-specific behavior (speed is like the prototype in Byron, but +like the baseline in Shelley). This deserves a closer look in the future.

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    • Red: baseline
    • Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps.
    • Blue: like Green, jumps are spread out.
    • Orange: variant with no jumping, to measure unrelated overhead.

    + + + + \ No newline at end of file diff --git a/page/59/index.html b/page/59/index.html new file mode 100644 index 00000000000..5870db1c67d --- /dev/null +++ b/page/59/index.html @@ -0,0 +1,100 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Sebastian Nagel

    High level summary

    This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the hydra-node over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks "past the opening of a Head". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.

    What did the team achieve this week

    • Last week we thought we were done with ADR18, but were not ...
    • ... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence.
    • Implemented a first version for persistence #187 in response.
    • Enhanced CI to publish test results on our website
    • Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!
    • Pulled static executable feature #200 into scope, implemented it and merged it!
    • Received and read through a project proposal by a vendor (building a Hydra platform).

    What are the goals of next week

    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Cut the next release, version 0.8.0
    • Address open comments on specification document & complete the list of identified gaps between specification and implementation #452
    • Have the CI build macos artifacts

    · 3 min read
    Jared Corduan

    High level summary

    The ledger team is still primarily focused on addressing +technical +debt. +We now have the infrastructure for versioning our serialization schemes, +which we continue to put into action. +We have made first steps towards getting proper support for the +formal ledger repository +(in particular, we've added nix builds and +continuous integration support). +We are wrapping up an investigation of the performance of a critical +function used by the consensus layer for leader checks. +Finally, we are improving the packaging and versioning of our code.

    Lower level summary

    Completed Technical Debt

    • Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of +our code lives in the cardano-ledger-shelley package, though with hindsight we can say that +much of it should live in cardano-ledger-core. +We continue to move things to cardano-ledger-core, and have much more to come. [pull-3059]
    • We now have the infrastructure to support versioned serialization schemes. +The inability to do this has caused us a lot difficulties, +such as [issue-3003], [issue-2965] and [issue-2444]. +We are still in the process of switching to the versioned serialization scheme +(such as [pull-3078]), +but the infrastructure was completed in [pull-3063].
    • We now have proper nix and CI support for the formal ledger project. [pull-19]
    • A separate team is helping bring support for +CHaP +to all the cardano-node repositories. +We have been helping out with this effort.
    • A separate team continues working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. +We have been helping out with this effort.

    In-progress Technical Debt

    We also have several fairly large pull-requests in review +that we are working on.

    • In an on-going attempt to build out a more user-friendly API, +we continue to remove HasField instances in place of using micro-lenses. +The protocol parameters, in particular, are being worked on. [pull-3045]
    • We are also renaming record fields to be consistent across the repository. [pull-3062]
    • We are now cleaning up all the work we did to understand the performance +of the TICKF transition. We have some improvements to the computatation +as well. [pull-3068]
    • We are adding more documentation, in particular to our Twiddler functionality. [pull-3073]
    • The formal ledger is adding support for finite set theory. [pull-20]

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks, the consensus team worked on improving the +performance of the ChainSync jumping logic, which is needed for Genesis. We also +rewrote the implementation of the mempool in the UTxO HD prototype which solved +the issues that prevented us from running system level benchmarks. Also on the +UTxO HD front, we have an improved implementation of the sequence-of-differences +(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for +the UTxO HD feature.

    Executive summary

    • With the latest implementation of ChainSync jumping we are closer to the +baseline performance. In particular, the prototype seems to benefit from the +extra concurrency provided by additional capabilities.
    • We rewrote the implementation of the mempool in the UTxO HD prototype. This +rewrite was required due to performance problems we observed when running the +workbench. +These performance problems prevented us from running system level benchmarks. +The rewrite solved these issues. After the UTxO-HD: mempool +rewrite PR is +merged, we will contact the Benchmarking team so that they run the system +level benchmarks.
    • The implementation of sequences of differences based on anti-diffs was +integrated into the UTxO HD prototype. It is pending +review and +we also need to run replay and syncing benchmarks to confirm that this will +deliver a performance improvement, as observed in our micro-benchmarks.
    • The UTxO HD prototype +inspection +resulted in a list of +tests +needed for consensus to consider the UTxO HD prototype as fully tested.

    Additional information

    Genesis

    Benchmarking setup: 50MBit/s, 50ms latency

    • Red: baseline
    • Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.

    As ChainSync Jumping involves many concurrent network operations at every jump, +we tried to run the node with 6 instead of the default 2 capabilties.

    • Orange: baseline with 6 capabilities
    • Blue: CSJ prototype with 6 capabilities

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    Further work includes whether we can tune the prototype to better handle few +capabilities, or to adapt the default number of capabilities (potentially just +while syncing).

    · 2 min read
    Kostas Dermentzis

    DBSync Update

    Fast restarts

    We fixed a long overdue issue in db-sync which caused long delays on restarts +1266. This has been +one of db-sync main objectives for this period. Restarts are now very fast, +because db-sync deletes almost nothing from the db, it just replays the ledger rules until it +reaches the tip of the db. The fix also improves reconnection speed, in cases where the node +restarts or the connection is temporarily lost. It also speeds up even more in cases where due to a +deployment mess up a very old snapshot or no snapshot at all is used.

    Property based testing

    We added stateful property based testing, using quickcheck-state-machine +1269. These tests use empty or +almost empty blocks to test the new behaviour of restarts and rollbacks.

    These tests generate arbitrarily a list of symbolic commands from these:

    RollForward Int
    RollBack BlockNo
    StopDBSync
    StartDBSync
    RestartNode
    AssertBlockNo BlockNo

    The commands are translated into real commands. For example RollForward Int will forge a new block +that fits on the current chain. These real commands are executed against db-sync using the mock +chain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync +which looks like this:

      Model
    { serverTip :: BlockNo
    , dbSyncTip :: BlockNo
    , dbSynsIsOn :: Bool
    , dbSynsHasSynced :: Bool
    }

    Finally a number of postconditions are checked, related to the eventual block number of db-sync.

    Tech Debt

    We handled a number of tech debt in +1275 +This improves the code format of db-sync, deletes many queries that were never used and groups the +others. This tech debt resolution not only improves the experience of working in db-sync, but can +facilitate some of our other objectives, as it makes it very explicit which queries are used +during syncing and which indexes are necessary.

    Smash

    We worked on fixing an issue related to fetching pool metadata +1276. +The issue which is described in +1270

    · One min read
    Jordan Millar

    Node-Api-Cli Update

    2022-10-04 - 2022-10-18

    Executive Summary

    The majority of the team's time was spent between getting 1.34.4 ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to cardano-cli.

    Completed

    cardano-cli

    cardano-api

    cardano-node

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    + + + + \ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html new file mode 100644 index 00000000000..f31985103b6 --- /dev/null +++ b/page/6/index.html @@ -0,0 +1,37 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Marcin Szamotulski

    High-level overview of sprint 47

    Bootstrap Peers

    We continued to review the process of bootstrap peers, see ouroboros-network#4555

    CI / Tests

    We investigated our CI issues. We found a memory leak in typed-protocols +function used for testing codecs which triggered out of memory manager (OOM) on +some platforms (typed-protocols#43); we also found a bug in the connection manager which resulted in CI +timeouts (see connection-manager-fix).

    KeepAlive client

    We found two small issues with the keep-alive client, which were addressed +by Karl Knutsson (Cardano Foundation), ouroboros-network#4689.

    Galois

    We merged two large PRs prepared by Galois:

    Cardano Network Service Assurance (CNSA)

    Galois made the following progress on CNSA:

    • a simple [InfuxDB] database backend has been added;
    • the documentation has been updated;
    • internal improvements to the code;
    • progress on a new "CSNA analysis" that provides, for each sampler node, the +block download throughput in bytes over time.

    New CHaP Release

    We cut a new release of ouroboros-netowrk packages to CHaP: chap#547

    More details

    CI / Tests

    We improved the memory footprint of some of our tests by analysing a stream of +IOSim traces without retaining them, see ouroboros-network#4696

    As a safety measure, we introduced an upper bound for heap memory used by test +artefacts in our nix tests. We use 200MB limit for all tests except for +network-mux tests which use 350MB limit, see ouroboros-network#4702.

    We refactored one of our tests to use ephemeral ports thus allowing it to +run concurrently, see ouroboros-network#4702.

    We merged ouroboros-network#4623 which fixes a bunch of test failures.

    All of them were due to a bug in test logic rather than a bug in production +code.

    Release Process

    We updated our release process & associated scripts, see +ouroboros-network#4705.

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the cardano-playground stack

    Lower level summary

    Capkgs

    • Adds offchain-metadata-tools, dbsync sanchonet updates: capkgs-compare

    Cardano-parts

    • General package updates, modules improvements and template recipes to support network migration from world to playground cardano-parts-pull-17
      • Bumps cardano-db-sync-ng to sancho-2-0-0 tag
      • Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play
      • Adds more machine system bins and devShell bins for scripting and debug purposes
      • Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module
      • Adds profile-cardano-node-topology module for a simplified interface to most common topology needs
      • Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs
      • Adds a topology function to filter self from group machines with an allowList for matching infixes
      • Adds metadata-server and related offchain-metadata-tools bins from capkgs
      • Updates justfile template with:
        • a new query-all recipe for getting status of multiple concurrent running environments
        • a new set-default-cardano-env recipe for fast switching between environments
        • a new start-demo recipe for forking a custom env into conway
        • a new start-node recipe for generic environment start
        • a new stop-node recipe for generic environment stop
        • updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions
        • updated query-tip recipe to a generic query tip compatible with each environment

    Cardano-playground

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team released a new distribution 2342.0. This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes.

    They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files.

    Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the release-mainnet aggregator, and enhanced the Mithril explorer UI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Completed the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Worked on the issue Fix devnet Mithril Docker images #1272
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Worked on the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Display a summary of signers before the full list in explorer #1133
    • Completed the issue Add certificates list in explorer #1184
    • Completed the issue CoreVerifier setup does not compute total_stake correctly #1306

    · 2 min read
    Carlos LopezDeLara

    2023-10-11 - 2023-10-24

    High level summary

    CARDANO-CLI

    • Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified.
    • stake-address-info now shows deposits balance.
    • Added conway governance action view to allow to inspect governance action files before submitting them on a transaction.
    • build-raw support for --vote-file and --proposal-file

    CARDANO-API

    • Support DRep extended keys
    • Support Plutus V1 in Conway

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023.

    In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON. +This improvement offers users greater flexibility and ease of interaction with the API.

    Finally, the team has followed up on the TUI brick upgrade to version 1.10. +This effort has resulted in addressing minor details and enhancing the overall user experience with the TUI.

    What did the team achieve this week

    • Prepare presentation and workshop for Cardano Summit.
    • More TUI fixes and improvements.
    • Upgrade GHC from 9.2.8 -> 9.6.2 #1105
    • Solved user issue related to submitting transactions in cbor format #1111.
    • Fix hydraw connection issue making it more stable #1121.

    What are the goals of next week

    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.
    + + + + \ No newline at end of file diff --git a/page/60/index.html b/page/60/index.html new file mode 100644 index 00000000000..2aa50eba4e2 --- /dev/null +++ b/page/60/index.html @@ -0,0 +1,178 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Jared Corduan

    Ledger Update

    We have continued focusing nearly entirely on addressing technical debt. +A lot of design work has begun for the next ledger era, +but we do not yet have anything concrete to share.

    Technical debt issues completed

    • [issue-1676][pull-2992] We have finally removed the ledger dependency on the +cardano-prelude package. It was barely used in the ledger repository, and it added a dependency +that we did not want to maintain. It was a bit difficult to remove, and we had +to coordinate removing it from cardano-base. +A lot ended up going into pull-2992, due to the coordination effort, and we ended +up updating Plutus as well. +This means that we've now also made a lot of progress on the problematic cost model serialization +issues described in issue-2902. +In particular, after we resolve issue-3014, we will not have to wait an epoch before +releasing a cost model for a new version of Plutus, as we had to do for the Vasil HF.
    • [issue-3046][pull-3055] We moved a module that is now only used in Byron to a Byron package.
    • [issue-3047][pull-3054] We improved the interface to the Value (multi-asset) type.
    • [pull-3044] We debugged and fixed a tricky compilation issue. Certain kinds of field updates +were adding approximately 20 minutes to our compile time!
    • [issue-2932][pull-3036] As a part of our ongoing re-organization of the codebase, we +have added a Cardano.Ledger.[Era].Core module to each ledger era that has a TxBody class. +Most classes defined in the era should go in this new module. +We also re-export the Cardno.Ledger.Core module and the previous Cardano.Ledger.[Era].Core +modules from each era.

    Technical debt in progress

    • [issue-3034][issue-3035][node-issue-4421] We are continuing to write benchmarks to understand exactly where +all the time is being spent on executing the TICKF transition. +The consolidation of the per-stake-credential stake distribution to the per-stake-pool +distribution does seem to account for a large amount of time (near a second as written, which we +have down to about half a second with some optimizations), +but this does not account for everything. +Applying the reward update may also be a big contributing factor.
    • [pull-3033][pull-3038][pull-3041] A separate team is working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort.
    • The nix scripts used to build our new +formal ledger model +do not work consistently for everyone, and we have been working on fixing these issues.
    • [issue-3014] We are still working on adding a versioning scheme to all of the ledger +serializers.

    · 3 min read
    Marcin Szamotulski

    Network Update

    Ouroboros Network

    Ouroboros Consensus

    • Recently we found out that the consensus does not log exceptions thrown during +intiialisation. This was fixed in +PR input-output-hk/ouroboros-network#4015 +As part of this pull request we also changed that all exceptions rethrown by +the connection handler thread are wrapped in ExceptionInHandler.

    Some older items, which were not announced

    • We identified and fixed an issue related to socket activation (socket options +where not set for sockets passed through socket activation). +PR input-output-hk/cardano-node#3979 +This fix will be released in the next cardano-node release.

    Cardano Node

    • We extended the NixOs service module so that one can modify socketPath, +runtimeDir, databasePath, traceSocketPathAccept, +traceSocketPathConnect and stateDir options. +PR input-output-hk/cardano-node#4196

    IO-Sim

    We resolved a number of issues before release of io-sim on hackage:

    See PR #24.

    We also improved experience for contributors of io-sim and typed-protocols by adding issue templates:

    Typed Protocols

    Input Endorsers Simulation

    New features include:

    • Histograms of block arrival frequency, for both network (inbound) and CPU +(block validation). This is interesting to check that we're not overloading +the CPU block validation capacity, or network link capacity. Or alternatively +to observe the behaviour in an overload situation if we set the block +generation rate high enough.

    • Pie chart of utilisation of TCP links. This shows how small a fraction of +links are being used at any one time, and shows that once the system "warms +up" and is operating stably, most block delivery is ballistic.

    • Showing off the new screen layout combinators, that let us put multiple +charts, titles etc on screen at once and scale them to whatever screen or +video resolution we like without having to tweak numbers (this example is +scaled to fit 1080HD video resolution).

    · 4 min read
    Damian Nadales
    • We proposed a fix for the performance degradation observed when running +distributed multi-node benchmarks in the UTxO HD feature branch. While this +fixed the problems observed when running local benchmarks, it broke the +ThreadNet tests due to concurrency issues. Therefore, we think it is wise to +start redesigning the UTxO HD mempool integration.
    • We did several rounds of code review on the alternative implementation of +diff-sequences required by the UTxO HD feature based on the idea of +anti-diffs. This alternative implementation is close to being merged, and the +next step is to integrate this to the UTxO HD branch, so that we can run +ad-hoc replaying and syncing from scratch benchmarks and compare these with +the baseline. The micro-benchmarks we elaborated for the alternative +implementation show speedups of up to 4x, so we are optimistic about the +performance of replaying and syncing from scratch benchmarks, however it is +important to notice that due to the nature of UTxO HD we will still be +slower than the baseline.
    • The final draft of the Genesis implementation specification is ready for +review.
    • We implemented a prototype for the happy path of Genesis' ChainSync Jumping +(CSJ). The prototype is slower than the baseline, however it is not the latest +version of the prototype and the jump interval is very small.
    • Work on integrating Conway has stopped since +priorities have changed.
    • We started work on benchmarking epoch-boundaries and epoch overhead +pr-4014. To this end, we made use of a modified version of our +db-analyser tool. We ran the new benchmarking setup using the Cardano +mainnet chain, and we can see that block tick and application take +substantially longer at epoch boundaries, although there are a couple of slots +during an epoch in which these computations take more than normal. We notified +the ledger team about these findings. We will use this modified version of +db-analyser to investigate the epoch overhead.

    Workstreams

    UTxO HD

    • Spent quite some time investigating the root cause of the degradation in +performance observed in the benchmarks. We run the make forge-stress +benchmarks locally in order to debug this behavior.

      • Transaction batching doesn't make a notable difference in the outcome +(considering we are using the in-memory backend).

      • The mempool batching implementation required asynchronous transaction +validation which is a violation of the LocalTxSubmission protocol +contract and therefore if we continued on that route, the impact would +have been quite big.

      • The STM logic we implemented by using a TMVar for the mempool internal +state was buggy and under certain circumstances it seemed to lock. +Reverting the mempool internal state to be stored in a TVar seems to +solve this problem.

      • The results we get after this change look almost identical to the ones +from the baseline.

    • The anti-diff prototype (PR +#3997) has +been reviewed and is close to being merged.

      • A follow-up issue (issue +#4010) +to integrate the anti-diff prototype in the various consensus packages +was created. A first version of the integration exists, and all tests +pass. A next step is to get some indication of the "real" performance gain +by profiling db-analyser (or cardano-node).

    Genesis

    • Final draft of the Genesis implementation specification, now up for review.

    • Local benchmark setup for parameter tuning via the happy path ChainSync +Jumping (CSJ) prototype (Issue 3987).

      • Context: Our Genesis design requires us to check in with a large (~20) +number of servers periodically while syncing. These servers are offered +jump requests via the ChainSync protocol (hence the name), which they can +accept or decline. If a peer declines, the Genesis rule allows us to +determine whether a node actually has a better chain.

      • The "happy path" is when no peer declines a jump. We want this to have +close to no overhead compared to status quo, i.e. syncing without Genesis.

      • We implemented a prototype for this happy path, and are now starting to +test in various configurations (number of peers, latency, bandwidth) to +tune the performance of ChainSync jumping, i.e. how complicated our logic +of choosing when to jump needs to be.

        Example:

      • Simulated connection: 50 MBit/s, 50ms latency

      • Jump interval: 3000 slots (on the low end, could be increased to up to +3k/f)

      • Red: baseline (1.35.3), one peer in topology file

      • Blue: Preliminary version of our prototype, with 10 peers.

        It is slower by about ~30%, but it is not the latest version of the +prototype, and the jump interval is very small, making CSJ more of a +bottleneck.

    Technical debt

    • Fix flakiness in ChainDB QSM tests (PR 3990).

    · 2 min read
    Kostas Dermentzis

    DBSync Update

    New Tag

    We created a new db-sync tag 13.0.5 which addresses shortcomings of the last +release 13.0.4. It is currently under testing. +The Changelog is +here and in more details:

    • We fixed fees for tx with phase 2 failure that didn't include a total collateral field. +1248

    • We fixed an issue that could cause db-sync to crash if a specific rollback occured. +1247

    • DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but +could result in the wrong CBOR encoding being inserted. +1217

    • All the fixes above come with unit tests which validates the fix.

    • Added support for preprod and preview from docker. DBSync no longer needs to include the configs +for different networks, these are directly fetched from the cardano world. +1254

    • We added better support from docker for the new disable options and the overall documentation. +1260

    All the above were also backported to the master branch

    Open source

    We made the db-sync board public, so +everyone can have access on the issues we prioritise. +We also added new tasks to the board, some of them could be approachable to newcomers or people who +want to contribute.

    Progress on tech debt and new features

    • 1223 was merged, which removes the +foreign keys from the db schema. This opens the road to a number of optimizations.

    • An additional fix on top of the previous work was added +1250

    • An initial version where DBSync does not rollback on restart is done here +1266. +This allows db-sync to restart much faster, without the need to delete data and reinsert them. In +the future it can also facilitate migrations in cases where the ledger snapshots have a breaking +change, without the need to resync everything from genesis.

    · 2 min read
    Jared Corduan

    Ledger Update

    We have been focused nearly entirely on addressing technical debt.

    • We introduced more consistent naming across eras, this time for the auxiliary data. +See 3032.
    • We made clear how the consumed functions differs between eras (which was a previous source of +confusion), and added some related support to the fledgling ledger API. +See 3016.
    • We added clarity and organizational consistency to the main ledger era type synonyms. +See 3017.
    • We removed code duplication related to the input data hashes. +See 3018.
    • We split up a large module into smaller components. The large module was actually causing our +CI to time out. +See 3020.
    • We cleaned up stale information in our cabal files, and upgraded cabal 3.8. +See 3023, +3031, +and 3028.
    • We made consistent, standalone TxOut (transaction output) modules for every era. +See 3024.
    • We brought consistency to a maddening inconsistent use of type variables indicating the specific +choice of cryptographic primitives. In particular, all uses of crypto have been renamed to c. +See 3027.
    • We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric +types that will compose better in the future and which simplifies the constraints. +See 3029.
    • We consolidated some existing fragmented logic regarding how we gather the scripts needed for a +given transaction. This is a much needed cleanup to prevent future mistakes. +See 3019.
    • We fixed a problem with our generators that was causing a fair number of our property tests to +fail in CI. +See 3039.
    • We have started the work to update Plutus. This will bring support for SECP in the next major +protocol version, and also address a +problem +that we current have evolving the cost models. +See 3030.
    • We addressed a small issue that came up when integrating the conway era downstream, namely +the lack of some serialization instances. +See 3022.
    + + + + \ No newline at end of file diff --git a/page/61/index.html b/page/61/index.html new file mode 100644 index 00000000000..552caced08e --- /dev/null +++ b/page/61/index.html @@ -0,0 +1,144 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Jared Corduan

    Ledger Update

    Since finishing up support for the Vasil Hardfork, the ledger team has been +focused on two main things: a new ledger era and technical debt.

    New minimal ledger era

    We have implemented a new ledger era named conway which is nearly identical +to the babbage era. This has been the first time that we have been able to see +what a minimal ledger era looks like. We have finished this task, modulo any +integration issues that might come up. The only thing that the conway era +does differently from the babbage era is provide support for rotating +the master keys using the hardfork combinator's state translation. +We may end up adding features to the conway era, but it is a nice exercise +seeing what it looks like to get a minimal ledger era supported in all the +downstream components.

    Addressing technical debt

    We have been addressing technical debt, mostly in an effort to make the +repository a more friendly code base to work in.

    • We have begun work on a ledger API, called cardano-ledger-api.
    • We have done a big re-design of the major type classes used in the ledger. +With hindsight on our side, we now have something much more organized and +easier to use.
    • We have done a lot of re-naming. The names across eras are now much more +uniform, avoid certain confusions that plagued us, and are clearer in where +they are from.
    • We have reduced a lot of code duplication that could lead to bugs if you +do not have the whole code base in your head.
    • We have added a handful of performance improvements.
    • We added type safety in a number of locations. In particular, the type of +values that can be minted in a transaction no longer allow for Lovelace +in the type, and some functions which used to handle both timelock scripts +and plutus script now correctly enoforce at the type level that only one of +them can be used.
    • We made our generators so that they now produce a much richer set of +valid serializations. There is room within CBOR to serialize the same +data structure in multiple ways, and it is helpful to have the generators +use a wide variety.
    • We have begun re-organizing our test suites.

    · 9 min read
    Damian Nadales

    Executive summary

    • We did most of the heavy lifting required to integrate the Conway era.
    • We have property tests for the UTxO HD backing store API implementations. A +possible bug was identified. Work is ongoing to make sure the property-tests +cover all the relevant cases.
    • We implemented and benchmarked the "anti-diff" prototype to speed up the UTxO +HD functionality. Results show a rough speedup of 4x to 5.5x across +several scenarios. Note that: "Data reported by tasty-bench is only of +indicative and comparative significance.". +We are investigating additional performance improvements. The "anti-diff" +prototype and benchmarks are still pending code review.
    • We elaborated a draft specification for the Genesis implementation and +ChainSync jumping optimization.

    Workstreams

    Conway

    • Integration PR of the minimal Conway era (Issue #3963, PR +#3971).
    • Discussions with Ledger revealed possible sources of confusion about which +data should be changed in the Conway era. As a result, a new technical debt +issue was raised, which does not block the integration of the Conway era +(Issue #3976).

    UTxO HD

    • Issue #3954, branch: The functionality of a +backing store, which is the interface to the on-disk part of ledger state in +UTxO-HD, is tested at a high level through the OnDisk tests. However, some +functionalities remain untested, e.g., reads of ranges of keys. As such, we +have implemented quickcheck-state-machine tests that exercise backing stores +directly. The tests are reusable for different backing store implementations +because the tests are implementation-agnostic: Any backing store that conforms +to the backing store interface can be plugged into the tests. Work is still +ongoing to label/monitor the tests, such that we can verify that interesting +cases are being tested. Furthermore, a possible bug has been identified in the +LMDB backing store with respect to range reads, though the bug has not been +resolved yet.

    • Issue #3946, branch, PR #3882: The +"anti-diff" prototype proposes an alternative approach to keeping track of +sequences (more specifically, FingerTrees) of diffs. These diff sequences +are a component of the in-memory parts of the ledger state in UTxO-HD. Since +the consensus code often requires the cumulative diff of a sequence of diffs, +the current implementation "caches" cumulative diffs of each subtree in the +diff sequence. This caching allows relatively fast reconstruction of the total +cumulative diff, but this caching proved to incur a non-negligible cost: when +we manipulate diff sequences through splits and appends, we force re-computing +a logarithmic number of caches. This is problematic, since we often split and +append in consensus: we split when we flush diffs to a backing store or when +we roll back blocks, and we append when pushing blocks. The new approach +should reduce the overhead of this caching.

      We implemented micro-benchmarks for the "anti-diff" prototype: we +first generate a sequence of commands (Forward, Push, Flush, or +Rollback) through a simulation, after which we measure the performance of +applying the commands to a diff sequence. In this context, Forward means +forwarding of values through a diff, whereas Rollback means switching to +a different fork by rolling back diffs/blocks and pushing new ones. +Moreover, we compare the performance for the two implementations: the +"legacy" approach, and the anti-diff approach.

      Some preliminary results were positive, but we needed to revisit the +benchmark's configuration to obtain more definitive results. After a +discussion with @dcoutts and the consensus team about this configuration +(e.g., number of commands generated, choice of the security parameter k), +the benchmarks should now be closer to the realistic setting. The following +configuration specifies the default configuration that is used in the +benchmarking code:

      • Number of commands generated: 10_000
      • Security parameter k: 2160
      • Number of initial backing values: 100
      • Number of key-value pairs deleted by a push: 50
      • Number of key-value pairs inserted by a push: 50
      • Number of key-value pairs forwarded by a forward: 50
      • Probability of a large (in the range [1000, 2000]) rollback: 0.05
      • Probability of a small (in the range [1, 10]) rollback: 0.95
      • Order of commands:
        • An equal number of forward and pushes.
        • 1 flush every 10 pushes.
        • 1 rollback every 100 pushes

      Moreover, we run four benchmark scenarios:

      • Default configuration
      • Without rollbacks
      • With only small rollbacks
      • Without rollbacks, larger flushes (1 flush every 100 pushes)

      How to read results

      Note: this section uses documentation from the +tasty-bench package to +explain how to read the results of running our benchmarks.

      Running a benchmark scenario gives us the following (curated) output:

      ...
      AntiDiff: OK (18.27s)
      2.527 s ± 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x
      LegacyDiff: OK (32.73s)
      10.829 s ± 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory
      ...

      The output says that the first benchmark, which exercises the anti-diff +prototype, was repeatedly executed for 18.27 seconds (wall-clock time), +its predicted mean CPU time was 2.527 seconds and means of individual +samples do not often diverge from it further than ± 47 milliseconds +(double standard deviation). We also configure the RTS to collect GC +statistics, which enables tasty-bench to estimate and report memory usage. +This data is reported as per RTSStats fields: allocated_bytes, +copied_bytes and max_mem_in_use_bytes. So, the output of the first +benchmark says that a total of 2.1 GB of memory was allocated, that a +total of 544 MB of memory were copied, and that the peak memory in usage +was 2.2 GB. We read the output for the second benchmark in the same way.

      Furthermore, the benchmark compares the mean CPU times for +both the anti-diff and legacy approaches: In this case, the mean CPU time +for the anti-diff approach is ~0.23x the mean CPU time for the legacy +approach. Conversely, the mean CPU time for the legacy approach is +1 / 0.23 ~= 4.35x the mean CPU time for the anti-diff approach. We will +call 0.23x the improvement factor. We will call 4.35x the speedup.

      Note that these improvement factors (and reported results) are subject to +noise, randomness, the specific configuration parameters, and the whims +of statistics. Data reported by tasty-bench is only of indicative and +comparative significance.

      Results

      For each of the 4 scenarios, we list the results of running the anti-diff and +legacy approaches 5 times. We run the benchmarks 5 times to get an indication +of whether the results are similar across multiple runs. Furthermore, we +calculate the accompanying ranges (if applicable) of improvement factors and +speedups.

      Note also the decrease in total bytes allocated and total bytes copied for +the anti-diff approach compared to the legacy approach.

      Default configuration

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff2.533 s (0.23x)4.7 ms2.1 GB557 MB2.4 GB
      Run 1: LegacyDiff10.792 s162 ms6.8 GB2.3 GB2.4 GB
      Run 2: AntiDiff2.508 s (0.23x)245 ms2.1 GB515 MB2.2 GB
      Run 2: LegacyDiff10.850 s30 ms6.9 GB2.3 GB2.2 GB
      Run 3: AntiDiff2.562 s (0.23x)5.0 ms2.1 GB552 MB2.2 GB
      Run 3: LegacyDiff10.993 s149 ms6.9 GB2.3 GB2.2 GB
      Run 4: AntiDiff2.168 s (0.22x)5.3 ms1.8 GB434 MB2.0 GB
      Run 4: LegacyDiff9.976 s39 ms6.3 GB2.0 GB2.0 GB
      Run 5: AntiDiff2.527 s (0.23x)47 ms2.1 GB544 MB2.2 GB
      Run 5: LegacyDiff10.829 s148 ms6.8 GB2.3 GB2.2 GB
      • Improvement factor: [0.22, 0.23]
      • Speedup : [1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]

      No rollbacks

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.638 s (0.19x)36 ms1.4 GB181 MB2.4 GB
      Run 1: LegacyDiff8.656 s207 ms5.7 GB1.5 GB2.4 GB
      Run 2: AntiDiff1.638 s (0.19x)75 ms1.4 GB181 MB2.2 GB
      Run 2: LegacyDiff8.654 s322 ms5.7 GB1.5 GB2.2 GB
      Run 3: AntiDiff1.663 s (0.19x)74 ms1.4 GB181 MB2.2 GB
      Run 3: LegacyDiff8.799 s216 ms5.7 GB1.5 GB2.2 GB
      Run 4: AntiDiff1.645 s (0.19x)51 ms1.4 GB181 MB2.0 GB
      Run 4: LegacyDiff8.732 s261 ms5.7 GB1.5 GB2.0 GB
      Run 5: AntiDiff1.639 s (0.19x)19 ms1.4 GB181 MB2.2 GB
      Run 5: LegacyDiff8.653 s234 ms5.7 GB1.5 GB2.2 GB
      • Improvement factor: 0.19
      • Speedup : 1 / 0.19 ~= 5.25

    Only small rollbacks

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff1.833 s (0.18x)36 ms1.5 GB185 MB2.4 GB
    Run 1: LegacyDiff10.362 s867 ms5.8 GB1.6 GB2.4 GB
    Run 2: AntiDiff1.696 s (0.19x)30 ms1.5 GB185 MB2.2 GB
    Run 2: LegacyDiff8.822 s106 ms5.8 GB1.5 GB2.2 GB
    Run 3: AntiDiff1.702 s (0.19x)44 ms1.5 GB186 MB2.2 GB
    Run 3: LegacyDiff8.906 s147 ms5.8 GB1.5 GB2.2 GB
    Run 4: AntiDiff1.701 s (0.19x)47 ms1.5 GB185 MB2.0 GB
    Run 4: LegacyDiff8.949 s197 ms5.8 GB1.5 GB2.0 GB
    Run 5: AntiDiff1.677 s (0.19x)55 ms1.5 GB186 MB2.2 GB
    Run 5: LegacyDiff8.856 s177 ms5.8 GB1.5 GB2.2 GB
    • Improvement factor: [0.18, 0.19]

    • Speedup : [1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]

      No rollbacks, larger flushes (every 100 pushes)

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.643 s (0.25x)21 ms1.5 GB196 MB2.4 GB
      Run 1: LegacyDiff6.591 s351 ms4.0 GB1.4 GB2.4 GB
      Run 2: AntiDiff1.616 s (0.25x)47 ms1.5 GB196 MB2.2 GB
      Run 2: LegacyDiff6.520 s232 ms4.0 GB1.4 GB2.2 GB
      Run 3: AntiDiff1.640 s (0.25x)34 ms1.5 GB196 MB2.2 GB
      Run 3: LegacyDiff6.540 s150 ms4.0 GB1.4 GB2.2 GB
      Run 4: AntiDiff1.635 s (0.25x)76 ms1.5 GB196 MB2.0 GB
      Run 4: LegacyDiff6.589 s131 ms4.0 GB1.4 GB2.0 GB
      Run 5: AntiDiff1.628 s (0.25x)19 ms1.5 GB196 MB2.2 GB
      Run 5: LegacyDiff6.490 s5.9 ms4.0 GB1.4 GB2.2 GB
    • Improvement factor: 0.25

    • Speedup : 1 / 0.25 ~= 4

    Genesis

    • We elaborated a draft of the specification of the Genesis implementation and +the ChainSync Jumping optimization. In particular, this includes a proof +sketch that the latter preserves liveness and safety in all cases (Issue +3964).
      • @nfrisby's main realization during this sprint was that he had been +focusing so far on the case where the selected chain is an extension of +the intersection of our peers' ChainSync candidates.
      • This is the main case, ie an "absorbing" state, but it's not the only +case.
      • The new proof sketch begins by case splitting on that predicate, and +that made the sketch quite a bit easier to follow.
    • We continued working on the "happy path" ChainSync Jumping prototype (Issue +3960).

    Technical debt

    • We started working on the issues required to re-enable nightly CI runs.. +Nightly CI runs have far more lax time constraints, which gives the option to +run significantly more property tests than in our regular CI. To this end, we +merged a PR to easily adapt the number of tests globally (PR +#3947).

    · One min read
    Marcin Szamotulski

    The networking team took an active part in the project iteration (PI) planning +session, see cardano-node backlog for detailed +outcomes.

    • We started working on a detailed design / implementation plan for gossip.

    • We merged input-output-hk/ouroboros-network#3859 which +sets the ouroboros-network repository for the single relay release.

    • We identified a bug in the network simulator, which is fixed in the +input-output-hk/ouroboros-network#3852. +The above PR was reviewed.

    • We set the tracing configuration for nodes which we deploy and fixed and +identified some deployment hiccups. We identified some bugs in the RT view +which were registered by the maintainers. +input-output-hk/ouroboros-network-ops#4

    • We fixed typos in network-mux library: +input-output-hk/ouroboros-network#3921

    • For easy of debugging we renamed a trace point: +input-output-hk/ouroboros-network#3922

    • Duncan iterated on his simulation / visualisation. He also was able to +identify and fix a bug in the simulator. The simulation contains 50 nodes. +Dashed lines indicate and established connection, while solid lines indicate +a TCP connection with fully open TCP window.

    + + + + \ No newline at end of file diff --git a/page/7/index.html b/page/7/index.html new file mode 100644 index 00000000000..d5d5f2402aa --- /dev/null +++ b/page/7/index.html @@ -0,0 +1,36 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node.

    UTxO-HD

    • The Plutus workload benchmark for the in-memory backend showed no regressions for the metrics of interest, but it does show an increase in resource usage.
    • We got additional ad-hoc measurements on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB.
    • We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.

    Genesis

    • We produced the first draft for a Survivable Eclipse Duration Model (422).

    Support

    • Esgen finished his cycle as release engineer. Node 8.5.0 has been released.
    • We resumed work on the subpar handling of block from the future (4251).
    • We prepared the integration of new tracing events for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned issue).

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay.

    Finally, they enhanced the CI/CD to publish multiple packages to crates.io and started improving the developer experience with the Mithril devnet.

    Low level overview

    • Published the security advisory Mithril relay could expose Cardano block producer internal IP when updated #GHSA-9m3h-72xj-x2gq
    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Publish multiple packages to crates.io #1298
    • Completed the issue Rename public key published in releases #1292
    • Completed the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Fix devnet Mithril Docker images #1272

    · One min read
    Marcin Szamotulski

    High-level overview of sprint 46

    Bootstrap Peers

    We continued reviewing of bootstrap peers, see ouroboros-network#4555.

    Towards Typed Protocols 0.2.0.0

    We diagnosed the performance regression of the new design. The work on +typed-protocols will be postponed. For more details see the +typed-protocols#3. As an outcome of the performance debugging we prepared +PR which updates the demo-ping-pong and +demo-chain-sync applications.

    Peer Sharing

    We made progress in review of ouroboros-network#4644, which simplifies the +peer sharing and fixes the ouroboros-network#4642 issue.

    Tech Debt

    We reviewed the ouroboros-network#3836 PR which inspects all the uses of +error in ouroboros-network. The PR was prepared by Galois.

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity.

    They also completed the exploration of potentially moving the Plutus validator scripts to Aiken.

    Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project.

    What did the team achieve this week

    • Network Resilience Persistence (#1101)[https://github.com/input-output-hk/hydra/pull/1101].
    • Upgrade brick on TUI (#1103)[https://github.com/input-output-hk/hydra/pull/1103].
    • Aiken commit validator translation (#1072)[https://github.com/input-output-hk/hydra/pull/1072].
    • Fixed some bugs in our TUI client.

    What are the goals of next week

    • Prepare presentation and workshop for Cardano Summit.
    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.

    · One min read
    Alexey Kuleshevich

    High level summary

    The Ledger team has been shifting focus from implementing Conway related features to +testing. For this reason there is a very little amount features that are reported this +time aorund. Notable Conway related changes are a specialized ledger query for getting +Constitutional Committee state and prevention of submitting proposal procedures that have +no valid path to enactment.

    Testing related work was mainly on a constraint base system as well as on roundtrip +serialization. As a result of this extra testing a bug in Conway Genesis serialization +was eliminated.

    Low level summary

    Conway era

    Integration and releasing

    Testing

    • pull-3769 - Add roundtrip testing by validating FlatTerm
    • pull-3783 - Update TranslationInstance.hs
    • pull-3775 - Refactor and improve constraint based STS tests
    • pull-3793 - Fix sums with negative RHS.
    + + + + \ No newline at end of file diff --git a/page/8/index.html b/page/8/index.html new file mode 100644 index 00000000000..6cb5b65acb4 --- /dev/null +++ b/page/8/index.html @@ -0,0 +1,32 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was updated to 8.5.0-pre.
    • Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring

    Lower level summary

    Capkgs

    • Various improvements and fixes including:
      • Add GHA cron schedule
      • Add nix auto-gc to avoid running out of storage during large package set builds
      • Add new packages to capkgs
      • Reduce runner storage requirement leaving more room for builds
      • Restructure capkgs attribute names to avoid package name collisions
      • Return to non-musl builds for cardano packages to retain journald compatability
      • Update cache usage to from file level to folder level to reduce network and latency overhead
      • Commit diff: capkgs-compare

    Cardano-parts

    • Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: cardano-parts-pull-16
    • Dbsync, smash, faucet and more: cardano-parts-pull-15
      • Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes
      • Adds nginx vhost metrics exporter profile
      • Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down
      • Adds bash *-ng autocompletion compatible wrappers
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds downstream grafana cloud dashboard as templates
      • Adds downstream grafana cloud alerts as templates
      • Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish
      • Updates the basic profile with IOG cache and commonly used bins
      • Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks
      • Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration
      • Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion
      • Updates the colmena template with dbsync, smash, faucet machines profiles and roles
      • Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns
      • Bumps capkgs node-ng to 8.5.0-pre

    Cardano-playground

    • Dbsync, smash, faucet and more: cardano-playground-pull-3
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts
      • Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change
      • Optimizes machine sizes
      • Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion
      • Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration

    Cardano-world

    Sanchonet-demo

    • Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: sanchonet-demo-commit

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on crates.io, the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures.

    Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI.

    Low level overview

    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Update Rust compiler in nix CI #1282
    • Worked on the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230

    · 2 min read
    Carlos LopezDeLara

    2023-09-27 - 2023-10-10

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Depracated governance query commands and moved all governance related queries to cardano-cli <era> query
    • Drep registration certificates now allow to include an anchor
    • Integrated Drep retirement ceriticates
    • clean up of Drep registration certificates.

    CARDANO-API

    • Add support for committee hot key witnesses
    • Require conway onwards for voting
    • Conway drep registration: expose ledger anchor parameter
    • Add certs to txbody of Conway transactions

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums.

    The team also delivered the first version of the network resilience layer, significantly increasing head availability.

    Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra.

    Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra.

    What did the team achieve this week

    • Release 0.13.0
    • Published vulnerability reports #1088
    • Merged network resilience work part I #1074
    • Planning for Cardano Summit participation
    • Discussions with funded Catalyst projects wanting to build on Hydra for support
    • Merged typos fix PR from @omahs #1095

    What are the goals of next week

    • Complete Aiken commit validator script #1072
    • Complete Kupo integration #1078
    • Brick upgrade on TUI #1103
    • Clean backlog
    • Prepare and rehearse demo and talk for Cardano Summit

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system.
    • Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7.
    • Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store.
    • Tracing: The machine-readable tracer configuration has been merged. Optimization of cardano-tracer started.
    • Nomad backend: Ongoing variance analysis and refined cluster topology.

    Low level overview

    Benchmarking

    Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the +performance of the in-memory backing store and evaluate possible optimizations (or regressions) for it.

    Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results +show all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the cardano-tracer service.

    Consensus QTAs

    The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The +feedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype.

    Development

    Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort.

    PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time, +we'd like to validate the many improvements that have gone into the Plutus evaluator.

    Tracing

    The focus for further optimization of the new tracing system has shifted to cardano-tracer - the service +receiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in cardano-node is +more performance critical, the receiving service must still minimize its resource footprint. Moreover, it can +generate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations.

    Nomad backend

    Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated +the same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery.

    + + + + \ No newline at end of file diff --git a/page/9/index.html b/page/9/index.html new file mode 100644 index 00000000000..c9988d6c393 --- /dev/null +++ b/page/9/index.html @@ -0,0 +1,50 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 2 min read
    Damian Nadales

    High level summary

    The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the in-memory backend.

    On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain. +We also merged a fix for the Babbage to Conway transition, and released a new version of Consensus.

    Genesis

    • We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (392).

    Support

    • We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (366).
    • We enabled richer tracers in cardano-node that can be useful in future debugging (384).
    • Esgen continues with his release engineer activities, and created a new Consensus release.

    Fostering collaboration

    • We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (369).

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion on implementing Mithril in a light wallet to receive feedback and contributions from the community.

    They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks.

    Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs.

    Low level overview

    • Created the discussion Implement Mithril in a light wallet #1273
    • Completed the issue Run client in browser WASM PoC #1254
    • Completed the issue Benchmark aggregator performances #1220
    • Worked on the issue Add SPO tickers in explorer #1185
    • Completed the issue Add a non 404 status code on the aggregator endpoint #1103
    • Completed the issue Use source attribute in errors #1265
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Completed the issue Configure status page and alerting #1277
    • Completed the issue Upgrade dependencies #1274

    · 3 min read
    Marcin Szamotulski

    High-level overview of sprint 45

    Bootstrap Peers

    We started reviewing the bootstrap peers PR, ouroboros-network#4615.

    Towards Typed Protocols 0.2.0.0

    We discovered a performance regression when using typed-protocols-0.2.0.0, and we +started investigating where it comes from. Currently, we see that +typed-protocols-0.2.0.0 can outperform typed-protocols-0.1.0.0 when running +in isolation with a simple ping-pong protocol, so the regression might be in +the new block fetch implementation which comes with typed-protocols-0.2.0.0 +See typed-protocols#3.

    Tech Debt

    We merged two PRs written by Galois engineers:

    • a pull request which refactors the main entry function for P2P, see ouroboros-network#3834;
    • a pull request which reviews usage of unsafe function in the network code based.

    Galois also made progress with the following two issues:

    IO-Sim

    IOSimPOR

    We found and fixed a bug in IOSimPOR. We'd like to thank Prof. John Hughes +(Quviq AB) for helping us with debugging the issue.

    We also provided a more uniform API for IOSimPOR, and added ways to make the +debugging similar problems in the future easier.

    Technical Details on IOSim refactoring
    We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future.

    IOSim

    To prepare for the next release, we consolidate packages taking advantage of +the public sublibraries supported now both by cabal and Hackage. This is +a work in progress, io-sim#114.

    Cardano Newtork Service Assurance

    Galois made the following progress:

    • A test run of spinning up a CNSA instance was done, as a result documentation +was updated.
    • Based on the IOG code review of the CNSA code, updates to the CNSA code were +made.
    • Galois has started the design for adding a CNSA analysis for "fetched bytes +over time while node is syncing".

    P2P adoption

    In the last two weeks, we've seen increase in P2P adoption. +P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays. +node versions

    Open Source

    We upstreamed our FFI bindings to Windows named pipes to Win32 package, the +PR was accepted and merged.

    We also received an external contribution which enhanced our documentation, see +ouroboros-network#4676.

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and testing the +performance analysis tool

    Details

    • drafting processs calculus semantics of mini protocol programs

    • testing the new performance modelling tool

    • further work on specification of mini protocols

    • extension of mini protocol framework to support communication of +programs with local environments via synchronous channels

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team mainly focused on having a working new reliability +network layer; and specified its expected behavior in a new ADR.

    They also revisited the security policy and vulnerability disclosure policy on +how to handle security vulnerability within Hydra, and in particular how to +handle so-called "Silent fixes".

    What did the team achieve this week

    • Updated security policy and vulnerability disclosure policy #1088
    • Adr/network reliability #1082

    What are the goals of next week

    + + + + \ No newline at end of file diff --git a/pdf/network/2022-11-24-UCL.pdf b/pdf/network/2022-11-24-UCL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..724ed4392ddcd2107cd0443fda5923344ad239d5 GIT binary patch literal 389191 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

    n(ffp8B@%3wHI(?WiSJPL_7(11 z$LIl!T;!GR{wrQ&9d9tj2SEL$S0;ptpIZx3!b8LaedZqw#^CW9i}~=8M-ifyVi5!{ z&8F#D!3W{z))+Z1F3XpNB@CBaR{+woNB! zc;*7BQLgY((Rh{5=Y>M2&?Ydivrp`!z|O#wmx0Y2eiK&0%>42so?(#;fRYnPSC185 z4MVb;c4zldJ;ieS$|!UsQ3|GjTCP$C^J|O4j*Uo4H_v=X`3E>|w7n_cT#F!IM6%~C zbBRdrHEIe5NY6g&Q}gIT8t@8)VY+ytUvTE3Qn>H}klsinxWslGXF{Y$a`|P4#+k1h z#X-g;)1`8(3i@8pPZmI@G5i;kf6|eOko_TP}P^&3@XefBH(0t6$Q;Wo0-1*(U zkK{<}o#Jz7!+AJ{bNP77pTm5MJOzxh6-AS9Q8SlT)!Q%hGzGxuU-2Kjoqs201pA(q z*<&J8r%1^5BeQlC`(}jKk@(mE@?p1$wuxv?__uWY4AyA#PdIoS(r6-|Q0urOCIe=H z=izB!y8+eE3dn=c6H1WWF~~N#r9CN(a&hJAT+oGU zz}CTIAWO}gLI%m#$v8z}9EZIXNcn1lC*FFl=#HR7QRrqCRW{1F$-H?--yi#$j{eLz z@tQDe#n}K^UV=Odim}Ta1MLmA&PxBrK><4Zw-Bw2tR5I)odnqB%-7Z?M(O8ihrDPbVMyjO6>lID4;SlY7z29AbC{0p(=FKlQJ-RJju?I3bl-50&SSqlYN zJA63O_AHs4Ug(?h66L54=QC@JPGGf@%7Py?x(w`#f=VG4z|h!oM{cr=oyDv68M-ls zko=G|=adhkiAiG;#;u0c0~>C&D7s6?txz=iV*T(^m&xYa)|=T{1O(5d^6A)E+JUl5 z9ov?fh+s=N<61cD75_2px*MCrbkoqzKA|D_uA~pGByKEewTiDsmK(=FED4`GB>=3Rq2Cd zVz!W$MB6w`aVt&d{!$fnsCu6<&*UIQb7WQ;L&KEnQ-0=_x@`D2R&(2IU8{F`Epc6@ z_LV(oY1TaALiXO4%Zndwm`=j2Ho}jhv%*Oz5+WhMvHHk@ZXCLo)=9E(8oEQA$wPNA zZa?>ERy?S*)SN3`qAzg^ZUfI)KtSj?h?QJk;KG@(J38BBY}}g^QN>Tb8Q3GSaCUWK zG;cFR-NalasCVf}Jp5LPo2KL2yNmR-XzE>(U@<}JTLP00+C%Y8=NcQXGp@k1x#*M6I#YT zpMLYC()RI^GeHcmPNjI?^wDON<>sY9Tpz=qy)a2AvO-%Q=(VmGm^CffXJm(Xazzq}p<;B*7ZJ zzMM$Crmf!+X=v9lS2DQh1>hE#7)4yvI(F26#*lN(jN@)KyqaHF0-q_dWn@7~pDLHk zGd14GlW#nuz_aznZ}2vd9j#8{wsT+cKESuX4tV_r*`+57(Z0-?+T{?%T(4A9fU(6x z#J4eQsAGnc==f0Fk3c#OG+EIYCQCR+x!T&%A|p{Lfg?Xmi{&)WZ#NNoa?N@E z*Rf5C~RPyDCnCj3(7pfwbRj9#jQm2-U9rXnJUQ(jUvSB#JhQ^fN7VGO=5`C$fy zx1sSRsR(mr1hwwiSE8Ipj^z(`B|0fz{fG#Uj0xFJhnfId{PP0!n6N9zdjJdUVbrfxTn`F&KNsDDpXinnRTGr z#!48@LTd)CA}mS%sD@PiTtyp&zIQh;TjqLYb|kksH4~5(U;TUr=4@`p6k(mx942>z zl}k5eaC}%!Fh*}8ej0cb4(hH1WfBN%STK3acC+F{03Cy$L@8H^zIlxd!o`=1_8L&> z7#~%GBRPoj%gxVGt7LUz{k=VubLfq`UPb^oMhl}*n9!xh5B$4<==j>flv0q3Qa0+M zy3Q5osbH~PBh1G;C~@ItVGbttE60

    E-R{D2!=*0AcZ^5ZO$?%KJy04hC8{C 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 O2F{-L>@hGi6#idbhK>dR literal 0 HcmV?d00001 diff --git a/quarterly/2022-10-07-node-cli-api/index.html b/quarterly/2022-10-07-node-cli-api/index.html new file mode 100644 index 00000000000..cc008dd169b --- /dev/null +++ b/quarterly/2022-10-07-node-cli-api/index.html @@ -0,0 +1,24 @@ + + + + + +Node API & CLI Team Update | Cardano Development Updates + + + + + + + + + + + + +

    +

    Node API & CLI Team Update

    · 2 min read
    Jordan Millar

    Node-Api-Cli Quarterly Update

    2022-09 - 2022-11-04

    • Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0
    • Major clean up of stale iusses + PRs.
    • Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs
    • cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node.
    • cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation.
    • General documentation updates and improvements
    • Addition of tx-mempool command which allows users to:
      • Query the node about the current mempool's capacity and sizes
      • Request the next transaction from the mempool's current list
      • Query if a particular transaction exists in the mempool
    • Initial refactoring of cardano-testnet

    Next quarter

    • cardano-api
      • Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately.
    • cardano-testnet
    • Serenity
      • Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above.
    • General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new.
    + + + + \ No newline at end of file diff --git a/quarterly/2022-11-07-ledger/index.html b/quarterly/2022-11-07-ledger/index.html new file mode 100644 index 00000000000..8f838436c00 --- /dev/null +++ b/quarterly/2022-11-07-ledger/index.html @@ -0,0 +1,27 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Ledger Team Update

    · 2 min read
    Jared Corduan

    Ledger Quarterly Update

    2022-09 - 2022-11-04

    • We finished a minimal ledger era capable of master key rotation. +This will be re-purposed our upcoming work.
    • We have the humble beginnings of a proper ledger API.
    • We improved the problematic cost model serialization +(recall the song and dance about updating the cost model one epoch after the hard fork).
    • We have added benchmarks for problematic areas.
    • Massive repository restructure and cleanup.
      • Unified and consistent variable name schemes (not completely finished, but nearly there).
      • Massive reduction in type constraints, which causes a lot of developer friction, +in our code and also downstream.
      • More organized module structures.
      • Improved generators for our property tests.
      • We removed our dependency on cardano-prelude.
    • The formal ledger model has come a long way.
      • We created a fork of Agda that provides some meta-programming support for the ledger rules.
      • We have a large amount of the basic UTxO support in the model.
      • We can generate a good looking PDF from the model.
      • We can produce Haskell from the model.
      • We have a nice finite set theory library that we can use for many of the ledger rules.
      • We have nix support for the model.

    Next steps

    • Individual tracking of deposits. [issue-3113]
    • Versioned CBOR encoders/decoders. [issue-3014]
    • New ledger era transaction body (and the surround work associated with it).
    • Designs for the next ledger era.
    + + + + \ No newline at end of file diff --git a/quarterly/2022-11-09-network/index.html b/quarterly/2022-11-09-network/index.html new file mode 100644 index 00000000000..d4702a1119e --- /dev/null +++ b/quarterly/2022-11-09-network/index.html @@ -0,0 +1,66 @@ + + + + + +Network Team Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Network Team Update

    · 4 min read
    Marcin Szamotulski

    Network Quarterly Update

    2022-09 - 2022-11

    Summary of most important improvements

    During this quarter the networking team delivered low level specification of +peer sharing & eclipse evasion. We held a session with the consensus & the +scientists; we got a positive feedback on the design.

    Further we focused on implementation of peer sharing. We produced a detail +design and an early implementation.

    We prepared the P2P Single Relay Release (cardano-node-1.35.5). It +includes over 130 patches of network stack improvements over the +previous version 1.35.4, which were accomplished over a longer period of +time. Among them are both bug fixes and UX improvements for stake pool +operators like simplified format of the topology file, or +improvements in the logged messages:

    We also provide better integration with systemd (socket +activation improvements) or improvements in the networking stack:

    • exit policies,
    • peer metrics improvements,
    • DNS TTL improvements (which make it harder to misconfigure the +system, an issue discovered by the performance & monitoring team),
    • do not trigger inbound idle timeout for node-to-client connections (pr +#3844), an issue reported to us by Matthias Benkort from +Cardano Foundation.

    Duncan has been making progress with the input endorsers demo. His simulation +provides a useful animated visualisation and live quantification of behaviour +of the modeled design.

    We also improved our e2e diffusion simulation by implementing header-body +split, similar to what the real implementation does.

    We also made some advances towards our future goals of P2P release for block +producer nodes (pr #3800 - in review) & for Daedalus users +(pr #3690 - merged).

    Detailed log

    • We expanded diffusion simulation with block-fetch protocol bringing it closer +to the production system.

    • We addressed some additional technical depth in diffusion simulation

    • We slightly improved documentation & CI of io-sim and typed-protocols +repositories for open-source contributors.

    • We closed a number of issues towards publishing io-sim on Hackage (only two +essential issues are left open).

    • We pushed a branch of typed-protocols which captures one of the developer UX +problems in the API which we need to solve.

    • We identified and fixed an issue related to systemd sockets.

    • We identified and fixed an issue in consensus initialisation not giving +feedback on early errors.

    • We deployed RT View, identified a number of issues which were communicated to +the performance & monitoring team.

    • We finished high level & detailed design of peer sharing, very early +implementation of peer sharing is done (note that peer sharing cannot be +safely deployed without eclipse evasion & genesis).

    • We finished high level design of eclipse evasion, and started working on +a detailed design.

    • We were assigned the role of release engineer for 1.35.5 release (the P2P +single relay release); we prepared a cardano-node for 1.35.5 release which +contains more than 130 patches of just network stack improvements done over +last few months.

    • We diagnosed and fixed an tricky bug in the peer state actions (a component +which sits between outbound governor and connection manager). That bug was +introduced earlier this year and never released. It was caught by the QA +testing framework. We expanded our diffusion simulation to cover such case and +also mitigated a chance for reintroducing such a bug in future.

    • We identified and quite likely mitigated a misconfiguration in the +benchmarking cluster (next benchmarking run will confirm our hypothesis).

    • We simplified the format of p2p topology file, we got positive feedback from +SPOs.

    • We raised severities of some of the logging messages, which is an important +improvement for SPOs, exchanges and other users of the system.

    • We worked on input endorsers simulation which gives both animated and +quantified live feedback on network operation, using a simplified model of +a TCP/IP network.

    Next quarter

    • Release the Single Relay P2P Release 1.35.5.

    • Carry on with Peer Sharing (review, testing).

    • Deliver a talk at Conference on Principles of Distributed Systems 2022 in Brussels, Belgium.

    • Present Detailed Design of Eclipse Evasion and start implementation phase.

    • Work on P2P Block Producer release.

    • Carry on with publishing of io-sim on Hackage.

    + + + + \ No newline at end of file diff --git a/quarterly/2022-11-15-consensus/index.html b/quarterly/2022-11-15-consensus/index.html new file mode 100644 index 00000000000..e6cc2b6a4c3 --- /dev/null +++ b/quarterly/2022-11-15-consensus/index.html @@ -0,0 +1,63 @@ + + + + + +Consensus Quarterly Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Consensus Quarterly Update

    · 4 min read
    Damian Nadales

    Consensus Quarterly Update

    2022-09 - 2022-11

    Main achievements

    UTxO HD

    • As a consequence of the errors observed when running distributed mempool +benchmarks, we re-designed the UTxO HD mempool integration, which fixed these +errors and lead to a simpler and more maintainable design.

    • We focused on increasing test coverage for the UTxO-HD prototype. In +particular, we added property tests for:

      • Backing store (work ongoing)
      • Era transitions
    • The property tests we added uncovered several bugs, which is a great result +given the exponential increase in the cost of finding bugs as they are closer +to deployment.

    • One of the errors found by our tests required us to work on improvements in +the Haskell bindings for LMDB. This work is ongoing.

    • We started working on the mempool property tests that will exercise the new +code paths that UTxO HD introduced.

    • We developed, benchmarked and tested an implementation of sequences of +differences based on "anti-diffs". Performance results of diff sequence +operations show that we achieved a speedup of about 4x across several +scenarios. Note: this speedup is taking into account diff sequence operations +only, so the consensus-wide speedup is less than 4x.

    • We integrated the "anti-diff" prototype into the UTxO HD feature branch.

    Genesis

    • We wrote a simulator that demonstrates soundness of an abstract implementation +of the new chain selection rule.
    • We elaborated a draft specification for the Genesis implementation (currently +awaiting feedback from other architects).
    • We elaborated a draft specification for the ChainSync Jumping optimization. In +particular, this includes a proof sketch that the latter preserves liveness +and safety in all cases.
    • With the Networking team, we co-designed the eclipse avoidance mechanism, +specifically its coherence with the Genesis implementation plan's security +and its dependence on the new ChainSync Jumping optimization.
    • We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a +performance degradation wrt the baseline. Our optimization attempts so far +have brought the performance closer to the baseline, but not yet to parity.

    Conway era

    • We did most of the heavy lifting required to integrate the Conway era into the +Consensus layer.

    Technical debt

    • We started working on enabling CI nightly tests, which revealed several test +failures due to thunks being found it data structures used by the ledger and +consensus. We made a lot of progress fixing those thunk errors, but some +errors still remain.

    • We elaborated a db-analyser benchmark for the ledger operations. This led us +to the identification of high processing time at epoch boundaries, and we +could not observe any performance degradation that can be attributed to era +changes.

    • We fixed a source of flakiness in the ChainDB QSM test.

    • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    • We fixed a bug in the maximum-allowed ledger major protocol version.

    Fostering collaboration

    • We spent time making cardano-updates the central source of information for +the core teams stakeholders.
    • We went through the Galois gap analysis and extracted actionable points to +take on next.
    • Bart and Yogesh continued with their onboarding and stated making substantial +contributions to consensus.

    Next steps

    UTxO HD

    • Finish the mempool property tests.
    • Benchmark the latest version of the prototype.
    • Elaborate a document that describes new integration test scenarios and pass it +to the SDET team.
    • Bring query UTxO by address command performance on par with the baseline +version.

    Genesis

    • Receive and incorporate Duncan's feedback on the first draft specification for +the Genesis implementation.
    • Begin prototyping the first genesis implementation, unless the first draft +needs major changes.
    • Draft a second revision of the Genesis report.
    • Review the second revision with a wider audience, which includes at least +Alexander Russell. That feedback will drive a third and hopefully final +revision.
    • Investigate how to mitigate the ~30% slowdown we have observed so far in the +ChainSync jumping prototype, and try to mitigate it. In particular, we might +need to optimize the existing BlockFetch logic.

    Tech debt

    • Enabling nightly CI tests.

    Fostering collaboration

    • Merge the tutorial document Galois wrote; requires CI integration.
    • Come up with our own documentation improvements, many of which were suggested +in the Galois gap analysis.
    • Try to hire a new team member.
    + + + + \ No newline at end of file diff --git a/quarterly/2023-01-13-network/index.html b/quarterly/2023-01-13-network/index.html new file mode 100644 index 00000000000..07fc67d7d66 --- /dev/null +++ b/quarterly/2023-01-13-network/index.html @@ -0,0 +1,47 @@ + + + + + +Network Quarterly Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Network Quarterly Update

    · 5 min read
    Marcin Szamotulski

    Network Quarterly Update

    2022-11 - 2023-01

    Summary

    The primary goal of the networking team was to focus on the single relay +release of P2P. We fixed a number of small late bugs, and concluded QA +& performance testing. Although it was discovered a regression in performance +of block production when P2P is enabled, relaying with P2P performs better +comparing to a non p2p. We concluded that this is not a blocker for the Single +Relay Release which is planned shortly.

    Peer sharing has gone through review and final review is +just being done right now. After merging it will still be disabled (hidden +behind a flag) as it's not safe without eclipse evasion. We started +implementing light peer sharing (i.e. include inbound peers into known peer set +of the outbound governor).

    We started a detailed eclipse evasion design, it will continue in the next +quarter.

    We also made a major revision of package structure of the network packages. We +ended up with a very clean dependency graph (pr #4155).

    Armando Santos delivered a talk at the ODOPIS 2022 conference on principles +of distributed systems in Brussels. The slides are available here.

    Neil Davies gave an invited seminar on DeltaQ at Université Catholique de +Louvain.

    We also found and fixed a few of bugs:

    • a bug in keep alive mini-protocol which resulted in warm to cold transitions +to be always executed through a timeout path rather than do a clean demotion +([pr #4168]).

    • fixed an assetion failure in the outbound governor (issue #4177)

    Next steps

    We will work towards the next release of P2P for block producer nodes. This includes:

    • analysing performance regression for BP nodes when using P2P
    • finish the work on controlling the block forger through node kernel (pr #3800)
    • address issue #3907 and write a script to analyse deployment of P2P relays

    We would like also to push forward eclipse evasion. Although most of the work +has be done already the release of io-sim on Hackage will happen in the +next quarter.

    We would also like to address chain-sync timeout issue recently +diagnosed by Karl Knutsson.

    If time permits we would also like to address some technical debt, especially:

    Risks

    The performance regression for block producer with P2P needs to be investigated +in the near future. This is blocker for the release of P2P on BP nodes.

    Detailed log

    Contributions to Ouroboros-Network

    • We added TraceDemoteLocalAsynchronous, which enables notification of critical issues for SPOs
    • We fixed cardano-ping compatibility with NodeToNodeV_10 (P2P, pr #4165)
    • We fixed a bug in demotion peers to cold which affected P2P nodes (commit-61058aa5c2)
    • Karl Knutsson enhanced SendFetchRequest (commit-bb1c3dddee), open-source contribution)
    • We turned SizeInBytes into a newtype.
    • We extended CONTRIBUTING.md, README.md, added CODE_OF_CONDUCT.
    • We fixed DNS test failure issue #4191
    • We fixed a simulation bug found in issue #4258
    • [pr #4168]
    • issue #4177

    Contributions to Cardano-Node

    • We maintained the Single Relay Release pr #4612, (e.g. fixing CI issues, +Rebasing it when necessary, publishing packages to Cardano Haskell Packages);
    • We enhanced JSON serialisation / deserialisation of NodeToNodeVersion and NodeToClientVersion;

    Contributions to IOSim

    • We started to use Cardano Haskell Packages for IOSim (pr #48)
    • We updated change log files
    • We added support of ghc-9.4 (pr #50)

    We also addressed the following issues in pr #57 in order to prepare the package for publication on Hackage:

    • refactored io-classes timers API (issue #46);
    • created a new package si-timers which exposes an interface using SI units +and is safe on 32-bit systems (issue #59);
    • added monad transformers instances for classes defined in io-classes (issue #58);
    • created io-classes-mtl package which includes (experimental) instances for monad transformers;
    • provide MonadMonotonicTimeNSec in io-classes and MonadMonotonicTime in si-timers (so that io-classes follow the base package);
    • added registerCancellableDelay in si-timers (which allowed us to hide fancy timer api and clean io-classes)
    • added support for js_HOST_ARCH (the new GHC JS backend)

    Note the pr #57 contains almost 40 commits, and was a major step forward for +io-sim ecosystem. We also prepared a draft pr #4281 which updates +ouroboros-network.

    Other changes for 1.0.0.0 release on Hackage:

    • Refactored test suite (pr #47)
    • Updated documentation, cabal files, CONTRIBUTING, SECURITY documents, etc in pr #60, currently under review.
    + + + + \ No newline at end of file diff --git a/quarterly/2023-01-13-open-source/index.html b/quarterly/2023-01-13-open-source/index.html new file mode 100644 index 00000000000..211bee923f2 --- /dev/null +++ b/quarterly/2023-01-13-open-source/index.html @@ -0,0 +1,53 @@ + + + + + +Open-Source Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Open-Source Update

    · 3 min read
    Marcin Szamotulski

    Open Source Quarterly Update

    2022-11 - 2023-01

    Summary

    In the last quarter the open-source initiative delivered a comprehensive report +on the state of our repositories. As part of this work stream we +identified the key open-source repositories for the cardano project across all +the projects From a list of more than 500 repositories (some of which are +forks) we identified key repositories which constitute the core of Cardano. +20 of them were identified as to be transferred to the future MBO which will +govern Cardano development. Some where excluded (like io-sim and +typed-protocols), to be govern by IOG, since they have a much broader +application than Cardano itself, and thus we think their open-source future +will be better outside of the Cardano umbrella.

    Christian Taylor identified a number of ways we can improve our repositories to +make them more attractive for open-source contributions by analysing each of +them. This includes adding or improving various documentation files, like +CONTRIBUTING files, adding code of conduct, improving readme files, issue +& pull request templates etc. Christian also computed various interesting +metrics which gives a very good insight into the development practices: e.g. +average merge ratio, average number of reviews, comments and many more! The +presentation is available here.

    We followed with work on the Cardano Engineering Handbook. We included +a standard code of conduct which is now used by most important projects in the +Cardano space. We included cardano-node's security policy and added +a responsible disclosure policy. We also described how roles and +responsibilities should be clarified. This progress was made by +a collaborative effort of the Cardano Core, Plutus and Architecture teams, and +it wouldn't be possible without Michael Peyton Jones, Arnaud Bailly, Kevin +Hammond, Jared Corduan and Marcin Szamotulski.

    We also improved the documentation of key repositories, by adding description, +improving their README file & CONTRIBUTING files, adding code of conducts +following the Cardano Engineering Handbook. This includes improvements to:

    And also

    The work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan.

    In this quarter we also identified a number of projects which can be published to +Hackage (Haskell's package repository) or crate (Rust package repository). +The list contains 21 packages, 2 of which (hedgehog-extras and +quickcheck-dynamic) are already published on Hackage and another 5 (from +the io-sim repository) are close to be published.

    Detailed log

    The progress of the open-source project is tracked in this project.

    + + + + \ No newline at end of file diff --git a/quarterly/2023-01-18-consensus/index.html b/quarterly/2023-01-18-consensus/index.html new file mode 100644 index 00000000000..0f51ebe7eaf --- /dev/null +++ b/quarterly/2023-01-18-consensus/index.html @@ -0,0 +1,59 @@ + + + + + +Consensus Quarterly Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Consensus Quarterly Update

    · 4 min read
    Damian Nadales

    Consensus Quarterly Update

    2022-12 - 2023-01

    Main achievements

    UTxO HD

    The prototype is feature complete and thoroughly tested at the consensus level. +In particular, we invested a lot of time in writing property-test for the +mempool, and other crucial new parts of the prototype. Now we are ready to run +integration tests and system-level benchmarks.

    Genesis

    We identified and fixed a slowdown in cross-era forecasting that was inhibiting +our efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7% +speedup in full sync times in the baseline.

    We also started prototyping a self-contained implementation of the Genesis +dynamics (in particular of the parts intentionally not part of the ChainSync +Jumping prototype) that furthered our understanding of subtleties and edge +cases.

    Support

    • We worked on designing integration of new VRF and KES crypto into consensus.
      • Crypto class was split into two parts: Crypto and HeaderCrypto.
      • With the Ledger team's help, we refactored cardano-ledger to use a proxy +type for VRF.

    Conway era

    • PR went through its second review round. It is about to be merged, but it got +delayed due to people's availability during Christmas break.

    Technical debt

    • We improved the capabilities of our io-sim library, which is key for testing +and simulating Cardano components.
    • We removed thunks from epoch translations in the ledger, which is important +for reducing memory consumption of the Cardano node.

    Fostering collaboration

    • We added a tutorial on how to instantiate the Consensus layer to run custom +ledgers. This should be a valuable resource to people looking to roll their +own custom blockchain (either for commercial or research purposes).
    • We added an overview of consensus to the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    Next steps

    UTxO HD

    • Evaluate the extensibility of the prototype. Moving the UTxO to disk is only +the first step towards reducing the memory requirements of Cardano node, and +ensuring its long term sustainability. In the future, we plan on moving other +large maps, such as delegation maps. The prototype should be able to +accommodate these changes without any major modifications.
    • Start the integration with other downstream components, such as the wallet and +db-sync. The idea is to identify and address any potential pain points that +might arise during this integration.
    • Run integration tests and system-level benchmarks.

    Genesis

    • Finish benchmarking and tuning the fast-path ChainSync Jumping prototype
    • Expand and optimize the self-contained implementation of the Disconnect Rule +(including density comparisons and the LoE)
    • Develop documentation and smoke tests for these components.
    • Start modifying the ChainSync Client for the LoP and LoR.

    Support

    • Help the Network team with diagnosing performance regression in block +production.

    Tech debt

    • Fix property-test failures concerning iterators (#3999 and +#4183).

    Fostering collaboration

    Risks

    UTxO HD

    • Moving other parts of the ledger state to disk might require a major redesign +of the prototype. For instance, if it turns out that the epoch change rules +require access to the full ledger state. If this is the case, we might +accept this risk and do the redesign after the initial release of UTxO-HD.
    • Integration with downstream clients might require more work than we +anticipate.
    • Access to the benchmarking's team time and resources.
    • Benchmarking results might show significant performance degradation, which +will require additional work if such performance degradation is not accepted +by other stakeholders.
    • The prototype's performance might not be accepted by other stakeholders. Here +we need to clearly communicate that this is necessary to ensure that as the +blockchain size grows, the node can operate within reasonable memory +constraints.
    + + + + \ No newline at end of file diff --git a/quarterly/2023-04-03-ledger/index.html b/quarterly/2023-04-03-ledger/index.html new file mode 100644 index 00000000000..8e7686b78c8 --- /dev/null +++ b/quarterly/2023-04-03-ledger/index.html @@ -0,0 +1,164 @@ + + + + + +Ledger Team Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Ledger Team Update

    · 7 min read
    Jared Corduan

    Ledger Quarterly Update

    2023-01 - 2023-03

    Main achievements

    CIPs

    • Entering the Voltaire phase - +CIP-1694 received a major update after participation in the design has expanded to +more and more people, including those who attended the Colorado workshop. +See CIP-1694.
    • Ledger CIP category - +The ledger team continues to embrace the CIP process, and has begun the process of +registering the ledger as an official CIP category. +See CIP-84.
    • Ledger serialization - +A CIP for the ledger serialization deprecation cycle has been accepted. +See CIP-80.

    Formal ledger model

    Our new formal specifications backed by Agda have seen a lot of progress. +The majority of the ideas in CIP-1694 are now present, and we have made enough progress +that we can now safely say that the PDF produced by the Agda model will be the +official ledger specification for the Conway ledger era. +See the repository.

    Conway ledger era

    Progress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model. +The major component still missing is the DRep stake distribution, which still presents some +technical challenges.

    [pull-3176] +[pull-3216] +[pull-3226] +[pull-3291] +[pull-3326] +[pull-3330] +[pull-3339]

    DRep stake distribution computation

    Adding another large stake distribution to the ledger state must proceed with caution. +We do not want the memory used by the node to increase too much, +and performance problems can lead to reduced block production. +We have prototyped, tested, and benchmarked several approaches that could give us +the current DRep stake distribution at each epoch boundary. +This has very important implications, since we want every ADA holder to be able to at any +time (such as during a contentious vote) register themselves as a DRep and still have time +to vote themselves on the issue.

    [pull-3344] +[pull-3353] +[pull-3364]

    Integration work

    The ledger has made some wonderful improvements over the past six months, +but which entail a significant amount of integration efforts:

    • Our new versioned CBOR schemes
    • Individual deposit tracking
    • An improved cross-era interface utilizing lenses
    • A new ledger API
    • Re-arranging the ledger stake in preparation for CIP-1694
    • Versioning our Haskell packages +using CHaPs.
    • Consistent conventions for variable names

    [pull-3279] +[pull-3282] +[pull-3288] +[pull-3289] +[pull-3292] +[pull-3297] +[pull-3298] +[pull-3299] +[pull-3300] +[pull-3302] +[pull-3303] +[pull-3308] +[pull-3342] +[pull-3345] +[pull-3356] +[pull-3357] +[pull-3360] +[pull-3361] +[pull-3363] +[pull-4349] +[pull-378] +[pull-376] +[pull-373] +[pull-370] +[pull-361] +[pull-4976] +[pull-5013]

    Deposit tracking

    Individual deposits (for stake credential and stake pool registrations) were not tracked by the ledger. +Deposits were returned according to the current protocol parameters. +When the values of these two protocol parameters change, the deposit pot +is adjusted by adding to, or removing from, the reserves.

    This has several problems:

    • Most people expect a deposit to be paid back exactly.
    • We cannot increase the deposit amount once the reserves hits zero.
    • If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials.
    • Because of the problems above, it is going to be incredibly hard to ever change the values.
    • There is a serious issue involving hard forks. +The consensus layer makes the decision about whether or not to enact a hard fork based on +the protocol parameter update state two stability windows before the end of the epoch. +However, the ledger will reject a protocol parameter update on the epoch boundary +if the deposit pot adjustments cannot be reconciled with the reseve pot. +This means that if quorum is met regarding changing the major protocol version, +but the update is rejected on the epoch boundary, consensus will change the era but the +ledger will not change the major protocol version, leaving the ledger in a split-brain state.

    Because we never actually changed the values of the two deposits amounts in the protocol parameters +on mainnet, we were able to retroactively change the behavior. +We made the following changes:

    • Individual deposits are tracked in the DState.
    • The amount deposited is always returned.

    [pull-3195] +[pull-3202] +[pull-3217]

    New ledger API

    We have significantly built up the ledger API. +We will eventually replace much of the cardano-api in the node repository with this ledger API.

    [pull-3242] +[pull-3248] +[pull-3328]

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We have a new declaritive infrastructure for building constraint-based generators, +which instead generate a random ledger state representative of not just an initial state, +but also those representative of the end result of a long sequence of valid blocks. +Moreover, these generators are very fast and are much more random than our old generators. +Before we can start using them for our existing property tests, however, we still need to +expand them to generate a valid block for a given ledger state.

    [pull-3219]

    Technical debt

    We continued to address technical debt as much as we can.

    [pull-3167] +[pull-3170] +[pull-3172] +[pull-3175] +[pull-3184] +[pull-3205] +[pull-3208] +[pull-3210] +[pull-3212] +[pull-3218] +[pull-3222] +[pull-3223] +[pull-3224] +[pull-3225] +[pull-3229] +[pull-3239] +[pull-3241] +[pull-3244] +[pull-3245] +[pull-3249] +[pull-3260] +[pull-3263] +[pull-3264] +[pull-3268] +[pull-3269] +[pull-3270] +[pull-3274] +[pull-3276] +[pull-3277] +[pull-3286] +[pull-3290] +[pull-3295] +[pull-3296] +[pull-3306] +[pull-3307] +[pull-3310] +[pull-3311] +[pull-3316] +[pull-3320] +[pull-3323] +[pull-3327] +[pull-3331] +[pull-3332] +[pull-3333] +[pull-3338] +[pull-3341] +[pull-3347] +[pull-3350] +[pull-3351] +[pull-3352] +[pull-3354]

    Critical fixes

    We fixed two critical issues:

    • Growing block production delay on the epoch boundary: [pull-3209]
    • Unexpected node shutdown from balanceR: [pull-3343]

    Next steps

    • Conway spec - +Complete the first version of the conway formal specification.
    • DRep stake distribution - +Have the ledger compute the DRep stake distribution with acceptible performance.
    • Devnet ready - +Have the Haskell implementation of the conway era in sync with the formal specification, +and integrate the changes with consensus and node. +All the details might not be finalized, but the wire specification and the API should +be stable so that conway can be placed on a devnet for tool builders to start integrating with.
    • Plutus V3 - +Integrate Plutus V3 into the ledger, including a new script context which supports DReps.

    More details

    This quarterly report was based off of the following fortnightly ones:

    + + + + \ No newline at end of file diff --git a/quarterly/2023-04-04-network/index.html b/quarterly/2023-04-04-network/index.html new file mode 100644 index 00000000000..cf78e91cdcb --- /dev/null +++ b/quarterly/2023-04-04-network/index.html @@ -0,0 +1,38 @@ + + + + + +Network Q1 2023 Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Network Q1 2023 Update

    · 3 min read
    Marcin Szamotulski

    2023-01 - 2023-03

    Main achievements

    Gradual dynamic P2P release on mainnet

    We released two version of cardano-node with dynamic P2P capabilities:

    • 1.35.6
      • we found and fixed a bug in exception handling in peer-state-actionspull-4357
      • we found and fixed a busy loop when demoting a peer from hot to warm pull-4385
    • 1.35.7
      • includes interoperability in the legacy non-p2p network stack pull-4467
    • we fixed a busy loop of demotion & promotions: warm -> hot -> warm[pull-4485] /it will be included in cardano-node-8.0.0 release/.

    Currently there are more than 200 P2P relays on mainnet.

    Peer Sharing

    We implemented /peer sharing/ pull-4019 which will be available as an +experimental feature in one of the future cardano-node releases.

    We implemented /light peer sharing/, e.g. adding inbound connections to the set +of known peers of the outbound governor, which allows to bootstrap relays not +registered on chain. This complements peer sharing. The pull-4277 is in +late review stages.

    Eclipse Evasion

    We finalised design of eclipse evasion and we started implementing it. We +have an initial implementation (not merged). We are in the process of extending +our test suite to cover new implementation details: issue-3886, pull-4462.

    Cardano Network Service Assurance

    Galois has been making progress on Cardano Network Service Assurance project.

    • In cardano-node, they have developed a datapoint abstraction that creates +a queue of (existing) log events, they now have two such datapoints (of log +events) implemented.

    • They have developed a datapoint client executable that can connect to a node +which serves the "new tracing".

    • They have been exploring approaches for the consolidation and analysis of +datapoint data to extract actionable network health status.

    Cardano-Node

    • We made it possible to configure accepted connections limit pull-4902.

    Testing improvements

    • We fixed a bug in network simulation implementation of TCP simultaneous open pull-4265.

    • We introduced header-body split in the diffusion simulation pull-4419 (in review).

    • We introduced initiator only nodes in the diffusion simulation pull-4280.

    • We fixed a connection-manager test failure issue-4370.

    Technical Debt

    • We refactored Snocket interface decoupling it from the multiplexer +pull-4260. This simplified some aspects of the KES agent implementation.

    • We introduces a record for CBOR codecs which are used for various data +structures by mini-protocol codecs pull-4430.

    Documentation

    • We explained some limitations of CDDL in our technical report pull-4351.

    IO-Sim

    • We fixed implementation of MVar's pull-70.

    NoThunks

    • We published a new version of nothunks library to Hackage.

    Next steps

    • Finish implementation & testing of eclipse evasion issue-3886.
    • Optimise connectivity to peers behind firewall issue-4381.
    • Finish the work on enabling block production dynamically to allow using P2P +on block producers issue-3159.
    • If time permits we would like also to reserve some time for finishing +publication of io-sim to Hackage.
    + + + + \ No newline at end of file diff --git a/quarterly/2023-04-25-consensus/index.html b/quarterly/2023-04-25-consensus/index.html new file mode 100644 index 00000000000..041014faa85 --- /dev/null +++ b/quarterly/2023-04-25-consensus/index.html @@ -0,0 +1,43 @@ + + + + + +Consensus Quarterly Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Consensus Quarterly Update

    · 3 min read
    Damian Nadales

    Consensus Quarterly Update

    2023-01 - 2023-03

    Main achievements

    UTxO HD

    • We finished the testing activities for the prototype, which involved adding +new tests, and fixing and enabling temporarily disabled tests.
    • We spent a substantial amount of effort refactoring and cleaning the +prototype.
    • We audited the UTxO HD prototype to make sure it can accommodate the migration +of other tables (eg stake-keys registration) from memory to disk. The result +of the audit was positive.
    • We ran ad-hoc benchmarks for reading keys and flushing values to disk. No +unexpected costs found.
    • We ran the first system level benchmarks. The performance regressions reported +were due to an unrealistic snapshotting rate. We need to re-run them again +after we design a more fine grained locking mechanism.

    Genesis

    • We elaborated a roadmap of the remaining work for Genesis.
    • We presented the design to the IOG Researchers and PNSol on February 20. The +design was well received. We updated the Genesis design with the researcher's +feedback.
      • We plugged the new DoS vector identified during the aforementioned +presentation.
    • We developed a generator for adversarial leader schedules that satisfy key +Ouroboros properties, which will be used to test the Genesis design.
      • The generator enables use of smaller Ouroboros parameters, which makes +extrema more likely and counterxamples easier interpret.
    • We wrote up the latest design iteration.
    • We continued benchmarking the Chain Sync Jumping prototype. In particular:
      • We debugged the prototype's performance regression, and unmasked the +actual cause by patching our initial theory (bad queuing behavior)
      • We identified and validated the actual cause (a pathological case in +BlockFetch tiebreaker).

    Support

    • We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother +to serve a local immutable DB.

    Conway era

    • We integrated the Conway era into consensus.

    Technical debt

    • We fixed a bug with followers, which was discovered by property tests.
    • We developed a DSL for specifying and running ChainDB test cases.
    • We fixed failing tests with iterators.
    • We created micro-benchmarks for adding transactions to the mempool.

    Fostering collaboration

    • We released a new technical documentation site for consensus.
    • We factored out several packages to external repositories. Some of this work +originated in the UTxO HD workstream.

    Next steps

    UTxO HD

    Genesis

    Support

    • Design Consensus side of hardfork-enactment in the Voltaire phase +(#4180).
    • Estimate the number of file descriptors Consensus needs +#20.

    Tech debt

    • Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define +for consensus. Pick one and implement benchmarks for it.

    Fostering collaboration

    • Onboard a new team member.
    + + + + \ No newline at end of file diff --git a/quarterly/2023-Q2-consensus/index.html b/quarterly/2023-Q2-consensus/index.html new file mode 100644 index 00000000000..2b1f7070c47 --- /dev/null +++ b/quarterly/2023-Q2-consensus/index.html @@ -0,0 +1,32 @@ + + + + + +Consensus Q2 2023 Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Consensus Q2 2023 Update

    · 5 min read
    Damian Nadales

    2023-04 -- 2023-06

    Main achievements

    UTxO HD

    • We finished a major prototype refactoring, which includes:
      • A better and finer grained DB lock mechanism.
      • Elimination of race conditions.
      • Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance.
      • Architectural simplifications and performance improvements.
    • We implemented a new package to support db-sync integration with UTxO-HD.
    • We ran another set of ad-hoc benchmarks:
      • We uncovered a performance regression on the Network component when using GHC-9.2/9.4.
      • The synchronization and replay speed are as expected.
      • However, we uncovered memory consumption issues (see figure below).
        • The in-memory backend is consuming more memory than the baseline.
        • The LMDB backend shows an unexpected memory usage peak.
        • Investigation on these issues is ongoing.
    • We integrated the latest changes in main branch.
      • This required a re-design of the mempool to include the mempool fairness +improvement.

    Genesis

    • The Genesis work for this PI focused on an high-priority issue from the IOG Researchers' feedback on the proposal.
      • This particular question was not anticipated when the Q2 PI was planned.
      • As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized.
      • That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package.
    • The IOG Researchers' feedback on the design was very valuable. It had two primary effects.
    • Outcome 1: We re-introduced distinct behaviors when the node is "syncing" versus when it is "caught up".
      • This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated.
      • The additional design complexity is relatively small.
    • Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.
      • The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era.
      • All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras.
      • Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later.
      • The primary invention was a model for bounding how much benefit the adversary's long-range attack could possibly gain from Praos's natural short forks.
    • Relevant questions that the IOG Researchers are still assessing.
      • These do not block the Genesis implementation, but do affect the ultimate values of specific parameters.
      • Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?
      • Question 2: what is the upper bound on how much grinding can improve the adversary's leader schedule within some Genesis window?

    Support

    • We performed an analysis on number of file descriptors used by Consensus, this +information can be used by the node operators to check if the number of file +descriptors they want to support are enough, thus improving the user (eg node +operator) experience.
    • We implemented a mempool fairness improvement, by which transactions are +guaranteed to be processed irrespective of their size.

    Technical debt

    • We fixed a bug in followers logic, which was discovered by our QuickCheck +property tests.
    • We created an immutable DB +server. This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results.
    • We created a db-truncater tool, which can be used in disaster recovery and benchmarking scenarios.
    • We created a benchmarks comparison tool that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance improvements introduced by the Ledger team in version 0.6.0.0 of Consensus wrt version 0.5.0.0.

    Fostering collaboration

    • We released fs-sim as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project.
    • We migrated the consensus code to a new repository, splitting +it from the ouroboros-network repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases).
    • We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users).
    • We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.

    Next steps

    UTxO HD

    Genesis

    • We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work.
    + + + + \ No newline at end of file diff --git a/quarterly/2023-Q2-network/index.html b/quarterly/2023-Q2-network/index.html new file mode 100644 index 00000000000..b2153c5d957 --- /dev/null +++ b/quarterly/2023-Q2-network/index.html @@ -0,0 +1,77 @@ + + + + + +Network Q2 2023 Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Network Q2 2023 Update

    · 6 min read
    Marcin Szamotulski

    2023-04 - 2023-06

    Main achievements

    Eclipse Evasion

    We finalised the design of eclipse evasion and implemented its mechanism which +relays on connectivity to big ledger peers. Big ledger peers are the +largest ledger peers which accumulate 90% of stake (currently there are less +than 1000 of them). The outbound governor has new targets for known, +established and active big ledger peers which work in a similar way that +such targets work for ledger peers. The ouroboros-network#4662 PR is +currently in review.

    As part of this work we also identified a bug which would prevent a node to +connect to itself. Such connections are not easily detectable and are expected +to be dropped by the churn mechanism, nonetheless they should not be buggy. +The failure was discovered thanks to our e2e simulation of diffusion using +io-sim & property based testing.

    The PR also refactors the heart of the ouroboros-network interface reducing +technical debt that would otherwise accumulate.

    We also identified a possible improvement in the churn mechanism, which will be +implemented in Q3. Churn needs to await for peers to terminate, we can +improve the synchronisation. [ouroboros-network#4617]

    Ecosystem P2P Deployment Progress

    We reached 50% of stake in hands of SPOs who run at least on P2P relay. Now +also Emurgo and CF are running some P2P relays. Also 20% of IOG relays are +running in P2P mode.

    P2P Progress

    Peer Sharing

    We implemented bootstrapping for peer sharing (also known as light peer +sharing). New downstream (inbound) peers are now added to the known peers of +the outbound governor. Together with peer sharing this allows for non +registered relays to propagate through the network. ouroboros-network#3596

    Please note that peer sharing is disabled by default and is not considered safe +until Bootstrap Peers (see below) or Genesis is implemented.

    Diffusion (P2P)

    • We designed a feature which will reduce the load on IOG relays (in future +also run by CF & Emurgo). The feature consists of two parts. A new source +of peers called bootstrap peers (obtained from via an https request), the +ability to switch from bootstrap peers to ledger peers if the node is synced +(we are collaborating with the consensus team on the interface Bootstrap +Peers IER). This feature will be completed in Q3. +ouroboros-network#4530

    • We published a blog post about P2P design & implementation.

    • Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections: +ouroboros-network#4559.

    • We merged changes which allow the consensus layer to start / stop block +forging thread. This will allow to deploy P2P block producing nodes which +serve as a live backup node. ouroboros-consensus#140

    • We fixed a few bugs in local root peers DNS resolution service: +ouroboros-network#4583, ouroboros-network#4571.

    • We limited concurrency of DNS name resolutions: ouroboros-network#4596.

    • Galois Inc implemented query option for Handshake: ouroboros-network#4256.

    • We fixed handshake query timeout: ouroboros-network#4608.

    • We implemented warm valency for local root peers. This can help when using +DNS names in local root peers which resolve to many IP addresses. ouroboros-network#4575

    • We merged handshake changes which allow query protocol versions. Thanks to +James Parker from Galois Inc.: ouroboros-network#4256, cardano-cli#30.

    Other Improvements & Developments

    CDDL

    • We added node-to-node and node-to-client CDDL specs / tests for encoding +of NodeToNodeVersionData and NodeToClientVersionData.

    • We clarified an inconsistency between CDDL spec and implementation which is +highly polymorphic. We designed and implemented a fix for tx-submission +and local-tx-submission mini-protocols. Specs for other mini-protocols will +be improved at a later stage. ouroboros-network#4580

    Cardano Ping

    IOSim

    Typed Protocols

    Cardano Client

    • We fixed a bug in cardano-client-0.1.0.2 release which results in clients +(e.g. db-sync) negotiate an experimental protocol version.

    Technical debt

    CI improvements

    GHC 9.4 & 9.6

    We made all repositories under our control compile with ghc-9.4 and ghc-9.6 +which includes ouroboros-network, io-sim, typed-protocols and +Win32-network.

    Next steps

    We will continue towards our aspirational roadmap.

    • We will continue reviewing eclipse evasion.
    • As ouroboros-consensus#140 was merged, we are making progress towards +releasing P2P on block production nodes. We hope to analyse performance +regression on such nodes observed on the benchmarking cluster. roadmap-3887
    • We are also focused on roadmap-3969. Note that it was expanded in Q2.
    + + + + \ No newline at end of file diff --git a/quarterly/2023-Q2-sre/index.html b/quarterly/2023-Q2-sre/index.html new file mode 100644 index 00000000000..7089b89d77d --- /dev/null +++ b/quarterly/2023-Q2-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Q2 2023 Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    SRE Q2 2023 Update

    · One min read
    John Lotoski

    2023-04 - 2023-06

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Expanding the darwin CI cluster and adding aarch64 builder support
    • Adding bare metal capability to bitte clusters
    • Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality
    • Creation of pool performance analysis queries and scripting
    • Migration of testnet metadata server to cardano-world
    • Cardano shelley qa migration to cardano-world
    • Cardano sanchonet environment spin up to test Conway era functionality
    • Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature

    Next steps

    • Continue with the conversion of mainnet to using p2p topology
    + + + + \ No newline at end of file diff --git a/quarterly/2023-Q3-performance-and-tracing/index.html b/quarterly/2023-Q3-performance-and-tracing/index.html new file mode 100644 index 00000000000..1231a99bfa7 --- /dev/null +++ b/quarterly/2023-Q3-performance-and-tracing/index.html @@ -0,0 +1,34 @@ + + + + + +Performance & Tracing Q3 2023 Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    Performance & Tracing Q3 2023 Update

    · 4 min read
    Michael Karg

    2023-07 - 2023-09

    Main achievements

    • Release benchmarking
    • Developing and running UTxO-HD benchmarks - in-memory flavour
    • P2P benchmarks, facilitating rollout
    • Production-readiness of the new Nomad cluster has been reached
    • Optimization of and introspection capability for the new tracing system
    • GHC9 performance investigation (and possible remedy)
    • Conensus QTAs: first real-world application of prototype

    Release benchmarking

    Ongoing release benchmarking is a crucial safeguard to cardano-node's release cycle from a performance perspective. We've performed and analyzed benchmarks for node versions 8.2.x to 8.5 throughout Q3.

    UTxO-HD benchmarks

    Targeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery.

    P2P benchmarks

    In Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature.

    New nomad cluster

    The new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received +various rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest +of our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it +ready for production use.

    New tracing system

    Our new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that +it is roughly on par with the legacy system while offering a richer feature set and greater flexibility.

    Additionally, in Q3 we equipped the system with an introspection capability. This is now used for generating +end user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system.

    GHC9 performance

    In Q3, a joint investigation with DevX into GHC9's behaviour revealed where and how GHC9 misses opportunities for +optimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable +those optimizations - which is still being validated.

    Consensus QTAs

    In collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations' +performance characteristics. It's now applicable, and being applied, to a real-world task - namely +gathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds.

    Next steps

    Benchmarking:

    In Q4, the focus will be on:

    • facilitating the next mainnet release
    • benchmarking runs in the Conway era
    • developing benchmarks / workloads for Conway-exclusive actions
    • implementing a specialized benchmark setup for the UTxO-HD on-disk variant
    • developing new Plutus benchmarks to safeguard Plutus V3
    • benchmarks regarding the rollout of P2P

    Performance

    For certain blocking performance issues we've located the cause, or even found a solution in a cross-team effort. In Q4 we'll advance that work to ensure the ongoing +release cycle for mainnet, as well as make GHC9 become a viable release platform.

    New tracing system

    For the new tracing system, we'll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support.

    UTxO-HD monitoring

    We'll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way.

    Nomad backend

    From Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad.

    Workbench

    We will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with cardano-node.

    Consensus component QTAs (co-development)

    In Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation.

    + + + + \ No newline at end of file diff --git a/quarterly/2023-Q3-sre/index.html b/quarterly/2023-Q3-sre/index.html new file mode 100644 index 00000000000..063d675fa60 --- /dev/null +++ b/quarterly/2023-Q3-sre/index.html @@ -0,0 +1,24 @@ + + + + + +SRE Q3 2023 Update | Cardano Development Updates + + + + + + + + + + + + +
    +

    SRE Q3 2023 Update

    · One min read
    John Lotoski

    2023-07 - 2023-09

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Completion of mainnet relay networking conversion to p2p topology
    • Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality
    • Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines
    • Creation of a nix content addressed packages repository, capkgs:
      • To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells
    • Creation of a cardano performance benchmarking cluster, cardano-perf:
      • To replace legacy cluster benchmark tooling
    • Creation of a cardano cluster composition repository, cardano-parts:
      • For enabling multi-cluster, multi-role cardano network deployments
    • Creation of a cardano testnets repository, cardano-playground:
      • Utilizing cardano-parts for testnet deployments
    • Creation of a sanchonet demo repository, sanchonet-demo:
      • Utilizing cardano-parts for fast sanchonet test environment and demo purposes

    Next steps

    • Continue with migration of cardano-world testnets to cardano-playground
    • Proceed with spinup of mainnet p2p bootstrap cluster
    • Scale down mainnet non-p2p legacy cluster at the appropriate time
    + + + + \ No newline at end of file diff --git a/quarterly/archive/index.html b/quarterly/archive/index.html new file mode 100644 index 00000000000..3f7e8b7d202 --- /dev/null +++ b/quarterly/archive/index.html @@ -0,0 +1,24 @@ + + + + + +Archive | Cardano Development Updates + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quarterly/atom.xml b/quarterly/atom.xml new file mode 100644 index 00000000000..30b85a2694e --- /dev/null +++ b/quarterly/atom.xml @@ -0,0 +1,620 @@ + + + https://input-output-hk.github.io/cardano-updates/quarterly + Cardano Development Updates Blog + 2023-12-07T21:19:58.000Z + https://github.com/jpmonette/feed + + Cardano Development Updates Blog + https://input-output-hk.github.io/cardano-updates/img/favicon.ico + + <![CDATA[Consensus Q2 2023 Update]]> + 2023-Q2-consensus + + 2023-12-07T21:19:58.000Z + + 2023-04 -- 2023-06

    Main achievements

    UTxO HD

    • We finished a major prototype refactoring, which includes:
      • A better and finer grained DB lock mechanism.
      • Elimination of race conditions.
      • Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance.
      • Architectural simplifications and performance improvements.
    • We implemented a new package to support db-sync integration with UTxO-HD.
    • We ran another set of ad-hoc benchmarks:
      • We uncovered a performance regression on the Network component when using GHC-9.2/9.4.
      • The synchronization and replay speed are as expected.
      • However, we uncovered memory consumption issues (see figure below).
        • The in-memory backend is consuming more memory than the baseline.
        • The LMDB backend shows an unexpected memory usage peak.
        • Investigation on these issues is ongoing.
    • We integrated the latest changes in main branch.
      • This required a re-design of the mempool to include the mempool fairness +improvement.

    Genesis

    • The Genesis work for this PI focused on an high-priority issue from the IOG Researchers' feedback on the proposal.
      • This particular question was not anticipated when the Q2 PI was planned.
      • As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized.
      • That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package.
    • The IOG Researchers' feedback on the design was very valuable. It had two primary effects.
    • Outcome 1: We re-introduced distinct behaviors when the node is "syncing" versus when it is "caught up".
      • This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated.
      • The additional design complexity is relatively small.
    • Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.
      • The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era.
      • All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras.
      • Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later.
      • The primary invention was a model for bounding how much benefit the adversary's long-range attack could possibly gain from Praos's natural short forks.
    • Relevant questions that the IOG Researchers are still assessing.
      • These do not block the Genesis implementation, but do affect the ultimate values of specific parameters.
      • Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?
      • Question 2: what is the upper bound on how much grinding can improve the adversary's leader schedule within some Genesis window?

    Support

    • We performed an analysis on number of file descriptors used by Consensus, this +information can be used by the node operators to check if the number of file +descriptors they want to support are enough, thus improving the user (eg node +operator) experience.
    • We implemented a mempool fairness improvement, by which transactions are +guaranteed to be processed irrespective of their size.

    Technical debt

    • We fixed a bug in followers logic, which was discovered by our QuickCheck +property tests.
    • We created an immutable DB +server. This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results.
    • We created a db-truncater tool, which can be used in disaster recovery and benchmarking scenarios.
    • We created a benchmarks comparison tool that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance improvements introduced by the Ledger team in version 0.6.0.0 of Consensus wrt version 0.5.0.0.

    Fostering collaboration

    • We released fs-sim as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project.
    • We migrated the consensus code to a new repository, splitting +it from the ouroboros-network repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases).
    • We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users).
    • We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.

    Next steps

    UTxO HD

    Genesis

    • We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work.
    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Network Q2 2023 Update]]> + 2023-Q2-network + + 2023-12-07T21:19:58.000Z + + 2023-04 - 2023-06

    Main achievements

    Eclipse Evasion

    We finalised the design of eclipse evasion and implemented its mechanism which +relays on connectivity to big ledger peers. Big ledger peers are the +largest ledger peers which accumulate 90% of stake (currently there are less +than 1000 of them). The outbound governor has new targets for known, +established and active big ledger peers which work in a similar way that +such targets work for ledger peers. The ouroboros-network#4662 PR is +currently in review.

    As part of this work we also identified a bug which would prevent a node to +connect to itself. Such connections are not easily detectable and are expected +to be dropped by the churn mechanism, nonetheless they should not be buggy. +The failure was discovered thanks to our e2e simulation of diffusion using +io-sim & property based testing.

    The PR also refactors the heart of the ouroboros-network interface reducing +technical debt that would otherwise accumulate.

    We also identified a possible improvement in the churn mechanism, which will be +implemented in Q3. Churn needs to await for peers to terminate, we can +improve the synchronisation. [ouroboros-network#4617]

    Ecosystem P2P Deployment Progress

    We reached 50% of stake in hands of SPOs who run at least on P2P relay. Now +also Emurgo and CF are running some P2P relays. Also 20% of IOG relays are +running in P2P mode.

    P2P Progress

    Peer Sharing

    We implemented bootstrapping for peer sharing (also known as light peer +sharing). New downstream (inbound) peers are now added to the known peers of +the outbound governor. Together with peer sharing this allows for non +registered relays to propagate through the network. ouroboros-network#3596

    Please note that peer sharing is disabled by default and is not considered safe +until Bootstrap Peers (see below) or Genesis is implemented.

    Diffusion (P2P)

    • We designed a feature which will reduce the load on IOG relays (in future +also run by CF & Emurgo). The feature consists of two parts. A new source +of peers called bootstrap peers (obtained from via an https request), the +ability to switch from bootstrap peers to ledger peers if the node is synced +(we are collaborating with the consensus team on the interface Bootstrap +Peers IER). This feature will be completed in Q3. +ouroboros-network#4530

    • We published a blog post about P2P design & implementation.

    • Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections: +ouroboros-network#4559.

    • We merged changes which allow the consensus layer to start / stop block +forging thread. This will allow to deploy P2P block producing nodes which +serve as a live backup node. ouroboros-consensus#140

    • We fixed a few bugs in local root peers DNS resolution service: +ouroboros-network#4583, ouroboros-network#4571.

    • We limited concurrency of DNS name resolutions: ouroboros-network#4596.

    • Galois Inc implemented query option for Handshake: ouroboros-network#4256.

    • We fixed handshake query timeout: ouroboros-network#4608.

    • We implemented warm valency for local root peers. This can help when using +DNS names in local root peers which resolve to many IP addresses. ouroboros-network#4575

    • We merged handshake changes which allow query protocol versions. Thanks to +James Parker from Galois Inc.: ouroboros-network#4256, cardano-cli#30.

    Other Improvements & Developments

    CDDL

    • We added node-to-node and node-to-client CDDL specs / tests for encoding +of NodeToNodeVersionData and NodeToClientVersionData.

    • We clarified an inconsistency between CDDL spec and implementation which is +highly polymorphic. We designed and implemented a fix for tx-submission +and local-tx-submission mini-protocols. Specs for other mini-protocols will +be improved at a later stage. ouroboros-network#4580

    Cardano Ping

    IOSim

    Typed Protocols

    Cardano Client

    • We fixed a bug in cardano-client-0.1.0.2 release which results in clients +(e.g. db-sync) negotiate an experimental protocol version.

    Technical debt

    CI improvements

    GHC 9.4 & 9.6

    We made all repositories under our control compile with ghc-9.4 and ghc-9.6 +which includes ouroboros-network, io-sim, typed-protocols and +Win32-network.

    Next steps

    We will continue towards our aspirational roadmap.

    • We will continue reviewing eclipse evasion.
    • As ouroboros-consensus#140 was merged, we are making progress towards +releasing P2P on block production nodes. We hope to analyse performance +regression on such nodes observed on the benchmarking cluster. roadmap-3887
    • We are also focused on roadmap-3969. Note that it was expanded in Q2.
    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[SRE Q2 2023 Update]]> + 2023-Q2-sre + + 2023-12-07T21:19:58.000Z + + 2023-04 - 2023-06

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Expanding the darwin CI cluster and adding aarch64 builder support
    • Adding bare metal capability to bitte clusters
    • Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality
    • Creation of pool performance analysis queries and scripting
    • Migration of testnet metadata server to cardano-world
    • Cardano shelley qa migration to cardano-world
    • Cardano sanchonet environment spin up to test Conway era functionality
    • Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature

    Next steps

    • Continue with the conversion of mainnet to using p2p topology
    ]]>
    + + John Lotoski + https://github.com/johnalotoski + + +
    + + <![CDATA[Performance & Tracing Q3 2023 Update]]> + 2023-Q3-performance-and-tracing + + 2023-12-07T21:19:58.000Z + + 2023-07 - 2023-09

    Main achievements

    • Release benchmarking
    • Developing and running UTxO-HD benchmarks - in-memory flavour
    • P2P benchmarks, facilitating rollout
    • Production-readiness of the new Nomad cluster has been reached
    • Optimization of and introspection capability for the new tracing system
    • GHC9 performance investigation (and possible remedy)
    • Conensus QTAs: first real-world application of prototype

    Release benchmarking

    Ongoing release benchmarking is a crucial safeguard to cardano-node's release cycle from a performance perspective. We've performed and analyzed benchmarks for node versions 8.2.x to 8.5 throughout Q3.

    UTxO-HD benchmarks

    Targeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery.

    P2P benchmarks

    In Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature.

    New nomad cluster

    The new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received +various rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest +of our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it +ready for production use.

    New tracing system

    Our new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that +it is roughly on par with the legacy system while offering a richer feature set and greater flexibility.

    Additionally, in Q3 we equipped the system with an introspection capability. This is now used for generating +end user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system.

    GHC9 performance

    In Q3, a joint investigation with DevX into GHC9's behaviour revealed where and how GHC9 misses opportunities for +optimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable +those optimizations - which is still being validated.

    Consensus QTAs

    In collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations' +performance characteristics. It's now applicable, and being applied, to a real-world task - namely +gathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds.

    Next steps

    Benchmarking:

    In Q4, the focus will be on:

    • facilitating the next mainnet release
    • benchmarking runs in the Conway era
    • developing benchmarks / workloads for Conway-exclusive actions
    • implementing a specialized benchmark setup for the UTxO-HD on-disk variant
    • developing new Plutus benchmarks to safeguard Plutus V3
    • benchmarks regarding the rollout of P2P

    Performance

    For certain blocking performance issues we've located the cause, or even found a solution in a cross-team effort. In Q4 we'll advance that work to ensure the ongoing +release cycle for mainnet, as well as make GHC9 become a viable release platform.

    New tracing system

    For the new tracing system, we'll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support.

    UTxO-HD monitoring

    We'll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way.

    Nomad backend

    From Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad.

    Workbench

    We will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with cardano-node.

    Consensus component QTAs (co-development)

    In Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation.

    ]]>
    + + Michael Karg + https://github.com/mgmeier + + +
    + + <![CDATA[SRE Q3 2023 Update]]> + 2023-Q3-sre + + 2023-12-07T21:19:58.000Z + + 2023-07 - 2023-09

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Completion of mainnet relay networking conversion to p2p topology
    • Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality
    • Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines
    • Creation of a nix content addressed packages repository, capkgs:
      • To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells
    • Creation of a cardano performance benchmarking cluster, cardano-perf:
      • To replace legacy cluster benchmark tooling
    • Creation of a cardano cluster composition repository, cardano-parts:
      • For enabling multi-cluster, multi-role cardano network deployments
    • Creation of a cardano testnets repository, cardano-playground:
      • Utilizing cardano-parts for testnet deployments
    • Creation of a sanchonet demo repository, sanchonet-demo:
      • Utilizing cardano-parts for fast sanchonet test environment and demo purposes

    Next steps

    • Continue with migration of cardano-world testnets to cardano-playground
    • Proceed with spinup of mainnet p2p bootstrap cluster
    • Scale down mainnet non-p2p legacy cluster at the appropriate time
    ]]>
    + + John Lotoski + https://github.com/johnalotoski + + +
    + + <![CDATA[Consensus Quarterly Update]]> + 2023-04-25-consensus + + 2023-04-25T00:00:00.000Z + + Consensus Quarterly Update

    2023-01 - 2023-03

    Main achievements

    UTxO HD

    • We finished the testing activities for the prototype, which involved adding +new tests, and fixing and enabling temporarily disabled tests.
    • We spent a substantial amount of effort refactoring and cleaning the +prototype.
    • We audited the UTxO HD prototype to make sure it can accommodate the migration +of other tables (eg stake-keys registration) from memory to disk. The result +of the audit was positive.
    • We ran ad-hoc benchmarks for reading keys and flushing values to disk. No +unexpected costs found.
    • We ran the first system level benchmarks. The performance regressions reported +were due to an unrealistic snapshotting rate. We need to re-run them again +after we design a more fine grained locking mechanism.

    Genesis

    • We elaborated a roadmap of the remaining work for Genesis.
    • We presented the design to the IOG Researchers and PNSol on February 20. The +design was well received. We updated the Genesis design with the researcher's +feedback.
      • We plugged the new DoS vector identified during the aforementioned +presentation.
    • We developed a generator for adversarial leader schedules that satisfy key +Ouroboros properties, which will be used to test the Genesis design.
      • The generator enables use of smaller Ouroboros parameters, which makes +extrema more likely and counterxamples easier interpret.
    • We wrote up the latest design iteration.
    • We continued benchmarking the Chain Sync Jumping prototype. In particular:
      • We debugged the prototype's performance regression, and unmasked the +actual cause by patching our initial theory (bad queuing behavior)
      • We identified and validated the actual cause (a pathological case in +BlockFetch tiebreaker).

    Support

    • We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother +to serve a local immutable DB.

    Conway era

    • We integrated the Conway era into consensus.

    Technical debt

    • We fixed a bug with followers, which was discovered by property tests.
    • We developed a DSL for specifying and running ChainDB test cases.
    • We fixed failing tests with iterators.
    • We created micro-benchmarks for adding transactions to the mempool.

    Fostering collaboration

    • We released a new technical documentation site for consensus.
    • We factored out several packages to external repositories. Some of this work +originated in the UTxO HD workstream.

    Next steps

    UTxO HD

    Genesis

    Support

    • Design Consensus side of hardfork-enactment in the Voltaire phase +(#4180).
    • Estimate the number of file descriptors Consensus needs +#20.

    Tech debt

    • Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define +for consensus. Pick one and implement benchmarks for it.

    Fostering collaboration

    • Onboard a new team member.
    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Network Q1 2023 Update]]> + 2023-04-04-network + + 2023-04-04T00:00:00.000Z + + 2023-01 - 2023-03

    Main achievements

    Gradual dynamic P2P release on mainnet

    We released two version of cardano-node with dynamic P2P capabilities:

    • 1.35.6
      • we found and fixed a bug in exception handling in peer-state-actionspull-4357
      • we found and fixed a busy loop when demoting a peer from hot to warm pull-4385
    • 1.35.7
      • includes interoperability in the legacy non-p2p network stack pull-4467
    • we fixed a busy loop of demotion & promotions: warm -> hot -> warm[pull-4485] /it will be included in cardano-node-8.0.0 release/.

    Currently there are more than 200 P2P relays on mainnet.

    Peer Sharing

    We implemented /peer sharing/ pull-4019 which will be available as an +experimental feature in one of the future cardano-node releases.

    We implemented /light peer sharing/, e.g. adding inbound connections to the set +of known peers of the outbound governor, which allows to bootstrap relays not +registered on chain. This complements peer sharing. The pull-4277 is in +late review stages.

    Eclipse Evasion

    We finalised design of eclipse evasion and we started implementing it. We +have an initial implementation (not merged). We are in the process of extending +our test suite to cover new implementation details: issue-3886, pull-4462.

    Cardano Network Service Assurance

    Galois has been making progress on Cardano Network Service Assurance project.

    • In cardano-node, they have developed a datapoint abstraction that creates +a queue of (existing) log events, they now have two such datapoints (of log +events) implemented.

    • They have developed a datapoint client executable that can connect to a node +which serves the "new tracing".

    • They have been exploring approaches for the consolidation and analysis of +datapoint data to extract actionable network health status.

    Cardano-Node

    • We made it possible to configure accepted connections limit pull-4902.

    Testing improvements

    • We fixed a bug in network simulation implementation of TCP simultaneous open pull-4265.

    • We introduced header-body split in the diffusion simulation pull-4419 (in review).

    • We introduced initiator only nodes in the diffusion simulation pull-4280.

    • We fixed a connection-manager test failure issue-4370.

    Technical Debt

    • We refactored Snocket interface decoupling it from the multiplexer +pull-4260. This simplified some aspects of the KES agent implementation.

    • We introduces a record for CBOR codecs which are used for various data +structures by mini-protocol codecs pull-4430.

    Documentation

    • We explained some limitations of CDDL in our technical report pull-4351.

    IO-Sim

    • We fixed implementation of MVar's pull-70.

    NoThunks

    • We published a new version of nothunks library to Hackage.

    Next steps

    • Finish implementation & testing of eclipse evasion issue-3886.
    • Optimise connectivity to peers behind firewall issue-4381.
    • Finish the work on enabling block production dynamically to allow using P2P +on block producers issue-3159.
    • If time permits we would like also to reserve some time for finishing +publication of io-sim to Hackage.
    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Ledger Team Update]]> + 2023-04-03-ledger + + 2023-04-03T00:00:00.000Z + + Ledger Quarterly Update

    2023-01 - 2023-03

    Main achievements

    CIPs

    • Entering the Voltaire phase - +CIP-1694 received a major update after participation in the design has expanded to +more and more people, including those who attended the Colorado workshop. +See CIP-1694.
    • Ledger CIP category - +The ledger team continues to embrace the CIP process, and has begun the process of +registering the ledger as an official CIP category. +See CIP-84.
    • Ledger serialization - +A CIP for the ledger serialization deprecation cycle has been accepted. +See CIP-80.

    Formal ledger model

    Our new formal specifications backed by Agda have seen a lot of progress. +The majority of the ideas in CIP-1694 are now present, and we have made enough progress +that we can now safely say that the PDF produced by the Agda model will be the +official ledger specification for the Conway ledger era. +See the repository.

    Conway ledger era

    Progress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model. +The major component still missing is the DRep stake distribution, which still presents some +technical challenges.

    [pull-3176] +[pull-3216] +[pull-3226] +[pull-3291] +[pull-3326] +[pull-3330] +[pull-3339]

    DRep stake distribution computation

    Adding another large stake distribution to the ledger state must proceed with caution. +We do not want the memory used by the node to increase too much, +and performance problems can lead to reduced block production. +We have prototyped, tested, and benchmarked several approaches that could give us +the current DRep stake distribution at each epoch boundary. +This has very important implications, since we want every ADA holder to be able to at any +time (such as during a contentious vote) register themselves as a DRep and still have time +to vote themselves on the issue.

    [pull-3344] +[pull-3353] +[pull-3364]

    Integration work

    The ledger has made some wonderful improvements over the past six months, +but which entail a significant amount of integration efforts:

    • Our new versioned CBOR schemes
    • Individual deposit tracking
    • An improved cross-era interface utilizing lenses
    • A new ledger API
    • Re-arranging the ledger stake in preparation for CIP-1694
    • Versioning our Haskell packages +using CHaPs.
    • Consistent conventions for variable names

    [pull-3279] +[pull-3282] +[pull-3288] +[pull-3289] +[pull-3292] +[pull-3297] +[pull-3298] +[pull-3299] +[pull-3300] +[pull-3302] +[pull-3303] +[pull-3308] +[pull-3342] +[pull-3345] +[pull-3356] +[pull-3357] +[pull-3360] +[pull-3361] +[pull-3363] +[pull-4349] +[pull-378] +[pull-376] +[pull-373] +[pull-370] +[pull-361] +[pull-4976] +[pull-5013]

    Deposit tracking

    Individual deposits (for stake credential and stake pool registrations) were not tracked by the ledger. +Deposits were returned according to the current protocol parameters. +When the values of these two protocol parameters change, the deposit pot +is adjusted by adding to, or removing from, the reserves.

    This has several problems:

    • Most people expect a deposit to be paid back exactly.
    • We cannot increase the deposit amount once the reserves hits zero.
    • If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials.
    • Because of the problems above, it is going to be incredibly hard to ever change the values.
    • There is a serious issue involving hard forks. +The consensus layer makes the decision about whether or not to enact a hard fork based on +the protocol parameter update state two stability windows before the end of the epoch. +However, the ledger will reject a protocol parameter update on the epoch boundary +if the deposit pot adjustments cannot be reconciled with the reseve pot. +This means that if quorum is met regarding changing the major protocol version, +but the update is rejected on the epoch boundary, consensus will change the era but the +ledger will not change the major protocol version, leaving the ledger in a split-brain state.

    Because we never actually changed the values of the two deposits amounts in the protocol parameters +on mainnet, we were able to retroactively change the behavior. +We made the following changes:

    • Individual deposits are tracked in the DState.
    • The amount deposited is always returned.

    [pull-3195] +[pull-3202] +[pull-3217]

    New ledger API

    We have significantly built up the ledger API. +We will eventually replace much of the cardano-api in the node repository with this ledger API.

    [pull-3242] +[pull-3248] +[pull-3328]

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We have a new declaritive infrastructure for building constraint-based generators, +which instead generate a random ledger state representative of not just an initial state, +but also those representative of the end result of a long sequence of valid blocks. +Moreover, these generators are very fast and are much more random than our old generators. +Before we can start using them for our existing property tests, however, we still need to +expand them to generate a valid block for a given ledger state.

    [pull-3219]

    Technical debt

    We continued to address technical debt as much as we can.

    [pull-3167] +[pull-3170] +[pull-3172] +[pull-3175] +[pull-3184] +[pull-3205] +[pull-3208] +[pull-3210] +[pull-3212] +[pull-3218] +[pull-3222] +[pull-3223] +[pull-3224] +[pull-3225] +[pull-3229] +[pull-3239] +[pull-3241] +[pull-3244] +[pull-3245] +[pull-3249] +[pull-3260] +[pull-3263] +[pull-3264] +[pull-3268] +[pull-3269] +[pull-3270] +[pull-3274] +[pull-3276] +[pull-3277] +[pull-3286] +[pull-3290] +[pull-3295] +[pull-3296] +[pull-3306] +[pull-3307] +[pull-3310] +[pull-3311] +[pull-3316] +[pull-3320] +[pull-3323] +[pull-3327] +[pull-3331] +[pull-3332] +[pull-3333] +[pull-3338] +[pull-3341] +[pull-3347] +[pull-3350] +[pull-3351] +[pull-3352] +[pull-3354]

    Critical fixes

    We fixed two critical issues:

    • Growing block production delay on the epoch boundary: [pull-3209]
    • Unexpected node shutdown from balanceR: [pull-3343]

    Next steps

    • Conway spec - +Complete the first version of the conway formal specification.
    • DRep stake distribution - +Have the ledger compute the DRep stake distribution with acceptible performance.
    • Devnet ready - +Have the Haskell implementation of the conway era in sync with the formal specification, +and integrate the changes with consensus and node. +All the details might not be finalized, but the wire specification and the API should +be stable so that conway can be placed on a devnet for tool builders to start integrating with.
    • Plutus V3 - +Integrate Plutus V3 into the ledger, including a new script context which supports DReps.

    More details

    This quarterly report was based off of the following fortnightly ones:

    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Consensus Quarterly Update]]> + 2023-01-18-consensus + + 2023-01-18T00:00:00.000Z + + Consensus Quarterly Update

    2022-12 - 2023-01

    Main achievements

    UTxO HD

    The prototype is feature complete and thoroughly tested at the consensus level. +In particular, we invested a lot of time in writing property-test for the +mempool, and other crucial new parts of the prototype. Now we are ready to run +integration tests and system-level benchmarks.

    Genesis

    We identified and fixed a slowdown in cross-era forecasting that was inhibiting +our efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7% +speedup in full sync times in the baseline.

    We also started prototyping a self-contained implementation of the Genesis +dynamics (in particular of the parts intentionally not part of the ChainSync +Jumping prototype) that furthered our understanding of subtleties and edge +cases.

    Support

    • We worked on designing integration of new VRF and KES crypto into consensus.
      • Crypto class was split into two parts: Crypto and HeaderCrypto.
      • With the Ledger team's help, we refactored cardano-ledger to use a proxy +type for VRF.

    Conway era

    • PR went through its second review round. It is about to be merged, but it got +delayed due to people's availability during Christmas break.

    Technical debt

    • We improved the capabilities of our io-sim library, which is key for testing +and simulating Cardano components.
    • We removed thunks from epoch translations in the ledger, which is important +for reducing memory consumption of the Cardano node.

    Fostering collaboration

    • We added a tutorial on how to instantiate the Consensus layer to run custom +ledgers. This should be a valuable resource to people looking to roll their +own custom blockchain (either for commercial or research purposes).
    • We added an overview of consensus to the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    Next steps

    UTxO HD

    • Evaluate the extensibility of the prototype. Moving the UTxO to disk is only +the first step towards reducing the memory requirements of Cardano node, and +ensuring its long term sustainability. In the future, we plan on moving other +large maps, such as delegation maps. The prototype should be able to +accommodate these changes without any major modifications.
    • Start the integration with other downstream components, such as the wallet and +db-sync. The idea is to identify and address any potential pain points that +might arise during this integration.
    • Run integration tests and system-level benchmarks.

    Genesis

    • Finish benchmarking and tuning the fast-path ChainSync Jumping prototype
    • Expand and optimize the self-contained implementation of the Disconnect Rule +(including density comparisons and the LoE)
    • Develop documentation and smoke tests for these components.
    • Start modifying the ChainSync Client for the LoP and LoR.

    Support

    • Help the Network team with diagnosing performance regression in block +production.

    Tech debt

    • Fix property-test failures concerning iterators (#3999 and +#4183).

    Fostering collaboration

    Risks

    UTxO HD

    • Moving other parts of the ledger state to disk might require a major redesign +of the prototype. For instance, if it turns out that the epoch change rules +require access to the full ledger state. If this is the case, we might +accept this risk and do the redesign after the initial release of UTxO-HD.
    • Integration with downstream clients might require more work than we +anticipate.
    • Access to the benchmarking's team time and resources.
    • Benchmarking results might show significant performance degradation, which +will require additional work if such performance degradation is not accepted +by other stakeholders.
    • The prototype's performance might not be accepted by other stakeholders. Here +we need to clearly communicate that this is necessary to ensure that as the +blockchain size grows, the node can operate within reasonable memory +constraints.
    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Network Quarterly Update]]> + 2023-01-13-network + + 2023-01-13T00:00:00.000Z + + Network Quarterly Update

    2022-11 - 2023-01

    Summary

    The primary goal of the networking team was to focus on the single relay +release of P2P. We fixed a number of small late bugs, and concluded QA +& performance testing. Although it was discovered a regression in performance +of block production when P2P is enabled, relaying with P2P performs better +comparing to a non p2p. We concluded that this is not a blocker for the Single +Relay Release which is planned shortly.

    Peer sharing has gone through review and final review is +just being done right now. After merging it will still be disabled (hidden +behind a flag) as it's not safe without eclipse evasion. We started +implementing light peer sharing (i.e. include inbound peers into known peer set +of the outbound governor).

    We started a detailed eclipse evasion design, it will continue in the next +quarter.

    We also made a major revision of package structure of the network packages. We +ended up with a very clean dependency graph (pr #4155).

    Armando Santos delivered a talk at the ODOPIS 2022 conference on principles +of distributed systems in Brussels. The slides are available here.

    Neil Davies gave an invited seminar on DeltaQ at Université Catholique de +Louvain.

    We also found and fixed a few of bugs:

    • a bug in keep alive mini-protocol which resulted in warm to cold transitions +to be always executed through a timeout path rather than do a clean demotion +([pr #4168]).

    • fixed an assetion failure in the outbound governor (issue #4177)

    Next steps

    We will work towards the next release of P2P for block producer nodes. This includes:

    • analysing performance regression for BP nodes when using P2P
    • finish the work on controlling the block forger through node kernel (pr #3800)
    • address issue #3907 and write a script to analyse deployment of P2P relays

    We would like also to push forward eclipse evasion. Although most of the work +has be done already the release of io-sim on Hackage will happen in the +next quarter.

    We would also like to address chain-sync timeout issue recently +diagnosed by Karl Knutsson.

    If time permits we would also like to address some technical debt, especially:

    Risks

    The performance regression for block producer with P2P needs to be investigated +in the near future. This is blocker for the release of P2P on BP nodes.

    Detailed log

    Contributions to Ouroboros-Network

    • We added TraceDemoteLocalAsynchronous, which enables notification of critical issues for SPOs
    • We fixed cardano-ping compatibility with NodeToNodeV_10 (P2P, pr #4165)
    • We fixed a bug in demotion peers to cold which affected P2P nodes (commit-61058aa5c2)
    • Karl Knutsson enhanced SendFetchRequest (commit-bb1c3dddee), open-source contribution)
    • We turned SizeInBytes into a newtype.
    • We extended CONTRIBUTING.md, README.md, added CODE_OF_CONDUCT.
    • We fixed DNS test failure issue #4191
    • We fixed a simulation bug found in issue #4258
    • [pr #4168]
    • issue #4177

    Contributions to Cardano-Node

    • We maintained the Single Relay Release pr #4612, (e.g. fixing CI issues, +Rebasing it when necessary, publishing packages to Cardano Haskell Packages);
    • We enhanced JSON serialisation / deserialisation of NodeToNodeVersion and NodeToClientVersion;

    Contributions to IOSim

    • We started to use Cardano Haskell Packages for IOSim (pr #48)
    • We updated change log files
    • We added support of ghc-9.4 (pr #50)

    We also addressed the following issues in pr #57 in order to prepare the package for publication on Hackage:

    • refactored io-classes timers API (issue #46);
    • created a new package si-timers which exposes an interface using SI units +and is safe on 32-bit systems (issue #59);
    • added monad transformers instances for classes defined in io-classes (issue #58);
    • created io-classes-mtl package which includes (experimental) instances for monad transformers;
    • provide MonadMonotonicTimeNSec in io-classes and MonadMonotonicTime in si-timers (so that io-classes follow the base package);
    • added registerCancellableDelay in si-timers (which allowed us to hide fancy timer api and clean io-classes)
    • added support for js_HOST_ARCH (the new GHC JS backend)

    Note the pr #57 contains almost 40 commits, and was a major step forward for +io-sim ecosystem. We also prepared a draft pr #4281 which updates +ouroboros-network.

    Other changes for 1.0.0.0 release on Hackage:

    • Refactored test suite (pr #47)
    • Updated documentation, cabal files, CONTRIBUTING, SECURITY documents, etc in pr #60, currently under review.
    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Open-Source Update]]> + 2023-01-13-open-source + + 2023-01-13T00:00:00.000Z + + Open Source Quarterly Update

    2022-11 - 2023-01

    Summary

    In the last quarter the open-source initiative delivered a comprehensive report +on the state of our repositories. As part of this work stream we +identified the key open-source repositories for the cardano project across all +the projects From a list of more than 500 repositories (some of which are +forks) we identified key repositories which constitute the core of Cardano. +20 of them were identified as to be transferred to the future MBO which will +govern Cardano development. Some where excluded (like io-sim and +typed-protocols), to be govern by IOG, since they have a much broader +application than Cardano itself, and thus we think their open-source future +will be better outside of the Cardano umbrella.

    Christian Taylor identified a number of ways we can improve our repositories to +make them more attractive for open-source contributions by analysing each of +them. This includes adding or improving various documentation files, like +CONTRIBUTING files, adding code of conduct, improving readme files, issue +& pull request templates etc. Christian also computed various interesting +metrics which gives a very good insight into the development practices: e.g. +average merge ratio, average number of reviews, comments and many more! The +presentation is available here.

    We followed with work on the Cardano Engineering Handbook. We included +a standard code of conduct which is now used by most important projects in the +Cardano space. We included cardano-node's security policy and added +a responsible disclosure policy. We also described how roles and +responsibilities should be clarified. This progress was made by +a collaborative effort of the Cardano Core, Plutus and Architecture teams, and +it wouldn't be possible without Michael Peyton Jones, Arnaud Bailly, Kevin +Hammond, Jared Corduan and Marcin Szamotulski.

    We also improved the documentation of key repositories, by adding description, +improving their README file & CONTRIBUTING files, adding code of conducts +following the Cardano Engineering Handbook. This includes improvements to:

    And also

    The work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan.

    In this quarter we also identified a number of projects which can be published to +Hackage (Haskell's package repository) or crate (Rust package repository). +The list contains 21 packages, 2 of which (hedgehog-extras and +quickcheck-dynamic) are already published on Hackage and another 5 (from +the io-sim repository) are close to be published.

    Detailed log

    The progress of the open-source project is tracked in this project.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Consensus Quarterly Update]]> + 2022-11-15-consensus + + 2022-11-15T00:00:00.000Z + + Consensus Quarterly Update

    2022-09 - 2022-11

    Main achievements

    UTxO HD

    • As a consequence of the errors observed when running distributed mempool +benchmarks, we re-designed the UTxO HD mempool integration, which fixed these +errors and lead to a simpler and more maintainable design.

    • We focused on increasing test coverage for the UTxO-HD prototype. In +particular, we added property tests for:

      • Backing store (work ongoing)
      • Era transitions
    • The property tests we added uncovered several bugs, which is a great result +given the exponential increase in the cost of finding bugs as they are closer +to deployment.

    • One of the errors found by our tests required us to work on improvements in +the Haskell bindings for LMDB. This work is ongoing.

    • We started working on the mempool property tests that will exercise the new +code paths that UTxO HD introduced.

    • We developed, benchmarked and tested an implementation of sequences of +differences based on "anti-diffs". Performance results of diff sequence +operations show that we achieved a speedup of about 4x across several +scenarios. Note: this speedup is taking into account diff sequence operations +only, so the consensus-wide speedup is less than 4x.

    • We integrated the "anti-diff" prototype into the UTxO HD feature branch.

    Genesis

    • We wrote a simulator that demonstrates soundness of an abstract implementation +of the new chain selection rule.
    • We elaborated a draft specification for the Genesis implementation (currently +awaiting feedback from other architects).
    • We elaborated a draft specification for the ChainSync Jumping optimization. In +particular, this includes a proof sketch that the latter preserves liveness +and safety in all cases.
    • With the Networking team, we co-designed the eclipse avoidance mechanism, +specifically its coherence with the Genesis implementation plan's security +and its dependence on the new ChainSync Jumping optimization.
    • We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a +performance degradation wrt the baseline. Our optimization attempts so far +have brought the performance closer to the baseline, but not yet to parity.

    Conway era

    • We did most of the heavy lifting required to integrate the Conway era into the +Consensus layer.

    Technical debt

    • We started working on enabling CI nightly tests, which revealed several test +failures due to thunks being found it data structures used by the ledger and +consensus. We made a lot of progress fixing those thunk errors, but some +errors still remain.

    • We elaborated a db-analyser benchmark for the ledger operations. This led us +to the identification of high processing time at epoch boundaries, and we +could not observe any performance degradation that can be attributed to era +changes.

    • We fixed a source of flakiness in the ChainDB QSM test.

    • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    • We fixed a bug in the maximum-allowed ledger major protocol version.

    Fostering collaboration

    • We spent time making cardano-updates the central source of information for +the core teams stakeholders.
    • We went through the Galois gap analysis and extracted actionable points to +take on next.
    • Bart and Yogesh continued with their onboarding and stated making substantial +contributions to consensus.

    Next steps

    UTxO HD

    • Finish the mempool property tests.
    • Benchmark the latest version of the prototype.
    • Elaborate a document that describes new integration test scenarios and pass it +to the SDET team.
    • Bring query UTxO by address command performance on par with the baseline +version.

    Genesis

    • Receive and incorporate Duncan's feedback on the first draft specification for +the Genesis implementation.
    • Begin prototyping the first genesis implementation, unless the first draft +needs major changes.
    • Draft a second revision of the Genesis report.
    • Review the second revision with a wider audience, which includes at least +Alexander Russell. That feedback will drive a third and hopefully final +revision.
    • Investigate how to mitigate the ~30% slowdown we have observed so far in the +ChainSync jumping prototype, and try to mitigate it. In particular, we might +need to optimize the existing BlockFetch logic.

    Tech debt

    • Enabling nightly CI tests.

    Fostering collaboration

    • Merge the tutorial document Galois wrote; requires CI integration.
    • Come up with our own documentation improvements, many of which were suggested +in the Galois gap analysis.
    • Try to hire a new team member.
    ]]>
    + + Damian Nadales + https://github.com/dnadales + + +
    + + <![CDATA[Network Team Update]]> + 2022-11-09-network + + 2022-11-09T00:00:00.000Z + + Network Quarterly Update

    2022-09 - 2022-11

    Summary of most important improvements

    During this quarter the networking team delivered low level specification of +peer sharing & eclipse evasion. We held a session with the consensus & the +scientists; we got a positive feedback on the design.

    Further we focused on implementation of peer sharing. We produced a detail +design and an early implementation.

    We prepared the P2P Single Relay Release (cardano-node-1.35.5). It +includes over 130 patches of network stack improvements over the +previous version 1.35.4, which were accomplished over a longer period of +time. Among them are both bug fixes and UX improvements for stake pool +operators like simplified format of the topology file, or +improvements in the logged messages:

    We also provide better integration with systemd (socket +activation improvements) or improvements in the networking stack:

    • exit policies,
    • peer metrics improvements,
    • DNS TTL improvements (which make it harder to misconfigure the +system, an issue discovered by the performance & monitoring team),
    • do not trigger inbound idle timeout for node-to-client connections (pr +#3844), an issue reported to us by Matthias Benkort from +Cardano Foundation.

    Duncan has been making progress with the input endorsers demo. His simulation +provides a useful animated visualisation and live quantification of behaviour +of the modeled design.

    We also improved our e2e diffusion simulation by implementing header-body +split, similar to what the real implementation does.

    We also made some advances towards our future goals of P2P release for block +producer nodes (pr #3800 - in review) & for Daedalus users +(pr #3690 - merged).

    Detailed log

    • We expanded diffusion simulation with block-fetch protocol bringing it closer +to the production system.

    • We addressed some additional technical depth in diffusion simulation

    • We slightly improved documentation & CI of io-sim and typed-protocols +repositories for open-source contributors.

    • We closed a number of issues towards publishing io-sim on Hackage (only two +essential issues are left open).

    • We pushed a branch of typed-protocols which captures one of the developer UX +problems in the API which we need to solve.

    • We identified and fixed an issue related to systemd sockets.

    • We identified and fixed an issue in consensus initialisation not giving +feedback on early errors.

    • We deployed RT View, identified a number of issues which were communicated to +the performance & monitoring team.

    • We finished high level & detailed design of peer sharing, very early +implementation of peer sharing is done (note that peer sharing cannot be +safely deployed without eclipse evasion & genesis).

    • We finished high level design of eclipse evasion, and started working on +a detailed design.

    • We were assigned the role of release engineer for 1.35.5 release (the P2P +single relay release); we prepared a cardano-node for 1.35.5 release which +contains more than 130 patches of just network stack improvements done over +last few months.

    • We diagnosed and fixed an tricky bug in the peer state actions (a component +which sits between outbound governor and connection manager). That bug was +introduced earlier this year and never released. It was caught by the QA +testing framework. We expanded our diffusion simulation to cover such case and +also mitigated a chance for reintroducing such a bug in future.

    • We identified and quite likely mitigated a misconfiguration in the +benchmarking cluster (next benchmarking run will confirm our hypothesis).

    • We simplified the format of p2p topology file, we got positive feedback from +SPOs.

    • We raised severities of some of the logging messages, which is an important +improvement for SPOs, exchanges and other users of the system.

    • We worked on input endorsers simulation which gives both animated and +quantified live feedback on network operation, using a simplified model of +a TCP/IP network.

    Next quarter

    • Release the Single Relay P2P Release 1.35.5.

    • Carry on with Peer Sharing (review, testing).

    • Deliver a talk at Conference on Principles of Distributed Systems 2022 in Brussels, Belgium.

    • Present Detailed Design of Eclipse Evasion and start implementation phase.

    • Work on P2P Block Producer release.

    • Carry on with publishing of io-sim on Hackage.

    ]]>
    + + Marcin Szamotulski + https://github.com/coot + + +
    + + <![CDATA[Ledger Team Update]]> + 2022-11-07-ledger + + 2022-11-07T00:00:00.000Z + + Ledger Quarterly Update

    2022-09 - 2022-11-04

    • We finished a minimal ledger era capable of master key rotation. +This will be re-purposed our upcoming work.
    • We have the humble beginnings of a proper ledger API.
    • We improved the problematic cost model serialization +(recall the song and dance about updating the cost model one epoch after the hard fork).
    • We have added benchmarks for problematic areas.
    • Massive repository restructure and cleanup.
      • Unified and consistent variable name schemes (not completely finished, but nearly there).
      • Massive reduction in type constraints, which causes a lot of developer friction, +in our code and also downstream.
      • More organized module structures.
      • Improved generators for our property tests.
      • We removed our dependency on cardano-prelude.
    • The formal ledger model has come a long way.
      • We created a fork of Agda that provides some meta-programming support for the ledger rules.
      • We have a large amount of the basic UTxO support in the model.
      • We can generate a good looking PDF from the model.
      • We can produce Haskell from the model.
      • We have a nice finite set theory library that we can use for many of the ledger rules.
      • We have nix support for the model.

    Next steps

    • Individual tracking of deposits. [issue-3113]
    • Versioned CBOR encoders/decoders. [issue-3014]
    • New ledger era transaction body (and the surround work associated with it).
    • Designs for the next ledger era.
    ]]>
    + + Jared Corduan + https://github.com/JaredCorduan + + +
    + + <![CDATA[Node API & CLI Team Update]]> + 2022-10-07-node-cli-api + + 2022-11-07T00:00:00.000Z + + Node-Api-Cli Quarterly Update

    2022-09 - 2022-11-04

    • Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0
    • Major clean up of stale iusses + PRs.
    • Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs
    • cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node.
    • cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation.
    • General documentation updates and improvements
    • Addition of tx-mempool command which allows users to:
      • Query the node about the current mempool's capacity and sizes
      • Request the next transaction from the mempool's current list
      • Query if a particular transaction exists in the mempool
    • Initial refactoring of cardano-testnet

    Next quarter

    • cardano-api
      • Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately.
    • cardano-testnet
    • Serenity
      • Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above.
    • General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new.
    ]]>
    + + Jordan Millar + https://github.com/Jimbo4350 + + +
    +
    \ No newline at end of file diff --git a/quarterly/index.html b/quarterly/index.html new file mode 100644 index 00000000000..8d90f95c386 --- /dev/null +++ b/quarterly/index.html @@ -0,0 +1,326 @@ + + + + + +Blog | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 5 min read
    Damian Nadales

    2023-04 -- 2023-06

    Main achievements

    UTxO HD

    • We finished a major prototype refactoring, which includes:
      • A better and finer grained DB lock mechanism.
      • Elimination of race conditions.
      • Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance.
      • Architectural simplifications and performance improvements.
    • We implemented a new package to support db-sync integration with UTxO-HD.
    • We ran another set of ad-hoc benchmarks:
      • We uncovered a performance regression on the Network component when using GHC-9.2/9.4.
      • The synchronization and replay speed are as expected.
      • However, we uncovered memory consumption issues (see figure below).
        • The in-memory backend is consuming more memory than the baseline.
        • The LMDB backend shows an unexpected memory usage peak.
        • Investigation on these issues is ongoing.
    • We integrated the latest changes in main branch.
      • This required a re-design of the mempool to include the mempool fairness +improvement.

    Genesis

    • The Genesis work for this PI focused on an high-priority issue from the IOG Researchers' feedback on the proposal.
      • This particular question was not anticipated when the Q2 PI was planned.
      • As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized.
      • That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package.
    • The IOG Researchers' feedback on the design was very valuable. It had two primary effects.
    • Outcome 1: We re-introduced distinct behaviors when the node is "syncing" versus when it is "caught up".
      • This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated.
      • The additional design complexity is relatively small.
    • Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.
      • The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era.
      • All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras.
      • Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later.
      • The primary invention was a model for bounding how much benefit the adversary's long-range attack could possibly gain from Praos's natural short forks.
    • Relevant questions that the IOG Researchers are still assessing.
      • These do not block the Genesis implementation, but do affect the ultimate values of specific parameters.
      • Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?
      • Question 2: what is the upper bound on how much grinding can improve the adversary's leader schedule within some Genesis window?

    Support

    • We performed an analysis on number of file descriptors used by Consensus, this +information can be used by the node operators to check if the number of file +descriptors they want to support are enough, thus improving the user (eg node +operator) experience.
    • We implemented a mempool fairness improvement, by which transactions are +guaranteed to be processed irrespective of their size.

    Technical debt

    • We fixed a bug in followers logic, which was discovered by our QuickCheck +property tests.
    • We created an immutable DB +server. This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results.
    • We created a db-truncater tool, which can be used in disaster recovery and benchmarking scenarios.
    • We created a benchmarks comparison tool that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance improvements introduced by the Ledger team in version 0.6.0.0 of Consensus wrt version 0.5.0.0.

    Fostering collaboration

    • We released fs-sim as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project.
    • We migrated the consensus code to a new repository, splitting +it from the ouroboros-network repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases).
    • We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users).
    • We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.

    Next steps

    UTxO HD

    Genesis

    • We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work.

    · 6 min read
    Marcin Szamotulski

    2023-04 - 2023-06

    Main achievements

    Eclipse Evasion

    We finalised the design of eclipse evasion and implemented its mechanism which +relays on connectivity to big ledger peers. Big ledger peers are the +largest ledger peers which accumulate 90% of stake (currently there are less +than 1000 of them). The outbound governor has new targets for known, +established and active big ledger peers which work in a similar way that +such targets work for ledger peers. The ouroboros-network#4662 PR is +currently in review.

    As part of this work we also identified a bug which would prevent a node to +connect to itself. Such connections are not easily detectable and are expected +to be dropped by the churn mechanism, nonetheless they should not be buggy. +The failure was discovered thanks to our e2e simulation of diffusion using +io-sim & property based testing.

    The PR also refactors the heart of the ouroboros-network interface reducing +technical debt that would otherwise accumulate.

    We also identified a possible improvement in the churn mechanism, which will be +implemented in Q3. Churn needs to await for peers to terminate, we can +improve the synchronisation. [ouroboros-network#4617]

    Ecosystem P2P Deployment Progress

    We reached 50% of stake in hands of SPOs who run at least on P2P relay. Now +also Emurgo and CF are running some P2P relays. Also 20% of IOG relays are +running in P2P mode.

    P2P Progress

    Peer Sharing

    We implemented bootstrapping for peer sharing (also known as light peer +sharing). New downstream (inbound) peers are now added to the known peers of +the outbound governor. Together with peer sharing this allows for non +registered relays to propagate through the network. ouroboros-network#3596

    Please note that peer sharing is disabled by default and is not considered safe +until Bootstrap Peers (see below) or Genesis is implemented.

    Diffusion (P2P)

    • We designed a feature which will reduce the load on IOG relays (in future +also run by CF & Emurgo). The feature consists of two parts. A new source +of peers called bootstrap peers (obtained from via an https request), the +ability to switch from bootstrap peers to ledger peers if the node is synced +(we are collaborating with the consensus team on the interface Bootstrap +Peers IER). This feature will be completed in Q3. +ouroboros-network#4530

    • We published a blog post about P2P design & implementation.

    • Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections: +ouroboros-network#4559.

    • We merged changes which allow the consensus layer to start / stop block +forging thread. This will allow to deploy P2P block producing nodes which +serve as a live backup node. ouroboros-consensus#140

    • We fixed a few bugs in local root peers DNS resolution service: +ouroboros-network#4583, ouroboros-network#4571.

    • We limited concurrency of DNS name resolutions: ouroboros-network#4596.

    • Galois Inc implemented query option for Handshake: ouroboros-network#4256.

    • We fixed handshake query timeout: ouroboros-network#4608.

    • We implemented warm valency for local root peers. This can help when using +DNS names in local root peers which resolve to many IP addresses. ouroboros-network#4575

    • We merged handshake changes which allow query protocol versions. Thanks to +James Parker from Galois Inc.: ouroboros-network#4256, cardano-cli#30.

    Other Improvements & Developments

    CDDL

    • We added node-to-node and node-to-client CDDL specs / tests for encoding +of NodeToNodeVersionData and NodeToClientVersionData.

    • We clarified an inconsistency between CDDL spec and implementation which is +highly polymorphic. We designed and implemented a fix for tx-submission +and local-tx-submission mini-protocols. Specs for other mini-protocols will +be improved at a later stage. ouroboros-network#4580

    Cardano Ping

    IOSim

    Typed Protocols

    Cardano Client

    • We fixed a bug in cardano-client-0.1.0.2 release which results in clients +(e.g. db-sync) negotiate an experimental protocol version.

    Technical debt

    CI improvements

    GHC 9.4 & 9.6

    We made all repositories under our control compile with ghc-9.4 and ghc-9.6 +which includes ouroboros-network, io-sim, typed-protocols and +Win32-network.

    Next steps

    We will continue towards our aspirational roadmap.

    • We will continue reviewing eclipse evasion.
    • As ouroboros-consensus#140 was merged, we are making progress towards +releasing P2P on block production nodes. We hope to analyse performance +regression on such nodes observed on the benchmarking cluster. roadmap-3887
    • We are also focused on roadmap-3969. Note that it was expanded in Q2.

    · One min read
    John Lotoski

    2023-04 - 2023-06

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Expanding the darwin CI cluster and adding aarch64 builder support
    • Adding bare metal capability to bitte clusters
    • Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality
    • Creation of pool performance analysis queries and scripting
    • Migration of testnet metadata server to cardano-world
    • Cardano shelley qa migration to cardano-world
    • Cardano sanchonet environment spin up to test Conway era functionality
    • Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature

    Next steps

    • Continue with the conversion of mainnet to using p2p topology

    · 4 min read
    Michael Karg

    2023-07 - 2023-09

    Main achievements

    • Release benchmarking
    • Developing and running UTxO-HD benchmarks - in-memory flavour
    • P2P benchmarks, facilitating rollout
    • Production-readiness of the new Nomad cluster has been reached
    • Optimization of and introspection capability for the new tracing system
    • GHC9 performance investigation (and possible remedy)
    • Conensus QTAs: first real-world application of prototype

    Release benchmarking

    Ongoing release benchmarking is a crucial safeguard to cardano-node's release cycle from a performance perspective. We've performed and analyzed benchmarks for node versions 8.2.x to 8.5 throughout Q3.

    UTxO-HD benchmarks

    Targeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery.

    P2P benchmarks

    In Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature.

    New nomad cluster

    The new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received +various rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest +of our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it +ready for production use.

    New tracing system

    Our new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that +it is roughly on par with the legacy system while offering a richer feature set and greater flexibility.

    Additionally, in Q3 we equipped the system with an introspection capability. This is now used for generating +end user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system.

    GHC9 performance

    In Q3, a joint investigation with DevX into GHC9's behaviour revealed where and how GHC9 misses opportunities for +optimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable +those optimizations - which is still being validated.

    Consensus QTAs

    In collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations' +performance characteristics. It's now applicable, and being applied, to a real-world task - namely +gathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds.

    Next steps

    Benchmarking:

    In Q4, the focus will be on:

    • facilitating the next mainnet release
    • benchmarking runs in the Conway era
    • developing benchmarks / workloads for Conway-exclusive actions
    • implementing a specialized benchmark setup for the UTxO-HD on-disk variant
    • developing new Plutus benchmarks to safeguard Plutus V3
    • benchmarks regarding the rollout of P2P

    Performance

    For certain blocking performance issues we've located the cause, or even found a solution in a cross-team effort. In Q4 we'll advance that work to ensure the ongoing +release cycle for mainnet, as well as make GHC9 become a viable release platform.

    New tracing system

    For the new tracing system, we'll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support.

    UTxO-HD monitoring

    We'll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way.

    Nomad backend

    From Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad.

    Workbench

    We will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with cardano-node.

    Consensus component QTAs (co-development)

    In Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation.

    · One min read
    John Lotoski

    2023-07 - 2023-09

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Completion of mainnet relay networking conversion to p2p topology
    • Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality
    • Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines
    • Creation of a nix content addressed packages repository, capkgs:
      • To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells
    • Creation of a cardano performance benchmarking cluster, cardano-perf:
      • To replace legacy cluster benchmark tooling
    • Creation of a cardano cluster composition repository, cardano-parts:
      • For enabling multi-cluster, multi-role cardano network deployments
    • Creation of a cardano testnets repository, cardano-playground:
      • Utilizing cardano-parts for testnet deployments
    • Creation of a sanchonet demo repository, sanchonet-demo:
      • Utilizing cardano-parts for fast sanchonet test environment and demo purposes

    Next steps

    • Continue with migration of cardano-world testnets to cardano-playground
    • Proceed with spinup of mainnet p2p bootstrap cluster
    • Scale down mainnet non-p2p legacy cluster at the appropriate time

    · 3 min read
    Damian Nadales

    Consensus Quarterly Update

    2023-01 - 2023-03

    Main achievements

    UTxO HD

    • We finished the testing activities for the prototype, which involved adding +new tests, and fixing and enabling temporarily disabled tests.
    • We spent a substantial amount of effort refactoring and cleaning the +prototype.
    • We audited the UTxO HD prototype to make sure it can accommodate the migration +of other tables (eg stake-keys registration) from memory to disk. The result +of the audit was positive.
    • We ran ad-hoc benchmarks for reading keys and flushing values to disk. No +unexpected costs found.
    • We ran the first system level benchmarks. The performance regressions reported +were due to an unrealistic snapshotting rate. We need to re-run them again +after we design a more fine grained locking mechanism.

    Genesis

    • We elaborated a roadmap of the remaining work for Genesis.
    • We presented the design to the IOG Researchers and PNSol on February 20. The +design was well received. We updated the Genesis design with the researcher's +feedback.
      • We plugged the new DoS vector identified during the aforementioned +presentation.
    • We developed a generator for adversarial leader schedules that satisfy key +Ouroboros properties, which will be used to test the Genesis design.
      • The generator enables use of smaller Ouroboros parameters, which makes +extrema more likely and counterxamples easier interpret.
    • We wrote up the latest design iteration.
    • We continued benchmarking the Chain Sync Jumping prototype. In particular:
      • We debugged the prototype's performance regression, and unmasked the +actual cause by patching our initial theory (bad queuing behavior)
      • We identified and validated the actual cause (a pathological case in +BlockFetch tiebreaker).

    Support

    • We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother +to serve a local immutable DB.

    Conway era

    • We integrated the Conway era into consensus.

    Technical debt

    • We fixed a bug with followers, which was discovered by property tests.
    • We developed a DSL for specifying and running ChainDB test cases.
    • We fixed failing tests with iterators.
    • We created micro-benchmarks for adding transactions to the mempool.

    Fostering collaboration

    • We released a new technical documentation site for consensus.
    • We factored out several packages to external repositories. Some of this work +originated in the UTxO HD workstream.

    Next steps

    UTxO HD

    Genesis

    Support

    • Design Consensus side of hardfork-enactment in the Voltaire phase +(#4180).
    • Estimate the number of file descriptors Consensus needs +#20.

    Tech debt

    • Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define +for consensus. Pick one and implement benchmarks for it.

    Fostering collaboration

    • Onboard a new team member.

    · 3 min read
    Marcin Szamotulski

    2023-01 - 2023-03

    Main achievements

    Gradual dynamic P2P release on mainnet

    We released two version of cardano-node with dynamic P2P capabilities:

    • 1.35.6
      • we found and fixed a bug in exception handling in peer-state-actionspull-4357
      • we found and fixed a busy loop when demoting a peer from hot to warm pull-4385
    • 1.35.7
      • includes interoperability in the legacy non-p2p network stack pull-4467
    • we fixed a busy loop of demotion & promotions: warm -> hot -> warm[pull-4485] /it will be included in cardano-node-8.0.0 release/.

    Currently there are more than 200 P2P relays on mainnet.

    Peer Sharing

    We implemented /peer sharing/ pull-4019 which will be available as an +experimental feature in one of the future cardano-node releases.

    We implemented /light peer sharing/, e.g. adding inbound connections to the set +of known peers of the outbound governor, which allows to bootstrap relays not +registered on chain. This complements peer sharing. The pull-4277 is in +late review stages.

    Eclipse Evasion

    We finalised design of eclipse evasion and we started implementing it. We +have an initial implementation (not merged). We are in the process of extending +our test suite to cover new implementation details: issue-3886, pull-4462.

    Cardano Network Service Assurance

    Galois has been making progress on Cardano Network Service Assurance project.

    • In cardano-node, they have developed a datapoint abstraction that creates +a queue of (existing) log events, they now have two such datapoints (of log +events) implemented.

    • They have developed a datapoint client executable that can connect to a node +which serves the "new tracing".

    • They have been exploring approaches for the consolidation and analysis of +datapoint data to extract actionable network health status.

    Cardano-Node

    • We made it possible to configure accepted connections limit pull-4902.

    Testing improvements

    • We fixed a bug in network simulation implementation of TCP simultaneous open pull-4265.

    • We introduced header-body split in the diffusion simulation pull-4419 (in review).

    • We introduced initiator only nodes in the diffusion simulation pull-4280.

    • We fixed a connection-manager test failure issue-4370.

    Technical Debt

    • We refactored Snocket interface decoupling it from the multiplexer +pull-4260. This simplified some aspects of the KES agent implementation.

    • We introduces a record for CBOR codecs which are used for various data +structures by mini-protocol codecs pull-4430.

    Documentation

    • We explained some limitations of CDDL in our technical report pull-4351.

    IO-Sim

    • We fixed implementation of MVar's pull-70.

    NoThunks

    • We published a new version of nothunks library to Hackage.

    Next steps

    • Finish implementation & testing of eclipse evasion issue-3886.
    • Optimise connectivity to peers behind firewall issue-4381.
    • Finish the work on enabling block production dynamically to allow using P2P +on block producers issue-3159.
    • If time permits we would like also to reserve some time for finishing +publication of io-sim to Hackage.

    · 7 min read
    Jared Corduan

    Ledger Quarterly Update

    2023-01 - 2023-03

    Main achievements

    CIPs

    • Entering the Voltaire phase - +CIP-1694 received a major update after participation in the design has expanded to +more and more people, including those who attended the Colorado workshop. +See CIP-1694.
    • Ledger CIP category - +The ledger team continues to embrace the CIP process, and has begun the process of +registering the ledger as an official CIP category. +See CIP-84.
    • Ledger serialization - +A CIP for the ledger serialization deprecation cycle has been accepted. +See CIP-80.

    Formal ledger model

    Our new formal specifications backed by Agda have seen a lot of progress. +The majority of the ideas in CIP-1694 are now present, and we have made enough progress +that we can now safely say that the PDF produced by the Agda model will be the +official ledger specification for the Conway ledger era. +See the repository.

    Conway ledger era

    Progress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model. +The major component still missing is the DRep stake distribution, which still presents some +technical challenges.

    [pull-3176] +[pull-3216] +[pull-3226] +[pull-3291] +[pull-3326] +[pull-3330] +[pull-3339]

    DRep stake distribution computation

    Adding another large stake distribution to the ledger state must proceed with caution. +We do not want the memory used by the node to increase too much, +and performance problems can lead to reduced block production. +We have prototyped, tested, and benchmarked several approaches that could give us +the current DRep stake distribution at each epoch boundary. +This has very important implications, since we want every ADA holder to be able to at any +time (such as during a contentious vote) register themselves as a DRep and still have time +to vote themselves on the issue.

    [pull-3344] +[pull-3353] +[pull-3364]

    Integration work

    The ledger has made some wonderful improvements over the past six months, +but which entail a significant amount of integration efforts:

    • Our new versioned CBOR schemes
    • Individual deposit tracking
    • An improved cross-era interface utilizing lenses
    • A new ledger API
    • Re-arranging the ledger stake in preparation for CIP-1694
    • Versioning our Haskell packages +using CHaPs.
    • Consistent conventions for variable names

    [pull-3279] +[pull-3282] +[pull-3288] +[pull-3289] +[pull-3292] +[pull-3297] +[pull-3298] +[pull-3299] +[pull-3300] +[pull-3302] +[pull-3303] +[pull-3308] +[pull-3342] +[pull-3345] +[pull-3356] +[pull-3357] +[pull-3360] +[pull-3361] +[pull-3363] +[pull-4349] +[pull-378] +[pull-376] +[pull-373] +[pull-370] +[pull-361] +[pull-4976] +[pull-5013]

    Deposit tracking

    Individual deposits (for stake credential and stake pool registrations) were not tracked by the ledger. +Deposits were returned according to the current protocol parameters. +When the values of these two protocol parameters change, the deposit pot +is adjusted by adding to, or removing from, the reserves.

    This has several problems:

    • Most people expect a deposit to be paid back exactly.
    • We cannot increase the deposit amount once the reserves hits zero.
    • If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials.
    • Because of the problems above, it is going to be incredibly hard to ever change the values.
    • There is a serious issue involving hard forks. +The consensus layer makes the decision about whether or not to enact a hard fork based on +the protocol parameter update state two stability windows before the end of the epoch. +However, the ledger will reject a protocol parameter update on the epoch boundary +if the deposit pot adjustments cannot be reconciled with the reseve pot. +This means that if quorum is met regarding changing the major protocol version, +but the update is rejected on the epoch boundary, consensus will change the era but the +ledger will not change the major protocol version, leaving the ledger in a split-brain state.

    Because we never actually changed the values of the two deposits amounts in the protocol parameters +on mainnet, we were able to retroactively change the behavior. +We made the following changes:

    • Individual deposits are tracked in the DState.
    • The amount deposited is always returned.

    [pull-3195] +[pull-3202] +[pull-3217]

    New ledger API

    We have significantly built up the ledger API. +We will eventually replace much of the cardano-api in the node repository with this ledger API.

    [pull-3242] +[pull-3248] +[pull-3328]

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We have a new declaritive infrastructure for building constraint-based generators, +which instead generate a random ledger state representative of not just an initial state, +but also those representative of the end result of a long sequence of valid blocks. +Moreover, these generators are very fast and are much more random than our old generators. +Before we can start using them for our existing property tests, however, we still need to +expand them to generate a valid block for a given ledger state.

    [pull-3219]

    Technical debt

    We continued to address technical debt as much as we can.

    [pull-3167] +[pull-3170] +[pull-3172] +[pull-3175] +[pull-3184] +[pull-3205] +[pull-3208] +[pull-3210] +[pull-3212] +[pull-3218] +[pull-3222] +[pull-3223] +[pull-3224] +[pull-3225] +[pull-3229] +[pull-3239] +[pull-3241] +[pull-3244] +[pull-3245] +[pull-3249] +[pull-3260] +[pull-3263] +[pull-3264] +[pull-3268] +[pull-3269] +[pull-3270] +[pull-3274] +[pull-3276] +[pull-3277] +[pull-3286] +[pull-3290] +[pull-3295] +[pull-3296] +[pull-3306] +[pull-3307] +[pull-3310] +[pull-3311] +[pull-3316] +[pull-3320] +[pull-3323] +[pull-3327] +[pull-3331] +[pull-3332] +[pull-3333] +[pull-3338] +[pull-3341] +[pull-3347] +[pull-3350] +[pull-3351] +[pull-3352] +[pull-3354]

    Critical fixes

    We fixed two critical issues:

    • Growing block production delay on the epoch boundary: [pull-3209]
    • Unexpected node shutdown from balanceR: [pull-3343]

    Next steps

    • Conway spec - +Complete the first version of the conway formal specification.
    • DRep stake distribution - +Have the ledger compute the DRep stake distribution with acceptible performance.
    • Devnet ready - +Have the Haskell implementation of the conway era in sync with the formal specification, +and integrate the changes with consensus and node. +All the details might not be finalized, but the wire specification and the API should +be stable so that conway can be placed on a devnet for tool builders to start integrating with.
    • Plutus V3 - +Integrate Plutus V3 into the ledger, including a new script context which supports DReps.

    More details

    This quarterly report was based off of the following fortnightly ones:

    · 4 min read
    Damian Nadales

    Consensus Quarterly Update

    2022-12 - 2023-01

    Main achievements

    UTxO HD

    The prototype is feature complete and thoroughly tested at the consensus level. +In particular, we invested a lot of time in writing property-test for the +mempool, and other crucial new parts of the prototype. Now we are ready to run +integration tests and system-level benchmarks.

    Genesis

    We identified and fixed a slowdown in cross-era forecasting that was inhibiting +our efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7% +speedup in full sync times in the baseline.

    We also started prototyping a self-contained implementation of the Genesis +dynamics (in particular of the parts intentionally not part of the ChainSync +Jumping prototype) that furthered our understanding of subtleties and edge +cases.

    Support

    • We worked on designing integration of new VRF and KES crypto into consensus.
      • Crypto class was split into two parts: Crypto and HeaderCrypto.
      • With the Ledger team's help, we refactored cardano-ledger to use a proxy +type for VRF.

    Conway era

    • PR went through its second review round. It is about to be merged, but it got +delayed due to people's availability during Christmas break.

    Technical debt

    • We improved the capabilities of our io-sim library, which is key for testing +and simulating Cardano components.
    • We removed thunks from epoch translations in the ledger, which is important +for reducing memory consumption of the Cardano node.

    Fostering collaboration

    • We added a tutorial on how to instantiate the Consensus layer to run custom +ledgers. This should be a valuable resource to people looking to roll their +own custom blockchain (either for commercial or research purposes).
    • We added an overview of consensus to the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    Next steps

    UTxO HD

    • Evaluate the extensibility of the prototype. Moving the UTxO to disk is only +the first step towards reducing the memory requirements of Cardano node, and +ensuring its long term sustainability. In the future, we plan on moving other +large maps, such as delegation maps. The prototype should be able to +accommodate these changes without any major modifications.
    • Start the integration with other downstream components, such as the wallet and +db-sync. The idea is to identify and address any potential pain points that +might arise during this integration.
    • Run integration tests and system-level benchmarks.

    Genesis

    • Finish benchmarking and tuning the fast-path ChainSync Jumping prototype
    • Expand and optimize the self-contained implementation of the Disconnect Rule +(including density comparisons and the LoE)
    • Develop documentation and smoke tests for these components.
    • Start modifying the ChainSync Client for the LoP and LoR.

    Support

    • Help the Network team with diagnosing performance regression in block +production.

    Tech debt

    • Fix property-test failures concerning iterators (#3999 and +#4183).

    Fostering collaboration

    Risks

    UTxO HD

    • Moving other parts of the ledger state to disk might require a major redesign +of the prototype. For instance, if it turns out that the epoch change rules +require access to the full ledger state. If this is the case, we might +accept this risk and do the redesign after the initial release of UTxO-HD.
    • Integration with downstream clients might require more work than we +anticipate.
    • Access to the benchmarking's team time and resources.
    • Benchmarking results might show significant performance degradation, which +will require additional work if such performance degradation is not accepted +by other stakeholders.
    • The prototype's performance might not be accepted by other stakeholders. Here +we need to clearly communicate that this is necessary to ensure that as the +blockchain size grows, the node can operate within reasonable memory +constraints.

    · 5 min read
    Marcin Szamotulski

    Network Quarterly Update

    2022-11 - 2023-01

    Summary

    The primary goal of the networking team was to focus on the single relay +release of P2P. We fixed a number of small late bugs, and concluded QA +& performance testing. Although it was discovered a regression in performance +of block production when P2P is enabled, relaying with P2P performs better +comparing to a non p2p. We concluded that this is not a blocker for the Single +Relay Release which is planned shortly.

    Peer sharing has gone through review and final review is +just being done right now. After merging it will still be disabled (hidden +behind a flag) as it's not safe without eclipse evasion. We started +implementing light peer sharing (i.e. include inbound peers into known peer set +of the outbound governor).

    We started a detailed eclipse evasion design, it will continue in the next +quarter.

    We also made a major revision of package structure of the network packages. We +ended up with a very clean dependency graph (pr #4155).

    Armando Santos delivered a talk at the ODOPIS 2022 conference on principles +of distributed systems in Brussels. The slides are available here.

    Neil Davies gave an invited seminar on DeltaQ at Université Catholique de +Louvain.

    We also found and fixed a few of bugs:

    • a bug in keep alive mini-protocol which resulted in warm to cold transitions +to be always executed through a timeout path rather than do a clean demotion +([pr #4168]).

    • fixed an assetion failure in the outbound governor (issue #4177)

    Next steps

    We will work towards the next release of P2P for block producer nodes. This includes:

    • analysing performance regression for BP nodes when using P2P
    • finish the work on controlling the block forger through node kernel (pr #3800)
    • address issue #3907 and write a script to analyse deployment of P2P relays

    We would like also to push forward eclipse evasion. Although most of the work +has be done already the release of io-sim on Hackage will happen in the +next quarter.

    We would also like to address chain-sync timeout issue recently +diagnosed by Karl Knutsson.

    If time permits we would also like to address some technical debt, especially:

    Risks

    The performance regression for block producer with P2P needs to be investigated +in the near future. This is blocker for the release of P2P on BP nodes.

    Detailed log

    Contributions to Ouroboros-Network

    • We added TraceDemoteLocalAsynchronous, which enables notification of critical issues for SPOs
    • We fixed cardano-ping compatibility with NodeToNodeV_10 (P2P, pr #4165)
    • We fixed a bug in demotion peers to cold which affected P2P nodes (commit-61058aa5c2)
    • Karl Knutsson enhanced SendFetchRequest (commit-bb1c3dddee), open-source contribution)
    • We turned SizeInBytes into a newtype.
    • We extended CONTRIBUTING.md, README.md, added CODE_OF_CONDUCT.
    • We fixed DNS test failure issue #4191
    • We fixed a simulation bug found in issue #4258
    • [pr #4168]
    • issue #4177

    Contributions to Cardano-Node

    • We maintained the Single Relay Release pr #4612, (e.g. fixing CI issues, +Rebasing it when necessary, publishing packages to Cardano Haskell Packages);
    • We enhanced JSON serialisation / deserialisation of NodeToNodeVersion and NodeToClientVersion;

    Contributions to IOSim

    • We started to use Cardano Haskell Packages for IOSim (pr #48)
    • We updated change log files
    • We added support of ghc-9.4 (pr #50)

    We also addressed the following issues in pr #57 in order to prepare the package for publication on Hackage:

    • refactored io-classes timers API (issue #46);
    • created a new package si-timers which exposes an interface using SI units +and is safe on 32-bit systems (issue #59);
    • added monad transformers instances for classes defined in io-classes (issue #58);
    • created io-classes-mtl package which includes (experimental) instances for monad transformers;
    • provide MonadMonotonicTimeNSec in io-classes and MonadMonotonicTime in si-timers (so that io-classes follow the base package);
    • added registerCancellableDelay in si-timers (which allowed us to hide fancy timer api and clean io-classes)
    • added support for js_HOST_ARCH (the new GHC JS backend)

    Note the pr #57 contains almost 40 commits, and was a major step forward for +io-sim ecosystem. We also prepared a draft pr #4281 which updates +ouroboros-network.

    Other changes for 1.0.0.0 release on Hackage:

    • Refactored test suite (pr #47)
    • Updated documentation, cabal files, CONTRIBUTING, SECURITY documents, etc in pr #60, currently under review.
    + + + + \ No newline at end of file diff --git a/quarterly/page/2/index.html b/quarterly/page/2/index.html new file mode 100644 index 00000000000..c08dc6db0ae --- /dev/null +++ b/quarterly/page/2/index.html @@ -0,0 +1,137 @@ + + + + + +Blog | Cardano Development Updates + + + + + + + + + + + + +
    +

    · 3 min read
    Marcin Szamotulski

    Open Source Quarterly Update

    2022-11 - 2023-01

    Summary

    In the last quarter the open-source initiative delivered a comprehensive report +on the state of our repositories. As part of this work stream we +identified the key open-source repositories for the cardano project across all +the projects From a list of more than 500 repositories (some of which are +forks) we identified key repositories which constitute the core of Cardano. +20 of them were identified as to be transferred to the future MBO which will +govern Cardano development. Some where excluded (like io-sim and +typed-protocols), to be govern by IOG, since they have a much broader +application than Cardano itself, and thus we think their open-source future +will be better outside of the Cardano umbrella.

    Christian Taylor identified a number of ways we can improve our repositories to +make them more attractive for open-source contributions by analysing each of +them. This includes adding or improving various documentation files, like +CONTRIBUTING files, adding code of conduct, improving readme files, issue +& pull request templates etc. Christian also computed various interesting +metrics which gives a very good insight into the development practices: e.g. +average merge ratio, average number of reviews, comments and many more! The +presentation is available here.

    We followed with work on the Cardano Engineering Handbook. We included +a standard code of conduct which is now used by most important projects in the +Cardano space. We included cardano-node's security policy and added +a responsible disclosure policy. We also described how roles and +responsibilities should be clarified. This progress was made by +a collaborative effort of the Cardano Core, Plutus and Architecture teams, and +it wouldn't be possible without Michael Peyton Jones, Arnaud Bailly, Kevin +Hammond, Jared Corduan and Marcin Szamotulski.

    We also improved the documentation of key repositories, by adding description, +improving their README file & CONTRIBUTING files, adding code of conducts +following the Cardano Engineering Handbook. This includes improvements to:

    And also

    The work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan.

    In this quarter we also identified a number of projects which can be published to +Hackage (Haskell's package repository) or crate (Rust package repository). +The list contains 21 packages, 2 of which (hedgehog-extras and +quickcheck-dynamic) are already published on Hackage and another 5 (from +the io-sim repository) are close to be published.

    Detailed log

    The progress of the open-source project is tracked in this project.

    · 4 min read
    Damian Nadales

    Consensus Quarterly Update

    2022-09 - 2022-11

    Main achievements

    UTxO HD

    • As a consequence of the errors observed when running distributed mempool +benchmarks, we re-designed the UTxO HD mempool integration, which fixed these +errors and lead to a simpler and more maintainable design.

    • We focused on increasing test coverage for the UTxO-HD prototype. In +particular, we added property tests for:

      • Backing store (work ongoing)
      • Era transitions
    • The property tests we added uncovered several bugs, which is a great result +given the exponential increase in the cost of finding bugs as they are closer +to deployment.

    • One of the errors found by our tests required us to work on improvements in +the Haskell bindings for LMDB. This work is ongoing.

    • We started working on the mempool property tests that will exercise the new +code paths that UTxO HD introduced.

    • We developed, benchmarked and tested an implementation of sequences of +differences based on "anti-diffs". Performance results of diff sequence +operations show that we achieved a speedup of about 4x across several +scenarios. Note: this speedup is taking into account diff sequence operations +only, so the consensus-wide speedup is less than 4x.

    • We integrated the "anti-diff" prototype into the UTxO HD feature branch.

    Genesis

    • We wrote a simulator that demonstrates soundness of an abstract implementation +of the new chain selection rule.
    • We elaborated a draft specification for the Genesis implementation (currently +awaiting feedback from other architects).
    • We elaborated a draft specification for the ChainSync Jumping optimization. In +particular, this includes a proof sketch that the latter preserves liveness +and safety in all cases.
    • With the Networking team, we co-designed the eclipse avoidance mechanism, +specifically its coherence with the Genesis implementation plan's security +and its dependence on the new ChainSync Jumping optimization.
    • We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a +performance degradation wrt the baseline. Our optimization attempts so far +have brought the performance closer to the baseline, but not yet to parity.

    Conway era

    • We did most of the heavy lifting required to integrate the Conway era into the +Consensus layer.

    Technical debt

    • We started working on enabling CI nightly tests, which revealed several test +failures due to thunks being found it data structures used by the ledger and +consensus. We made a lot of progress fixing those thunk errors, but some +errors still remain.

    • We elaborated a db-analyser benchmark for the ledger operations. This led us +to the identification of high processing time at epoch boundaries, and we +could not observe any performance degradation that can be attributed to era +changes.

    • We fixed a source of flakiness in the ChainDB QSM test.

    • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    • We fixed a bug in the maximum-allowed ledger major protocol version.

    Fostering collaboration

    • We spent time making cardano-updates the central source of information for +the core teams stakeholders.
    • We went through the Galois gap analysis and extracted actionable points to +take on next.
    • Bart and Yogesh continued with their onboarding and stated making substantial +contributions to consensus.

    Next steps

    UTxO HD

    • Finish the mempool property tests.
    • Benchmark the latest version of the prototype.
    • Elaborate a document that describes new integration test scenarios and pass it +to the SDET team.
    • Bring query UTxO by address command performance on par with the baseline +version.

    Genesis

    • Receive and incorporate Duncan's feedback on the first draft specification for +the Genesis implementation.
    • Begin prototyping the first genesis implementation, unless the first draft +needs major changes.
    • Draft a second revision of the Genesis report.
    • Review the second revision with a wider audience, which includes at least +Alexander Russell. That feedback will drive a third and hopefully final +revision.
    • Investigate how to mitigate the ~30% slowdown we have observed so far in the +ChainSync jumping prototype, and try to mitigate it. In particular, we might +need to optimize the existing BlockFetch logic.

    Tech debt

    • Enabling nightly CI tests.

    Fostering collaboration

    • Merge the tutorial document Galois wrote; requires CI integration.
    • Come up with our own documentation improvements, many of which were suggested +in the Galois gap analysis.
    • Try to hire a new team member.

    · 4 min read
    Marcin Szamotulski

    Network Quarterly Update

    2022-09 - 2022-11

    Summary of most important improvements

    During this quarter the networking team delivered low level specification of +peer sharing & eclipse evasion. We held a session with the consensus & the +scientists; we got a positive feedback on the design.

    Further we focused on implementation of peer sharing. We produced a detail +design and an early implementation.

    We prepared the P2P Single Relay Release (cardano-node-1.35.5). It +includes over 130 patches of network stack improvements over the +previous version 1.35.4, which were accomplished over a longer period of +time. Among them are both bug fixes and UX improvements for stake pool +operators like simplified format of the topology file, or +improvements in the logged messages:

    We also provide better integration with systemd (socket +activation improvements) or improvements in the networking stack:

    • exit policies,
    • peer metrics improvements,
    • DNS TTL improvements (which make it harder to misconfigure the +system, an issue discovered by the performance & monitoring team),
    • do not trigger inbound idle timeout for node-to-client connections (pr +#3844), an issue reported to us by Matthias Benkort from +Cardano Foundation.

    Duncan has been making progress with the input endorsers demo. His simulation +provides a useful animated visualisation and live quantification of behaviour +of the modeled design.

    We also improved our e2e diffusion simulation by implementing header-body +split, similar to what the real implementation does.

    We also made some advances towards our future goals of P2P release for block +producer nodes (pr #3800 - in review) & for Daedalus users +(pr #3690 - merged).

    Detailed log

    • We expanded diffusion simulation with block-fetch protocol bringing it closer +to the production system.

    • We addressed some additional technical depth in diffusion simulation

    • We slightly improved documentation & CI of io-sim and typed-protocols +repositories for open-source contributors.

    • We closed a number of issues towards publishing io-sim on Hackage (only two +essential issues are left open).

    • We pushed a branch of typed-protocols which captures one of the developer UX +problems in the API which we need to solve.

    • We identified and fixed an issue related to systemd sockets.

    • We identified and fixed an issue in consensus initialisation not giving +feedback on early errors.

    • We deployed RT View, identified a number of issues which were communicated to +the performance & monitoring team.

    • We finished high level & detailed design of peer sharing, very early +implementation of peer sharing is done (note that peer sharing cannot be +safely deployed without eclipse evasion & genesis).

    • We finished high level design of eclipse evasion, and started working on +a detailed design.

    • We were assigned the role of release engineer for 1.35.5 release (the P2P +single relay release); we prepared a cardano-node for 1.35.5 release which +contains more than 130 patches of just network stack improvements done over +last few months.

    • We diagnosed and fixed an tricky bug in the peer state actions (a component +which sits between outbound governor and connection manager). That bug was +introduced earlier this year and never released. It was caught by the QA +testing framework. We expanded our diffusion simulation to cover such case and +also mitigated a chance for reintroducing such a bug in future.

    • We identified and quite likely mitigated a misconfiguration in the +benchmarking cluster (next benchmarking run will confirm our hypothesis).

    • We simplified the format of p2p topology file, we got positive feedback from +SPOs.

    • We raised severities of some of the logging messages, which is an important +improvement for SPOs, exchanges and other users of the system.

    • We worked on input endorsers simulation which gives both animated and +quantified live feedback on network operation, using a simplified model of +a TCP/IP network.

    Next quarter

    • Release the Single Relay P2P Release 1.35.5.

    • Carry on with Peer Sharing (review, testing).

    • Deliver a talk at Conference on Principles of Distributed Systems 2022 in Brussels, Belgium.

    • Present Detailed Design of Eclipse Evasion and start implementation phase.

    • Work on P2P Block Producer release.

    • Carry on with publishing of io-sim on Hackage.

    · 2 min read
    Jared Corduan

    Ledger Quarterly Update

    2022-09 - 2022-11-04

    • We finished a minimal ledger era capable of master key rotation. +This will be re-purposed our upcoming work.
    • We have the humble beginnings of a proper ledger API.
    • We improved the problematic cost model serialization +(recall the song and dance about updating the cost model one epoch after the hard fork).
    • We have added benchmarks for problematic areas.
    • Massive repository restructure and cleanup.
      • Unified and consistent variable name schemes (not completely finished, but nearly there).
      • Massive reduction in type constraints, which causes a lot of developer friction, +in our code and also downstream.
      • More organized module structures.
      • Improved generators for our property tests.
      • We removed our dependency on cardano-prelude.
    • The formal ledger model has come a long way.
      • We created a fork of Agda that provides some meta-programming support for the ledger rules.
      • We have a large amount of the basic UTxO support in the model.
      • We can generate a good looking PDF from the model.
      • We can produce Haskell from the model.
      • We have a nice finite set theory library that we can use for many of the ledger rules.
      • We have nix support for the model.

    Next steps

    • Individual tracking of deposits. [issue-3113]
    • Versioned CBOR encoders/decoders. [issue-3014]
    • New ledger era transaction body (and the surround work associated with it).
    • Designs for the next ledger era.

    · 2 min read
    Jordan Millar

    Node-Api-Cli Quarterly Update

    2022-09 - 2022-11-04

    • Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0
    • Major clean up of stale iusses + PRs.
    • Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs
    • cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node.
    • cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation.
    • General documentation updates and improvements
    • Addition of tx-mempool command which allows users to:
      • Query the node about the current mempool's capacity and sizes
      • Request the next transaction from the mempool's current list
      • Query if a particular transaction exists in the mempool
    • Initial refactoring of cardano-testnet

    Next quarter

    • cardano-api
      • Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately.
    • cardano-testnet
    • Serenity
      • Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above.
    • General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new.
    + + + + \ No newline at end of file diff --git a/quarterly/rss.xml b/quarterly/rss.xml new file mode 100644 index 00000000000..9c033e530ca --- /dev/null +++ b/quarterly/rss.xml @@ -0,0 +1,562 @@ + + + + Cardano Development Updates Blog + https://input-output-hk.github.io/cardano-updates/quarterly + Cardano Development Updates Blog + Thu, 07 Dec 2023 21:19:58 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + en + + <![CDATA[Consensus Q2 2023 Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q2-consensus + 2023-Q2-consensus + Thu, 07 Dec 2023 21:19:58 GMT + + 2023-04 -- 2023-06

    Main achievements

    UTxO HD

    • We finished a major prototype refactoring, which includes:
      • A better and finer grained DB lock mechanism.
      • Elimination of race conditions.
      • Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance.
      • Architectural simplifications and performance improvements.
    • We implemented a new package to support db-sync integration with UTxO-HD.
    • We ran another set of ad-hoc benchmarks:
      • We uncovered a performance regression on the Network component when using GHC-9.2/9.4.
      • The synchronization and replay speed are as expected.
      • However, we uncovered memory consumption issues (see figure below).
        • The in-memory backend is consuming more memory than the baseline.
        • The LMDB backend shows an unexpected memory usage peak.
        • Investigation on these issues is ongoing.
    • We integrated the latest changes in main branch.
      • This required a re-design of the mempool to include the mempool fairness +improvement.

    Genesis

    • The Genesis work for this PI focused on an high-priority issue from the IOG Researchers' feedback on the proposal.
      • This particular question was not anticipated when the Q2 PI was planned.
      • As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized.
      • That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package.
    • The IOG Researchers' feedback on the design was very valuable. It had two primary effects.
    • Outcome 1: We re-introduced distinct behaviors when the node is "syncing" versus when it is "caught up".
      • This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated.
      • The additional design complexity is relatively small.
    • Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.
      • The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era.
      • All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras.
      • Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later.
      • The primary invention was a model for bounding how much benefit the adversary's long-range attack could possibly gain from Praos's natural short forks.
    • Relevant questions that the IOG Researchers are still assessing.
      • These do not block the Genesis implementation, but do affect the ultimate values of specific parameters.
      • Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?
      • Question 2: what is the upper bound on how much grinding can improve the adversary's leader schedule within some Genesis window?

    Support

    • We performed an analysis on number of file descriptors used by Consensus, this +information can be used by the node operators to check if the number of file +descriptors they want to support are enough, thus improving the user (eg node +operator) experience.
    • We implemented a mempool fairness improvement, by which transactions are +guaranteed to be processed irrespective of their size.

    Technical debt

    • We fixed a bug in followers logic, which was discovered by our QuickCheck +property tests.
    • We created an immutable DB +server. This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results.
    • We created a db-truncater tool, which can be used in disaster recovery and benchmarking scenarios.
    • We created a benchmarks comparison tool that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance improvements introduced by the Ledger team in version 0.6.0.0 of Consensus wrt version 0.5.0.0.

    Fostering collaboration

    • We released fs-sim as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project.
    • We migrated the consensus code to a new repository, splitting +it from the ouroboros-network repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases).
    • We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users).
    • We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.

    Next steps

    UTxO HD

    Genesis

    • We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work.
    ]]>
    + consensus +
    + + <![CDATA[Network Q2 2023 Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q2-network + 2023-Q2-network + Thu, 07 Dec 2023 21:19:58 GMT + + 2023-04 - 2023-06

    Main achievements

    Eclipse Evasion

    We finalised the design of eclipse evasion and implemented its mechanism which +relays on connectivity to big ledger peers. Big ledger peers are the +largest ledger peers which accumulate 90% of stake (currently there are less +than 1000 of them). The outbound governor has new targets for known, +established and active big ledger peers which work in a similar way that +such targets work for ledger peers. The ouroboros-network#4662 PR is +currently in review.

    As part of this work we also identified a bug which would prevent a node to +connect to itself. Such connections are not easily detectable and are expected +to be dropped by the churn mechanism, nonetheless they should not be buggy. +The failure was discovered thanks to our e2e simulation of diffusion using +io-sim & property based testing.

    The PR also refactors the heart of the ouroboros-network interface reducing +technical debt that would otherwise accumulate.

    We also identified a possible improvement in the churn mechanism, which will be +implemented in Q3. Churn needs to await for peers to terminate, we can +improve the synchronisation. [ouroboros-network#4617]

    Ecosystem P2P Deployment Progress

    We reached 50% of stake in hands of SPOs who run at least on P2P relay. Now +also Emurgo and CF are running some P2P relays. Also 20% of IOG relays are +running in P2P mode.

    P2P Progress

    Peer Sharing

    We implemented bootstrapping for peer sharing (also known as light peer +sharing). New downstream (inbound) peers are now added to the known peers of +the outbound governor. Together with peer sharing this allows for non +registered relays to propagate through the network. ouroboros-network#3596

    Please note that peer sharing is disabled by default and is not considered safe +until Bootstrap Peers (see below) or Genesis is implemented.

    Diffusion (P2P)

    • We designed a feature which will reduce the load on IOG relays (in future +also run by CF & Emurgo). The feature consists of two parts. A new source +of peers called bootstrap peers (obtained from via an https request), the +ability to switch from bootstrap peers to ledger peers if the node is synced +(we are collaborating with the consensus team on the interface Bootstrap +Peers IER). This feature will be completed in Q3. +ouroboros-network#4530

    • We published a blog post about P2P design & implementation.

    • Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections: +ouroboros-network#4559.

    • We merged changes which allow the consensus layer to start / stop block +forging thread. This will allow to deploy P2P block producing nodes which +serve as a live backup node. ouroboros-consensus#140

    • We fixed a few bugs in local root peers DNS resolution service: +ouroboros-network#4583, ouroboros-network#4571.

    • We limited concurrency of DNS name resolutions: ouroboros-network#4596.

    • Galois Inc implemented query option for Handshake: ouroboros-network#4256.

    • We fixed handshake query timeout: ouroboros-network#4608.

    • We implemented warm valency for local root peers. This can help when using +DNS names in local root peers which resolve to many IP addresses. ouroboros-network#4575

    • We merged handshake changes which allow query protocol versions. Thanks to +James Parker from Galois Inc.: ouroboros-network#4256, cardano-cli#30.

    Other Improvements & Developments

    CDDL

    • We added node-to-node and node-to-client CDDL specs / tests for encoding +of NodeToNodeVersionData and NodeToClientVersionData.

    • We clarified an inconsistency between CDDL spec and implementation which is +highly polymorphic. We designed and implemented a fix for tx-submission +and local-tx-submission mini-protocols. Specs for other mini-protocols will +be improved at a later stage. ouroboros-network#4580

    Cardano Ping

    IOSim

    Typed Protocols

    Cardano Client

    • We fixed a bug in cardano-client-0.1.0.2 release which results in clients +(e.g. db-sync) negotiate an experimental protocol version.

    Technical debt

    CI improvements

    GHC 9.4 & 9.6

    We made all repositories under our control compile with ghc-9.4 and ghc-9.6 +which includes ouroboros-network, io-sim, typed-protocols and +Win32-network.

    Next steps

    We will continue towards our aspirational roadmap.

    • We will continue reviewing eclipse evasion.
    • As ouroboros-consensus#140 was merged, we are making progress towards +releasing P2P on block production nodes. We hope to analyse performance +regression on such nodes observed on the benchmarking cluster. roadmap-3887
    • We are also focused on roadmap-3969. Note that it was expanded in Q2.
    ]]>
    + network +
    + + <![CDATA[SRE Q2 2023 Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q2-sre + 2023-Q2-sre + Thu, 07 Dec 2023 21:19:58 GMT + + 2023-04 - 2023-06

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Expanding the darwin CI cluster and adding aarch64 builder support
    • Adding bare metal capability to bitte clusters
    • Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality
    • Creation of pool performance analysis queries and scripting
    • Migration of testnet metadata server to cardano-world
    • Cardano shelley qa migration to cardano-world
    • Cardano sanchonet environment spin up to test Conway era functionality
    • Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature

    Next steps

    • Continue with the conversion of mainnet to using p2p topology
    ]]>
    + sre +
    + + <![CDATA[Performance & Tracing Q3 2023 Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q3-performance-and-tracing + 2023-Q3-performance-and-tracing + Thu, 07 Dec 2023 21:19:58 GMT + + 2023-07 - 2023-09

    Main achievements

    • Release benchmarking
    • Developing and running UTxO-HD benchmarks - in-memory flavour
    • P2P benchmarks, facilitating rollout
    • Production-readiness of the new Nomad cluster has been reached
    • Optimization of and introspection capability for the new tracing system
    • GHC9 performance investigation (and possible remedy)
    • Conensus QTAs: first real-world application of prototype

    Release benchmarking

    Ongoing release benchmarking is a crucial safeguard to cardano-node's release cycle from a performance perspective. We've performed and analyzed benchmarks for node versions 8.2.x to 8.5 throughout Q3.

    UTxO-HD benchmarks

    Targeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery.

    P2P benchmarks

    In Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature.

    New nomad cluster

    The new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received +various rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest +of our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it +ready for production use.

    New tracing system

    Our new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that +it is roughly on par with the legacy system while offering a richer feature set and greater flexibility.

    Additionally, in Q3 we equipped the system with an introspection capability. This is now used for generating +end user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system.

    GHC9 performance

    In Q3, a joint investigation with DevX into GHC9's behaviour revealed where and how GHC9 misses opportunities for +optimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable +those optimizations - which is still being validated.

    Consensus QTAs

    In collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations' +performance characteristics. It's now applicable, and being applied, to a real-world task - namely +gathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds.

    Next steps

    Benchmarking:

    In Q4, the focus will be on:

    • facilitating the next mainnet release
    • benchmarking runs in the Conway era
    • developing benchmarks / workloads for Conway-exclusive actions
    • implementing a specialized benchmark setup for the UTxO-HD on-disk variant
    • developing new Plutus benchmarks to safeguard Plutus V3
    • benchmarks regarding the rollout of P2P

    Performance

    For certain blocking performance issues we've located the cause, or even found a solution in a cross-team effort. In Q4 we'll advance that work to ensure the ongoing +release cycle for mainnet, as well as make GHC9 become a viable release platform.

    New tracing system

    For the new tracing system, we'll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support.

    UTxO-HD monitoring

    We'll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way.

    Nomad backend

    From Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad.

    Workbench

    We will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with cardano-node.

    Consensus component QTAs (co-development)

    In Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation.

    ]]>
    + performance-tracing +
    + + <![CDATA[SRE Q3 2023 Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q3-sre + 2023-Q3-sre + Thu, 07 Dec 2023 21:19:58 GMT + + 2023-07 - 2023-09

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Completion of mainnet relay networking conversion to p2p topology
    • Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality
    • Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines
    • Creation of a nix content addressed packages repository, capkgs:
      • To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells
    • Creation of a cardano performance benchmarking cluster, cardano-perf:
      • To replace legacy cluster benchmark tooling
    • Creation of a cardano cluster composition repository, cardano-parts:
      • For enabling multi-cluster, multi-role cardano network deployments
    • Creation of a cardano testnets repository, cardano-playground:
      • Utilizing cardano-parts for testnet deployments
    • Creation of a sanchonet demo repository, sanchonet-demo:
      • Utilizing cardano-parts for fast sanchonet test environment and demo purposes

    Next steps

    • Continue with migration of cardano-world testnets to cardano-playground
    • Proceed with spinup of mainnet p2p bootstrap cluster
    • Scale down mainnet non-p2p legacy cluster at the appropriate time
    ]]>
    + sre +
    + + <![CDATA[Consensus Quarterly Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-04-25-consensus + 2023-04-25-consensus + Tue, 25 Apr 2023 00:00:00 GMT + + Consensus Quarterly Update

    2023-01 - 2023-03

    Main achievements

    UTxO HD

    • We finished the testing activities for the prototype, which involved adding +new tests, and fixing and enabling temporarily disabled tests.
    • We spent a substantial amount of effort refactoring and cleaning the +prototype.
    • We audited the UTxO HD prototype to make sure it can accommodate the migration +of other tables (eg stake-keys registration) from memory to disk. The result +of the audit was positive.
    • We ran ad-hoc benchmarks for reading keys and flushing values to disk. No +unexpected costs found.
    • We ran the first system level benchmarks. The performance regressions reported +were due to an unrealistic snapshotting rate. We need to re-run them again +after we design a more fine grained locking mechanism.

    Genesis

    • We elaborated a roadmap of the remaining work for Genesis.
    • We presented the design to the IOG Researchers and PNSol on February 20. The +design was well received. We updated the Genesis design with the researcher's +feedback.
      • We plugged the new DoS vector identified during the aforementioned +presentation.
    • We developed a generator for adversarial leader schedules that satisfy key +Ouroboros properties, which will be used to test the Genesis design.
      • The generator enables use of smaller Ouroboros parameters, which makes +extrema more likely and counterxamples easier interpret.
    • We wrote up the latest design iteration.
    • We continued benchmarking the Chain Sync Jumping prototype. In particular:
      • We debugged the prototype's performance regression, and unmasked the +actual cause by patching our initial theory (bad queuing behavior)
      • We identified and validated the actual cause (a pathological case in +BlockFetch tiebreaker).

    Support

    • We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother +to serve a local immutable DB.

    Conway era

    • We integrated the Conway era into consensus.

    Technical debt

    • We fixed a bug with followers, which was discovered by property tests.
    • We developed a DSL for specifying and running ChainDB test cases.
    • We fixed failing tests with iterators.
    • We created micro-benchmarks for adding transactions to the mempool.

    Fostering collaboration

    • We released a new technical documentation site for consensus.
    • We factored out several packages to external repositories. Some of this work +originated in the UTxO HD workstream.

    Next steps

    UTxO HD

    Genesis

    Support

    • Design Consensus side of hardfork-enactment in the Voltaire phase +(#4180).
    • Estimate the number of file descriptors Consensus needs +#20.

    Tech debt

    • Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define +for consensus. Pick one and implement benchmarks for it.

    Fostering collaboration

    • Onboard a new team member.
    ]]>
    + consensus +
    + + <![CDATA[Network Q1 2023 Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-04-04-network + 2023-04-04-network + Tue, 04 Apr 2023 00:00:00 GMT + + 2023-01 - 2023-03

    Main achievements

    Gradual dynamic P2P release on mainnet

    We released two version of cardano-node with dynamic P2P capabilities:

    • 1.35.6
      • we found and fixed a bug in exception handling in peer-state-actionspull-4357
      • we found and fixed a busy loop when demoting a peer from hot to warm pull-4385
    • 1.35.7
      • includes interoperability in the legacy non-p2p network stack pull-4467
    • we fixed a busy loop of demotion & promotions: warm -> hot -> warm[pull-4485] /it will be included in cardano-node-8.0.0 release/.

    Currently there are more than 200 P2P relays on mainnet.

    Peer Sharing

    We implemented /peer sharing/ pull-4019 which will be available as an +experimental feature in one of the future cardano-node releases.

    We implemented /light peer sharing/, e.g. adding inbound connections to the set +of known peers of the outbound governor, which allows to bootstrap relays not +registered on chain. This complements peer sharing. The pull-4277 is in +late review stages.

    Eclipse Evasion

    We finalised design of eclipse evasion and we started implementing it. We +have an initial implementation (not merged). We are in the process of extending +our test suite to cover new implementation details: issue-3886, pull-4462.

    Cardano Network Service Assurance

    Galois has been making progress on Cardano Network Service Assurance project.

    • In cardano-node, they have developed a datapoint abstraction that creates +a queue of (existing) log events, they now have two such datapoints (of log +events) implemented.

    • They have developed a datapoint client executable that can connect to a node +which serves the "new tracing".

    • They have been exploring approaches for the consolidation and analysis of +datapoint data to extract actionable network health status.

    Cardano-Node

    • We made it possible to configure accepted connections limit pull-4902.

    Testing improvements

    • We fixed a bug in network simulation implementation of TCP simultaneous open pull-4265.

    • We introduced header-body split in the diffusion simulation pull-4419 (in review).

    • We introduced initiator only nodes in the diffusion simulation pull-4280.

    • We fixed a connection-manager test failure issue-4370.

    Technical Debt

    • We refactored Snocket interface decoupling it from the multiplexer +pull-4260. This simplified some aspects of the KES agent implementation.

    • We introduces a record for CBOR codecs which are used for various data +structures by mini-protocol codecs pull-4430.

    Documentation

    • We explained some limitations of CDDL in our technical report pull-4351.

    IO-Sim

    • We fixed implementation of MVar's pull-70.

    NoThunks

    • We published a new version of nothunks library to Hackage.

    Next steps

    • Finish implementation & testing of eclipse evasion issue-3886.
    • Optimise connectivity to peers behind firewall issue-4381.
    • Finish the work on enabling block production dynamically to allow using P2P +on block producers issue-3159.
    • If time permits we would like also to reserve some time for finishing +publication of io-sim to Hackage.
    ]]>
    + network +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-04-03-ledger + 2023-04-03-ledger + Mon, 03 Apr 2023 00:00:00 GMT + + Ledger Quarterly Update

    2023-01 - 2023-03

    Main achievements

    CIPs

    • Entering the Voltaire phase - +CIP-1694 received a major update after participation in the design has expanded to +more and more people, including those who attended the Colorado workshop. +See CIP-1694.
    • Ledger CIP category - +The ledger team continues to embrace the CIP process, and has begun the process of +registering the ledger as an official CIP category. +See CIP-84.
    • Ledger serialization - +A CIP for the ledger serialization deprecation cycle has been accepted. +See CIP-80.

    Formal ledger model

    Our new formal specifications backed by Agda have seen a lot of progress. +The majority of the ideas in CIP-1694 are now present, and we have made enough progress +that we can now safely say that the PDF produced by the Agda model will be the +official ledger specification for the Conway ledger era. +See the repository.

    Conway ledger era

    Progress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model. +The major component still missing is the DRep stake distribution, which still presents some +technical challenges.

    [pull-3176] +[pull-3216] +[pull-3226] +[pull-3291] +[pull-3326] +[pull-3330] +[pull-3339]

    DRep stake distribution computation

    Adding another large stake distribution to the ledger state must proceed with caution. +We do not want the memory used by the node to increase too much, +and performance problems can lead to reduced block production. +We have prototyped, tested, and benchmarked several approaches that could give us +the current DRep stake distribution at each epoch boundary. +This has very important implications, since we want every ADA holder to be able to at any +time (such as during a contentious vote) register themselves as a DRep and still have time +to vote themselves on the issue.

    [pull-3344] +[pull-3353] +[pull-3364]

    Integration work

    The ledger has made some wonderful improvements over the past six months, +but which entail a significant amount of integration efforts:

    • Our new versioned CBOR schemes
    • Individual deposit tracking
    • An improved cross-era interface utilizing lenses
    • A new ledger API
    • Re-arranging the ledger stake in preparation for CIP-1694
    • Versioning our Haskell packages +using CHaPs.
    • Consistent conventions for variable names

    [pull-3279] +[pull-3282] +[pull-3288] +[pull-3289] +[pull-3292] +[pull-3297] +[pull-3298] +[pull-3299] +[pull-3300] +[pull-3302] +[pull-3303] +[pull-3308] +[pull-3342] +[pull-3345] +[pull-3356] +[pull-3357] +[pull-3360] +[pull-3361] +[pull-3363] +[pull-4349] +[pull-378] +[pull-376] +[pull-373] +[pull-370] +[pull-361] +[pull-4976] +[pull-5013]

    Deposit tracking

    Individual deposits (for stake credential and stake pool registrations) were not tracked by the ledger. +Deposits were returned according to the current protocol parameters. +When the values of these two protocol parameters change, the deposit pot +is adjusted by adding to, or removing from, the reserves.

    This has several problems:

    • Most people expect a deposit to be paid back exactly.
    • We cannot increase the deposit amount once the reserves hits zero.
    • If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials.
    • Because of the problems above, it is going to be incredibly hard to ever change the values.
    • There is a serious issue involving hard forks. +The consensus layer makes the decision about whether or not to enact a hard fork based on +the protocol parameter update state two stability windows before the end of the epoch. +However, the ledger will reject a protocol parameter update on the epoch boundary +if the deposit pot adjustments cannot be reconciled with the reseve pot. +This means that if quorum is met regarding changing the major protocol version, +but the update is rejected on the epoch boundary, consensus will change the era but the +ledger will not change the major protocol version, leaving the ledger in a split-brain state.

    Because we never actually changed the values of the two deposits amounts in the protocol parameters +on mainnet, we were able to retroactively change the behavior. +We made the following changes:

    • Individual deposits are tracked in the DState.
    • The amount deposited is always returned.

    [pull-3195] +[pull-3202] +[pull-3217]

    New ledger API

    We have significantly built up the ledger API. +We will eventually replace much of the cardano-api in the node repository with this ledger API.

    [pull-3242] +[pull-3248] +[pull-3328]

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We have a new declaritive infrastructure for building constraint-based generators, +which instead generate a random ledger state representative of not just an initial state, +but also those representative of the end result of a long sequence of valid blocks. +Moreover, these generators are very fast and are much more random than our old generators. +Before we can start using them for our existing property tests, however, we still need to +expand them to generate a valid block for a given ledger state.

    [pull-3219]

    Technical debt

    We continued to address technical debt as much as we can.

    [pull-3167] +[pull-3170] +[pull-3172] +[pull-3175] +[pull-3184] +[pull-3205] +[pull-3208] +[pull-3210] +[pull-3212] +[pull-3218] +[pull-3222] +[pull-3223] +[pull-3224] +[pull-3225] +[pull-3229] +[pull-3239] +[pull-3241] +[pull-3244] +[pull-3245] +[pull-3249] +[pull-3260] +[pull-3263] +[pull-3264] +[pull-3268] +[pull-3269] +[pull-3270] +[pull-3274] +[pull-3276] +[pull-3277] +[pull-3286] +[pull-3290] +[pull-3295] +[pull-3296] +[pull-3306] +[pull-3307] +[pull-3310] +[pull-3311] +[pull-3316] +[pull-3320] +[pull-3323] +[pull-3327] +[pull-3331] +[pull-3332] +[pull-3333] +[pull-3338] +[pull-3341] +[pull-3347] +[pull-3350] +[pull-3351] +[pull-3352] +[pull-3354]

    Critical fixes

    We fixed two critical issues:

    • Growing block production delay on the epoch boundary: [pull-3209]
    • Unexpected node shutdown from balanceR: [pull-3343]

    Next steps

    • Conway spec - +Complete the first version of the conway formal specification.
    • DRep stake distribution - +Have the ledger compute the DRep stake distribution with acceptible performance.
    • Devnet ready - +Have the Haskell implementation of the conway era in sync with the formal specification, +and integrate the changes with consensus and node. +All the details might not be finalized, but the wire specification and the API should +be stable so that conway can be placed on a devnet for tool builders to start integrating with.
    • Plutus V3 - +Integrate Plutus V3 into the ledger, including a new script context which supports DReps.

    More details

    This quarterly report was based off of the following fortnightly ones:

    ]]>
    + ledger +
    + + <![CDATA[Consensus Quarterly Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-01-18-consensus + 2023-01-18-consensus + Wed, 18 Jan 2023 00:00:00 GMT + + Consensus Quarterly Update

    2022-12 - 2023-01

    Main achievements

    UTxO HD

    The prototype is feature complete and thoroughly tested at the consensus level. +In particular, we invested a lot of time in writing property-test for the +mempool, and other crucial new parts of the prototype. Now we are ready to run +integration tests and system-level benchmarks.

    Genesis

    We identified and fixed a slowdown in cross-era forecasting that was inhibiting +our efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7% +speedup in full sync times in the baseline.

    We also started prototyping a self-contained implementation of the Genesis +dynamics (in particular of the parts intentionally not part of the ChainSync +Jumping prototype) that furthered our understanding of subtleties and edge +cases.

    Support

    • We worked on designing integration of new VRF and KES crypto into consensus.
      • Crypto class was split into two parts: Crypto and HeaderCrypto.
      • With the Ledger team's help, we refactored cardano-ledger to use a proxy +type for VRF.

    Conway era

    • PR went through its second review round. It is about to be merged, but it got +delayed due to people's availability during Christmas break.

    Technical debt

    • We improved the capabilities of our io-sim library, which is key for testing +and simulating Cardano components.
    • We removed thunks from epoch translations in the ledger, which is important +for reducing memory consumption of the Cardano node.

    Fostering collaboration

    • We added a tutorial on how to instantiate the Consensus layer to run custom +ledgers. This should be a valuable resource to people looking to roll their +own custom blockchain (either for commercial or research purposes).
    • We added an overview of consensus to the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    Next steps

    UTxO HD

    • Evaluate the extensibility of the prototype. Moving the UTxO to disk is only +the first step towards reducing the memory requirements of Cardano node, and +ensuring its long term sustainability. In the future, we plan on moving other +large maps, such as delegation maps. The prototype should be able to +accommodate these changes without any major modifications.
    • Start the integration with other downstream components, such as the wallet and +db-sync. The idea is to identify and address any potential pain points that +might arise during this integration.
    • Run integration tests and system-level benchmarks.

    Genesis

    • Finish benchmarking and tuning the fast-path ChainSync Jumping prototype
    • Expand and optimize the self-contained implementation of the Disconnect Rule +(including density comparisons and the LoE)
    • Develop documentation and smoke tests for these components.
    • Start modifying the ChainSync Client for the LoP and LoR.

    Support

    • Help the Network team with diagnosing performance regression in block +production.

    Tech debt

    • Fix property-test failures concerning iterators (#3999 and +#4183).

    Fostering collaboration

    Risks

    UTxO HD

    • Moving other parts of the ledger state to disk might require a major redesign +of the prototype. For instance, if it turns out that the epoch change rules +require access to the full ledger state. If this is the case, we might +accept this risk and do the redesign after the initial release of UTxO-HD.
    • Integration with downstream clients might require more work than we +anticipate.
    • Access to the benchmarking's team time and resources.
    • Benchmarking results might show significant performance degradation, which +will require additional work if such performance degradation is not accepted +by other stakeholders.
    • The prototype's performance might not be accepted by other stakeholders. Here +we need to clearly communicate that this is necessary to ensure that as the +blockchain size grows, the node can operate within reasonable memory +constraints.
    ]]>
    + consensus +
    + + <![CDATA[Network Quarterly Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-01-13-network + 2023-01-13-network + Fri, 13 Jan 2023 00:00:00 GMT + + Network Quarterly Update

    2022-11 - 2023-01

    Summary

    The primary goal of the networking team was to focus on the single relay +release of P2P. We fixed a number of small late bugs, and concluded QA +& performance testing. Although it was discovered a regression in performance +of block production when P2P is enabled, relaying with P2P performs better +comparing to a non p2p. We concluded that this is not a blocker for the Single +Relay Release which is planned shortly.

    Peer sharing has gone through review and final review is +just being done right now. After merging it will still be disabled (hidden +behind a flag) as it's not safe without eclipse evasion. We started +implementing light peer sharing (i.e. include inbound peers into known peer set +of the outbound governor).

    We started a detailed eclipse evasion design, it will continue in the next +quarter.

    We also made a major revision of package structure of the network packages. We +ended up with a very clean dependency graph (pr #4155).

    Armando Santos delivered a talk at the ODOPIS 2022 conference on principles +of distributed systems in Brussels. The slides are available here.

    Neil Davies gave an invited seminar on DeltaQ at Université Catholique de +Louvain.

    We also found and fixed a few of bugs:

    • a bug in keep alive mini-protocol which resulted in warm to cold transitions +to be always executed through a timeout path rather than do a clean demotion +([pr #4168]).

    • fixed an assetion failure in the outbound governor (issue #4177)

    Next steps

    We will work towards the next release of P2P for block producer nodes. This includes:

    • analysing performance regression for BP nodes when using P2P
    • finish the work on controlling the block forger through node kernel (pr #3800)
    • address issue #3907 and write a script to analyse deployment of P2P relays

    We would like also to push forward eclipse evasion. Although most of the work +has be done already the release of io-sim on Hackage will happen in the +next quarter.

    We would also like to address chain-sync timeout issue recently +diagnosed by Karl Knutsson.

    If time permits we would also like to address some technical debt, especially:

    Risks

    The performance regression for block producer with P2P needs to be investigated +in the near future. This is blocker for the release of P2P on BP nodes.

    Detailed log

    Contributions to Ouroboros-Network

    • We added TraceDemoteLocalAsynchronous, which enables notification of critical issues for SPOs
    • We fixed cardano-ping compatibility with NodeToNodeV_10 (P2P, pr #4165)
    • We fixed a bug in demotion peers to cold which affected P2P nodes (commit-61058aa5c2)
    • Karl Knutsson enhanced SendFetchRequest (commit-bb1c3dddee), open-source contribution)
    • We turned SizeInBytes into a newtype.
    • We extended CONTRIBUTING.md, README.md, added CODE_OF_CONDUCT.
    • We fixed DNS test failure issue #4191
    • We fixed a simulation bug found in issue #4258
    • [pr #4168]
    • issue #4177

    Contributions to Cardano-Node

    • We maintained the Single Relay Release pr #4612, (e.g. fixing CI issues, +Rebasing it when necessary, publishing packages to Cardano Haskell Packages);
    • We enhanced JSON serialisation / deserialisation of NodeToNodeVersion and NodeToClientVersion;

    Contributions to IOSim

    • We started to use Cardano Haskell Packages for IOSim (pr #48)
    • We updated change log files
    • We added support of ghc-9.4 (pr #50)

    We also addressed the following issues in pr #57 in order to prepare the package for publication on Hackage:

    • refactored io-classes timers API (issue #46);
    • created a new package si-timers which exposes an interface using SI units +and is safe on 32-bit systems (issue #59);
    • added monad transformers instances for classes defined in io-classes (issue #58);
    • created io-classes-mtl package which includes (experimental) instances for monad transformers;
    • provide MonadMonotonicTimeNSec in io-classes and MonadMonotonicTime in si-timers (so that io-classes follow the base package);
    • added registerCancellableDelay in si-timers (which allowed us to hide fancy timer api and clean io-classes)
    • added support for js_HOST_ARCH (the new GHC JS backend)

    Note the pr #57 contains almost 40 commits, and was a major step forward for +io-sim ecosystem. We also prepared a draft pr #4281 which updates +ouroboros-network.

    Other changes for 1.0.0.0 release on Hackage:

    • Refactored test suite (pr #47)
    • Updated documentation, cabal files, CONTRIBUTING, SECURITY documents, etc in pr #60, currently under review.
    ]]>
    + network +
    + + <![CDATA[Open-Source Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2023-01-13-open-source + 2023-01-13-open-source + Fri, 13 Jan 2023 00:00:00 GMT + + Open Source Quarterly Update

    2022-11 - 2023-01

    Summary

    In the last quarter the open-source initiative delivered a comprehensive report +on the state of our repositories. As part of this work stream we +identified the key open-source repositories for the cardano project across all +the projects From a list of more than 500 repositories (some of which are +forks) we identified key repositories which constitute the core of Cardano. +20 of them were identified as to be transferred to the future MBO which will +govern Cardano development. Some where excluded (like io-sim and +typed-protocols), to be govern by IOG, since they have a much broader +application than Cardano itself, and thus we think their open-source future +will be better outside of the Cardano umbrella.

    Christian Taylor identified a number of ways we can improve our repositories to +make them more attractive for open-source contributions by analysing each of +them. This includes adding or improving various documentation files, like +CONTRIBUTING files, adding code of conduct, improving readme files, issue +& pull request templates etc. Christian also computed various interesting +metrics which gives a very good insight into the development practices: e.g. +average merge ratio, average number of reviews, comments and many more! The +presentation is available here.

    We followed with work on the Cardano Engineering Handbook. We included +a standard code of conduct which is now used by most important projects in the +Cardano space. We included cardano-node's security policy and added +a responsible disclosure policy. We also described how roles and +responsibilities should be clarified. This progress was made by +a collaborative effort of the Cardano Core, Plutus and Architecture teams, and +it wouldn't be possible without Michael Peyton Jones, Arnaud Bailly, Kevin +Hammond, Jared Corduan and Marcin Szamotulski.

    We also improved the documentation of key repositories, by adding description, +improving their README file & CONTRIBUTING files, adding code of conducts +following the Cardano Engineering Handbook. This includes improvements to:

    And also

    The work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan.

    In this quarter we also identified a number of projects which can be published to +Hackage (Haskell's package repository) or crate (Rust package repository). +The list contains 21 packages, 2 of which (hedgehog-extras and +quickcheck-dynamic) are already published on Hackage and another 5 (from +the io-sim repository) are close to be published.

    Detailed log

    The progress of the open-source project is tracked in this project.

    ]]>
    + open-source +
    + + <![CDATA[Consensus Quarterly Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2022-11-15-consensus + 2022-11-15-consensus + Tue, 15 Nov 2022 00:00:00 GMT + + Consensus Quarterly Update

    2022-09 - 2022-11

    Main achievements

    UTxO HD

    • As a consequence of the errors observed when running distributed mempool +benchmarks, we re-designed the UTxO HD mempool integration, which fixed these +errors and lead to a simpler and more maintainable design.

    • We focused on increasing test coverage for the UTxO-HD prototype. In +particular, we added property tests for:

      • Backing store (work ongoing)
      • Era transitions
    • The property tests we added uncovered several bugs, which is a great result +given the exponential increase in the cost of finding bugs as they are closer +to deployment.

    • One of the errors found by our tests required us to work on improvements in +the Haskell bindings for LMDB. This work is ongoing.

    • We started working on the mempool property tests that will exercise the new +code paths that UTxO HD introduced.

    • We developed, benchmarked and tested an implementation of sequences of +differences based on "anti-diffs". Performance results of diff sequence +operations show that we achieved a speedup of about 4x across several +scenarios. Note: this speedup is taking into account diff sequence operations +only, so the consensus-wide speedup is less than 4x.

    • We integrated the "anti-diff" prototype into the UTxO HD feature branch.

    Genesis

    • We wrote a simulator that demonstrates soundness of an abstract implementation +of the new chain selection rule.
    • We elaborated a draft specification for the Genesis implementation (currently +awaiting feedback from other architects).
    • We elaborated a draft specification for the ChainSync Jumping optimization. In +particular, this includes a proof sketch that the latter preserves liveness +and safety in all cases.
    • With the Networking team, we co-designed the eclipse avoidance mechanism, +specifically its coherence with the Genesis implementation plan's security +and its dependence on the new ChainSync Jumping optimization.
    • We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a +performance degradation wrt the baseline. Our optimization attempts so far +have brought the performance closer to the baseline, but not yet to parity.

    Conway era

    • We did most of the heavy lifting required to integrate the Conway era into the +Consensus layer.

    Technical debt

    • We started working on enabling CI nightly tests, which revealed several test +failures due to thunks being found it data structures used by the ledger and +consensus. We made a lot of progress fixing those thunk errors, but some +errors still remain.

    • We elaborated a db-analyser benchmark for the ledger operations. This led us +to the identification of high processing time at epoch boundaries, and we +could not observe any performance degradation that can be attributed to era +changes.

    • We fixed a source of flakiness in the ChainDB QSM test.

    • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    • We fixed a bug in the maximum-allowed ledger major protocol version.

    Fostering collaboration

    • We spent time making cardano-updates the central source of information for +the core teams stakeholders.
    • We went through the Galois gap analysis and extracted actionable points to +take on next.
    • Bart and Yogesh continued with their onboarding and stated making substantial +contributions to consensus.

    Next steps

    UTxO HD

    • Finish the mempool property tests.
    • Benchmark the latest version of the prototype.
    • Elaborate a document that describes new integration test scenarios and pass it +to the SDET team.
    • Bring query UTxO by address command performance on par with the baseline +version.

    Genesis

    • Receive and incorporate Duncan's feedback on the first draft specification for +the Genesis implementation.
    • Begin prototyping the first genesis implementation, unless the first draft +needs major changes.
    • Draft a second revision of the Genesis report.
    • Review the second revision with a wider audience, which includes at least +Alexander Russell. That feedback will drive a third and hopefully final +revision.
    • Investigate how to mitigate the ~30% slowdown we have observed so far in the +ChainSync jumping prototype, and try to mitigate it. In particular, we might +need to optimize the existing BlockFetch logic.

    Tech debt

    • Enabling nightly CI tests.

    Fostering collaboration

    • Merge the tutorial document Galois wrote; requires CI integration.
    • Come up with our own documentation improvements, many of which were suggested +in the Galois gap analysis.
    • Try to hire a new team member.
    ]]>
    + consensus +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2022-11-09-network + 2022-11-09-network + Wed, 09 Nov 2022 00:00:00 GMT + + Network Quarterly Update

    2022-09 - 2022-11

    Summary of most important improvements

    During this quarter the networking team delivered low level specification of +peer sharing & eclipse evasion. We held a session with the consensus & the +scientists; we got a positive feedback on the design.

    Further we focused on implementation of peer sharing. We produced a detail +design and an early implementation.

    We prepared the P2P Single Relay Release (cardano-node-1.35.5). It +includes over 130 patches of network stack improvements over the +previous version 1.35.4, which were accomplished over a longer period of +time. Among them are both bug fixes and UX improvements for stake pool +operators like simplified format of the topology file, or +improvements in the logged messages:

    We also provide better integration with systemd (socket +activation improvements) or improvements in the networking stack:

    • exit policies,
    • peer metrics improvements,
    • DNS TTL improvements (which make it harder to misconfigure the +system, an issue discovered by the performance & monitoring team),
    • do not trigger inbound idle timeout for node-to-client connections (pr +#3844), an issue reported to us by Matthias Benkort from +Cardano Foundation.

    Duncan has been making progress with the input endorsers demo. His simulation +provides a useful animated visualisation and live quantification of behaviour +of the modeled design.

    We also improved our e2e diffusion simulation by implementing header-body +split, similar to what the real implementation does.

    We also made some advances towards our future goals of P2P release for block +producer nodes (pr #3800 - in review) & for Daedalus users +(pr #3690 - merged).

    Detailed log

    • We expanded diffusion simulation with block-fetch protocol bringing it closer +to the production system.

    • We addressed some additional technical depth in diffusion simulation

    • We slightly improved documentation & CI of io-sim and typed-protocols +repositories for open-source contributors.

    • We closed a number of issues towards publishing io-sim on Hackage (only two +essential issues are left open).

    • We pushed a branch of typed-protocols which captures one of the developer UX +problems in the API which we need to solve.

    • We identified and fixed an issue related to systemd sockets.

    • We identified and fixed an issue in consensus initialisation not giving +feedback on early errors.

    • We deployed RT View, identified a number of issues which were communicated to +the performance & monitoring team.

    • We finished high level & detailed design of peer sharing, very early +implementation of peer sharing is done (note that peer sharing cannot be +safely deployed without eclipse evasion & genesis).

    • We finished high level design of eclipse evasion, and started working on +a detailed design.

    • We were assigned the role of release engineer for 1.35.5 release (the P2P +single relay release); we prepared a cardano-node for 1.35.5 release which +contains more than 130 patches of just network stack improvements done over +last few months.

    • We diagnosed and fixed an tricky bug in the peer state actions (a component +which sits between outbound governor and connection manager). That bug was +introduced earlier this year and never released. It was caught by the QA +testing framework. We expanded our diffusion simulation to cover such case and +also mitigated a chance for reintroducing such a bug in future.

    • We identified and quite likely mitigated a misconfiguration in the +benchmarking cluster (next benchmarking run will confirm our hypothesis).

    • We simplified the format of p2p topology file, we got positive feedback from +SPOs.

    • We raised severities of some of the logging messages, which is an important +improvement for SPOs, exchanges and other users of the system.

    • We worked on input endorsers simulation which gives both animated and +quantified live feedback on network operation, using a simplified model of +a TCP/IP network.

    Next quarter

    • Release the Single Relay P2P Release 1.35.5.

    • Carry on with Peer Sharing (review, testing).

    • Deliver a talk at Conference on Principles of Distributed Systems 2022 in Brussels, Belgium.

    • Present Detailed Design of Eclipse Evasion and start implementation phase.

    • Work on P2P Block Producer release.

    • Carry on with publishing of io-sim on Hackage.

    ]]>
    + network +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2022-11-07-ledger + 2022-11-07-ledger + Mon, 07 Nov 2022 00:00:00 GMT + + Ledger Quarterly Update

    2022-09 - 2022-11-04

    • We finished a minimal ledger era capable of master key rotation. +This will be re-purposed our upcoming work.
    • We have the humble beginnings of a proper ledger API.
    • We improved the problematic cost model serialization +(recall the song and dance about updating the cost model one epoch after the hard fork).
    • We have added benchmarks for problematic areas.
    • Massive repository restructure and cleanup.
      • Unified and consistent variable name schemes (not completely finished, but nearly there).
      • Massive reduction in type constraints, which causes a lot of developer friction, +in our code and also downstream.
      • More organized module structures.
      • Improved generators for our property tests.
      • We removed our dependency on cardano-prelude.
    • The formal ledger model has come a long way.
      • We created a fork of Agda that provides some meta-programming support for the ledger rules.
      • We have a large amount of the basic UTxO support in the model.
      • We can generate a good looking PDF from the model.
      • We can produce Haskell from the model.
      • We have a nice finite set theory library that we can use for many of the ledger rules.
      • We have nix support for the model.

    Next steps

    • Individual tracking of deposits. [issue-3113]
    • Versioned CBOR encoders/decoders. [issue-3014]
    • New ledger era transaction body (and the surround work associated with it).
    • Designs for the next ledger era.
    ]]>
    + ledger +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/quarterly/2022-10-07-node-cli-api + 2022-10-07-node-cli-api + Mon, 07 Nov 2022 00:00:00 GMT + + Node-Api-Cli Quarterly Update

    2022-09 - 2022-11-04

    • Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0
    • Major clean up of stale iusses + PRs.
    • Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs
    • cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node.
    • cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation.
    • General documentation updates and improvements
    • Addition of tx-mempool command which allows users to:
      • Query the node about the current mempool's capacity and sizes
      • Request the next transaction from the mempool's current list
      • Query if a particular transaction exists in the mempool
    • Initial refactoring of cardano-testnet

    Next quarter

    • cardano-api
      • Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately.
    • cardano-testnet
    • Serenity
      • Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above.
    • General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new.
    ]]>
    + cli-api-quarterly +
    +
    +
    \ No newline at end of file diff --git a/quarterly/tags/cli-api-quarterly/index.html b/quarterly/tags/cli-api-quarterly/index.html new file mode 100644 index 00000000000..c482f52416d --- /dev/null +++ b/quarterly/tags/cli-api-quarterly/index.html @@ -0,0 +1,24 @@ + + + + + +One post tagged with "cli-api-quarterly" | Cardano Development Updates + + + + + + + + + + + + +
    +

    One post tagged with "cli-api-quarterly"

    View All Tags

    · 2 min read
    Jordan Millar

    Node-Api-Cli Quarterly Update

    2022-09 - 2022-11-04

    • Various improvements to tests/CI/GHC 9.2.4 preparations/upgrade to cabal-3.8.1.0
    • Major clean up of stale iusses + PRs.
    • Implementation of stale-bot to mitigate against a proliferation of outdated issues and PRs
    • cardano-api refactoring with the aim of exposing more user friendly functions, particularly concerning transaction construction and querying the node.
    • cardano-cli refactoring with the aim of moving reusable functions to cardano-api. We have made strides here and have managed to improve the interface of transaction construction and validation.
    • General documentation updates and improvements
    • Addition of tx-mempool command which allows users to:
      • Query the node about the current mempool's capacity and sizes
      • Request the next transaction from the mempool's current list
      • Query if a particular transaction exists in the mempool
    • Initial refactoring of cardano-testnet

    Next quarter

    • cardano-api
      • Working with Konstantinos and his team to make cardano-api better for dapp developers - we have a google doc for this, I can send it to you privately.
    • cardano-testnet
    • Serenity
      • Continued refactoring of cardano-api and cardano-cli, with the particular focus on extracting re-usable components of cardano-cli and moving them to cardano-api. This is harder to define but will manifest in stuff moving from cardano-cli to cardano-api and is tied in to the cardano-api work specified above.
    • General bug fixing and smaller feature requests for the api/cli that are always coming in. Robert is primarily handling this at the moment as he is relatively new.
    + + + + \ No newline at end of file diff --git a/quarterly/tags/consensus/index.html b/quarterly/tags/consensus/index.html new file mode 100644 index 00000000000..135d9733244 --- /dev/null +++ b/quarterly/tags/consensus/index.html @@ -0,0 +1,125 @@ + + + + + +4 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    4 posts tagged with "consensus"

    View All Tags

    · 5 min read
    Damian Nadales

    2023-04 -- 2023-06

    Main achievements

    UTxO HD

    • We finished a major prototype refactoring, which includes:
      • A better and finer grained DB lock mechanism.
      • Elimination of race conditions.
      • Support for configuring batch query size and flushing rate. This is crucial to allow node users to tweak performance.
      • Architectural simplifications and performance improvements.
    • We implemented a new package to support db-sync integration with UTxO-HD.
    • We ran another set of ad-hoc benchmarks:
      • We uncovered a performance regression on the Network component when using GHC-9.2/9.4.
      • The synchronization and replay speed are as expected.
      • However, we uncovered memory consumption issues (see figure below).
        • The in-memory backend is consuming more memory than the baseline.
        • The LMDB backend shows an unexpected memory usage peak.
        • Investigation on these issues is ongoing.
    • We integrated the latest changes in main branch.
      • This required a re-design of the mempool to include the mempool fairness +improvement.

    Genesis

    • The Genesis work for this PI focused on an high-priority issue from the IOG Researchers' feedback on the proposal.
      • This particular question was not anticipated when the Q2 PI was planned.
      • As a result, the chain generators work, the ChainSync Jumping performance work, and the Genesis node prototype work were deprioritized.
      • That work has accordingly been rolled over into the Statement of Work for the first Genesis vendor work package.
    • The IOG Researchers' feedback on the design was very valuable. It had two primary effects.
    • Outcome 1: We re-introduced distinct behaviors when the node is "syncing" versus when it is "caught up".
      • This eliminated a DoS vector introduced by the proposal, instead of having to argue that it was well-mitigated.
      • The additional design complexity is relatively small.
    • Outcome 2: The issue that was unanticipated is whether the Cardano chain is consistently dense enough to rely on Genesis without any checkpointing.
      • The determination so far is that---assuming the adversary never controls more than four of the seven genesis keys---the most vulnerable segment is in the pure Praos era.
      • All the preceding windows are significantly more robust, including the entire Byron and Transitional Praos eras.
      • Thus checkpointing is not necessary for the initial Genesis release, though it still may be a reasonable addition later.
      • The primary invention was a model for bounding how much benefit the adversary's long-range attack could possibly gain from Praos's natural short forks.
    • Relevant questions that the IOG Researchers are still assessing.
      • These do not block the Genesis implementation, but do affect the ultimate values of specific parameters.
      • Question 1: what is the upper bound on the duration of an eclipse that a healthy Praos node will survive?
      • Question 2: what is the upper bound on how much grinding can improve the adversary's leader schedule within some Genesis window?

    Support

    • We performed an analysis on number of file descriptors used by Consensus, this +information can be used by the node operators to check if the number of file +descriptors they want to support are enough, thus improving the user (eg node +operator) experience.
    • We implemented a mempool fairness improvement, by which transactions are +guaranteed to be processed irrespective of their size.

    Technical debt

    • We fixed a bug in followers logic, which was discovered by our QuickCheck +property tests.
    • We created an immutable DB +server. This tool allows to serve blocks from the immutable DB to a node that connects to it. This has a remarkable value for testing and benchmarking purposes. For instance, by using this component, we can benchmark the performance of different aspects of Consensus, such as syncing from scratch, without adding Network interference in the performance results.
    • We created a db-truncater tool, which can be used in disaster recovery and benchmarking scenarios.
    • We created a benchmarks comparison tool that we plan on using for comparing the performance of two Consensus releases. This will allow us to catch performance regressions early on in the process, before they make it to the node (and show in the system level benchmark tests), thus greatly saving development costs. As an example, the graph below shows the performance improvements introduced by the Ledger team in version 0.6.0.0 of Consensus wrt version 0.5.0.0.

    Fostering collaboration

    • We released fs-sim as open-source repository. This lowers the barrier to entry for external contributors, which will indirectly benefit the Cardano project.
    • We migrated the consensus code to a new repository, splitting +it from the ouroboros-network repository. This will save development effort for both the Network and the Consensus teams, since there will be less interference (for instance when making releases).
    • We made several improvements to our release processes, which will translate in time savings. As an example, we went from 16 to 4 packages, which makes the release process simpler and smother. Our release process now makes it easier to align versions and make releases (both for us and for our downstream users).
    • We added an explanation of the hardfork-combinator forecast horizon, that will benefit not only our team, but future external contributors.

    Next steps

    UTxO HD

    Genesis

    • We will regularly liaise with the vendor(s) satisfying the Genesis Statement(s) of Work.

    · 3 min read
    Damian Nadales

    Consensus Quarterly Update

    2023-01 - 2023-03

    Main achievements

    UTxO HD

    • We finished the testing activities for the prototype, which involved adding +new tests, and fixing and enabling temporarily disabled tests.
    • We spent a substantial amount of effort refactoring and cleaning the +prototype.
    • We audited the UTxO HD prototype to make sure it can accommodate the migration +of other tables (eg stake-keys registration) from memory to disk. The result +of the audit was positive.
    • We ran ad-hoc benchmarks for reading keys and flushing values to disk. No +unexpected costs found.
    • We ran the first system level benchmarks. The performance regressions reported +were due to an unrealistic snapshotting rate. We need to re-run them again +after we design a more fine grained locking mechanism.

    Genesis

    • We elaborated a roadmap of the remaining work for Genesis.
    • We presented the design to the IOG Researchers and PNSol on February 20. The +design was well received. We updated the Genesis design with the researcher's +feedback.
      • We plugged the new DoS vector identified during the aforementioned +presentation.
    • We developed a generator for adversarial leader schedules that satisfy key +Ouroboros properties, which will be used to test the Genesis design.
      • The generator enables use of smaller Ouroboros parameters, which makes +extrema more likely and counterxamples easier interpret.
    • We wrote up the latest design iteration.
    • We continued benchmarking the Chain Sync Jumping prototype. In particular:
      • We debugged the prototype's performance regression, and unmasked the +actual cause by patching our initial theory (bad queuing behavior)
      • We identified and validated the actual cause (a pathological case in +BlockFetch tiebreaker).

    Support

    • We created two new tools. One for dumping CBOR encoded blocks to JSON. Ahother +to serve a local immutable DB.

    Conway era

    • We integrated the Conway era into consensus.

    Technical debt

    • We fixed a bug with followers, which was discovered by property tests.
    • We developed a DSL for specifying and running ChainDB test cases.
    • We fixed failing tests with iterators.
    • We created micro-benchmarks for adding transactions to the mempool.

    Fostering collaboration

    • We released a new technical documentation site for consensus.
    • We factored out several packages to external repositories. Some of this work +originated in the UTxO HD workstream.

    Next steps

    UTxO HD

    Genesis

    Support

    • Design Consensus side of hardfork-enactment in the Voltaire phase +(#4180).
    • Estimate the number of file descriptors Consensus needs +#20.

    Tech debt

    • Identify Quantitative Timeliness Agreements (QTAs) metrics that we can define +for consensus. Pick one and implement benchmarks for it.

    Fostering collaboration

    • Onboard a new team member.

    · 4 min read
    Damian Nadales

    Consensus Quarterly Update

    2022-12 - 2023-01

    Main achievements

    UTxO HD

    The prototype is feature complete and thoroughly tested at the consensus level. +In particular, we invested a lot of time in writing property-test for the +mempool, and other crucial new parts of the prototype. Now we are ready to run +integration tests and system-level benchmarks.

    Genesis

    We identified and fixed a slowdown in cross-era forecasting that was inhibiting +our efforts to benchmark the ChainSync Jumping prototype. This resulted in a 7% +speedup in full sync times in the baseline.

    We also started prototyping a self-contained implementation of the Genesis +dynamics (in particular of the parts intentionally not part of the ChainSync +Jumping prototype) that furthered our understanding of subtleties and edge +cases.

    Support

    • We worked on designing integration of new VRF and KES crypto into consensus.
      • Crypto class was split into two parts: Crypto and HeaderCrypto.
      • With the Ledger team's help, we refactored cardano-ledger to use a proxy +type for VRF.

    Conway era

    • PR went through its second review round. It is about to be merged, but it got +delayed due to people's availability during Christmas break.

    Technical debt

    • We improved the capabilities of our io-sim library, which is key for testing +and simulating Cardano components.
    • We removed thunks from epoch translations in the ledger, which is important +for reducing memory consumption of the Cardano node.

    Fostering collaboration

    • We added a tutorial on how to instantiate the Consensus layer to run custom +ledgers. This should be a valuable resource to people looking to roll their +own custom blockchain (either for commercial or research purposes).
    • We added an overview of consensus to the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    Next steps

    UTxO HD

    • Evaluate the extensibility of the prototype. Moving the UTxO to disk is only +the first step towards reducing the memory requirements of Cardano node, and +ensuring its long term sustainability. In the future, we plan on moving other +large maps, such as delegation maps. The prototype should be able to +accommodate these changes without any major modifications.
    • Start the integration with other downstream components, such as the wallet and +db-sync. The idea is to identify and address any potential pain points that +might arise during this integration.
    • Run integration tests and system-level benchmarks.

    Genesis

    • Finish benchmarking and tuning the fast-path ChainSync Jumping prototype
    • Expand and optimize the self-contained implementation of the Disconnect Rule +(including density comparisons and the LoE)
    • Develop documentation and smoke tests for these components.
    • Start modifying the ChainSync Client for the LoP and LoR.

    Support

    • Help the Network team with diagnosing performance regression in block +production.

    Tech debt

    • Fix property-test failures concerning iterators (#3999 and +#4183).

    Fostering collaboration

    Risks

    UTxO HD

    • Moving other parts of the ledger state to disk might require a major redesign +of the prototype. For instance, if it turns out that the epoch change rules +require access to the full ledger state. If this is the case, we might +accept this risk and do the redesign after the initial release of UTxO-HD.
    • Integration with downstream clients might require more work than we +anticipate.
    • Access to the benchmarking's team time and resources.
    • Benchmarking results might show significant performance degradation, which +will require additional work if such performance degradation is not accepted +by other stakeholders.
    • The prototype's performance might not be accepted by other stakeholders. Here +we need to clearly communicate that this is necessary to ensure that as the +blockchain size grows, the node can operate within reasonable memory +constraints.

    · 4 min read
    Damian Nadales

    Consensus Quarterly Update

    2022-09 - 2022-11

    Main achievements

    UTxO HD

    • As a consequence of the errors observed when running distributed mempool +benchmarks, we re-designed the UTxO HD mempool integration, which fixed these +errors and lead to a simpler and more maintainable design.

    • We focused on increasing test coverage for the UTxO-HD prototype. In +particular, we added property tests for:

      • Backing store (work ongoing)
      • Era transitions
    • The property tests we added uncovered several bugs, which is a great result +given the exponential increase in the cost of finding bugs as they are closer +to deployment.

    • One of the errors found by our tests required us to work on improvements in +the Haskell bindings for LMDB. This work is ongoing.

    • We started working on the mempool property tests that will exercise the new +code paths that UTxO HD introduced.

    • We developed, benchmarked and tested an implementation of sequences of +differences based on "anti-diffs". Performance results of diff sequence +operations show that we achieved a speedup of about 4x across several +scenarios. Note: this speedup is taking into account diff sequence operations +only, so the consensus-wide speedup is less than 4x.

    • We integrated the "anti-diff" prototype into the UTxO HD feature branch.

    Genesis

    • We wrote a simulator that demonstrates soundness of an abstract implementation +of the new chain selection rule.
    • We elaborated a draft specification for the Genesis implementation (currently +awaiting feedback from other architects).
    • We elaborated a draft specification for the ChainSync Jumping optimization. In +particular, this includes a proof sketch that the latter preserves liveness +and safety in all cases.
    • With the Networking team, we co-designed the eclipse avoidance mechanism, +specifically its coherence with the Genesis implementation plan's security +and its dependence on the new ChainSync Jumping optimization.
    • We implemented a prototype for ChainSync Jumping. Initial benchmarks showed a +performance degradation wrt the baseline. Our optimization attempts so far +have brought the performance closer to the baseline, but not yet to parity.

    Conway era

    • We did most of the heavy lifting required to integrate the Conway era into the +Consensus layer.

    Technical debt

    • We started working on enabling CI nightly tests, which revealed several test +failures due to thunks being found it data structures used by the ledger and +consensus. We made a lot of progress fixing those thunk errors, but some +errors still remain.

    • We elaborated a db-analyser benchmark for the ledger operations. This led us +to the identification of high processing time at epoch boundaries, and we +could not observe any performance degradation that can be attributed to era +changes.

    • We fixed a source of flakiness in the ChainDB QSM test.

    • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    • We fixed a bug in the maximum-allowed ledger major protocol version.

    Fostering collaboration

    • We spent time making cardano-updates the central source of information for +the core teams stakeholders.
    • We went through the Galois gap analysis and extracted actionable points to +take on next.
    • Bart and Yogesh continued with their onboarding and stated making substantial +contributions to consensus.

    Next steps

    UTxO HD

    • Finish the mempool property tests.
    • Benchmark the latest version of the prototype.
    • Elaborate a document that describes new integration test scenarios and pass it +to the SDET team.
    • Bring query UTxO by address command performance on par with the baseline +version.

    Genesis

    • Receive and incorporate Duncan's feedback on the first draft specification for +the Genesis implementation.
    • Begin prototyping the first genesis implementation, unless the first draft +needs major changes.
    • Draft a second revision of the Genesis report.
    • Review the second revision with a wider audience, which includes at least +Alexander Russell. That feedback will drive a third and hopefully final +revision.
    • Investigate how to mitigate the ~30% slowdown we have observed so far in the +ChainSync jumping prototype, and try to mitigate it. In particular, we might +need to optimize the existing BlockFetch logic.

    Tech debt

    • Enabling nightly CI tests.

    Fostering collaboration

    • Merge the tutorial document Galois wrote; requires CI integration.
    • Come up with our own documentation improvements, many of which were suggested +in the Galois gap analysis.
    • Try to hire a new team member.
    + + + + \ No newline at end of file diff --git a/quarterly/tags/index.html b/quarterly/tags/index.html new file mode 100644 index 00000000000..bc2af96bf7c --- /dev/null +++ b/quarterly/tags/index.html @@ -0,0 +1,24 @@ + + + + + +Tags | Cardano Development Updates + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quarterly/tags/ledger/index.html b/quarterly/tags/ledger/index.html new file mode 100644 index 00000000000..871224752c1 --- /dev/null +++ b/quarterly/tags/ledger/index.html @@ -0,0 +1,167 @@ + + + + + +2 posts tagged with "ledger" | Cardano Development Updates + + + + + + + + + + + + +
    +

    2 posts tagged with "ledger"

    View All Tags

    · 7 min read
    Jared Corduan

    Ledger Quarterly Update

    2023-01 - 2023-03

    Main achievements

    CIPs

    • Entering the Voltaire phase - +CIP-1694 received a major update after participation in the design has expanded to +more and more people, including those who attended the Colorado workshop. +See CIP-1694.
    • Ledger CIP category - +The ledger team continues to embrace the CIP process, and has begun the process of +registering the ledger as an official CIP category. +See CIP-84.
    • Ledger serialization - +A CIP for the ledger serialization deprecation cycle has been accepted. +See CIP-80.

    Formal ledger model

    Our new formal specifications backed by Agda have seen a lot of progress. +The majority of the ideas in CIP-1694 are now present, and we have made enough progress +that we can now safely say that the PDF produced by the Agda model will be the +official ledger specification for the Conway ledger era. +See the repository.

    Conway ledger era

    Progress on the Haskell implementation of CIP-1694 has gone hand in hand with the formal model. +The major component still missing is the DRep stake distribution, which still presents some +technical challenges.

    [pull-3176] +[pull-3216] +[pull-3226] +[pull-3291] +[pull-3326] +[pull-3330] +[pull-3339]

    DRep stake distribution computation

    Adding another large stake distribution to the ledger state must proceed with caution. +We do not want the memory used by the node to increase too much, +and performance problems can lead to reduced block production. +We have prototyped, tested, and benchmarked several approaches that could give us +the current DRep stake distribution at each epoch boundary. +This has very important implications, since we want every ADA holder to be able to at any +time (such as during a contentious vote) register themselves as a DRep and still have time +to vote themselves on the issue.

    [pull-3344] +[pull-3353] +[pull-3364]

    Integration work

    The ledger has made some wonderful improvements over the past six months, +but which entail a significant amount of integration efforts:

    • Our new versioned CBOR schemes
    • Individual deposit tracking
    • An improved cross-era interface utilizing lenses
    • A new ledger API
    • Re-arranging the ledger stake in preparation for CIP-1694
    • Versioning our Haskell packages +using CHaPs.
    • Consistent conventions for variable names

    [pull-3279] +[pull-3282] +[pull-3288] +[pull-3289] +[pull-3292] +[pull-3297] +[pull-3298] +[pull-3299] +[pull-3300] +[pull-3302] +[pull-3303] +[pull-3308] +[pull-3342] +[pull-3345] +[pull-3356] +[pull-3357] +[pull-3360] +[pull-3361] +[pull-3363] +[pull-4349] +[pull-378] +[pull-376] +[pull-373] +[pull-370] +[pull-361] +[pull-4976] +[pull-5013]

    Deposit tracking

    Individual deposits (for stake credential and stake pool registrations) were not tracked by the ledger. +Deposits were returned according to the current protocol parameters. +When the values of these two protocol parameters change, the deposit pot +is adjusted by adding to, or removing from, the reserves.

    This has several problems:

    • Most people expect a deposit to be paid back exactly.
    • We cannot increase the deposit amount once the reserves hits zero.
    • If it becomes known that the deposit amount is going to be increased, free Lovelace can be earned by registering credentials.
    • Because of the problems above, it is going to be incredibly hard to ever change the values.
    • There is a serious issue involving hard forks. +The consensus layer makes the decision about whether or not to enact a hard fork based on +the protocol parameter update state two stability windows before the end of the epoch. +However, the ledger will reject a protocol parameter update on the epoch boundary +if the deposit pot adjustments cannot be reconciled with the reseve pot. +This means that if quorum is met regarding changing the major protocol version, +but the update is rejected on the epoch boundary, consensus will change the era but the +ledger will not change the major protocol version, leaving the ledger in a split-brain state.

    Because we never actually changed the values of the two deposits amounts in the protocol parameters +on mainnet, we were able to retroactively change the behavior. +We made the following changes:

    • Individual deposits are tracked in the DState.
    • The amount deposited is always returned.

    [pull-3195] +[pull-3202] +[pull-3217]

    New ledger API

    We have significantly built up the ledger API. +We will eventually replace much of the cardano-api in the node repository with this ledger API.

    [pull-3242] +[pull-3248] +[pull-3328]

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We have a new declaritive infrastructure for building constraint-based generators, +which instead generate a random ledger state representative of not just an initial state, +but also those representative of the end result of a long sequence of valid blocks. +Moreover, these generators are very fast and are much more random than our old generators. +Before we can start using them for our existing property tests, however, we still need to +expand them to generate a valid block for a given ledger state.

    [pull-3219]

    Technical debt

    We continued to address technical debt as much as we can.

    [pull-3167] +[pull-3170] +[pull-3172] +[pull-3175] +[pull-3184] +[pull-3205] +[pull-3208] +[pull-3210] +[pull-3212] +[pull-3218] +[pull-3222] +[pull-3223] +[pull-3224] +[pull-3225] +[pull-3229] +[pull-3239] +[pull-3241] +[pull-3244] +[pull-3245] +[pull-3249] +[pull-3260] +[pull-3263] +[pull-3264] +[pull-3268] +[pull-3269] +[pull-3270] +[pull-3274] +[pull-3276] +[pull-3277] +[pull-3286] +[pull-3290] +[pull-3295] +[pull-3296] +[pull-3306] +[pull-3307] +[pull-3310] +[pull-3311] +[pull-3316] +[pull-3320] +[pull-3323] +[pull-3327] +[pull-3331] +[pull-3332] +[pull-3333] +[pull-3338] +[pull-3341] +[pull-3347] +[pull-3350] +[pull-3351] +[pull-3352] +[pull-3354]

    Critical fixes

    We fixed two critical issues:

    • Growing block production delay on the epoch boundary: [pull-3209]
    • Unexpected node shutdown from balanceR: [pull-3343]

    Next steps

    • Conway spec - +Complete the first version of the conway formal specification.
    • DRep stake distribution - +Have the ledger compute the DRep stake distribution with acceptible performance.
    • Devnet ready - +Have the Haskell implementation of the conway era in sync with the formal specification, +and integrate the changes with consensus and node. +All the details might not be finalized, but the wire specification and the API should +be stable so that conway can be placed on a devnet for tool builders to start integrating with.
    • Plutus V3 - +Integrate Plutus V3 into the ledger, including a new script context which supports DReps.

    More details

    This quarterly report was based off of the following fortnightly ones:

    · 2 min read
    Jared Corduan

    Ledger Quarterly Update

    2022-09 - 2022-11-04

    • We finished a minimal ledger era capable of master key rotation. +This will be re-purposed our upcoming work.
    • We have the humble beginnings of a proper ledger API.
    • We improved the problematic cost model serialization +(recall the song and dance about updating the cost model one epoch after the hard fork).
    • We have added benchmarks for problematic areas.
    • Massive repository restructure and cleanup.
      • Unified and consistent variable name schemes (not completely finished, but nearly there).
      • Massive reduction in type constraints, which causes a lot of developer friction, +in our code and also downstream.
      • More organized module structures.
      • Improved generators for our property tests.
      • We removed our dependency on cardano-prelude.
    • The formal ledger model has come a long way.
      • We created a fork of Agda that provides some meta-programming support for the ledger rules.
      • We have a large amount of the basic UTxO support in the model.
      • We can generate a good looking PDF from the model.
      • We can produce Haskell from the model.
      • We have a nice finite set theory library that we can use for many of the ledger rules.
      • We have nix support for the model.

    Next steps

    • Individual tracking of deposits. [issue-3113]
    • Versioned CBOR encoders/decoders. [issue-3014]
    • New ledger era transaction body (and the surround work associated with it).
    • Designs for the next ledger era.
    + + + + \ No newline at end of file diff --git a/quarterly/tags/network/index.html b/quarterly/tags/network/index.html new file mode 100644 index 00000000000..6bc5996df39 --- /dev/null +++ b/quarterly/tags/network/index.html @@ -0,0 +1,156 @@ + + + + + +4 posts tagged with "network" | Cardano Development Updates + + + + + + + + + + + + +
    +

    4 posts tagged with "network"

    View All Tags

    · 6 min read
    Marcin Szamotulski

    2023-04 - 2023-06

    Main achievements

    Eclipse Evasion

    We finalised the design of eclipse evasion and implemented its mechanism which +relays on connectivity to big ledger peers. Big ledger peers are the +largest ledger peers which accumulate 90% of stake (currently there are less +than 1000 of them). The outbound governor has new targets for known, +established and active big ledger peers which work in a similar way that +such targets work for ledger peers. The ouroboros-network#4662 PR is +currently in review.

    As part of this work we also identified a bug which would prevent a node to +connect to itself. Such connections are not easily detectable and are expected +to be dropped by the churn mechanism, nonetheless they should not be buggy. +The failure was discovered thanks to our e2e simulation of diffusion using +io-sim & property based testing.

    The PR also refactors the heart of the ouroboros-network interface reducing +technical debt that would otherwise accumulate.

    We also identified a possible improvement in the churn mechanism, which will be +implemented in Q3. Churn needs to await for peers to terminate, we can +improve the synchronisation. [ouroboros-network#4617]

    Ecosystem P2P Deployment Progress

    We reached 50% of stake in hands of SPOs who run at least on P2P relay. Now +also Emurgo and CF are running some P2P relays. Also 20% of IOG relays are +running in P2P mode.

    P2P Progress

    Peer Sharing

    We implemented bootstrapping for peer sharing (also known as light peer +sharing). New downstream (inbound) peers are now added to the known peers of +the outbound governor. Together with peer sharing this allows for non +registered relays to propagate through the network. ouroboros-network#3596

    Please note that peer sharing is disabled by default and is not considered safe +until Bootstrap Peers (see below) or Genesis is implemented.

    Diffusion (P2P)

    • We designed a feature which will reduce the load on IOG relays (in future +also run by CF & Emurgo). The feature consists of two parts. A new source +of peers called bootstrap peers (obtained from via an https request), the +ability to switch from bootstrap peers to ledger peers if the node is synced +(we are collaborating with the consensus team on the interface Bootstrap +Peers IER). This feature will be completed in Q3. +ouroboros-network#4530

    • We published a blog post about P2P design & implementation.

    • Karl Knutsson (CF) fixed an issue observed on a relay with a lot of outbound connections: +ouroboros-network#4559.

    • We merged changes which allow the consensus layer to start / stop block +forging thread. This will allow to deploy P2P block producing nodes which +serve as a live backup node. ouroboros-consensus#140

    • We fixed a few bugs in local root peers DNS resolution service: +ouroboros-network#4583, ouroboros-network#4571.

    • We limited concurrency of DNS name resolutions: ouroboros-network#4596.

    • Galois Inc implemented query option for Handshake: ouroboros-network#4256.

    • We fixed handshake query timeout: ouroboros-network#4608.

    • We implemented warm valency for local root peers. This can help when using +DNS names in local root peers which resolve to many IP addresses. ouroboros-network#4575

    • We merged handshake changes which allow query protocol versions. Thanks to +James Parker from Galois Inc.: ouroboros-network#4256, cardano-cli#30.

    Other Improvements & Developments

    CDDL

    • We added node-to-node and node-to-client CDDL specs / tests for encoding +of NodeToNodeVersionData and NodeToClientVersionData.

    • We clarified an inconsistency between CDDL spec and implementation which is +highly polymorphic. We designed and implemented a fix for tx-submission +and local-tx-submission mini-protocols. Specs for other mini-protocols will +be improved at a later stage. ouroboros-network#4580

    Cardano Ping

    IOSim

    Typed Protocols

    Cardano Client

    • We fixed a bug in cardano-client-0.1.0.2 release which results in clients +(e.g. db-sync) negotiate an experimental protocol version.

    Technical debt

    CI improvements

    GHC 9.4 & 9.6

    We made all repositories under our control compile with ghc-9.4 and ghc-9.6 +which includes ouroboros-network, io-sim, typed-protocols and +Win32-network.

    Next steps

    We will continue towards our aspirational roadmap.

    • We will continue reviewing eclipse evasion.
    • As ouroboros-consensus#140 was merged, we are making progress towards +releasing P2P on block production nodes. We hope to analyse performance +regression on such nodes observed on the benchmarking cluster. roadmap-3887
    • We are also focused on roadmap-3969. Note that it was expanded in Q2.

    · 3 min read
    Marcin Szamotulski

    2023-01 - 2023-03

    Main achievements

    Gradual dynamic P2P release on mainnet

    We released two version of cardano-node with dynamic P2P capabilities:

    • 1.35.6
      • we found and fixed a bug in exception handling in peer-state-actionspull-4357
      • we found and fixed a busy loop when demoting a peer from hot to warm pull-4385
    • 1.35.7
      • includes interoperability in the legacy non-p2p network stack pull-4467
    • we fixed a busy loop of demotion & promotions: warm -> hot -> warm[pull-4485] /it will be included in cardano-node-8.0.0 release/.

    Currently there are more than 200 P2P relays on mainnet.

    Peer Sharing

    We implemented /peer sharing/ pull-4019 which will be available as an +experimental feature in one of the future cardano-node releases.

    We implemented /light peer sharing/, e.g. adding inbound connections to the set +of known peers of the outbound governor, which allows to bootstrap relays not +registered on chain. This complements peer sharing. The pull-4277 is in +late review stages.

    Eclipse Evasion

    We finalised design of eclipse evasion and we started implementing it. We +have an initial implementation (not merged). We are in the process of extending +our test suite to cover new implementation details: issue-3886, pull-4462.

    Cardano Network Service Assurance

    Galois has been making progress on Cardano Network Service Assurance project.

    • In cardano-node, they have developed a datapoint abstraction that creates +a queue of (existing) log events, they now have two such datapoints (of log +events) implemented.

    • They have developed a datapoint client executable that can connect to a node +which serves the "new tracing".

    • They have been exploring approaches for the consolidation and analysis of +datapoint data to extract actionable network health status.

    Cardano-Node

    • We made it possible to configure accepted connections limit pull-4902.

    Testing improvements

    • We fixed a bug in network simulation implementation of TCP simultaneous open pull-4265.

    • We introduced header-body split in the diffusion simulation pull-4419 (in review).

    • We introduced initiator only nodes in the diffusion simulation pull-4280.

    • We fixed a connection-manager test failure issue-4370.

    Technical Debt

    • We refactored Snocket interface decoupling it from the multiplexer +pull-4260. This simplified some aspects of the KES agent implementation.

    • We introduces a record for CBOR codecs which are used for various data +structures by mini-protocol codecs pull-4430.

    Documentation

    • We explained some limitations of CDDL in our technical report pull-4351.

    IO-Sim

    • We fixed implementation of MVar's pull-70.

    NoThunks

    • We published a new version of nothunks library to Hackage.

    Next steps

    • Finish implementation & testing of eclipse evasion issue-3886.
    • Optimise connectivity to peers behind firewall issue-4381.
    • Finish the work on enabling block production dynamically to allow using P2P +on block producers issue-3159.
    • If time permits we would like also to reserve some time for finishing +publication of io-sim to Hackage.

    · 5 min read
    Marcin Szamotulski

    Network Quarterly Update

    2022-11 - 2023-01

    Summary

    The primary goal of the networking team was to focus on the single relay +release of P2P. We fixed a number of small late bugs, and concluded QA +& performance testing. Although it was discovered a regression in performance +of block production when P2P is enabled, relaying with P2P performs better +comparing to a non p2p. We concluded that this is not a blocker for the Single +Relay Release which is planned shortly.

    Peer sharing has gone through review and final review is +just being done right now. After merging it will still be disabled (hidden +behind a flag) as it's not safe without eclipse evasion. We started +implementing light peer sharing (i.e. include inbound peers into known peer set +of the outbound governor).

    We started a detailed eclipse evasion design, it will continue in the next +quarter.

    We also made a major revision of package structure of the network packages. We +ended up with a very clean dependency graph (pr #4155).

    Armando Santos delivered a talk at the ODOPIS 2022 conference on principles +of distributed systems in Brussels. The slides are available here.

    Neil Davies gave an invited seminar on DeltaQ at Université Catholique de +Louvain.

    We also found and fixed a few of bugs:

    • a bug in keep alive mini-protocol which resulted in warm to cold transitions +to be always executed through a timeout path rather than do a clean demotion +([pr #4168]).

    • fixed an assetion failure in the outbound governor (issue #4177)

    Next steps

    We will work towards the next release of P2P for block producer nodes. This includes:

    • analysing performance regression for BP nodes when using P2P
    • finish the work on controlling the block forger through node kernel (pr #3800)
    • address issue #3907 and write a script to analyse deployment of P2P relays

    We would like also to push forward eclipse evasion. Although most of the work +has be done already the release of io-sim on Hackage will happen in the +next quarter.

    We would also like to address chain-sync timeout issue recently +diagnosed by Karl Knutsson.

    If time permits we would also like to address some technical debt, especially:

    Risks

    The performance regression for block producer with P2P needs to be investigated +in the near future. This is blocker for the release of P2P on BP nodes.

    Detailed log

    Contributions to Ouroboros-Network

    • We added TraceDemoteLocalAsynchronous, which enables notification of critical issues for SPOs
    • We fixed cardano-ping compatibility with NodeToNodeV_10 (P2P, pr #4165)
    • We fixed a bug in demotion peers to cold which affected P2P nodes (commit-61058aa5c2)
    • Karl Knutsson enhanced SendFetchRequest (commit-bb1c3dddee), open-source contribution)
    • We turned SizeInBytes into a newtype.
    • We extended CONTRIBUTING.md, README.md, added CODE_OF_CONDUCT.
    • We fixed DNS test failure issue #4191
    • We fixed a simulation bug found in issue #4258
    • [pr #4168]
    • issue #4177

    Contributions to Cardano-Node

    • We maintained the Single Relay Release pr #4612, (e.g. fixing CI issues, +Rebasing it when necessary, publishing packages to Cardano Haskell Packages);
    • We enhanced JSON serialisation / deserialisation of NodeToNodeVersion and NodeToClientVersion;

    Contributions to IOSim

    • We started to use Cardano Haskell Packages for IOSim (pr #48)
    • We updated change log files
    • We added support of ghc-9.4 (pr #50)

    We also addressed the following issues in pr #57 in order to prepare the package for publication on Hackage:

    • refactored io-classes timers API (issue #46);
    • created a new package si-timers which exposes an interface using SI units +and is safe on 32-bit systems (issue #59);
    • added monad transformers instances for classes defined in io-classes (issue #58);
    • created io-classes-mtl package which includes (experimental) instances for monad transformers;
    • provide MonadMonotonicTimeNSec in io-classes and MonadMonotonicTime in si-timers (so that io-classes follow the base package);
    • added registerCancellableDelay in si-timers (which allowed us to hide fancy timer api and clean io-classes)
    • added support for js_HOST_ARCH (the new GHC JS backend)

    Note the pr #57 contains almost 40 commits, and was a major step forward for +io-sim ecosystem. We also prepared a draft pr #4281 which updates +ouroboros-network.

    Other changes for 1.0.0.0 release on Hackage:

    • Refactored test suite (pr #47)
    • Updated documentation, cabal files, CONTRIBUTING, SECURITY documents, etc in pr #60, currently under review.

    · 4 min read
    Marcin Szamotulski

    Network Quarterly Update

    2022-09 - 2022-11

    Summary of most important improvements

    During this quarter the networking team delivered low level specification of +peer sharing & eclipse evasion. We held a session with the consensus & the +scientists; we got a positive feedback on the design.

    Further we focused on implementation of peer sharing. We produced a detail +design and an early implementation.

    We prepared the P2P Single Relay Release (cardano-node-1.35.5). It +includes over 130 patches of network stack improvements over the +previous version 1.35.4, which were accomplished over a longer period of +time. Among them are both bug fixes and UX improvements for stake pool +operators like simplified format of the topology file, or +improvements in the logged messages:

    We also provide better integration with systemd (socket +activation improvements) or improvements in the networking stack:

    • exit policies,
    • peer metrics improvements,
    • DNS TTL improvements (which make it harder to misconfigure the +system, an issue discovered by the performance & monitoring team),
    • do not trigger inbound idle timeout for node-to-client connections (pr +#3844), an issue reported to us by Matthias Benkort from +Cardano Foundation.

    Duncan has been making progress with the input endorsers demo. His simulation +provides a useful animated visualisation and live quantification of behaviour +of the modeled design.

    We also improved our e2e diffusion simulation by implementing header-body +split, similar to what the real implementation does.

    We also made some advances towards our future goals of P2P release for block +producer nodes (pr #3800 - in review) & for Daedalus users +(pr #3690 - merged).

    Detailed log

    • We expanded diffusion simulation with block-fetch protocol bringing it closer +to the production system.

    • We addressed some additional technical depth in diffusion simulation

    • We slightly improved documentation & CI of io-sim and typed-protocols +repositories for open-source contributors.

    • We closed a number of issues towards publishing io-sim on Hackage (only two +essential issues are left open).

    • We pushed a branch of typed-protocols which captures one of the developer UX +problems in the API which we need to solve.

    • We identified and fixed an issue related to systemd sockets.

    • We identified and fixed an issue in consensus initialisation not giving +feedback on early errors.

    • We deployed RT View, identified a number of issues which were communicated to +the performance & monitoring team.

    • We finished high level & detailed design of peer sharing, very early +implementation of peer sharing is done (note that peer sharing cannot be +safely deployed without eclipse evasion & genesis).

    • We finished high level design of eclipse evasion, and started working on +a detailed design.

    • We were assigned the role of release engineer for 1.35.5 release (the P2P +single relay release); we prepared a cardano-node for 1.35.5 release which +contains more than 130 patches of just network stack improvements done over +last few months.

    • We diagnosed and fixed an tricky bug in the peer state actions (a component +which sits between outbound governor and connection manager). That bug was +introduced earlier this year and never released. It was caught by the QA +testing framework. We expanded our diffusion simulation to cover such case and +also mitigated a chance for reintroducing such a bug in future.

    • We identified and quite likely mitigated a misconfiguration in the +benchmarking cluster (next benchmarking run will confirm our hypothesis).

    • We simplified the format of p2p topology file, we got positive feedback from +SPOs.

    • We raised severities of some of the logging messages, which is an important +improvement for SPOs, exchanges and other users of the system.

    • We worked on input endorsers simulation which gives both animated and +quantified live feedback on network operation, using a simplified model of +a TCP/IP network.

    Next quarter

    • Release the Single Relay P2P Release 1.35.5.

    • Carry on with Peer Sharing (review, testing).

    • Deliver a talk at Conference on Principles of Distributed Systems 2022 in Brussels, Belgium.

    • Present Detailed Design of Eclipse Evasion and start implementation phase.

    • Work on P2P Block Producer release.

    • Carry on with publishing of io-sim on Hackage.

    + + + + \ No newline at end of file diff --git a/quarterly/tags/open-source/index.html b/quarterly/tags/open-source/index.html new file mode 100644 index 00000000000..df5fdda17dd --- /dev/null +++ b/quarterly/tags/open-source/index.html @@ -0,0 +1,53 @@ + + + + + +One post tagged with "open-source" | Cardano Development Updates + + + + + + + + + + + + +
    +

    One post tagged with "open-source"

    View All Tags

    · 3 min read
    Marcin Szamotulski

    Open Source Quarterly Update

    2022-11 - 2023-01

    Summary

    In the last quarter the open-source initiative delivered a comprehensive report +on the state of our repositories. As part of this work stream we +identified the key open-source repositories for the cardano project across all +the projects From a list of more than 500 repositories (some of which are +forks) we identified key repositories which constitute the core of Cardano. +20 of them were identified as to be transferred to the future MBO which will +govern Cardano development. Some where excluded (like io-sim and +typed-protocols), to be govern by IOG, since they have a much broader +application than Cardano itself, and thus we think their open-source future +will be better outside of the Cardano umbrella.

    Christian Taylor identified a number of ways we can improve our repositories to +make them more attractive for open-source contributions by analysing each of +them. This includes adding or improving various documentation files, like +CONTRIBUTING files, adding code of conduct, improving readme files, issue +& pull request templates etc. Christian also computed various interesting +metrics which gives a very good insight into the development practices: e.g. +average merge ratio, average number of reviews, comments and many more! The +presentation is available here.

    We followed with work on the Cardano Engineering Handbook. We included +a standard code of conduct which is now used by most important projects in the +Cardano space. We included cardano-node's security policy and added +a responsible disclosure policy. We also described how roles and +responsibilities should be clarified. This progress was made by +a collaborative effort of the Cardano Core, Plutus and Architecture teams, and +it wouldn't be possible without Michael Peyton Jones, Arnaud Bailly, Kevin +Hammond, Jared Corduan and Marcin Szamotulski.

    We also improved the documentation of key repositories, by adding description, +improving their README file & CONTRIBUTING files, adding code of conducts +following the Cardano Engineering Handbook. This includes improvements to:

    And also

    The work was carried by Marcin Szamotulski, Addie Girouard and Jared Corduan.

    In this quarter we also identified a number of projects which can be published to +Hackage (Haskell's package repository) or crate (Rust package repository). +The list contains 21 packages, 2 of which (hedgehog-extras and +quickcheck-dynamic) are already published on Hackage and another 5 (from +the io-sim repository) are close to be published.

    Detailed log

    The progress of the open-source project is tracked in this project.

    + + + + \ No newline at end of file diff --git a/quarterly/tags/performance-tracing/index.html b/quarterly/tags/performance-tracing/index.html new file mode 100644 index 00000000000..d4ad9a665a0 --- /dev/null +++ b/quarterly/tags/performance-tracing/index.html @@ -0,0 +1,34 @@ + + + + + +One post tagged with "performance-tracing" | Cardano Development Updates + + + + + + + + + + + + +
    +

    One post tagged with "performance-tracing"

    View All Tags

    · 4 min read
    Michael Karg

    2023-07 - 2023-09

    Main achievements

    • Release benchmarking
    • Developing and running UTxO-HD benchmarks - in-memory flavour
    • P2P benchmarks, facilitating rollout
    • Production-readiness of the new Nomad cluster has been reached
    • Optimization of and introspection capability for the new tracing system
    • GHC9 performance investigation (and possible remedy)
    • Conensus QTAs: first real-world application of prototype

    Release benchmarking

    Ongoing release benchmarking is a crucial safeguard to cardano-node's release cycle from a performance perspective. We've performed and analyzed benchmarks for node versions 8.2.x to 8.5 throughout Q3.

    UTxO-HD benchmarks

    Targeting a specific new feature in benchmarks requires development effort and fine-tuning the machinery. In Q3, we achieved that for the in-memory flavour of UTxO-HD, enabling benchmark delivery.

    P2P benchmarks

    In Q3, we performed additional P2P benchmarks to facilitate the comprehensive rollout of that feature.

    New nomad cluster

    The new hardware cluster for benchmarks, which is controlled through the new nomad backend, has received +various rounds of validation and adjustments in Q3 - in addition to finalizing integration with the rest +of our pipeline. The confidence in metrics gathered on the cluster is now sufficient for us to consider it +ready for production use.

    New tracing system

    Our new tracing system has received various rounds of optimization in Q3. We could verify in our benchmarks that +it is roughly on par with the legacy system while offering a richer feature set and greater flexibility.

    Additionally, in Q3 we equipped the system with an introspection capability. This is now used for generating +end user documentation that stays in-sync with definitions in code, and for automated consistency checking of the entire system.

    GHC9 performance

    In Q3, a joint investigation with DevX into GHC9's behaviour revealed where and how GHC9 misses opportunities for +optimization of generated code. This led to an approach to annotate our codebase accordingly to re-enable +those optimizations - which is still being validated.

    Consensus QTAs

    In collaboration with Consensus and DevX, we advanced the Consensus QTAs prototype capturing ledger operations' +performance characteristics. It's now applicable, and being applied, to a real-world task - namely +gathering evidence of the effect of aforementioned changes allowing for performant GHC9 builds.

    Next steps

    Benchmarking:

    In Q4, the focus will be on:

    • facilitating the next mainnet release
    • benchmarking runs in the Conway era
    • developing benchmarks / workloads for Conway-exclusive actions
    • implementing a specialized benchmark setup for the UTxO-HD on-disk variant
    • developing new Plutus benchmarks to safeguard Plutus V3
    • benchmarks regarding the rollout of P2P

    Performance

    For certain blocking performance issues we've located the cause, or even found a solution in a cross-team effort. In Q4 we'll advance that work to ensure the ongoing +release cycle for mainnet, as well as make GHC9 become a viable release platform.

    New tracing system

    For the new tracing system, we'll finalize optimization - current results are already on par with the legacy system. Furthermore, we will finish up comprehensive documentation, as well as description of a recommended setup, for which we can provide initial support.

    UTxO-HD monitoring

    We'll augment our analysis pipeline so it can process monitoring data from UTxO-HD nodes connected to mainnet in a meaningful way.

    Nomad backend

    From Q4 on, this backend will be in production use. We plan on adding various UX and flexibility improvements, and further fine-tuning some profiles for nomad.

    Workbench

    We will prepare for a future move of our performance workbench into a separate project. This entails restructuring, refactoring and reimplementation of certain few components that currently assume to always be in sync with cardano-node.

    Consensus component QTAs (co-development)

    In Q4 there will be ongoing work with and support for the existing prototype. We plan to identify a fixed set of input data that yields results of high informative value, and to formalize the process to a point that enables future automation.

    + + + + \ No newline at end of file diff --git a/quarterly/tags/sre/index.html b/quarterly/tags/sre/index.html new file mode 100644 index 00000000000..3599a0a9841 --- /dev/null +++ b/quarterly/tags/sre/index.html @@ -0,0 +1,24 @@ + + + + + +2 posts tagged with "sre" | Cardano Development Updates + + + + + + + + + + + + +
    +

    2 posts tagged with "sre"

    View All Tags

    · One min read
    John Lotoski

    2023-04 - 2023-06

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Expanding the darwin CI cluster and adding aarch64 builder support
    • Adding bare metal capability to bitte clusters
    • Creating a devx-ci cluster containing a Hydra build server and Linux build farm which is intended to replace Cicero functionality
    • Creation of pool performance analysis queries and scripting
    • Migration of testnet metadata server to cardano-world
    • Cardano shelley qa migration to cardano-world
    • Cardano sanchonet environment spin up to test Conway era functionality
    • Mainnet relay conversion to p2p topology usage is progressing with 50% of mainnet relays now using p2p topology and networking feature

    Next steps

    • Continue with the conversion of mainnet to using p2p topology

    · One min read
    John Lotoski

    2023-07 - 2023-09

    Main achievements

    In addition to ongoing general maintenance and support of cardano environments, main SRE achievements for this quarter include:

    • Completion of mainnet relay networking conversion to p2p topology
    • Cardano sanchonet environment respins for testing new cardano-node pre-release Conway era functionality
    • Stabilization of cardano-explorer in cardano-world using high IOPS bare metal machines
    • Creation of a nix content addressed packages repository, capkgs:
      • To provide lightweight release binaries thereby avoiding sluggish nix flakes and devShells
    • Creation of a cardano performance benchmarking cluster, cardano-perf:
      • To replace legacy cluster benchmark tooling
    • Creation of a cardano cluster composition repository, cardano-parts:
      • For enabling multi-cluster, multi-role cardano network deployments
    • Creation of a cardano testnets repository, cardano-playground:
      • Utilizing cardano-parts for testnet deployments
    • Creation of a sanchonet demo repository, sanchonet-demo:
      • Utilizing cardano-parts for fast sanchonet test environment and demo purposes

    Next steps

    • Continue with migration of cardano-world testnets to cardano-playground
    • Proceed with spinup of mainnet p2p bootstrap cluster
    • Scale down mainnet non-p2p legacy cluster at the appropriate time
    + + + + \ No newline at end of file diff --git a/rss.xml b/rss.xml new file mode 100644 index 00000000000..bd8555903cb --- /dev/null +++ b/rss.xml @@ -0,0 +1,5003 @@ + + + + Cardano Updates Feed + https://input-output-hk.github.io/cardano-updates/ + Regular updates from Cardano Development Teams + Wed, 06 Dec 2023 00:00:00 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + en + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-12-06-ledger + 2023-12-06-ledger + Wed, 06 Dec 2023 00:00:00 GMT + + High level summary

    This period we reached a major milestone, namely we now have an initial version of Conway +conformance testing working. We are now able to generate random valid data with the help +of constraint based testing framework, apply that data to Conway Ledger rules and verify +that the output matches to the one produced by the executable version of the Formal Ledger +Specification, when it is applied to the same random data.

    We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get +Constitutional Committee query is complete and tested. Various improvements to the +testing tools. Addition of more test cases.

    Low level summary

    Conway

    • pull-3888 - Add checks for valid ProtVer when a proposal is a HardFork
    • pull-3902 - Fix pvCanFollow usage in Conway and improve clarity in Shelley
    • pull-3855 - Remove unreachable proposals
    • pull-3903 - Add lenient decoder for Addr
    • pull-3878 - Committee query - implement next epoch change

    Testing

    • pull-3893 - Move tree-diff dependency to tests together with all instances
    • pull-3896 - Fix Brute force failure
    • pull-3904 - New ListWhere Pred added to the Constrained Solver.
    • pull-3907 - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file
    • pull-3883 - Committee QuerySpec Imp Test
    • pull-3909 - Make impAnn a bit more useful, by making the logs scoped by impAnn
    • pull-3908 - Use upstream testing instances for very basic types
    • pull-3912 - Removed call to tail, and the 'watchPulser' test
    • pull-3852 - Added constrained generators to conformance tests - Part 1

    Improvements and releasing

    ]]>
    + ledger +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-12-06-mithril + 2023-12-06-mithril + Wed, 06 Dec 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking.

    Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io.

    Low level overview

    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Create a test network on Sanchonet #1173
    • Worked on the issue Upgrade breaking changes crates #1357
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Completed the issue Enhance aggregator REST API performances #1327
    • Completed the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Make mithril-client examples full crates #1385
    • Completed the issue Manual publication to crates.io with GitHub action #1380
    • Completed the issue Remove sqlite dependency from mithril-client crate #1390
    ]]>
    + mithril +
    + + <![CDATA[Performance & Tracing Update]]> + https://input-output-hk.github.io/cardano-updates/2023-12-04-performance-and-tracing + 2023-12-04-performance-and-tracing + Mon, 04 Dec 2023 00:00:00 GMT + + High level summary
    • Benchmarking: Release benchmarking for node 8.7.0. Also, we performed the first-ever Conway benchmarks.
    • Development: Conway capability of our workload generator has been implemented and merged to master.
    • Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data.
    • Tracing: Quality-of-life improvements to tracing output and addition of a test suite.
    • Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.

    Low level overview

    Benchmarking

    A full set of benchmarks for node 8.7.0 has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of 8.7.0 over 8.6.0, and can confirm no regressions have been introduced.

    Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version. +Only Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty.

    Development

    Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era. +Currently, we're looking into adding Conway-exclusive features, such as DRep registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining DRep sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying.

    Infrastructure

    As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've +improved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data.

    Tracing

    The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages. +Additionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system.

    Nomad backend

    We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases.

    ]]>
    + performance-tracing +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-12-01-hydra + 2023-12-01-hydra + Fri, 01 Dec 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team conducted a packed Monthly Review meeting, +featuring demonstrations and the preparation of the monthly report. They +addressed flakiness in tests and enhanced the logs json schema, +improving overall test reliability. Additionally, the team successfully +built MacOS ARM64 (aarch64-darwin) binaries in CI, expanding platform +support. They further improved the network configuration by detecting +incompatible persisted states, contributing to overall system +robustness. Finally, the team released version 0.14.0, highlighting +their commitment to delivering regular updates and improvements.

    What did the team achieve this week

    • Monthly Review +meeting +packed with demonstrations and prepared monthly report +#1189
    • Fixed several flaky tests and improved the logs json schema +#1188#1190#1192
    • Built MacOS ARM64 (aarch64-darwin) binaries in CI +#1182
    • Improved network configuration by detecting incompatible persisted +states #1174
    • Released version 0.14.0

    What are the goals of next week

    • Start work on incremental decommit
    • Continue shepherding contributed PRs to completion
    • Finish stateless-observation work
    • Open a head on a Conway network
    ]]>
    + hydra +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-29-consensus + 2023-11-29-consensus + Wed, 29 Nov 2023 00:00:00 GMT + + High level summary

    The Consensus team implemented and tested a patch that does not propagate future headers. +It is under review, and we expect it can be released in the next Cardano node version. +On the UTxO-HD front, we finished prototyping the LedgerDB and BackingStore redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend. +With this prototype finished we can start integrating the rest of the code. +We investigated the unexpected performance degradation observed when acquiring the block context. +We also released Cardano node 8.7.0 and moved tree-diff outside cardano-ledger libraries.

    ]]>
    + consensus +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-29-mithril + 2023-11-29-mithril + Wed, 29 Nov 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team released the initial version of the Mithril client library, enabling developers to integrate core Mithril features into their applications. They also released a new distribution, 2347.0, which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements.

    The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance.

    Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users.

    Low level overview

    • Release of the mithril-client library crate
    • Publication of a dev blog post about the released Mithril library
    • Released the new distribution 2347.0
    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Support P2P relay in infrastructure #1361
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue mithril-client verbosity not following usage menu #1325
    • Completed the issue Error message for mithril-client snapshot download #1375
    ]]>
    + mithril +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-24-hydra + 2023-11-24-hydra + Fri, 24 Nov 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team spent significant time opening a head among +themselves on mainnet using the release candidate, revealing and +addressing lurking bugs such as +#1174. Also +required was this change to dynamically calculate the min utxo value +#1176, a +necessary adjustment following the switch to inline datums. The team +engaged with cardano-cli / cardano-api maintainers to discuss recent +changes and collaborated on drafting feature ideas, including providing +Conway support +for the Hydra roadmap. As part of ongoing improvements, they +experimented with writing the specification in markdown instead of +LaTex.

    What did the team achieve this week

    • Opened head among us on mainnet and uncovered a few lurking bugs like +#1174 in the +release candidate
    • Calculate the min utxo value instead of hard-coding it +#1176, which is +needed since we switched to inline datums.
    • Met with the cardano-cli / cardano-api maintainers to discuss +recent changes and way forward
    • Drafted features ideas to provide Conway +support on the +Hydra roadmap
    • Experimented in writing the specification in markdown instead of LaTex

    What are the goals of next week

    • Have the Monthly review meeting with several demos
    • Release version 0.14.0 with this +scope
    • Complete tidying up chain layer via stateless observation changes in +hydra-node +#1096
    • Update dependencies to prepare for Conway +#1114
    ]]>
    + hydra +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-24-sre + 2023-11-24-sre + Fri, 24 Nov 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • The cardano-node nixos service now supports SIGHUP p2p topology reloading when the useSystemdReload option is enabled

    Lower level summary

    Capkgs

    • Update cardano-db-sync and offchain-metadata-tools package paths and/or references: capkgs-compare

    Cardano-node

    • Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: cardano-node-pull-5537
      • Creates a useSystemdReload bool option for the cardano-node nixos service
      • This will move the topology file(s) to /etc/cardano-node/topology-$i.yaml and inject systemd reload hooks for p2p configured cardano-node instances
      • Moving topology files to /etc also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired

    Cardano-parts

    • Adds a metadata server profile and a number of other features and improvements: cardano-parts-pull-20
      • Adds a new metadata-service profile
      • Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile
      • Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish
      • Adds extra node list producers and public producers for cardano-node-topology profile
      • Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch
      • Adds select systemd metrics reporting to grafana-agent profile
      • Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS
      • Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation
      • Adds support for grafana recording rules in the template files
      • Improves cardano-group profile handling of producers with respect to multiple instance nodes
      • Improves grafana-agent profile metrics handling for multi-instance cardano-node servers
      • Improves smash service preStart handling while waiting for a node socket
      • Updates Justfile for ERA_CMD demo support
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Defaults cardano-postgres profile psqlrc use to false

    Cardano-playground

    • Adds a new testnet metadata server, cluster webserver, and other improvements: cardano-playground-pull-6
      • Adds a new metadata server
      • Adds a new webserver for the cluster's static virtualhost needs
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds systemd metrics monitoring to the cluster
      • Resizes sanchonet machines to support the growing chain
      • Completes migration of preprod from world
      • Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes
      • Updates Justfile for ERA_CMD demo support
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Migrates book static code to playground from world, with refactor, cleanup and updates
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules

    Offchain-metadata-tools

    • Adds db password option with obfuscation plus misc improvements: offchain-metadata-tools-pull-61
      • Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services
      • Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile
      • Moves from std use in the nix flake to standard flake schema
      • Fixes hydra CI failures
      • Builds update-docs in hydra to avoid long local build times
      • Removes deprecated tullia
      • Removes deprecated check-hydra from pkgs
      • Removes deprecated bors files and references
    ]]>
    + sre +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-22-ledger + 2023-11-22-ledger + Wed, 22 Nov 2023 00:00:00 GMT + + High level summary

    Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of +CDDL specification. Important bugfixes include:

    • Fix deserialization of ValueNotConservedUTxO predicate failure that could not +previously report zero ADA.
    • Fix deserialization of CostModels in the PParamsUpdate. Invalid CostModels are no +longer allowed, only CostModels for unrecognized Plutus versions are allowed starting +with Conway
    • Fix returning of Deposits for ProposalProcedures

    Testing tooling has been improved and new tests have been implemented for Conway era.

    Low level summary

    Conway

    • pull-3858 - Restructure computing Refunds and Deposits in a TxBody across all eras
    • pull-3860 - Removed mock/crypto.cddl, added optional tag to sets
    • pull-3864 - Fix Proposal deposits and add deposit tests to imp tests
    • pull-3859 - Rename ProposalsSnapshot to Proposals
    • pull-3867 - MaryValue fixes
    • pull-3869 - Indicate that tag 258 is optional for OSet. Fix rational CDDL
    • pull-3863 - Improve deposits refunds re-usability
    • pull-3861 - Fail PParamsUpdate deserialization for invalid costmodels in Conway
    • pull-3875 - Fix cddl spec for CostModels in Conway
    • pull-3876 - Change 4 PParam fields from EpochNo to EpochInterval
    • pull-3884 - Relax requirement on the Set tag 258 to be enforced in the next era

    Testing

    • pull-3868 - Improvements to support property tests on Traces with simple Tx with DRep related Certs
    • pull-3792 - RATIFY and GOV constraint tests
    • pull-3885 - Added a test for genTxAndNewEpoch
    • pull-3886 - QuickCheck Imp integration

    Improvements and releasing

    ]]>
    + ledger +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-22-mithril + 2023-11-22-mithril + Wed, 22 Nov 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer.

    Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release.

    Low level overview

    • Completed the issue Prototype a P2P relay with libp2p #1326
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Worked on the issue Support P2P relay in infrastructure #1361
    • Completed the issue mithril-client fails to extract archive #1352
    ]]>
    + mithril +
    + + <![CDATA[Initial CIP 1694 Security Analysis and Responses]]> + https://input-output-hk.github.io/cardano-updates/2023-11-20-cip1694 + 2023-11-20-cip1694 + Mon, 20 Nov 2023 00:00:00 GMT + + High level summary

    We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

    Initial CIP-1694 Security Analysis and Responses

    Section: The constitutional committee


    • “For example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

    There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


    Section: Size of the constitutional committee


    • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

    Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


    Section: Terms


    • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

    Thanks. Yes, that suggestion is a bit easier to read.


    Section: Registered DReps


    • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

    Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


    Section: Ratification


    • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

    These correspond exactly to the groups that are administered by the Parameter Committee.


    • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

    Yes, it’s not about harming the system, since Info +actions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

    Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


    Section: Content


    • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

    Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


    Section: Protocol Parameter groups


    • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

    These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


    • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

    All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


    Section: Votes


    • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

    They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


    Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


    • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

    There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


    Section: Changes post Edinburgh workshop (July 2023)


    • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

    It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


    Section: Reduced deposits for some government actions


    • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

    Indeed. We have no plans for this at the moment.

    ]]>
    + ledger + cip1694 + security +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-17-hydra + 2023-11-17-hydra + Fri, 17 Nov 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team made several impactful updates. They addressed +misleading errors regarding collect com transactions, resolved a security +advisory (CVE-2023-42806), and simplified the Hydra Head protocol by using +inline datums. The team also tackled minor inconsistencies in specifications and +implementation, documented reasons for potentially dropped close transactions by +the cardano-node, and collaborated with SundaeLabs on an offline mode for +hydra-node. Additionally, they engaged in discussions with researchers about +incremental de-/commits.

    What did the team achieve this week

    • Removed misleading errors about collect com transactions #839
    • Addressed security advisory CVE-2023-42806 in PR #1161
    • Changed the head protocol to use inline datums, simplifying things in the hydra-node #1162
    • Addressed minor inconsistencies in spec and implementation #1104
    • Documented why close transacations might be dropped by the cardano-node (cant fix) #1039
    • Tidy up a few things here and there
    • Worked with SundaeLabs on the offline mode for hydra-node
    • Discussed incremental de-/commits with researchers

    What are the goals of next week

    • Start work on incremental decommits protocol specification #1057
    • Provide support to Hypix
    • Address all open bugs
    • Release version 0.14.0 with this scope
    • Update dependencies to prepare for Conway #1114
    • Shepherd off-line mode PR over the finish line
    • Complete tidying up chain layer via stateless observation changes in hydra-node #1096
    ]]>
    + hydra +
    + + <![CDATA[Performance & Tracing Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-17-performance-and-tracing + 2023-11-17-performance-and-tracing + Fri, 17 Nov 2023 00:00:00 GMT + + High level summary
    • Benchmarking: Release benchmarking for node 8.6.0 as well as benchmarks scrutinizing GHC versions and the new tracing system.
    • Development: PlutusV3 capability of our workload generator has been implemented.
    • Tracing: First round of optimization of the cardano-tracer service has completed, awaiting validation.
    • Nomad backend: A significant PR has landed addressing automation features and debugging capabilites.
    • Workbench: Configurable remote environments and improvements to run documentation have been merged to master.

    Low level overview

    Benchmarking

    We've performed and analyzed a full set of benchmarks for node 8.6.0, both in comparison to recent release tags +and mainnet version 8.1.2. A lot of development work has entered the system since then, so it is crucial +we can rule out any potential performance risks for the next mainnet release.

    Additionally, we've been benchmarking GHC9.6.3 builds of cardano-node. Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform.

    A last set of benchmarks was dedicated to the new tracing system with node 8.6.0. We were able to show that +there is no performance risk to enabling the new system, even when forwarding all trace messages to a cardano-tracer +service on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression.

    Development

    For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes +to the execution budgets by developing specialized workloads.

    Tracing

    The cardano-tracer service has received its first batch of optimizations. Profiling output is promising; to measure +performance for a long service run time, we're currently equipping the service binary with the same capability to +emit regular resource traces as cardano-node. Analysis of those will be the basis for validating this and possible future optimization efforts.

    Nomad backend

    Many improvements for the nomad backend have been implemented and merged to master. This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service, +more detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables +our team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred.

    Workbench

    Our performance workbench has seen upgrades in documenting and reporting cardano-node builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler. +When alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential.

    Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance.

    ]]>
    + performance-tracing +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-16-network + 2023-11-16-network + Thu, 16 Nov 2023 00:00:00 GMT + + High-level overview of sprint 48

    Bootstrap Peers

    We continued reviewing bootstrap peers, ouroboros-network#4555.

    IOClasses / IOSim

    We prepared slides for a Haskell meetup were we presented a talk on IOSimPOR. +The recording will be availble on YouTube.

    We also used the opportunity to do some refactoring of the IOSim code base: io-sim#117. +We released io-sim-1.3.0.0 on Hackage: io-sim#119.

    We also added forkFinally to MonadFork (not included in 1.3.0.0 release): io-sim#123.

    Tech debt

    We refactored Resource used by the DNS subsystem: ouroboros-network#4707. +We continued reviewing the ouroboros-network#4625 PR, which refactors +RootPeersDNS module.

    ]]>
    + network +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-15-consensus + 2023-11-15-consensus + Wed, 15 Nov 2023 00:00:00 GMT + + High level summary

    Over the last two weeks, we managed to run a UTxO-HD capable node in legacy mode, which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does). +This legacy mode could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not. +However, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter. +On the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node. +Therefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend.

    On the Genesis front, we reviewed the peer simulator for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team.

    We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos.

    Javier Sagredo continues his cycle as release engineer, and he is working on version 8.7 of Cardano node.

    ]]>
    + consensus +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-15-mithril + 2023-11-15-mithril + Wed, 15 Nov 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Completed the issue Light Wallet: Release mithril-client library #1311
    • Completed the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Completed the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Fix certificate hashes re-computation in aggregator #1343
    • Completed the issue Remove unstable tag in unstable release #1235
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    ]]>
    + mithril +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-14-node-cli-api + 2023-11-14-node-cli-api + Tue, 14 Nov 2023 00:00:00 GMT + + 2023-11-01 - 2023-11-14

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Improve golden tests
    • Clean-up of conway era commands

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-10-hydra + 2023-11-10-hydra + Fri, 10 Nov 2023 00:00:00 GMT + + High-level summary

    The last two weeks, the Hydra team achieved several milestones. They published +the monthly report for October, providing updates on project developments. The +team delivered a presentation and workshop at the Cardano Summit, contributing +to community engagement. They implemented a \"dirt road\" solution for the +\"Ignored init tx\" notification and moved the hydra-poll example project to a +dedicated repository. Additionally, the team built a hydra-chain-observer tool +for Hydra Heads, updated the toolchain to GHC 9.6.3, and made various +improvements to tooling and code formatting. They addressed specific issues, +such as fixing the gen-hydra-keys command and resolving concerns with the +rewritten hydra-tui. The team also enhanced the hydra-cluster smoke test +suite by fetching network configurations dynamically. Lastly, they actively +reviewed pull requests and architectural decision records from the community, +including contributions from SundaeSwap. An experiment, the Hydra tally, was +completed and successfully deployed to the mainnet by the Cardano Foundation.

    What did the team achieve this week

    • Published the monthly report for +october
    • Given a presentation / workshop at the Cardano summit +#1109
    • Dirt road implementation for \"Ignored init tx\" notification +#529 (without +stateless observation)
    • Completed and moved hydra-poll example project into a +dedicated +repository
    • Built a first version of a chain observation tool for Hydra Heads +#1096
    • Switched toolchain to GHC 9.6.3 and various improvements on tooling +and code formatting +#1135#1152#1151#1154
    • Fix gen-hydra-keys command to not overwrite existing +keys #1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Fetch network configurations instead of packaging them into +hydra-cluster (smoke) test suite +#1156
    • Reviewing PRs and ADRs from the community (SundaeSwap) +#1118#1157
    • Hydra tally experiment (Cardano Foundation) deployed to mainnet

    What are the goals of next week

    • Tackle reported bugs
    • Shepherd contributed off-line mode PR to the main codeline
    • Improve chain observation tool to include more data and refactor +existing code towards more stateless observation
    • Start work on incremental decommits
    ]]>
    + hydra +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-10-sre + 2023-11-10-sre + Fri, 10 Nov 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the cardano-playground stack

    Lower level summary

    Capkgs

    Cardano-parts

    • General migration support PR for cardano-world to cardano-playground cardano-parts-pull-18
      • Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground
      • Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes
      • Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains
      • The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state
      • The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable
      • Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0
      • For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true
      • Template updates include:
        • Adds optional TF AZ declaration on ec2 resources
        • Adds a cardano node p2p dashboard to the grafana cloud stack
        • Adds a dbsync pool performance analysis query
        • Updates python distribute and delegation scripts from world for playground compatibility
        • Starts a python script lib to reduce shared code among the python scripts
        • Several justfile improvements and new recipes
      • More detail is available in the PR description
    • Update submit action script for 8.6 cardano-parts-pull-19
    • Update scripts for 8.6.0-pre cardano-parts-pull-21
      • Fixes subcommand names based on ERA_CMD
      • Adds deposits to some commands
      • Separates CC cold/hot key generation as host authorization has to occur after action is approved
      • CC voting enabled in vote job

    Cardano-playground

    • Migration PR to largely complete the network migration from cardano-world to cardano-playground: cardano-playground-pull-5
      • Adds re-spun private chain network
      • Migrates shelley-qa chain network from world
      • Justfile improvements and new recipes
      • Improve concurrent environment chain support
      • More detail is available in the PR description

    Iohk-nix

    • Migration to play: iohk-nix-pull-561
      • Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org
      • Remove deprecated cardano-lib p2p network environment
      • Update sanchonet chain with respin changes
      • Update private chain with respin changes
      • Bump private and shelley-qa chains to sanchonet equivalent conway genesis
      • Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing

    Sanchonet-demo

    ]]>
    + sre +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-09-db-sync + 2023-11-09-db-sync + Thu, 09 Nov 2023 00:00:00 GMT + + High level summary

    We have created new tag sancho-2-2-0, which integrates missing Conway feautures and some minor fix +tags sancho-2-1-0, sancho-2-0-1. +We have completed the initial implementation for the bootstrap instance objective.

    Lower level summary

    • Add a new --disable-gov flag which disabled Conway ferautures +#1558
    • Fix of the committee key size +#1544
    • Workaround a ledger issue with unregistered pools +#1542
    • Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs +#1539
    • Rename offline to offchain +#1533
    • Transfer existing tests to Conway era +#1529#1547
    ]]>
    + db-sync +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-08-ledger + 2023-11-08-ledger + Wed, 08 Nov 2023 00:00:00 GMT + + High level summary

    This update contains mostly improvements to quality of Conway era implementation and +tooling that we use for testing Ledger. Major Conway bugs that were discovered and +squashed are:

    • PParamsUpdate proposals will now correctly use DRep thresholds for ratification
    • Treasury withdrawals are now properly enacted.
    • Corrected snapshotting and DRep Stake Distribution Pulser initialization
    • Delegation to non-existent Stake pool is no longer possible

    Other important quality of life improvements are addition of reusable interfaces for an +ordered set OSet and ordered map OMap. Which allowed us to disable duplicate +certificates and proposals in a transaction. As a precursor to PlutusV3 integration, a +serious reorganization of Plutus related functionality was performed.

    Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on +expired proposals, addition of Anchor to Constitutional Committee resignation proposals.

    Significant improvements have been made to a specialized "Imp" test library that allows us +writing concise stateful unit tests for verifying the Ledger logic. Serious progress has +been made on the conformance testing, where we can now interface with Haskell generated +code from the Agda specification. Serialization testing has been extended to increase +binary conformance coverage.

    Low level summary

    Conway

    • pull-3808 - Enhance CommitteeMembersState query to return quorum and NoConfidence
    • pull-3801 - Fix epoch rule and tests
    • pull-3803 - Fix delegation validation
    • pull-3759 - Reshuffle things to the DRepPulser incorporates some snap shot things
    • pull-3779 - Prevent duplicate certs and proposals
    • pull-3794 - Added anchor to resign certs
    • pull-3797 - Cleanup JSON instances for Conway governance
    • pull-3848 - Plutus modules restructure
    • pull-3840 - Fix anomalies in Deposits in the Conway Era
    • pull-3856 - Add governance related ledger events
    • pull-3825 - Prevent voting on expired GovActions
    • pull-3831 - Treasury withdrawal fix
    • pull-3791 - Use a Data.OMap.Strict to replace ProposalsSnapshot
    • pull-3836 - PParamsUpdate enactment fix
    • pull-3846 - Revert argument order swap.

    Testing

    • pull-3782 - Move ImpTest to Shelley testlib
    • pull-3842 - Imp improvements
    • pull-3844 - Add mappings to Agda types
    • pull-3853 - Fix strange assertion failure, which hides real Block too big problem.
    • pull-3809 - CDDL roundtrip testing
    • pull-3832 - Treasury withdrawals tests
    • pull-3839 - Added cardano-ledger-conformance
    • pull-3841 - Add sha256 to cardano-ledger-executable-spec

    Improvements and releasing

    • pull-3843 - Add ...WithLogs versions of evalScripts and friends
    • pull-3795 - Bump plutus to 1.15
    • pull-3798 - Bump urllib3 from 1.26.17 to 1.26.18 in /doc
    • pull-3799 - Changes needed for 8.6 release
    • pull-3807 - Add invalidBeforeL and invalidHereAfterL functions
    • pull-3819 - Fixups needed for a release
    • pull-3829 - Post release CHANGELOG version bumps
    • pull-3830 - Bump aeson to 2.2
    • pull-3833 - Backport release cardano-ledger-conway-1.10.1.0
    • pull-3828 - Add changelog for node release 8.6
    ]]>
    + ledger +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-08-mithril + 2023-11-08-mithril + Wed, 08 Nov 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client Docker package is incorrect #1322
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-01-consensus + 2023-11-01-consensus + Wed, 01 Nov 2023 00:00:00 GMT + + High level summary

    This week the Consensus team made progress on two fronts: the question of survivable eclipse duration, which is part of our work supporting Genesis delivery, and how to improve the handling of blocks from the future. +Regarding the UTxO-HD branch, we managed to run a node with legacy blocks, which is syncing with mainnet, up to including Alonzo. +We also investigated a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release.

    ]]>
    + consensus +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-11-01-mithril + 2023-11-01-mithril + Wed, 01 Nov 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the release-mainnet aggregator.

    Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Fix devnet Mithril Docker images [#1272](https://github.com/input-output-hk/mithril/issues/1272
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client regressions in snapshot list and download #1321
    ]]>
    + mithril +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-27-hydra + 2023-10-27-hydra + Fri, 27 Oct 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team fixed the gen-hydra-keys command to avoid +overwriting existing keys, and resolved issues related to the rewritten +hydra-tui. They also worked on a \"dirt road\" implementation for the +\"Ignored init tx\" notification, improving the robustness of the system.

    The team finalized preparations for the Cardano Summit presentation, including +implementation of the hydra-poll example DApp.

    If you happen to read this and attend the Summit in Dubai, make sure to check +out our Masterclass about \"Developing Hydra + Mithril for Scaling Cardano\" on +Friday, November 3 at 14:00-15:30 local time in the \"Al Dar\" room!

    What did the team achieve this week

    • Fix gen-hydra-keys command to not overwrite existing keys +#1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Finalized cardano summit preparation +#1109
    • Implemented the hydra-poll example DApp link to +repository
    • Dirt road implementation for \"Ignored init tx\" notification +#529

    What are the goals of next week

    • Attend cardano summit and deliver presentation
    • Clarify / close user created issues
    • Build aarch64-darwin binaries in CI
    ]]>
    + hydra +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-27-network + 2023-10-27-network + Fri, 27 Oct 2023 00:00:00 GMT + + High-level overview of sprint 47

    Bootstrap Peers

    We continued to review the process of bootstrap peers, see ouroboros-network#4555

    CI / Tests

    We investigated our CI issues. We found a memory leak in typed-protocols +function used for testing codecs which triggered out of memory manager (OOM) on +some platforms (typed-protocols#43); we also found a bug in the connection manager which resulted in CI +timeouts (see connection-manager-fix).

    KeepAlive client

    We found two small issues with the keep-alive client, which were addressed +by Karl Knutsson (Cardano Foundation), ouroboros-network#4689.

    Galois

    We merged two large PRs prepared by Galois:

    Cardano Network Service Assurance (CNSA)

    Galois made the following progress on CNSA:

    • a simple [InfuxDB] database backend has been added;
    • the documentation has been updated;
    • internal improvements to the code;
    • progress on a new "CSNA analysis" that provides, for each sampler node, the +block download throughput in bytes over time.

    New CHaP Release

    We cut a new release of ouroboros-netowrk packages to CHaP: chap#547

    More details

    CI / Tests

    We improved the memory footprint of some of our tests by analysing a stream of +IOSim traces without retaining them, see ouroboros-network#4696

    As a safety measure, we introduced an upper bound for heap memory used by test +artefacts in our nix tests. We use 200MB limit for all tests except for +network-mux tests which use 350MB limit, see ouroboros-network#4702.

    We refactored one of our tests to use ephemeral ports thus allowing it to +run concurrently, see ouroboros-network#4702.

    We merged ouroboros-network#4623 which fixes a bunch of test failures.

    All of them were due to a bug in test logic rather than a bug in production +code.

    Release Process

    We updated our release process & associated scripts, see +ouroboros-network#4705.

    ]]>
    + network +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-27-sre + 2023-10-27-sre + Fri, 27 Oct 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the cardano-playground stack

    Lower level summary

    Capkgs

    • Adds offchain-metadata-tools, dbsync sanchonet updates: capkgs-compare

    Cardano-parts

    • General package updates, modules improvements and template recipes to support network migration from world to playground cardano-parts-pull-17
      • Bumps cardano-db-sync-ng to sancho-2-0-0 tag
      • Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play
      • Adds more machine system bins and devShell bins for scripting and debug purposes
      • Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module
      • Adds profile-cardano-node-topology module for a simplified interface to most common topology needs
      • Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs
      • Adds a topology function to filter self from group machines with an allowList for matching infixes
      • Adds metadata-server and related offchain-metadata-tools bins from capkgs
      • Updates justfile template with:
        • a new query-all recipe for getting status of multiple concurrent running environments
        • a new set-default-cardano-env recipe for fast switching between environments
        • a new start-demo recipe for forking a custom env into conway
        • a new start-node recipe for generic environment start
        • a new stop-node recipe for generic environment stop
        • updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions
        • updated query-tip recipe to a generic query tip compatible with each environment

    Cardano-playground

    ]]>
    + sre +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-25-mithril + 2023-10-25-mithril + Wed, 25 Oct 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team released a new distribution 2342.0. This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes.

    They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files.

    Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the release-mainnet aggregator, and enhanced the Mithril explorer UI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Completed the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Worked on the issue Fix devnet Mithril Docker images #1272
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Worked on the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Display a summary of signers before the full list in explorer #1133
    • Completed the issue Add certificates list in explorer #1184
    • Completed the issue CoreVerifier setup does not compute total_stake correctly #1306
    ]]>
    + mithril +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-24-node-cli-api + 2023-10-24-node-cli-api + Tue, 24 Oct 2023 00:00:00 GMT + + 2023-10-11 - 2023-10-24

    High level summary

    CARDANO-CLI

    • Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified.
    • stake-address-info now shows deposits balance.
    • Added conway governance action view to allow to inspect governance action files before submitting them on a transaction.
    • build-raw support for --vote-file and --proposal-file

    CARDANO-API

    • Support DRep extended keys
    • Support Plutus V1 in Conway

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-20-hydra + 2023-10-20-hydra + Fri, 20 Oct 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023.

    In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON. +This improvement offers users greater flexibility and ease of interaction with the API.

    Finally, the team has followed up on the TUI brick upgrade to version 1.10. +This effort has resulted in addressing minor details and enhancing the overall user experience with the TUI.

    What did the team achieve this week

    • Prepare presentation and workshop for Cardano Summit.
    • More TUI fixes and improvements.
    • Upgrade GHC from 9.2.8 -> 9.6.2 #1105
    • Solved user issue related to submitting transactions in cbor format #1111.
    • Fix hydraw connection issue making it more stable #1121.

    What are the goals of next week

    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.
    ]]>
    + hydra +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-18-consensus + 2023-10-18-consensus + Wed, 18 Oct 2023 00:00:00 GMT + + High level summary

    During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node.

    UTxO-HD

    • The Plutus workload benchmark for the in-memory backend showed no regressions for the metrics of interest, but it does show an increase in resource usage.
    • We got additional ad-hoc measurements on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB.
    • We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.

    Genesis

    • We produced the first draft for a Survivable Eclipse Duration Model (422).

    Support

    • Esgen finished his cycle as release engineer. Node 8.5.0 has been released.
    • We resumed work on the subpar handling of block from the future (4251).
    • We prepared the integration of new tracing events for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned issue).
    ]]>
    + consensus +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-18-mithril + 2023-10-18-mithril + Wed, 18 Oct 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay.

    Finally, they enhanced the CI/CD to publish multiple packages to crates.io and started improving the developer experience with the Mithril devnet.

    Low level overview

    • Published the security advisory Mithril relay could expose Cardano block producer internal IP when updated #GHSA-9m3h-72xj-x2gq
    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Publish multiple packages to crates.io #1298
    • Completed the issue Rename public key published in releases #1292
    • Completed the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Fix devnet Mithril Docker images #1272
    ]]>
    + mithril +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-15-network + 2023-10-15-network + Sun, 15 Oct 2023 00:00:00 GMT + + High-level overview of sprint 46

    Bootstrap Peers

    We continued reviewing of bootstrap peers, see ouroboros-network#4555.

    Towards Typed Protocols 0.2.0.0

    We diagnosed the performance regression of the new design. The work on +typed-protocols will be postponed. For more details see the +typed-protocols#3. As an outcome of the performance debugging we prepared +PR which updates the demo-ping-pong and +demo-chain-sync applications.

    Peer Sharing

    We made progress in review of ouroboros-network#4644, which simplifies the +peer sharing and fixes the ouroboros-network#4642 issue.

    Tech Debt

    We reviewed the ouroboros-network#3836 PR which inspects all the uses of +error in ouroboros-network. The PR was prepared by Galois.

    ]]>
    + network +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-13-hydra + 2023-10-13-hydra + Fri, 13 Oct 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity.

    They also completed the exploration of potentially moving the Plutus validator scripts to Aiken.

    Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project.

    What did the team achieve this week

    • Network Resilience Persistence (#1101)[https://github.com/input-output-hk/hydra/pull/1101].
    • Upgrade brick on TUI (#1103)[https://github.com/input-output-hk/hydra/pull/1103].
    • Aiken commit validator translation (#1072)[https://github.com/input-output-hk/hydra/pull/1072].
    • Fixed some bugs in our TUI client.

    What are the goals of next week

    • Prepare presentation and workshop for Cardano Summit.
    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-13-ledger + 2023-10-13-ledger + Fri, 13 Oct 2023 00:00:00 GMT + + High level summary

    The Ledger team has been shifting focus from implementing Conway related features to +testing. For this reason there is a very little amount features that are reported this +time aorund. Notable Conway related changes are a specialized ledger query for getting +Constitutional Committee state and prevention of submitting proposal procedures that have +no valid path to enactment.

    Testing related work was mainly on a constraint base system as well as on roundtrip +serialization. As a result of this extra testing a bug in Conway Genesis serialization +was eliminated.

    Low level summary

    Conway era

    Integration and releasing

    Testing

    • pull-3769 - Add roundtrip testing by validating FlatTerm
    • pull-3783 - Update TranslationInstance.hs
    • pull-3775 - Refactor and improve constraint based STS tests
    • pull-3793 - Fix sums with negative RHS.
    ]]>
    + ledger +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-13-sre + 2023-10-13-sre + Fri, 13 Oct 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was updated to 8.5.0-pre.
    • Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring

    Lower level summary

    Capkgs

    • Various improvements and fixes including:
      • Add GHA cron schedule
      • Add nix auto-gc to avoid running out of storage during large package set builds
      • Add new packages to capkgs
      • Reduce runner storage requirement leaving more room for builds
      • Restructure capkgs attribute names to avoid package name collisions
      • Return to non-musl builds for cardano packages to retain journald compatability
      • Update cache usage to from file level to folder level to reduce network and latency overhead
      • Commit diff: capkgs-compare

    Cardano-parts

    • Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: cardano-parts-pull-16
    • Dbsync, smash, faucet and more: cardano-parts-pull-15
      • Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes
      • Adds nginx vhost metrics exporter profile
      • Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down
      • Adds bash *-ng autocompletion compatible wrappers
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds downstream grafana cloud dashboard as templates
      • Adds downstream grafana cloud alerts as templates
      • Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish
      • Updates the basic profile with IOG cache and commonly used bins
      • Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks
      • Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration
      • Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion
      • Updates the colmena template with dbsync, smash, faucet machines profiles and roles
      • Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns
      • Bumps capkgs node-ng to 8.5.0-pre

    Cardano-playground

    • Dbsync, smash, faucet and more: cardano-playground-pull-3
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts
      • Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change
      • Optimizes machine sizes
      • Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion
      • Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration

    Cardano-world

    Sanchonet-demo

    • Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: sanchonet-demo-commit
    ]]>
    + sre +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-11-mithril + 2023-10-11-mithril + Wed, 11 Oct 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on crates.io, the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures.

    Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI.

    Low level overview

    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Update Rust compiler in nix CI #1282
    • Worked on the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    ]]>
    + mithril +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-10-node-cli-api + 2023-10-10-node-cli-api + Tue, 10 Oct 2023 00:00:00 GMT + + 2023-09-27 - 2023-10-10

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Depracated governance query commands and moved all governance related queries to cardano-cli <era> query
    • Drep registration certificates now allow to include an anchor
    • Integrated Drep retirement ceriticates
    • clean up of Drep registration certificates.

    CARDANO-API

    • Add support for committee hot key witnesses
    • Require conway onwards for voting
    • Conway drep registration: expose ledger anchor parameter
    • Add certs to txbody of Conway transactions

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-06-hydra + 2023-10-06-hydra + Fri, 06 Oct 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums.

    The team also delivered the first version of the network resilience layer, significantly increasing head availability.

    Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra.

    Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra.

    What did the team achieve this week

    • Release 0.13.0
    • Published vulnerability reports #1088
    • Merged network resilience work part I #1074
    • Planning for Cardano Summit participation
    • Discussions with funded Catalyst projects wanting to build on Hydra for support
    • Merged typos fix PR from @omahs #1095

    What are the goals of next week

    • Complete Aiken commit validator script #1072
    • Complete Kupo integration #1078
    • Brick upgrade on TUI #1103
    • Clean backlog
    • Prepare and rehearse demo and talk for Cardano Summit
    ]]>
    + hydra +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-06-performance-and-tracing + 2023-10-06-performance-and-tracing + Fri, 06 Oct 2023 00:00:00 GMT + + High level summary
    • Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system.
    • Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7.
    • Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store.
    • Tracing: The machine-readable tracer configuration has been merged. Optimization of cardano-tracer started.
    • Nomad backend: Ongoing variance analysis and refined cluster topology.

    Low level overview

    Benchmarking

    Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the +performance of the in-memory backing store and evaluate possible optimizations (or regressions) for it.

    Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results +show all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the cardano-tracer service.

    Consensus QTAs

    The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The +feedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype.

    Development

    Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort.

    PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time, +we'd like to validate the many improvements that have gone into the Plutus evaluator.

    Tracing

    The focus for further optimization of the new tracing system has shifted to cardano-tracer - the service +receiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in cardano-node is +more performance critical, the receiving service must still minimize its resource footprint. Moreover, it can +generate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations.

    Nomad backend

    Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated +the same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery.

    ]]>
    + performance-tracing +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-04-consensus + 2023-10-04-consensus + Wed, 04 Oct 2023 00:00:00 GMT + + High level summary

    The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the in-memory backend.

    On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain. +We also merged a fix for the Babbage to Conway transition, and released a new version of Consensus.

    Genesis

    • We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (392).

    Support

    • We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (366).
    • We enabled richer tracers in cardano-node that can be useful in future debugging (384).
    • Esgen continues with his release engineer activities, and created a new Consensus release.

    Fostering collaboration

    • We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (369).
    ]]>
    + consensus +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-04-mithril + 2023-10-04-mithril + Wed, 04 Oct 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion on implementing Mithril in a light wallet to receive feedback and contributions from the community.

    They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks.

    Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs.

    Low level overview

    • Created the discussion Implement Mithril in a light wallet #1273
    • Completed the issue Run client in browser WASM PoC #1254
    • Completed the issue Benchmark aggregator performances #1220
    • Worked on the issue Add SPO tickers in explorer #1185
    • Completed the issue Add a non 404 status code on the aggregator endpoint #1103
    • Completed the issue Use source attribute in errors #1265
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Completed the issue Configure status page and alerting #1277
    • Completed the issue Upgrade dependencies #1274
    ]]>
    + mithril +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-10-02-network + 2023-10-02-network + Mon, 02 Oct 2023 00:00:00 GMT + + High-level overview of sprint 45

    Bootstrap Peers

    We started reviewing the bootstrap peers PR, ouroboros-network#4615.

    Towards Typed Protocols 0.2.0.0

    We discovered a performance regression when using typed-protocols-0.2.0.0, and we +started investigating where it comes from. Currently, we see that +typed-protocols-0.2.0.0 can outperform typed-protocols-0.1.0.0 when running +in isolation with a simple ping-pong protocol, so the regression might be in +the new block fetch implementation which comes with typed-protocols-0.2.0.0 +See typed-protocols#3.

    Tech Debt

    We merged two PRs written by Galois engineers:

    • a pull request which refactors the main entry function for P2P, see ouroboros-network#3834;
    • a pull request which reviews usage of unsafe function in the network code based.

    Galois also made progress with the following two issues:

    IO-Sim

    IOSimPOR

    We found and fixed a bug in IOSimPOR. We'd like to thank Prof. John Hughes +(Quviq AB) for helping us with debugging the issue.

    We also provided a more uniform API for IOSimPOR, and added ways to make the +debugging similar problems in the future easier.

    Technical Details on IOSim refactoring
    We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future.

    IOSim

    To prepare for the next release, we consolidate packages taking advantage of +the public sublibraries supported now both by cabal and Hackage. This is +a work in progress, io-sim#114.

    Cardano Newtork Service Assurance

    Galois made the following progress:

    • A test run of spinning up a CNSA instance was done, as a result documentation +was updated.
    • Based on the IOG code review of the CNSA code, updates to the CNSA code were +made.
    • Galois has started the design for adding a CNSA analysis for "fetched bytes +over time while node is syncing".

    P2P adoption

    In the last two weeks, we've seen increase in P2P adoption. +P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays. +node versions

    Open Source

    We upstreamed our FFI bindings to Windows named pipes to Win32 package, the +PR was accepted and merged.

    We also received an external contribution which enhanced our documentation, see +ouroboros-network#4676.

    ]]>
    + network +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-29-goedel + 2023-09-29-goedel + Fri, 29 Sep 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and testing the +performance analysis tool

    Details

    • drafting processs calculus semantics of mini protocol programs

    • testing the new performance modelling tool

    • further work on specification of mini protocols

    • extension of mini protocol framework to support communication of +programs with local environments via synchronous channels

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-29-hydra + 2023-09-29-hydra + Fri, 29 Sep 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team mainly focused on having a working new reliability +network layer; and specified its expected behavior in a new ADR.

    They also revisited the security policy and vulnerability disclosure policy on +how to handle security vulnerability within Hydra, and in particular how to +handle so-called "Silent fixes".

    What did the team achieve this week

    • Updated security policy and vulnerability disclosure policy #1088
    • Adr/network reliability #1082

    What are the goals of next week

    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-29-ledger + 2023-09-29-ledger + Fri, 29 Sep 2023 00:00:00 GMT + + High level summary

    Few important Conway related features were completed in this two week period:

    • Constitutional Committee was the last missing Conway related entity that has now been +fully implemented.
    • Treasury withdrawals governance actions have been fixed and now behave as expected.
    • Current treasury amount supplied in the transaction is now enforced by the rules.
    • DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no +proposals to vote on.
    • Semantics of how CostModels are updated with Protocol Parameters have been changed to +allow for individual Plutus language version updates, rather than requiring a complete +replacement of all CostModels

    Besides the new features there were also important performance and testing improvements:

    • In particular stake distribution computation and native script handling received some +optimizations.
    • New testing DSL has been implemented that drastically simplifies writing unit tests for +ledger rules.
    • Integration tests and benchmarks are now possible for Conway era because of the overhaul +of functionality for initial funds and staking injection whenever node starts up in +Conway, while bypassing all previous eras.

    Low level summary

    Conway era

    • pull-3729 - DRep expiry update after a contiguous set of epochs with no proposals to vote on
    • pull-3739 - Rename some PParams to be consistent with Agda specification
    • pull-3743 - Move DRepDistr from VState to ConwayGovState
    • pull-3746 - Implement tcTranslationContextL for Shelley
    • pull-3737 - Implement EraTransition
    • pull-3749 - Add predicate failure: current treasury value mismatch in LEDGER
    • pull-3748 - Apply enacted treasury withdrawals
    • pull-3745 - Constitutional Committee Ratification
    • pull-3763 - Plutus interface improvements
    • pull-3771 - Changed how costmodel updates are applied
    • pull-3766 - Prevent updating protocol version with PParamUpdate

    Performance

    • pull-3765 - Improve native script handling
    • pull-3747 - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin
    • pull-3758 - Cardano-Perf regression: UMap.size regression fix
    • pull-3754 - Use Alonzo-style TxOut encoder when possible

    Releasing

    • pull-3742 - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes
    • pull-3744 - Changelog 8.4
    • pull-3752 - Patch release of cardano ledger conway 1.8.1.0
    • pull-3753 - Minor cleanup and changelog entries
    • pull-3760 - Fixup issues for release
    • pull-3764 - Bump plutus deps to 1.13

    Testing

    • pull-3734 - Removed Shaped instance for Rep
    • pull-3735 - Simplify the implementations of hasOrd and hasEq
    • pull-3728 - STS tests based on constraints
    • pull-3714 - Implement the remaining upgradable families
    • pull-3733 - Add some unit tests for Conway features
    • pull-3762 - Update CDDL for praos headers.
    ]]>
    + ledger +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-29-sre + 2023-09-29-sre + Fri, 29 Sep 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node 8.4.0-pre.
    • The use of cardano-node docker hub will be deprecated in preference of GHCR

    Lower level summary

    Capkgs

    • Refactor parsing scripts, add github action automation, various bugfixes and cleanup: capkgs-compare

    Cardano-parts

    • Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: cardano-parts-pull-8

    Cardano-playground

    • Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: cardano-playground

    Cardano-world

    ]]>
    + sre +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-27-mithril + 2023-09-27-mithril + Wed, 27 Sep 2023 00:00:00 GMT + + High level overview

    The Mithril team has released a new distribution 2337.0, which includes the following enhancements: support for zstandard compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator.

    They also completed the refactoring and standardization of the errors in the Mithril nodes and published an Architectural decision record on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure.

    Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs.

    Low level overview

    • Completed the issue Release new 2337 distribution #1219
    • Completed the issue Errors refactoring #798
    • Completed the issue Client traffic creates performance bottleneck in aggregator #1207
    • Completed the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Worked on the issue Spike: Run client in browser WASM PoC #1254
    • Worked on the issue Benchmark aggregator performances #1220
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    ]]>
    + mithril +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-26-node-cli-api + 2023-09-26-node-cli-api + Tue, 26 Sep 2023 00:00:00 GMT + + 2023-09-13 - 2023-09-26

    High level summary

    • cardano-node 8.4.0-pre release suitable for SanchoNet.
    • CLI continues making progress integrating governance features. During this sprint we integrated the info and new-committee governance actions.
    • The team continued moving to the ERA top-level commands structure. Removed --conway-era flag from the legacy commands making conway era commands only accessible via cardano-cli conway.
    • stake-pool command is now under the ERA top level structure.
    • API continues integration with governance features, it is worth to higlight that now ProposeNewCommitee uses the right key type (cc-cold)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-22-hydra + 2023-09-22-hydra + Fri, 22 Sep 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team conducted the monthly review meeting in +collaboration with Mithril, enhancing project coordination.

    The team improved the gen-hydra-key node command for smoother usability +and identified concrete steps to enhance network resiliency in feature +items #188, +#1080, and +#1079. +Additionally, they contributed the aiken-mode editor integration to the +aiken-lang organization, updated dependencies to utilize cardano-api +8.20, and published the Hydra security advisory CVE-2023-42806 with a +workaround available for users.

    These efforts demonstrate the team\'s commitment to project improvement, +security, and open-source community collaboration.

    What did the team achieve this week

    • Conducted the monthly review meeting together with Mithril
    • Improved gen-hydra-key node command +#1077
    • Established a clear plan to improve resiliency of network and manifested +feature items #188, +#1080 and +#1079
    • Moved aiken-mode (created by SN) +to aiken-lang organization
    • Updated dependencies to using cardano-api 8.20 +#1075
    • Published security advisory +CVE-2023-42806 +(workaround available)

    What are the goals of next week

    • Write-up the monthly report for September
    • Finish "network resilience to disconnects" +#188
    • Finish kupo integration with hydra +#1078
    • Discuss and decide on using aiken or not
    • Address the published security advisory +CVE-2023-42806 +(to not require workaround)
    • Ideally, release 0.13.0
    ]]>
    + hydra +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-22-performance-and-tracing + 2023-09-22-performance-and-tracing + Fri, 22 Sep 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters.
    • Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time.
    • Tracing: Work on machine-readable tracing of tracer configuration is ongoing.
    • Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster.
    • Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Blöndal!

    Low level overview

    Benchmarking

    As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking +backend with means to measure and document network latency for each run. Furthermore we've implemented means to +capture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences +in the behaviour of the underlying networking stack at OS level.

    Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided +to compare standard deviations instead to validate the measurements from nomad.

    Infrastructure

    Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline +have been merged to master. They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis.

    Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for trace-dispatcher and tx-generator we were able to address those issues.

    Tracing

    After various steps in constructing a configuration upon node startup, it is vital to document +which runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML +trace message for that purpose.

    This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node.

    Nomad backend

    As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it +produces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an +impact on our measurements, as we'd be basically using two different instruments to take them.

    Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service +or the slightly different system architecture of the new cluster.

    New team member

    Baldur Blöndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team. +So I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on cardano-tracer, the component receiving, processing and making available node traces and metrics.

    ]]>
    + performance-tracing +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-20-consensus + 2023-09-20-consensus + Wed, 20 Sep 2023 00:00:00 GMT + + High level summary

    We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks. +We are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough. +On the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain. +We also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway.

    UTxO-HD

    • We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (349). System level benchmark results are pending.
    • Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (344), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run.
    • We also brought the UTxO-HD branch up to date with node version 8.4.0.

    Genesis

    • We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain. +We are now drafting the final self-contained argument. (4157)

    Support

    • We debugged a bad parameter update on the Babbage to Conway transition in the SanchoNet testnet (339). +A superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (340, 354, and 355) +However we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ConsensusProtocol type class and the HardForkBlock combinator (345 and 346). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.
    ]]>
    + consensus +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-20-mithril + 2023-09-20-mithril + Wed, 20 Sep 2023 00:00:00 GMT + + High level overview

    This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports.

    Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution.

    Low level overview

    • Completed the issue Add snapshot compression parameters in infrastructure deployments #1200
    • Completed the issue Add Cloudflare protection of infrastructure #986
    • Worked on the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Worked on the issue Error refactoring #798
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    • Worked on the issue Release new 2337 distribution #1219
    • Completed the issue Upgrade dependencies #1238
    ]]>
    + mithril +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-15-goedel + 2023-09-15-goedel + Fri, 15 Sep 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • working on collating and open sourcing performance analysis prototype

    • improvements to Ouroboros Praos specification in Isabelle

    • working on formalising chain sync mini-protocol

    • reviewing an alternatice semantics for DeltaQ

    • Seminar talk at U. Bergen on algebraic properties of timeliness

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-15-hydra + 2023-09-15-hydra + Fri, 15 Sep 2023 00:00:00 GMT + + High-level summary

    This week, most of the Hydra team was attending a cardano scaling workshop in +Nantes, France. They used this oportunity to meet fellow mithril team and spend +some time together to hack on some code and, as always, reflect on the past work +and find optimal path forward for both projects. They also fixed a bug that +caused hydra-node to crash when querying L1, worked on a new network resillience +proof-of-concept and accepted a new ADR related to stateless transaction +observation.

    What did the team achieve this week

    • Cardano scaling workshop with members of hydra and mithril teams
    • Accepted user contribution for possible new use-case #1048
    • Fix for the hydra-node crash related to internal wallet query #1053
    • Collected experimental CI findings #1070
    • Propose first POC for the network resilience #1074

    What are the goals of next week

    • Monthly review meeting & report including updates from Mithril
    • Review POC and discuss our options for the network resilience
    • Update cardano-api to version 8.20
    • Address TODOs on aiken commit validator #1072
    • Complete hydra-support in kupo kupo#117
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-15-ledger + 2023-09-15-ledger + Fri, 15 Sep 2023 00:00:00 GMT + + High level summary

    The Ledger team's focus is still mainly on the Conway era implementation.

    We were able to add ability to specify initial Constitutional Comittee and the initial +version of Constitution. Priority in which Governance Action are now enacted matches the +specification. DRep's deposits are now properly accounted for. Governance actions that are +not allowed to be voted on by Stake Pool operators and Constitutional Committee members +are prevented by transaction submission failure, rather than simply being ignored. There +was a few important CDDL fixes as well as a lot of new round trip serialization +tests. Constraint based testing framework has also received a lot of improvements.

    Low level summary

    Conway era

    • pull-3681 - Conway Genesis additions
    • pull-3690 - Preserve the order of ProposalProcedures
    • pull-3705 - Removed ProtVer from EnactState
    • pull-3700 - Add conway-specific certs to deposit/refunds
    • pull-3704 - Add comments on deprecating certs to Conway CDDL
    • pull-3698 - Reordering of governance actions
    • pull-3712 - Disallow empty fields in ConwayTxBodyRaw
    • pull-3716 - Abstract threshold calculation
    • pull-3725 - Fix mistaken use of dollar sign in cddl files
    • pull-3718 - Predicate failure for mismatched Voter GovAction
    • pull-3721 - Committee expiration, validation and modification

    Improvements and releasing

    Testing

    • pull-3730 - Implement Show instance for Rep using IsTypeable
    • pull-3697 - Rewrite testEql using Typeable to make it impossible to forget cases
    • pull-3709 - Add many new features to the Constrained modues in cardano-ledger-test
    • pull-3726 - Conway and other eras serialization roundtrip tests
    • pull-3713 - Improve CI resiliency against GitHub issues
    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-15-network + 2023-09-15-network + Fri, 15 Sep 2023 00:00:00 GMT + + High-level overview of sprint 44

    Bootstrap Peers

    In this sprint, we focused on developing bootstrap peers.

    Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we +identified a possible improvement to bootstrap peers. A more detailed +description is available here.

    Cardano-Node-8.4.0 Release

    We also were responsible for the cardano-node-8.4.0-pre release. A final +integration PR is currently being merged. We published +new versions of ouroboros-consensus, cardano-api and cardano-cli.

    Towards Typed Protocols 0.2.0.0

    We also updated the future typed-protocols-0.2.0.0 and its integration with +cardano-node. This is towards our goal which we planned for the next +quarter. The identified tasks are to fix breaking tests, and then measure and +address possible performance regressions.

    Tech Debt

    Mark Tullsen (Galois) submitted two more PRs: ouroboros-network-#4663, +ouroboros-network-#4664. We provided feedback on their other pull requests: ouroboros-network-#4661 and +ouroboros-network-#4660.

    P2P adoption

    In the last two weeks, there was a regression in P2P adoption concerning +the number of SPOs or stakes, although the number of overall P2P relays has +increased. Karl Knutsson (Cardano Foundation) is investigating +this issue. +P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

    Data has been kindly provided by Cardano Foundation and their mainnet +monitoring infrastructure.

    Open Source

    We are in the process of upstreaming our ffi to Windows Named Pipes API to the Win32 package, see [win32-220].

    ]]>
    + network +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-15-sre + 2023-09-15-sre + Fri, 15 Sep 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet environment was updated to 8.3.0-pre.
    • Cardano-parts now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is here.

    Lower level summary

    Capkgs

    • Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: capkgs-compare

    Cardano-ops

    Cardano-parts

    • Utilize content addressed binaries to significantly improve eval, build and devShell performance: cardano-parts-pull-8
    • Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: cardano-parts-pull-10
    • Fix warns thrown during some builds and devShell usage: cardano-parts-pull-11
    • Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: cardano-parts-pull-12
    • Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: cardano-parts-pull-13

    Cardano-perf

    • Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: cardano-perf-compare

    Cardano-playground

    Cardano-world

    ]]>
    + sre +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-14-db-sync + 2023-09-14-db-sync + Thu, 14 Sep 2023 00:00:00 GMT + + High level summary

    We have created a DBSync tag sancho-1-1-0 which can follow sanchonet. Also +the team has ran a number of benchmarks and tests for the new options/flavours of DBSync +and prepared a blogpost which summorises them, for downstream components.

    Lower level summary

    • Integration of node-8.3.x and support for Sanchonet on Conway +#1498
    • Simplifications of new feautures +#1496
    • Makes it impossible to restart DBSync with different schema options and adds +tests for them +#1466
    • CI fixes +#1494#1491
    • Prepared a blogpost about different DBSync options +blog
    ]]>
    + db-sync +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-12-node-cli-api + 2023-09-12-node-cli-api + Tue, 12 Sep 2023 00:00:00 GMT + + 2023-08-30 - 2023-09-12

    High level summary

    Release of Cardano-node 8.3.0-pre for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs. +This release completes phase 2 of SanchoNet feature roll out plan

    CLI continues on its migration to a era-based top-level commands. This sprint we moved text-view, key, query, genesis, node, stake-address, transaction and address into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints.

    We are moving the drep delegation-certificate to the stake-address command so delegating to a drep is done via stake-addres vote-delegation-certificate. Along the same lines, we are renaming +stake-address delegation-certificate (delagating to a stake pool) to stake-address stake-delegation-certificate to distinguish between stake delegation to a pool and votes delegation to a drep. On top +of that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly stake-address stake-and-vote-delegation-certificate. Note that change is not included on 8.3 but will come on 8.4. +Removing --conway-era flag from all the transaction sub-commands.

    Update description fields in delegation certificates from Stake Address Delegation Certificate to respectively (Conway onwards):

    • Stake Delegation Certificate
    • Vote Delegation Certificate
    • Stake and Vote Delegation Certificate

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-08-hydra + 2023-09-08-hydra + Fri, 08 Sep 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team improved the commit process with support for inline +datums. They simplified the chain layer by refactoring how the chain state is +persisted. Updates to the Hydra tutorial were completed, including CI workflows +to keep it up-to-date. The team engaged in discussions with researchers about +incremental commits & decommits, and drafted an architectural decision record +for a resource-based API. They also explored simpler solutions for the upcoming +network resilience feature.

    What did the team achieve this week

    • Support InlineScriptDatum in commit +#1043
    • Refactored chain state persistency +#1049
    • Completed tutorial updates (by adding CI and some cleanup) +#997
    • Intersect Open Source committee meeting
    • Experimented with various models to better express the \"Network +resilience problem\" to find a KISS solution for +#188
    • Drafted and discussed incremental de-/commit features within team +and with researchers +#199 and +#1057
    • Created ADR for a resource based overhaul of the API +#1028

    What are the goals of next week

    • Meetup of Hydra & Mithril contributors in Nantes, France
    • Integrated cardano-api 8.15 to have GHC 9.6 support
    • A clear design for incremental commits (decommits are already +understood)
    • An ADR for improving tx construction & observation to not need chain +state
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-07-mithril + 2023-09-07-mithril + Thu, 07 Sep 2023 00:00:00 GMT + + High level overview

    The Mithril team has released a new distribution 2335.0 which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information.

    They have also worked on snapshots enhancements: implementation of the zstandard compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes.

    Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client.

    Low level overview

    • Completed the issue Use 'zstandard' compression for snapshot archives #876
    • Completed the issue Design & implement stress test tool for aggregator - phase 2 #1155
    • Completed the issue Provide progress information with '--json' option in Client #1095
    • Completed the issue Make client download and extract the archive simultaneously #1115
    • Completed the issue Add aggregator Cardano node version in snapshot artifact #948
    • Completed the issue Make Cardano node version part of the Mithril network configuration #947
    • Completed the issue Post deployment 'mainnet' infrastructure #1091
    • Worked on the issue Errors refactoring #798
    • Worked on the issue Add Cloudflare protection of infrastructure #986
    • Completed the issue Failed to restore recent snapshot with strange error #1160
    • Completed the issue Update 'ed25519-dalek' to '2.0.0' #1188
    • Completed the issue Add target networks blocks in release notes #1151
    • Completed the issue Fix end to end 'wait_for_the_expected_time' test #1191
    • Completed the issue Fix docs 'git checkout' command #1174
    ]]>
    + mithril +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-07-performance-and-tracing + 2023-09-07-performance-and-tracing + Thu, 07 Sep 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack.
    • Infrastructure: Various improvements of our analysis pipeline have been merged to master, supporting safe log truncation.
    • Tracing: Namespace consistency checks have been merged to master along with a curated configuration for benchmarking.
    • Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.

    Low level overview

    Benchmarking

    We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer.

    With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance.

    The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack.

    Infrastructure

    As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation +operation that keeps the interdependencies of block events intact.

    Truncation might happen at a slightly different point +in time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time.

    Tracing

    Consistency checking of namespace implementation and configuration when using the new system has been completed. +This feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a cardano-node shows inconsistencies with the namespaces the system provides - and hence needs attention.

    Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many +detailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable.

    Nomad backend

    The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the +first real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend.

    ]]>
    + performance-tracing +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-06-consensus + 2023-09-06-consensus + Wed, 06 Sep 2023 00:00:00 GMT + + High level summary

    We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation. +On the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers. +The Consensus release engineer finished his rotation: version 8.3.0-pre of cardano-node is releasing 2023 September 5.

    UTxO-HD

    • We ran the first successful system-level benchmarks for UTxO-HD (see #203) using the in-memory backend.
      • We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot.
      • After the mempool regression is fixed the benchmarks need to be ran again.
      • System-level UTxO-HD benchmarks with the LMDB are still pending.
    • UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see #344).
    • We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in GetUTxOByAddress (see this comment). Preliminary results are promising.
    • Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (#344), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.

    Tech debt

    • We added tests that Consensus emits valid CBOR (#3099). This helped us detect a couple of serialization bugs. The tests still need to be merged into the main branch (#323).

    Support

    • Nick Frisby finished his release engineer rotation; cardano-node 8.3.0-pre is releasing 2023 September 5.
    • We helped to investigate a protocol version bug in Sanchonet (see #3491).
    • We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see #91.
    ]]>
    + consensus +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-01-goedel + 2023-09-01-goedel + Fri, 01 Sep 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • finalising a presenting performance analysis internship work to the +formal methods team

    • developed a new Isabelle mini-protocol framework and examples

    • planning an extended version of the ICE DeltaQ paper

    • working on algebraic rules for properisation of any-to-finish

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-01-hydra + 2023-09-01-hydra + Fri, 01 Sep 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team focused primarily on changes needed in the network +layer and have the first draft document related to needed design. They also +improved the user experience by allowing a commit using inline datums. +Discussed the off-chain governance with researchers and improved internal model +tests.

    What did the team achieve this week

    • Monthly report published
    • Small changes to hydraw and tutorial in light of the Masterclass
    • Investigated a bug and saw it was solved by recent developments
    • Improved the model tests by fully validating L1 transactions
    • Enhanced the /commit API to also allow commit from scripts with inline datums (user request)
    • Discussed off-chain governance with IOG and CF researchers
    • Drafted a first network specification document in the context of Network resilience

    What are the goals of next week

    • Have a clear understanding of the changes we need for the "Improve network resiliency" feature
    • Groomed and agreed plan on incremental commits/decommits
    • Updated tutorials including CI workflows to check consistency
    • Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-01-ledger + 2023-09-01-ledger + Fri, 01 Sep 2023 00:00:00 GMT + + High level summary

    Broadly speaking the Ledger team focused on a few main areas of Conway era:

    • Creation of voting state snapshots in order to correctly delay ratification for one epoch
    • Validation of the Governance Actions sequencing and ordering
    • Proper expiry of DReps and Proposal Procedures
    • Expanding Conway Genesis functionality
    • Utilization of some of the new Protocol Parameters in ledger validation rules

    Low level summary

    Conway era

    • pull-3659 - Validate Network for ProposalProcedure and TreasuryWithdrawal
    • pull-3637 - Avoid using sequence of tuples, by adding GovActionId to GovActionState
    • pull-3651 - Inactive DReps
    • pull-3664 - Track proposal expiry
    • pull-3668 - Add min committee size predicate to NewCommittee
    • pull-3669 - Add Proposal deposit check against PParam
    • pull-3676 - Fix inactive PoolStake not counting as Drep Stake
    • pull-3635 - Make snapshots of GovActionsState
    • pull-3670 - Validate previously enacted govAction
    • pull-3694 - Improve error reporting on the positive coin decoder
    • pull-3674 - Added RATIFY thresholds
    • pull-3684 - Add proposal delaying, remove predicate failure from ENACT
    • pull-3688 - DRep Refunds and update evalTransactionBalance

    Improvements and releasing

    • pull-3677 - Minor patch that fixes the DRep distribution computation
    • pull-3686 - Post patch release fixup
    • pull-3695 - Changelog for cardano-node-8.3 release
    • pull-3683 - Add two new bench mark programs

    Testing

    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-01-network + 2023-09-01-network + Fri, 01 Sep 2023 00:00:00 GMT + + High-level overview of sprint 43

    In this sprint, we received contributions from CF & Galois. Karl Knutsson +(CF) has addressed various issues regarding peer churning in P2P, timeouts +and our WireShark dissector. While the Galois developers focused on +addressing issues from their review last year. See below for more details.

    We continued working on bootstrap peers ouroboros-network-#4661.

    We refactored our test suites: they are split into io-tests which require to +be run natively on all platforms (these tests mostly contain tests that +require IO system calls) and sim-tests which are platform independent. We +run io-tests on all supported platforms (e.g. x86_64-linux, +x86-64-darwin, aarch64-darwin and x86_64-w64-mingw32 (Windows)) natively. +The sim-tests are not executed on Windows due to memory limitations on +GitHub Actions runners. ouroboros-network-#4653

    We also started rebasing typed-protocols refactoring branches.

    Marcin was appointed as the cardano-node release engineer for the 8.4.0-pre +version. So far he integrated cardano-ledger-conway-1.8 and +ouroboros-network-0.9.1.0 to ouroboros-consensus, cardano-cli and +cardano-api. Once we will have an integration branch for cardano-node, +cardano-ledger-conway-1.8 and ouroboros-consensus packages can be released +to CHaP and PRs can be merged once they go through review & CI.

    We also fixed some smaller issues regarding peer sharing (both were discovered +by Karl from CF). More details are included below.

    Progress on P2P addoption

    SPO relays

    There are currently ~2000 relays running P2P +enabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On +16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil +Ada.

    P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

    Data has been kindly provided by CF and their mainnet monitoring +infrastructure.

    IOG relays

    As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all +IOG relays will be running P2P.

    Detailed description

    In this sprint, we got a few contributions from CF:

    • Karl made peer churning mechanism less aggressive ouroboros-network-#4656; and
    • he added timeouts for idle states in ChainSync & KeepAlive +miniprotocols. These timeouts help a node remove idle connections from the +responder (server) side ouroboros-network-#4648.
    • he improved the WireShark dissector by adding support for the peer-sharing mini-protocol ouroboros-network-#4656.

    Galois has been making progress in addressing some of the issues they raised in their review (last year):

    Peer Sharing

    • Light peer sharing is only enabled when peer sharing is turned on ouroboros-network-#4652;
    • Handshake incorrectly reports peer sharing value. It's supposed to relay the +remote value, but instead, it returns the local value. ouroboros-network-#4642 (in review).

    Async Demotion Test Fix

    • We fixed an async demotion test failure which turned out to be a weakness of +the test itself rather than a bug in the connection manager. ouroboros-network-#4655
    ]]>
    + network +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-09-01-sre + 2023-09-01-sre + Fri, 01 Sep 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes
    • Work on a new capkgs repository started -- "Content Addressed Packages"
      • This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output
      • These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do
      • Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers

    Lower level summary

    Capkgs

    • Content addressed packages -- new repo: capkgs

    Cardano-ops

    • Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: cardano-ops-compare

    Cardano-parts

    Cardano-perf

    Cardano-world

    Sanchonet-demo

    ]]>
    + sre +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-29-node-cli-api + 2023-08-29-node-cli-api + Tue, 29 Aug 2023 00:00:00 GMT + + 2023-08-16 - 2023-08-29

    High level summary

    CLI is making progress towards phases 3 and 4 of SanchoNet.

    • Ability to create info, no-confidence and new committee governance actions.

    • Voting as DREP is possible now on the CLI

    • API is now using Ledger's PParams and VotingProcedures

    • Expose following queries from consensus:

      - GetGovState
      - GetDRepState
      - GetDRepStakeDistr
      - GetCommitteeState
      - GetConstitution

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-28-mithril + 2023-08-28-mithril + Mon, 28 Aug 2023 00:00:00 GMT + + High level overview

    The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of zstandard compression of the snapshot archive, and streaming its download and decompression in the client.

    Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer.

    Low level overview

    • Completed the issue Create explorer page with registered signers #1097
    • Completed the issue Simplify logs on the Signer/Aggregator #1106
    • Completed the issue Refactor (de)serialization of crypto entities #668
    • Completed the issue Mithril client last snapshot download #1078
    • Completed the issue Use the '/signers/registered' route to verify if a signer is registered #1152
    • Worked on the issue Provide progress information with '--json' option in Client #1095
    • Worked on the issue Use 'zstandard' compression for snapshot archives #876
    • Worked on the issue Make client download and extract the archive simultaneously #1115
    ]]>
    + mithril +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-25-hydra + 2023-08-25-hydra + Fri, 25 Aug 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team conducted the monthly review meeting for Agust,which +continously ensures transparent communication and project evaluation.

    In terms of community engagement, the Hydra team gave a Hydra master-class at +RareEvo workshop as an educational initiative for the community. +Additionally, the team updated the Hydra demo and tutorial to include Mithril +and latest release changes.

    They also focused on exploring the Hydra network resiliance in order to improve +hydra-node availability, as it becomes stuck very easily and that leads to a +bad user experience.

    What did the team achieve this week

    • Hydra master-class at RareEvo workshop!
    • Monthly report & review meeting
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Groomed network resilience and explorer features #188
    • New ADR for “Resourced based API” #1028

    What are the goals of next week

    • Have a poc on network resilience working #188
    • Fix issue #931: “Chain state in head state not updated on replayed observation”
    • Fix issue #1039: "Close transaction dropped from cardano-node"
    ]]>
    + hydra +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-24-performance-and-tracing + 2023-08-24-performance-and-tracing + Thu, 24 Aug 2023 00:00:00 GMT + + High level summary
    • Benchmarking: Benchmarking node version 8.2.1 has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD.
    • Infrastructure: Our analysis pipeline has received improvements reducing memory footprint.
    • Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing.
    • Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.

    Low level overview

    Benchmarking

    We've performed and analysed the benchmarks for the 8.2.1 version of cardano-node as part of our release benchmarking cycle.

    Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths.

    Infrastructure

    As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held +in memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline.

    Tracing

    The next portion of optimizations has been completed and merged to master, getting rid of Haskell's native String representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by cardano-node.

    The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup.

    Nomad backend

    The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster +and porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend.

    ]]>
    + performance-tracing +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-23-consensus + 2023-08-23-consensus + Wed, 23 Aug 2023 00:00:00 GMT + + High level summary

    On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests. +On the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base.

    UTxO-HD

    • We addressed the issues that came from the benchmarking and testing phase (see #314).
      • We fixed the operational-certificate update exception (#305).

    Tech debt

    • We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see this branch).
    • We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see this branch).
    • We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see #275).
    • We decreased the flakiness for our test suite (#284).
    • We incorporated and merged the pull-request on query versioning (#273).
    • We started working on new performance-based regression tests for mempool operations.

    Support

    • Nick Frisby continues with his engineer responsibilities. Notably getting the Consensus release out for node pre-release 8.3. Nick also began integrating it into downstream branches (cardano{-api,-cli,-node}). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:
    ]]>
    + consensus +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-18-goedel + 2023-08-18-goedel + Fri, 18 Aug 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • Development of an automated prover for showing conformance of +programs to state machines (as part of the mini-protocol framework)

    • Completion of the documentation of the (current state of the) +mini-protocol framework

    • Discussion about two DeltaQ lectures with two practical sessions as part +of 4th year masters course on distributed systemsby colleagues at UC +Louvain in the Autumn

    • Discussion about four DeltaQ lectures by colleagues at U. Bergen as part +of a 5th year Masters course in the Autumn

    • Adapted original DeltaQ implementation to the new typeclasses and +wrote property tests for its algebraic laws

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-18-hydra + 2023-08-18-hydra + Fri, 18 Aug 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team released version 0.12.0, a significant update that +brings support for cardano-node 8.1.2, along with performance enhancements and +various API improvements. Additionally, the team successfully onboarded a new +contributor who is now actively participating in operating a Hydra Head. They +took part in a meeting of the Intersect open source committee and prepared the +Hydra master-class for RareEvo, an educational initiative for the community.

    If you happen to be at RareEvo, register for the Hydra master-class using this +form. +We hope to make it possible to follow along on-line as well and will announce +details on the Hydra announcements channel on the IOG discord +server.

    What did the team achieve this week

    • Released version 0.12.0 which adds support for cardano-node 8.1.2, performance +and several API improvements. Release notes
    • Replaced commit via websocket with external draft + submit. #954
    • Onboarded new contributor to the point where he actively participates in operating a Head now.
    • Joined a first meeting of the Intersect open source committee
    • Prepared the Hydra master-class for RareEvo.

    What are the goals of next week

    • Monthly review meeting
    • Run the Hydra master-class at RareEvo!
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Clear out red bin items (technical debt)
    • Groom network resilience and explorer features
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-18-ledger + 2023-08-18-ledger + Fri, 18 Aug 2023 00:00:00 GMT + + High level summary

    The ledger team made great progress in advancing Conway era forward. In particular, voting +for DRep and Stake Pool Operators is now at the state that can be used by downstream +components. Addition of new ledger state queries makes it possible to verify changes to +the governance state, such as placement of votes, submission of governance proposals, +inspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the +ability to enact all of the governance actions, except for the hard fork initiation.

    Low level summary

    Conway progress

    • pull-3577 - Move PParams to GovState
    • pull-3609 - Adjust thresholds for sanchonet
    • pull-3604 - README: update CIP-1694 link
    • pull-3616 - Switch TreasuryWithdrawals to use RewardAcnt
    • pull-3599 - Add governance action well-formedness check
    • pull-3607 - Rename governance to gov
    • pull-3601 - Added DRep anchors
    • pull-3615 - Add optional previous GovActionId in some ProposalProcedures
    • pull-3596 - Upgradeable families
    • pull-3625 - Change constitution to use Anchor
    • pull-3592 - Added pulsing incremental computation of the DRep distribution
    • pull-3523 - Treasury donations
    • pull-3633 - Prevent state changes on phase2 failure
    • pull-3634 - Disable serialization of protocolVersion param update
    • pull-3630 - Implemented DRep refreshing
    • pull-3640 - Remove crypto parameterization from AnchorData
    • pull-3636 - Implement DRep ratification with an "always passing"; threshold
    • pull-3648 - Governance queries
    • pull-3650 - Change environment for ShelleyPOOLREAP rule
    • pull-3658 - Set DRep ratify threshold to 51%
    • pull-3628 - DELEG, POOL, GOVCERT conformance with Spec v0.8

    Testing

    Improvements and releasing

    • pull-3660 - Fix bounds and versions
    • pull-3661 - Adjust versions, bounds and CHANGELOGs to account for the latest release
    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-18-network + 2023-08-18-network + Fri, 18 Aug 2023 00:00:00 GMT + + High-level overview of sprint 42

    Eclipse Evasion

    We merged and released a new version of the ouroboros-network package (version +0.9.0.0) which includes big ledger peers feature. +This is the primary peer selection mechanism to defend against eclipses. We +also prepared a PR to updated ouroboros-cosnensus +and ekg-forward packages.

    CDDL specs for protocol codecs

    We made the cddl spec for network codec more inline with the implementation +which is highly polymorphic. cddl doesn't have the notion of polymorphism, +but has any which can generate any valid cbor term. We matched it with an +Any type on the Haskell side and made all remaining tests & specs use it. +This simplified the specifications and made it easier to understand which parts +are defined in the spec, and which parts are left unspecified. See +ouroboros-network#4595.

    Ouroboros-Network-Framework API changes

    We also released ouroboros-network-framework and other network components. +The ouroboros-network-framework package contains a redesign of API exposed to +ouroboros-consensus. We consolidated, cleaned it and made it easier to +extend in the future if there will be new arguments that need to be passed to +mini-protocol initiator and responders which comes from the low-level network +layer.

    Nix setup (CI)

    We also made a major review of our nix setup. With help from our DevX team +we ended up with a clean flake.nix file which can:

    • compile & test the code on x86_64-linux, x86_64-darwin and aarch64-darwin
    • cross-compile to Windows on x86_64-linux

    And provides a shell which contains all the build tools, including ghc-9.6, +hls, cddl, and more. See ouroboros-network#4640, +ouroboros-network#4643.

    Other contributions

    Cardano Network Service Assurance

    • The work and writeup in finishing up the CNSA, first stage (first +contract).
    • Getting Sam Cowger (Galois Inc) up to speed.
    • The IOG Networking team carried a reivew of CNSA project progress: a limitted +code & design review.

    Galois Review

    Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues

    scoping, requirements, and getting started.

    CI

    We added a nightly run for GitHub actions and made the GitHub actions test be +executed with extra concurrency ouroboros-network#4637, ouroboros-network#4649.

    We also added GitHub's dependabot ouroboros-network#4650.

    Bootstrap Peers

    We settled on implementation design of bootstrap peers which is being +implemented, ouroboros-network#4615.

    ]]>
    + network +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-18-sre + 2023-08-18-sre + Fri, 18 Aug 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet and shelley-qa environments were updated to 8.2.1-pre.
    • Work on two new repos utilizing flake parts for cardano cluster generation, automation and operation.

    Lower level summary

    Cardano-ops

    Cardano-parts

    Cardano-perf

    Cardano-playground

    Cardano-world

    Inputs-check

    • A flake parts module to check input closure sizes recursively for optimization considerations: inputs-check
    ]]>
    + sre +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-17-crypto + 2023-08-17-crypto + Thu, 17 Aug 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Include MuSig2 description in cryptography handbook
    • kes_agent: Finilising test and CI. Working on KES binary

    Low level summary

    Mithril

    • Full Node Verifier merged #939.

    MuSig2

    • Started describing MuSig2 to include it as part of the cryptography handbook

    Sidechains

    • Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in this fork.

    KES agent

    • KES agent is ready:
      • CI ready #19
      • Receipt confirmation message #20
      • KES agent binary ready #21
      • Control client implemented #11
    ]]>
    + crypto +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-17-db-sync + 2023-08-17-db-sync + Thu, 17 Aug 2023 00:00:00 GMT + + High level summary

    We have integrated many new Conway feutures and allow db-sync to sync sanchonet. +We also continued testing and improving the new db-sync options.

    Lower level summary

    • Conway integration +#1484
    • Support for Sanchonet +#1476
    • Stake distribution is computed earlier +#1484
    • Deposit ledger events are now used. This reduces the db queries and makes syncing faster +#1484
    • Testing new db-sync options +#1466
    • Added support for ghc-9.6 +#1479
    • Tech debt: improve exceptions +#1471
    ]]>
    + db-sync +
    + + <![CDATA[SECP bindings Security Issue Report]]> + https://input-output-hk.github.io/cardano-updates/2023-08-17-secp-issue + 2023-08-17-secp-issue + Thu, 17 Aug 2023 00:00:00 GMT + + Security Issue Report: SECP256k1 bug

    Date Occurred: July 15, 2022 +Severity: Potentially Very High if exploited on Mainnet +Authors: Iñigo Querejeta Azurmendi

    Date of Report: August 17, 2023

    Summary of Issue

    Criticality Level

    Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet +Context

    New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains. +How was the Issue Detected

    The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there.

    What Action was Taken

    The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod). +Fixes were applied to prevent the use of the primitives. +A full security audit was carried out on the bindings. +The rollout of the primitives was postponed to a new hard fork (Valentine)

    Potential Effect

    The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction.

    Actual Effect

    • Delay to the Vasil hard-fork
    • Temporary removal of SECP256k1 primitives
    • Additional hard-fork to introduce SECP256k1 primitives

    Ongoing Mitigations Needed, if any

    None

    Responsibility for Mitigations

    Core team

    Detailed description of Incident

    New Plutus secp256k1 cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet.

    The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing.

    • This is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an expected structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely.
    • The same happened with the Schnorr verification function. It takes as input a SECP256k1_xonly_pubkey, which is again an opaque structure that holds a parsed and valid public key.

    The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated.

    The fix was addressed in this PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts.

    Recommendations

    • Check all new Plutus bindings for correct use.
    • Audit all new Plutus built-in bindings.
    • Continue to develop specific End-to-End tests for all new Plutus features.
    • Do not assume that any existing library functions are "safe". Treat all external calls circumspectly.
    ]]>
    + crypto +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-15-node-cli-api + 2023-08-15-node-cli-api + Tue, 15 Aug 2023 00:00:00 GMT + + 2023-08-02 - 2023-08-15

    High level summary

    • cardano-node 8.2.1 (pre-release) to SanchoNet
    • Continue moving CLI into era-based top level command structure
    • Wire-up DREP key generation,
    • Fix DREP deregistration certificates
    • Implement Constitutional Committee Key generation on the CLI
    • Introducing era-based protocol parameters on the API
    • Removing depracated functions and types on the API

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    Fix broken links in docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-11-hydra + 2023-08-11-hydra + Fri, 11 Aug 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team updated hydra-node to support cardano-node version +8.1.2, ensuring compatibility with the latest mainnet release. The team also +participated in discussions about a "cardanonical" JSON schema and added it as a +submodule to the project, contributing to improved data modeling and +interoperability.

    In terms of community engagement, the team successfully onboarded a new +contributor, also participated in a RareEvo Twitter space, and continued +preparations for the Hydra master-class.

    What did the team achieve this week

    • Updated dependencies to support cardano-node 8.1.2 #1007
    • Engaged in discussions about a cardanonical json schema and +add it as submodule to the project +#1013
    • Onboarded a new contributor to the hydra project (@locallycompact)
    • Joined RareEvo twitter space and continued preparation of hydra master-class

    What are the goals of next week

    • Update & streamline tutorial to work with latest version of hydra-node
    • Remove the internal commit functionality #954
    • Release 0.12.0
    ]]>
    + hydra +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-11-performance-and-tracing + 2023-08-11-performance-and-tracing + Fri, 11 Aug 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We've concluded benchmarking node version 8.2.0.
    • Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration.
    • Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.

    Low level overview

    Benchmarking

    As part of our release benchmarking cycle, we've completed and analysed the runs for the 8.2.0 version of cardano-node. In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version.

    Tracing

    A significant amount of optimizations for the new tracing system has finally been merged to master. At the moment, +we're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding +insight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward.

    Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing.

    Nomad backend

    The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent +and reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were +able to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks.

    A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to master.

    ]]>
    + performance-tracing +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-10-mithril + 2023-08-10-mithril + Thu, 10 Aug 2023 00:00:00 GMT + + High level overview

    The Mithril team completed the Mithril protocol’s mainnet beta launch: the release-mainnet network is now consistently producing new certificates and snapshots! The team has released a new distribution 2331.1 which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the mainnet infrastructure.

    Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network.

    Low level overview

    • Released the new distribution 2331.1
    • Completed the epic Release 'mainnet' Mithril network #918
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Completed the issue Design & implement basic stress test tool for aggregator - phase 1 #991
    • Worked on the epic Post deployment 'mainnet' infrastructure #1091:
      • Completed the issue Create Production Infrastructure Runbook #1085
      • Completed the issue Ingest 'mainnet' metrics/logs in Grafana #1122
    • Worked on optimizations:
      • Completed the issue Add a 'clean' file to extracted database in client #1131
      • Worked on the issue Create explorer page with registered signers #1097
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on bugs:
      • Completed the issue Client fails to unpack some snapshot archive #1137
      • Completed the issue The 'release-preprod' network stopped producing certificates #1114
      • Completed the issue The 'release-mainnet' network does not show up in the explorer #1111
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.2' #1090
    • Worked on troubleshooting:
      • Completed the issue Signer can't sign with 'Invalid signature for party' error #1125
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-09-consensus + 2023-08-09-consensus + Wed, 09 Aug 2023 00:00:00 GMT + + High level summary

    This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of fs-sim and fs-api, and released strict-checked-vars.

    UTxO-HD

    • Rebased UTxO-HD on top of node 8.2 (issue)
    • Address new Maybe translations for UTxOs in Conway 1.6. (PR).
    • Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory.
    • Fixed an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully.
    • Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running QueryUTxOByAddress (PR).
    • Measured the speed of QueryUTxOByAddress under different queryBatchSize values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution.
    • Refactored and implemented ledgertable-related classes for the general HardforkBlock.

    Genesis

    • Frisby and Esgen continue to engage with the Researchers on grinding against the Genesis design.

    Fostering collaboration

    • Drafted a document explaining versioning of local state queries #273.

    Support

    • Frisby is the release engineer this cycle.
    • Successfully created work-in-progress ouroboros-consensus and cardano-api commits that integrate the 2023 Aug 7 tip of cardano-ledger. This will require a release of ouroboros-consensus, which hasn't happened yet.
    ]]>
    + consensus +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-04-crypto + 2023-08-04-crypto + Fri, 04 Aug 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Finalised the missing fuzz tests
    • kes_agent: engineer on PTO. Work halted

    Low level summary

    Mithril

    • Work on a mithril flaky test #1105
    • Keep working on Full Node Verifier #939. +Should be merged in the coming week.

    MuSig2

    • Finalised the fuzz tests #43

    Sidechains

    • Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.
    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-04-goedel + 2023-08-04-goedel + Fri, 04 Aug 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is formalising mini protocols and also further developing the +performance modelling prototype.

    Details

    • Developing new framework for specification and verification of +mini-protocols which is closer to the Haskell implementation.

    • Developed a new internal representation for the DeltaQ algebra that +allows for more modularity in backend implementations

    • Discussions regarding the Cardano networking specification

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-04-hydra + 2023-08-04-hydra + Fri, 04 Aug 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team achieved notable progress in various aspects of the +project. The team updated the use case section for auctions on the /unstable +branch of the website, improving the understanding of Hydras applicability.

    From the development side, the team successfully completed event-sourced +persistence, a key enhancement in the projects architecture which improves +off-chain transaction processing performance. They also added a +submit-transaction endpoint to the API.

    In addition to project-related progress, the team actively engaged in community +reviews for several catalyst proposals related to Hydra and Mithril, +contributing to the wider Cardano ecosystem.

    Finally, the full report for the month of July was also published here.

    What did the team achieve this week

    • Published the monthly report for July
    • Updated the use case section for auctions (published on /unstable branch)
    • Completed event sourced persistence #913
    • Added a submit-transaction endpoint to the API #966
    • Community reviews for several catalyst proposals related to Hydra and Mithril
    • Created a network testing tool (hydra-net) #1006

    What are the goals of next week

    • Update hydra-node to work with cardano-node version 8.x
    • Remove the internal commit functionality
    • Release version 0.12.0
    • Update & streamline tutorial to work with latest version of hydra-node
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-04-ledger + 2023-08-04-ledger + Fri, 04 Aug 2023 00:00:00 GMT + + High level summary

    The ledger team was working almost exclusively on the Conway era implementation. In +particular, the main focus was directed towards solidifying transaction related types and +their binary representation. We also directed some effort into unblocking Plutus team with +respect to PlutusV3 integration.

    Low level summary

    Conway progress

    • pull-3552 - Allow Constitutional Committee Hot Key to be ScriptHash
    • pull-3581 - Make Constitutional Committee Cold Key to be ScriptHash
    • pull-3571 - Implement a portion of the TICKF rule.
    • pull-3556 - Add Script to Constitution
    • pull-3576 - Add optional Anchor to ConwayRegDRep certificate
    • pull-3495 - Implement refund logic for Proposal deposits
    • pull-3579 - Change voting procedure in the transaction to a nested Map
    • pull-3585 - Rename CommitteeCert into a GovCert
    • pull-3587 - Remove DelegStakeTxCert from the COMPLETE pragma for TxCert
    • pull-3586 - Add CurrentTreasuryValue to TxBody
    • pull-3588 - Rename key roles
    • pull-3557 - Update NewCommittee action to use RewardAcnt and add more info
    • pull-3595 - Add ConwayUpdateDRep constructor to ConwayTxCertGov type
    • pull-3600 - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway
    • pull-3597 - Update ProposalProcedure return address to be a RewardAcnt

    Testing

    • pull-3374 - New features for generation subject to constraints
    • pull-3519 - Basic Conway features test

    Bugfixes

    Plutus integration

    • issue-3538 - A fairly complete specification was created for the PlutusV3 context
    • pull-3593 - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality

    Improvements and releasing

    • pull-3574 - Improve clarity and performance of collateral Non-ADA validation:
    • pull-3573 - Update top-level CHANGELOG.md with cardano-node relevant changes
    • pull-3555 - Bump pygments from 2.12.0 to 2.15.0 in /doc
    • pull-3575 - Bump certifi from 2022.12.7 to 2023.7.22 in /doc
    • pull-3567 - Backport mint field translation bugfix
    • pull-3568 - Fixed typo in byron ledger spec
    • pull-3572 - Release/backport tickf bugfix
    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-04-network + 2023-08-04-network + Fri, 04 Aug 2023 00:00:00 GMT + + High-level overview of sprint 41

    24th July - 6th August 2023

    We started the implementation of bootstrap peers. Bootstrap peers are designed +to provide a safety guarantee for nodes joining the network while still taking +advantage of the distributed network for nodes that are synced. This will be +an intermediate step before Genesis which will allow for further distribute the +system. The bootstrap peers will be run by some trusted partners like CF, +Emurgo or IOG. They are primarily designed for leaf nodes (e.g. full node +wallets), which often end up syncing and require access to the honest chain. See +ouroboros-network#4615 for a more detailed implementation plan.

    Other contributions

    We started to use nothunks library to discover if we have any unevaluated +thunks which can lead to memory leaks ouroboros-network#4633. We found +a small one in the peer metric component of the P2P networking stack. Fixing +it put us on a small detour of fixing the API of the strict-checked-vars +package: cardano-base#431, cardano-base#432, as well as adding NFData +instance to io-classes. We also improved nothunks +library to make debugging easier and we provided a NoThunks instance for +ThreadId which we will need in the future (see nothunks#33).

    We released a new version of io-classes (version 1.2.0.0) and related +packages to Hackage.

    We addressed all review comments on the eclipse evasion PR which introduces big +ledger peers, ouroboros-network#3886.

    We fixed how SIGHUP signal handlers are registered, so it's not possible to +shutdown a node which was starting while trying to update network topology, +see cardano-node#5421.

    I didn't mention that in the previous update, so here it goes: in the previous +sprint we released ouroboros-network-0.8.2.0 and +ouroboros-network-framework-0.7.0.0.

    ]]>
    + network +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-04-performance-and-tracing + 2023-08-04-performance-and-tracing + Fri, 04 Aug 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version 8.2.0.
    • Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing.
    • Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6.
    • Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.

    Low level overview

    Benchmarking

    The 8.2.0 version of cardano-node required adjustment of some of the sanity checks that are part of our benchmarking +cluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version.

    Tracing

    The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint +when using it as default for a running node.

    A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any +inconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node. +This feature adds another layer of robustness to the whole system.

    Infrastructure

    A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler +versions. We've future-proofed our benchmarking code.

    Nomad backend

    The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend +accordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant.

    The validation phase is ongoing. We were able to perform successful runs and analyses for various 8.x node versions, including 8.2.0-pre. With parallel runs on the current cluster, we hope to measure the same effects we've observed with the +nomad backend - which will be a big step towards production use.

    ]]>
    + performance-tracing +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-04-sre + 2023-08-04-sre + Fri, 04 Aug 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Preprod and preview envionments were updated to 8.1.2.
    • Sanchonet and shelley-qa environments were updated to 8.2.0-pre.
    • Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.

    Lower level summary

    Cardano-ops

    Cardano-perf

    Cardano-world

    ]]>
    + sre +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-08-01-node-cli-api + 2023-08-01-node-cli-api + Tue, 01 Aug 2023 00:00:00 GMT + + 2023-07-19 - 2023-08-01

    High level summary

    • Release of Node 8.2.0
      • Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694.
      • This release is phase 1 of the SanchoNet roll out
      • Allows SPOs to vote on changes to the on-chain constitution.
      • Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag.
      • Updates to the networking packages prepare the road for peer sharing.
    • cardano-cli and cardano-api continue to integrate Conway era features
    • Continue refactoring of cardano-testnet

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-31-network + 2023-07-31-network + Mon, 31 Jul 2023 00:00:00 GMT + + Network Update (Sprints 39 & 40)

    The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away. +It was great to see and talk to so many of the community members.

    Sprint 39 (Jun 26 - Jul 09)

    Major changes

    Now the following list of traces will be turned on by default:

    node-to-client protocol
    • LocalConnectionManagerTracer
    • LocalInboundGovernor
    • LocalHandshake
    • LocalServer
    node-to-node protocol
    • Server

    See cardano-node#5353. This will be released in node-8.2.0.

    We made sure that cardano-client-0.1.0.x library (which is db-sync) is not using the experimental node-to-client protocol. +The cardano-client-0.2.0.0 was not affected. +See ouroboros-network#4612.

    We merged the dynamic block production feature to ouroboros-consensus (also available in the cardano-node-8.2.0 release). +Dynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes. +See ouroboros-network#3159, [ouroboros-consensu#140].

    We continued to review the implementation of big ledger peers for eclipse evasion, see ouroboros-network#4462.

    Minor changes

    Sprint 40 (Jul 09 - Jul 23)

    Major changes

    We integrated ouroboros-network-0.8.2.0 with the master branch of cardano-node for the 8.2.0 release (the version match between ouroboros-network and cardano-node is purely accidental). +This includes:

    • integration with dynamic block production feature. +This feature is documented in the following PR.
    • Warm valency for local root peers (see below).

    For the full list of features included in the 8.2.0 release from the network side, please take a look at the pre-release nodes.

    We improved the memory footprint of peer metrics measured by the P2P stack. +Peer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation). +See ouroboros-network#4620. +The improvement will be available in cardano-node-8.2.0.

    We added an optional explicit warm valency to local root peers of the P2P topology file. +Previously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to. +The hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones. +Warm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses. +See ouroboros-network#4575, cardano-node#5409.

    ]]>
    + network +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-28-hydra + 2023-07-28-hydra + Fri, 28 Jul 2023 00:00:00 GMT + + High-level summary

    During this week, the Hydra team achieved significant progress in various areas. +They conducted the monthly review meeting for July, which continously ensures +transparent communication and project evaluation. The team migrated the core +logic of the node to an event-sourced architecture and incremental writes of +events to persistence, enhancing the projects performance and maintainability. +Furthermore, the team added the ability to read protocol parameters via the API +and fixed the CI workflows to support pull requests from forks of external +contributors, streamlining the development process for community involvement.

    What did the team achieve this week

    • Held the monthly review meeting for July (recording)
    • Migrate the core logic of the node to an event-sourced architecture #999
    • Updated persistence to faster incremental writes of events #1000
    • Added ability to read protocol parameters via API #735
    • Fix CI workflows to support pull requests from forks of external contributors #993
    • Updated to GHC 9.2.8 #1005
    • Prepared an updated use cases section on https://hydra.family (published with next release)

    What are the goals of next week

    • Publish monthly report
    • Complete user transaction submission work #966
    • Remove commit from internal wallet (deprecated) #954
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-27-mithril + 2023-07-27-mithril + Thu, 27 Jul 2023 00:00:00 GMT + + High level overview

    The Mithril team launched Mithril protocol’s mainnet beta: the release-mainnet network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch.

    They have released a new distribution 2329.0, which is running on the release-mainnet network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator.

    Finally, they have worked on enhancing the documentation for onboarding SPOs and setting up a Mithril signer, and fixing installation bugs of the binary artifacts produced in the CI.

    Low level overview

    • Created the dev blog post Mithril Protocol’s Mainnet Beta Launch
    • Released the new distribution 2329.0
    • Closed the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Deploy 'mainnet' infrastructure #988
      • Completed the issue Handle Secrets management #989
    • Worked on the epic Release 'mainnet' Mithril network #918
      • Completed the issue Prepare SPO on-boarding guide #1049
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Enhance the configuration of Mithril relay #1080
      • Completed the issue Remove legacy store adapters from aggregator #1053
      • Completed the issue Add a 'sign' sub-command to 'genesis' command in aggregator #1081
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on documentation:
      • Completed the issue Enhance 'Run a Mithril Signer node (SPO)' guide #1055
    • Worked on bugs:
      • Completed the issue Shared library error in CI binaries #1073
      • Completed the issue Debian package does not install cleanly on older ubuntu versions #834
      • Completed the issue Aggregator panics with new (de)serialization of 'ProtocolVerificationKey' #1083
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-26-consensus + 2023-07-26-consensus + Wed, 26 Jul 2023 00:00:00 GMT + + High level summary

    The db-sync team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now. +We also focused on completing tracing support for UTxO-HD in cardano-node. +Currently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further.

    The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ChainSync client as part of the onboarding efforts for the team that will implement Genesis.

    The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team.

    Genesis liaising

    Improvements to the ChainSync client:

    ]]>
    + consensus +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-21-hydra + 2023-07-21-hydra + Fri, 21 Jul 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team updated the specification to align with recent +off-chain protocol changes, completed refactoring the snapshot emission +in preparation for event-sourced protocol logic, and updated to GHC +9.2.7, resulting in improved compile times and slightly smaller Plutus +scripts.

    What did the team achieve this week

    • Updated the specification to match the recent off-chain protocol +changes to complete +#728
    • Refactored the snapshot emission logic in preparation for event +sourced protocol logic.
    • Updated to GHC 9.2.7, which led to improved compile times and +slightly smaller plutus scripts.

    What are the goals of next week

    • Monthly review meeting next wednesday and July report
    • Reflect latest information onto our roadmap.
    • Actual implemention of event-sourced persistence +#913.
    • Update the use cases section on https://hydra.family
    • Remove deprecated internal commit +#954.
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-21-ledger + 2023-07-21-ledger + Fri, 21 Jul 2023 00:00:00 GMT + + High level summary

    Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet. +All members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era. +We also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release). +Additionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available. +We also made progress on the constraint-based generators, which can now generate valid transactions and ledger states.

    What we achieved

    • [pull-3521] [pull-3554] Improved Governance model (GovernanceProcedures, ProposalProcedure)
    • [pull-3520] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert )
    • [pull-3531] Refactored and simplified code interacting with Plutus
    • [pull-3558] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix.
    • [pull-3550] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed.
    • [pull-3551] [pull-3546] [pull-3472] Updated tools and added some small improvements
    • [issue-3146] [pull-3498] Introduced Conway protocol parameters
    • [issue-2948] [pull-3499] Implemented ConwayGenesis with the new protocol parameters

    What is currently in progress

    ]]>
    + ledger +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-21-sre + 2023-07-21-sre + Fri, 21 Jul 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent improvements include:

    • Re-spin sanchonet for testing a new node version followed by fork to Conway
    • Deploying a sanchonet compatible faucet to sanchonet
    • Migrate shelley qa legacy environment to cardano-world

    Lower level summary

    Cardano-node

    Cardano-ops

    • Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: cardano-ops-compare

    Cardano-world

    Iohk-nix

    ]]>
    + sre +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-20-goedel + 2023-07-20-goedel + Thu, 20 Jul 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is working on formalising mini protocols, the performance +modelling prototype and also finishing off their ICE papers.

    Details

    • Formalization of the chain synchronization mini-protocol in the +thorn calculus

    • Final pre-publication steps for ICE 2023 papers

    • Developing approach for specification and verification of +mini-protocols

    • Started work on porting the DeltaQ framework to a new, more concrete +backend based on piecewise-polynomials

    ]]>
    + goedel +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-18-node-cli-api + 2023-07-18-node-cli-api + Tue, 18 Jul 2023 00:00:00 GMT + + 2023-07-05 - 2023-07-18

    High level summary

    • Integrate Conway certificates in cardano-api
    • Prepare cardano-cli and cardano-api for cardano-node 8.1.2
    • Tagged cardano-cli 8.3.0.0
      • Query for the hash of the constitution (Conway)
      • Ability to create votes and governance actions
    • Tagged cardano-cli 8.3.1.0
      • Make it build with ghc-9.6
    • Upgrade to optparse-applicative-fork-0.18.1.0 for parsing command line options

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-14-hydra + 2023-07-14-hydra + Fri, 14 Jul 2023 00:00:00 GMT + + High-level summary

    This week the team focused on exploring the event sourced persistence in order +to improve hydra-node performance. Because of this work the team noticed we +need to refactor the emit snapshot emission logic and update the spec in the +light of new changes. They also took the time to revisit their goals and product +plans for the next quarter as well as doing some security fixes related to +multisignatures.

    What did the team achieve this week

    • Finished spike about performance improvements of event sourced persistence #963.
    • Refactor snapshot emission in protocol logic.
    • Revisited our roadmap and goals.
    • Prepared and conducated a learning session on lean-waste.
    • Improve security of multi-signature checks, see this Github security advisory.
    • Implemented a cache friendly way to version our binaries #962.

    What are the goals of next week

    • Implement Event sourced persistence #913.
    • Remove deprecated internal commit #954 and close #728.
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-13-mithril + 2023-07-13-mithril + Thu, 13 Jul 2023 00:00:00 GMT + + High level overview

    The Mithril team created a new 2327.0 distribution. They focused on preparing the beta launch on the mainnet: they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the mainnet infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library.

    Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs.

    Low level overview

    • Released the new distribution 2327.0
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Add infrastructure monitoring #987
      • Worked on the issue Deploy 'mainnet' infrastructure #988
      • Worked on the issue Handle Secrets management #989
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Remove certificate hash from Artifact #932
      • Completed the issue Check vulnerabilities in CI #1037
      • Completed the issue Add 'created_at' in Mithril Stake Distribution messages #1030
      • Completed the issue Add a 'run-only' option in end to end test #1048
    • Worked on refactoring:
      • Completed the issue Factorize protocol crypto operations #669
      • Completed the issue Refactor aggregator dependency injection and services #1058
      • Completed the issue Build static binaries in CI #874
    • Worked on documentation:
      • Completed the issue Prepare SPO on-boarding guide #1049
      • Completed the issue Add instructions to set firewall using iptables #1040
      • Completed the issue Update ufw command to set firewall on Mithril Signer installation instructions #1041
    • Worked on bugs:
      • Completed the issue Aggregator does not detect certificate chain epoch gap #952
      • Completed the issue 'testing-preview' network does not create certificates #1015
      • Completed the issue SQLite compatibility in aggregator #837
      • Completed the issue Q&A followup fixes #1035
      • Completed the issue E2E tests are flaky in CI #1023
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-12-consensus + 2023-07-12-consensus + Wed, 12 Jul 2023 00:00:00 GMT + + High level summary

    This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a proposed fix. The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine.

    The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility.

    On the support front, the team drafted an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load.

    ]]>
    + consensus +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-12-performance-and-tracing + 2023-07-12-performance-and-tracing + Wed, 12 Jul 2023 00:00:00 GMT + + High level summary
    • Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed.
    • Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends.
    • Tracing: Optimization of the new tracing system is ongoing and yielding good performance results.
    • Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.

    Low level overview

    Benchmarking

    Our analysis of the GHC9 build of cardano-node has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation.

    In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into cardano-node. This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle.

    Infrastructure

    We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in master.

    Tracing

    Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance.

    Nomad backend

    For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run.

    Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to master.

    ]]>
    + performance-tracing +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-07-crypto + 2023-07-07-crypto + Fri, 07 Jul 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: First version of snark-based ATMS
    • mithril: Full node verifier
    • kes_agent: Keep progress, and prepare CIP and CPS
    • CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP

    Low level summary

    kes_agent

    Mithril

    • Final review of the implementation of Full Node Verifier #939. +Included benchmarks and further tests.

    Sidechains

    • Schnorr signature implemented
    • ATMS signature implemented
    • First benchmarks show that for the committe size we expect, we need 2^21 constraints.

    CIPs and community

    • Addressed some review comments in #PR506
    • Worked with the communityt on #PR524 to include Keccak as part of the next Plutus release.
    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-07-goedel + 2023-07-07-goedel + Fri, 07 Jul 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the teams have been working on finalising their ICE papers +for publication in EPTCS, formalising concensus, and investigating chain +sync.

    Details

    • Preparing final versions of ICE papers

    • Reviewing the chain sync design and documentation

    • Refactoring the thorn calculus

    • First draft of Praos specification

    • Developing bounding factors on timeouts

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-07-hydra + 2023-07-07-hydra + Fri, 07 Jul 2023 00:00:00 GMT + + High-level summary

    This week the Hydra team accomplished some nice progress. They secured the +network layer further by implementing authentication of the messages between the +peers in the Head protocol. In the process they also managed to separate +HeartBeat messages from the protocol ones which somewhat improved the quality of +code in Hydra. The team also finished work related to sending only transaction +ids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark +publishing on the website.

    What did the team achieve this week

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Add new endpoint for submitting client transactions
    • Remove commit from internal wallet
    ]]>
    + hydra +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-07-sre + 2023-07-07-sre + Fri, 07 Jul 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance.

    Some notable recent improvements include:

    • Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment
    • Explorer component updates
    • Spongix caching server rewrite for R2 Cloudflare support and various performance improvements

    Lower level summary

    Cardano-node

    Cardano-ogmios

    Cardano-ops

    • Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: cardano-ops-compare

    Cardano-rosetta

    Cardano-world

    Spongix

    • Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: spongix-simple-branch
    ]]>
    + sre +
    + + <![CDATA[Developer Experience Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-06-developer-experience + 2023-07-06-developer-experience + Thu, 06 Jul 2023 00:00:00 GMT + + High level summary

    The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements.

    Lower level summary

    build support & maintainance

    The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions.

    compiler upgrades

    Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests.

    Hydra Tools

    Our repository, input-output-hk/actions, has seen quite some improvements to facility the hydra <-> github integration.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of preliminary GHC 9.8 support.

    devx

    The devx repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our actions/devx GitHub Actions, we have a consistent set of tooling for

    • nix develop shells
    • GitHub CodeSpaces integration
    • VSCode DevContainer support
    • GitHub Actions integration

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    ]]>
    + devx +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-04-db-sync + 2023-07-04-db-sync + Tue, 04 Jul 2023 00:00:00 GMT + + High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested
    • Many devx issues resolved

    Lower level summary

    • We have improved and validated the design for the Conway integration in db-sync
    • Improved the initial integration of the UTxO-HD feauture branches which are under test
    • Prepared a new release 13.1.1.3 which supports node 8.1.1 +#1455.
    • This also fixes a bug +#1451
    • Added new tests to the new tx_out options +#1429
    • Fixed a chronic issue in db-sync related to exception handling and concurrency +This fixes many other issues and simplifies the logic in db-sync +#1447
    • A number of fixes and improvements in ci, docker, devx, docs +#1436#1442#1448#1452
    ]]>
    + db-sync +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-07-04-node-cli-api + 2023-07-04-node-cli-api + Tue, 04 Jul 2023 00:00:00 GMT + + 2023-06-21 - 2023-07-04

    High level summary

    • Started integration of conway era into the cardano-api,
    • Pre-release of cardano-cli 8.2.1 which enables creating goveranance "Update constitution" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.
    • Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities.
    • Continue refactoring cardano-testnet
    • CI and docs house keeping on the new cardnao-cli and cardano-api repositories

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-30-hydra + 2023-06-30-hydra + Fri, 30 Jun 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team wrote and published the monthly report for June, +implemented the end-to-end functionality for external commits, and tested it on +the preview environment. They also listed Hydra as a tool on the Cardano +developer portal, providing more visibility for the project. The team clarified +the path forward for L2 protocol improvements and explored an alternative CI +approach using cabal instead of nix. Additionally, they released version 0.11.0, +marking another milestone in the projects development.

    What did the team achieve this week

    • Written and published the monthly report for June
    • Implemented external commits end-to-end incl. tested it on preview #215
    • Listed Hydra as a tool on cardano developer portal
    • Cleared up path forward on L2 protocol improvements #728
    • Established an alternative CI using more cabal tools #923
    • Release version 0.11.0

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Complete ReqSn only sends transaction ids #728
    • Groom and plan last items for 0.12.0 (remove internal commit)
    • Improve reliability of benchmarks
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-29-mithril + 2023-06-29-mithril + Thu, 29 Jun 2023 00:00:00 GMT + + High level overview

    The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano mainnet infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator.

    Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1.

    Low level overview

    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Add infrastructure monitoring #987
    • Completed the epic Prepare Mithril Signer deployment model for SPO #862:
      • Completed the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
      • Completed the issue Adapt infrastructure to use Mithril Relay #1018
      • Completed the issue Announce the new signer deployment model in a dev blog post #1017
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on bugs:
      • Completed the issue Aggregator does not exit on critical error #993
      • Completed the issue Computation of master certificate of an epoch is incorrect #1006
      • Completed the issue End to end tests are flaky #954
      • Worked on the issue 'testing-preview' network does not create certificates #1015
    • Worked on optimizations:
      • Completed the issue Dates format is not standardized #946
      • Completed the issue Add 'recompute-certificates-hash' command to aggregator #1001
      • Completed the issue Add a retry mechanism for artifact creation in aggregator #984
      • Completed the issue Log node version at startup in Aggregator/Signer #944
      • Completed the issue Reactivate Publish Results job in CI #978
      • Completed the issue Clean 'pending_snapshot' directory of aggregator #983
      • Completed the issue Update OpenAPI spec examples #1000
    • Worked on refactoring:
      • Completed the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Refactoring client #982
      • Completed the issue Refactor download code in client #1010
      • Worked on the issue Factorize protocol crypto operations #669
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.1' #973
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-28-consensus + 2023-06-28-consensus + Wed, 28 Jun 2023 00:00:00 GMT + + High level summary

    During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team.

    The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components.

    Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node.

    Genesis

    • We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.

    • We decided on an approach of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team.

    UTxO-HD

    • We merged the last of the PRs that were part of UTxO-HD improvements for version 0.1: expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size.
    • We added a new "legacy" cardano block in a new ouroboros-consensus-cardano-legacy-block package that should ease the transition for some downstream packages to UTxO-HD, like db-sync. This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block.
    • We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.
    ]]>
    + consensus +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-28-performance-and-tracing + 2023-06-28-performance-and-tracing + Wed, 28 Jun 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9.
    • Infrastructure: The first batch of refactoring and documentation for our tx-generator has been merged to master.
    • Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown.
    • Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.

    Low level overview

    Benchmarking

    The compiler switch to GHC9 as the default build platform for cardano-node and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard.

    Using the forge-stress approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node.

    Infrastructure

    The tx-generator is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to master. Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base.

    Tracing

    The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue.

    Nomad backend

    With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress.

    Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend.

    ]]>
    + performance-tracing +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-23-goedel + 2023-06-23-goedel + Fri, 23 Jun 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the teams presented two papers at ICE 2023.

    Details

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-23-hydra + 2023-06-23-hydra + Fri, 23 Jun 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team shared progress updates during the monthly review +meeting (monthly report and video recording available soon) and started +experimenting on preview network with the new commit from external wallet +feature.

    What did the team achieve this week

    • Monthly report & review meeting, demonstrating commit from external +wallet
    • Published regular benchmarks for +Hydra
    • Moved forward the journey for external commits using multiple script UTxOs +#903
    • Changed the API to only put transaction id in snapshots, instead of the full +transactions #922 -> this +is now evolved into fully addressing #728
    • Fuel marking is now optional as one can now commit from an external wallet +#924
    • Add flag option to display node version on tui +#934

    What are the goals of next week

    • Complete external commits using multiple script UTxOs #903
    • New release 0.11.0
    • Dirtroad solution of improved persistence performance #913
    ]]>
    + hydra +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-23-network + 2023-06-23-network + Fri, 23 Jun 2023 00:00:00 GMT + + Network Update

    Key contributions

    We held a series of session to review the implementation of big ledger peers +(eclipse evasion). See #4462.

    We get a request from a 3rd party to clarify an inconsistency between CDDL spec +and protocol implementation. We worked out a nice solution which takes +advantage of the any notion available in CDDL. On the Haskell side we +provide Any type which gen generate almost any CBOR term (some are excluded +only because they are not decoded back to the same form, and we relay on that +property). See #4580.

    We fixed a bunch of problems of the cardano-cli ping command. It also now has +a limited support of node-to-client mini-protocol (the -c option is +ignored, as it cannot be supported by node-to-client protocol). Note that +the format of messages has changed, timestamps are printed in ISO8601 format. +See #4601, #5326, #5313, #30

    In order to provide a new flag in the topology file which enables ledger peers +when the chain is close to the tip, we continued to work on #4530. This is +currently in review, the consensus team will need to provide us with the new +api. This feature is useful for two reasons: makes it easier to maintain +a topology file, it will also limit the traffic on public roots generated by +for example full node wallets and distribute it to ledger peers.

    We also continued to work on a blog post which describes the journey of design +& implementation of the dynamic P2P network layer. Too be announced soon :).

    Other smaller changes

    We limit the concurrency of resolving dns names. Up to 8 root peers or ledger +peers DNS names are resolved concurrently, and at most 2 local root peer DNS +names. See #4596.

    We fixed handshake query timeout in #4603.

    We renamed one of the block-fetch decision constructors as requested by the +consensus team, see #4608.

    ]]>
    + network +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-23-sre + 2023-06-23-sre + Fri, 23 Jun 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:

    • A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality
    • Cardano Sanchonet environment was stood up to test Conway era functionality
    • Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case
    • Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments

    Lower level summary

    Cardano-node

    • Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: cardano-node-pull-5318

    Cardano-ops

    Cardano-world

    Ci-ops

    Ci-world

    • Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ci-world-compare

    Devx-ci

    • A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: devx-ci-repo

    Iohk-nix

    ]]>
    + sre +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-16-hydra + 2023-06-16-hydra + Fri, 16 Jun 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team focused their efforts on continuing to investigate and +experiment operating a head on mainnet. They collected several bugs and issues +and worked on fixing them. Now the team is soon to release a new version, +0.11.0, which comes with a lot of improvements and bug fixes.

    What did the team achieve this week

    • Restored and fixed a bug which stalled our head on mainnet #927
    • Solved one user issue #914
    • Reduced significantly local state size and logs by removing the full scripts from it #928
    • (pending review) Reduced snapshot size in the API, by only including tx ids #922

    What are the goals of next week

    • New release 0.11.0
    • Monthly report & review meeting.
    • Fix some minor bugs discovered when operating our head on mainnet
    • Complete journey for external commits using multiple script UTxOs #903
    • Publish benchmarks and provide regular benchmarks for Hydra #186
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-15-mithril + 2023-06-15-mithril + Thu, 15 Jun 2023 00:00:00 GMT + + High level overview

    The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client’s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet.

    Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI.

    Low level overview

    • Completed on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Create the sub-command for 'Mithril Stake Distribution' in client #896
      • Completed the issue Adapt end to end tests to handle new types of data #899
      • Completed the issue Update client documentation #897
      • Completed the issue Update architecture documentations for new types of data #898
      • Completed the issue Refactoring client #960
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Enhance terraform infrastructure #930
    • Completed the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Check performance impact of new stake distribution command on the 'mainnet' #962
    • Worked on the epic Prepare Mithril Signer deployment model for SPO #862:
      • Worked on the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
    • Worked on bugs and optimizations:
      • Completed the issue Aggregator does not always detect new immutable file #953
      • Completed the issue CI tests fail with Rust '1.70.0' #958
      • Worked on the issue End to end tests are flaky #954
      • Worked on the issue Certificate dates in metadata are not on the same timezone #946
      • Worked on the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Fix 'Mithril Client multi-platform test' with new client interface #956
      • Completed the issue Enhance 'ImmutableDigesterError::NotEnoughImmutable' error #969
      • Completed the issue Client 'snapshot download' command fails with option '--download-dir' #979
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-14-consensus + 2023-06-14-consensus + Wed, 14 Jun 2023 00:00:00 GMT + + High level summary

    The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the Byron and TPraos eras do not need to be checkpointed for an MVP. +There is one remaining question (which applies also to the Praos era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated "Limit on Patience" timeout sufficiently bounds how long the adversary can inflate a victim's overall sync time.

    On the UTxO-HD front, the prototype branch was rebased on top of the latest ouroboros-consensus main branch and integrated on top of cardano-node 8.1.1-pre. As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD. +We managed to run a node again with UTxO-HD enabled. +We also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for cardano-node, which uncovered a performance regression on the Network component when using GHC-9.2/9.4. This is being addressed.

    Regarding our support activities, we Released fs-sim-0.2.0.0 and are in the process of preparing the 8.2 release of cardano-node. We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests.

    ]]>
    + consensus +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-14-performance-and-tracing + 2023-06-14-performance-and-tracing + Wed, 14 Jun 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We've continued release benchmarking and established a new baseline for 8.0.0.
    • New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined.
    • Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.

    Low level overview

    Benchmarking

    In our release benchmarking cycle, we established a new performance baseline for 8.0.0. Additionally, we've measured +performance under various workloads for 8.1.1-pre; the results look promising and validate the optimization efforts +done on several system components.

    In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for +benchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper.

    Tracing

    The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be +meaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific +trace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles.

    Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD.

    Nomad backend

    As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs.

    This means the backend is entering validation phase, where we systematically compare all metrics taken from the new +infrastructure to the existing ones, including determining reproducibility and variance.

    ]]>
    + performance-tracing +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-12-network + 2023-06-12-network + Mon, 12 Jun 2023 00:00:00 GMT + + Network Update

    Key contributions and advances

    We merged light peer sharing feature, which allows to include inbound peers +into outbound governor known peers. This is the primary way for new +unregistered nodes to enter the network, which then can be shared using peer +sharing. Note that peer sharing is an experimental feature which is disabled +until genesis & eclipse evasion as fully implemented. See #3596.

    We are making progress reviewing eclipse evasion, #3886.

    We fixed another bug in local root peers. We found out that if the local roots +where ignored until the first domain name was resolved, see #4583. The bug +fix was backported and released in ouroboros-network-0.8.1.1.

    We re-started working on dynamically enabling block forging to address issue +#3159, which will enable us to release P2P on block producing nodes. See #140.

    New cardano-ping / cardano-cli ping release

    We prepared a new release of cardano-ping library which supports the new +query feature (query supported versions). See #4589, #4593 and #5313. +The new version of cardano-cli ping will use ISO8601 formatted +timestamps; also the formatting of ping results is slightly improved, and it +will introduce the new --query-versions (-Q) switch. If the remote site +supports the query parameter, the command will print:

    redacted-ip:port network rtt: 0.064
    redacted-ip:port handshake rtt: 0.064010896s
    redacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat
    orAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]

    otherwise it will print the negotiation results

    redacted-ip:port network rtt: 0.045
    redacted-ip:port handshake rtt: 0.101867615s
    redacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder

    Note that in that case cardano-cli ping offers InitiatorAndResponder, which +allows us to detect whether the remote side is an InitiatorOnly or +InitiatorAndResponder. Also cardano-cli ping will no longer announce +itself as InitiatorAndResponder, except for the case mentioned above.

    Other smaller contributions

    On a request from the Marlow Team, we published haddocks of typed-protocols, +which are now available here (#40, #41).

    We made a new release of strict-stm-1.1.0.1 on Hackage, which fixed a bug in +package description file, #101 .

    We also helped to debug a deadlock when using named pipes on Windows in the new +RawBearer API. The API is being used to store secret keys only in memory. +The PR #4395 is under review.

    We also have two more PRs which are under review:

    • #4530: enabling ledger peers on a fixed number of slots before the tip of the chain;
    • #4580: a PR which fixes inconsistencies in one of our cddl specs.
    ]]>
    + network +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-09-crypto + 2023-06-09-crypto + Fri, 09 Jun 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: E2E tests for BLS bindings and KES agent
    • Sidechains: Implement ECC chip and Rescue hash primitives for ATMS
    • mithril: Full node verifier

    Low level summary

    cardano-base

    • RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); blocked due to issue with windows' localSnocket. Trying to resolve.
    • Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors #317.
    • Above, blocked by the simplification of typeclasses #404.
    • Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings

    Mithril

    • Implementation of Full Node Verifier #939

    Sidechains

    • ECC chip implemented for JubJub over BLS12-381
    • Rescue chip implemented for hashing.
    • Currently working on Schnorr signature (which uses the above constraints)
    ]]>
    + crypto +
    + + <![CDATA[Developer Experience Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-09-developer-experience + 2023-06-09-developer-experience + Fri, 09 Jun 2023 00:00:00 GMT + + High level summary

    The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements.

    Lower level summary

    build support & maintainance

    Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure LoadDLL errors to blst integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like cardano-base experiencing significant reductions in CI complexity.

    compiler upgrades

    After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility.

    CHaP (cardano-haskell-packages)

    We relocated the underlying tooling, (foliage), for CHaP into the IOG organization. Furthermore, we have introduced improved tooling to quickly add constraints to packages, better error reporting for add-revision and better hackage url compatibility to facilitate easer usage of CHaP.

    GitHub Actions

    Our repository, input-output-hk/actions, now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the base and haskell install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking cabal.

    iohk-nix

    The iohk-nix repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, sodium, blst, and secp256k1, are also fixed to certain revisions within the iohk-nix repository.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to gmp.

    devx

    The relatively new devx repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The devx repository's readme has been updated to reflect its purpose and usage guidelines.

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    ]]>
    + devx +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-09-hydra + 2023-06-09-hydra + Fri, 09 Jun 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team worked on multiple fronts. They finished the +investigation about the broken head on mainnet and re-opened their persistent +head instance. The team also fixed the monthly report publication on their +website and started sketching ideas and further improvements. Also, they are on +the last mile to deliver a new feature which will allow parties to commit funds +from extern wallets. Finally the team started to work on optimizing the +performance on their benchmarks.

    What did the team achieve this week

    • Finished investigation on broken head on mainnet #897 and re-opened it.
    • Added support for externally committing regular utxo #887
    • Fix monthly report publication on docs website and published the monthly report. Odd problems when publishing monthly report:
      • Make us think about if we should change something about the website #908
      • Open issue to docusaurus #9036
    • Fixed a bug in the benchmark process #910
    • Explored performance of the hydra-node{.verbatim} and identified a +bottleneck.
    • Timed transaction feature is being used by the auction project 🎉

    What are the goals of next week

    • Complete performance analysis and start/plan improvements and provide +regular benchmarks for Hydra #186
    • Add hydra as tool to developer platform #872.
    • Authenticate network messages #727.
    • Complete journey for external commits using multiple script UTxOs #903
    • Start implementing Option B for external commits #215.
    ]]>
    + hydra +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-08-db-sync + 2023-06-08-db-sync + Thu, 08 Jun 2023 00:00:00 GMT + + High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2
    • A new hire will help us with devx issues.

    Lower level summary

    ]]>
    + db-sync +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-08-goedel + 2023-06-08-goedel + Thu, 08 Jun 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on giving and preparing public +talks, also on preparing final versions of their ICE 2023 papers, and +on analysing chain selection.

    This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

    Details

    ]]>
    + goedel +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-08-sre + 2023-06-08-sre + Thu, 08 Jun 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer.

    Lower level summary

    Bitte

    • Equinix bare metal capability was added to bitte: bitte-pull-194
    • Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: bitte-pull-201

    Bitte-cells

    Cardano-graphql

    Cardano-node

    Cardano-ops

    Cardano-world

    Ci-ops

    • Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ci-ops-pull-108

    Ci-world

    Cicero

    • Implement a cicero webhook backoff with exponential decay plus jitter: cicero-pull-79

    Iohk-nix

    Openziti

    ]]>
    + sre +
    + + <![CDATA[System Test Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-08-system-test + 2023-06-08-system-test + Thu, 08 Jun 2023 00:00:00 GMT + + High level summary

    Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.7 and 8.0.0 releases.

    Workstreams

    Full list of closed PRs

    Framework improvements:

    • Make cardano-submit-api REST API service available and run corresponding regression tests by default
    • Update cabal build testing for 8.0.0
    • Add support for testing governance SPO poll
    • Use Poetry for Python dependency management
    • Check status of known GH issues during tests runtime and finish the test accordingly
    • Generate topology files with both IP addresses and DNS names
    • Log issues like failure to start a cluster instance and report errors during tests runtime

    Testing improvements

    • Add rollback testing:
      1. global consensus is reached after rollback, in situation where less than securityParam blocks were produced since cluster split
      2. global consensus is not reached when more than securityParam blocks were produced, and the result is permanent fork
    • Add tests to governance SPO poll commands

    Node:

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests
    ]]>
    + system-test +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-07-node-cli-api + 2023-06-07-node-cli-api + Wed, 07 Jun 2023 00:00:00 GMT + + 2023-06-07 - 2023-06-20

    High level summary

    • Completed cardano-cli migration to input-output-hk/cardano-cli
    • cardano-cli ping now uses cardano-ping-0.2.0.5
    • New queries on API:
      • queryCurrentEpochState
      • queryDebugLedgerState
      • queryGenesisParameters
      • queryPoolDistribution
      • queryPoolState
      • queryProtocolParameters
      • queryProtocolParametersUpdate
      • queryProtocolState
      • queryStakeAddresses
      • queryStakeDistribution
      • queryStakePoolParameters
      • queryStakeSnapshot
    • Deprecate:
      • queryPparams
    • Export query API as functions
      • genFeatureValueInEra
      • featureInShelleyBasedEra
      • isFeatureValue
      • valueOrDefault
      • asFeatureValue
      • asFeatureValueInShelleyBasedEra
      • queryEpoch
      • requireShelleyBasedEra
    • Restructure cardano-testnet (WIP)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-02-hydra + 2023-06-02-hydra + Fri, 02 Jun 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team has put their effort on finding solutions on many +different problems, such as our broken head on mainnet +#897, our fragile monthly +report publications on the website and implementing Option A for +external commits #215. +Although most of these items are still open, huge progress has been made. To +accelerate the investigation, they improved their logging to give more precise +errors when a transition requirement fails, and to reduce duplication on effets +logged content. Last but not least, the team is exploring formal methods and +attended a workshop on formalizing cryptographic protocols in Agda.

    What did the team achieve this week

    • Continued investigating broken head and opened an issue to keep track #897.

      As part of this issue, improvements were made to the node logs:

      • Give a precise error when a transition requirement fails #895.

      • Reduce duplication for effects logged content by using sequential eventId and effectId pair #896.

    • Fixed references in the hydra specification #893.

    • Attended a workshop on formal methods and crypto in Agda.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete journey for external commits implementing Option A and start implementing Option B #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.
    • Fix monthly report publication on docs website.
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-06-01-mithril + 2023-06-01-mithril + Thu, 01 Jun 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2321.1 distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots.

    Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks.

    Low level overview

    • Released the new distribution 2321.1
    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Enhance MessageAdapter for Artifact in aggregator REST API #925
      • Completed the issue Create the sub-command for 'Cardano Immutable Files Full' in client #895
      • Completed the issue Enhance state machines Aggregator/Signer #933
      • Completed the issue Adapt the aggregator REST API to list certificates #892
      • Worked on the issue Adapt end to end tests to handle new types of data #899
      • Worked on the issue Update client documentation #897
      • Worked on the issue Update architecture documentations for new types of data #898
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Enhance terraform infrastructure #930
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Upgrade Cardano node to '8.0.0' #920
    • Completed the issue Add export path in Client CLI #512
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-31-consensus + 2023-05-31-consensus + Wed, 31 May 2023 00:00:00 GMT + + High level summary

    During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see this issue). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain.

    On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano.

    UTxO-HD

    • We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking SOP classes like HPure and HAp . In short, we implement generalised versions of important classes like Applicative and Traversable.

    Support

    • fs-sim-0.1.0.2 and fs-api-0.1.0.2 were released, which makes them now compatible with GHC up to 9.6.
    • ouroboros-consensus-0.7.0.0 was released for cardano-node 8.1, including query serialization fixes for backwards compatibility.
    ]]>
    + consensus +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-31-performance-and-tracing + 2023-05-31-performance-and-tracing + Wed, 31 May 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster.
    • New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism.
    • Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.

    Low level overview

    Benchmarking

    The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build +configuration: As it stands, the ghc-bignum package is using the Haskell native-backend as a default. We strive +to benchmark a build with the gmp-backend next.

    A variant of our forge-stress local benchmark has been set up to serve as an early indicator for the resource usage profile +we'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way +shorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great +support when evaluating different compiler versions or RTS flags incrementally.

    Tracing

    The hub of the new tracing system cardano-tracer is designed with a fixed output behaviour, which is limited to various +logging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to +directly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all.

    Nomad backend

    We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with +job definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing +benchmarking run required us to fine-tune communications with the nomad server.

    Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible +and offers more detailed insight than the previous iteration in cardano-ops. The backend will enable you to formulate +very specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met.

    ]]>
    + performance-tracing +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-26-goedel + 2023-05-26-goedel + Fri, 26 May 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

    Details

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-26-hydra + 2023-05-26-hydra + Fri, 26 May 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team accomplished several important tasks. They held their +monthly review meeting and drafted the report for May. They made progress on +implementing the first end-to-end journey for external commits using "Option A" +for normal UTxOs, while still considering "Option B". The team also integrated a +Spanish translation contributed by the community, created micro-benchmarks for +transaction validation and deserialization, and made improvements to +hydra-node's version reporting. Last but not least, they implemented the ability +to commit multiple UTxOs to a head at once.

    What did the team achieve this week

    • Held the monthly review meeting (recording + slides) & drafted the report for May.
    • Have a first end-to-end journey for external commits implementing Option A +for normal UTxOs #887 (still considering Option B).
    • Integrated the spanish translation #866.
    • Created micro-benchmarks for transaction validation and deserialization #884.
    • Improve hydra-node version reporting on non-released builds #849
    • Some minor CI improvements following up last weeks changes.
    • Allow commit transactions with multiple UTxO #774.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete external commits with script UTxOs #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-26-ledger + 2023-05-26-ledger + Fri, 26 May 2023 00:00:00 GMT + + High level summary

    The ledger team made progress on the conway ledger era. In particular, the design and implementation +of the new certificates is near complete, we refactored some of our data structures +to be able to support DReps, we cleaned up the serialization format, and renamed things to make +clearer the differences with Shelley.

    The team also completed integration work for the next node release, namely 8.1.0. +And, as always, we continue to address technical debt.

    Low level summary

    Conway progress

    • pull-3408 - Improve conway delegation certificates
    • pull-3428 - Get rid of Constitutional in favor of Genesis and Committee
    • pull-3426 - Add DRep to internal data struture (UMap)
    • pull-3425 - Improve witness logic needed for conway
    • pull-3423 - Rename ShelleyDelegCerts constructors to distinguish them from Conway
    • pull-3421 - Rename DCert -> TxCert
    • pull-3454 - conway CDDL minor fixes

    Improve testing

    • pull-3403 - Add Plutus script context golden tests

    Integration work

    • pull-3410 - Update chaps index
    • pull-3416 - Bump cardano-ledger-alonzo-test version
    • pull-3414 - Bump cardano-ledger-shelley-test minor version
    • pull-3420 - Bump cardano-ledger-shelley-ma-test version
    • pull-3441 - Release cardano-ledger-[alonzo|babbage]-1.2.1

    Technical debt

    • pull-3409 - Unit test - no such thing as a reference datum
    • pull-3407 - Fixup release process documentation
    • pull-3404 - Create TotalDeposits events during all eras
    • pull-3402 - Fix broken references in the Shelley spec
    • pull-3424 - Remove no longer used cardano-ledger-shelley-ma package
    • pull-3432 - Add an example on how to bump up versions in the changelog
    • pull-3440 - Revert back to the group serialization for ProtVer for PParams
    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-26-network + 2023-05-26-network + Fri, 26 May 2023 00:00:00 GMT + + High level summary

    We continued working on eclipse-evasion. We also analysed and fixed a bug +when using DNS names in local root peers. We continued working on engineering +blog post about P2P. We released a new version of packages for +cardano-node-8.1.0 release.

    We improved our CI, removed obsolete scripts add extra validation which checks +if CHANGELOG.md files were updated.

    We also improved release scripts.

    Detailed summary

    • Eclipse evasion: #4462
    • Local root peers bug fix: #4559
    • Release to CHaP: #4573
    • CI improvements: #4572
    • Release script improvements: #4573
    ]]>
    + network +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-24-node-cli-api + 2023-05-24-node-cli-api + Wed, 24 May 2023 00:00:00 GMT + + 2023-05-24 - 2023-06-06

    High level summary

    • The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released.
    • We provided assitance where needed in the release
    • An integration repository https://github.com/input-output-hk/fusion-flamingo was created to enable my team to more easily work on cardano-cli and cardano-api

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-19-hydra + 2023-05-19-hydra + Fri, 19 May 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the "Coding Standards" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.

    What did the team achieve this week

    • Complete validation of timed transactions feature #196.
    • Write ops instructions and troubleshooting #569 and improve logs.
    • Remove --ledger-genesis argument to hydra-node options #863.
    • Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows #877.
    • Use nix to build test binaries to increase CI speed #867.
    • Updated our Coding Standards.

    What are the goals of next week

    • Monthly report & review meeting.
    • Have a first end-to-end journey for external commits implementing "Option A" #215.
    • Integrate spanish translation #866.
    • Improve and provide regular benchmarks for Hydra #186.
    • Allow commit transactions with multiple UTxO #774.
    • Explored stateless observation and refined hydra explorer ticket #696.
    ]]>
    + hydra +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-17-consensus + 2023-05-17-consensus + Wed, 17 May 2023 00:00:00 GMT + + High level summary

    During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the [Genesis][#genesis] section for more details.

    Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our main branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain.

    We improved our tooling by releasing an immutable DB server, which can be used for testing and benchmarking purposes, and a db-truncater program, which can be used in disaster recovery and benchmarking scenarios.

    Genesis

    The consensus team working on Genesis:

    • Improved the genesis selection rule as a result of our interaction with IO Research.
    • Studied how the hard-fork combinator handles forecasting at era transitions, and improved our documentation.
    • Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP.
    • Elaborated concrete proposal for the Genesis State Machine.
    • Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).

    The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine.

    ]]>
    + consensus +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-17-mithril + 2023-05-17-mithril + Wed, 17 May 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2318.0 distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types.

    Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node 8.0.0 (along with the backward compatibility for previous 1.35.x versions).

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the handling of multiple types of signed entity in the aggregator runtime #907
      • Completed the adaptation of the signer runtime to use the signable builder service #854
      • Completed the adaptation of the aggregator runtime to use the artifact builder service #869
      • Completed the appending of the next AVK to all protocol messages #888
      • Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced #893
      • Completed the adaptation of the explorer to handle new artifact routes of the aggregator #927
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the implementation of the new stake distribution computation in the chain observer #919
      • Worked on upgrading the Cardano node to 8.0.0 #920
    ]]>
    + mithril +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-17-performance-and-tracing + 2023-05-17-performance-and-tracing + Wed, 17 May 2023 00:00:00 GMT + + High level summary
    • Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes.
    • New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due.
    • Analysis pipeline: First steps on implementing incremental analysis have been untertaken.
    • Open Sourcing: Exhaustive dataflow charts for both our analysis tool locli and our workbanch have been merged to master
    • Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster.
    • P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland.
    • Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.

    Low level overview

    Benchmarking

    As a compiler switch to GHC 9.2.7 for cardano-node's default build environment is around the corner, we're setting up our benchmarking cluster to +handle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This +also involves choosing a reliable baseline as reference point for inter-version comparisons.

    Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet, +we strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to +be balanced against resource demand for all our cluster's nodes.

    Tracing

    For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some +quality-of-life details that have changed required us to revision the system documentation.

    Analysis

    As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been +normally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a +huge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken.

    Open Sourcing

    A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking +copmonents more accessible. As a result, detailed charts for both our LogObject CLI locli and our workbench have been merged to master.

    Nomad backend

    While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting +those profiles of our workbench that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality +of the nomad cloud backend.

    Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster.

    Performance & Tracing Meetup

    We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive +days together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future. +Also, it was a great opportunity to finally meet in person.

    Offboarding

    Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation +of team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!

    ]]>
    + performance-tracing +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-12-crypto + 2023-05-12-crypto + Fri, 12 May 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: Include final tests for BLS signature. Further adaptations for KES agent.
    • Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.

    Low level summary

    cardano-base

    Sidechains

    • Opened PR in halo2curves to include BLS12-381 and JubJub, #38
    • Addition constraint over JubJub merged #10
    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-12-goedel + 2023-05-12-goedel + Fri, 12 May 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team had two paper accepted for ICE 2023 +(https://www.discotec.org/2023/ice). The event will be held in Lisbon +on 19th June 2023. The papers will be published in EPTCS.

    Details

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-12-hydra + 2023-05-12-hydra + Fri, 12 May 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team achieved a number of milestones, including the release +of the first mainnet compatible version. Besides this they also addressed +inconsistencies in rollback handling, added an architecture page to the website, +reducing the size of logs using event IDs. They also had productive discussions +with researchers on plans for incremental commits/decommits and had a whiteboard +session on DeFi and lending protocols. The goals for next week include +completing the validation of the timed transactions feature, exploring stateless +observation, refining the Hydra explorer ticket, writing ops instructions and +troubleshooting, and implementing the first end-to-end journey for external +commits.

    What did the team achieve this week

    • Released first mainnnet compatible version 0.10.0
    • Addressed inconsist handling of rollbacks #784
    • Added architecture page and fixed haddock links on our website #838
    • Opened a new hydra head on mainnet
    • Talked with researchers on initial plan for incremental commits/decommits
    • Had a Whiteboard session on DeFi and lending protocols
    • Reduced size of logs using event ids #859
    • Published the monthly report for April

    What are the goals of next week

    • Complete validation of timed transactions feature #196
    • Explored stateless observation and refined hydra explorer ticket #696
    • Write ops instructions and troubleshooting #569 and improve logs
    • Have a first end-to-end journey for external commits implemented #215
    ]]>
    + hydra +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-12-network + 2023-05-12-network + Fri, 12 May 2023 00:00:00 GMT + + High level summary

    We started working on a new way to switch between root & ledger peers (see +below). We continued to work on eclipse-evasion. We merged changes to +Handshake contributed by Galois Inc. We made improvements to our tests (fixed +a flaky test, added cddl specs for NodeToNodeVersionData and +NodeToClientVersionData). We improved our CI and automated the process of +releasing new package version to CHaP.

    Detailed summary

    We continued to work on testing eclipse-evasion.

    We came up with an idea to limit how full node wallets relay on root peers +(currently operated by IOG, in future also CF and Emurgo). We designed +a switch to use ledger peers if the node tip is close enough to the current +time. For more details see #4530.

    We merged changes to the handshake mini-protocol which allow one to query +server's node-to-node / node-to-client parameters. We are grateful to +Galois Inc. for implementing it, #4256 and #4538. We published new version +of packages to CHaP chap-#253.

    We added DiffusionError wrapper. Thanks to it, ouroboros-consensus will +not duplicate diffusion errors messages in the log, #4537.

    We fixed an issue which caused one of our tests to be flaky, #4515.

    We added cddl tests for NodeToNodeVersionData and NodeToClientVersionData: +#4540, #4544 (in review).

    We wrote scripts which will help us release packages as well as verify that we +released all the package necessary to build the newest set of packages, +#4542.

    We renamed the consensus startup tracer and make sure it doesn't log +ExitSuccess exceptions, consensus-#71.

    We reviewed PR which adds RawBearer API, #4395.

    We made series of improvements to our CI:

    • #4539: we don't need to install cryptographic libraries in CI;
    • #4545: Javier Sagredo (consensus) cleaned up CI after consensus moved +to a new repo;
    • #4546: we switched to use GitHub merge queues;
    • #4549: we made it possible to trigger building haddocks manually;
    • #4553: we fixed and enhanced caching of building dependencies.
    ]]>
    + network +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-05-ledger + 2023-05-05-ledger + Fri, 05 May 2023 00:00:00 GMT + + High level summary

    The ledger team focused mainly on the conway ledger era and node integration. +For conway, we completed a large structural change that now allows +for delegation certificates to be parameterized by era, and introducing +new certificates for the first time since Shelley. +We also continue to build out our contraint based generators that we will +use to property test the conway era. +In particular, we can now generate an entire ledger state and a +transaction which is balanced with respect to the ledger state.

    Low level summary

    Conway certificates

    Certificiates are now abstracted as a type family in the ledger codebase. +Moreover, there are new certificates in the Conway era to support CIP-1694, +and MIR certificates have been removed.

    Constraint based testing

    Our plan for property testing in the conway era is to no longer use the trace generators, +but instead generate ledger states and transactions based on constraints. +We hit a milestone this week, namely the ability to generate a balanced transaction in the context +of a ledger state, all based on our ever growing constaint language.

    Integration work

    Technical debt

    ]]>
    + ledger +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-05-node-cli-api + 2023-05-05-node-cli-api + Fri, 05 May 2023 00:00:00 GMT + + 2023-05-05 - 2023-05-23

    High level summary

    • Golden tests for cardano-cli command help output were added.
    • Documentation was updated with new libsodium installation instructions.
    • There were several updates for the cardano-cli:
      • Deletion of the deprecated shelley command group.
      • Addition of golden tests for CLI help.
      • An improvement to avoid bare IO in tests, allowing better error reporting in failed tests.
      • Generation of UTCTime test values without leap seconds (avoids erroneous test failures)
      • Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32.
    • The cardano-api underwent multiple refinements:
      • Implementing deposit handling when balancing transactions (necessary for Conway)
      • Cleaning up socket file path code.
    • Several changes were made to the cardano-testnet:
      • Adding golden tests for cardano-testnet help.
      • Removing all hardcoded yaml files in cardano-testnet
      • Improving cardano-testnet help output.
      • Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-04-mithril + 2023-05-04-mithril + Thu, 04 May 2023 00:00:00 GMT + + High level overview

    The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version 1.35.7.

    Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain.

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the implementation of the Certifier service in the aggregator #850
      • Completed the implementation of the signable builder for the Mithril Stake Distribution #851
      • Completed the implementation of the artifact builder for the Mithril Stake Distribution #870
      • Completed the implementation of the signable builder for the Full Immutables Snapshot #852
      • Completed the implementation of the artifact builder for the Full Immutables Snapshot #871
      • Completed the adaptation of the aggregator runtime to use the signable builder service #853
      • Worked on the adaptation of the signer runtime to use the signable builder service #854
      • Completed the definition of the entity service interface for verification/restoration #868
      • Completed the refactoring of the OpenMessage type #878
    • Completed the epic that simplifies the multi-signer in the aggregator #398:
      • Completed the extraction of the single signature registration from the multi-signer #643
    • Completed the upgrade of the Cardano node to version 1.35.7 #881
    • Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators #873
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-03-consensus + 2023-05-03-consensus + Wed, 03 May 2023 00:00:00 GMT + + High level summary

    During the past two weeks we made some important progress in the Genesis design. +It seems the BlockFetch logic need not be modified for Genesis, although this +needs to be confirmed. We started a DoS mitigation handbook and updated our +conceptual component diagram to guide the Genesis design. We engaged with the +IOG researchers to work on the Limit on Patience attack vector, work in this +area is still ongoing. We sketched a design to decouple the CPU load of the node +from its responsiveness to the socket. Finally, we discussed with Networking our +approach to lower the performance impact of the BlockFetch decision logic, and +got green light from them.

    We migrated the consensus code to a new +repository, splitting +it from the ouroboros-network repository, and released version 0.6 of +Consensus.

    We also merged the mempool fairness improvement to main branch.

    Another significant enhancement to our documentation was the addition of an +explanation of the hardfork combinator forecast horizon.

    See the sections below for more details.

    Genesis

    We reviewed the BlockFetch design documentation, and added some source-code +comments that emphasize certain properties of the decisions the BlockFetch +logic makes that are helping us confirm that Genesis does not require any +changes to BlockFetch. We are waiting on input from our former system +architect to verify this.

    We migrated and updated the conceptual component diagram in the ouroboros-consensus +repository which helps us situate the Genesis design and argument.

    We engaged with the IOG researchers about the Genesis design. We sketched out a +way to address the concern that the Limit on Patiente (LoP) attack vector duty +cycle is indeed low, but it's still non-trivial to ultimately conclude it's +sufficiently low.

    We also sketched a design to decouple the CPU load of the node from its +responsiveness to the socket, since the LoP is a relatively tight timeout, and +node performance bugs inducing seconds-worth of latency are unfortunately +familiar phenomena.

    Fostering collaboration

    We added an +explanation of +a question that we had to explain many times about the exact behavior of the +hardfork combinator forecast horizon.

    ]]>
    + consensus +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-03-performance-and-tracing + 2023-05-03-performance-and-tracing + Wed, 03 May 2023 00:00:00 GMT + +
  • Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.
  • New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint.
  • Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on.
  • Infrastructure: The plutus-apps flake input for cardano-node has finally been removed.
  • Nomad backend: A PR implementing placement of benchmarking clusters has been merged.
  • Benchmarking

    The performance investigations on the 8.0 release branch have lead to pinpointing and addressing incosistent behaviour. For that, +we created yet another local reproduction with the workbench's forge-stress benchmark.

    Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into 8.0 and +subsequent releases.

    Additionally, we've refined the trace-bench family of profiles that target benchmarking our own new tracing system.

    Tracing

    Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally +intended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant +conversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system.

    Infrastructure & Analysis

    Dataflow documentation

    The LogObject CLI locli is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate +further development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting.

    Remove redundant Plutus flake input

    This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input, +we simplify the dependency graph for cardano-node, as well as enable immediate feedback when developing Plutus benchmarks.

    Nomad backend

    Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking. +This capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along +with various quality-of-life improvements, has been merged to master.

    ]]>
    + performance-tracing +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-05-01-db-sync + 2023-05-01-db-sync + Mon, 01 May 2023 00:00:00 GMT + + High level summary

    Lower level summary

    • Prepared a schema change which is expected to speed up queries and help clients +#1389.
    • Ran a big number of benchmarks on the above to evaluate if this change is reasonable.
    • Performance optimization related to rewards +#1382
    • Using the cache in more places to reduce recourses usage +#1380
    • Evaluated risks related to UTXO-HD integration
    • Worked on a feauture request to split the tx_out to an address table +#1396
    • Worked on another feauture request to prune the consumed entries from the tx_out table +#1398
    • Prepared for CIP-1694 integration
    ]]>
    + db-sync +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-28-crypto + 2023-04-28-crypto + Fri, 28 Apr 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library.
    • KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction.
    • Sidechains: Started implementing ECC chip of JubJub over BLS12-381.

    Low level summary

    cardano-base

    • #255 finally merged 🎉
    • Additional tests for BLS bindings #384
    • Open PR for including test vectors created with zkscrypto's library, PR#397

    KES agent

    • Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period PR#389.
    • Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) #317.
    • Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim
    • Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes
    • Refactor MonadSodium into MonadMLock PR#388.

    Sidechains

    • Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)
    • Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo
    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-28-goedel + 2023-04-28-goedel + Fri, 28 Apr 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is working on porting an existing formalisation of Ouroboros +Praos to a newer foundation.

    Details

    ]]>
    + goedel +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-28-network + 2023-04-28-network + Fri, 28 Apr 2023 00:00:00 GMT + + High level summary

    The networking team has released the following packages to Hackage:

    We published an announcement blog post. We made progress +also on another blog post which will describes the design of the P2P networking +layer.

    After moving ouroboros-consensus to its own repository, we made +ouroboros-network compatible with GHC 9.4 and 9.6.

    We made cardano-client library independent of +ouroboros-consensus-diffusion.

    We prepared release of network packages for cardano-node-8.0.

    Detailed log

    Ouroboros-Network

    IO-Sim

    • io-classes-1.0.0.0, and following up releases: 1.0.0.1 (ghc-9.6 +support), 1.1.0.0 (documentation fix).
    • Fixed timeouts and delays in io-sim in a series of PRs: io-sim#81, +io-sim#82, io-sim#86, io-sim#87.
    • Renamed a module: io-sim#88.
    • Fixed a failing registerDelayCancellable test: [io-sim#80].
    • Use GitHub merge queue in io-sim repository.
    • CI: download stylish-haskell: io-sim#83.

    Typed Protocols

    ]]>
    + network +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-27-hydra + 2023-04-27-hydra + Thu, 27 Apr 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team held their Monthly review meeting and drafted the +report which likely is published next week. They put the spec into the +repository and website, addressed a user issue and fixed the TUI peer list. +Furthermore, they updated dependencies, conducted a Twitter space on Auctions +use cases, covered the rollback bug with tests and implemented a solution. +Looking ahead, their goals for next week include releasing 0.10.0, implementing +timed transactions support, writing a Query API ADR, and grooming work items +like off-chain benchmarks.

    What did the team achieve this week

    • Held the Monthly review meeting and drafted the report (to be published next week)
    • Added the spec into the repository +#693 and published on +the +website
    • Groom and addressed user issue #823
    • Covered the rollback bug with tests and implemented a solution (to be reviewed) #784
    • Fixed the TUI peer list
    • Updated dependencies to match cardano-node master
    • Conducted a twitter space on Auctions use cases

    What are the goals of next week

    • Release 0.10.0
    • Support timed transactions solution drafted and validated API with users
    • Write Query API ADR and groom a concrete step
    • Groom and solve PostTxOnChainFailed UX problem #832
    • Groom off-chain benchmarks idea #186 and turn it into a feature
    ]]>
    + hydra +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-21-hydra + 2023-04-21-hydra + Fri, 21 Apr 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team worked on several fronts, including fixing state +machine continuity on-chain, discussing voting project solutions, exploring +adding Hydra support to kupo, and improving API navigation with a sidebar. The +team also updated dependencies and fixed issues in their test suites. Moving +forward, the team plans to hold the next monthly review meeting, address a user +issue, prepare for the 0.10.0 release, and work on a dirt road fix for the +rollbacks issue with proper test coverage.

    What did the team achieve this week

    • Fixed scripts to enforce state machine continuity on-chain #777.
    • Took part in a twitter space on Scaling Cardano.
    • Joined a CBIA meeting to discuss Cardano network protocols & how to specify them.
    • Discussed potential solutions of ensuring vote uniqueness in the voting project.
    • Updated dependencies to match cardano-node master to prepare for upcoming releases and hard-forks
    • Explored adding Hydra support to kupo, a lightweight Cardano chain indexer - some more work required.
    • Improved navigation of the API Reference with a sidebar, see unstable API version.
    • Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)

    What are the goals of next week

    • Monthly review meeting (join via Discord or AddEvent) & report
    • Dirt road fix for rollbacks #784 properly covered by a test.
    • Groom and ideally address user issue #823.
    • Put the spec into the repo #693 and prepare release 0.10.0.
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-21-ledger + 2023-04-21-ledger + Fri, 21 Apr 2023 00:00:00 GMT + + High level summary

    We continued to make progress on CIP-1694 and the conway ledger era. +In particular, the conway era now supports Plutus V3. +Finally, we made small improvements to the ledger API and now host +our Haskell code documentation (haddocks) on github pages.

    Low level summary

    Conway ledger era

    Haddocks hosted on github pages

    Small improvements to the API

    Technical Debt

    • [pull-3367] Fix cost model json instances.
    • [pull-3371] UMap cleanup.
    • [pull-3373] Upgrade to ghc 9.2.7 and cabal 3.10.1.
    • [pull-3375] Sadly, we had to revert the TICKF optimizations. There was a regression we do not yet understand.
    • [pull-3377] Fix cabal warnings.
    • [pull-3383] Fix multi-asset test.
    ]]>
    + ledger +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-20-mithril + 2023-04-20-mithril + Thu, 20 Apr 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2315.0 distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures.

    Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network.

    Low level overview

    • Released the new distribution 2315.0
    • Completed the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the signed_entity table #816
      • Completed the creation of the signer table #814
      • Completed the migration/adaptation of the single_signature table #829
    • Worked on the epic that designs and implement generic signing/verification of entity services #780:
      • Completed the definition of the interface of the generic entity service for signing #847
      • Worked on the implementation of the Certifier service in the aggregator #850
      • Completed the extension of the SignedEntityType type #848
      • Completed the implementation of the Tick service in the aggregator #849
      • Worked on implementing the signable builder for the Mithril Stake Distribution #851
    ]]>
    + mithril +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-20-node-cli-api + 2023-04-20-node-cli-api + Thu, 20 Apr 2023 00:00:00 GMT + + 2023-04-20 - 2023-05-04

    High level summary

    • Various fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-19-consensus + 2023-04-19-consensus + Wed, 19 Apr 2023 00:00:00 GMT + + High level summary

    This week the consensus team continued working on the improved DB lock mechanism +for UTxO-HD, and modifications to the mempool benchmarks that this prototype +requires.

    On the Genesis front we validated that the fragment size calculation in +BlockFetch is a major performance sink for ChainSync Jumping. By removing it +we will get performance that is acceptably close to that of the baseline. We +also started investigating a performance fix that does not alter the existing +baseline behavior too much. In addition we reviewed our Genesis attack vector +calculations.

    On the support front we released Consensus 0.4, and we are working on improving +our release process, to support the Cardano-wide efforts in this area. We also +performed an analysis on the number of file descriptors that consensus use. This +information can be used by the node operators to check if the number of file +descriptors they want to support are enough.

    ]]>
    + consensus +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-19-performance-and-tracing + 2023-04-19-performance-and-tracing + Wed, 19 Apr 2023 00:00:00 GMT + +
  • Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.
  • New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois.
  • Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run.
  • Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench.
  • Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.
  • Benchmarking

    We have performed various cluster runs targeting the 8.0 release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile epoch-transition for local reproduction of what we observed on the benchmarking cluster.

    Furthermore, we bridged the gap between the run data from the 1.35.x releases to the the new 8.0.x release branch. This included walking the +master branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial +in locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of +benchmarks.

    Tracing

    In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still +ongoing.

    In coordination with Galois, who are developing a system assurance service by observing a number of cardano-nodes, we're working with the implementation +of data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational +burden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether cardano-tracer could be extended with a richer +feature set to that end.

    Infrastructure & Analysis

    Detailed manifest

    A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with. +These dependencies come from different package sources, have different versioning policies, and an identical package version might provide different +performance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated +by making all component bumps visible and accessible.

    GHC profiling inside workbench

    The workbench has been equipped with a new -profnix profile flavour. This enforces a -fprof-auto build for all node-related packages. The type of +profiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already +been merged to master.

    Nomad backend

    The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances. +This results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing.

    ]]>
    + performance-tracing +
    + + <![CDATA[Incident Report]]> + https://input-output-hk.github.io/cardano-updates/2023-04-17-ledger + 2023-04-17-ledger + Mon, 17 Apr 2023 00:00:00 GMT + + Incident reporting: Cardano block production temporary outage

    On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a ‘critical’ incident, thus warranting immediate response and investigation by IOG engineers. +The investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue – a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite. +Following successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version. +With the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue.

    Further Details

    You can read more details on the incident and how it was managed from SundaeSwap’s Pi Lanningham here. Thanks again to all the community for its support in identifying and fixing this bug.

    ]]>
    + ledger +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-14-goedel + 2023-04-14-goedel + Fri, 14 Apr 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has submitted two papers for publication, carried +out consultancy with other teams and has an opening for an intern.

    Details

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-14-hydra + 2023-04-14-hydra + Fri, 14 Apr 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team focused on improving the smoke test, fixing developer +tooling, and improving the API for voting use cases. They reviewed progress on +auction, payments, and voting projects and made worked on reproducing a bug with +handling rollbacks. Moving forward, the team plans to update dependencies, +implement a dirt road fix for the rollbacks bug, and explore adding Hydra +support to kupo.

    What did the team achieve this week

    • Reviewed progress on auction, payments and voting projects
    • Improved smoke tests so they can run on mainnet
    • Fixed a regression in the development environment and updated cardano-node +used in tests
    • Improved API with more configurability to unblock voting use case
      • Exclude utxo in SnapshotConfirmed outputs #808
      • Addressed a user request by only sending Greetings once #813
    • Reproduced the rollback bug by improving our model-based test suite #784

    What are the goals of next week

    • Update dependencies to match cardano-node master
    • Dirt road fix for rollbacks #784
    • Update Hydraw to maintain state locally
    • Explore adding Hydra support to kupo
    • Put disclaimer texts and closing mainnet compatibility feature #713
    ]]>
    + hydra +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-07-hydra + 2023-04-07-hydra + Fri, 07 Apr 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team published the monthly report for March, created +separate links for different versions of documentation, and clarified potential +solutions for the Rollbacks bug. The team also discussed Query API requests for +the Hydra Voting project and met with community members to answer questions +about Hydra. Moving forward, the team plans to integrate the specification into +the repository, implement a short-term fix for the Rollbacks issue, and draft a +Query API ADR.

    What did the team achieve this week

    • Published monthly reports on website
    • Separate last released and latest versions of docs (e.g. normal released vs. /unstable)
    • Discussed Query API concerns from Hydra Voting project (link)
    • Clarified rollbacks bug and defined possible solutions (short and long term) #784
    • Met with community members to answer questions about Hydra

    What are the goals of next week

    • Finally get the docs integrated into the repository #693
    • Dirt road fix for rollbacks #784
    • Disclaimer text and detail known issues about mainnet compatibility +#713
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-06-mithril + 2023-04-06-mithril + Thu, 06 Apr 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2313.0 distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages.

    Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to 1.35.6.

    Low level overview

    • Released the new distribution 2313.0
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the epoch_settings table #813
      • Completed the migration/adaptation of the signed-entity-type table #815
      • Completed the migration/adaptation of the certificate table #817
      • Completed the migration/adaptation of the open_message table #827
      • Completed the migration/adaptation of the signer_registration table #828
    • Completed the refactoring of the dependency injection of the aggregator #823
    • Completed the cleanup of the multi-signer of the aggregator #824
    • Completed the upgrade of the Cardano node to 1.35.6 #843
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-05-consensus + 2023-04-05-consensus + Wed, 05 Apr 2023 00:00:00 GMT + + High level summary

    This week the consensus team finished the UTxO-HD prototype refactoring. We are +now working on improving the DB lock mechanism to improve performance. We also +introduced several improvements to the file system abstraction and simulation +layer (fs-sim), which culminated in the release of fs-sim-0.1.0.0 and +fs-api-0.1.0.0 to CHaP.

    On the Genesis front we distributed the updated Genesis design document, +soliciting feedback from Networking Team and IOG Researchers. We also opened up +a PR for the adversarial leader schedule QuickCheck generator, which is being +reviewed.

    On the support front, we got a new Consensus version that can use different +fundamental VRF crypto primitives for Babbage and Conway eras.

    On the tech debt front we fixed an bug in the followers logic, which was +discovered by our QuickCheck property tests.

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-05-node-cli-api + 2023-04-05-node-cli-api + Wed, 05 Apr 2023 00:00:00 GMT + + 2023-04-05 - 2023-04-19

    High level summary

    • Introduce new governance commands create, answer and verify. This allows us to have onchain polls.
    • Begin making changes in cardano-api to accomodate for CIP-1694
    • Rename TestEnableDevelopmentHardForkEras to ExperimentalHardForksEnabled and TestEnableDevelopmentNetworkProtocols to ExperimentalProtocolsEnabled
    • Various bug fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-04-05-performance-and-tracing + 2023-04-05-performance-and-tracing + Wed, 05 Apr 2023 00:00:00 GMT + +
  • Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.
  • New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput.
  • Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged.
  • Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added.
  • Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.
  • Benchmarking

    We have adapted our benchmarking cluster to the requirements of the 8.0 release branch. Testing runs of a very early feature branch for 8.0 +helped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for 8.0 soon.

    Tracing

    Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very +detailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing +the highest possible throughput of data for forwarding to cardano-tracer.

    Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions +for tunneling trace forwarding from a node to cardano-tracer via an easy to manage system service, which will match the production setup of most users.

    Infrastructure & Analysis

    General

    Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance +analysis can be fed back and serve as an additional point of comparison.

    Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations.

    Plutus library

    We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles. +This will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile. +It is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit.

    Nomad backend

    The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is +being improved to minimize any friction for the backend user.

    ]]>
    + performance-tracing +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-31-crypto + 2023-03-31-crypto + Fri, 31 Mar 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Started looking into full-node verifier
    • cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties.
    • KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent.
    • Sidechains: Included BLS12-381 & JubJub to halo2curves
    • MuSig2: Final modifs to C version.

    Low level summary

    Mithril

    • Started designing how a full-node verifier would work. Issue comming in the next couple of weeks.

    cardano-base

    • BLS12-381 branch merged PR#266.
    • Testing strategy for BLS bindings:
      • Test-vectors for Groth16, and simple BLS signatures ready.
      • Test-vectors with different library, and created by different engineer.

    KES agent

    • Resolved issues of circular dependency
    • Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same.
    • Opened a PR for raw bearer branch in ouroboros network PR4395
    • Resolved a bug where the agent node did not properly closed connections
    • Updated version of IOSim allowed us to finish a first version of KES agent.

    Sidechains

    • Included BLS12-381 curve to our branch of halo2curves
    • Included JubJub to our branch of halo2curves

    MuSig2

    • Minor reorg PR#42
    • Started including fuzz testing for deserialisation PR#
    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-31-goedel + 2023-03-31-goedel + Fri, 31 Mar 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on final drafts of two papers +for internal review and planning next steps of analysis of consensus +design refiniments.

    Details

    • Preparing final draft of DeltaQSD algebra paper for internal review

    • Preparing final draft of verifying design refinements for +distributed system design for internal review

    • Planning next phase of consensus design refinement analysis

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-31-hydra + 2023-03-31-hydra + Fri, 31 Mar 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra continued work on finishing mainnet compatibility. The +semi-automated smoke tests and some missing documentation is still preventing +from calling that fully done. They fixed smaller issues and made a step in the +Head protocol more robust. Besides development, they met with interested people +from the community who want to get started collaborating on communication and +marketing materials.

    What did the team achieve this week

    • Groomed and followed-up on GetUTxO user request discussion #797
    • Fixed hydra-node crashes after forks #560
    • Made collectCom more robust and aligned with spec #786
    • Completed configurable API feature #380
    • Met potential contributors about Hydra communication and marketing materials
    • Versioned documentation: we have a unstable bleeding edge version available as well now, seperate from the last released version

    What are the goals of next week

    • Follow-up backlog and roadmap clean-up
    • Complete mainnet compatibility feature #713 (documentation updates)
    • Integrate Hydra specification into repository #693
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-31-ledger + 2023-03-31-ledger + Fri, 31 Mar 2023 00:00:00 GMT + + High level summary

    We are still heavily involved in work related to preparing the next release. +The other main thing we have worked on is experimentation about how we will +handle the DRep stake distribution for CIP-1694 in the conway ledger era. +Lastly, we merged a fix for +node-4826 +into our main branch (there will be a post-mortem shortly).

    Low level summary

    Support for the next release

    • pull-3363 - Fix problems relating to Arbitrary instances used by consensus.
    • pull-3361 - Remove the alonze genesis from the conway genesis.
    • pull-3360 - Translate bad pointer addresses to valid ones in conway.
    • pull-3357 - Fix a bug relating to zero valued ADA in the script context.
    • pull-3356 - Added needed instances (Arbitrary and Serialization) for conway integration.
    • pull-3345 - Added helper functions for the CLI.
    • pull-3342 - Fix a bug with a CLI helper function (having to do with deposit tracking).

    Experiments for DRep stake distribution

    Adding another stake distribution to the ledger state presents some new challenges. +We would like to be able to use the current stake distribution at the epoch boundary +for DRep voting so that people can always vote themselves in time for any proposal. +To this end, we have a prototype of an incremental computation based on the incremental +lambda calculus, together with tests and benchmarks (which are very promising). +See pull-3344.

    Additionally, more of the ledger state is going to need to be rearranged to accomodate +the new incremental computations. +We have two draft PRs up for possibles solution. +See pull-3353 and pull-3364.

    Technical debt and bug fixes

    Documentation changes

    • pull-3354 - Rename "optional datums" with "supplemental datums" in the alonzo spec.
    • pull-3352 - Add a section to the Shelly errata about the individual deposit tracking.
    • pull-3351 - Further clarify the details regarding the script integrity hash.
    • pull-3350 - Some cleanup of the Babbage spec.
    ]]>
    + ledger +
    + + <![CDATA[System Test Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-27-system-test + 2023-03-27-system-test + Mon, 27 Mar 2023 00:00:00 GMT + + High level summary

    Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.5 and 1.35.6 releases (and their predecessing release candidates) and ran tests on branch with the UTxO-HD functionality.

    Workstreams

    Framework improvements:

    • improvements in searching for unexpected error messages in log files during test run
    • added support for UTxO-HD testing
    • added support for the new P2P topology format
    • added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)
    • added preliminary support for the Conway era
    • added support for running tests on the Preview testnet

    Full list of closed PRs

    Node:

    • ran tests on node branch with the UTxO-HD functionality
    • tested the 1.35.5 release
    • tested the 1.35.6 release

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests
    ]]>
    + system-test +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-24-hydra + 2023-03-24-hydra + Fri, 24 Mar 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra had a team workshop and conducted the monthly review +meeting for March. They demonstrated a Hydra Head on mainnet, which was running +the hydraw demo application. While this marks an important milestone, they also +emphasized that more features are still to be added as needed for applications +to run on Hydra. Besides this, the roadmap is getting cleaned up to encourage +discussions and provide more space for user requests.

    What did the team achieve this week

    • Monthly review meeting slides/recording, full report of March next week
      • Opened a head on mainnet with hydraw demonstration
      • Hydra pay updates
    • Team workshop in Austria
      • Hydra presentation at the Cardano Foundation in Zurich
      • In-person grooming session, marked many items as candidates to be rather :idea: dicussions
      • Improved head protocol #786 and investigated a potential bug in rollback handling #784
      • Team building and retrospective

    What are the goals of next week

    • Follow-up on backlog and roadmap clean-up
    • Complete mainnet compatibility feature (documentation updates)
    • Make API more configurable #380
    • Integrate Hydra specification into repository #693
    ]]>
    + hydra +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-23-db-sync + 2023-03-23-db-sync + Thu, 23 Mar 2023 00:00:00 GMT + + High level summary

    The DBSync team worked in performance enhancements issues, on providing new db-sync options and on +technical debt and bug fixing. The DBSync team also on boarded a new member.

    Low level summary

    • Worked on an issue which causes ada_pots tables to include the values related not only to an +epoch, but also the first epoch of the last epoch. +#1367
    • Fixed an issue where the epoch table didn't rollback and caused wrong values +#1370
    • Fixed an issue were users with disable-ledger option had to provide the state dir option, even +though it was never used. Also refactored the no ledger part of the codebase. +#1378
    • Improved the perforance by using the cache more. Also provided many new options which enables or +disables parts of db-sync. In addition a new --turbo mode is enables which allows db-sync to sync +mainnet in hours. +#1379
    ]]>
    + db-sync +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-23-mithril + 2023-03-23-mithril + Thu, 23 Mar 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2310.0 distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images.

    Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano mainnet and they have fixed some bugs.

    Low level overview

    • Completed the epic that implements eras behavior switch #707:
      • Completed handling the API version switch at era transition #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed on the migration/adaptation of the stake_pool table #787
      • Worked on the migration/adaptation of the epoch_settings table #813
      • Worked on the migration/adaptation of the signed-entity-type table #815
      • Completed the creation of a stake distribution service #799
    • Completed the testing of Mithril with Cardano mainnet network #777
    • Completed qualifying the computation of the stake distribution #810
    • Completed the testing of the Docker client in the Mithril Client multi-platform test workflow #794
    • Worked on bugs and optimizations:
      • Fixed a bug that made computation of the stake distribution occur multiple times during an epoch #804
      • Fixed a bug that created deadlocks on the SQLite connection #807
      • Optimized the error message and the behavior of the signer node when KES keys have expired #820
      • Upgraded the infrastructure of the testing-preview and pre-release-preview networks #801
      • Re-genesis of the testing-preview network #803
      • Re-genesis of the pre-release-preview network #818
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-22-consensus + 2023-03-22-consensus + Wed, 22 Mar 2023 00:00:00 GMT + + High level summary

    This week the consensus team continued working on the refactoring of the UTxO HD +prototype, and design and testing of Genesis. We also extracted the fs-sim +package, which provides a file-system abstraction layer that can be used for +testing and simulation. This makes the Consensus code base smaller, while +providing a package that the community can reuse and contribute to. We also +fixed a failing property test related to iterators. We are also working on +mempool and VRF improvements.

    Low-level details

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-22-node-cli-api + 2023-03-22-node-cli-api + Wed, 22 Mar 2023 00:00:00 GMT + + 2023-03-22 - 2023-04-05

    High level summary

    • Added new cardano-cli ping command which allows users to ping remote cardano-nodes.
    • The transaction build command now can automatically balance multiassets
    • New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-22-performance-and-tracing + 2023-03-22-performance-and-tracing + Wed, 22 Mar 2023 00:00:00 GMT + +
  • Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.
  • New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users.
  • Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery.
  • Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks.
  • Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing.
  • Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.
  • Performance

    New tracing

    The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe +a slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use.

    GHC RTS parametrization

    We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies +on different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use.

    Open Sourcing

    Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases.

    Tracing

    For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well +as a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points +for users of the new system, depending on their wants and needs.

    Infrastructure & Analysis

    General

    Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will +increase confidence in specific metrics.

    Nomad backend

    We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis +is patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries.

    ]]>
    + performance-tracing +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-21-network + 2023-03-21-network + Tue, 21 Mar 2023 00:00:00 GMT + + High level summary

    In the last spring we released cardano-node-1.35.6 with dynamic P2P +functionality.

    We received reports from some SPOs who encountered problems with their non +P2P block producing nodes not being able to connect to their P2P relay. Karl +Knutsson (from Cardano Foundation) reproduced this issue between two nodes (a +non P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed +it and found a bug in the legacy non p2p code. The bug is only possible to +trigger with a P2P node which is binding its outbound connection port to +a fixed IP address and port (default in p2p). A possible solution was found. +For more information see #4465.

    We released cardano-ping-0.1.0.0 package to CHaP. cardano-ping is no +longer available as a standalone binary, but instead it will become part of +cardano-cli (see #4664)

    We are testing cardano-node with peer sharing functionality (#4019).

    We are working on eclipse evasion. We added new class of peers: big ledger +peers to the outbound governor, implemented tests and fixed found issues +(#4462). We also made the information if a given peer plays the role of +a big ledger peer to the mini-protocols. This will allow to modify +mini-protocol applications for such peers. As part of this functionality we +refactored some core types in the network code which simplifies exposed API.

    Together with Moritz Angerman we started to update io-sim to ghc-9.6.1 (see +#73).

    We merged a fix of configuration of accepted connections limit in +cardano-node (see #4902).

    ]]>
    + network +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-17-crypto + 2023-03-17-crypto + Fri, 17 Mar 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: RFP finished. Code ready for audit.
    • cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams.
    • KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing.
    • Sidechains: Preparing proving system to use the curves needed for main-net PoC.

    Low level summary

    Mithril

    • Merged PR#783
    • RFP for crypto audit ready.

    cardano-base

    • BLS12-381 branch approved PR#266. Blocker is Windown's CI. Working on it
    • Testing strategy for BLS bindings:
      • Preparing test-vectors for Groth16, and simple BLS signatures
      • Finding community projects to help write their use cases
      • Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)
    • Wrote blogpost on how using the same key for ed25519 and VRF completely breaks the security of both systems

    KES agent

    • Started integration of sockets interface used in consensus
    • Use that for de/ser
    • Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim
    • Results in having to parametrise for IOSim in KES and DSIGN for testing

    Sidechains

    • Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages.
    • Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS.
    • EdDSA over JubJub ready
    ]]>
    + crypto +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-17-hydra + 2023-03-17-hydra + Fri, 17 Mar 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team has continued work on the mainnet compatibility of the +hydra-node. They added a golden test suite for hydra-plutus scripts, added +some detection of hydra-node misconfiguration, established a limit of 100 ADA +per commit and other smaller tasks to prepare for a mainnet beta release.

    Next week there will be a small team workshop to push for demonstrating a Hydra +Head on the Cardano mainnet, ideally just in time for the monthly review +meeting. See the hydra channels on the IOG Technical Community discord server +for details.

    What did the team achieve this week

    • Implement a 100 ADA hard-coded commit limit in the hydra-node +#763
    • Pay back funds to faucet after smoke-test run +#773
    • Setup custom github runner for smoke-tests on mainnet +#775
    • Created golden tests to assure the script hash stays the same between +changes #772
    • Removed hardcoded error codes in plutus scripts +#768
    • Detect misconfiguration of a hydra-node given persistent state +#767
    • Met with potential users for hydra-pay
    • Prepared hydra workshop

    What are the goals of next week

    • Hydra monthly meeting
    • Open a multi-party head on mainnet
    • Complete mainnet compatibility feature
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-17-ledger + 2023-03-17-ledger + Fri, 17 Mar 2023 00:00:00 GMT + + High level summary

    We made further progress on the conway ledger era. +In particular, we expanded the ledger API significantly, including lots of governance features. +We also made progress on the specification and corresponding work in the Haskell implementation.

    We also continued to integrate the latest ledger packages into cardano node and addressed +technical debt.

    Low level summary

    Expanded ledger API

    The ledger API was significantly expanded to include:

    • a lot of protocol parameter support
    • versioning support (type level ledger eras and protocol versions)
    • auxiliary data support
    • many new lenses
    • support for witnesses
    • support for conway governance

    See pull-3328.

    Conway ledger rules

    We have made progress on the formal ledger specification for the Conway era. +Moreover, the corresponding Haskell updates were also completed:

    Incremental SPO/DRep stake distribution computation

    We have a working (and correct) proof of concept for how to use the incremental lambda calculus +to maintain several of the stake distributions incrementally. +For the per-SPO distribution, this is a performance improvement. +For the (conway) per-DRep distribution, this is will allow those who have delegated their votes +to a DRep to have time to react to any votes that they disapprove of. +(Sorry, no code to share just yet, more to come.)

    Technical debt

    ]]>
    + ledger +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-16-goedel + 2023-03-16-goedel + Thu, 16 Mar 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers +improving the deltaQ tutorial, consulting on performance design, and +the final version of the Djed paper.

    Details

    • Preparing draft of DeltaQSD algebra paper for ICE 2023

    • Successful outcome of Marlowe consultancy leading to substantial +improvement in performance

    • Preparing sections on the communication language and bisimulation +proofs for draft paper about verifying design refinements for +distributed system design

    • Camera ready version of Djed paper under preparation

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-10-hydra + 2023-03-10-hydra + Fri, 10 Mar 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team addressed issues with committing complex UTxOs into a +Hydra Head, prepared the hydra-node to be run on mainnet (soon) and improved +the test suite of the hydra-plutus scripts. The specification is constantly +getting improved upon reviewer feedback on overleaf - this week the graphical +notation was refined to be more transaction-focused.

    What did the team achieve this week

    • Clarified bug of committing UTxOs with reference scripts to a Hydra head #737
    • Prepare usage of hydra-node on mainnet by updating command line options #715
    • Improved our mutation test suite to all expected errors #705
    • Re-opened our persistent hydraw demo head on preprod using version 0.9.0
    • Updated on-chain graphs to be more transaction-focused in the specification

    What are the goals of next week

    • Complete mainnet compatibility feature
    • Prepare the Hydra workshop
    • Address all todo’s in the Hydra specification
    • Unblock the auctions project with commit from script a solution
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-09-mithril + 2023-03-09-mithril + Thu, 09 Mar 2023 00:00:00 GMT + + High level overview

    The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano mainnet and computes the stake distribution with the optimized unreleased Cardano CLI command.

    Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup.

    Low level overview

    • Worked on the epic that implements eras behavior switch #707:
      • Completed the deployment of the era behavior switch to the test networks #752
      • Completed the enhancement of datum generation for era markers #786
      • Worked on handling the API version with an era switch #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Worked on the migration/adaptation of the stake_pool table #787
    • Completed the refactoring of errors in the signer and aggregator state machines #665
    • Worked on testing Mithril with a mainnet Cardano network #777
    • Worked on fixing bugs with the Docker client image:
      • Fixed a bug that made the Docker client container crash at startup #769
      • Fixed a bug that prevented the restoration of a snapshot with a Docker client #791
      • Worked on testing the Docker client in the Mithril Client multi-platform test workflow #794
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-08-consensus + 2023-03-08-consensus + Wed, 08 Mar 2023 00:00:00 GMT + + High level summary

    The Consensus team continued working on refactoring and improving the UTxO-HD +prototype, and introducing improvements to the lmdb related packages. In +particular we identified an opportunity to gain performance by handling locks in +a more optimal way.

    On the Genesis front, we sketched a mitigation for an issue that PNSol and +Researchers caught. We also came op with a road map for not only testing the +Genesis prototypes, but also for enriching the tests we already have.

    Regarding technical debt, next to some minor improvements, we created +component-level micro-benchmarks for adding transactions to the mempool. The +results of these benchmarks will be published in the ouroboros-consensus web +page.

    We also finished moving the Consensus documentation to the ouroboros-consensus +repository, released ouroboros-consensus 0.3.0.0, and reduced the time +GitHub actions take in ouroboros-network.

    Workstreams

    UTxO HD Prototype

    We continued working on refactoring and improving the UTxO-HD prototype. As a +result of the first round of sytem-level benchmarks, we identified an +opportunity to optimise the way we handle locks to improve performance +(#4393).

    Also, we introduced several improvements to the lmdb related packages:

    Genesis

    We sketched out a mitigation of the issue that PNSol and Researchers caught in +the Genesis design.

    We came up with a road map for testing the Genesis prototypes, including early +milestones that are applicable to today's master branch, ie tests that are +useful before Genesis, and that will be nicely enriched when we do add Genesis.

    We developed the aforementioned tests, specifically a QuickCheck generator for +the Honest leader schedule and one as-aggressive-as-possible Adversarial +leader schedule that together satisfy the Praos properties that the Consensus +design takes as invariants.

    We investigated why the improved ChainDB queueing implementation behaves +differently in the baseline compared to the prototype, and we are close to +having a full picture of how the Consensus components interact during bulk sync.

    Technical debt

    We created component-level micro-benchmarks for adding transactions +to the mempool. We plan on extending this to more mempool actions and different +types of blocks. We store the benchmark data to make it available +to the GitHub action that publishes the benchmarks results.

    Other minor improvements include:

    • Removal of Test.Util.Classify in favour of Test.StateMachine.Labelling.
    • Addition of -Wunused-packages to the default ghc-options for Consensus +packages.

    Fostering collaboration

    We finished moving the Consensus documentation from +ouroboros-network to ouroboros-consensus, in preparation for +migrating the code to the latter repository.

    Support

    We released ouroboros-consensus 0.3.0.0.

    We reduced the load in the ouroboros-network GitHub actions, +thereby reducing the time CI jobs take.

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-08-node-cli-api + 2023-03-08-node-cli-api + Wed, 08 Mar 2023 00:00:00 GMT + + 2023-03-08 - 2023-03-21

    High level summary

    General bug fixes and some refactoring

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-08-performance-and-tracing + 2023-03-08-performance-and-tracing + Wed, 08 Mar 2023 00:00:00 GMT + +
  • Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.
  • New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users.
  • Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination.
  • Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation.
  • Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.
  • Performance

    1.35.6 release

    Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health.

    Analysis pipeline

    Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better +differentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance. +Additionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking +data more easily accessible.

    Open Sourcing

    As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable +third parties to make use of that data much more easily, by having reliable guidelines and a working example.

    Tracing

    The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make +the switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process.

    Infrastructure

    Nomad backend

    The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented.

    ]]>
    + performance-tracing +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-03-crypto + 2023-03-03-crypto + Fri, 03 Mar 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit.
    • cardano-base: BLS branch is now ready for review. We are workign forward its merge.
    • KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase.
    • Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs

    Low level summary

    Mithril

    • Bumped to version 0.2.0 the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using mlock.
    • Opened PR#783 to update dependency
    • Improved testing for batch opening of mtree, PR#773
    • Improved testing for batch verification of STM sigs PR#774
    • RFP for crypto audit almost ready.

    cardano-base

    • BLS12-381 branch finally ready for review PR#266

    KES agent

    Team off for one week. Other progress:

    • Learning about raw direct-bearer abstraction. An interface for sockets in consensus.
    • use that for direct ser/deser
    • written those syntaxes for ouroboros (coming PR)
    • the kes agent will depend on that.

    Sidechains

    Progress with familiarisation of Halo2 library to write circuits.

    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-03-goedel + 2023-03-03-goedel + Fri, 03 Mar 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, improving the deltaQ tutorial, consulting on +performance design, and the Djed paper has been accepted for +publication.

    Details

    • Preparing draft of DeltaQSD algebra paper for FORTE 2023

    • Extending the technical report on which the above paper is based

    • Consulting with an external company on performance engineering of Plutus contracts

    • Planning improvements and collecting material for the deltaQ +tutorial based on experience with systems that manage risk at +multiple timescales

    • Preparing sections on the communication language and idempontency +laws for draft paper about verifying design refinements for +distributed system design

    • Studying Cardano chain sync protocol

    • "Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin +Protocol" has been accepted for publication at IEEE ICBC 2023

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-03-hydra + 2023-03-03-hydra + Fri, 03 Mar 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team released version +0.9.0 - a version +of the hydra-node with fully specified behavior of on-chain scripts and +off-chain head-logic, decreased costs for opening/closing a Head and scalable +contestation deadline semantics. Check out the full release notes for details.

    Furthermore, they published the monthly +report of the Hydra project +and conducted a review meeting with an increasingly wider audience. The team +plans to extend invitations through the new Hydra +#announcements discord channel for the next +months, stay tuned!

    What did the team achieve this week

    • Monthly review meeting with report published on website
    • Fixed smoke tests #726
    • Reduced the cost of opening/closing a Head (error codes #748 + head reference script #701)
    • Released version 0.9.0
    • Conducted a first experiment on mainnet compatibility #713
    • New discord category with #announcements channel
    • Received a demo about the Hydra for Voting project
    • Lightning talk on mutation-based testing (to be shared)
    • New themes view in on our roadmap and some rearranging as we align it with high-level objectives
    • Clarified things with researchers, but mostly identified action items for them

    What are the goals of next week

    • Redraw transaction graphs and address TODOs specification
    • Run hydraw with 0.9.0 on preprod
    • Make smoke tests on mainnet possible
    • Groom the explorer item
    • Unblock the auctions projecth with commit from script a solution
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-03-ledger + 2023-03-03-ledger + Fri, 03 Mar 2023 00:00:00 GMT + + High level summary

    We have focused the last two weeks on CIP-1694, integration of the last several months of ledger +work into consensus and node, and testing infrastrutcture that we will use in the conway ledger era.

    Low level summary

    Conway rules

    We made a major update to the conway era so that the implementation is now in sync with the spec +with respect to the ratification and enactment logic.

    See the notes in pull-3291 for more details.

    Constraint based generators

    This week we hit a major milestone in our efforts to build out better property based testing +support for the main ledger properties. +The new constraint based generators can now generate full ledger states with what is probably +very close to the real constraints (if anything, it is under constrained). +Next we will work on generating a transaction in the context of a ledger state, which would allow +us to actually start using these generators for real tests.

    See pull-3219.

    Preparing a release, now with proper versioning

    After quite some time, we are ready to release a version of ledger that will work with a new +version of consensus, using CHaPs.

    See pull-3308.

    Technical debt

    • We cleaned up the redeemer serialization code (to prevent future mistakes). See pull-3269.
    • We added a note to the Alonzo spec, specifying that the transaction inputs are +lexicographically ordered in the Plutus script context. See pull-3306.
    • We fixed a problem with the address deserialiazation +(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway). +See pull-3307.
    • We fixed a problem with our nix build. See pull-3311.
    • We fixed a problem with our NoThunks tests. See pull-3310.
    • We improved our nightly tests. See pull-3316.
    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-03-02-network + 2023-03-02-network + Thu, 02 Mar 2023 00:00:00 GMT + + High level summary

    In the current sprint the networking team focused on fixing bugs and pushing +forward implementation of eclipse evasion. We also found a bug in our +simulation testing setup (in integration of test node). We also overviewed the +work on extending handshake protocol which is delivered by Galois Inc.

    We published ouroboros-network-0.4.0.1 and +ouroboros-network-protocols-0.3.0.0 to CHaP.

    We also fixed a bug in cardano-node which results in not being able to +configure inbound connection limits, see PR #4902.

    Together with Karl Knutsson (CF) we realised an issue in cardano-cli: it's +validation of DNS names, IP address & ports when registering a stake pool +should be more strict to protect against common mistakes which we identified on +the chain. See issue #4929.

    Detailed work log

    In PR #4385 we fixed two bugs in peer state actions. First one results in +a busy loop if demotion from hot to warm times outs. This busy loop is +eventually exited when mux exits (we reported this in our previous report). +This fix made it to 1.35.6 release as well.

    In addition the PR #4385 also fixes another bug which results in hot -> warm +-> hot demotion / promotion busy loop.

    The PR #4385 also fixed a bug in a node only used in simulation which +resulted in not using chain-sync or block-fetch mini-protocols. In the +review process, we realised that the header-body split in the simulated node +requires further work (see PR #4419, which is under review).

    The PR #4385 also extend our generators, which together with the above fix, +cover the hot -> warm -> hot demotion / promotion busy loop.

    In PR #4419 we introduce a ChainDB for our simulation node, which plays +similar role to ChainDB in the ouroboros-consensus: a persistent (across +simulated restarts) store of blocks which does chain selection. This ensures +that the simulated node is using block-fetch to download blocks announced by +chain-sync mini-protocol.

    We also made progress with reviewing PR #4019 - peer sharing.

    We also fixed issue #4370 - a connection manager test failure, see PR #4384.

    ]]>
    + network +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-24-hydra + 2023-02-24-hydra + Fri, 24 Feb 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team continue closing many gaps and aligning the +implementation with the specification. More over, they have groomed a plan to +make Hydra Mainnet compatible. Also, they continue moving forward with the +internal auditing and have published some auditing guidelines to receive +contributions from the community.

    What did the team achieve this week

    • Completed #452 (what is +remaining in there)
    • Aligned the Head protocol logic implementation with the specification
    • Completed full minting policy implementation and spec +#720
    • Clarified message authentication with researchers
    • Groomed what is left to do for Mainnet compatibility +#713 and drafted a +0.10.0 version
    • Added a tutorial by @perturbing to the +website LINK
    • Published auditing guidelines +LINK
    • Made hydra-node work for macos +#746 and added support +for building on aarch64 +#673
    • Met with a potential customer of Hydra for Payments

    What are the goals of next week

    • Have the monthly review meeting incl. the report
    • Have smoke tests fixed and running regularly
    • Release 0.9.0 with updated scripts
    • Redraw transaction graphs for specification
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-23-mithril + 2023-02-23-mithril + Thu, 23 Feb 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2306.0 distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes’ CLI that allows generating and signing an era marker’s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI.

    Low level overview

    • Released the new distribution 2306.0
    • Completed the epic that implements signer versions deployment monitoring #718:
      • Completed the implementation an event producer/consumer via channel #738
      • Completed the creation of a database and its configuration to save the events on the consumer side #740
      • Completed the creation of events and sending them on the channel on the producer side #741
      • Completed the creation of the signer registration event #742
      • Completed the creation a query to extract the node versions stakes distribution #743
    • Worked on the epic that implements eras behavior switch #707:
      • Completed the loading of era reader adapters from config in the signer and the aggregator #732
      • Completed the implementation of an era cli command in the aggregator #755
      • Completed the implementation of a dynamic matrix of cases in CI end to end tests #760
    • Fixed some bugs:
      • Fixed the unsupported unixepoch() function #757
      • Fixed the problem that prevented some signers from signing on the testing-preview network #730
      • Update SQLite version to 3.40 in aggregator infrastructure #765
    ]]>
    + mithril +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-23-performance-and-tracing + 2023-02-23-performance-and-tracing + Thu, 23 Feb 2023 00:00:00 GMT + +
  • SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.
  • Release benchmarking: we performed a round of benchmarks for the 1.35.6 release.
  • UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup.
  • New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities.
  • Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure.
  • Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.
  • Performance

    SECP

    1. For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead.
    2. The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run.
    3. The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking.

    UTxO-HD

    1. After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop.
    2. We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.

    1.35.6 release

    Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health.

    Tracing

    Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible.

    Infrastructure

    Nomad backend

    1. Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients.
    2. Locality assumptions were removed and job monitoring was refactored.
    3. To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster.
    4. We're currently evaluating different options for genesis distribution in said cluster.

    NixOps backend

    The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery.

    ]]>
    + performance-tracing +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-22-consensus + 2023-02-22-consensus + Wed, 22 Feb 2023 00:00:00 GMT + + High level summary

    During the past two weeks we got the results from the system level benchmarks +for UTxO HD. They showed a substantial performance regression, so we spent some +time analyzing the results. We found out the frequency at which ledger snapshots +were taken was too high, so we requested the benchmarking team a new run with a +more realistic snapshotting policy. We continued refactoring and improving the +prototype, and we released UTxO-HD related packages to CHaP.

    We met with IOG researchers and networking specialists to discuss the Genesis +design, which was well received. We continued working on testing and +benchmarking different Genesis prototypes.

    We are also working on solving a test failure related to iterators. This work +derived in several improvements such as better documentation, a framework for +writing unit (and regression) tests, and the possibility of debugging +QuickCheck counter examples in the REPL.

    Finally, we released ouroboros-consensus 0.2.0.0 and +ouroboros-consensus-cardano 0.3.0.0 to CHaP

    Workstreams

    UTxO HD Prototype

    We got the results of the first system level benchmarks for UTxO HD. They seemed +to indicate a significant regression in performance. After looking into the +benchmark logs we found that the benchmark runs took ledger state snapshots too +often, due to the default snapshotting policy depending on k, and k being so +small in the benchmark runs. Therefore, the next step is to re-run the +benchmarks with a snapshotting policy that more closely resembles the one from +mainnet.

    At the same time, we continued refactoring and cleaning up the prototype.

    Also, we prepared the anti-diff packages (fingertree-rm, diff-containers, +simple-semigroupoids) and the lmdb related packages (cardano-lmdb and +cardano-lmdb-simple) to CHaP.

    Genesis

    The Genesis design was presented to the IOG researchers and Peter Thompson from +NSol. It was well received. They pointed out one blindspot, but we think it'll +be relatively simple to mitigate.

    In parallel, we continued developing test and benchmarks for the Genesis +prototypes. I particular we tested and implemented a potential fix for +increased ChainDB dequeue timings, which partly +behaved as we expected, but still needs further investigation. Also we obtained +new benchmarking data for the prototype.

    Technical debt

    Related to #4183, we developed a DSL for specifying +ChainDB unit tests. This will allow us to better understand the +counter-examples returned by QuickCheck tests, and to write regression +tests for them. Also, we added a module to enable +QuickCheck counter-examples to be run on the REPL, allowing for faster debugging +feedback. Also, we improved the documentation related to followers +(#4372).

    We are also working on a design for optimizing the way we handle blocks from the +future.

    Support

    We released ouroboros-consensus 0.2.0.0 and ouroboros-consensus-cardano +0.3.0.0 to CHaP. Remember that we decided to split the packages related to +Consensus into two bundles, one with the core functionality, Cardano-agnostic +code, and another bundle with instantiations specific to Cardano.

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-22-node-cli-api + 2023-02-22-node-cli-api + Wed, 22 Feb 2023 00:00:00 GMT + + 2023-02-22 - 2023-03-07

    High level summary

    General bug fixes

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    Documentation

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-21-db-sync + 2023-02-21-db-sync + Tue, 21 Feb 2023 00:00:00 GMT + + High level summary

    The db-sync team created a new tag 13.1.0.2 which is ready to release. +We also investigated and had the first working UTxO-HD integration which is one +of the potential future risks for db-sync.

    Low level summary

    • Integrated the UTxO-HD feauture branch in kderme/utxo-hd-1. This doesn't +use the full on disk storage but keeps things in memory and the plan is to keep +it this way for the first iteration. The integration still has some performance +issues which we investigate
    • Created tag 13.1.0.2 which upgrades the dependencies of db-sync
    • Fixed an issue related to errors appearing in SMASH +#1353
    • Continued with ghc-9.2 integration +#1339
    • Worked on an new fixing procedure for +#1348. +We try to make these procedures work also on older schema version, without the +need to migrate to newer schema, which can be very useful for fixing existing +snapshots.
    ]]>
    + db-sync +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-17-crypto + 2023-02-17-crypto + Fri, 17 Feb 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration.
    • cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: started implementation in rust.

    Low level summary

    Mithril

    • Transmute helpers merged PR#722
    • We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope.
    • We are working in a modification of KES to require caller to allocate the secret key buffer.
    • Proposed a solution for signer registration of Mithril.

    cardano-base

    • Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 proof.
      • Results are promising, with using only 23% of the execution budget to verify a realistic proof.
      • Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril.
    • KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this.
    • Conversion finally merged PR#344.

    KES agent

    • Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation
    • Figuring out how to go from fake file descriptor to write the raw bytes

    MuSig2

    • Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.
    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-17-goedel + 2023-02-17-goedel + Fri, 17 Feb 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, distributivity properties of deltaQ, and consulting +on performance design with the Marlowe team.

    Details

    • Processing reviews on performance engineering paper and planning +paper revisions accordingly

    • Investigating distributivity properties of DeltaQ

    • Preparing sections on the thorn calculus and idempotency laws for +draft paper about verifying design refinements for distributed +system design

    • Consulting on performance design with Marlowe team

    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-17-hydra + 2023-02-17-hydra + Fri, 17 Feb 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team completed work on dealing differently with contests +during the contestation period. These will now always push out the deadline and +hence contestation periods are easier to pick (depending on the network a Head +runs on). Furthermore, they added an important acceptance test and completed +internal refactoring of the protocol logic making future changes easier.

    What did the team achieve this week

    • Push contestation deadline on each contest #716
    • Wrote an acceptance (property) test can always close/fanout when collect is successful
    • Internal refactoring of our HeadLogic
    • Groomed remaining things from #452 into dedicated features

    What are the goals of next week

    • Complete full minting policy #720
    • Release 0.9.0 with updated scripts
    • Plan mainnet milestone and a 0.10.0 version
    • Redraw transaction graphs for specification (upon feedback)
    • Have smoke tests fixed and running regularly
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-17-ledger + 2023-02-17-ledger + Fri, 17 Feb 2023 00:00:00 GMT + + High level summary

    This past two weeks saw many months worth of ledger changes integrated with the cardano-base +and ouroboros-network repositories. +The vast majority of the effort involved all the changes to the ledger serialization libraries +(and the interplay with cardano-base) which now support proper versioning. +Supporting the conway ledger era, and in particular allowing the ledger state to transition +to a whole new system of governance, also played a noticeable part in the integration.

    Besides the integration work, the team continues to address technical debt, improve the +documentation, make our testing infrastructure better (such as experimenting with better +nightly tests), and formally specifying more parts of CIP-1694.

    Lower level summary

    Integration work

    Below is all the integration work completed, which will enable a release to node from +the current ledger master. Many thanks to +Alexey for this colossal undertaking!

    Technical debt

    Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted +in the CBOR specification. See pull-3241.

    We now have our .cabal files being checked for a consistent formatting given by +cabal format in our CI. See pull-3286.

    We are still experimenting with better nightly tests for our long running +property based tests. See pull-3276 and pull-3296.

    Small documentation improvements

    The hand proofs of the preservation ADA property have been added back to the +Shelley ledger specification. See pull-3295.

    We have clarified how the script integrity hash is computed in the CDDL description. +See pull-3290.

    Specifying CIP-1694

    Our new formal specifications backed by Agda have seen a lot of progress! +Upgrading to Agda 2.6.3 fixed our main build infrastructure problems, +and we no longer have to rely on our custom fork. See pull-50.

    Our progress on formally specifying CIP-1694 can be followed here:

    Constraint based testing

    We are still actively working on our new constraint based property testing framework. +We have nearly all of the constraints for an entire ledger state +hooked into generators, and tests that the generators do indeed obey the constraints. +The variable count in the constraints is over 100! +There is still much work to do on shrinking, making the generators faster, +and writing actual property tests for the ledger, but the approach still seems viable and +we are hopeful that it could replace our trace generators. +The WIP can be followed here: pull-3219.

    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-17-network + 2023-02-17-network + Fri, 17 Feb 2023 00:00:00 GMT + + High level summary

    Recently QA found a bug in P2P code, which results in busy loops. We added one +fix to 1.35.6 release, another one will likely be part of next release. The +first one is already included in ouroboros-network-0.3.0.1 release. These +bugs could only affect nodes which are out of sync and thus should not impose +risk on well maintained nodes on mainnet. We also advertise to deploy at most +one of the relays as a P2P node, which shields from possible consequences.

    We recently finished design phase of eclipse evasion and we started +implementing it (see issue #3886 for progress).

    Galois finished implementing Handshake extension which will allow to query +network protocol versions (see pr #4256).

    We also recently released a newer set of network packages to be integrated with +cardano-node master branch, this includes:

    * monoidal-synchronisation-0.1.0.2
    * cardano-client-0.1.0.2
    * network-mux-0.3.0.0
    * ouroboros-network-api-0.1.0.0
    * ouroboros-network-protocols-0.2.0.0
    * ouroboros-network-testing-0.2.0.1
    * ouroboros-network-mock-0.1.0.0
    * ouroboros-network-framework-0.3.0.0
    * ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included
    in `0.3.0.1`)
    ]]>
    + network +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-10-hydra + 2023-02-10-hydra + Fri, 10 Feb 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team closed several gaps to align the Hydra scripts +implementation further with the specification. This also resulted in a slight +improvement on Hydra script size and costs. They consequently analysed the +asymptotic complexity of collect and fanout and how they relate. Also plutus-tx +profiling toolchain was evaluated and set up for future improvements on Hydra +on-chain performance. In discussions with researchers and internal auditors, +they also uncovered next steps on further securing the Head protocl using a +"full" minting policy.

    What did the team achieve this week

    • Closed several gaps to align script implementation with specification #452
      • Allow contest only once #680
      • Optimization through head output at index 0 #700
      • Value is preserved #702 + optimized exact value equality #709
    • Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to #721
    • Fixed our tooling around the Haskell language server
    • Discussed full minting policy with researchers
    • Started grooming “what we need for mainnet” on this idea ticket and milestone

    What are the goals of next week

    • Implement full minting policy
    • All remaining protocol discrepancies are implemented or groomed as individual features
    • Ideally release 0.9.0 with updated scripts
    • Discuss what we need for mainnet (milestone planning)
    • Redraw transaction graphs for specification (upon feedback)
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-09-mithril + 2023-02-09-mithril + Thu, 09 Feb 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2304.1 distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store.

    Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version 1.35.5 on their devnet and infrastructure.

    Low level overview

    • Released the new distribution 2304.1
    • Fixed a bug that prevented some signers to sign with 2304.0-prerelease #716
    • Completed the implementation of an EraChecker that checks if an era is active #708
    • Completed the implementation of an EraReader that gathers era activation data #709
    • Completed the implementation of an EraReader adapter with on chain transaction as source #710
    • Completed the relational design of the aggregator store #476
    • Completed adding a new SPO on the testing-preview network #729
    • Completed the upgrade of the Cardano node to 1.35.5 #725
    • Fixed flakiness in the CI #734
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-08-consensus + 2023-02-08-consensus + Wed, 08 Feb 2023 00:00:00 GMT + + High level summary

    We continue refactoring the UTxO HD prototype while we wait for the system level +benchmarks. We have created a new repository that contains the anti-diff +packages used in this prototype.

    On the Genesis front, we are preparing another meeting with the researchers to +audit the implementation design, and we continued working on basic tests and +simplifications.

    During the past two weeks we also introduced two new tools. One for dumping CBOR +encoded blocks to JSON, and another to serve a local immutable DB.

    Workstreams

    UTxO HD Prototype

    We are in the process of refactoring the UTxO HD prototype, while we wait for +the system level benchmarks to confirm if the performance of the prototype is +satisfactory.

    We also set up a repository for the anti-diff package, which +required us to refactor the code, write documentation, and prepare a release to +CHaP.

    Genesis

    We worked on basic tests for the Limit on Eagerness property of +Genesis. We also introduced further robustness and simplifications in the +Genesis Density governor. Finally, we developed a presentation to engage again +with the researchers on our Genesis implementation design.

    Technical debt

    Fostering collaboration

    We are in the process of polishing the ouroboros-consensus +documentation site, which we will use a the entry point for Consensus related +documentation. The first version will not be complete, but we plan on +systematically improving it.

    Support

    We added a tool to ouroboros-consensus-cardano-tools which allows +to dump the Chain DB blocks or any given CBOR encoded blocks as JSON.

    We also added another tool that serves an existing immutable DB via +BlockFetch and ChainSync. This tool can help in assisting our local benchmarking +efforts (for instance Genesis' ChainSync jumping prototype).

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-08-node-cli-api + 2023-02-08-node-cli-api + Wed, 08 Feb 2023 00:00:00 GMT + + 2023-02-08 - 2023-02-21

    High level summary

    More maintenance and resolving raised issues.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-08-performance-and-tracing + 2023-02-08-performance-and-tracing + Wed, 08 Feb 2023 00:00:00 GMT + + High level summary
    1. SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions.
    2. Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks.
    3. New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node.
    4. New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide.
    5. Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live.
    6. Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on.
    7. Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.

    Performance

    We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:

    • we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,
    • after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,
    • finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.

    In addition, we started benchmarks of the 1.35.6 release.

    Tracing

    A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way.

    Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting.

    Infrastructure

    On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders.

    The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment.

    The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops.

    ]]>
    + performance-tracing +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-03-crypto + 2023-02-03-crypto + Fri, 03 Feb 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril.
    • cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.

    Low level summary

    Mithril

    • Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing PR#722
    • We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper.
    • We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.

    cardano-base

    • There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381.
    • The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner.
    • The update VRF PR#341 is finally merged, and we are ready to merge PR#344, which implements conversion functions from the compatible types between Praos and PraosBatchCompat.

    KES agent

    • Use of snockets to send the data directly from the socket to secure memory.
    • We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives
    • Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.

    MuSig2

    The GitHub Action linelint is used to check the files.

    • A new job for linting is added to the file /.github/workflows/ci.yml. The rules are configured in the file /.github/workflows/.linelint.yml. Some files from the configuration of libsecp were failing, so in the rules in .linelint.yml the failing files are denoted to be ignored by the linter.
    • Folders are reorganized. We created a folder to handle the example. This folder includes the examplemusig2.c, a distinct config.h, and helper.c. The example is enhanced by implementing the functions in the helper for the configuration given in config.h. The number of messages is different than the tests. The example is made more generic to run with a loop.
    ]]>
    + crypto +
    + + <![CDATA[Goedel Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-03-goedel + 2023-02-03-goedel + Fri, 03 Feb 2023 00:00:00 GMT + + The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been preparing several papers for peer review +and knowledge sharing and consulting within IO and the community.

    Details

    • R&D Seminar on experience participating in a member based organisation
    • Full day tutorial on performance engineering presented at HiPEAC +2023 conference
    • Finished preparing and submitted a paper on performance engineering +to an ACM workshop
    • Preparing a draft paper for future submission about verifying design +refinements for distributed system design
    • Consulting on performance design of other IO projects
    ]]>
    + goedel +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-03-hydra + 2023-02-03-hydra + Fri, 03 Feb 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team completed the Hydra specification with a section about +rollbacks and updated graphs +(#448). In a next step, +the specification will be made more approachable and an open standard. They +improved their hydra-cluster tool to launch a local --devnet sandbox +environment and continued aligning the hydra-plutus scripts with the +specification by hardening the checks on close and contest transactions.

    What did the team achieve this week

    • Completed the specification with a section about rollbacks and updated graphs +#448, with a follow-up on making it more approachable and an open standard.
    • Continued spec review with internal auditor and incorporated changes.
    • Talked to TxPipe about how Demeter and Hydra could work together
    • The hydra-cluster executable can be used to launch a local --devnet sandbox environment.
    • Reproduced the “head being stuck on network outage” bug
      • relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed.
    • Progressed with higher velocity by addressing more and more gaps #677

    What are the goals of next week

    • Upstream our JSON instances to the ledger
    • Close all transaction security related on-chain gaps
    • Ideally release 0.9.0 with updated scripts
    • Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-02-02-ledger + 2023-02-02-ledger + Thu, 02 Feb 2023 00:00:00 GMT + + High level summary

    Much of the work the past two weeks involved integration efforts, +cleaning up and debugging some serialization issues, +adding tests, and work on large projects that are still ongoing. +We also released a CIP this week that aims to make the ledger +a registered CIP category.

    Lower level summary

    Ledger evolution CIP

    We published a +CIP +that will make the Cardano ledger a registered category of the CIP process.

    Serialization issues

    We had previously thought that we had found a serialization problem with the redeemers, +but it turned out to just be particularly confusing code. +We have now clarified the issue for the future.

    See pull-3263, pull-3269, and pull-3268.

    Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps.

    See pull-3277.

    New tests

    We added a new property test suite for some of our custom containers.

    See pull-3270.

    Progress on a better cost model serialization situation.

    We are still working our way through issue-2902. +Towards this end, we are now properly gating the new flexible encoders +until version 9.

    See pull-3274.

    Nightly tests

    We are still experimenting with moving more CI actions to GitHub actions.

    See pull-3276.

    Constraint based generators

    We continue to add to our proof of concept for constraint based generators. +See the previous ledger update for more information about this project.

    ]]>
    + ledger +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-27-hydra + 2023-01-27-hydra + Fri, 27 Jan 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team had a monthly review meeting with their stakeholders, +contributors and interested people from the community. The monthly repot for +January 2023 is a digest +of the things presented and also includes a summary of the meeting. The Hydra +specification was getting discussed and the team is incorporating suggested +changes of reviewers. Last but not least, they compute and publish script +information on every PR and also on the +website +now.

    What did the team achieve this week

    • Had the monthly review meeting with a broader audience
    • Published the monthly report for January 2023
    • Reviewed the spec and discussed individual aborts with researchers
    • Compute and publish script information along benchmarks on every PR and website

    What are the goals of next week

    • Add rollback section to Hydra spec, update pictures and publish it as part of repository
    • Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository.
    • Groom & plan actions required for a maintainable Head explorer + break down align gaps feature.
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-26-mithril + 2023-01-26-mithril + Thu, 26 Jan 2023 00:00:00 GMT + + High level overview

    The Mithril team released a new 2302.0 distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes.

    Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node.

    Low level overview

    • Released the new distribution 2302.0
    • Implemented a backward/forward compatibility mechanism for API messages #688:
      • Implement the mechanism for the signer registration #689
      • Implement the mechanism for the signature registration #693
      • Implement the mechanism for epoch settings #695
      • Implement the mechanism for certificate pending #696
      • Implement the mechanism for certificate #697
      • Implement the mechanism for snapshots list #698
      • Implement the mechanism for snapshot #699
      • Update enforcement of API version with Semver #705
    • Completed the PoC implementation of backward compatibility with protobuf #677
    • Completed the PoC implementation of backward compatibility with avro #678
    • Completed the PoC to Read/Write transaction on chain for Era activations #672
    • Completed the upgrade Cardano devnet to 1.35.4 #523
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-25-consensus + 2023-01-25-consensus + Wed, 25 Jan 2023 00:00:00 GMT + + High level summary

    During the past two weeks, the consensus team finished the testing activities +around the UTxO-HD prototype. This is a very important milestone which will +enable us to run system-level tests and benchmarks, as well as start refactoring +and cleaning the prototype. Regarding our Genesis workstream, we elaborated a +roadmap that gives an indication of the remaining work. We also continued our +work on benchmarking chain-sync-jumping. We also continued working on improving +the way we handle blocks from the future, and advancing the integration of the +new VRF and KES crypto.

    Workstreams

    UTxO HD Prototype

    As the prototype is nearing its completion, it was important to have enough +confidence that we will be able to move additional parts of the ledger state +onto disk. We worked together with the Ledger team to elaborate a +sketch on how the UTxO-HD design would accommodate the migration of +additional data from memory to disk. This gave us enough confidence that the +current architecture will be extensible in the future.

    On the testing front, we added property-based tests for the UTxO-HD +type classes.

    We also enabled disabled components, and addressed several +technical debt issues:

    • Implement splitSized anti-diff split (#4269), and integrate it +into consensus (#4273).
    • Renaming of peekVal to peekMDBVal (#7).

    We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We +found a race condition in the LMDB backing store, which we fixed. +After the fix we were able to successfully run these benchmarks. The results +were published by this pull request.

    We used our db-analyser tool to benchmark the cost of reading keys and +flushing values to disk. The following plot shows the duration of these disk +operation in relation to the main ledger operations, where we can see that the +cost of the former are comparatively low. The spike at the beginning of the +graph is when, at the start of the Shelley era, the entire UTxO set is flushed +to disk.

    UTxO-HD read and flush benchmarks

    After months of hard work adding tests for the prototype, we are ready to run +end-to-end tests on the node, and system level benchmarks. This signals a very +important milestone for the UTxO-HD workstream 🎉.

    Genesis

    We elaborated a high-level decomposition of the remaining +work for Genesis. We also continued benchmarking the chain-sync-jumping +happy-path.

    Technical debt

    We continued working on improving the way we handle blocks from the future.

    Support

    We completed the mapping of Crypto to HeaderCrypto and body Crypto. +HeaderCrypto is moved to cardano-protocol-tpraos. We created a draft pull +request to facilitate compiling consensus.

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-25-node-cli-api + 2023-01-25-node-cli-api + Wed, 25 Jan 2023 00:00:00 GMT + + 2023-01-25 - 2023-02-07

    High level summary

    General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the cardano-cli query stake-snapshot command.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-20-crypto + 2023-01-20-crypto + Fri, 20 Jan 2023 00:00:00 GMT + + High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We explored whether some uses of transmute could be removed, but it resulted in considerable regression.
    • cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision.
    • KES agent: An inconsistency between contra-tracer available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the contra-tracer used by consensus.

    Low level summary

    Mithril

    • We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average PR#675. We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing.
    • We are writing a RFP for the audit of the core library.

    cardano-base

    • A problem with Nix is blocking merge of PR#341
    • Plutus team ran benchmarks of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution.
    • Team is fully digesting the Plonk paper.
    • There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used.

    KES agent

    • A little unforseen delay has been caused by a mismatch in the use of contra-tracer. The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are doing the change, but still the CI is not happy.
    • The same was needed for the KES agents prerequisites PR#317.
    • We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency
    ]]>
    + crypto +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-20-hydra + 2023-01-20-hydra + Fri, 20 Jan 2023 00:00:00 GMT + + High-level summary

    This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1 +specification. Of which a first version has been aggregated and is currently +under review. They aligned the on-chain scripts of reimbursing funds on abort +like defined in the specification, improved the mutation test framework to have +more control when testing plutus scripts. The added HeadId in the API and the +TUI example client make hydra-node easier to use and a first experiment of a +Hydra Head explorer was showing the utility of this - see what Heads exist on +the preview network here.

    What did the team achieve this week

    • HeadId to API and display in the TUI #678
    • Experiment of creating a hydra explorer, first result hosted here
    • Improved mutation framework allowing to fail for the right reason #679
    • Correctly reimburse funds in abort (matching the spec) #670
    • Finished a first write-up of the Hydra HeadV1 spec: Read it on overleaf (Communication channels for feedback)

    What are the goals of next week

    • Monthly review meeting with a broader audience
    • Groom & plan actions required for a maintainable Head explorer
    • Break “align gaps” feature into smaller chunks (at least on- /off-chain) and groom it
    • Review the spec & discuss individual aborts with researchers (a bigger open question)
    ]]>
    + hydra +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-20-network + 2023-01-20-network + Fri, 20 Jan 2023 00:00:00 GMT + + High level summary

    We have been working towards cardano-node-1.35.5 release. QA & benchmarking +teams gave a green light for the release, and we made decent progress with some +CI problem which we encountered on the way (PR #4612). We are also working on +peer sharing, making improvements in our testing infrastructure, reducing +technical debt and making progress towards io-sim-1.0.0.0. Galois is making +progress on Handshake improvements.

    Low level summary

    Our diffusion simulation network now includes a mixed network of initiator +only and initiator and responder nodes. issue #4222

    We are now reviewing the peer sharing pull request.

    We are also reviewing pull request which introduces handshake query flag. PR #4256

    We fixed a bug in our network simulator. The bug was triggered when a node +died when performing a simultaneous TCP open (a corner case of a corner case!). PR #4265

    We also refactored Snocket interface and removed the bearer construction from +its methods. PR #4260

    We are working towards releasing io-sim-1.0.0.0 on Hackage, which includes +reviewing two PRs: PR #57 and PR #60 as well as writing an announcement +blog post.

    ]]>
    + network + release +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-20-sre + 2023-01-20-sre + Fri, 20 Jan 2023 00:00:00 GMT + + High level summary

    The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing +support for cardano-world.

    Lower level summary

    Cicero

    • Fixed various race conditions around transformers.
    • Brought our CI up to date.
    • Migrated to the Nomad exec driver with Nix support for many actions.
    • Moved Nix builds to the Nomad clients for much better cache locality.
    • Ongoing work on vastly improving the action matching and evaluation speed.

    Tullia

    • Made it easier to support cloning from a PR's fork
    • Update to latest std
    • Add workaround for cgroup issue: nomad#12877
    • github preset: add github.ci.remote and (read|get)Repository functions
    • Fix various issues around CUE handling

    Bitte

    • Upgrade to NixOS 22.11
    • Prototype usage of Colmena for deploys instead of deploy-rs
    • Finalized work on Equinix Metal support
    • Prototype better secrets management with ragenix instead of sops-nix
    • Improve CI and bring it up to date

    cardano-world

    • Fixd various OOM issues on preview and preprod
    • Rotated KES keys on preview and preprod
    • Optimize mainnet db-sync to cope with higher load
    • Fix an issue where PostgreSQL would fail after a reboot

    bitte-world

    • Updated to NixOS 22.11

    ci-world

    • Updated to NixOS 22.11
    • Added Equnix cluster
    • Improve caching of Nix builds
    ]]>
    + sre +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-19-ledger + 2023-01-19-ledger + Thu, 19 Jan 2023 00:00:00 GMT + + High level summary

    The ledger team completed some preliminary ground work in preparation for CIP-1694 +(restructuring the ledger state), +fixed the PDF hosting problem (mostly the formal specs), +built out more of the new user-friendly ledger API, +finished a proof of concept for constraint-based generators for property tests +(with the hopes of being able to replace our trace generators one day), +and addressed technical debt.

    Lower level summary

    Restructuring the ledger state

    The existing governance structures will be replace in the conway ledger era, +as described in CIP-1694. +In particular, the ledger rules will be restructured as follows:

       BBODY
    |
    |-------------------------------|
    v v
    TICK LEDGERS
    | |
    |---------| |
    v v v
    RUPD ~NEWEPOCH~ ~LEDGER~
    | |
    |----------| |--------|-------------------|-----------|
    v v v v v
    ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+
    | | |
    |---------|------------| v |
    v v v DELPL v
    SNAP POOLREAP -UPEC- | UTXO
    |--------| |
    v v v
    POOL DELEG ~UTXOS~

    -..- Removed
    +..+ Added
    ~..~ Modified

    Moreover, the ledger state will also be restructured in accordance with the new rules. +In the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT. +We have also adapted all the data structures in the ledger state.

    See:

    PDF hosting

    We now build all of our PDFs using a GitHub action which is triggered by pushing a tag +with a specific form, cardano-ledger-spec-YYYY-MM-DD. +The action creates a GitHub release containing the PDFs. +The links in the main ledger README now point to the PDFs in the latest release.

    See:

    Powering the new ledger API

    We have now removed all the HasField instances from the protocol parameter data types, +and replaced them with lenses. +This is probably the last major restructuring that the ledger team will do on the code base +for the API for a while +(the Plutus tools team will be working on it next, see here). +We also added a new helpful function ensureMinCoinTxOut.

    See:

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We would like to switch to tests which instead generate a random ledger state representative +of not just an initial state, generate a single random valid block, and then test our properties. +The hope is that these will be much more random and easier to maintain.

    We have finished a proof of concept are encouraged that this approach could work!

    See:

    Technical debt

    • pull-3244 massive CI speedup
    • pull-3249 better types for fees in the protocol parameters
    • pull-3264 move our annotator code to the cardano-ledger-binary package where it belongs
    • pull-3239 move the Wdrls type to the Core module.
    ]]>
    + ledger +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-14-db-sync + 2023-01-14-db-sync + Sat, 14 Jan 2023 00:00:00 GMT + + High level summary

    After spending the last months on improving DBSync and releasing 13.1.0.0 the DBSync team focused +the last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the +new leger core and ghc-9.2.4

    Lower level summary

    • Integrate CHaP +#1331
    • Integrate new ledger core 0.1.1.1 and ghc-9.2 +#1332
    • Technical debt: Add code formatter fourmolu +#1334
    • Preparing and tracking Conway and UTxO integration
    ]]>
    + db-sync +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-13-hydra + 2023-01-13-hydra + Fri, 13 Jan 2023 00:00:00 GMT + + High-level summary

    Since last weekly update before christmas, the Hydra team worked on the +technical specification, closed gaps in hydra-plutus scripts, made the unique +headId available to Hydra clients through the API, allow the hydra-node to +explicitly synchronize from genesis (if configured), and fixed smaller log and +build issues reported by new users.

    Besides this, a retrospective blog +post +was published by Matthias Benkort (CF) on Hydra, summarizing our progress made +in 2022 also an outlook where Hydra is headed for in 2023. Also, the team had +some first sessions on the voting project with Catalyst and the CF.

    A full digest monthly digest for December 2022 can be found on the hydra +website.

    What did the team achieve this week

    • Had some first sessions on the voting project with Catalyst and CF
    • Published retrospective blog +post +by Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also +an outlook where Hydra is headed for in 2023.
    • Worked on the LaTeX spec for HydraHeadV1, not final or published yet - latest +version in this repository.
    • Add unique headId to API and hence make it available to clients.
    • Allow hydra-node to explicitly synchronize from genesis using --start-chain-from 0.
    • Closed gaps in hydra-plutus scripts
      • bounded transaction validity (ADR21)
      • enforcing contract continuity via state token in output
    • Fixed JSON for some logs and smaller build issues reported by new users.

    What are the goals of next week

    • Reach out to have hydra-tutorial integrated.
    • Plan the next couple of months.
    • Complete checking reimbursing of commits in head validator.
    • Align plutus scripts to spec and simplify them (identified some simplifications)
    • Improve mutation framework to be sure we fail tests for the right reasons
    • Complete the spec except the open points (<5) and also discuss them with researchers.
    ]]>
    + hydra +
    + + <![CDATA[Node Release Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-13-release + 2023-01-13-release + Fri, 13 Jan 2023 00:00:00 GMT + + Node Reelease Update

    2022-11-02 - 2023-01-13

    Executive Summary

    A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on +release/1.35 branch and does not bump cardano-ledger.

    The team successfully integrated an interim release bump of ledger and consensus into cardano-node master. +This work will not be released in a node version, but will be continued by the current dependency bump in progress.

    We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again.

    The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress.

    Completed

    In Progress

    ]]>
    + release +
    + + <![CDATA[System Test Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-13-system-test + 2023-01-13-system-test + Fri, 13 Jan 2023 00:00:00 GMT + + High level summary

    During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the P2P Single +Relay functionality.

    We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level.

    Workstreams

    Framework improvements:

    • extended the cardano-node-tests with the ability for anybody to fork the repo and run all our System Tests on GitHub Actions
    • added 2 new nightly pipelines - nightly-mixed and nightly-p2p - details here
    • some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;

    === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) === + to + === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===

    Node:

    • ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled
    • started the preparations for testing the next tag - details here

    DB-Sync:

    • some improvements on db-sync sync tests
    ]]>
    + system-test +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-12-mithril + 2023-01-12-mithril + Thu, 12 Jan 2023 00:00:00 GMT + + High level overview

    The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ADR. They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible.

    Finally, they have worked on upgrading the devnet and fixing some flakiness in the end to end tests of the CI.

    Low level overview

    • Implemented the redaction of an ADR for handling graceful updates of the Mithril Network #671
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with protobuf #677
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with avro #678
    • Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction #672
    • Worked on upgrading the Cardano node of the Mithril devnet, as well as fixing flakiness of the CI #523
    • Prepared and tested the new 2302 distribution pre-release 2302.0-prerelease
    • Updated the documentation for SPO to build a signer node in order to better reflect the new release process #681
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-11-consensus + 2023-01-11-consensus + Wed, 11 Jan 2023 00:00:00 GMT + + High level summary

    The consensus team is resuming its activities after the Christmas break. During +these weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and +discussing with the Ledger team the changes that might be required for the next +iterations. The pull request that adds the Conway era is waiting for a second +review round and we hope to merge it soon. On the technical debt side we are +looking into a property-test failure found in the iterators. We are +investigating if this is an error in the model or in the implementation. We also +improved the documentation of our testing code.

    Workstreams

    UTxO HD Prototype

    We worked with the Ledger team to start preparing the next versions of UTxO-HD. +The Ledger team is concerned that for the remaining maps we might need the full +ledger state on epoch boundaries. Since the main consumer of the ledger rules is +Consensus, the code that requires access to a full state could be moved from the +ledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take +place in such bridge, instead of querying the ledger for the values that are +required in the epoch-transition computations.

    We relocated some UTxO-HD definitions, in preparation for merging +the prototype into master.

    We also completed updated local benchmarks comparing the replay time and memory +consumption of:

    • the baseline node (f2fc76ef45647275c98634da1718290b976ff364)
    • the UTxO-HD node with the in-memory backend
    • the UTxO-HD node with the LMDB backend

    The following plot shows the results: we can see that the LMDB node barely +reaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The +in-memory backend is about 30 minutes faster, but still slower than the baseline +version. We are aware of this phenomenon and it is inherent to the problem of +maintaining sequences of differences of the last k ledger states that allows +us to perform rollback and roll-forward. We are in the process of measuring +syncing from scratch times.

    We also added StaticEither accessors that helped us to simplify +the UTxO-HD prototype.

    New Conway era

    We incorporated the feedback of the pull request, and rebased this +branch on top of master. The PR is pending a second review round and we hope +to merge this soon.

    Technical debt

    We are investigating a property-testing failure involving +iterators. Solving this requires understanding the expected behavior of +iterators in the counterexample found by QuickCheck to determine if the error +is in the model or in the implementation.

    Fostering collaboration

    We moved the contents of docs/Testing.md closer to the code, so that the +explanations about the tests are easier to find in the relevant modules, and the +documentation is easier to keep up to date.

    ]]>
    + consensus +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-11-performance-and-tracing + 2023-01-11-performance-and-tracing + Wed, 11 Jan 2023 00:00:00 GMT + + High level summary

    Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:

    1. SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress.
    2. The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over.
    3. Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks.
    4. New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs.
    5. Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench.
    6. Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.

    Performance

    The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on.

    Tracing

    The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done.

    Infrastructure

    Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components.

    On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters. +We now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes.

    We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development. +Once this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads.

    ]]>
    + performance-tracing +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-06-crypto + 2023-01-06-crypto + Fri, 06 Jan 2023 00:00:00 GMT + + High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: The API features (error handling) has been merged.
    • Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI.
    • KES agent: We keep progressing with KES secure forgetting implementation.

    We also started working in the cryptography engineering handbook, which will be a cross team effort.

    Low level summary

    MuSig2

    • Merged the more granular error handling mechanism PR#33

    Mithril

    • Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in Version 0.1.1, which was published in crates.io.
    • Updated new KES format to mithril library PR 674
    • We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync PR 531
    • We keep progressing on reducing the use of transmute in mithril-stm.

    cardano-base

    • Nothing new to report. Still working in merging these PRs. We are only missing nix merge of PR#520 and the updates on VRF will be merged.

    KES agent

    • We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests PR#255.

    Cryptography handbook

    We have made available the (temporary) cryptography handbook https://input-output-hk.github.io/cryptography_spec/, and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives.

    ]]>
    + crypto +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2023-01-05-ledger + 2023-01-05-ledger + Thu, 05 Jan 2023 00:00:00 GMT + + High level summary

    The ledger team finished up the remaining work for tracking individual depots, +built out the new Conway era transaction body (in line with CIP-1694), +greatly reduce some problematically large calculations on the epoch boundary, +and addressed technical debt.

    Lower level summary

    Finishing the deposit tracking

    The initial work on the individual deposit tracking project focused only on correctness. +As this is a large data structure +(since its size is linear with respect to the number of registered stake credentials), +it is very important that we also reduce the memory overhead as much as possible. +Fortunately, we were able to add very little overhead for the deposits by using existing +efficient data structures. The extra tracking now only incurs one word (8 bytes) +per registered stake credential.

    See:

    New Conway era transaction

    We implemented the Conway era transaction body, which is in line with CIP-1694. +Note that the Conway era implements, losing speaking, the parts of CIP-1694 that are not +related to the liquid democracy (the "DReps"). +The new transaction body adds the new governance actions and votes, +while also deprecating the old governance structures +(i.e. the old protocol parameter updates and MIR certificates).

    We also now have the wire specification (CDDL file) and serialization code in place. +The wire specification is still subject to change while we work on the Conway era, +but it is now usable and has proper testing support +(so that, for example, the serialization round-trips, etc).

    See:

    Optimizing the TICKF transition

    Every since the release of the Shelley era, we have been working to reduce the computational load +placed on the node by the ledger at the epoch boundary. +While still not perfect, we believe that we have removed one of the final problematically long +epoch boundary computations that exacerbate situations like +this. +In particular, the problem involved the way in which the consensus layer obtains a view of the +ledger for the purposes of checking the leadership schedule in a new epoch. +We implemented a stopgap measure which now only incurs a single multi-second cost once per epoch +instead of potentially several multi-second costs while the networks waits for the first block +of a new epoch to be minted.

    See:

    Technical debt

    We closed the year out with a lot of reduction to the technical debt!

    Improved ledger event

    • pull-3212 - The ledger events are not guaranteed to appear in any given order within a block. +For this reason, motivated by the use case in db-sync, the TotalDeposits event now +includes a transaction ID and emits the change in deposits instead of the value.

    Improved type saftey

    • pull-3208 - We replaced NominalDiffTime with a newtype wrapper. The problem was that our CBOR +encoders and decoders were using the wrong level of precision, having to due with with +the Shelley genesis file. We removed the potential problem with a newtype wrapper.
    • pull-3167 - We now use a GADT to ensure consistency of the Plutus language in the types +for TransactionScriptFailure and PlutusDebug.

    Code/Module organization

    • pull-3175 - The Allegra and Mary eras had an unusual relationship in our codebase, +due to the uncertainly of release dates while we were implementing them. +In particular, they were coupled in way that is different from the rest of the code base. +With hindsight on our side, we split the combined shelley-ma Haskell package into two +separate ledger era packages, which is now consistent with the rest of the repository +and module structure.
    • pull-3184 - We created a core test sub-library, cleaning up a lot of our property test +generator code.
    • pull-3210 - We moved the KeyPair type to the test library. Outside of testing, +the ledger does not need to deal with signing keys, and since this is a topic that +deserves the utmost care, it is best to make it clear that our use of signing keys +is only for testing.
    • pull-3229 - We split the Cardano.Ledger.Alonzo.Data module, which is more consistent with the rest +of the codebase.

    Revert pointer address deprecation

    Thanks to one of our excellent internal auditors, +@jmhrpr, +we now have a better plan for deprecating pointer addresses. +This meant that we had to revert the previous work to deprecate them.

    See:

    Miscellaneous

    • pull-3205 - We removed deprecated type synonyms.
    • pull-3218 - We cleaned up the address deserialization.
    • pull-3223 - We fixed faulty address deserialization tests.
    • pull-3222 - We switched to a general type family TxOut from concrete ones, +reducing many constraints.
    • pull-3224 - ShelleyGenesis is now parameterized by crypto instead of by era.
    • pull-3170 - We set the cabal-version to 3.0 in our projects.
    • pull-3172 - We removed the now useless EncodeMint/DecodeMint classes.
    • pull-3225 - We switch from ormolu to +fourmolu. +The reason was to be able to finally have more diff friendly code!
    ]]>
    + ledger +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-28-node-cli-api + 2022-12-28-node-cli-api + Wed, 28 Dec 2022 00:00:00 GMT + + 2022-12-28 - 2023-01-10

    High level summary

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-16-hydra + 2022-12-16-hydra + Fri, 16 Dec 2022 00:00:00 GMT + + High-level summary

    This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on the website and reduced the cost for commit transactions by ~30% with the help of reference scripts.

    The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023.

    What did the team achieve this week

    • Kicked-off Hydra Voting project with Catalyst, CF, and IO Research.
    • Reduce commit transaction costs by ~30% with reference scripts.
    • Prepared an RFP for external audit of the Hydra Head solution.
    • Fixed transaction cost benchmarks for abort tx #631.
    • Recorded decision to use model-based testing (ADR22) and improved Model documentation.
      • Concluding the first increment on Validate coordinated Head protocol #194.
      • Formulated next step / follow-up on testing the Soundness property of our protocol #656.
    • Switched to using nix flakes for development setup and CI build #646.

    What are the goals of next week

    • Push ADR21 & tx validity gap over the finish line (smoke tests missing).
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Close & recap on the year with another monthly report (+ blog post).
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-15-mithril + 2022-12-15-mithril + Thu, 15 Dec 2022 00:00:00 GMT + + High level overview

    The Mithril team has released the new distribution 2248.1 of their nodes. They have published the first version of the Mithril cryptographic library on crates.io, the Rust community’s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots.

    Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities.

    Low level overview

    • Implemented removing verification key and stake from single signatures #619
    • Completed the extraction of the signer registration from the multi-signer #642
    • Completed the extraction of the certificate creation from the multi-signer #638
    • Implemented a workflow to test client binaries (Linux / MacOS / Windows) #601
    • Completed the signature of the artifacts produced by the CI #587
    • Fixed the protocol parameters transition #627
    • Worked on optimizing the snapshot digest computation #510
    • Worked on enforcing the API protocol versions in the client and signer #633
    • Worked on deactivating the non certified signer registration mode #621
    • Worked on the re-genesis of the test networks #651
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-14-consensus + 2022-12-14-consensus + Wed, 14 Dec 2022 00:00:00 GMT + + High level summary

    During the past two weeks, the Consensus team finalized the QSM tests for the +backing store and Mempool on the UTxO-HD branch with important discoveries +regarding parallel QSM testing. We also worked with the Ledger team to envisage +the modifications that are required in Ledger and Consensus to accommodate the +changes in the crypto VRF and KES. The db-analyser now supports bechmarking +the ledger operations, which will allow us to identify, debug, and profile +potential performance problems. We drafted a document that defines how to manage +the versions of Consensus-related packages. The top level documentation of +ouroboros-network now features a description of the consensus components and +provides a hyperlinked map to the modules documentation.

    Workstreams

    UTxO HD prototype

    Whereas we had passing sequential state-machine tests for the mempool, the +parallel case proved to be more challenging than we thought. The operation of +adding a list of transactions to the mempool is not atomic and, as a result, +when adding a list of transactions, transactions from other processes can be +added in between. The mempool implementation handles this correctly, however +this required us to redesign the parallel model we had to take +the lack of atomicity into account.

    Backing store property tests

    We finished refactoring the backing store property tests. The second review +round is ongoing.

    LSM tree implementation

    We are working on benchmarking (in terms of time and number of IO operations) +fetching/looking up data from disk.

    Genesis

    We worked on the design of a mechanism to prevent a DoS attack on our Genesis +design related to rollbacks. This was arguably the biggest outstanding question.

    During the discussions around Genesis, we noticed a design boundary that nicely +delineates a fundamental component. We almost have a full Haskell prototype of +it. It will be very nicely self-contained, perhaps even usable in the ultimate +implementation!

    New VRF and KES crypto integration

    We collaborated with the Ledger team on preparing the ledger state and crypto +types to avoid huge allocation on the epoch boundary when changing aspects of +the crypto that will only manifest in headers, not in the ledger states.

    Technical debt

    We merged the pull-request that adds a support to db-analyser for +benchmarking ledger operations. This will allow us to identify, debug, and +profile potential performance problems. The benchmark focus on the main 5 ledger +operations that are involved in chain syncing, block forging, and block +validation, namely:

    1. Forecast.
    2. Header tick.
    3. Header application.
    4. Block tick.
    5. Block application.

    The following figure shows a plot of the benchmarking results for the first 65 +million blocks (approximately) of the Cardano chain. The thin yellow lines under +the x-axis show the epoch boundaries, whereas the thick yellow lines correspond +to the era transitions.

    As we can see in this figure, era and epoch boundaries require more computation +time. The ledger team are aware of this problem, and we are working to improve +this situation.

    Fostering collaboration

    We drafted a document motivating and defining how Consensus (and +possibly other core teams) will/should manage our package versions. This +pull-request garnered many great discussions from our team members and other +teams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et +al. We want to thank you all for your input, and we found this discussion very +enlightening!

    We merged the pull request that adds an overview of consensus to +the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    ]]>
    + consensus +
    + + <![CDATA[DB-sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-14-db-sync + 2022-12-14-db-sync + Wed, 14 Dec 2022 00:00:00 GMT + + High level summary

    The DBSync team continued testing release 13.1.0.0. The QA team has reported that no issues have +been found. The DBSync team also worked on cherry-picks back to master and on fixing bugs.

    Lower level summary

    • Release is cherry-picked back to master, which uses the new rollback mechanism which uses +reverse indexes, same as the release +#1320 +This also fixes a bug number of issues on master.
    • Depenencies upgrade and CHaP integration +#1324
    • AdaPots fix #1323. This +fixes an issue where the per epoch AdaPots didn't match the epoch boundary, but +they also included changes from the first block of the epoch.
    • Deposits Event fix #3212. This pr +adjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the +number of queries that db-sync does during syncing an make syncing faster.
    ]]>
    + db-sync +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-14-node-cli-api + 2022-12-14-node-cli-api + Wed, 14 Dec 2022 00:00:00 GMT + + 2022-12-14 - 2022-12-27

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    ]]>
    + cli-api +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-14-performance-and-tracing + 2022-12-14-performance-and-tracing + Wed, 14 Dec 2022 00:00:00 GMT + + High level summary
    1. SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment.
    2. A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery.
    3. The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals.
    4. Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started.
    5. Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.

    Performance

    The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload.

    We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling.

    Tracing

    After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical.

    To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:

    1. We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration.
    2. The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.

    All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further.

    In addition, we're still pursuing our performance-enhancing rework of the new tracing internals.

    Infrastructure

    After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends.

    Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it. +This means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis. +This will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports.

    A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches. +Previously we only had automation for two aspects separately, so we only could either:

    • compare individual runs (used for different node configurations / versions)
    • collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version) +Naturally, combining these two capabilities was a long-desired feature of our analysis pipeline.
    ]]>
    + performance-tracing +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-12-network + 2022-12-12-network + Mon, 12 Dec 2022 00:00:00 GMT + + High level summary

    In last sprint the team focused on preparations for the conference talk at +OPODIS 2022. We also worked on preparations to publish io-sim and related +packages on Hackage (PR #57, PR #60).

    We also started reviewing:

    • ouroboros-network
    • cardano-node
    • cardano-ledger +repositories for open-source readiness (PR #4128).

    We prepared a PR which changes how node-to-node and node-to-client protocol +versiones are serialised in cardano-node log (PR #4691).

    ]]>
    + network + release +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-09-crypto + 2022-12-09-crypto + Fri, 09 Dec 2022 00:00:00 GMT + + High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency.
    • Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack.
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • [Still in progress] We are introducing a more granular error handling mechanism PR#33
    • We merged the API redesig PR#35
    • We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future PR#36

    Mithril

    • We merged the individual signature PR#620
    • We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (kes repo)

    cardano-base

    • Nothing new to report. Still working in merging these PRs.
    • We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a bug in GHC

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Fixed a 'use-after-free' bug in the KES agent.
    ]]>
    + crypto +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-09-hydra + 2022-12-09-hydra + Fri, 09 Dec 2022 00:00:00 GMT + + High-level summary

    This week, the Hydra team has worked on completing to "Validate coordinated head protocol against formal model", this is a huge step to verify the implementation is secure. They also worked on implementing ADR21 related to bounded tx validity which is now under review. HydraPay project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of issues they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced.

    What did the team achieve this week

    • Document model based testing #194 & #641
    • Got ADR21, reducing gaps between implementation and specification, under review.
    • Complete review on hydra-tutorial.
    • Complete first round of review on HydraPay work #634
    • Meeting with Director of CyberSecurity frio IOG to unblock "the RFP prepared for the external audit" #606
    • Remove vasil-dev and testnet from smoke-test because they were not working #630
    • Fix flaky plutus-merkle-tree test #642
    • Refactor NetworkSpec to improve legilibility.
    • Fix benchmark cost for abortTx #631
    • Adapt nix.conf to the recent hydra-ci nix cache migration.

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation.
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Get Cicero (new CI) working.
    • Use reference inputs to reduce the cost of the commitTx.
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-09-ledger + 2022-12-09-ledger + Fri, 09 Dec 2022 00:00:00 GMT + + High level summary

    The Plutus tools team at IOG has started helping the ledger team to build out a user friendly +cardano-ledger-api package! +A GitHub project +will be filled out in the days ahead, +people interested in the API can use it to follow along and join in on the conversations.

    The ledger team has started using +architectural decision records +to leave a record of important decisions that the team makes. +We will retroactively go back through past decisions and make ADRs for them.

    The logic to track individual deposits is now nearly in place. +We are prioritizing correctness with our first pull request, and will follow up with +performance optimizations and general cleanup next.

    Pointer addresses are being deprecated with the Cardano major protocol version 8. +See CPS-0002 +for more context.

    Lower level summary

    Cardano ledger API

    The Plutus tools team has taken our minimal cardano-ledger-api package and started filling it +out and adding much needed documentation. +They have also added doctests! +In the days to come, the Plutus tools team will map out a lot more work for the API and record +it in this +GitHub project.

    See

    Architectural Decision Records (ADRs)

    We are now providing more context and leaving a record of important decisions that are made +in the ledger. The first ADR explains the very lightweight process.

    See

    Tracking individual deposits

    See ADR-3 +for background. +We now have the logic in place to track individual deposits, and a host of property tests +to make sure that the logic is correct. +The current implementation uses more memory than it needs to, and we will address that next, +with our hope being to only use one word (8 bytes) per registered stake credential. +There is a fair amount of other cleanup needed for general maintainability.

    See

    Removing pointer addresses

    Pointer addresses, which have never seen any real use +(there are something like eleven on mainnet), are being deprecated starting at Cardano major +version 9. +CPS-0002 gives the context. +We are disabling them by first preventing transaction outputs containing them +from being serialized by the node at the moment we switch to version 9. +At the hard fork after that, we will translate the existing few pointer addresses +to enterprise addresses.

    See

    Technical debt

    • pull-3162 - Sometimes we have to put safeguards in place for hard forks which may never +be exercised. After we have passed the given hardfork, we are able to clean up the code +and simplify our logic. We removed all of the ones that we are currently easily able to.
    • pull-3165 - We improved the type safety of our code while also discovering and fixing +a serialization bug.
    • pull-3172 - We removed dead code.
    • pull-3175 - The Allegra and the Mary code used to be coupled in a particular way the we grew to +dislike. We made these two ledger eras now uniform with the rest of our code base.
    • pull-3184 - We organized our property testing code.
    • pull-3200 - The Plutus tools teams fixed an outstanding bug in the translation from the +ledger state to the Plutus script context.
    ]]>
    + ledger +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-02-hydra + 2022-12-02-hydra + Fri, 02 Dec 2022 00:00:00 GMT + + High-level summary

    This week, the Hydra team has worked on cleaning up several things in progress +after last week's summit. They have extended their model-based testing (MBT) +approach with transaction creation & observation +#410, solved +AcquirePointTooOld problems of the hydra-node with by changing the wallet +initialization #439. +Also, the Hydra researchers updated the security proofs of the Coordinated Hydra +Head, which are bound to be included in the Hydra HeadV1 specification.

    What did the team achieve this week

    • Monthly review & report - will also be published on our website #644
    • Extended the model-based testing (MBT) with transaction creation/observation #410
    • Solve AcquirePointTooOld problems with new wallet initialization #439
    • Fixed our hydraw deployments (EC2 instances)
    • Created & discussed ADR21 within tx validity work
    • Received & discussed security proofs of Coordinated Hydra Head (requires more work)

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation
    • Complete review & integrate the Hydra tutorial
    • Review latest hydra-pay work
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec
    • Get Cicero (new CI) working
    ]]>
    + hydra +
    + + <![CDATA[DB sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-01-db-sync + 2022-12-01-db-sync + Thu, 01 Dec 2022 00:00:00 GMT + + High level summary

    The DB Sync team prepared a release 13.1.0.0-rc2 which includes many improvements for db-sync, +it makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces +migrations. This release finalises the objectives that were set for db-sync for the previous +3 months period and part of the syncing speed objective set for the next period +Changelog

    Lower level summary

    • Branch release/13.1.0.x +includes all the improvements related to the release. The release is passing through the testing +phase and a number of bugs and issues have been fixed, like +#1312 +#1311. +Also many new unit tests have been added.

    • Part of the release branch is cherry-picked back into master, in a way that it respects the new +release and development process, so that it takes into account migrations +release process

    • The DB Sync team has also tagged release 13.0.6 which better supports preview and preprod for +docker.

    ]]>
    + db-sync +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-01-mithril + 2022-12-01-mithril + Thu, 01 Dec 2022 00:00:00 GMT + + High level overview

    The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes.

    Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer.

    Low level overview

    • Implemented custom Mithril SPOs on testing/pre-release networks #563
    • Deprecated Signer Declarative Pool Id registration mode #585
    • Completed the second stage of the store automatic migration process #600
    • Completed the deployment pipelines to crates.io registry #588
    • Completed automatic generation of nodes/libraries versions manifest in releases notes #599
    • Completed CI/CD handling of PR from forks #597
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #586
    • Worked on signing the artifacts released in the distributions by the CI/CD #587
    • Worked on multi-platforms end to end test #601
    • Worked on the refactorizaton of the aggregator multi-signer engine #398
    ]]>
    + mithril +
    + + <![CDATA[System Test Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-12-01-system-test + 2022-12-01-system-test + Thu, 01 Dec 2022 00:00:00 GMT + + High level summary

    During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the P2P Single +Relay functionality, and also tested some DB-Sync tags.

    Workstreams

    Framework improvements:

    • moved the System Test CLI Pipelines from BuildKite to Github Actions
    • improved the reporting tools to support the rerun of the failled tests and update of the reports
    • added support for Github API in report-aggregator, so reports will be generated from the GitHub nightly jobs from now on
    • added support for mixed topology - P2P, legacy, mixed topologies
    • planned the P2P Single Relay system test activities
    • added support to start regression tests with PV8 + better selection of tests

    DB-Sync:

    • confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)
    • tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2
    ]]>
    + system-test +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-30-consensus + 2022-11-30-consensus + Wed, 30 Nov 2022 00:00:00 GMT + + High level summary

    During the past two weeks, the consensus team merged improvements to the monadic +cursor API that was needed to implement LMDB range reads, which is in turn +required for the implementation of the UTxO HD feature. We added tables to +several tests in for the UTxO HD feature, which increases our confidence in the +correctness of the prototype. The mempool property tests are close to being +completed. Also, we finished the LSM tree tuning algorithm.

    On the Genesis front we started simplifying the BlockFetch logic with +CSJ-specific workloads in mind.

    We are also documenting the Block Diffusion Pipelining feature, and added a +high-level overview of consensus to the top level documentation of +ouroboros-network.

    Workstreams

    UTxO HD prototype

    We merged the implementation of a monadic cursor API (#1)) which was +needed to solve a bug with LMDB range-reads. After this PR was merged, we focused on +bridging the gap between the lmdb-simple interface and consensus by facilitating +using lmdb-simple's cursor API without Serialise constraints (#3).

    We refactored the backing store property tests to use quickcheck-lockstep +(#4081).

    We added tables to the mock ledger in the UTxO-HD feature branch +(#4184). Every test that used to run with SimpleBlocks now uses +tables. This will enable us to exercise the UTxO HD mempool integration by +leveraging the existing mempool property-tests. The new state-machine +property-tests are still needed for testing the parallel behaviour of the +mempool.

    Our work on the mempool state-machine tests revealed the need for improvements +in the quickcheck-state-machine library. Parallel testing assumed that the +state machine did not have access to mutable references. However, the mempool +tests require the use of such mutable references for mocking the ledger +interface. As a result, our parallel tests were failing with rather obscure +messages. @Jasagredo submitted a pull request (#12) that allows for +new mutable references to be created at each run of the state machine.

    Backing store property tests

    LSM tree implementation

    We finished the LSM Tree tuning algorithm. We are currently tidying up the code +and gathering results (i.e., plots and their interpretation).

    CSJ prototype

    We started simplifying the BlockFetch logic with CSJ-specific workloads in mind.

    New VRF and KES crypto integration

    Started working on supporting new version of StandardCrypto which uses compact +KES and batched VRF (#4151).

    Technical debt

    We reviewed the existing state of the Block Diffusion Pipelining document. We +are now working on the "Implementation" section (#4020).

    Fostering collaboration

    We cleared up our understanding of the error dynamics of forecasting +(#4146 and #4174).

    We submitted a pull request that adds an overview of consensus to the top level +documentation of +ouroboros-network (#4197). This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    https://github.com/input-output-hk/ouroboros-network/pull/4197

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-30-node-cli-api + 2022-11-30-node-cli-api + Wed, 30 Nov 2022 00:00:00 GMT + + 2022-11-30 - 2022-12-13

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + cli-api +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-30-performance-and-tracing + 2022-11-30-performance-and-tracing + Wed, 30 Nov 2022 00:00:00 GMT + + High level summary
    1. Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release.
    2. SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench.
    3. The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks.
    4. Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started.
    5. Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.

    Performance

    We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release.

    Tracing

    For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them. +The idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time.

    To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics.

    Infrastructure

    Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation.

    In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model.

    The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged. +We are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration.

    We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability.

    We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP.

    As usual, a number of smaller workbench, data analysis & reporting improvements have been made.

    ]]>
    + performance-tracing +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-28-network + 2022-11-28-network + Mon, 28 Nov 2022 00:00:00 GMT + + Stake-Driven Data Diffusion Release for Relays

    IOG networking team decided to release the Stake-Driven Data Diffusion with +Robust Optimised Peer Selection also more commonly known as P2P. In the +last update, we informed about a performance regression, but it turns out it +only affects block producers, and thus we highly advise against running it on +such nodes. Further investigation is required to find the cause of it.

    On IOG's benchmarking cluster we have seen quite a good performance improvement +on block propagation itself. The cluster is running a static topology with +valency 6 (each node is connected to 6 other nodes). In which every of the 50 +nodes are block producers. The setup of this network is the same as mainnet. +We've seen 40-50% performance improvement on block propagation comparing to the +same cluster deployed with the same topology but using non-P2P nodes. We think +this performance improvement is caused by using full duplex connections. Quite +likely the transaction traffic floating in both directions on the same TCP +connection helps to keep the TCP window open. Note that in a cluster of 50 +nodes with valency 6 the probability of having at least one duplex connection +is more than 50%. We don't expect the same improvement on mainnet because the +network is much wider and the transaction traffic is not as large.

    Just before the release we squashed two small bugs:

    • issue #4163 - top level integration bug in keep-alive;
    • issue #4177 - a bug in outbound-governor;
    • PR #4165 - a fix cardano-ping support of NodeToNodeV_10.

    Peer Sharing

    We were carrying a review of peer sharing PR.

    DeltaQ

    Neil Davies was invited to give a guest lecture entitled Avoiding System Catastrophes at UCLouvain.

    What have we achieve last sprint

    • issue #4163: we found out that a control message is not passed to the +keep-alive mini-protocol, this results in every demotion executing demotion +timeout rather than a graceful termination. With the fix the node will no longer log:

      { "kind": "PeerStatusChangeFailure"
      , "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"
      , "reason": "TimeoutError"
      }
    • issue #4177: we fixed an assertion failure in the outbound-governor; now +we don't try demoted peers which are being demoted already.

    • PR #4155: we refactored ouroboros-network packages. There's a top level +ouroboros-consensus-diffusion package which integrates network +& consensus code. We also introduced:

      • ouroboros-network-api package which contains the API shared between +network & conensus;
      • ouroboros-network-mock package which contains mock API used for testing +(e.g. a mock chain & chain producer, etc.)
      • ouroboros-network-protocols package which contains implementation of all +(but handshake) mini-protocols, exposes a testlib and contains test +and cddl components.

      This made the dependency tree of network & consensus packages much +cleaner.

    • PR #4169: we described the usage of release branches in CONTRIBUTING.md +doc.

    • PR #4165: we fixed cardano-ping support of NodeToNodeV_10 protocol.

    DeltaQ

    The abstract of the talk:

    An essential step to ensuring that distributed systems are fit for +purpose.

    Distributed systems have become an integral part of our society and +daily lives. We are, both implicitly and explicitly, individually as well as +collectively, placing ever more trust in them.

    Are they worthy of this trust? Our need for them to be ‘fit-for-purpose’ goes +well beyond notions of functional correctness (i.e. never getting the wrong +answer). We need them to deliver the desired outcomes in a timely, robust, +reliable, resilient fashion, at scale and in a sustainable way (both +economically and environmentally).

    This all sounds like a worthy aspiration, but what would be a practical +approach to capturing and reasoning about these issues? How can we ensure that +systems can meet their fit-for-purpose objectives, not just in their design but +as they are deployed, encounter the imperfect world, are scaled to become +economic, and proceed into ongoing maintenance?

    This talk will illustrate how the notions of Outcomes and Quality Attenuation +(as captured by ‘∆Q’) are being used to both frame the necessary notions and +provide a basis for assuring the refinement and reification of such systems, +from initial concept to operational infrastructure.

    You can download the slides from here.

    ]]>
    + network + release +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-25-crypto + 2022-11-25-crypto + Fri, 25 Nov 2022 00:00:00 GMT + + High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team.
    • Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes
    • cardano-base: The VRF and BLS branchs are still open and in progress
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library PR#31
    • We are introducing a more granular error handling mechanism PR#33
    • We rethought the API and made it more consistent with the underlying secp256k1 library PR#35

    Mithril

    • The mithril crates in general will be published in crates.io, and we adapted the core library's README PR#616
    • We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information PR#620

    cardano-base

    • We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) PR#341
    • SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions PR#344
    • Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus PR#266

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.
    ]]>
    + crypto +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-25-hydra + 2022-11-25-hydra + Fri, 25 Nov 2022 00:00:00 GMT + + High-level summary

    This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a presentation about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas.

    What did the team achieve this week

    What are the goals of next week

    • Monthly report & review meeting
    • Tie up several loose ends / branches.
    • Resolve Tx validity discussions & PRs.
    • Review cicero PR & try it out.
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-23-ledger + 2022-11-23-ledger + Wed, 23 Nov 2022 00:00:00 GMT + + High level summary

    We released CIP-1694, +our proposal for entering the Voltaire phase. +Please come join the discussion, this will be an incredibly exciting transition for +Cardano and we want everyone to participate!

    We now have a sensible way to version all of the serialization schemes used in the ledger. +The draft pull request was polished, reviewed, and merged this week. +This solves many problems that have vexed us since the beginning of the Shelley ledger era.

    Everyone working on the Cardano node is working together to improve our release process, +and the ledger team in particular dedicated one engineer to help with these efforts +for the next release.

    Lower level summary

    The Conway ledger era

    The current proposal in CIP-1694 encompasses two new ledger eras. +The first era will be called Conway, after the English mathematician John Horton Conway. +The community facing aspects of the Conway ledger era will be very minimal, +but it will pave the way for introducing liquid democracy. +The details can be viewed here. +We do not yet have a formal specification for the Conway era. +Our plan is to debut the +formal ledger model. +Briefly, the Conway ledger era will:

    • introduce SPO voting for hard forks (in the spirit of the now abandoned CIP-47)
    • provide an on-chain mechanism for rotating the governance keys
    • re-plumb the ledger rules involving governance to be in line with CIP-1694

    Versioned CBOR

    We now have the ability to easily tie our serialization schemes to the Cardano +major protocol version. +We still aim to preserve backwards compatibility as much as possible, but we now have a principled +plan for resolving problems (see CIP-ledger-cbor). +In particular, we can now address several long standing issues, such as +issue-2444, issue-2965, and issue-3003.

    The final (and massive!) pull request which brought us the versioning is pull-3138.

    Deposit tracking

    The draft pull request which was exploring how best to track individual deposits +is much closer now to being ready to take out of draft (pull-3127). +For background on the issue, see issue-3113. +This is quite an invasive change which effects many of our tests, which we are now addressing.

    Technical debt

    As always, we keep working on technical debt. +We have deduplicated a some things: pull-3129, pull-3162. +We have memoized a problematic computation (though more due diligence is needed before we can +merge): pull-3141.

    Node release

    We have been helping with the node release efforts. See pull-4608.

    ]]>
    + ledger +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-18-hydra + 2022-11-18-hydra + Fri, 18 Nov 2022 00:00:00 GMT + + High-level summary

    This week, the Hydra team released version 0.8.1, which includes several fixes and a user-wished extension of the persistence introduced by 0.8.0 of replaying server outputs to make clients like the hydra-tui be aware of the latest hydra-node state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from hydra-poc to hydra!

    What did the team achieve this week

    • Implemented replaying of server outputs to address #580
    • Released version 0.8.1 containing this and other fixes Release notes
    • Worked on the bounded tx validity as one of the on-chain script fixes, but couldnt finish it just yet #615
    • Collaborated with the education team on a Hydra tutorial.
    • Discovered and discussed issues with the seen ledger.
    • Renamed the Hydra repository hydra-poc -> hydra

    What are the goals of next week

    • Create and discuss an ADR about handling tx validity correctly.
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
    • Have a team workshop / hackathon after the summit:
      • Retrospective
      • Roadmapping session
      • Hack on something complex or useful
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-18-mithril + 2022-11-18-mithril + Fri, 18 Nov 2022 00:00:00 GMT + + High level overview

    The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks.

    Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer.

    Low level overview

    • Released a new Mithril distribution 2246.1
    • Completed the first stage of the store migrations process #562
    • Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes #565
    • Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage #576
    • Prepared a Daedalus synchronization benchmark video with/without Mithril #606
    • Upgraded the Cardano nodes of the testing Mithril networks to 1.35.4 #594
    • Worked on implementing SPO tests nodes on testing Mithril networks #563
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #588
    • Worked on the refactorizaton of the aggregator multi signer engine #398
    ]]>
    + mithril +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-16-consensus + 2022-11-16-consensus + Wed, 16 Nov 2022 00:00:00 GMT + + High-level summary

    During the past two weeks, the consensus team started documenting the +implementation of the UTxO HD feature and continued developing tests for it. As +part of our work on UTxO HD, we improved the Haskell support for LMDB. We also +spent time working on the LSM tree prototype, and designed a parameter tuning +algorithm for it. Regarding our work on Genesis, our investigation of the +"plateaus" pointed at the TICKF slowdown on era boundaries as culprit. This +led us to developing a caching strategy that will not only remove the +aforementioned "plateaus", but can help alleviating the growing block production +delay on epoch switch. We also helped reviewing the block forge credential +hotswap feature, which is intended for use in the adoption of P2P.

    We also worked on paying technical debt and fostering collaboration. In +particular, we improved the io-sim framework, which is crucial for testing and +simulating Cardano components. We also removed thunks that appeared on era +translations, and improved our diffusion pipelining feature. We are working on a +presentation for explaining Praos and Genesis.

    High-level status report

    • Finish the UTxO HD prototype: in progress.
      • We added documentation for this feature.
      • We developed the second version of the mempool tests.
      • We fixed benchmarks that were inflating the speedup we observed in the +anti-diff implementation of sequences of differences. Speedups are now in the +range of [3.33, 4.75], which remain significant.
      • We continued improving Haskell LMDB support.
      • We finished implementing a "parameter tuning algorithm" for the LSM tree +prototype. This enables us to run experiments to check the correctness of +the algorithm.
    • Genesis: in progress.
      • Work investigating the "plateaus" in the ChainSync jumping prototype +pointed to the TICKF slowdown on era boundaries as culprit.
    • Tech debt:
      • We improved the capabilities of our io-sim library, which is crucial for +testing and simulating Cardano components.
      • We removed thunks from epoch translations in the ledger.
      • We added Linux CI support for lmdb-simple.
      • We got pending diffusion pipelining improvements merged.
    • Fostering collaboration:
      • We are working on a explanation of Praos and Genesis protocols.
    • Support:
      • Investigation of CSJ "plateaus" led us to developing a caching strategy for +TICKF that will not only remove these "plateaus", but can help alleviating +the growing block production delay on epoch switch.
      • We reviewed the block forge credential hotswapping feature which is intended +for use in the adoption of P2P.

    Workstreams

    Finish the UTxO HD prototype

    We merged PR #4060, which adds a report documenting the UTxO HD +feature, and puts emphasis in explaining how the mempool works in combination +with UTxO HD.

    We opened a draft PR with the second iteration of the property tests for the +mempool (#4076).

    We fixed the Arbitrary instances for keys and values in DiffSeq benchmarks +(#4143). The problem was that we were testing with mostly small +values, which artificially boosted the performance gains we saw on benhcmarks. +Speedups are now in the range of [3.33, 4.75] across the different +configurations.

    Backing store property tests

    We focused on incorporating feedback on the monadic cursor API PR (#1). +This required us to make small tweaks to quickcheck-lockstep to test the new +API. We also updated the backing store property tests to use the new version of +the monadic cursor API.

    LSM tree implementation

    We worked on the LSM tree prototype. In particular: finished implementing a +"parameter tuning algorithm" that adapts the LSM tree design based on factors +like:

    • workload
    • machine specs,
    • and characteristics of the data being stored.

    We are now running experiments to gather results and cross-reference them with +existing experimental results from the LSM tree paper to see if the algorithm is +working correctly.

    Benchmarking the CSJ prototype

    We focused on investigating the "plateaus" in the ChainSync tip, which turned +out to be due to the TICKF bug which we previously were only aware of in the +context of the long forging times near epoch boundaries. For the most drastic +patch by @nfrisby to speed up TICKF, full sync is speeding up by 7%.

    The following plot shows that by caching the TICKF the ChainSync tip and the +VolatileDB tip progress at the same rate.

    The plot below shows the speedup observed by caching the TICKF rule wrt the +baseline.

    Technical debt

    After addressing the PR comments, we merged PR #16, which implements +the MonadCatch instance for STM. This extends the capability of our io-sim +library, which is crucial for testing and simulating Cardano components PR #16 +closed #1461. This new feature was published as version 0.4.0.0 +of io-sim.

    We continued with our work fixing the NoThunk errors required for enabling +nightly tests, with the help of TVarInvariant checks in strict-stm and +nothunks libraries. We proposed fixes in cardano-ledger that took care of +thunks that appeared in era translations (#3143). The fixes will be +integrated back into consensus when cardano-ledger approves and publish the +changes introduced in #3143.

    We added CI support for lmdb-simple (#2). We currently test the build on +a Linux environment only.

    We got pending diffusion pipelining PRs (#3857, #3860, +#3856) merged, after rebasing and addressing feedback.

    Fostering collaboration

    @nfrisby finished a visualisation tool and outlined scripts for the Praos and +Genesis explanation presentations. The idea is to produce a video that gives an +overview of these protocols.

    Support

    We started working on caching the computation of the TICKF rule +(#4054), since this was blocking our benchmarking work for +Genesis. In addition, this issue has the Cardano community quite +concerned, so we are hoping the work done in caching the +computation of the TICKF rule can help alleviating the growing block +production delay on epoch switch.

    We reviewed the block forge credential hotswapping PR #3800 from the +networking team, which is intended for use in the adoption of P2P.

    ]]>
    + consensus +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-16-node-cli-api + 2022-11-16-node-cli-api + Wed, 16 Nov 2022 00:00:00 GMT + + 2022-11-16 - 2022-11-29

    High level summary

    Completed

    docs

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + cli-api +
    + + <![CDATA[Performance & tracing update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-16-performance-and-tracing + 2022-11-16-performance-and-tracing + Wed, 16 Nov 2022 00:00:00 GMT + + High level summary
    1. P2P performance investigation is ongoing, in support of the networking team.
    2. SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support.
    3. Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing.
    4. On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started.
    5. We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.

    Performance

    We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes.

    Tracing

    We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis.

    Infrastructure

    The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends.

    We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing.

    A number of smaller workbench, data analysis & reporting improvements have been made.

    ]]>
    + performance-tracing +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-11-crypto + 2022-11-11-crypto + Fri, 11 Nov 2022 00:00:00 GMT + + High level overview

    The SECP primitives AC has been met, and the test-vectors PR has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool PR has been merged, and we've adapted the KES secure PR to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (PR#). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork.

    Low level overview

    • With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation.
    • We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool.
    • In parallel, we keep progressing on the KES agent
    • VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification.
    • Our libsodium fork now links directly to upstream libsodium.
    ]]>
    + crypto +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-11-hydra + 2022-11-11-hydra + Fri, 11 Nov 2022 00:00:00 GMT + + High-level summary

    This week, the Hydra team published together with Obsidian Systems a light paper +on our "Hydra for Payments" project (Link). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of hydra-node processes.

    What did the team achieve this week

    • Published Hydra for Payments light paper (Link)
    • Have a draft RFP ready for a first review internally
    • Answered the internal auditors questions
    • Fixed a bug with following the chain when starting with persistence (#599)
    • Minor improvements to logging for better observability (#598, #600)
    • Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (#590)

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Close more gaps #452
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-11-ledger + 2022-11-11-ledger + Fri, 11 Nov 2022 00:00:00 GMT + + High level summary

    I am extremely excited to say that we now have a pull request up which introduces our new versioned +CBOR serialization. This was an enormous effort, but it will solve a host of problems that we have +had since the Shelley phase. It will take time to properly review it, and we will +need to put in a lot of effort to integrate it with the downstream components, but this is a huge +milestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction +serialization schemes.

    We also have a draft pull request that reworks how deposits are tracked. Users of the system will +not notice any difference, but it is a necessary change needed to prepare the way for +decentralizing the governance of Cardano.

    Finally, we continued to address technical debt. In particular, we continued to make progress on +bringing coherency and consistency to the code base with a common naming convention, and +improving some error messages.

    Lower level summary

    • We have a pull request up for our new versioned CBOR serialization. +When we encounter a problem with our deserializers, it can be very difficult to implement a fix. +It is difficult because we can only fix such issues during a hard fork, and leading up to the +hard fork we must maintain two serializations for the same type in order to not cause unintended +network splitting (the problematic version must be used before the hard fork, +and the fixed version is used afterwards). +This can be especially tricky with the FromCBOR typeclass, since it is not always easy to +search for where all the problematic uses are located. +The new versioned CBOR serialization allows us to gracefully handle this transition. +See [pull-3138].
    • We proposed a CIP for backwards compatibility of the transaction serialization schemes. +See [pull-372].
    • We have draft for the new deposit tracking. +This draft is not as memory efficient as the final version will be, +but it is a sufficient proof of concept that we can write property tests against, ensuring +that we have not changed the semantics. +We will optimize after we are sure of the correctness. +See [pull-3127].
    • We now provide better support for debugging failed Plutus scripts in an important helper +function, named evaluateTransactionExecutionUnits. +In particular, it now returns all the information needed to rerun the script with exactly the +same arguments. This feature will end up appearing in the CLI and other tools from the Plutus +tools team. +See [pull-3135].
    • We did a lot more renaming to bring coherency and consistency to the code base. +See [pull-3126], [pull-3120], [pull-3118], and [pull-3116].
    • We have added a few things to the ledger repository to make it conform to the +Cardano Engineering Handbook +See [pull-3139].
    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-11-network + 2022-11-11-network + Fri, 11 Nov 2022 00:00:00 GMT + + High-level summary

    In last sprint we got a performance report of P2P performance testing cluster +(which consists of 50 nodes). There is a performance regression in the header +notification metric. The P2P cluster is constructed with the same +topology as the non-p2p reference one this indicates some regression which +needs to be further investigated. This poses a risk for releasing P2P.

    We also continued to work on peer sharing: pull #4019.

    We continued working on dynamic block production which is required for P2P +release for BP nodes: pull #3159.

    We simplified the P2P topology format: issue #4559, pull #3888.

    We added a new trace point for asynchronous demotions of local peers with +Warning severity. This trace is important for SPOs.

    Detail description

    Performance regression

    Below we include a graph which shows the performance regression of the P2P code base vs non P2P.

    On the x axis is time in seconds which measures the delay from the start of +the slot to when a header was received. The y axis is the percentile of nodes +that received a header. We are currently investigating possible causes of the +regression.

    New P2P topology form

    The new topology file format is described in this issue #4559.

    Tracing improvements

    • We improved a handshake error reporting, pull #4136
    • We added TraceDemoteLocalAsynchronous rendered as DemoteLocalAsynchronous +in json format, pull #4127. Such demotions should be investigated by the +pool operator. They can indicate a problem in the deployed system, but also +they could indicate a remote problem in arranged connections with other SPOs.

    Open Source Improvements

    We improved documentation of io-sim and typed-protocols for open-source +contributors and/or maintenance tasks: pull #22, pull #45, pull #48.

    ]]>
    + network +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-04-hydra + 2022-11-04-hydra + Fri, 04 Nov 2022 00:00:00 GMT + + High level summary

    This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun preview network, see 0.8.0 release notes. They also completed implementation of ADR18 and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates #195 and alignment of the specification document with auditors.

    What did the team achieve this week

    • Complete and merge ADR18 #579
    • Re-deploy hydra scripts to respun preview network, see 0.8.0 release notes #595
    • Have first gap of #452 in review.
    • Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot.
    • Engineering meeting to discuss hard forks and protocol parameter updates #195
    • Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions.
    • Drafted project scope for an external audit RFP.

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Answer the internal auditors questions
    • Have a draft RFP ready for a first review internally
    • Close some gaps #452
    ]]>
    + hydra +
    + + <![CDATA[Mithril Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-04-mithril + 2022-11-04-mithril + Fri, 04 Nov 2022 00:00:00 GMT + + This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.

    Low level overview

    • We have been moving forward on the implementation of the release process #500:
      • Setup of the new hosted environments for testing-preview, pre-release-preview and release-preprod with their terraform and GitHub environments #542
      • Adapted the CI workflows to work with the new release process #543
      • Publication of an ADR3
      • Publication of a dev blog post about Mithril networks evolution
      • Releasing our first Mithril distribution 2244.0
    • Worked on the API versioning mechanism #565
    • Worked on the implementation of the stores migration process for the signer and aggregator nodes #562
    • Prepared a Mithril devnet video demo #526
    • Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably #484
    ]]>
    + mithril +
    + + <![CDATA[Open-Source Team]]> + https://input-output-hk.github.io/cardano-updates/2022-10-31-open-source + 2022-10-31-open-source + Fri, 04 Nov 2022 00:00:00 GMT + + High Level Summary
    • We've been working toward publishing Cardano Backlog, currently its in +review by the IOG communication team.
    • We identified a number of libraries which can be published.
    • We setup and enhanced cardano-updates.

    Detailed description

    I am glad to announce that I was given the role of open-source advocate for +cardano project. In last few weeks we were making steps towards publishing our +backlog. It's currently under review by the communication team, although most +of the issues are already visible across various repositories.

    The open-source initiatives have their own +project. It is set up +to help us track our major open-source activities. Right now there are two +work streams:

    We identifies a number of libraries across all the teams which contribute to +Cardano which we would like publish to publish, see the following +link. Arnauld Bailly recently published +quickcheck-dynamic +library on Hackage. The networking team is slowly progressing towards +publishing io-sim and related packages, checkout the progress +here.

    Thanks to Arnaud Bailly our Cardano Updates website has +a new look & feel! It's using docusaurus.io.

    Christian Taylor carried recently a detailed analysis of our open-source +repositories. He collected many interesting metrics, which allows us to see +where we need to improve as an open-source project to make the Cardano project +and many smaller related libraries which we maintain be more open and available +for open-source contributors.

    The graph below shows which documents the 55 most important Cardano +repositories are missing the most: +Documentation Adoption +You can expect we will improve in these metrics in the coming weeks.

    ]]>
    + open-source +
    + + <![CDATA[Embedding Quality Workstream]]> + https://input-output-hk.github.io/cardano-updates/2022-11-03-embedding-quality + 2022-11-03-embedding-quality + Thu, 03 Nov 2022 00:00:00 GMT + + High level summary

    We made good progress on most of the Action Items we agreed on Lisbon, like:

    • Cardano System Tests was fully open to public (tools, tests, results) +See cardano-node-tests webpage.
    • We defined an user-facing-functionality template that is used with the cardano-cli team
      • this includes acceptance criteria & user stories, and definition of done
    • We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)
    • We started to apply a labelling convention on cardano-node issues that will be used to generate some visual dashboards with some metrics [TBD]
    • Ziyand Liu started an End-to-End Development and Testing Process for Plutus Features
    ]]>
    + embedding-quality +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-02-consensus + 2022-10-02-consensus + Wed, 02 Nov 2022 00:00:00 GMT + + High-level summary

    During the past two weeks, the consensus team continued its work on testing the +UTxO HD prototype. We completed the era-transition and backing store tests, and +the mempool tests are advancing at a steady pace. Regarding our work in the +Genesis design, we continued our collaboration with the research and networking +teams, and we continue investigating strategies for making the chain-sync +jumping prototype faster.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We worked on state-machine tests for the mempool, and spotted potential bugs +in the implementation. Investigation is ongoing.
      • We have a set of property tests for the backing store. We still need to +incorporate the improvements to the LMDB cursor API that these tests +made possible.
      • We merged the era-transition tests PR.
    • Genesis: on track.
      • Design work around Genesis continues in collaboration with researchers and +the networking team.
      • We continued trying to improve the performance of the chain-sync jumping +prototype. We gained additional insight on which parameters to tweak next. +In spite of the baseline still being faster, the current prototype already +achieves a significant speedup when compared to the naive approach of simply +running full chain-sync with all peers.
    • Tech debt: on track.
      • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    Workstreams

    Finish the UTxO HD prototype

    We continued working on property-tests for the UTxO HD prototype. In particular +we merged the era-transition tests +PR.

    Backing store property tests

    The backing store property tests +PR has been +reviewed. The next steps are:

    • Improve error handling and command generation.
    • Add coverage testing to check that we are not failing to cover interesting +test cases.

    The monadic cursor API +went through its first review round. The API is in a relatively stable state. +This PR also unifies the cborg and serialise-based interfaces to LMDB +operations. The next steps are:

    • Write +quickcheck-dynamic +state-machine tests for this API.
    • Adapt the changes in the serialisation interface in the backing store property +tests. This will involve adding boilerplate code in consensus to make up for +the removal of the cborg-based interface.

    LSM tree implementation

    We worked on the LSM tree +prototype. In +particular, we focused on tuning the LSM tree design to the different workloads +that consensus has (eg syncing, normal node operation, etc).

    Benchmarking the CSJ prototype

    Work on improving the chain-sync jumping performance is ongoing. In particular +we compared the performance of different jump intervals, which, somewhat +surprisingly, do not make a significant difference. In particular, we are seeing +periodic "plateaus" where the chain-sync tip does not progress, but they are +much longer for the prototype. Our hypothesis is that this seem to be due to a +combination of the garbage collector (GC) pauses, and the actual time it takes +the non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo +fragment.

    In the coming weeks we will try to shorten these plateaus via a combination of +tweaking GC options and less synchronisation in the CSJ governor.

    The following plot shows the performance of the chain-sync jumping prototype +using different jumping intervals. It compares the syncing progress by plotting +the slots of adopted blocks against time. The baseline is still faster, however +it is worth noting that the current prototype already achieves a significant +speedup when compared to the naive approach of simply running full chain-sync +with all peers.

    The second plot shows the syncing progress sliced to a chosen ~5min interval, +and includes, in addition to the slots of adopted blocks, the slots of the tip +of the ChainSync fragment. This allows us to see how far ahead of the selected +tip the CS dynamo is, i.e. how much room we have for BlockFetch not to get +stalled. It shows periodic behaviour (due to the forecasting limit), and shows +that the CS fragment tip is not progressing for significant periods +("plateaus").

    Technical debt

    We clarified a +common source of confusion around VRF tie-breaking and cross-era chain +selection. This PR involved correcting potentially misleading names of +VRF-related functions, and providing context for a particular VRF value is +used for tie-breaking.

    ]]>
    + consensus +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-02-ledger + 2022-11-02-ledger + Wed, 02 Nov 2022 00:00:00 GMT + + High level summary

    We have made the decision to use the +formal ledger repository +in place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure +to the model. In particular, we now have a lot of support for axiomatic set theory. +While the next ledger era is still in the design phase, most of the team remains working +on technical debt. +In particular, we have moved a lot more code out of the Shelley specific modules and into +a ledger core module, we have finished up our benchmarking around the problematic TICKF +ledger transition (while improving the performance), made conveniences to the development +environment, cleaned up all the recent changes to the cost model, added a lot of documentation, +fixed some flaky tests, and deleted some dead code.

    Lower level summary

    Axiomatic Set Theory

    The formal ledger model now has support for much of the set theory that we make use of in +the formal ledger specifications. See [pull-20].

    Completed Technical Debt

    • We have addressed issues with two of our most problematic and flaky tests. +See [pull-3039] and [pull-3093].
    • We have added more documentation and tests to the Twiddler module. This is a module which +makes our CBOR serialization round-trip tests much more robust, and will also hopefully +help enforce the mandate for downstream libraries to never re-serialize data that needs +to be hashed. See [pull-3073] and [pull-3095] +(we cannot merge 3095 just yet, due to a preference for merging other features).
    • We have finished our long analysis of the problematic TICKF transition. +We now have a lot of benchmarks surrounding this code, and have added performance improvements. +See [pull-3068] and [issue-3035].
    • We have restored support for +ghcid +in our repository. This is a tool for developing with Haskell that many of us find greatly +improves our productivity by providing us with constant feedback from the type checker. +See [pull-3112].
    • After much activity on the cost model, we have done some final clean up of the code. +See [pull-3075] and [pull-3101].
    • We moved a lot of the existing user facing documentation regarding native tokens into the +ledger repository, and cleaned it up +(most of the heavy lifting was done by our amazing technical writers). +See [pull-3091].
    • We removed dead code. See [pull-3089].
    • We moved a lot of code from the Shelley specific libraries to the ledger core library. +See [pull-3109] and [pull-3110].
    • We've removed more of the awkward legacy template Haskell names. +See [pull-3108].
    ]]>
    + ledger +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-02-node-cli-api + 2022-11-02-node-cli-api + Wed, 02 Nov 2022 00:00:00 GMT + + 2022-11-02 - 2022-11-15

    High level summary

    • Documentation improvments
    • Merged community contributions
    • Exposing types from cardano-api requested by the community/other teamss
    • Test output has been improved so diagnosing failures is now easier
    • Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)
    • Refactoring of cardano-testnet making it more useable as a library (ongoing)
    • Release 1.35.4 was merged & released

    Completed

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + cli-api +
    + + <![CDATA[Node Release Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-02-release + 2022-11-02-release + Wed, 02 Nov 2022 00:00:00 GMT + + Node Reelease Update

    2022-10-19 - 2022-11-02

    Executive Summary

    The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset, +a temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8.

    1.35.4 release candidates have been created and are being tested internally and externally.

    Completed

    In Progress

    ]]>
    + release +
    + + <![CDATA[System Test Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-02-system-test + 2022-11-02-system-test + Wed, 02 Nov 2022 00:00:00 GMT + + High level summary

    We have been focused on:

    • Fully opening our test results (on top of the existing tests & tools):
      See cardano-node-tests webpage.
    • Started to test and automate the new functionalities added in the 1.35.4-rc1 node tag
      See test results tracking page.
    • Made some improvements to the automated db-sync sync tests
      See db-sync tests.
    • Multiple cleanups and updates to the cardano-node-tests framework
    • Updated the nightly pipelines for the cardano-node-tests after the Babbage HF
    ]]>
    + system-test +
    + + <![CDATA[DB Sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-11-01-db-sync + 2022-11-01-db-sync + Tue, 01 Nov 2022 00:00:00 GMT + + High level summary

    The DBSync team is preparing a release which introduces schema simplifications, removes indexes, +unique and foreign keys. It also provides a way to fix older values and migrates without the need to +resync from genesis.

    Lower level summary

    Schema simplifications

    Indexes, Unique and Foreign keys are removed in order to speedup syncing +#1295 +The same pr also introduces a different way to rollback, which doesn't rely on foreign keys and +indexes.

    Performance

    The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A +conservative number of these will be included in the next release and the rest can be found in +performance view.

    Migrations and resyncing

    The next release will be 13.1.0, it will enable a migration without the need to resync. It will also +introduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases +#1294

    Release

    The release has been mostly cherry-picked from master +#1294 and its scope can be seen +release view

    ]]>
    + db-sync +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-28-hydra + 2022-10-28-hydra + Fri, 28 Oct 2022 00:00:00 GMT + + High level summary

    This week, the hydra team completed several user experience improvements to the +hydra-tui and hydra-node, and delivered a first version of persisted head +states by publishing release version +0.8.0. +Besides this, they met with researchers on topic of the HeadV1 specification and +kicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation.

    What did the team achieve this week

    • Completed the UX improvements on the hydra-tui
    • Released version 0.8.0, which delivers a first version of persisted head states
    • Met with researchers on the HeadV1 specification
    • Started work on the RFP for our external audit

    What are the goals of next week

    • Complete ADR18 implementation and get it merged
    • Start work on event-sourced persistence #580
    • Have a first plutus script gap closed #452
    • Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)
    ]]>
    + hydra +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-28-network + 2022-10-28-network + Fri, 28 Oct 2022 00:00:00 GMT + + High-level summary

    The team has focused on debuging & fixing bugs for the P2P single relay release, which included

    • diagnosing, fixing and writing tests for a bug in peer-state-actions which +fortunately hasn't been released;
    • diagnosing & preventing misconfiguration of DNS

    We also focused on developing peer sharing. We also held a session with +the scientists on eclipse evasion.

    Detailed description

    P2P Network Stack

    During the past two weeks the team focused on p2p single relay release and peer +sharing. We found and fixed an important bug recently introduced in one of the +components of p2p networking stack (fortunately never released). Together with +a fix, we designed a unit test diffusion simulation as well as quickcheck +property test (both could reproduce it). We also changed the code in a way that +if such a bug is reintroduced in the future, it will be obvious to diagnose. +For more see:

    Initial benchmarking run of the P2P code was executed. The results where +unlike what we see on the mainnet. We found a possible misconfiguration of the +cluster (caused by 0 TTL on domain names), which could be the direct cause of +it. We wrote a PR which rules out such misconfiguration. We are awaiting on +the next benchmarking results. See more at:

    ouroboros-network#4106

    We also started working on P2P single relay release. The PR +ouroboros-network#4120 +includes 108 patches cherry-picked from the master branch. We started +working toward integration these changes against the release branch of +cardano-node. Early next week we ought to be able to have an early version +of cardano-node with non experimental P2P support!

    For more detailed release plan please see P2P - Single +Relay +issue.

    Consensus

    We identified and fixed missing error reporting in consensus +initialisation phase. See more at +ouroboros-network#4015

    Cardano Node

    We also made changes in cardano-node in order to give better experience for +node operators. This includes updating severities of some of the traces as +well as implementing new format of the p2p topology file. For more see:

    Peer Sharing

    We continued working on implementation of peer sharing. We have an early +implementation which will be reviewed and analysed in next weeks. We started +working on cardano-node integration. We need +PR #4392 to be merged +before such integration will be able to land in cardano-node, although this +is not blocking us currently. See more at:

    Eclipse Evasion

    We held a session which included Alexander Russel, Sandro Coretti-Drayton and +Nick Frisby from the consensus team. We discussed high lever design of the +eclipse evasion scheme, which is important for the design and implementation of +ouroboros-genesis. We got a positive feedback from the researchers.

    IO-Sim

    In this period we made little progress towards releasing IO-Sim on Hackage. +A single PR which added +a few missing instances of the STM monad.

    Open Source

    We made sure the CI runs for PRs which comes from forks (which is important to +accept contributions from 3rd parties).

    Mithril Cardano Integration

    We held initial discussions with Arnaud Bailly about possible path to integrate +mithril to cardano-node and take advantage of the ouroboros-network +diffusion layer.

    ]]>
    + network +
    + + <![CDATA[Performance & Tracing Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-28-performance-and-tracing + 2022-10-28-performance-and-tracing + Fri, 28 Oct 2022 00:00:00 GMT + + High level summary

    On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline.

    On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario.

    Executive summary

    • The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale.
    • The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment.
    • The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.
    ]]>
    + performance-tracing +
    + + <![CDATA[SRE Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-08-12-sre + 2022-08-12-sre + Fri, 28 Oct 2022 00:00:00 GMT + + High level summary

    The SRE team is heavily working on the Equinix Metal migration, replacing Hydra +with Cicero, and a new version of Spongix.

    Lower level summary

    OpenZiti

    • Work is ongoing on our OpenZiti integration into Bitte in [bitte-zt].
    • CI-World deployment of Darwin CI Ziti service in [ci-world-commit-d40f4d].
    • Multiple issues filed, and a lot of discussion with the OpenZiti developers, +we're making pretty rapid progress thanks to them.
    • Work on getting Equinix baremetal machines integrated into AWS World Bitte +clusters utilizing a Ziti ZTNA network overlay to bridge the networking of +the two environments and get IAM extension to Equinix machine for Nomad +client onboarding.
    • A Nix Flake for most of our OpenZiti dependencies including the Console, +Controller, Edge Tunnel, and Router is now at [openziti-bins].
    • The Flake also includes a WiP NixOS modules for these components.
    • Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with +no issues seen so far
    • Moved the console to traefik routing service (zac.$DOMAIN) and +controller/edge router stay at zt.$DOMAIN, but have registered consul +services

    Cicero & Tullia Integrations

    Cicero & Tullia Features

    • Improvements to Tullia task aggregation to make [cardano-addresses] build +correctly.
    • Better tullia CUE lib default for tags [tullia-commit-4df3c5d].
    • Put cache.nixos.org back in cache.iog.io's upstreams. This is now +considered a public cache again, and without it some Cicero evaluations had +to build huge packages.
    • Started working on a flake-parts module for Tullia.
    • Started working on cutting down Tullia task build time by putting facts in +JSON files.
    • Fixed running into kernel arg limit by reading tullia's DAG from a file
    • Merged [tullia-pull-9] that fixes several issues related to error reporting. +and escaping.
    • Added Mac builders in Cicero on CI-World.
    • Started work on Tullia invocation caching.

    Spongix

    • A lot of progress on an SQlite backed version of Spongix, it already supports +the full HTTP binary cache protocol but still lacks comprehensive testing and +some tuning, as well as recursive lookups.
    • First steps in the implementation of the nix-daemon ssh-ng protocol so +Spongix can be used via SSH and we can get rid of basic auth.

    Bugs

    • Discovered Cicero bug where Nomad reschedules cause the Github commit status +to get stuck in pending
    • Discovered Cicero race condition bug around concurrent transactions for +codependent actions.
    • Fixed tullia task order bug in [cardano-addresses]
    • Diagnose Cicero action not triggered in [abcirdc]
    • Fixed meta/description of the Tullia package in [tullia-pull-7]
    • Add Vault token loop alerts in [bitte-cells-pull-40]
    • Ongoing investigation on recurring Patroni and nomad-follower issues related +to token rotation.
    ]]>
    + sre +
    + + <![CDATA[Crypto Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-27-crypto + 2022-10-27-crypto + Thu, 27 Oct 2022 00:00:00 GMT + + High level overview

    The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to +meeting the acceptance criteria in cardano-base, +which lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and +we are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution, +but also progressing on the implementation.

    Low level overview

    SECP built-ins

    • (missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in PR 313
    • CIP-0049 was addressed in the editors meeting, and PR 250 was merged
    • The unit-tests PR 320 is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.

    KES agent

    • We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them.
    • We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).
    ]]>
    + crypto +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-21-hydra + 2022-10-21-hydra + Fri, 21 Oct 2022 00:00:00 GMT + + High level summary

    This week, the hydra team reviewed and addressed several open comments on the +new HeadV1 specification, completing a list the of identified gaps between +specification and implementation while doing so. In the wake of the recent +demonstration of SundaeSwap running their DEX in a Hydra Head, they met with +them to capture feature ideas & incorporate their feedback on the roadmap, as +well as potential research avenues.

    What did the team achieve this week

    What are the goals of next week

    • Complete the last two items required for a version 0.8.0.
    • Cut the next release, version 0.8.0
    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Have the CI build macos artifacts
    ]]>
    + hydra +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-19-node-cli-api + 2022-10-19-node-cli-api + Wed, 19 Oct 2022 00:00:00 GMT + + 2022-10-19 - 2022-11-01

    High level summary

    This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:

    • Ask the node about the current mempool's capacity and sizes
    • Request the next transaction from the mempool's current list
    • Query if a particular transaction exists in the mempool

    Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric tx_submit_fail_count has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:

    • Documentation improvments
    • Release 1.35.4 was merged & released
    • Exported various types from cardano-api that were requested by community members

    Completed

    cardano-cli

    cardano-api

    cardano-submit-api

    cardano-node

    cardano-testnet

    • None

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + cli-api +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-18-consensus + 2022-10-18-consensus + Tue, 18 Oct 2022 00:00:00 GMT + + High-level summary

    During the past two weeks, the consensus team worked on adding property test for +different aspects of the UTxO HD prototype: era transitions, mempool, and +backing store. Thanks to these tests we were able to uncover a bug in the +prototype. On the Genesis front, we benchmarked a different version of the +ChainSync jumping prototype to try to improve its performance, but this did not +result in any noticeable speedup.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We focused on increasing test coverage for the UTxO-HD prototype:
        • We started implementing Cadano-eras transition property-tests.
        • We started implementing state-machine property-tests for the mempool.
        • We merged the mempool rewrite.
        • We started working on state-machine tests for the backing store. This +uncovered a bug in the range-read implementation of the LMDB backing +store.
    • Genesis: on track.
      • We benchmarked a version of the Genesis ChainSync Jumping prototype that +spreads out the ChainSync updates over a longer period of time. This did not +result in any noticeable speedup.
      • We investigated the overhead introduced by non-ChainSync components, but no +conclusions could be drawn from the benchmarks we ran.

    Workstreams

    Finish the UTxO HD prototype

    We focused on increasing test coverage for the UTxO HD prototype. We also merged +the mempool +rewrite.

    Era transition property tests

    We started implementing Cardano era transition property +tests, +which are needed for making sure that the ledger tables get updated in the +right way when we move from one era to the next. There are at the moment two +important transitions.

    • Byron to Shelley: where all the UTxO is transferred from in-memory Byron +state (which has no tables) to the ledger tables of the Shelley state.
    • Shelley to Allegra: where the AVVM addresses must be deleted.

    We have tests for the Byron to Shelley transitions. We are working on adding +the remaining ones.

    Mempool state-machine tests

    We started implementing state-machine property tests for the +mempool. +The mempool is currently tested via pure property tests, and use a ledger +state without tables. With the introduction of UTxO HD, testing the concurrent +behavior of the mempool became of crucial importance (eg now we have to +acquire locks to flush the backing store). In addition, we need to test a +ledger state with tables. These needs led to the creation of a new set of +property tests. In particular we aim to run parallel state-machine tests that +exercise the mempool in a way similar to how the node would make use of it.

    Backing store property tests

    We started working on state-machine tests for the backing +store that UTxO +HD uses. The property tests uncovered errors in the range-reads implementation +of the LMDB backing store. To facilitate fixing this bug, we made +changes to the Haskell +LMDB bindings.

    Benchmarking the CSJ prototype

    Prompted by previous benchmarks showing significant improvements in sync time by +using more capabilities, we implemented a way to spread out the ChainSync +updates over a larger period instead of firing them all at the same time. This +didn't result in a noticeable speedup.

    We also benchmarked the prototype with CSJ disabled (such that just the dynamo +peer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule +out/confirm overhead by non-ChainSync (mainly BlockFetch) related components. +This results in era-specific behavior (speed is like the prototype in Byron, but +like the baseline in Shelley). This deserves a closer look in the future.

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    • Red: baseline
    • Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps.
    • Blue: like Green, jumps are spread out.
    • Orange: variant with no jumping, to measure unrelated overhead.

    ]]>
    + consensus +
    + + <![CDATA[Hydra Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-14-hydra + 2022-10-14-hydra + Fri, 14 Oct 2022 00:00:00 GMT + + High level summary

    This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the hydra-node over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks "past the opening of a Head". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.

    What did the team achieve this week

    • Last week we thought we were done with ADR18, but were not ...
    • ... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence.
    • Implemented a first version for persistence #187 in response.
    • Enhanced CI to publish test results on our website
    • Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!
    • Pulled static executable feature #200 into scope, implemented it and merged it!
    • Received and read through a project proposal by a vendor (building a Hydra platform).

    What are the goals of next week

    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Cut the next release, version 0.8.0
    • Address open comments on specification document & complete the list of identified gaps between specification and implementation #452
    • Have the CI build macos artifacts
    ]]>
    + hydra +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-14-ledger + 2022-10-14-ledger + Fri, 14 Oct 2022 00:00:00 GMT + + High level summary

    The ledger team is still primarily focused on addressing +technical +debt. +We now have the infrastructure for versioning our serialization schemes, +which we continue to put into action. +We have made first steps towards getting proper support for the +formal ledger repository +(in particular, we've added nix builds and +continuous integration support). +We are wrapping up an investigation of the performance of a critical +function used by the consensus layer for leader checks. +Finally, we are improving the packaging and versioning of our code.

    Lower level summary

    Completed Technical Debt

    • Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of +our code lives in the cardano-ledger-shelley package, though with hindsight we can say that +much of it should live in cardano-ledger-core. +We continue to move things to cardano-ledger-core, and have much more to come. [pull-3059]
    • We now have the infrastructure to support versioned serialization schemes. +The inability to do this has caused us a lot difficulties, +such as [issue-3003], [issue-2965] and [issue-2444]. +We are still in the process of switching to the versioned serialization scheme +(such as [pull-3078]), +but the infrastructure was completed in [pull-3063].
    • We now have proper nix and CI support for the formal ledger project. [pull-19]
    • A separate team is helping bring support for +CHaP +to all the cardano-node repositories. +We have been helping out with this effort.
    • A separate team continues working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. +We have been helping out with this effort.

    In-progress Technical Debt

    We also have several fairly large pull-requests in review +that we are working on.

    • In an on-going attempt to build out a more user-friendly API, +we continue to remove HasField instances in place of using micro-lenses. +The protocol parameters, in particular, are being worked on. [pull-3045]
    • We are also renaming record fields to be consistent across the repository. [pull-3062]
    • We are now cleaning up all the work we did to understand the performance +of the TICKF transition. We have some improvements to the computatation +as well. [pull-3068]
    • We are adding more documentation, in particular to our Twiddler functionality. [pull-3073]
    • The formal ledger is adding support for finite set theory. [pull-20]
    ]]>
    + ledger +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-05-consensus + 2022-10-05-consensus + Wed, 05 Oct 2022 00:00:00 GMT + + High level summary

    During the past two weeks, the consensus team worked on improving the +performance of the ChainSync jumping logic, which is needed for Genesis. We also +rewrote the implementation of the mempool in the UTxO HD prototype which solved +the issues that prevented us from running system level benchmarks. Also on the +UTxO HD front, we have an improved implementation of the sequence-of-differences +(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for +the UTxO HD feature.

    Executive summary

    • With the latest implementation of ChainSync jumping we are closer to the +baseline performance. In particular, the prototype seems to benefit from the +extra concurrency provided by additional capabilities.
    • We rewrote the implementation of the mempool in the UTxO HD prototype. This +rewrite was required due to performance problems we observed when running the +workbench. +These performance problems prevented us from running system level benchmarks. +The rewrite solved these issues. After the UTxO-HD: mempool +rewrite PR is +merged, we will contact the Benchmarking team so that they run the system +level benchmarks.
    • The implementation of sequences of differences based on anti-diffs was +integrated into the UTxO HD prototype. It is pending +review and +we also need to run replay and syncing benchmarks to confirm that this will +deliver a performance improvement, as observed in our micro-benchmarks.
    • The UTxO HD prototype +inspection +resulted in a list of +tests +needed for consensus to consider the UTxO HD prototype as fully tested.

    Additional information

    Genesis

    Benchmarking setup: 50MBit/s, 50ms latency

    • Red: baseline
    • Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.

    As ChainSync Jumping involves many concurrent network operations at every jump, +we tried to run the node with 6 instead of the default 2 capabilties.

    • Orange: baseline with 6 capabilities
    • Blue: CSJ prototype with 6 capabilities

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    Further work includes whether we can tune the prototype to better handle few +capabilities, or to adapt the default number of capabilities (potentially just +while syncing).

    ]]>
    + consensus +
    + + <![CDATA[DB Sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-04-db-sync + 2022-10-04-db-sync + Tue, 04 Oct 2022 00:00:00 GMT + + DBSync Update

    Fast restarts

    We fixed a long overdue issue in db-sync which caused long delays on restarts +1266. This has been +one of db-sync main objectives for this period. Restarts are now very fast, +because db-sync deletes almost nothing from the db, it just replays the ledger rules until it +reaches the tip of the db. The fix also improves reconnection speed, in cases where the node +restarts or the connection is temporarily lost. It also speeds up even more in cases where due to a +deployment mess up a very old snapshot or no snapshot at all is used.

    Property based testing

    We added stateful property based testing, using quickcheck-state-machine +1269. These tests use empty or +almost empty blocks to test the new behaviour of restarts and rollbacks.

    These tests generate arbitrarily a list of symbolic commands from these:

    RollForward Int
    RollBack BlockNo
    StopDBSync
    StartDBSync
    RestartNode
    AssertBlockNo BlockNo

    The commands are translated into real commands. For example RollForward Int will forge a new block +that fits on the current chain. These real commands are executed against db-sync using the mock +chain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync +which looks like this:

      Model
    { serverTip :: BlockNo
    , dbSyncTip :: BlockNo
    , dbSynsIsOn :: Bool
    , dbSynsHasSynced :: Bool
    }

    Finally a number of postconditions are checked, related to the eventual block number of db-sync.

    Tech Debt

    We handled a number of tech debt in +1275 +This improves the code format of db-sync, deletes many queries that were never used and groups the +others. This tech debt resolution not only improves the experience of working in db-sync, but can +facilitate some of our other objectives, as it makes it very explicit which queries are used +during syncing and which indexes are necessary.

    Smash

    We worked on fixing an issue related to fetching pool metadata +1276. +The issue which is described in +1270

    ]]>
    + db-sync +
    + + <![CDATA[Node API & CLI Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-10-04-node-cli-api + 2022-10-04-node-cli-api + Tue, 04 Oct 2022 00:00:00 GMT + + Node-Api-Cli Update

    2022-10-04 - 2022-10-18

    Executive Summary

    The majority of the team's time was spent between getting 1.34.4 ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to cardano-cli.

    Completed

    cardano-cli

    cardano-api

    cardano-node

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    ]]>
    + cli-api +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-09-30-ledger + 2022-09-30-ledger + Fri, 30 Sep 2022 00:00:00 GMT + + Ledger Update

    We have continued focusing nearly entirely on addressing technical debt. +A lot of design work has begun for the next ledger era, +but we do not yet have anything concrete to share.

    Technical debt issues completed

    • [issue-1676][pull-2992] We have finally removed the ledger dependency on the +cardano-prelude package. It was barely used in the ledger repository, and it added a dependency +that we did not want to maintain. It was a bit difficult to remove, and we had +to coordinate removing it from cardano-base. +A lot ended up going into pull-2992, due to the coordination effort, and we ended +up updating Plutus as well. +This means that we've now also made a lot of progress on the problematic cost model serialization +issues described in issue-2902. +In particular, after we resolve issue-3014, we will not have to wait an epoch before +releasing a cost model for a new version of Plutus, as we had to do for the Vasil HF.
    • [issue-3046][pull-3055] We moved a module that is now only used in Byron to a Byron package.
    • [issue-3047][pull-3054] We improved the interface to the Value (multi-asset) type.
    • [pull-3044] We debugged and fixed a tricky compilation issue. Certain kinds of field updates +were adding approximately 20 minutes to our compile time!
    • [issue-2932][pull-3036] As a part of our ongoing re-organization of the codebase, we +have added a Cardano.Ledger.[Era].Core module to each ledger era that has a TxBody class. +Most classes defined in the era should go in this new module. +We also re-export the Cardno.Ledger.Core module and the previous Cardano.Ledger.[Era].Core +modules from each era.

    Technical debt in progress

    • [issue-3034][issue-3035][node-issue-4421] We are continuing to write benchmarks to understand exactly where +all the time is being spent on executing the TICKF transition. +The consolidation of the per-stake-credential stake distribution to the per-stake-pool +distribution does seem to account for a large amount of time (near a second as written, which we +have down to about half a second with some optimizations), +but this does not account for everything. +Applying the reward update may also be a big contributing factor.
    • [pull-3033][pull-3038][pull-3041] A separate team is working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort.
    • The nix scripts used to build our new +formal ledger model +do not work consistently for everyone, and we have been working on fixing these issues.
    • [issue-3014] We are still working on adding a versioning scheme to all of the ledger +serializers.
    ]]>
    + ledger +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-09-27-network + 2022-09-27-network + Tue, 27 Sep 2022 00:00:00 GMT + + Network Update

    Ouroboros Network

    Ouroboros Consensus

    • Recently we found out that the consensus does not log exceptions thrown during +intiialisation. This was fixed in +PR input-output-hk/ouroboros-network#4015 +As part of this pull request we also changed that all exceptions rethrown by +the connection handler thread are wrapped in ExceptionInHandler.

    Some older items, which were not announced

    • We identified and fixed an issue related to socket activation (socket options +where not set for sockets passed through socket activation). +PR input-output-hk/cardano-node#3979 +This fix will be released in the next cardano-node release.

    Cardano Node

    • We extended the NixOs service module so that one can modify socketPath, +runtimeDir, databasePath, traceSocketPathAccept, +traceSocketPathConnect and stateDir options. +PR input-output-hk/cardano-node#4196

    IO-Sim

    We resolved a number of issues before release of io-sim on hackage:

    See PR #24.

    We also improved experience for contributors of io-sim and typed-protocols by adding issue templates:

    Typed Protocols

    Input Endorsers Simulation

    New features include:

    • Histograms of block arrival frequency, for both network (inbound) and CPU +(block validation). This is interesting to check that we're not overloading +the CPU block validation capacity, or network link capacity. Or alternatively +to observe the behaviour in an overload situation if we set the block +generation rate high enough.

    • Pie chart of utilisation of TCP links. This shows how small a fraction of +links are being used at any one time, and shows that once the system "warms +up" and is operating stably, most block delivery is ballistic.

    • Showing off the new screen layout combinators, that let us put multiple +charts, titles etc on screen at once and scale them to whatever screen or +video resolution we like without having to tweak numbers (this example is +scaled to fit 1080HD video resolution).

    ]]>
    + network +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-09-20-consensus + 2022-09-20-consensus + Tue, 20 Sep 2022 00:00:00 GMT + +
  • We proposed a fix for the performance degradation observed when running +distributed multi-node benchmarks in the UTxO HD feature branch. While this +fixed the problems observed when running local benchmarks, it broke the +ThreadNet tests due to concurrency issues. Therefore, we think it is wise to +start redesigning the UTxO HD mempool integration.
  • We did several rounds of code review on the alternative implementation of +diff-sequences required by the UTxO HD feature based on the idea of +anti-diffs. This alternative implementation is close to being merged, and the +next step is to integrate this to the UTxO HD branch, so that we can run +ad-hoc replaying and syncing from scratch benchmarks and compare these with +the baseline. The micro-benchmarks we elaborated for the alternative +implementation show speedups of up to 4x, so we are optimistic about the +performance of replaying and syncing from scratch benchmarks, however it is +important to notice that due to the nature of UTxO HD we will still be +slower than the baseline.
  • The final draft of the Genesis implementation specification is ready for +review.
  • We implemented a prototype for the happy path of Genesis' ChainSync Jumping +(CSJ). The prototype is slower than the baseline, however it is not the latest +version of the prototype and the jump interval is very small.
  • Work on integrating Conway has stopped since +priorities have changed.
  • We started work on benchmarking epoch-boundaries and epoch overhead +pr-4014. To this end, we made use of a modified version of our +db-analyser tool. We ran the new benchmarking setup using the Cardano +mainnet chain, and we can see that block tick and application take +substantially longer at epoch boundaries, although there are a couple of slots +during an epoch in which these computations take more than normal. We notified +the ledger team about these findings. We will use this modified version of +db-analyser to investigate the epoch overhead.
  • Workstreams

    UTxO HD

    • Spent quite some time investigating the root cause of the degradation in +performance observed in the benchmarks. We run the make forge-stress +benchmarks locally in order to debug this behavior.

      • Transaction batching doesn't make a notable difference in the outcome +(considering we are using the in-memory backend).

      • The mempool batching implementation required asynchronous transaction +validation which is a violation of the LocalTxSubmission protocol +contract and therefore if we continued on that route, the impact would +have been quite big.

      • The STM logic we implemented by using a TMVar for the mempool internal +state was buggy and under certain circumstances it seemed to lock. +Reverting the mempool internal state to be stored in a TVar seems to +solve this problem.

      • The results we get after this change look almost identical to the ones +from the baseline.

    • The anti-diff prototype (PR +#3997) has +been reviewed and is close to being merged.

      • A follow-up issue (issue +#4010) +to integrate the anti-diff prototype in the various consensus packages +was created. A first version of the integration exists, and all tests +pass. A next step is to get some indication of the "real" performance gain +by profiling db-analyser (or cardano-node).

    Genesis

    • Final draft of the Genesis implementation specification, now up for review.

    • Local benchmark setup for parameter tuning via the happy path ChainSync +Jumping (CSJ) prototype (Issue 3987).

      • Context: Our Genesis design requires us to check in with a large (~20) +number of servers periodically while syncing. These servers are offered +jump requests via the ChainSync protocol (hence the name), which they can +accept or decline. If a peer declines, the Genesis rule allows us to +determine whether a node actually has a better chain.

      • The "happy path" is when no peer declines a jump. We want this to have +close to no overhead compared to status quo, i.e. syncing without Genesis.

      • We implemented a prototype for this happy path, and are now starting to +test in various configurations (number of peers, latency, bandwidth) to +tune the performance of ChainSync jumping, i.e. how complicated our logic +of choosing when to jump needs to be.

        Example:

      • Simulated connection: 50 MBit/s, 50ms latency

      • Jump interval: 3000 slots (on the low end, could be increased to up to +3k/f)

      • Red: baseline (1.35.3), one peer in topology file

      • Blue: Preliminary version of our prototype, with 10 peers.

        It is slower by about ~30%, but it is not the latest version of the +prototype, and the jump interval is very small, making CSJ more of a +bottleneck.

    Technical debt

    • Fix flakiness in ChainDB QSM tests (PR 3990).
    ]]>
    + consensus +
    + + <![CDATA[DB Sync Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-09-19-db-sync + 2022-09-19-db-sync + Mon, 19 Sep 2022 00:00:00 GMT + + DBSync Update

    New Tag

    We created a new db-sync tag 13.0.5 which addresses shortcomings of the last +release 13.0.4. It is currently under testing. +The Changelog is +here and in more details:

    • We fixed fees for tx with phase 2 failure that didn't include a total collateral field. +1248

    • We fixed an issue that could cause db-sync to crash if a specific rollback occured. +1247

    • DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but +could result in the wrong CBOR encoding being inserted. +1217

    • All the fixes above come with unit tests which validates the fix.

    • Added support for preprod and preview from docker. DBSync no longer needs to include the configs +for different networks, these are directly fetched from the cardano world. +1254

    • We added better support from docker for the new disable options and the overall documentation. +1260

    All the above were also backported to the master branch

    Open source

    We made the db-sync board public, so +everyone can have access on the issues we prioritise. +We also added new tasks to the board, some of them could be approachable to newcomers or people who +want to contribute.

    Progress on tech debt and new features

    • 1223 was merged, which removes the +foreign keys from the db schema. This opens the road to a number of optimizations.

    • An additional fix on top of the previous work was added +1250

    • An initial version where DBSync does not rollback on restart is done here +1266. +This allows db-sync to restart much faster, without the need to delete data and reinsert them. In +the future it can also facilitate migrations in cases where the ledger snapshots have a breaking +change, without the need to resync everything from genesis.

    ]]>
    + db-sync +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-09-16-ledger + 2022-09-16-ledger + Fri, 16 Sep 2022 00:00:00 GMT + + Ledger Update

    We have been focused nearly entirely on addressing technical debt.

    • We introduced more consistent naming across eras, this time for the auxiliary data. +See 3032.
    • We made clear how the consumed functions differs between eras (which was a previous source of +confusion), and added some related support to the fledgling ledger API. +See 3016.
    • We added clarity and organizational consistency to the main ledger era type synonyms. +See 3017.
    • We removed code duplication related to the input data hashes. +See 3018.
    • We split up a large module into smaller components. The large module was actually causing our +CI to time out. +See 3020.
    • We cleaned up stale information in our cabal files, and upgraded cabal 3.8. +See 3023, +3031, +and 3028.
    • We made consistent, standalone TxOut (transaction output) modules for every era. +See 3024.
    • We brought consistency to a maddening inconsistent use of type variables indicating the specific +choice of cryptographic primitives. In particular, all uses of crypto have been renamed to c. +See 3027.
    • We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric +types that will compose better in the future and which simplifies the constraints. +See 3029.
    • We consolidated some existing fragmented logic regarding how we gather the scripts needed for a +given transaction. This is a much needed cleanup to prevent future mistakes. +See 3019.
    • We fixed a problem with our generators that was causing a fair number of our property tests to +fail in CI. +See 3039.
    • We have started the work to update Plutus. This will bring support for SECP in the next major +protocol version, and also address a +problem +that we current have evolving the cost models. +See 3030.
    • We addressed a small issue that came up when integrating the conway era downstream, namely +the lack of some serialization instances. +See 3022.
    ]]>
    + ledger +
    + + <![CDATA[Ledger Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-09-01-ledger + 2022-09-01-ledger + Thu, 01 Sep 2022 00:00:00 GMT + + Ledger Update

    Since finishing up support for the Vasil Hardfork, the ledger team has been +focused on two main things: a new ledger era and technical debt.

    New minimal ledger era

    We have implemented a new ledger era named conway which is nearly identical +to the babbage era. This has been the first time that we have been able to see +what a minimal ledger era looks like. We have finished this task, modulo any +integration issues that might come up. The only thing that the conway era +does differently from the babbage era is provide support for rotating +the master keys using the hardfork combinator's state translation. +We may end up adding features to the conway era, but it is a nice exercise +seeing what it looks like to get a minimal ledger era supported in all the +downstream components.

    Addressing technical debt

    We have been addressing technical debt, mostly in an effort to make the +repository a more friendly code base to work in.

    • We have begun work on a ledger API, called cardano-ledger-api.
    • We have done a big re-design of the major type classes used in the ledger. +With hindsight on our side, we now have something much more organized and +easier to use.
    • We have done a lot of re-naming. The names across eras are now much more +uniform, avoid certain confusions that plagued us, and are clearer in where +they are from.
    • We have reduced a lot of code duplication that could lead to bugs if you +do not have the whole code base in your head.
    • We have added a handful of performance improvements.
    • We added type safety in a number of locations. In particular, the type of +values that can be minted in a transaction no longer allow for Lovelace +in the type, and some functions which used to handle both timelock scripts +and plutus script now correctly enoforce at the type level that only one of +them can be used.
    • We made our generators so that they now produce a much richer set of +valid serializations. There is room within CBOR to serialize the same +data structure in multiple ways, and it is helpful to have the generators +use a wide variety.
    • We have begun re-organizing our test suites.
    ]]>
    + ledger +
    + + <![CDATA[Consensus Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-08-31-consensus + 2022-08-31-consensus + Wed, 31 Aug 2022 00:00:00 GMT + + Executive summary
    • We did most of the heavy lifting required to integrate the Conway era.
    • We have property tests for the UTxO HD backing store API implementations. A +possible bug was identified. Work is ongoing to make sure the property-tests +cover all the relevant cases.
    • We implemented and benchmarked the "anti-diff" prototype to speed up the UTxO +HD functionality. Results show a rough speedup of 4x to 5.5x across +several scenarios. Note that: "Data reported by tasty-bench is only of +indicative and comparative significance.". +We are investigating additional performance improvements. The "anti-diff" +prototype and benchmarks are still pending code review.
    • We elaborated a draft specification for the Genesis implementation and +ChainSync jumping optimization.

    Workstreams

    Conway

    • Integration PR of the minimal Conway era (Issue #3963, PR +#3971).
    • Discussions with Ledger revealed possible sources of confusion about which +data should be changed in the Conway era. As a result, a new technical debt +issue was raised, which does not block the integration of the Conway era +(Issue #3976).

    UTxO HD

    • Issue #3954, branch: The functionality of a +backing store, which is the interface to the on-disk part of ledger state in +UTxO-HD, is tested at a high level through the OnDisk tests. However, some +functionalities remain untested, e.g., reads of ranges of keys. As such, we +have implemented quickcheck-state-machine tests that exercise backing stores +directly. The tests are reusable for different backing store implementations +because the tests are implementation-agnostic: Any backing store that conforms +to the backing store interface can be plugged into the tests. Work is still +ongoing to label/monitor the tests, such that we can verify that interesting +cases are being tested. Furthermore, a possible bug has been identified in the +LMDB backing store with respect to range reads, though the bug has not been +resolved yet.

    • Issue #3946, branch, PR #3882: The +"anti-diff" prototype proposes an alternative approach to keeping track of +sequences (more specifically, FingerTrees) of diffs. These diff sequences +are a component of the in-memory parts of the ledger state in UTxO-HD. Since +the consensus code often requires the cumulative diff of a sequence of diffs, +the current implementation "caches" cumulative diffs of each subtree in the +diff sequence. This caching allows relatively fast reconstruction of the total +cumulative diff, but this caching proved to incur a non-negligible cost: when +we manipulate diff sequences through splits and appends, we force re-computing +a logarithmic number of caches. This is problematic, since we often split and +append in consensus: we split when we flush diffs to a backing store or when +we roll back blocks, and we append when pushing blocks. The new approach +should reduce the overhead of this caching.

      We implemented micro-benchmarks for the "anti-diff" prototype: we +first generate a sequence of commands (Forward, Push, Flush, or +Rollback) through a simulation, after which we measure the performance of +applying the commands to a diff sequence. In this context, Forward means +forwarding of values through a diff, whereas Rollback means switching to +a different fork by rolling back diffs/blocks and pushing new ones. +Moreover, we compare the performance for the two implementations: the +"legacy" approach, and the anti-diff approach.

      Some preliminary results were positive, but we needed to revisit the +benchmark's configuration to obtain more definitive results. After a +discussion with @dcoutts and the consensus team about this configuration +(e.g., number of commands generated, choice of the security parameter k), +the benchmarks should now be closer to the realistic setting. The following +configuration specifies the default configuration that is used in the +benchmarking code:

      • Number of commands generated: 10_000
      • Security parameter k: 2160
      • Number of initial backing values: 100
      • Number of key-value pairs deleted by a push: 50
      • Number of key-value pairs inserted by a push: 50
      • Number of key-value pairs forwarded by a forward: 50
      • Probability of a large (in the range [1000, 2000]) rollback: 0.05
      • Probability of a small (in the range [1, 10]) rollback: 0.95
      • Order of commands:
        • An equal number of forward and pushes.
        • 1 flush every 10 pushes.
        • 1 rollback every 100 pushes

      Moreover, we run four benchmark scenarios:

      • Default configuration
      • Without rollbacks
      • With only small rollbacks
      • Without rollbacks, larger flushes (1 flush every 100 pushes)

      How to read results

      Note: this section uses documentation from the +tasty-bench package to +explain how to read the results of running our benchmarks.

      Running a benchmark scenario gives us the following (curated) output:

      ...
      AntiDiff: OK (18.27s)
      2.527 s ± 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x
      LegacyDiff: OK (32.73s)
      10.829 s ± 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory
      ...

      The output says that the first benchmark, which exercises the anti-diff +prototype, was repeatedly executed for 18.27 seconds (wall-clock time), +its predicted mean CPU time was 2.527 seconds and means of individual +samples do not often diverge from it further than ± 47 milliseconds +(double standard deviation). We also configure the RTS to collect GC +statistics, which enables tasty-bench to estimate and report memory usage. +This data is reported as per RTSStats fields: allocated_bytes, +copied_bytes and max_mem_in_use_bytes. So, the output of the first +benchmark says that a total of 2.1 GB of memory was allocated, that a +total of 544 MB of memory were copied, and that the peak memory in usage +was 2.2 GB. We read the output for the second benchmark in the same way.

      Furthermore, the benchmark compares the mean CPU times for +both the anti-diff and legacy approaches: In this case, the mean CPU time +for the anti-diff approach is ~0.23x the mean CPU time for the legacy +approach. Conversely, the mean CPU time for the legacy approach is +1 / 0.23 ~= 4.35x the mean CPU time for the anti-diff approach. We will +call 0.23x the improvement factor. We will call 4.35x the speedup.

      Note that these improvement factors (and reported results) are subject to +noise, randomness, the specific configuration parameters, and the whims +of statistics. Data reported by tasty-bench is only of indicative and +comparative significance.

      Results

      For each of the 4 scenarios, we list the results of running the anti-diff and +legacy approaches 5 times. We run the benchmarks 5 times to get an indication +of whether the results are similar across multiple runs. Furthermore, we +calculate the accompanying ranges (if applicable) of improvement factors and +speedups.

      Note also the decrease in total bytes allocated and total bytes copied for +the anti-diff approach compared to the legacy approach.

      Default configuration

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff2.533 s (0.23x)4.7 ms2.1 GB557 MB2.4 GB
      Run 1: LegacyDiff10.792 s162 ms6.8 GB2.3 GB2.4 GB
      Run 2: AntiDiff2.508 s (0.23x)245 ms2.1 GB515 MB2.2 GB
      Run 2: LegacyDiff10.850 s30 ms6.9 GB2.3 GB2.2 GB
      Run 3: AntiDiff2.562 s (0.23x)5.0 ms2.1 GB552 MB2.2 GB
      Run 3: LegacyDiff10.993 s149 ms6.9 GB2.3 GB2.2 GB
      Run 4: AntiDiff2.168 s (0.22x)5.3 ms1.8 GB434 MB2.0 GB
      Run 4: LegacyDiff9.976 s39 ms6.3 GB2.0 GB2.0 GB
      Run 5: AntiDiff2.527 s (0.23x)47 ms2.1 GB544 MB2.2 GB
      Run 5: LegacyDiff10.829 s148 ms6.8 GB2.3 GB2.2 GB
      • Improvement factor: [0.22, 0.23]
      • Speedup : [1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]

      No rollbacks

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.638 s (0.19x)36 ms1.4 GB181 MB2.4 GB
      Run 1: LegacyDiff8.656 s207 ms5.7 GB1.5 GB2.4 GB
      Run 2: AntiDiff1.638 s (0.19x)75 ms1.4 GB181 MB2.2 GB
      Run 2: LegacyDiff8.654 s322 ms5.7 GB1.5 GB2.2 GB
      Run 3: AntiDiff1.663 s (0.19x)74 ms1.4 GB181 MB2.2 GB
      Run 3: LegacyDiff8.799 s216 ms5.7 GB1.5 GB2.2 GB
      Run 4: AntiDiff1.645 s (0.19x)51 ms1.4 GB181 MB2.0 GB
      Run 4: LegacyDiff8.732 s261 ms5.7 GB1.5 GB2.0 GB
      Run 5: AntiDiff1.639 s (0.19x)19 ms1.4 GB181 MB2.2 GB
      Run 5: LegacyDiff8.653 s234 ms5.7 GB1.5 GB2.2 GB
      • Improvement factor: 0.19
      • Speedup : 1 / 0.19 ~= 5.25

    Only small rollbacks

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff1.833 s (0.18x)36 ms1.5 GB185 MB2.4 GB
    Run 1: LegacyDiff10.362 s867 ms5.8 GB1.6 GB2.4 GB
    Run 2: AntiDiff1.696 s (0.19x)30 ms1.5 GB185 MB2.2 GB
    Run 2: LegacyDiff8.822 s106 ms5.8 GB1.5 GB2.2 GB
    Run 3: AntiDiff1.702 s (0.19x)44 ms1.5 GB186 MB2.2 GB
    Run 3: LegacyDiff8.906 s147 ms5.8 GB1.5 GB2.2 GB
    Run 4: AntiDiff1.701 s (0.19x)47 ms1.5 GB185 MB2.0 GB
    Run 4: LegacyDiff8.949 s197 ms5.8 GB1.5 GB2.0 GB
    Run 5: AntiDiff1.677 s (0.19x)55 ms1.5 GB186 MB2.2 GB
    Run 5: LegacyDiff8.856 s177 ms5.8 GB1.5 GB2.2 GB
    • Improvement factor: [0.18, 0.19]

    • Speedup : [1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]

      No rollbacks, larger flushes (every 100 pushes)

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.643 s (0.25x)21 ms1.5 GB196 MB2.4 GB
      Run 1: LegacyDiff6.591 s351 ms4.0 GB1.4 GB2.4 GB
      Run 2: AntiDiff1.616 s (0.25x)47 ms1.5 GB196 MB2.2 GB
      Run 2: LegacyDiff6.520 s232 ms4.0 GB1.4 GB2.2 GB
      Run 3: AntiDiff1.640 s (0.25x)34 ms1.5 GB196 MB2.2 GB
      Run 3: LegacyDiff6.540 s150 ms4.0 GB1.4 GB2.2 GB
      Run 4: AntiDiff1.635 s (0.25x)76 ms1.5 GB196 MB2.0 GB
      Run 4: LegacyDiff6.589 s131 ms4.0 GB1.4 GB2.0 GB
      Run 5: AntiDiff1.628 s (0.25x)19 ms1.5 GB196 MB2.2 GB
      Run 5: LegacyDiff6.490 s5.9 ms4.0 GB1.4 GB2.2 GB
    • Improvement factor: 0.25

    • Speedup : 1 / 0.25 ~= 4

    Genesis

    • We elaborated a draft of the specification of the Genesis implementation and +the ChainSync Jumping optimization. In particular, this includes a proof +sketch that the latter preserves liveness and safety in all cases (Issue +3964).
      • @nfrisby's main realization during this sprint was that he had been +focusing so far on the case where the selected chain is an extension of +the intersection of our peers' ChainSync candidates.
      • This is the main case, ie an "absorbing" state, but it's not the only +case.
      • The new proof sketch begins by case splitting on that predicate, and +that made the sketch quite a bit easier to follow.
    • We continued working on the "happy path" ChainSync Jumping prototype (Issue +3960).

    Technical debt

    • We started working on the issues required to re-enable nightly CI runs.. +Nightly CI runs have far more lax time constraints, which gives the option to +run significantly more property tests than in our regular CI. To this end, we +merged a PR to easily adapt the number of tests globally (PR +#3947).
    ]]>
    + consensus +
    + + <![CDATA[Network Team Update]]> + https://input-output-hk.github.io/cardano-updates/2022-08-12-network + 2022-08-12-network + Fri, 12 Aug 2022 00:00:00 GMT + + The networking team took an active part in the project iteration (PI) planning +session, see cardano-node backlog for detailed +outcomes.

    • We started working on a detailed design / implementation plan for gossip.

    • We merged input-output-hk/ouroboros-network#3859 which +sets the ouroboros-network repository for the single relay release.

    • We identified a bug in the network simulator, which is fixed in the +input-output-hk/ouroboros-network#3852. +The above PR was reviewed.

    • We set the tracing configuration for nodes which we deploy and fixed and +identified some deployment hiccups. We identified some bugs in the RT view +which were registered by the maintainers. +input-output-hk/ouroboros-network-ops#4

    • We fixed typos in network-mux library: +input-output-hk/ouroboros-network#3921

    • For easy of debugging we renamed a trace point: +input-output-hk/ouroboros-network#3922

    • Duncan iterated on his simulation / visualisation. He also was able to +identify and fix a bug in the simulator. The simulation contains 50 nodes. +Dashed lines indicate and established connection, while solid lines indicate +a TCP connection with fully open TCP window.

    ]]>
    + network +
    +
    +
    \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000000..609544e0b90 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://input-output-hk.github.io/cardano-updates/2022-08-12-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2022-08-12-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2022-08-31-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-09-01-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-09-16-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-09-19-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2022-09-20-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-09-27-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2022-09-30-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-02-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-04-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-04-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-05-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-14-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-14-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-18-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-19-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-21-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-27-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-28-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-28-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-28-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2022-10-31-open-sourceweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-01-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-02-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-02-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-02-releaseweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-02-system-testweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-03-embedding-qualityweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-04-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-04-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-11-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-11-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-11-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-11-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-16-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-16-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-16-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-18-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-18-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-23-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-25-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-25-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-28-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-30-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-30-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2022-11-30-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-01-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-01-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-01-system-testweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-02-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-09-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-09-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-09-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-12-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-14-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-14-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-14-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-14-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-15-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-16-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2022-12-28-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-05-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-06-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-11-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-11-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-12-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-13-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-13-releaseweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-13-system-testweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-14-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-19-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-20-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-20-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-20-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-20-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-25-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-25-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-26-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-01-27-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-02-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-03-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-03-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-03-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-08-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-08-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-08-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-09-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-10-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-17-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-17-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-17-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-17-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-17-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-21-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-22-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-22-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-23-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-23-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-02-24-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-02-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-03-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-03-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-03-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-03-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-08-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-08-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-08-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-09-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-10-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-16-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-17-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-17-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-17-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-21-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-22-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-22-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-22-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-23-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-23-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-24-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-27-system-testweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-31-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-31-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-31-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-03-31-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-05-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-05-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-05-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-06-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-07-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-14-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-14-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-17-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-19-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-19-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-20-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-20-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-21-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-21-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-27-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-28-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-28-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-04-28-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-01-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-03-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-03-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-04-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-05-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-05-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-12-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-12-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-12-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-12-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-17-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-17-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-17-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-19-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-24-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-26-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-26-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-26-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-26-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-31-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-05-31-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-01-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-02-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-07-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-08-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-08-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-08-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-08-system-testweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-09-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-09-developer-experienceweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-09-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-12-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-14-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-14-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-15-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-16-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-23-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-23-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-23-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-23-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-28-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-28-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-29-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-06-30-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-04-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-04-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-06-developer-experienceweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-07-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-07-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-07-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-07-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-12-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-12-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-13-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-14-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-18-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-20-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-21-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-21-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-21-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-26-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-27-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-28-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-07-31-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-01-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-04-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-04-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-04-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-04-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-04-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-04-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-04-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-09-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-10-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-11-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-11-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-15-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-17-cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-17-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-17-secp-issueweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-18-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-18-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-18-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-18-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-18-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-23-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-24-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-25-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-28-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-08-29-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-01-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-01-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-01-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-01-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-01-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-06-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-07-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-07-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-08-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-12-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-14-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-15-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-15-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-15-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-15-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-15-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-20-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-20-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-22-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-22-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-26-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-27-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-29-goedelweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-29-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-29-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-09-29-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-02-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-04-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-04-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-06-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-06-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-10-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-11-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-13-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-13-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-13-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-15-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-18-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-18-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-20-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-24-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-25-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-27-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-27-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-10-27-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-01-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-01-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-08-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-08-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-09-db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-10-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-10-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-14-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-15-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-15-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-16-networkweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-17-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-17-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-20-cip1694weekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-22-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-22-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-24-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-24-sreweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-29-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/2023-11-29-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/2023-12-01-hydraweekly0.5https://input-output-hk.github.io/cardano-updates/2023-12-04-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/2023-12-06-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/2023-12-06-mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/archiveweekly0.5https://input-output-hk.github.io/cardano-updates/markdown-pageweekly0.5https://input-output-hk.github.io/cardano-updates/page/10weekly0.5https://input-output-hk.github.io/cardano-updates/page/11weekly0.5https://input-output-hk.github.io/cardano-updates/page/12weekly0.5https://input-output-hk.github.io/cardano-updates/page/13weekly0.5https://input-output-hk.github.io/cardano-updates/page/14weekly0.5https://input-output-hk.github.io/cardano-updates/page/15weekly0.5https://input-output-hk.github.io/cardano-updates/page/16weekly0.5https://input-output-hk.github.io/cardano-updates/page/17weekly0.5https://input-output-hk.github.io/cardano-updates/page/18weekly0.5https://input-output-hk.github.io/cardano-updates/page/19weekly0.5https://input-output-hk.github.io/cardano-updates/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/page/20weekly0.5https://input-output-hk.github.io/cardano-updates/page/21weekly0.5https://input-output-hk.github.io/cardano-updates/page/22weekly0.5https://input-output-hk.github.io/cardano-updates/page/23weekly0.5https://input-output-hk.github.io/cardano-updates/page/24weekly0.5https://input-output-hk.github.io/cardano-updates/page/25weekly0.5https://input-output-hk.github.io/cardano-updates/page/26weekly0.5https://input-output-hk.github.io/cardano-updates/page/27weekly0.5https://input-output-hk.github.io/cardano-updates/page/28weekly0.5https://input-output-hk.github.io/cardano-updates/page/29weekly0.5https://input-output-hk.github.io/cardano-updates/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/page/30weekly0.5https://input-output-hk.github.io/cardano-updates/page/31weekly0.5https://input-output-hk.github.io/cardano-updates/page/32weekly0.5https://input-output-hk.github.io/cardano-updates/page/33weekly0.5https://input-output-hk.github.io/cardano-updates/page/34weekly0.5https://input-output-hk.github.io/cardano-updates/page/35weekly0.5https://input-output-hk.github.io/cardano-updates/page/36weekly0.5https://input-output-hk.github.io/cardano-updates/page/37weekly0.5https://input-output-hk.github.io/cardano-updates/page/38weekly0.5https://input-output-hk.github.io/cardano-updates/page/39weekly0.5https://input-output-hk.github.io/cardano-updates/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/page/40weekly0.5https://input-output-hk.github.io/cardano-updates/page/41weekly0.5https://input-output-hk.github.io/cardano-updates/page/42weekly0.5https://input-output-hk.github.io/cardano-updates/page/43weekly0.5https://input-output-hk.github.io/cardano-updates/page/44weekly0.5https://input-output-hk.github.io/cardano-updates/page/45weekly0.5https://input-output-hk.github.io/cardano-updates/page/46weekly0.5https://input-output-hk.github.io/cardano-updates/page/47weekly0.5https://input-output-hk.github.io/cardano-updates/page/48weekly0.5https://input-output-hk.github.io/cardano-updates/page/49weekly0.5https://input-output-hk.github.io/cardano-updates/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/page/50weekly0.5https://input-output-hk.github.io/cardano-updates/page/51weekly0.5https://input-output-hk.github.io/cardano-updates/page/52weekly0.5https://input-output-hk.github.io/cardano-updates/page/53weekly0.5https://input-output-hk.github.io/cardano-updates/page/54weekly0.5https://input-output-hk.github.io/cardano-updates/page/55weekly0.5https://input-output-hk.github.io/cardano-updates/page/56weekly0.5https://input-output-hk.github.io/cardano-updates/page/57weekly0.5https://input-output-hk.github.io/cardano-updates/page/58weekly0.5https://input-output-hk.github.io/cardano-updates/page/59weekly0.5https://input-output-hk.github.io/cardano-updates/page/6weekly0.5https://input-output-hk.github.io/cardano-updates/page/60weekly0.5https://input-output-hk.github.io/cardano-updates/page/61weekly0.5https://input-output-hk.github.io/cardano-updates/page/7weekly0.5https://input-output-hk.github.io/cardano-updates/page/8weekly0.5https://input-output-hk.github.io/cardano-updates/page/9weekly0.5https://input-output-hk.github.io/cardano-updates/quarterlyweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2022-10-07-node-cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2022-11-07-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2022-11-09-networkweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2022-11-15-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-01-13-networkweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-01-13-open-sourceweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-01-18-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-04-03-ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-04-04-networkweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-04-25-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q2-consensusweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q2-networkweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q2-sreweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q3-performance-and-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/2023-Q3-sreweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/archiveweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tagsweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tags/cli-api-quarterlyweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tags/consensusweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tags/ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tags/networkweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tags/open-sourceweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tags/performance-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/quarterly/tags/sreweekly0.5https://input-output-hk.github.io/cardano-updates/tagsweekly0.5https://input-output-hk.github.io/cardano-updates/tags/cip-1694weekly0.5https://input-output-hk.github.io/cardano-updates/tags/cli-apiweekly0.5https://input-output-hk.github.io/cardano-updates/tags/cli-api/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/cli-api/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/cli-api/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/cli-api/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/tags/cli-api/page/6weekly0.5https://input-output-hk.github.io/cardano-updates/tags/consensusweekly0.5https://input-output-hk.github.io/cardano-updates/tags/consensus/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/consensus/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/consensus/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/consensus/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/tags/consensus/page/6weekly0.5https://input-output-hk.github.io/cardano-updates/tags/consensus/page/7weekly0.5https://input-output-hk.github.io/cardano-updates/tags/cryptoweekly0.5https://input-output-hk.github.io/cardano-updates/tags/crypto/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/crypto/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/crypto/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/db-syncweekly0.5https://input-output-hk.github.io/cardano-updates/tags/db-sync/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/db-sync/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/devxweekly0.5https://input-output-hk.github.io/cardano-updates/tags/embedding-qualityweekly0.5https://input-output-hk.github.io/cardano-updates/tags/goedelweekly0.5https://input-output-hk.github.io/cardano-updates/tags/goedel/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/goedel/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/goedel/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydraweekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/10weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/11weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/6weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/7weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/8weekly0.5https://input-output-hk.github.io/cardano-updates/tags/hydra/page/9weekly0.5https://input-output-hk.github.io/cardano-updates/tags/ledgerweekly0.5https://input-output-hk.github.io/cardano-updates/tags/ledger/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/ledger/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/ledger/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/ledger/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/tags/ledger/page/6weekly0.5https://input-output-hk.github.io/cardano-updates/tags/mithrilweekly0.5https://input-output-hk.github.io/cardano-updates/tags/mithril/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/mithril/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/mithril/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/mithril/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/tags/mithril/page/6weekly0.5https://input-output-hk.github.io/cardano-updates/tags/mithril/page/7weekly0.5https://input-output-hk.github.io/cardano-updates/tags/networkweekly0.5https://input-output-hk.github.io/cardano-updates/tags/network/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/network/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/network/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/network/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/tags/open-sourceweekly0.5https://input-output-hk.github.io/cardano-updates/tags/performance-tracingweekly0.5https://input-output-hk.github.io/cardano-updates/tags/performance-tracing/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/performance-tracing/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/performance-tracing/page/4weekly0.5https://input-output-hk.github.io/cardano-updates/tags/performance-tracing/page/5weekly0.5https://input-output-hk.github.io/cardano-updates/tags/releaseweekly0.5https://input-output-hk.github.io/cardano-updates/tags/securityweekly0.5https://input-output-hk.github.io/cardano-updates/tags/sreweekly0.5https://input-output-hk.github.io/cardano-updates/tags/sre/page/2weekly0.5https://input-output-hk.github.io/cardano-updates/tags/sre/page/3weekly0.5https://input-output-hk.github.io/cardano-updates/tags/system-testweekly0.5https://input-output-hk.github.io/cardano-updates/docs/category/tutorial---basicsweekly0.5https://input-output-hk.github.io/cardano-updates/docs/category/tutorial---extrasweekly0.5https://input-output-hk.github.io/cardano-updates/docs/introweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-basics/congratulationsweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-basics/create-a-blog-postweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-basics/create-a-documentweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-basics/create-a-pageweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-basics/deploy-your-siteweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-basics/markdown-featuresweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-extras/manage-docs-versionsweekly0.5https://input-output-hk.github.io/cardano-updates/docs/tutorial-extras/translate-your-siteweekly0.5https://input-output-hk.github.io/cardano-updates/weekly0.5 \ No newline at end of file diff --git a/tags/cip-1694/index.html b/tags/cip-1694/index.html new file mode 100644 index 00000000000..323c558c3dc --- /dev/null +++ b/tags/cip-1694/index.html @@ -0,0 +1,25 @@ + + + + + +One post tagged with "cip1694" | Cardano Development Updates + + + + + + + + + + + + +
    +

    One post tagged with "cip1694"

    View All Tags

    · 6 min read
    Kevin Hammond

    High level summary

    We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

    Initial CIP-1694 Security Analysis and Responses

    Section: The constitutional committee


    • “For example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

    There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


    Section: Size of the constitutional committee


    • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

    Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


    Section: Terms


    • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

    Thanks. Yes, that suggestion is a bit easier to read.


    Section: Registered DReps


    • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

    Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


    Section: Ratification


    • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

    These correspond exactly to the groups that are administered by the Parameter Committee.


    • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

    Yes, it’s not about harming the system, since Info +actions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

    Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


    Section: Content


    • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

    Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


    Section: Protocol Parameter groups


    • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

    These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


    • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

    All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


    Section: Votes


    • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

    They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


    Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


    • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

    There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


    Section: Changes post Edinburgh workshop (July 2023)


    • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

    It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


    Section: Reduced deposits for some government actions


    • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

    Indeed. We have no plans for this at the moment.

    + + + + \ No newline at end of file diff --git a/tags/cli-api/index.html b/tags/cli-api/index.html new file mode 100644 index 00000000000..6e32c33eb70 --- /dev/null +++ b/tags/cli-api/index.html @@ -0,0 +1,28 @@ + + + + + +27 posts tagged with "cli-api" | Cardano Development Updates + + + + + + + + + + + + +
    +

    27 posts tagged with "cli-api"

    View All Tags

    · 2 min read
    Carlos LopezDeLara

    2023-11-01 - 2023-11-14

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Improve golden tests
    • Clean-up of conway era commands

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Carlos LopezDeLara

    2023-10-11 - 2023-10-24

    High level summary

    CARDANO-CLI

    • Disambiguate cardano-cli stake credential related flags on treasury withdrawal governance actions making it easy to identify which is used for the deposit refund and which for the destination of the funds from the treasury if the action is ratified.
    • stake-address-info now shows deposits balance.
    • Added conway governance action view to allow to inspect governance action files before submitting them on a transaction.
    • build-raw support for --vote-file and --proposal-file

    CARDANO-API

    • Support DRep extended keys
    • Support Plutus V1 in Conway

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Carlos LopezDeLara

    2023-09-27 - 2023-10-10

    High level summary

    CARDANO-NODE

    CARDANO-CLI

    • Depracated governance query commands and moved all governance related queries to cardano-cli <era> query
    • Drep registration certificates now allow to include an anchor
    • Integrated Drep retirement ceriticates
    • clean up of Drep registration certificates.

    CARDANO-API

    • Add support for committee hot key witnesses
    • Require conway onwards for voting
    • Conway drep registration: expose ledger anchor parameter
    • Add certs to txbody of Conway transactions

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Carlos LopezDeLara

    2023-09-13 - 2023-09-26

    High level summary

    • cardano-node 8.4.0-pre release suitable for SanchoNet.
    • CLI continues making progress integrating governance features. During this sprint we integrated the info and new-committee governance actions.
    • The team continued moving to the ERA top-level commands structure. Removed --conway-era flag from the legacy commands making conway era commands only accessible via cardano-cli conway.
    • stake-pool command is now under the ERA top level structure.
    • API continues integration with governance features, it is worth to higlight that now ProposeNewCommitee uses the right key type (cc-cold)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 3 min read
    Carlos LopezDeLara

    2023-08-30 - 2023-09-12

    High level summary

    Release of Cardano-node 8.3.0-pre for SanchoNet. Adds DReps to the Conway governance rules. Allows registration of DReps, delegation to DReps and voting on constitution action with DReps and SPOs. +This release completes phase 2 of SanchoNet feature roll out plan

    CLI continues on its migration to a era-based top-level commands. This sprint we moved text-view, key, query, genesis, node, stake-address, transaction and address into this new command structure. This is the initial migration, there is still some clean-up to do on future sprints.

    We are moving the drep delegation-certificate to the stake-address command so delegating to a drep is done via stake-addres vote-delegation-certificate. Along the same lines, we are renaming +stake-address delegation-certificate (delagating to a stake pool) to stake-address stake-delegation-certificate to distinguish between stake delegation to a pool and votes delegation to a drep. On top +of that, there is a new type of delegation certificate to delegate (stake) to a stake pool and (votes) to a drep simultaneosuly stake-address stake-and-vote-delegation-certificate. Note that change is not included on 8.3 but will come on 8.4. +Removing --conway-era flag from all the transaction sub-commands.

    Update description fields in delegation certificates from Stake Address Delegation Certificate to respectively (Conway onwards):

    • Stake Delegation Certificate
    • Vote Delegation Certificate
    • Stake and Vote Delegation Certificate

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    + + + + \ No newline at end of file diff --git a/tags/cli-api/page/2/index.html b/tags/cli-api/page/2/index.html new file mode 100644 index 00000000000..d209f3e95be --- /dev/null +++ b/tags/cli-api/page/2/index.html @@ -0,0 +1,24 @@ + + + + + +27 posts tagged with "cli-api" | Cardano Development Updates + + + + + + + + + + + + +
    +

    27 posts tagged with "cli-api"

    View All Tags

    · 2 min read
    Carlos LopezDeLara

    2023-08-16 - 2023-08-29

    High level summary

    CLI is making progress towards phases 3 and 4 of SanchoNet.

    • Ability to create info, no-confidence and new committee governance actions.

    • Voting as DREP is possible now on the CLI

    • API is now using Ledger's PParams and VotingProcedures

    • Expose following queries from consensus:

      - GetGovState
      - GetDRepState
      - GetDRepStakeDistr
      - GetCommitteeState
      - GetConstitution

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Carlos LopezDeLara

    2023-08-02 - 2023-08-15

    High level summary

    • cardano-node 8.2.1 (pre-release) to SanchoNet
    • Continue moving CLI into era-based top level command structure
    • Wire-up DREP key generation,
    • Fix DREP deregistration certificates
    • Implement Constitutional Committee Key generation on the CLI
    • Introducing era-based protocol parameters on the API
    • Removing depracated functions and types on the API

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    Fix broken links in docs

    CI & project maintenance

    · 2 min read
    Carlos LopezDeLara

    2023-07-19 - 2023-08-01

    High level summary

    • Release of Node 8.2.0
      • Updates to the ledger packages extend progress on the Conway ledger era to support new governance features via CIP-1694.
      • This release is phase 1 of the SanchoNet roll out
      • Allows SPOs to vote on changes to the on-chain constitution.
      • Ability to start the node in block production mode with no secrets loaded using the --non-producing-node flag.
      • Updates to the networking packages prepare the road for peer sharing.
    • cardano-cli and cardano-api continue to integrate Conway era features
    • Continue refactoring of cardano-testnet

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · 2 min read
    Carlos LopezDeLara

    · 2 min read
    Carlos LopezDeLara

    2023-06-21 - 2023-07-04

    High level summary

    • Started integration of conway era into the cardano-api,
    • Pre-release of cardano-cli 8.2.1 which enables creating goveranance "Update constitution" governance actionsas well as voting. Both only as SPO. DREP and CC will come in future releases.
    • Cardano-cli is moving to a top-level era command structure (i.e. cardano-cli conway, cardano-cli babbage, etc to accomodate for different fucntionalities available in diferent eras. In particular between Babbage and Conway governance-related functionalities.
    • Continue refactoring cardano-testnet
    • CI and docs house keeping on the new cardnao-cli and cardano-api repositories

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    + + + + \ No newline at end of file diff --git a/tags/cli-api/page/3/index.html b/tags/cli-api/page/3/index.html new file mode 100644 index 00000000000..1abdd73b9d3 --- /dev/null +++ b/tags/cli-api/page/3/index.html @@ -0,0 +1,24 @@ + + + + + +27 posts tagged with "cli-api" | Cardano Development Updates + + + + + + + + + + + + +
    +

    27 posts tagged with "cli-api"

    View All Tags

    · 2 min read
    Carlos LopezDeLara

    2023-06-07 - 2023-06-20

    High level summary

    • Completed cardano-cli migration to input-output-hk/cardano-cli
    • cardano-cli ping now uses cardano-ping-0.2.0.5
    • New queries on API:
      • queryCurrentEpochState
      • queryDebugLedgerState
      • queryGenesisParameters
      • queryPoolDistribution
      • queryPoolState
      • queryProtocolParameters
      • queryProtocolParametersUpdate
      • queryProtocolState
      • queryStakeAddresses
      • queryStakeDistribution
      • queryStakePoolParameters
      • queryStakeSnapshot
    • Deprecate:
      • queryPparams
    • Export query API as functions
      • genFeatureValueInEra
      • featureInShelleyBasedEra
      • isFeatureValue
      • valueOrDefault
      • asFeatureValue
      • asFeatureValueInShelleyBasedEra
      • queryEpoch
      • requireShelleyBasedEra
    • Restructure cardano-testnet (WIP)

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    docs

    CI & project maintenance

    · One min read
    Jordan Millar

    2023-05-24 - 2023-06-06

    High level summary

    • The last sprint focused on removing cardano-cli and cardano-api from the cardano-node repository. We have successfully moved cardano-api to its own repository and will do the same for cardano-cli after the 8.1 node is released.
    • We provided assitance where needed in the release
    • An integration repository https://github.com/input-output-hk/fusion-flamingo was created to enable my team to more easily work on cardano-cli and cardano-api

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 2 min read
    Jordan Millar

    2023-05-05 - 2023-05-23

    High level summary

    • Golden tests for cardano-cli command help output were added.
    • Documentation was updated with new libsodium installation instructions.
    • There were several updates for the cardano-cli:
      • Deletion of the deprecated shelley command group.
      • Addition of golden tests for CLI help.
      • An improvement to avoid bare IO in tests, allowing better error reporting in failed tests.
      • Generation of UTCTime test values without leap seconds (avoids erroneous test failures)
      • Support for signing transactions with GenesisDelegateSigningKey_ed25519_bip32.
    • The cardano-api underwent multiple refinements:
      • Implementing deposit handling when balancing transactions (necessary for Conway)
      • Cleaning up socket file path code.
    • Several changes were made to the cardano-testnet:
      • Adding golden tests for cardano-testnet help.
      • Removing all hardcoded yaml files in cardano-testnet
      • Improving cardano-testnet help output.
      • Parameterizing default yaml configuration value, allowing for easier hardforking to the era of choice.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · One min read
    Jordan Millar

    · 2 min read
    Jordan Millar

    2023-04-05 - 2023-04-19

    High level summary

    • Introduce new governance commands create, answer and verify. This allows us to have onchain polls.
    • Begin making changes in cardano-api to accomodate for CIP-1694
    • Rename TestEnableDevelopmentHardForkEras to ExperimentalHardForksEnabled and TestEnableDevelopmentNetworkProtocols to ExperimentalProtocolsEnabled
    • Various bug fixes and improvements

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    + + + + \ No newline at end of file diff --git a/tags/cli-api/page/4/index.html b/tags/cli-api/page/4/index.html new file mode 100644 index 00000000000..133b84b898a --- /dev/null +++ b/tags/cli-api/page/4/index.html @@ -0,0 +1,24 @@ + + + + + +27 posts tagged with "cli-api" | Cardano Development Updates + + + + + + + + + + + + +
    +

    27 posts tagged with "cli-api"

    View All Tags

    · One min read
    Jordan Millar

    2023-03-22 - 2023-04-05

    High level summary

    • Added new cardano-cli ping command which allows users to ping remote cardano-nodes.
    • The transaction build command now can automatically balance multiassets
    • New combinators for constructing transaction bodies. This allows us to construct transaction bodies in a composable manner.

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · One min read
    Jordan Millar

    · 2 min read
    Jordan Millar

    2023-02-22 - 2023-03-07

    High level summary

    General bug fixes

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    Documentation

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 2 min read
    Jordan Millar

    · 2 min read
    Jordan Millar

    2023-01-25 - 2023-02-07

    High level summary

    General clean up (error message improvement) and focus on CI maintenance. Multiple pools now supported in the cardano-cli query stake-snapshot command.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    + + + + \ No newline at end of file diff --git a/tags/cli-api/page/5/index.html b/tags/cli-api/page/5/index.html new file mode 100644 index 00000000000..9b7c531af03 --- /dev/null +++ b/tags/cli-api/page/5/index.html @@ -0,0 +1,24 @@ + + + + + +27 posts tagged with "cli-api" | Cardano Development Updates + + + + + + + + + + + + +
    +

    27 posts tagged with "cli-api"

    View All Tags

    · 2 min read
    Jordan Millar

    2022-12-28 - 2023-01-10

    High level summary

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 2 min read
    Jordan Millar

    2022-12-14 - 2022-12-27

    High level summary

    PRs merged in this sprint focused on clean up and resolving existing issues. The majority of the time during this sprint was spent on the In Progress PRs which have dependencies on consensus. This has been since rectified i.e cardano-node dependencies have been bumped.

    Completed

    docs

    CI & project maintenance

    Developer experience

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    CI & project mainteance

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    · 2 min read
    Jordan Millar

    · One min read
    Jordan Millar

    · 2 min read
    Jordan Millar

    2022-11-02 - 2022-11-15

    High level summary

    • Documentation improvments
    • Merged community contributions
    • Exposing types from cardano-api requested by the community/other teamss
    • Test output has been improved so diagnosing failures is now easier
    • Enabling stale bot to close stale issues and PRs (reduces clutter on the node repo)
    • Refactoring of cardano-testnet making it more useable as a library (ongoing)
    • Release 1.35.4 was merged & released

    Completed

    cardano-cli

    cardano-api

    cardano-node

    cardano-testnet

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    + + + + \ No newline at end of file diff --git a/tags/cli-api/page/6/index.html b/tags/cli-api/page/6/index.html new file mode 100644 index 00000000000..43060fd55c7 --- /dev/null +++ b/tags/cli-api/page/6/index.html @@ -0,0 +1,24 @@ + + + + + +27 posts tagged with "cli-api" | Cardano Development Updates + + + + + + + + + + + + +
    +

    27 posts tagged with "cli-api"

    View All Tags

    · 2 min read
    Jordan Millar

    2022-10-19 - 2022-11-01

    High level summary

    This sprint saw the addition of the long awaited tx-mempool command that allows user to query the local node's mempool for the following information:

    • Ask the node about the current mempool's capacity and sizes
    • Request the next transaction from the mempool's current list
    • Query if a particular transaction exists in the mempool

    Outside of this feature the team has been focused on responding to user requests (e.g exposing functions, types and implementing instances they need) and refactoring cardano-cli/cardano-api. The metric tx_submit_fail_count has been added to the submit api so users can track how many transactions have failed. Other improvements have been made:

    • Documentation improvments
    • Release 1.35.4 was merged & released
    • Exported various types from cardano-api that were requested by community members

    Completed

    cardano-cli

    cardano-api

    cardano-submit-api

    cardano-node

    cardano-testnet

    • None

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    · One min read
    Jordan Millar

    Node-Api-Cli Update

    2022-10-04 - 2022-10-18

    Executive Summary

    The majority of the team's time was spent between getting 1.34.4 ready, addressing various feature requests/issues/bugs that have arisen and refactoring components in the api and cli. The current refactoring is aimed at the long term goal of empowering users to be able to easily build applications similar to cardano-cli.

    Completed

    cardano-cli

    cardano-api

    cardano-node

    In Progress

    cardano-cli

    cardano-api

    cardano-node

    + + + + \ No newline at end of file diff --git a/tags/consensus/index.html b/tags/consensus/index.html new file mode 100644 index 00000000000..80adea95fc1 --- /dev/null +++ b/tags/consensus/index.html @@ -0,0 +1,36 @@ + + + + + +32 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    32 posts tagged with "consensus"

    View All Tags

    · One min read
    Damian Nadales

    High level summary

    The Consensus team implemented and tested a patch that does not propagate future headers. +It is under review, and we expect it can be released in the next Cardano node version. +On the UTxO-HD front, we finished prototyping the LedgerDB and BackingStore redesign, which is required for the LSM-tree integration and might help us implement a more resource efficient in-memory backend. +With this prototype finished we can start integrating the rest of the code. +We investigated the unexpected performance degradation observed when acquiring the block context. +We also released Cardano node 8.7.0 and moved tree-diff outside cardano-ledger libraries.

    · 2 min read
    Damian Nadales

    High level summary

    Over the last two weeks, we managed to run a UTxO-HD capable node in legacy mode, which maintains the baseline memory usage while keeping all the ledger state in memory (as the current node does). +This legacy mode could provide an alternative for releasing a UTxO-HD capable node where people can choose whether to store the large part of the UTxO set on disk or not. +However, legacy mode involves code duplication, requires several weeks of work before it is production ready (more integration and testing). Moreover, we will not release UTxO-HD before Conway to avoid the risk of delaying the latter. +On the other hand, to integrate the LSM-tree backend for UTxO-HD we need to redesign the Consensus storage layer, and this new design might enable us to implement an alternative in-memory backing store that will have a very similar performance and resource requirements as the current Cardano node. +Therefore, during the coming months we will focus our efforts on the redesign of the storage layer and the LSM-tree backend.

    On the Genesis front, we reviewed the peer simulator for Genesis tests, which was implemented by Tweag and was signed-off by the Consensus team.

    We also continued our work on improving the handling of blocks from the future. We presented possible approaches to handling blocks from the future in the Chief Scientist Meeting at IOG, which was very well-received. The discussion with the IOG scientists touched upon the relationship of this approach to Ouroboros Chronos.

    Javier Sagredo continues his cycle as release engineer, and he is working on version 8.7 of Cardano node.

    · One min read
    Damian Nadales

    High level summary

    This week the Consensus team made progress on two fronts: the question of survivable eclipse duration, which is part of our work supporting Genesis delivery, and how to improve the handling of blocks from the future. +Regarding the UTxO-HD branch, we managed to run a node with legacy blocks, which is syncing with mainnet, up to including Alonzo. +We also investigated a regression in mempool snapshotting, which was ultimately solved by a Ledger update, and will be fixed in the upcoming Node 8.6 release.

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks the Consensus team received additional benchmark results for the UTxO-HD feature that show the resource usage for the in-memory backend is not satisfactory for a mainnet release, and we need to wait on the implementation of a new infrastructure to benchmark the LMDB backend (not likely to happen before next year). While we wait on this, we are evaluating the feasibility of making the UTxO-HD feature switchable, which will enable us to release it as an experimental feature. On the Genesis front we produced the first draft for a Survivable Eclipse Duration Model. We released version 8.5.0 of Cardano node, resumed work on subpar handling of blocks from the future, and improved our tracing system to assist problem troubleshooting in the node.

    UTxO-HD

    • The Plutus workload benchmark for the in-memory backend showed no regressions for the metrics of interest, but it does show an increase in resource usage.
    • We got additional ad-hoc measurements on memory UTxO-HD consumption. The memory usage of the in-memory backend is not satisfactory for a release. The memory usage of the LMDB backend is considerably lower, but we need to see how much lower we can bring it by running a node whose memory is constrained to 8GB.
    • We resumed work on an alternative solution that will make the UTxO-HD switchable. This will enable us to keep the baseline performance by totally disabling UTxO-HD, while allowing users to experiment with the feature if they wish to do so.

    Genesis

    • We produced the first draft for a Survivable Eclipse Duration Model (422).

    Support

    • Esgen finished his cycle as release engineer. Node 8.5.0 has been released.
    • We resumed work on the subpar handling of block from the future (4251).
    • We prepared the integration of new tracing events for the next node release. These tracing events will help debugging potential issues in the node (such as the previously mentioned issue).

    · 2 min read
    Damian Nadales

    High level summary

    The value-only workload benchmarks showed that the mempool forging regression observed in the UTxO-HD branch was fixed by the latest patch. In spite of the higher resource demands, for the metrics of interest (forging, peer-propagation, end-to-end propagation) we see no regression when using the UTxO-HD version of Cardano node, with the in-memory backend.

    On the Genesis front the Researchers continue reviewing different aspects of the design, in particular the argument that the Genesis rule will select the Cardano historical chain. +We also merged a fix for the Babbage to Conway transition, and released a new version of Consensus.

    Genesis

    • We elicited review from the Researchers on a final draft of the argument that the Genesis rule will select the Cardano historical chain (392).

    Support

    • We merged a minimal patch that fixes parameter update bug during the Babbage to Conway transition (366).
    • We enabled richer tracers in cardano-node that can be useful in future debugging (384).
    • Esgen continues with his release engineer activities, and created a new Consensus release.

    Fostering collaboration

    • We merged a new section into our documentation that explains the existing hard-fork combinator (HFC) interface and its complexities, which are relate do why the Babagge to Conway transition surprised us in this way. This explanation is step one towards improving the HFC interface (369).
    + + + + \ No newline at end of file diff --git a/tags/consensus/page/2/index.html b/tags/consensus/page/2/index.html new file mode 100644 index 00000000000..1a872979f61 --- /dev/null +++ b/tags/consensus/page/2/index.html @@ -0,0 +1,35 @@ + + + + + +32 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    32 posts tagged with "consensus"

    View All Tags

    · 2 min read
    Damian Nadales

    High level summary

    We have a proposed fix for the mempool forging regression observed in the UTxO-HD branch. We need to confirm this by running system level benchmarks. +We are still working on a fall back mechanism for keeping the baseline performance of Cardano node, if the performance of the UTxO-HD is not enough. +On the Genesis front, we confirmed with the researchers that the proposed Genesis design is satisfactory for the historical Cardano chain. +We also have a proposed fix for the wrong protocol version bug, found in the Sanchonet, after transitioning to Conway.

    UTxO-HD

    • We optimized the mempool revalidation process, which in turn ought to solve the regression observed during system-level benchmarks in the in-memory version (349). System level benchmark results are pending.
    • Regarding the workaround to keep the node's baseline performance if that of the in-memory backend turns out not to be enough for our stakeholders (344), we are still expanding the legacy block package such that we could at some point run the node with a legacy Cardano block. There are some loose ends to wrap up before we can begin the first test run.
    • We also brought the UTxO-HD branch up to date with node version 8.4.0.

    Genesis

    • We finished the discussion with the Researchers on how to argue that the proposed Genesis design is satisfactory for the existing historical Cardano chain. +We are now drafting the final self-contained argument. (4157)

    Support

    • We debugged a bad parameter update on the Babbage to Conway transition in the SanchoNet testnet (339). +A superficial patch is within reach and we are in the process of reviewing the PRs related to this fix (340, 354, and 355) +However we are investigating a more principled redesign of the epoch transition logic, which required us to revisit the existing interfaces of the ConsensusProtocol type class and the HardForkBlock combinator (345 and 346). This is important to prevent these kind of errors in the future. This is an overdue step in the process of taking full ownership of the HFC: reconsidering original HFC design decisions for which we now have much more context, a few years later.

    · 3 min read
    Damian Nadales

    High level summary

    We were able to successfully run the system-level benchmarks for the UTxO-HD implementation, for the first time. There was an important regression in block forging performance that will have to be addressed before UTxO-HD is released. We also revisited the implementation of our query processing logic, which was needed to address the performance regression found in the query-by-address command. The preliminary performance results show that now the performance of this query is on-par with the Cardano baseline version, but we need further confirmation. +On the Genesis front, we presented the grinding-aware safety argument for the proposed historical Cardano Genesis windows to the IOG Researchers. +The Consensus release engineer finished his rotation: version 8.3.0-pre of cardano-node is releasing 2023 September 5.

    UTxO-HD

    • We ran the first successful system-level benchmarks for UTxO-HD (see #203) using the in-memory backend.
      • We observed a factor 12 regression in the forging performance, which we will have to address. There are strong indications that the regression is due to the backing store accesses that take place when taking a mempool snapshot.
      • After the mempool regression is fixed the benchmarks need to be ran again.
      • System-level UTxO-HD benchmarks with the LMDB are still pending.
    • UTxO-HD will eventually be necessary due to the growth of the UTxO set and other ledger state structures that live in memory at the moment. However, we are trying a strategy by which we could preserve the baseline performance of the node, in case SPOs and other node users are not ready to migrate yet (see #344).
    • We implemented a new way of processing queries at the hard-fork block level, which resolves the performance regression observed in GetUTxOByAddress (see this comment). Preliminary results are promising.
    • Regarding the roll out plan, UTxO-HD requires a significant change in the Consensus codebase. Even though we might be able to hide any potential performance impact in the node by keeping all data in memory (#344), the Consensus component was significantly changed, so we might have to postpone releasing this feature to mitigate any risks of conflicting with the implementation of CIP-1694 and release of Conway.

    Tech debt

    • We added tests that Consensus emits valid CBOR (#3099). This helped us detect a couple of serialization bugs. The tests still need to be merged into the main branch (#323).

    Support

    • Nick Frisby finished his release engineer rotation; cardano-node 8.3.0-pre is releasing 2023 September 5.
    • We helped to investigate a protocol version bug in Sanchonet (see #3491).
    • We started to implement the Network interface for bootstrap peer functionality, from which Genesis will benefit as well (see #91.

    · 2 min read
    Damian Nadales

    High level summary

    On the UTxO-HD front we reached another important milestone, where we handed over the implementation for benchmarking and testing. We are working on addressing the first issues that were found during the integration tests. +On the Genesis front we are finalizing the argument that a checkpoint is not necessary for the initial release, including supporting to support said argument. We are also working on the new node release, and several improvements to our code-base.

    UTxO-HD

    • We addressed the issues that came from the benchmarking and testing phase (see #314).
      • We fixed the operational-certificate update exception (#305).

    Tech debt

    • We elaborated an inventory of the symbols used by downstream clients in an effort to clearly define the Consensus API, which will help managing changes and their impact to the downstream clients (see this branch).
    • We extracted the SOP modules to a separate package as part of our effort to reduce the Consensus API surface area (see this branch).
    • We took the first step towards improving how the Cardano hard-fork block is instantiated when running a node (see #275).
    • We decreased the flakiness for our test suite (#284).
    • We incorporated and merged the pull-request on query versioning (#273).
    • We started working on new performance-based regression tests for mempool operations.

    Support

    • Nick Frisby continues with his engineer responsibilities. Notably getting the Consensus release out for node pre-release 8.3. Nick also began integrating it into downstream branches (cardano{-api,-cli,-node}). The Node team has now taken over, since Nick had progressed up to the point where they needed to start making new design decisions. Related PRs:

    · 2 min read
    Damian Nadales

    High level summary

    This week the Consensus team worked on integrating the latest node release into the UTxO HD branch. Our ad-hoc benchmarks in which we sync a node from scratch showed that the LMDB backend uses around 8GB of memory. We also released new versions of fs-sim and fs-api, and released strict-checked-vars.

    UTxO-HD

    • Rebased UTxO-HD on top of node 8.2 (issue)
    • Address new Maybe translations for UTxOs in Conway 1.6. (PR).
    • Performed ad-hoc benchmarking syncs with both implementations. The LMDB backend uses around 8GB of memory.
    • Fixed an infinite loop on the mempool tracing code that was preventing the node from shutting down gracefully.
    • Fixed an infinite loop on the ledger state query for traversing queries that prevented the node from running QueryUTxOByAddress (PR).
    • Measured the speed of QueryUTxOByAddress under different queryBatchSize values. There is a significant performance degradation for these queries when using the UTxO-HD version. Using the mainnet UTxO set at slot 90 million, querying an address took 40 seconds using the in-memory backend and 90 seconds using the LMDB backend, whereas the baseline took 7 seconds. We need to investigate if we can improve this situation or whether an external service that runs alongside the node is a better solution.
    • Refactored and implemented ledgertable-related classes for the general HardforkBlock.

    Genesis

    • Frisby and Esgen continue to engage with the Researchers on grinding against the Genesis design.

    Fostering collaboration

    • Drafted a document explaining versioning of local state queries #273.

    Support

    • Frisby is the release engineer this cycle.
    • Successfully created work-in-progress ouroboros-consensus and cardano-api commits that integrate the 2023 Aug 7 tip of cardano-ledger. This will require a release of ouroboros-consensus, which hasn't happened yet.

    · One min read
    Damian Nadales

    High level summary

    The db-sync team confirmed that the adaptor module the Consensus team provided for UTxO-HD integration, shows no performance degradation. Other clients who wish to integrate with UTxO-HD without using a on-disk storage could use that same approach for now. +We also focused on completing tracing support for UTxO-HD in cardano-node. +Currently we are working on UTxO-HD documentation, both for downstream consumers and for the general public; and generalizing the implementation further.

    The team working on Genesis decided on a Genesis-motivated change of the epoch structure with the researchers, wrote a self-contained description of the statistical model for historical Genesis windows and eclipse durations, and merged two small improvements to the ChainSync client as part of the onboarding efforts for the team that will implement Genesis.

    The Consensus team also investigated an issue on sanchonet (the Conway testnet) manifesting in long syncing pauses; identified a ledger bug which was promptly fixed by the Ledger team.

    Genesis liaising

    Improvements to the ChainSync client:

    + + + + \ No newline at end of file diff --git a/tags/consensus/page/3/index.html b/tags/consensus/page/3/index.html new file mode 100644 index 00000000000..5b061f8821b --- /dev/null +++ b/tags/consensus/page/3/index.html @@ -0,0 +1,27 @@ + + + + + +32 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    32 posts tagged with "consensus"

    View All Tags

    · One min read
    Damian Nadales

    High level summary

    This week the team working on UTxO-HD discovered a space leak in the peer metrics code. This was communicated to the Networking team who has a proposed fix. The ad-hoc benchmarks that the team ran using a local immutable DB server showed good memory and time performance. We still have to check the performance on a memory constrained machine.

    The team working on the Genesis design started onboarding the team of engineers that will implement the new Genesis protocol. This team is also finalizing the statistical model for historical Genesis feasibility.

    On the support front, the team drafted an information exchange requirement (IER) for the Networking team to safely and efficiently control peer load.

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks the team working on the Genesis implementation continued to engage with the researchers, which resulted in various simplifications of the correctness argument for the historical Genesis window. They also decided on an approach for a syncing node to decide that it is (no longer) caught up. This functionality was requested by the networking team.

    The team working on the UTxO-HD implementation ran ad-hoc benchmarks that showed performance issues, which are being investigated. They also merged several improvements required for the first UTxO-HD release, and added a package for easing integration with other downstream components.

    Regarding our support activities, we integrated the latest Ledger changes into Consensus in preparation for release 8.2 of node.

    Genesis

    • We continued to engage with the researchers on our probabilistic model for historical Genesis window, resulting in various simplifications that make the correctness argument more clear while not being excessively conservative.

    • We decided on an approach of how to implement functionality requested by the Networking team; namely, how a syncing node can safely conclude that it is (no longer) caught up. Certain parameters are still subject to discussion with the researchers, and we have still have to agree on a concrete API for this functionality with the Networking team.

    UTxO-HD

    • We merged the last of the PRs that were part of UTxO-HD improvements for version 0.1: expose UTxO-HD configuration options in the node, refactor ledger tables, and expose a method of computing the UTxO set size.
    • We added a new "legacy" cardano block in a new ouroboros-consensus-cardano-legacy-block package that should ease the transition for some downstream packages to UTxO-HD, like db-sync. This is really only useful for downstream packages that use the parts of consensus that don't involve the storage components, in which case we can largely ignore ledger tables. Ignoring ledger tables could also make functionality like block (re-)application more performant for the legacy Cardano block as compared to the actual (UTxO-HD compatible) Cardano block.
    • We performed ad-hoc benchmarks of the UTxO-HD implementation, observing a regression in sync speed in the LMDB implementation as well as a regression in memory usage on the in-memory implementation. We are investigating this.

    · 2 min read
    Damian Nadales

    High level summary

    The Consensus team had a very productive meeting with IOG Researchers. We now seem to be in alignment in regards to a strong argument that the Byron and TPraos eras do not need to be checkpointed for an MVP. +There is one remaining question (which applies also to the Praos era): how to assess the threat that short forks pose against historical windows that underperformed? We are currently collaborating on that. We also drafted an argument that the updated "Limit on Patience" timeout sufficiently bounds how long the adversary can inflate a victim's overall sync time.

    On the UTxO-HD front, the prototype branch was rebased on top of the latest ouroboros-consensus main branch and integrated on top of cardano-node 8.1.1-pre. As a result, the mempool fairness fix that was released recently is now integrated into UTxO-HD. +We managed to run a node again with UTxO-HD enabled. +We also identified a race condition in the UTxO-HD prototype and fixed it. In addition, we started performing UTxO-HD ad-hoc benchmarks for cardano-node, which uncovered a performance regression on the Network component when using GHC-9.2/9.4. This is being addressed.

    Regarding our support activities, we Released fs-sim-0.2.0.0 and are in the process of preparing the 8.2 release of cardano-node. We also identified and started fixing incorrectly-unevaluated thunks in preparation for enabling CI NoThunks tests.

    · One min read
    Damian Nadales

    High level summary

    During the Past two weeks we drafted an implementation path for concluding that a node is caught up, which will also be used to back Network's ledger-peer selection (see this issue). We also carried a thorough investigation into the exact feasibility of applying the Genesis rule to certain historical parts of the chain.

    On the UTxO-HD front, we are working on improving the ledger tables design and wrapping up the improved DB locking mechanism. We also released packages that are required not only by UTxO-HD but are already used in cardano.

    UTxO-HD

    • We have a plan for making the ledger tables in UTxO-HD more ergonomic by mimicking SOP classes like HPure and HAp . In short, we implement generalised versions of important classes like Applicative and Traversable.

    Support

    • fs-sim-0.1.0.2 and fs-api-0.1.0.2 were released, which makes them now compatible with GHC up to 9.6.
    • ouroboros-consensus-0.7.0.0 was released for cardano-node 8.1, including query serialization fixes for backwards compatibility.

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks we brought further improvements into the Genesis design in collaboration with the IO Research and Networking teams. These improvements concern the Genesis selection rule, candidate rule, and root peers usage. See the [Genesis][#genesis] section for more details.

    Regarding our UTxO-HD prototype, during the past two weeks we put together a pull-request that improves the DB locking mechanism, started porting the mempool fairness improvements from our main branch, and integrated a new open source library (that implements cancellative monoids) that allowed us to simplify our code and get a small performance gain.

    We improved our tooling by releasing an immutable DB server, which can be used for testing and benchmarking purposes, and a db-truncater program, which can be used in disaster recovery and benchmarking scenarios.

    Genesis

    The consensus team working on Genesis:

    • Improved the genesis selection rule as a result of our interaction with IO Research.
    • Studied how the hard-fork combinator handles forecasting at era transitions, and improved our documentation.
    • Determined that the simplest candidate rule we had considered will work for the Genesis window at era transitions, at least for the MVP.
    • Elaborated concrete proposal for the Genesis State Machine.
    • Met with the Networking Team and advised/co-designed how to implement the stop gap usage of public trusted root peers before Genesis is released (it's similar to the Genesis State Machine).

    The team is currently re-analyzing the Limit on Patience, which can be less aggressive now that we've re-introduced the Genesis State Machine.

    + + + + \ No newline at end of file diff --git a/tags/consensus/page/4/index.html b/tags/consensus/page/4/index.html new file mode 100644 index 00000000000..2983c05d03b --- /dev/null +++ b/tags/consensus/page/4/index.html @@ -0,0 +1,105 @@ + + + + + +32 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    32 posts tagged with "consensus"

    View All Tags

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks we made some important progress in the Genesis design. +It seems the BlockFetch logic need not be modified for Genesis, although this +needs to be confirmed. We started a DoS mitigation handbook and updated our +conceptual component diagram to guide the Genesis design. We engaged with the +IOG researchers to work on the Limit on Patience attack vector, work in this +area is still ongoing. We sketched a design to decouple the CPU load of the node +from its responsiveness to the socket. Finally, we discussed with Networking our +approach to lower the performance impact of the BlockFetch decision logic, and +got green light from them.

    We migrated the consensus code to a new +repository, splitting +it from the ouroboros-network repository, and released version 0.6 of +Consensus.

    We also merged the mempool fairness improvement to main branch.

    Another significant enhancement to our documentation was the addition of an +explanation of the hardfork combinator forecast horizon.

    See the sections below for more details.

    Genesis

    We reviewed the BlockFetch design documentation, and added some source-code +comments that emphasize certain properties of the decisions the BlockFetch +logic makes that are helping us confirm that Genesis does not require any +changes to BlockFetch. We are waiting on input from our former system +architect to verify this.

    We migrated and updated the conceptual component diagram in the ouroboros-consensus +repository which helps us situate the Genesis design and argument.

    We engaged with the IOG researchers about the Genesis design. We sketched out a +way to address the concern that the Limit on Patiente (LoP) attack vector duty +cycle is indeed low, but it's still non-trivial to ultimately conclude it's +sufficiently low.

    We also sketched a design to decouple the CPU load of the node from its +responsiveness to the socket, since the LoP is a relatively tight timeout, and +node performance bugs inducing seconds-worth of latency are unfortunately +familiar phenomena.

    Fostering collaboration

    We added an +explanation of +a question that we had to explain many times about the exact behavior of the +hardfork combinator forecast horizon.

    · One min read
    Damian Nadales

    High level summary

    This week the consensus team continued working on the improved DB lock mechanism +for UTxO-HD, and modifications to the mempool benchmarks that this prototype +requires.

    On the Genesis front we validated that the fragment size calculation in +BlockFetch is a major performance sink for ChainSync Jumping. By removing it +we will get performance that is acceptably close to that of the baseline. We +also started investigating a performance fix that does not alter the existing +baseline behavior too much. In addition we reviewed our Genesis attack vector +calculations.

    On the support front we released Consensus 0.4, and we are working on improving +our release process, to support the Cardano-wide efforts in this area. We also +performed an analysis on the number of file descriptors that consensus use. This +information can be used by the node operators to check if the number of file +descriptors they want to support are enough.

    · One min read
    Damian Nadales

    High level summary

    This week the consensus team finished the UTxO-HD prototype refactoring. We are +now working on improving the DB lock mechanism to improve performance. We also +introduced several improvements to the file system abstraction and simulation +layer (fs-sim), which culminated in the release of fs-sim-0.1.0.0 and +fs-api-0.1.0.0 to CHaP.

    On the Genesis front we distributed the updated Genesis design document, +soliciting feedback from Networking Team and IOG Researchers. We also opened up +a PR for the adversarial leader schedule QuickCheck generator, which is being +reviewed.

    On the support front, we got a new Consensus version that can use different +fundamental VRF crypto primitives for Babbage and Conway eras.

    On the tech debt front we fixed an bug in the followers logic, which was +discovered by our QuickCheck property tests.

    · One min read
    Damian Nadales

    High level summary

    This week the consensus team continued working on the refactoring of the UTxO HD +prototype, and design and testing of Genesis. We also extracted the fs-sim +package, which provides a file-system abstraction layer that can be used for +testing and simulation. This makes the Consensus code base smaller, while +providing a package that the community can reuse and contribute to. We also +fixed a failing property test related to iterators. We are also working on +mempool and VRF improvements.

    Low-level details

    · 3 min read
    Damian Nadales

    High level summary

    The Consensus team continued working on refactoring and improving the UTxO-HD +prototype, and introducing improvements to the lmdb related packages. In +particular we identified an opportunity to gain performance by handling locks in +a more optimal way.

    On the Genesis front, we sketched a mitigation for an issue that PNSol and +Researchers caught. We also came op with a road map for not only testing the +Genesis prototypes, but also for enriching the tests we already have.

    Regarding technical debt, next to some minor improvements, we created +component-level micro-benchmarks for adding transactions to the mempool. The +results of these benchmarks will be published in the ouroboros-consensus web +page.

    We also finished moving the Consensus documentation to the ouroboros-consensus +repository, released ouroboros-consensus 0.3.0.0, and reduced the time +GitHub actions take in ouroboros-network.

    Workstreams

    UTxO HD Prototype

    We continued working on refactoring and improving the UTxO-HD prototype. As a +result of the first round of sytem-level benchmarks, we identified an +opportunity to optimise the way we handle locks to improve performance +(#4393).

    Also, we introduced several improvements to the lmdb related packages:

    Genesis

    We sketched out a mitigation of the issue that PNSol and Researchers caught in +the Genesis design.

    We came up with a road map for testing the Genesis prototypes, including early +milestones that are applicable to today's master branch, ie tests that are +useful before Genesis, and that will be nicely enriched when we do add Genesis.

    We developed the aforementioned tests, specifically a QuickCheck generator for +the Honest leader schedule and one as-aggressive-as-possible Adversarial +leader schedule that together satisfy the Praos properties that the Consensus +design takes as invariants.

    We investigated why the improved ChainDB queueing implementation behaves +differently in the baseline compared to the prototype, and we are close to +having a full picture of how the Consensus components interact during bulk sync.

    Technical debt

    We created component-level micro-benchmarks for adding transactions +to the mempool. We plan on extending this to more mempool actions and different +types of blocks. We store the benchmark data to make it available +to the GitHub action that publishes the benchmarks results.

    Other minor improvements include:

    • Removal of Test.Util.Classify in favour of Test.StateMachine.Labelling.
    • Addition of -Wunused-packages to the default ghc-options for Consensus +packages.

    Fostering collaboration

    We finished moving the Consensus documentation from +ouroboros-network to ouroboros-consensus, in preparation for +migrating the code to the latter repository.

    Support

    We released ouroboros-consensus 0.3.0.0.

    We reduced the load in the ouroboros-network GitHub actions, +thereby reducing the time CI jobs take.

    + + + + \ No newline at end of file diff --git a/tags/consensus/page/5/index.html b/tags/consensus/page/5/index.html new file mode 100644 index 00000000000..e9df599930d --- /dev/null +++ b/tags/consensus/page/5/index.html @@ -0,0 +1,176 @@ + + + + + +32 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    32 posts tagged with "consensus"

    View All Tags

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks we got the results from the system level benchmarks +for UTxO HD. They showed a substantial performance regression, so we spent some +time analyzing the results. We found out the frequency at which ledger snapshots +were taken was too high, so we requested the benchmarking team a new run with a +more realistic snapshotting policy. We continued refactoring and improving the +prototype, and we released UTxO-HD related packages to CHaP.

    We met with IOG researchers and networking specialists to discuss the Genesis +design, which was well received. We continued working on testing and +benchmarking different Genesis prototypes.

    We are also working on solving a test failure related to iterators. This work +derived in several improvements such as better documentation, a framework for +writing unit (and regression) tests, and the possibility of debugging +QuickCheck counter examples in the REPL.

    Finally, we released ouroboros-consensus 0.2.0.0 and +ouroboros-consensus-cardano 0.3.0.0 to CHaP

    Workstreams

    UTxO HD Prototype

    We got the results of the first system level benchmarks for UTxO HD. They seemed +to indicate a significant regression in performance. After looking into the +benchmark logs we found that the benchmark runs took ledger state snapshots too +often, due to the default snapshotting policy depending on k, and k being so +small in the benchmark runs. Therefore, the next step is to re-run the +benchmarks with a snapshotting policy that more closely resembles the one from +mainnet.

    At the same time, we continued refactoring and cleaning up the prototype.

    Also, we prepared the anti-diff packages (fingertree-rm, diff-containers, +simple-semigroupoids) and the lmdb related packages (cardano-lmdb and +cardano-lmdb-simple) to CHaP.

    Genesis

    The Genesis design was presented to the IOG researchers and Peter Thompson from +NSol. It was well received. They pointed out one blindspot, but we think it'll +be relatively simple to mitigate.

    In parallel, we continued developing test and benchmarks for the Genesis +prototypes. I particular we tested and implemented a potential fix for +increased ChainDB dequeue timings, which partly +behaved as we expected, but still needs further investigation. Also we obtained +new benchmarking data for the prototype.

    Technical debt

    Related to #4183, we developed a DSL for specifying +ChainDB unit tests. This will allow us to better understand the +counter-examples returned by QuickCheck tests, and to write regression +tests for them. Also, we added a module to enable +QuickCheck counter-examples to be run on the REPL, allowing for faster debugging +feedback. Also, we improved the documentation related to followers +(#4372).

    We are also working on a design for optimizing the way we handle blocks from the +future.

    Support

    We released ouroboros-consensus 0.2.0.0 and ouroboros-consensus-cardano +0.3.0.0 to CHaP. Remember that we decided to split the packages related to +Consensus into two bundles, one with the core functionality, Cardano-agnostic +code, and another bundle with instantiations specific to Cardano.

    · 2 min read
    Damian Nadales

    High level summary

    We continue refactoring the UTxO HD prototype while we wait for the system level +benchmarks. We have created a new repository that contains the anti-diff +packages used in this prototype.

    On the Genesis front, we are preparing another meeting with the researchers to +audit the implementation design, and we continued working on basic tests and +simplifications.

    During the past two weeks we also introduced two new tools. One for dumping CBOR +encoded blocks to JSON, and another to serve a local immutable DB.

    Workstreams

    UTxO HD Prototype

    We are in the process of refactoring the UTxO HD prototype, while we wait for +the system level benchmarks to confirm if the performance of the prototype is +satisfactory.

    We also set up a repository for the anti-diff package, which +required us to refactor the code, write documentation, and prepare a release to +CHaP.

    Genesis

    We worked on basic tests for the Limit on Eagerness property of +Genesis. We also introduced further robustness and simplifications in the +Genesis Density governor. Finally, we developed a presentation to engage again +with the researchers on our Genesis implementation design.

    Technical debt

    Fostering collaboration

    We are in the process of polishing the ouroboros-consensus +documentation site, which we will use a the entry point for Consensus related +documentation. The first version will not be complete, but we plan on +systematically improving it.

    Support

    We added a tool to ouroboros-consensus-cardano-tools which allows +to dump the Chain DB blocks or any given CBOR encoded blocks as JSON.

    We also added another tool that serves an existing immutable DB via +BlockFetch and ChainSync. This tool can help in assisting our local benchmarking +efforts (for instance Genesis' ChainSync jumping prototype).

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks, the consensus team finished the testing activities +around the UTxO-HD prototype. This is a very important milestone which will +enable us to run system-level tests and benchmarks, as well as start refactoring +and cleaning the prototype. Regarding our Genesis workstream, we elaborated a +roadmap that gives an indication of the remaining work. We also continued our +work on benchmarking chain-sync-jumping. We also continued working on improving +the way we handle blocks from the future, and advancing the integration of the +new VRF and KES crypto.

    Workstreams

    UTxO HD Prototype

    As the prototype is nearing its completion, it was important to have enough +confidence that we will be able to move additional parts of the ledger state +onto disk. We worked together with the Ledger team to elaborate a +sketch on how the UTxO-HD design would accommodate the migration of +additional data from memory to disk. This gave us enough confidence that the +current architecture will be extensible in the future.

    On the testing front, we added property-based tests for the UTxO-HD +type classes.

    We also enabled disabled components, and addressed several +technical debt issues:

    • Implement splitSized anti-diff split (#4269), and integrate it +into consensus (#4273).
    • Renaming of peekVal to peekMDBVal (#7).

    We ran ad-hoc benchmarks for syncing a chain from scratch and replaying. We +found a race condition in the LMDB backing store, which we fixed. +After the fix we were able to successfully run these benchmarks. The results +were published by this pull request.

    We used our db-analyser tool to benchmark the cost of reading keys and +flushing values to disk. The following plot shows the duration of these disk +operation in relation to the main ledger operations, where we can see that the +cost of the former are comparatively low. The spike at the beginning of the +graph is when, at the start of the Shelley era, the entire UTxO set is flushed +to disk.

    UTxO-HD read and flush benchmarks

    After months of hard work adding tests for the prototype, we are ready to run +end-to-end tests on the node, and system level benchmarks. This signals a very +important milestone for the UTxO-HD workstream 🎉.

    Genesis

    We elaborated a high-level decomposition of the remaining +work for Genesis. We also continued benchmarking the chain-sync-jumping +happy-path.

    Technical debt

    We continued working on improving the way we handle blocks from the future.

    Support

    We completed the mapping of Crypto to HeaderCrypto and body Crypto. +HeaderCrypto is moved to cardano-protocol-tpraos. We created a draft pull +request to facilitate compiling consensus.

    · 3 min read
    Damian Nadales

    High level summary

    The consensus team is resuming its activities after the Christmas break. During +these weeks we focused on cleaning and benchmarking the UTxO-HD prototype, and +discussing with the Ledger team the changes that might be required for the next +iterations. The pull request that adds the Conway era is waiting for a second +review round and we hope to merge it soon. On the technical debt side we are +looking into a property-test failure found in the iterators. We are +investigating if this is an error in the model or in the implementation. We also +improved the documentation of our testing code.

    Workstreams

    UTxO HD Prototype

    We worked with the Ledger team to start preparing the next versions of UTxO-HD. +The Ledger team is concerned that for the remaining maps we might need the full +ledger state on epoch boundaries. Since the main consumer of the ledger rules is +Consensus, the code that requires access to a full state could be moved from the +ledger to some Ledger-Consensus bridge. Eg. the traversal of rewards could take +place in such bridge, instead of querying the ledger for the values that are +required in the epoch-transition computations.

    We relocated some UTxO-HD definitions, in preparation for merging +the prototype into master.

    We also completed updated local benchmarks comparing the replay time and memory +consumption of:

    • the baseline node (f2fc76ef45647275c98634da1718290b976ff364)
    • the UTxO-HD node with the in-memory backend
    • the UTxO-HD node with the LMDB backend

    The following plot shows the results: we can see that the LMDB node barely +reaches 8GB of memory, but it takes 1.78 times longer to replay the chain. The +in-memory backend is about 30 minutes faster, but still slower than the baseline +version. We are aware of this phenomenon and it is inherent to the problem of +maintaining sequences of differences of the last k ledger states that allows +us to perform rollback and roll-forward. We are in the process of measuring +syncing from scratch times.

    We also added StaticEither accessors that helped us to simplify +the UTxO-HD prototype.

    New Conway era

    We incorporated the feedback of the pull request, and rebased this +branch on top of master. The PR is pending a second review round and we hope +to merge this soon.

    Technical debt

    We are investigating a property-testing failure involving +iterators. Solving this requires understanding the expected behavior of +iterators in the counterexample found by QuickCheck to determine if the error +is in the model or in the implementation.

    Fostering collaboration

    We moved the contents of docs/Testing.md closer to the code, so that the +explanations about the tests are easier to find in the relevant modules, and the +documentation is easier to keep up to date.

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks, the Consensus team finalized the QSM tests for the +backing store and Mempool on the UTxO-HD branch with important discoveries +regarding parallel QSM testing. We also worked with the Ledger team to envisage +the modifications that are required in Ledger and Consensus to accommodate the +changes in the crypto VRF and KES. The db-analyser now supports bechmarking +the ledger operations, which will allow us to identify, debug, and profile +potential performance problems. We drafted a document that defines how to manage +the versions of Consensus-related packages. The top level documentation of +ouroboros-network now features a description of the consensus components and +provides a hyperlinked map to the modules documentation.

    Workstreams

    UTxO HD prototype

    Whereas we had passing sequential state-machine tests for the mempool, the +parallel case proved to be more challenging than we thought. The operation of +adding a list of transactions to the mempool is not atomic and, as a result, +when adding a list of transactions, transactions from other processes can be +added in between. The mempool implementation handles this correctly, however +this required us to redesign the parallel model we had to take +the lack of atomicity into account.

    Backing store property tests

    We finished refactoring the backing store property tests. The second review +round is ongoing.

    LSM tree implementation

    We are working on benchmarking (in terms of time and number of IO operations) +fetching/looking up data from disk.

    Genesis

    We worked on the design of a mechanism to prevent a DoS attack on our Genesis +design related to rollbacks. This was arguably the biggest outstanding question.

    During the discussions around Genesis, we noticed a design boundary that nicely +delineates a fundamental component. We almost have a full Haskell prototype of +it. It will be very nicely self-contained, perhaps even usable in the ultimate +implementation!

    New VRF and KES crypto integration

    We collaborated with the Ledger team on preparing the ledger state and crypto +types to avoid huge allocation on the epoch boundary when changing aspects of +the crypto that will only manifest in headers, not in the ledger states.

    Technical debt

    We merged the pull-request that adds a support to db-analyser for +benchmarking ledger operations. This will allow us to identify, debug, and +profile potential performance problems. The benchmark focus on the main 5 ledger +operations that are involved in chain syncing, block forging, and block +validation, namely:

    1. Forecast.
    2. Header tick.
    3. Header application.
    4. Block tick.
    5. Block application.

    The following figure shows a plot of the benchmarking results for the first 65 +million blocks (approximately) of the Cardano chain. The thin yellow lines under +the x-axis show the epoch boundaries, whereas the thick yellow lines correspond +to the era transitions.

    As we can see in this figure, era and epoch boundaries require more computation +time. The ledger team are aware of this problem, and we are working to improve +this situation.

    Fostering collaboration

    We drafted a document motivating and defining how Consensus (and +possibly other core teams) will/should manage our package versions. This +pull-request garnered many great discussions from our team members and other +teams too: Sebastian Nagel, Arnaud Bailly, Michael Peyton-Jones, Ziyang Liu, et +al. We want to thank you all for your input, and we found this discussion very +enlightening!

    We merged the pull request that adds an overview of consensus to +the top level +documentation of +ouroboros-network. This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    + + + + \ No newline at end of file diff --git a/tags/consensus/page/6/index.html b/tags/consensus/page/6/index.html new file mode 100644 index 00000000000..5d1a6d24257 --- /dev/null +++ b/tags/consensus/page/6/index.html @@ -0,0 +1,234 @@ + + + + + +32 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    32 posts tagged with "consensus"

    View All Tags

    · 3 min read
    Damian Nadales

    High level summary

    During the past two weeks, the consensus team merged improvements to the monadic +cursor API that was needed to implement LMDB range reads, which is in turn +required for the implementation of the UTxO HD feature. We added tables to +several tests in for the UTxO HD feature, which increases our confidence in the +correctness of the prototype. The mempool property tests are close to being +completed. Also, we finished the LSM tree tuning algorithm.

    On the Genesis front we started simplifying the BlockFetch logic with +CSJ-specific workloads in mind.

    We are also documenting the Block Diffusion Pipelining feature, and added a +high-level overview of consensus to the top level documentation of +ouroboros-network.

    Workstreams

    UTxO HD prototype

    We merged the implementation of a monadic cursor API (#1)) which was +needed to solve a bug with LMDB range-reads. After this PR was merged, we focused on +bridging the gap between the lmdb-simple interface and consensus by facilitating +using lmdb-simple's cursor API without Serialise constraints (#3).

    We refactored the backing store property tests to use quickcheck-lockstep +(#4081).

    We added tables to the mock ledger in the UTxO-HD feature branch +(#4184). Every test that used to run with SimpleBlocks now uses +tables. This will enable us to exercise the UTxO HD mempool integration by +leveraging the existing mempool property-tests. The new state-machine +property-tests are still needed for testing the parallel behaviour of the +mempool.

    Our work on the mempool state-machine tests revealed the need for improvements +in the quickcheck-state-machine library. Parallel testing assumed that the +state machine did not have access to mutable references. However, the mempool +tests require the use of such mutable references for mocking the ledger +interface. As a result, our parallel tests were failing with rather obscure +messages. @Jasagredo submitted a pull request (#12) that allows for +new mutable references to be created at each run of the state machine.

    Backing store property tests

    LSM tree implementation

    We finished the LSM Tree tuning algorithm. We are currently tidying up the code +and gathering results (i.e., plots and their interpretation).

    CSJ prototype

    We started simplifying the BlockFetch logic with CSJ-specific workloads in mind.

    New VRF and KES crypto integration

    Started working on supporting new version of StandardCrypto which uses compact +KES and batched VRF (#4151).

    Technical debt

    We reviewed the existing state of the Block Diffusion Pipelining document. We +are now working on the "Implementation" section (#4020).

    Fostering collaboration

    We cleared up our understanding of the error dynamics of forecasting +(#4146 and #4174).

    We submitted a pull request that adds an overview of consensus to the top level +documentation of +ouroboros-network (#4197). This overview describes the consensus components and adds a +hyperlinked map to the modules documentation.

    https://github.com/input-output-hk/ouroboros-network/pull/4197

    · 6 min read
    Damian Nadales

    High-level summary

    During the past two weeks, the consensus team started documenting the +implementation of the UTxO HD feature and continued developing tests for it. As +part of our work on UTxO HD, we improved the Haskell support for LMDB. We also +spent time working on the LSM tree prototype, and designed a parameter tuning +algorithm for it. Regarding our work on Genesis, our investigation of the +"plateaus" pointed at the TICKF slowdown on era boundaries as culprit. This +led us to developing a caching strategy that will not only remove the +aforementioned "plateaus", but can help alleviating the growing block production +delay on epoch switch. We also helped reviewing the block forge credential +hotswap feature, which is intended for use in the adoption of P2P.

    We also worked on paying technical debt and fostering collaboration. In +particular, we improved the io-sim framework, which is crucial for testing and +simulating Cardano components. We also removed thunks that appeared on era +translations, and improved our diffusion pipelining feature. We are working on a +presentation for explaining Praos and Genesis.

    High-level status report

    • Finish the UTxO HD prototype: in progress.
      • We added documentation for this feature.
      • We developed the second version of the mempool tests.
      • We fixed benchmarks that were inflating the speedup we observed in the +anti-diff implementation of sequences of differences. Speedups are now in the +range of [3.33, 4.75], which remain significant.
      • We continued improving Haskell LMDB support.
      • We finished implementing a "parameter tuning algorithm" for the LSM tree +prototype. This enables us to run experiments to check the correctness of +the algorithm.
    • Genesis: in progress.
      • Work investigating the "plateaus" in the ChainSync jumping prototype +pointed to the TICKF slowdown on era boundaries as culprit.
    • Tech debt:
      • We improved the capabilities of our io-sim library, which is crucial for +testing and simulating Cardano components.
      • We removed thunks from epoch translations in the ledger.
      • We added Linux CI support for lmdb-simple.
      • We got pending diffusion pipelining improvements merged.
    • Fostering collaboration:
      • We are working on a explanation of Praos and Genesis protocols.
    • Support:
      • Investigation of CSJ "plateaus" led us to developing a caching strategy for +TICKF that will not only remove these "plateaus", but can help alleviating +the growing block production delay on epoch switch.
      • We reviewed the block forge credential hotswapping feature which is intended +for use in the adoption of P2P.

    Workstreams

    Finish the UTxO HD prototype

    We merged PR #4060, which adds a report documenting the UTxO HD +feature, and puts emphasis in explaining how the mempool works in combination +with UTxO HD.

    We opened a draft PR with the second iteration of the property tests for the +mempool (#4076).

    We fixed the Arbitrary instances for keys and values in DiffSeq benchmarks +(#4143). The problem was that we were testing with mostly small +values, which artificially boosted the performance gains we saw on benhcmarks. +Speedups are now in the range of [3.33, 4.75] across the different +configurations.

    Backing store property tests

    We focused on incorporating feedback on the monadic cursor API PR (#1). +This required us to make small tweaks to quickcheck-lockstep to test the new +API. We also updated the backing store property tests to use the new version of +the monadic cursor API.

    LSM tree implementation

    We worked on the LSM tree prototype. In particular: finished implementing a +"parameter tuning algorithm" that adapts the LSM tree design based on factors +like:

    • workload
    • machine specs,
    • and characteristics of the data being stored.

    We are now running experiments to gather results and cross-reference them with +existing experimental results from the LSM tree paper to see if the algorithm is +working correctly.

    Benchmarking the CSJ prototype

    We focused on investigating the "plateaus" in the ChainSync tip, which turned +out to be due to the TICKF bug which we previously were only aware of in the +context of the long forging times near epoch boundaries. For the most drastic +patch by @nfrisby to speed up TICKF, full sync is speeding up by 7%.

    The following plot shows that by caching the TICKF the ChainSync tip and the +VolatileDB tip progress at the same rate.

    The plot below shows the speedup observed by caching the TICKF rule wrt the +baseline.

    Technical debt

    After addressing the PR comments, we merged PR #16, which implements +the MonadCatch instance for STM. This extends the capability of our io-sim +library, which is crucial for testing and simulating Cardano components PR #16 +closed #1461. This new feature was published as version 0.4.0.0 +of io-sim.

    We continued with our work fixing the NoThunk errors required for enabling +nightly tests, with the help of TVarInvariant checks in strict-stm and +nothunks libraries. We proposed fixes in cardano-ledger that took care of +thunks that appeared in era translations (#3143). The fixes will be +integrated back into consensus when cardano-ledger approves and publish the +changes introduced in #3143.

    We added CI support for lmdb-simple (#2). We currently test the build on +a Linux environment only.

    We got pending diffusion pipelining PRs (#3857, #3860, +#3856) merged, after rebasing and addressing feedback.

    Fostering collaboration

    @nfrisby finished a visualisation tool and outlined scripts for the Praos and +Genesis explanation presentations. The idea is to produce a video that gives an +overview of these protocols.

    Support

    We started working on caching the computation of the TICKF rule +(#4054), since this was blocking our benchmarking work for +Genesis. In addition, this issue has the Cardano community quite +concerned, so we are hoping the work done in caching the +computation of the TICKF rule can help alleviating the growing block +production delay on epoch switch.

    We reviewed the block forge credential hotswapping PR #3800 from the +networking team, which is intended for use in the adoption of P2P.

    · 4 min read
    Damian Nadales

    High-level summary

    During the past two weeks, the consensus team continued its work on testing the +UTxO HD prototype. We completed the era-transition and backing store tests, and +the mempool tests are advancing at a steady pace. Regarding our work in the +Genesis design, we continued our collaboration with the research and networking +teams, and we continue investigating strategies for making the chain-sync +jumping prototype faster.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We worked on state-machine tests for the mempool, and spotted potential bugs +in the implementation. Investigation is ongoing.
      • We have a set of property tests for the backing store. We still need to +incorporate the improvements to the LMDB cursor API that these tests +made possible.
      • We merged the era-transition tests PR.
    • Genesis: on track.
      • Design work around Genesis continues in collaboration with researchers and +the networking team.
      • We continued trying to improve the performance of the chain-sync jumping +prototype. We gained additional insight on which parameters to tweak next. +In spite of the baseline still being faster, the current prototype already +achieves a significant speedup when compared to the naive approach of simply +running full chain-sync with all peers.
    • Tech debt: on track.
      • We clarified a common source of confusion around VRF tie-breaking and +cross-era chain selection.

    Workstreams

    Finish the UTxO HD prototype

    We continued working on property-tests for the UTxO HD prototype. In particular +we merged the era-transition tests +PR.

    Backing store property tests

    The backing store property tests +PR has been +reviewed. The next steps are:

    • Improve error handling and command generation.
    • Add coverage testing to check that we are not failing to cover interesting +test cases.

    The monadic cursor API +went through its first review round. The API is in a relatively stable state. +This PR also unifies the cborg and serialise-based interfaces to LMDB +operations. The next steps are:

    • Write +quickcheck-dynamic +state-machine tests for this API.
    • Adapt the changes in the serialisation interface in the backing store property +tests. This will involve adding boilerplate code in consensus to make up for +the removal of the cborg-based interface.

    LSM tree implementation

    We worked on the LSM tree +prototype. In +particular, we focused on tuning the LSM tree design to the different workloads +that consensus has (eg syncing, normal node operation, etc).

    Benchmarking the CSJ prototype

    Work on improving the chain-sync jumping performance is ongoing. In particular +we compared the performance of different jump intervals, which, somewhat +surprisingly, do not make a significant difference. In particular, we are seeing +periodic "plateaus" where the chain-sync tip does not progress, but they are +much longer for the prototype. Our hypothesis is that this seem to be due to a +combination of the garbage collector (GC) pauses, and the actual time it takes +the non-dynamo chain-sync peers to jump to the tip of the slot of the dynamo +fragment.

    In the coming weeks we will try to shorten these plateaus via a combination of +tweaking GC options and less synchronisation in the CSJ governor.

    The following plot shows the performance of the chain-sync jumping prototype +using different jumping intervals. It compares the syncing progress by plotting +the slots of adopted blocks against time. The baseline is still faster, however +it is worth noting that the current prototype already achieves a significant +speedup when compared to the naive approach of simply running full chain-sync +with all peers.

    The second plot shows the syncing progress sliced to a chosen ~5min interval, +and includes, in addition to the slots of adopted blocks, the slots of the tip +of the ChainSync fragment. This allows us to see how far ahead of the selected +tip the CS dynamo is, i.e. how much room we have for BlockFetch not to get +stalled. It shows periodic behaviour (due to the forecasting limit), and shows +that the CS fragment tip is not progressing for significant periods +("plateaus").

    Technical debt

    We clarified a +common source of confusion around VRF tie-breaking and cross-era chain +selection. This PR involved correcting potentially misleading names of +VRF-related functions, and providing context for a particular VRF value is +used for tie-breaking.

    · 4 min read
    Damian Nadales

    High-level summary

    During the past two weeks, the consensus team worked on adding property test for +different aspects of the UTxO HD prototype: era transitions, mempool, and +backing store. Thanks to these tests we were able to uncover a bug in the +prototype. On the Genesis front, we benchmarked a different version of the +ChainSync jumping prototype to try to improve its performance, but this did not +result in any noticeable speedup.

    High-level status report

    • Finish the UTxO HD prototype: on track.
      • We focused on increasing test coverage for the UTxO-HD prototype:
        • We started implementing Cadano-eras transition property-tests.
        • We started implementing state-machine property-tests for the mempool.
        • We merged the mempool rewrite.
        • We started working on state-machine tests for the backing store. This +uncovered a bug in the range-read implementation of the LMDB backing +store.
    • Genesis: on track.
      • We benchmarked a version of the Genesis ChainSync Jumping prototype that +spreads out the ChainSync updates over a longer period of time. This did not +result in any noticeable speedup.
      • We investigated the overhead introduced by non-ChainSync components, but no +conclusions could be drawn from the benchmarks we ran.

    Workstreams

    Finish the UTxO HD prototype

    We focused on increasing test coverage for the UTxO HD prototype. We also merged +the mempool +rewrite.

    Era transition property tests

    We started implementing Cardano era transition property +tests, +which are needed for making sure that the ledger tables get updated in the +right way when we move from one era to the next. There are at the moment two +important transitions.

    • Byron to Shelley: where all the UTxO is transferred from in-memory Byron +state (which has no tables) to the ledger tables of the Shelley state.
    • Shelley to Allegra: where the AVVM addresses must be deleted.

    We have tests for the Byron to Shelley transitions. We are working on adding +the remaining ones.

    Mempool state-machine tests

    We started implementing state-machine property tests for the +mempool. +The mempool is currently tested via pure property tests, and use a ledger +state without tables. With the introduction of UTxO HD, testing the concurrent +behavior of the mempool became of crucial importance (eg now we have to +acquire locks to flush the backing store). In addition, we need to test a +ledger state with tables. These needs led to the creation of a new set of +property tests. In particular we aim to run parallel state-machine tests that +exercise the mempool in a way similar to how the node would make use of it.

    Backing store property tests

    We started working on state-machine tests for the backing +store that UTxO +HD uses. The property tests uncovered errors in the range-reads implementation +of the LMDB backing store. To facilitate fixing this bug, we made +changes to the Haskell +LMDB bindings.

    Benchmarking the CSJ prototype

    Prompted by previous benchmarks showing significant improvements in sync time by +using more capabilities, we implemented a way to spread out the ChainSync +updates over a larger period instead of firing them all at the same time. This +didn't result in a noticeable speedup.

    We also benchmarked the prototype with CSJ disabled (such that just the dynamo +peer is running ChainSync, but e.g. BlockFetch still sees all peers) to rule +out/confirm overhead by non-ChainSync (mainly BlockFetch) related components. +This results in era-specific behavior (speed is like the prototype in Byron, but +like the baseline in Shelley). This deserves a closer look in the future.

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    • Red: baseline
    • Green: CSJ prototype, 10 peers, jumps every 3000/f slots, jumps in clumps.
    • Blue: like Green, jumps are spread out.
    • Orange: variant with no jumping, to measure unrelated overhead.

    · 2 min read
    Damian Nadales

    High level summary

    During the past two weeks, the consensus team worked on improving the +performance of the ChainSync jumping logic, which is needed for Genesis. We also +rewrote the implementation of the mempool in the UTxO HD prototype which solved +the issues that prevented us from running system level benchmarks. Also on the +UTxO HD front, we have an improved implementation of the sequence-of-differences +(a crucial piece of UTxO HD), and we also elaborated a test sign-off list for +the UTxO HD feature.

    Executive summary

    • With the latest implementation of ChainSync jumping we are closer to the +baseline performance. In particular, the prototype seems to benefit from the +extra concurrency provided by additional capabilities.
    • We rewrote the implementation of the mempool in the UTxO HD prototype. This +rewrite was required due to performance problems we observed when running the +workbench. +These performance problems prevented us from running system level benchmarks. +The rewrite solved these issues. After the UTxO-HD: mempool +rewrite PR is +merged, we will contact the Benchmarking team so that they run the system +level benchmarks.
    • The implementation of sequences of differences based on anti-diffs was +integrated into the UTxO HD prototype. It is pending +review and +we also need to run replay and syncing benchmarks to confirm that this will +deliver a performance improvement, as observed in our micro-benchmarks.
    • The UTxO HD prototype +inspection +resulted in a list of +tests +needed for consensus to consider the UTxO HD prototype as fully tested.

    Additional information

    Genesis

    Benchmarking setup: 50MBit/s, 50ms latency

    • Red: baseline
    • Green: Current CSJ prototype, 10 peers, jumps every 3000/f slots.

    As ChainSync Jumping involves many concurrent network operations at every jump, +we tried to run the node with 6 instead of the default 2 capabilties.

    • Orange: baseline with 6 capabilities
    • Blue: CSJ prototype with 6 capabilities

    This diagram shows the respective syncing progress, starting at Genesis and +continuing a good part into Shelley (with the dashed line indicating the +Byron-to-Shelley transition).

    Further work includes whether we can tune the prototype to better handle few +capabilities, or to adapt the default number of capabilities (potentially just +while syncing).

    + + + + \ No newline at end of file diff --git a/tags/consensus/page/7/index.html b/tags/consensus/page/7/index.html new file mode 100644 index 00000000000..426aca4a814 --- /dev/null +++ b/tags/consensus/page/7/index.html @@ -0,0 +1,162 @@ + + + + + +32 posts tagged with "consensus" | Cardano Development Updates + + + + + + + + + + + + +
    +

    32 posts tagged with "consensus"

    View All Tags

    · 4 min read
    Damian Nadales
    • We proposed a fix for the performance degradation observed when running +distributed multi-node benchmarks in the UTxO HD feature branch. While this +fixed the problems observed when running local benchmarks, it broke the +ThreadNet tests due to concurrency issues. Therefore, we think it is wise to +start redesigning the UTxO HD mempool integration.
    • We did several rounds of code review on the alternative implementation of +diff-sequences required by the UTxO HD feature based on the idea of +anti-diffs. This alternative implementation is close to being merged, and the +next step is to integrate this to the UTxO HD branch, so that we can run +ad-hoc replaying and syncing from scratch benchmarks and compare these with +the baseline. The micro-benchmarks we elaborated for the alternative +implementation show speedups of up to 4x, so we are optimistic about the +performance of replaying and syncing from scratch benchmarks, however it is +important to notice that due to the nature of UTxO HD we will still be +slower than the baseline.
    • The final draft of the Genesis implementation specification is ready for +review.
    • We implemented a prototype for the happy path of Genesis' ChainSync Jumping +(CSJ). The prototype is slower than the baseline, however it is not the latest +version of the prototype and the jump interval is very small.
    • Work on integrating Conway has stopped since +priorities have changed.
    • We started work on benchmarking epoch-boundaries and epoch overhead +pr-4014. To this end, we made use of a modified version of our +db-analyser tool. We ran the new benchmarking setup using the Cardano +mainnet chain, and we can see that block tick and application take +substantially longer at epoch boundaries, although there are a couple of slots +during an epoch in which these computations take more than normal. We notified +the ledger team about these findings. We will use this modified version of +db-analyser to investigate the epoch overhead.

    Workstreams

    UTxO HD

    • Spent quite some time investigating the root cause of the degradation in +performance observed in the benchmarks. We run the make forge-stress +benchmarks locally in order to debug this behavior.

      • Transaction batching doesn't make a notable difference in the outcome +(considering we are using the in-memory backend).

      • The mempool batching implementation required asynchronous transaction +validation which is a violation of the LocalTxSubmission protocol +contract and therefore if we continued on that route, the impact would +have been quite big.

      • The STM logic we implemented by using a TMVar for the mempool internal +state was buggy and under certain circumstances it seemed to lock. +Reverting the mempool internal state to be stored in a TVar seems to +solve this problem.

      • The results we get after this change look almost identical to the ones +from the baseline.

    • The anti-diff prototype (PR +#3997) has +been reviewed and is close to being merged.

      • A follow-up issue (issue +#4010) +to integrate the anti-diff prototype in the various consensus packages +was created. A first version of the integration exists, and all tests +pass. A next step is to get some indication of the "real" performance gain +by profiling db-analyser (or cardano-node).

    Genesis

    • Final draft of the Genesis implementation specification, now up for review.

    • Local benchmark setup for parameter tuning via the happy path ChainSync +Jumping (CSJ) prototype (Issue 3987).

      • Context: Our Genesis design requires us to check in with a large (~20) +number of servers periodically while syncing. These servers are offered +jump requests via the ChainSync protocol (hence the name), which they can +accept or decline. If a peer declines, the Genesis rule allows us to +determine whether a node actually has a better chain.

      • The "happy path" is when no peer declines a jump. We want this to have +close to no overhead compared to status quo, i.e. syncing without Genesis.

      • We implemented a prototype for this happy path, and are now starting to +test in various configurations (number of peers, latency, bandwidth) to +tune the performance of ChainSync jumping, i.e. how complicated our logic +of choosing when to jump needs to be.

        Example:

      • Simulated connection: 50 MBit/s, 50ms latency

      • Jump interval: 3000 slots (on the low end, could be increased to up to +3k/f)

      • Red: baseline (1.35.3), one peer in topology file

      • Blue: Preliminary version of our prototype, with 10 peers.

        It is slower by about ~30%, but it is not the latest version of the +prototype, and the jump interval is very small, making CSJ more of a +bottleneck.

    Technical debt

    • Fix flakiness in ChainDB QSM tests (PR 3990).

    · 9 min read
    Damian Nadales

    Executive summary

    • We did most of the heavy lifting required to integrate the Conway era.
    • We have property tests for the UTxO HD backing store API implementations. A +possible bug was identified. Work is ongoing to make sure the property-tests +cover all the relevant cases.
    • We implemented and benchmarked the "anti-diff" prototype to speed up the UTxO +HD functionality. Results show a rough speedup of 4x to 5.5x across +several scenarios. Note that: "Data reported by tasty-bench is only of +indicative and comparative significance.". +We are investigating additional performance improvements. The "anti-diff" +prototype and benchmarks are still pending code review.
    • We elaborated a draft specification for the Genesis implementation and +ChainSync jumping optimization.

    Workstreams

    Conway

    • Integration PR of the minimal Conway era (Issue #3963, PR +#3971).
    • Discussions with Ledger revealed possible sources of confusion about which +data should be changed in the Conway era. As a result, a new technical debt +issue was raised, which does not block the integration of the Conway era +(Issue #3976).

    UTxO HD

    • Issue #3954, branch: The functionality of a +backing store, which is the interface to the on-disk part of ledger state in +UTxO-HD, is tested at a high level through the OnDisk tests. However, some +functionalities remain untested, e.g., reads of ranges of keys. As such, we +have implemented quickcheck-state-machine tests that exercise backing stores +directly. The tests are reusable for different backing store implementations +because the tests are implementation-agnostic: Any backing store that conforms +to the backing store interface can be plugged into the tests. Work is still +ongoing to label/monitor the tests, such that we can verify that interesting +cases are being tested. Furthermore, a possible bug has been identified in the +LMDB backing store with respect to range reads, though the bug has not been +resolved yet.

    • Issue #3946, branch, PR #3882: The +"anti-diff" prototype proposes an alternative approach to keeping track of +sequences (more specifically, FingerTrees) of diffs. These diff sequences +are a component of the in-memory parts of the ledger state in UTxO-HD. Since +the consensus code often requires the cumulative diff of a sequence of diffs, +the current implementation "caches" cumulative diffs of each subtree in the +diff sequence. This caching allows relatively fast reconstruction of the total +cumulative diff, but this caching proved to incur a non-negligible cost: when +we manipulate diff sequences through splits and appends, we force re-computing +a logarithmic number of caches. This is problematic, since we often split and +append in consensus: we split when we flush diffs to a backing store or when +we roll back blocks, and we append when pushing blocks. The new approach +should reduce the overhead of this caching.

      We implemented micro-benchmarks for the "anti-diff" prototype: we +first generate a sequence of commands (Forward, Push, Flush, or +Rollback) through a simulation, after which we measure the performance of +applying the commands to a diff sequence. In this context, Forward means +forwarding of values through a diff, whereas Rollback means switching to +a different fork by rolling back diffs/blocks and pushing new ones. +Moreover, we compare the performance for the two implementations: the +"legacy" approach, and the anti-diff approach.

      Some preliminary results were positive, but we needed to revisit the +benchmark's configuration to obtain more definitive results. After a +discussion with @dcoutts and the consensus team about this configuration +(e.g., number of commands generated, choice of the security parameter k), +the benchmarks should now be closer to the realistic setting. The following +configuration specifies the default configuration that is used in the +benchmarking code:

      • Number of commands generated: 10_000
      • Security parameter k: 2160
      • Number of initial backing values: 100
      • Number of key-value pairs deleted by a push: 50
      • Number of key-value pairs inserted by a push: 50
      • Number of key-value pairs forwarded by a forward: 50
      • Probability of a large (in the range [1000, 2000]) rollback: 0.05
      • Probability of a small (in the range [1, 10]) rollback: 0.95
      • Order of commands:
        • An equal number of forward and pushes.
        • 1 flush every 10 pushes.
        • 1 rollback every 100 pushes

      Moreover, we run four benchmark scenarios:

      • Default configuration
      • Without rollbacks
      • With only small rollbacks
      • Without rollbacks, larger flushes (1 flush every 100 pushes)

      How to read results

      Note: this section uses documentation from the +tasty-bench package to +explain how to read the results of running our benchmarks.

      Running a benchmark scenario gives us the following (curated) output:

      ...
      AntiDiff: OK (18.27s)
      2.527 s ± 47 ms, 2.1 GB allocated, 544 MB copied, 2.2 GB peak memory, 0.23x
      LegacyDiff: OK (32.73s)
      10.829 s ± 148 ms, 6.8 GB allocated, 2.3 GB copied, 2.2 GB peak memory
      ...

      The output says that the first benchmark, which exercises the anti-diff +prototype, was repeatedly executed for 18.27 seconds (wall-clock time), +its predicted mean CPU time was 2.527 seconds and means of individual +samples do not often diverge from it further than ± 47 milliseconds +(double standard deviation). We also configure the RTS to collect GC +statistics, which enables tasty-bench to estimate and report memory usage. +This data is reported as per RTSStats fields: allocated_bytes, +copied_bytes and max_mem_in_use_bytes. So, the output of the first +benchmark says that a total of 2.1 GB of memory was allocated, that a +total of 544 MB of memory were copied, and that the peak memory in usage +was 2.2 GB. We read the output for the second benchmark in the same way.

      Furthermore, the benchmark compares the mean CPU times for +both the anti-diff and legacy approaches: In this case, the mean CPU time +for the anti-diff approach is ~0.23x the mean CPU time for the legacy +approach. Conversely, the mean CPU time for the legacy approach is +1 / 0.23 ~= 4.35x the mean CPU time for the anti-diff approach. We will +call 0.23x the improvement factor. We will call 4.35x the speedup.

      Note that these improvement factors (and reported results) are subject to +noise, randomness, the specific configuration parameters, and the whims +of statistics. Data reported by tasty-bench is only of indicative and +comparative significance.

      Results

      For each of the 4 scenarios, we list the results of running the anti-diff and +legacy approaches 5 times. We run the benchmarks 5 times to get an indication +of whether the results are similar across multiple runs. Furthermore, we +calculate the accompanying ranges (if applicable) of improvement factors and +speedups.

      Note also the decrease in total bytes allocated and total bytes copied for +the anti-diff approach compared to the legacy approach.

      Default configuration

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff2.533 s (0.23x)4.7 ms2.1 GB557 MB2.4 GB
      Run 1: LegacyDiff10.792 s162 ms6.8 GB2.3 GB2.4 GB
      Run 2: AntiDiff2.508 s (0.23x)245 ms2.1 GB515 MB2.2 GB
      Run 2: LegacyDiff10.850 s30 ms6.9 GB2.3 GB2.2 GB
      Run 3: AntiDiff2.562 s (0.23x)5.0 ms2.1 GB552 MB2.2 GB
      Run 3: LegacyDiff10.993 s149 ms6.9 GB2.3 GB2.2 GB
      Run 4: AntiDiff2.168 s (0.22x)5.3 ms1.8 GB434 MB2.0 GB
      Run 4: LegacyDiff9.976 s39 ms6.3 GB2.0 GB2.0 GB
      Run 5: AntiDiff2.527 s (0.23x)47 ms2.1 GB544 MB2.2 GB
      Run 5: LegacyDiff10.829 s148 ms6.8 GB2.3 GB2.2 GB
      • Improvement factor: [0.22, 0.23]
      • Speedup : [1 / 0.23 ~= 4.35, 1 / 0.22 ~= 4.55]

      No rollbacks

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.638 s (0.19x)36 ms1.4 GB181 MB2.4 GB
      Run 1: LegacyDiff8.656 s207 ms5.7 GB1.5 GB2.4 GB
      Run 2: AntiDiff1.638 s (0.19x)75 ms1.4 GB181 MB2.2 GB
      Run 2: LegacyDiff8.654 s322 ms5.7 GB1.5 GB2.2 GB
      Run 3: AntiDiff1.663 s (0.19x)74 ms1.4 GB181 MB2.2 GB
      Run 3: LegacyDiff8.799 s216 ms5.7 GB1.5 GB2.2 GB
      Run 4: AntiDiff1.645 s (0.19x)51 ms1.4 GB181 MB2.0 GB
      Run 4: LegacyDiff8.732 s261 ms5.7 GB1.5 GB2.0 GB
      Run 5: AntiDiff1.639 s (0.19x)19 ms1.4 GB181 MB2.2 GB
      Run 5: LegacyDiff8.653 s234 ms5.7 GB1.5 GB2.2 GB
      • Improvement factor: 0.19
      • Speedup : 1 / 0.19 ~= 5.25

    Only small rollbacks

    NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
    Run 1: AntiDiff1.833 s (0.18x)36 ms1.5 GB185 MB2.4 GB
    Run 1: LegacyDiff10.362 s867 ms5.8 GB1.6 GB2.4 GB
    Run 2: AntiDiff1.696 s (0.19x)30 ms1.5 GB185 MB2.2 GB
    Run 2: LegacyDiff8.822 s106 ms5.8 GB1.5 GB2.2 GB
    Run 3: AntiDiff1.702 s (0.19x)44 ms1.5 GB186 MB2.2 GB
    Run 3: LegacyDiff8.906 s147 ms5.8 GB1.5 GB2.2 GB
    Run 4: AntiDiff1.701 s (0.19x)47 ms1.5 GB185 MB2.0 GB
    Run 4: LegacyDiff8.949 s197 ms5.8 GB1.5 GB2.0 GB
    Run 5: AntiDiff1.677 s (0.19x)55 ms1.5 GB186 MB2.2 GB
    Run 5: LegacyDiff8.856 s177 ms5.8 GB1.5 GB2.2 GB
    • Improvement factor: [0.18, 0.19]

    • Speedup : [1 / 0.19 ~= 5.25, 1 / 0.18 ~= 5.55]

      No rollbacks, larger flushes (every 100 pushes)

      NameMean CPU time2*Stdev (CPU time)Total bytes allocatedTotal bytes copiedPeak memory
      Run 1: AntiDiff1.643 s (0.25x)21 ms1.5 GB196 MB2.4 GB
      Run 1: LegacyDiff6.591 s351 ms4.0 GB1.4 GB2.4 GB
      Run 2: AntiDiff1.616 s (0.25x)47 ms1.5 GB196 MB2.2 GB
      Run 2: LegacyDiff6.520 s232 ms4.0 GB1.4 GB2.2 GB
      Run 3: AntiDiff1.640 s (0.25x)34 ms1.5 GB196 MB2.2 GB
      Run 3: LegacyDiff6.540 s150 ms4.0 GB1.4 GB2.2 GB
      Run 4: AntiDiff1.635 s (0.25x)76 ms1.5 GB196 MB2.0 GB
      Run 4: LegacyDiff6.589 s131 ms4.0 GB1.4 GB2.0 GB
      Run 5: AntiDiff1.628 s (0.25x)19 ms1.5 GB196 MB2.2 GB
      Run 5: LegacyDiff6.490 s5.9 ms4.0 GB1.4 GB2.2 GB
    • Improvement factor: 0.25

    • Speedup : 1 / 0.25 ~= 4

    Genesis

    • We elaborated a draft of the specification of the Genesis implementation and +the ChainSync Jumping optimization. In particular, this includes a proof +sketch that the latter preserves liveness and safety in all cases (Issue +3964).
      • @nfrisby's main realization during this sprint was that he had been +focusing so far on the case where the selected chain is an extension of +the intersection of our peers' ChainSync candidates.
      • This is the main case, ie an "absorbing" state, but it's not the only +case.
      • The new proof sketch begins by case splitting on that predicate, and +that made the sketch quite a bit easier to follow.
    • We continued working on the "happy path" ChainSync Jumping prototype (Issue +3960).

    Technical debt

    • We started working on the issues required to re-enable nightly CI runs.. +Nightly CI runs have far more lax time constraints, which gives the option to +run significantly more property tests than in our regular CI. To this end, we +merged a PR to easily adapt the number of tests globally (PR +#3947).
    + + + + \ No newline at end of file diff --git a/tags/crypto/index.html b/tags/crypto/index.html new file mode 100644 index 00000000000..38d396781dc --- /dev/null +++ b/tags/crypto/index.html @@ -0,0 +1,33 @@ + + + + + +18 posts tagged with "crypto" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "crypto"

    View All Tags

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Include MuSig2 description in cryptography handbook
    • kes_agent: Finilising test and CI. Working on KES binary

    Low level summary

    Mithril

    • Full Node Verifier merged #939.

    MuSig2

    • Started describing MuSig2 to include it as part of the cryptography handbook

    Sidechains

    • Analysis of Halo2 verifier with the goal of implementing SNARK verifier in Plutus. Implemented ad-hoc IPA verifier. Work progress in this fork.

    KES agent

    • KES agent is ready:
      • CI ready #19
      • Receipt confirmation message #20
      • KES agent binary ready #21
      • Control client implemented #11

    · 4 min read
    Iñigo Querejeta Azurmendi

    Security Issue Report: SECP256k1 bug

    Date Occurred: July 15, 2022 +Severity: Potentially Very High if exploited on Mainnet +Authors: Iñigo Querejeta Azurmendi

    Date of Report: August 17, 2023

    Summary of Issue

    Criticality Level

    Actually low (since the issue was detected prior to deployment) but potentially very high if it had been deployed to mainnet +Context

    New SECP256k1 Plutus bindings were being introduced in order to support interoperability with other major chains, such as Bitcoin and Ethereum. The intention was to deploy these as part of the Vasil hard-fork. The bindings were considered to be a low-security risk since the underlying library functions were well tested and had been deployed on other blockchains. +How was the Issue Detected

    The issue was detected via specific End-to-End tests that had been commissioned. It was (accidentally) triggered on the Cardano Testnet before a fix could be deployed there.

    What Action was Taken

    The Cardano Testnet was permanently halted, and new test environments were deployed (Preview and Pre-Prod). +Fixes were applied to prevent the use of the primitives. +A full security audit was carried out on the bindings. +The rollout of the primitives was postponed to a new hard fork (Valentine)

    Potential Effect

    The potential effect was that an adversary might be able to craft invalid Plutus transactions to crash any node, requiring execution of the Cardano disaster recovery plan to revert to a safe state and bypass the transaction.

    Actual Effect

    • Delay to the Vasil hard-fork
    • Temporary removal of SECP256k1 primitives
    • Additional hard-fork to introduce SECP256k1 primitives

    Ongoing Mitigations Needed, if any

    None

    Responsibility for Mitigations

    Core team

    Detailed description of Incident

    New Plutus secp256k1 cryptographic primitives for Plutus v2 failed to apply the necessary validity checks on the input data, meaning that the primitives could theoretically be used in an unsafe environment. The vulnerability was present in recent node versions (1.35.0 onwards), including ones deployed to Cardano Testnet.

    The problem was not in the deserialization functions of the underlying library (Bitcoin's library) but rather that the Haskell functions that implemented the Plutus builtins were not calling them correctly. In particular, the library functions were designed to take structured data as input. However, the Haskell FFI implementation that was produced for the Plutus builtins allowed a caller to pass in (possibly) unstructured data. There were no checks that these data were structured in the correct way. This issue was detected during End-to-End testing.

    • This is the ECDSA signature verification algorithm that was used. It takes a SECP256k1_pubkey as input. That type is an opaque type with an expected structure: a parsed and valid public key. It was not immediately obvious that structured data needed to be passed to allow the function to be used safely.
    • The same happened with the Schnorr verification function. It takes as input a SECP256k1_xonly_pubkey, which is again an opaque structure that holds a parsed and valid public key.

    The FFI skipped checks over these structured keys and directly passed the raw bytes that were given as arguments. If an adversary were to pass in data that was not properly structured, then it could result in unexpected behavior of the library. This could perhaps translate into an adversary being able to crash the nodes that ran these functions. All nodes in the network could be crashed by a single transaction that would then be executed repeatedly, so stalling the network until the disaster recovery process was initiated.

    The fix was addressed in this PR. It consisted of using the external representation that the deserialization function expects and running the deserialization prior to signature verification. This was audited by security experts.

    Recommendations

    • Check all new Plutus bindings for correct use.
    • Audit all new Plutus built-in bindings.
    • Continue to develop specific End-to-End tests for all new Plutus features.
    • Do not assume that any existing library functions are "safe". Treat all external calls circumspectly.

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: Analysis of Halo2 SNARK verifier to plan a plutus implementation
    • mithril: Full node verifier
    • musig2: Finalised the missing fuzz tests
    • kes_agent: engineer on PTO. Work halted

    Low level summary

    Mithril

    • Work on a mithril flaky test #1105
    • Keep working on Full Node Verifier #939. +Should be merged in the coming week.

    MuSig2

    • Finalised the fuzz tests #43

    Sidechains

    • Analysis of Halo2 verifier. Necessary for a future implementation of a plutus verifier.

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Sidechains: First version of snark-based ATMS
    • mithril: Full node verifier
    • kes_agent: Keep progress, and prepare CIP and CPS
    • CIPs and community: Finishing BLS12-381 CIP and working on a KECCAK CIP

    Low level summary

    kes_agent

    Mithril

    • Final review of the implementation of Full Node Verifier #939. +Included benchmarks and further tests.

    Sidechains

    • Schnorr signature implemented
    • ATMS signature implemented
    • First benchmarks show that for the committe size we expect, we need 2^21 constraints.

    CIPs and community

    • Addressed some review comments in #PR506
    • Worked with the communityt on #PR524 to include Keccak as part of the next Plutus release.

    · One min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: E2E tests for BLS bindings and KES agent
    • Sidechains: Implement ECC chip and Rescue hash primitives for ATMS
    • mithril: Full node verifier

    Low level summary

    cardano-base

    • RawBearer API in ouroboros-network-framework (https://github.com/input-output-hk/ouroboros-network/pull/4395); blocked due to issue with windows' localSnocket. Trying to resolve.
    • Adapting cardano-base for direct memory transfers between mlocked RAM and file descriptors #317.
    • Above, blocked by the simplification of typeclasses #404.
    • Provided e2e test cases to the testing team with aggregated signatures and schnorr signatures for the BLS bindings

    Mithril

    • Implementation of Full Node Verifier #939

    Sidechains

    • ECC chip implemented for JubJub over BLS12-381
    • Rescue chip implemented for hashing.
    • Currently working on Schnorr signature (which uses the above constraints)
    + + + + \ No newline at end of file diff --git a/tags/crypto/page/2/index.html b/tags/crypto/page/2/index.html new file mode 100644 index 00000000000..af4687de58a --- /dev/null +++ b/tags/crypto/page/2/index.html @@ -0,0 +1,24 @@ + + + + + +18 posts tagged with "crypto" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "crypto"

    View All Tags

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: Include final tests for BLS signature. Further adaptations for KES agent.
    • Sidechains: Implement BLS and JubJub using upstream's macros to merge these curves in halo2curves.

    Low level summary

    cardano-base

    Sidechains

    • Opened PR in halo2curves to include BLS12-381 and JubJub, #38
    • Addition constraint over JubJub merged #10

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • cardano-base: New KES structure finally merged. Included additional tests to BLS, and including test vectors created with zkcrypto's library.
    • KES agent: Reaching state of MVP. Rewriting KES agent networking code to use the Snockets abstraction.
    • Sidechains: Started implementing ECC chip of JubJub over BLS12-381.

    Low level summary

    cardano-base

    • #255 finally merged 🎉
    • Additional tests for BLS bindings #384
    • Open PR for including test vectors created with zkscrypto's library, PR#397

    KES agent

    • Introducing the SignKeyWithPeriodKES wrapper type, which bundles a KES key with its corresponding KES period PR#389.
    • Introducing the DirectSerialise API into cardano-base, which allows us to write mlocked memory directly to a file descriptor, without going through intermediate encodings stored on the GHC heap (which is a no-no due to secure forgetting requirements) #317.
    • Figuring out how to generalize the KES, DSIGN, and mlocking code in cardano-base such that it can run in IOSim
    • Rewriting KES agent networking code to use the Snockets abstraction, which gives us a platform-independent sockets layer (i.e., it will also work on Windows), and also allows us to run networked code in IOSim for testing purposes
    • Refactor MonadSodium into MonadMLock PR#388.

    Sidechains

    • Started working on ECC chip for JubJub over BLS (problems still with the multiplication constraint)
    • Use macros used by PSE library to try and merge our fork of halo2curves into PSE's repo

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Started looking into full-node verifier
    • cardano-base: BLS12-381's PR merged. Creating test-vectors for verifying basic pairing properties.
    • KES agent: Blockers overcome. Reaching a first MVP level of the KES-agent.
    • Sidechains: Included BLS12-381 & JubJub to halo2curves
    • MuSig2: Final modifs to C version.

    Low level summary

    Mithril

    • Started designing how a full-node verifier would work. Issue comming in the next couple of weeks.

    cardano-base

    • BLS12-381 branch merged PR#266.
    • Testing strategy for BLS bindings:
      • Test-vectors for Groth16, and simple BLS signatures ready.
      • Test-vectors with different library, and created by different engineer.

    KES agent

    • Resolved issues of circular dependency
    • Got rid of separate DSIGN and DSIGNM, we now have DSIGN over mlocked keys, but the phantom type is the same.
    • Opened a PR for raw bearer branch in ouroboros network PR4395
    • Resolved a bug where the agent node did not properly closed connections
    • Updated version of IOSim allowed us to finish a first version of KES agent.

    Sidechains

    • Included BLS12-381 curve to our branch of halo2curves
    • Included JubJub to our branch of halo2curves

    MuSig2

    • Minor reorg PR#42
    • Started including fuzz testing for deserialisation PR#

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: RFP finished. Code ready for audit.
    • cardano-base: BLS12-381's PR approved, only blocker is Windows' CI. Preparing extensive testing strategy together with Plutus and Testing teams.
    • KES agent: Working on a desing on how to use IO sim in order to allow for proper network simulation testing.
    • Sidechains: Preparing proving system to use the curves needed for main-net PoC.

    Low level summary

    Mithril

    • Merged PR#783
    • RFP for crypto audit ready.

    cardano-base

    • BLS12-381 branch approved PR#266. Blocker is Windown's CI. Working on it
    • Testing strategy for BLS bindings:
      • Preparing test-vectors for Groth16, and simple BLS signatures
      • Finding community projects to help write their use cases
      • Designing AC, and expected tests for higher levels of development (Plutus team, E2E tests, etc)
    • Wrote blogpost on how using the same key for ed25519 and VRF completely breaks the security of both systems

    KES agent

    • Started integration of sockets interface used in consensus
    • Use that for de/ser
    • Resolving problems with block memory in IOSim. Can't use withForeignPtr in IOSim
    • Results in having to parametrise for IOSim in KES and DSIGN for testing

    Sidechains

    • Prepared an API for proof generation in sidechains, with it's C API for integration with JVM languages.
    • Design document and start interacting with researchers for concrete instantiation of SNARK-based ATMS.
    • EdDSA over JubJub ready

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Updated KES crate to force user to allocate buffer of bytes for the key. Include proper testing for batch mtree opening and STM batch verify. Progressed with RFP for audit.
    • cardano-base: BLS branch is now ready for review. We are workign forward its merge.
    • KES agent: time off of part of the team, but in general continuing with the adaptation of the KES agent with consensus codebase.
    • Sidechains: We are exploring and starting discussion on how sidechains could leverage BLS12-381 bindings for SNARKs

    Low level summary

    Mithril

    • Bumped to version 0.2.0 the implementation of KES. Redesigned the representation of the secret key to allow user to allocate a buffer using mlock.
    • Opened PR#783 to update dependency
    • Improved testing for batch opening of mtree, PR#773
    • Improved testing for batch verification of STM sigs PR#774
    • RFP for crypto audit almost ready.

    cardano-base

    • BLS12-381 branch finally ready for review PR#266

    KES agent

    Team off for one week. Other progress:

    • Learning about raw direct-bearer abstraction. An interface for sockets in consensus.
    • use that for direct ser/deser
    • written those syntaxes for ouroboros (coming PR)
    • the kes agent will depend on that.

    Sidechains

    Progress with familiarisation of Halo2 library to write circuits.

    + + + + \ No newline at end of file diff --git a/tags/crypto/page/3/index.html b/tags/crypto/page/3/index.html new file mode 100644 index 00000000000..7b1e9adf2ee --- /dev/null +++ b/tags/crypto/page/3/index.html @@ -0,0 +1,24 @@ + + + + + +18 posts tagged with "crypto" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "crypto"

    View All Tags

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: Helper functions finished. Continue preparing a RFP for an audit of mithril's core library (decided to add audit of KES). Design proposal for viable registration.
    • cardano-base: Praos to PraosBatchCompat ready. KES secure forgetting finished, but holding merge for delivery strategy (breaking changes). Tested real world SNARK verification on plutus.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: started implementation in rust.

    Low level summary

    Mithril

    • Transmute helpers merged PR#722
    • We have progressed with the RFP document for the mithril-stm library. Progressing with description of octopus algorithm. Included KES in scope.
    • We are working in a modification of KES to require caller to allocate the secret key buffer.
    • Proposed a solution for signer registration of Mithril.

    cardano-base

    • Progressing with BLS12-381. Worked with plutus team to have a plutus script verifying a Groth16 proof.
      • Results are promising, with using only 23% of the execution budget to verify a realistic proof.
      • Next step is to build a real world use case (and not use a dummy proof). Projects being considered are Sidechains, Hydra or Mithril.
    • KES secure forgetting merge is being held off, due to breaking changes. We are considering handling several branches in cardano-base for this.
    • Conversion finally merged PR#344.

    KES agent

    • Figuring out how to use sockets to write directly into the file descriptor. Digging into the sockets implementation
    • Figuring out how to go from fake file descriptor to write the raw bytes

    MuSig2

    • Started implementing MuSig2 in Rust using the Ristretto prime order group. Still experimental.

    · 3 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We are creating helper functions to single out the usage of unsafe to facilitate auditing. We are also preparing a RFP for an audit of mithril's core library. Exploring future paths of mithril.
    • cardano-base: Decision of whether to continue with BLS12-381 or switch curves. Conversion Praos to PraosBatchCompat ready, as well as KES secure forgetting.
    • KES agent: using snockets and making things testable in IOSim
    • MuSig2: GH actions updated for checking the files whether they end with an empty line. Also, we reorganized the library.

    Low level summary

    Mithril

    • Given that removing the usage of transmute really affects the benchmarks, we decided to group all unsafe functions to facilitate auditing PR#722
    • We have progressed with the RFP document for the mithril-stm library. We are documenting the differences with respect with the original paper.
    • We are exploring possible paths of how mithril could be used 'as-a-service'. Other projects such as sidechains or Catalyst would benefit of such a service. We are at a very early stage of brainstorming how it could work.

    cardano-base

    • There has been a very thorough discussion with potential users of the BLS12-381 bindings if that is the best curve. We have considered alternatives such as Pasta curves, Pluto-Eris or BLS12-377, and considering it's trade-offs. Seems that the most interesting curve to have on main-net is still 381.
    • The team is gaining expertise in SNARKs to be able to experiment with them, and conclude whether the bindings will allow for SNARK verification on main-net in a timely manner.
    • The update VRF PR#341 is finally merged, and we are ready to merge PR#344, which implements conversion functions from the compatible types between Praos and PraosBatchCompat.

    KES agent

    • Use of snockets to send the data directly from the socket to secure memory.
    • We realized that in order for the DirectSerialise / DirectDeserialise classes to work against IOSim, we have to generalize a bunch of additional primitives
    • Our plans are to: (1) Split up MonadSodium into separate typeclasses, each capturing a more sensible concern; (2) Rename those typeclasses to something that reflects their nature better.

    MuSig2

    The GitHub Action linelint is used to check the files.

    • A new job for linting is added to the file /.github/workflows/ci.yml. The rules are configured in the file /.github/workflows/.linelint.yml. Some files from the configuration of libsecp were failing, so in the rules in .linelint.yml the failing files are denoted to be ignored by the linter.
    • Folders are reorganized. We created a folder to handle the example. This folder includes the examplemusig2.c, a distinct config.h, and helper.c. The example is enhanced by implementing the functions in the helper for the configuration given in config.h. The number of messages is different than the tests. The example is made more generic to run with a loop.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The open fronts that the crypto team is working on are:

    • Mithril: We explored whether some uses of transmute could be removed, but it resulted in considerable regression.
    • cardano-base: Some issues with Nix are blocking merge of VRF update. BLS12-381 benchmarks where quite satisfactory. Next steps will be defined by cryptography strategic decision.
    • KES agent: An inconsistency between contra-tracer available in hackage and the one in cardano-haskell delayed our progress. Now we are adapting PRs to the contra-tracer used by consensus.

    Low level summary

    Mithril

    • We removed the usage of transmute in mithril-core (and exchanged it with ser/deser, as unfortunately there is no other way with the library we currently use). However, the benchmarks showed an important regression - ~30% worse on average PR#675. We decided to keep transmute, but instead group all its usage in helper functions, to facilitate auditing.
    • We are writing a RFP for the audit of the core library.

    cardano-base

    • A problem with Nix is blocking merge of PR#341
    • Plutus team ran benchmarks of BLS12-381 built-ins. The results are satisfactory, and while we have yet not implemented SNARK verification in plutus, it all seems to point that we'll be able to verify some proofs in a single script execution.
    • Team is fully digesting the Plonk paper.
    • There's been a lot of discussions (with internal and external projects) regarding pairings in plutus, and what elliptic curve should be used.

    KES agent

    • A little unforseen delay has been caused by a mismatch in the use of contra-tracer. The one in hackage and that in cardano-haskell are not compatible. Unfortunately, for secure forgetting we use that of hackage, and now realised. We are doing the change, but still the CI is not happy.
    • The same was needed for the KES agents prerequisites PR#317.
    • We've started working with the agent itself again, upgrading the cardano-base dependency and adding ouroboros-network-framework dependency

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: The API features (error handling) has been merged.
    • Mithril: We update the KES library and published it in crates.io. Similarly, we merged batch verification of STM signatures.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI.
    • KES agent: We keep progressing with KES secure forgetting implementation.

    We also started working in the cryptography engineering handbook, which will be a cross team effort.

    Low level summary

    MuSig2

    • Merged the more granular error handling mechanism PR#33

    Mithril

    • Adapted KES library so that sk contains its corresponding period, making key handling easier. Avoid making unnecessary copies of the KES key. Expose function to get associated period. All included in Version 0.1.1, which was published in crates.io.
    • Updated new KES format to mithril library PR 674
    • We implemeneted batch verification of stm signatures, which improves the benchmarks for mithril chain-sync PR 531
    • We keep progressing on reducing the use of transmute in mithril-stm.

    cardano-base

    • Nothing new to report. Still working in merging these PRs. We are only missing nix merge of PR#520 and the updates on VRF will be merged.

    KES agent

    • We keep progressing in the secure forgetting PR. Added NoThunks tests, error hasndling to detect when mlocking fails, resolved bugs due to incorrect usage of mlocked memory and wrote more efficient tests PR#255.

    Cryptography handbook

    We have made available the (temporary) cryptography handbook https://input-output-hk.github.io/cryptography_spec/, and included the description of some primitives (Ed25519, KES and VRF). This is an ongoing effort, and we plan on further expanding the list of available primitives.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We were blocked with a CI issue, that we finally resolved. Similarly, we merged the redesig of the API to mantain consistency.
    • Mithril: Merged the reformat of the signle signature. Similarly, we started working in ensuring KES implementation in rust is safe.
    • cardano-base: VRF and BLS are still waiting to be merged, as we have some problems with the CI. Moreover, we started experimenting how rust can be included in the cardano-base code-stack.
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • [Still in progress] We are introducing a more granular error handling mechanism PR#33
    • We merged the API redesig PR#35
    • We were blocked for a while with a CI issue, for which we are currently simply using a simpler version of Ubuntu. We'll probably circle back to this in the future PR#36

    Mithril

    • We merged the individual signature PR#620
    • We are modifying important parts of the KES mplementation to guarantee there are no unnecessary copies during Ser/Deser (kes repo)

    cardano-base

    • Nothing new to report. Still working in merging these PRs.
    • We started experimenting on how we can use cabal-pack to create haskell libraries out of rust libraries, and how this would affect the cardano-base fork. We encountered what seems to be a bug in GHC

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Fixed a 'use-after-free' bug in the KES agent.
    + + + + \ No newline at end of file diff --git a/tags/crypto/page/4/index.html b/tags/crypto/page/4/index.html new file mode 100644 index 00000000000..96adcc48bcd --- /dev/null +++ b/tags/crypto/page/4/index.html @@ -0,0 +1,28 @@ + + + + + +18 posts tagged with "crypto" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "crypto"

    View All Tags

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level summary

    The four open fronts that the crypto team is working on are:

    • MuSig2: We are almost ready to reach a point where the MuSig2 library is ready for usage by the Hydra team.
    • Mithril: We started to think how Mithril-core can be designed such that it can be leverage by contexts where the verifiers run full nodes
    • cardano-base: The VRF and BLS branchs are still open and in progress
    • KES agent: We keep progressing with KES secure forgetting implementation as well as the KES agent.

    Low level summary

    MuSig2

    • We redesigned the library so that MuSig2 lib users don't need to be aware of the underlying secp256k1 library PR#31
    • We are introducing a more granular error handling mechanism PR#33
    • We rethought the API and made it more consistent with the underlying secp256k1 library PR#35

    Mithril

    • The mithril crates in general will be published in crates.io, and we adapted the core library's README PR#616
    • We are modifying the individual signature to not contain the VK and stake. This was not necessary, as the current design requires the aggregator of Mithril certificates to know this information PR#620

    cardano-base

    • We've been still working in updating to the latest version of the VRF. In particular we modified the cbits to use the latest version of libsodium stable (1.0.18) PR#341
    • SKs, VKs and VRF outputs will be compatible across the different versions. We are implementing conversion functions for simple transitions PR#344
    • Benchmarks on pairing built-ins have already started, so we were finalising some CI concerns and final remarks on the BLS PR, so that it can be merged as soon as we have green light from plutus PR#266

    KES agent

    • We keep progressing in the secure forgetting PR and resolving some bugs on memory handling PR#255
    • Increasing the test framework to make sure concurrency is properly treated by the KES Agent, for which we are including refcounted references. General progress in the implementation.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level overview

    The SECP primitives AC has been met, and the test-vectors PR has been merged. Another of the main short-term goals is to implement KES secure forgetting. In the past week the mempool PR has been merged, and we've adapted the KES secure PR to the new mempool design. On top of this, we are working in updating the VRF batch compat version to use the audited version of the libsodium fork (PR#). Finally, we've 'cleaned' our libsodium fork, and we directly fork upstream, rather than forking Algorand's fork.

    Low level overview

    • With the AC met, there was no more blockers from crypto to release the node tag with the SECP primitives. We are now working closely with dQuadrant to to implement some E2E tests with an actual bridge implementation.
    • We previously had a C implementation of a memory pool for usage in KES secure forgetting. After a discussion with Alexey, we decided to use his implementation of a mempool in Haskell. We are working in adapting KES Secure forgetting to use this Haskell mempool.
    • In parallel, we keep progressing on the KES agent
    • VRFBatchCompat was deactivated due to a lack of an external audit. This audit was finished a few weeks back, and we are updating cardano base to use this new librar. In particular, this library implements the latest changing version of the VRF draft (13, which seems to remain stable), and links to the libsodium fork which implements batch verification.
    • Our libsodium fork now links directly to upstream libsodium.

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level overview

    The crypto team is primarily focusing in enabling SECP primitives, and preparing the KES agent. We are close to +meeting the acceptance criteria in cardano-base, +which lacks some editorial comments on the style of dQuandrant's PR, the inclusion of one additional test, and +we are good to mark it as done. For the KES agent, we are still iterating over the best design of the solution, +but also progressing on the implementation.

    Low level overview

    SECP built-ins

    • (missed last two weeks update) Audit was succesfully completed by bCryptic, and some minor changes where addressed in PR 313
    • CIP-0049 was addressed in the editors meeting, and PR 250 was merged
    • The unit-tests PR 320 is opened. Some editorial concerns still need to be addressed, and an additional (negative) test has been requested for addition.

    KES agent

    • We were working in investigating how to send OpCerts to KES agents, but turns out to be not necessary. OpCerts can be stored on-disk, so the agent does not need to be aware of them.
    • We are redesigning the architecture. Instead of connecting the control server to the agent, and then the latter to the node, we are directly connecting the control server to the node, and the latter to the agent(s).
    + + + + \ No newline at end of file diff --git a/tags/db-sync/index.html b/tags/db-sync/index.html new file mode 100644 index 00000000000..bf05733738f --- /dev/null +++ b/tags/db-sync/index.html @@ -0,0 +1,61 @@ + + + + + +14 posts tagged with "db-sync" | Cardano Development Updates + + + + + + + + + + + + +
    +

    14 posts tagged with "db-sync"

    View All Tags

    · One min read
    Kostas Dermentzis

    High level summary

    We have created new tag sancho-2-2-0, which integrates missing Conway feautures and some minor fix +tags sancho-2-1-0, sancho-2-0-1. +We have completed the initial implementation for the bootstrap instance objective.

    Lower level summary

    • Add a new --disable-gov flag which disabled Conway ferautures +#1558
    • Fix of the committee key size +#1544
    • Workaround a ledger issue with unregistered pools +#1542
    • Implemented a mechanism that loads the UTxO from the ledger resulting is way faster syncs +#1539
    • Rename offline to offchain +#1533
    • Transfer existing tests to Conway era +#1529#1547

    · One min read
    Kostas Dermentzis

    High level summary

    We have created a DBSync tag sancho-1-1-0 which can follow sanchonet. Also +the team has ran a number of benchmarks and tests for the new options/flavours of DBSync +and prepared a blogpost which summorises them, for downstream components.

    Lower level summary

    • Integration of node-8.3.x and support for Sanchonet on Conway +#1498
    • Simplifications of new feautures +#1496
    • Makes it impossible to restart DBSync with different schema options and adds +tests for them +#1466
    • CI fixes +#1494#1491
    • Prepared a blogpost about different DBSync options +blog

    · One min read
    Kostas Dermentzis

    High level summary

    We have integrated many new Conway feutures and allow db-sync to sync sanchonet. +We also continued testing and improving the new db-sync options.

    Lower level summary

    • Conway integration +#1484
    • Support for Sanchonet +#1476
    • Stake distribution is computed earlier +#1484
    • Deposit ledger events are now used. This reduces the db queries and makes syncing faster +#1484
    • Testing new db-sync options +#1466
    • Added support for ghc-9.6 +#1479
    • Tech debt: improve exceptions +#1471

    · One min read
    Kostas Dermentzis

    High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2 and tested
    • Many devx issues resolved

    Lower level summary

    • We have improved and validated the design for the Conway integration in db-sync
    • Improved the initial integration of the UTxO-HD feauture branches which are under test
    • Prepared a new release 13.1.1.3 which supports node 8.1.1 +#1455.
    • This also fixes a bug +#1451
    • Added new tests to the new tx_out options +#1429
    • Fixed a chronic issue in db-sync related to exception handling and concurrency +This fixes many other issues and simplifies the logic in db-sync +#1447
    • A number of fixes and improvements in ci, docker, devx, docs +#1436#1442#1448#1452

    · One min read
    Kostas Dermentzis

    High level summary

    We've made progress in all high level objectives

    • CIP-1694 integration design
    • UTxO-HD integration proof of concept
    • schema migrations with a focus on speeding up frequent queries is part of release 13.1.1.2
    • A new hire will help us with devx issues.

    Lower level summary

    + + + + \ No newline at end of file diff --git a/tags/db-sync/page/2/index.html b/tags/db-sync/page/2/index.html new file mode 100644 index 00000000000..c00be5eecb0 --- /dev/null +++ b/tags/db-sync/page/2/index.html @@ -0,0 +1,63 @@ + + + + + +14 posts tagged with "db-sync" | Cardano Development Updates + + + + + + + + + + + + +
    +

    14 posts tagged with "db-sync"

    View All Tags

    · One min read
    Kostas Dermentzis

    High level summary

    Lower level summary

    • Prepared a schema change which is expected to speed up queries and help clients +#1389.
    • Ran a big number of benchmarks on the above to evaluate if this change is reasonable.
    • Performance optimization related to rewards +#1382
    • Using the cache in more places to reduce recourses usage +#1380
    • Evaluated risks related to UTXO-HD integration
    • Worked on a feauture request to split the tx_out to an address table +#1396
    • Worked on another feauture request to prune the consumed entries from the tx_out table +#1398
    • Prepared for CIP-1694 integration

    · One min read
    Kostas Dermentzis

    High level summary

    The DBSync team worked in performance enhancements issues, on providing new db-sync options and on +technical debt and bug fixing. The DBSync team also on boarded a new member.

    Low level summary

    • Worked on an issue which causes ada_pots tables to include the values related not only to an +epoch, but also the first epoch of the last epoch. +#1367
    • Fixed an issue where the epoch table didn't rollback and caused wrong values +#1370
    • Fixed an issue were users with disable-ledger option had to provide the state dir option, even +though it was never used. Also refactored the no ledger part of the codebase. +#1378
    • Improved the perforance by using the cache more. Also provided many new options which enables or +disables parts of db-sync. In addition a new --turbo mode is enables which allows db-sync to sync +mainnet in hours. +#1379

    · One min read
    Kostas Dermentzis

    High level summary

    The db-sync team created a new tag 13.1.0.2 which is ready to release. +We also investigated and had the first working UTxO-HD integration which is one +of the potential future risks for db-sync.

    Low level summary

    • Integrated the UTxO-HD feauture branch in kderme/utxo-hd-1. This doesn't +use the full on disk storage but keeps things in memory and the plan is to keep +it this way for the first iteration. The integration still has some performance +issues which we investigate
    • Created tag 13.1.0.2 which upgrades the dependencies of db-sync
    • Fixed an issue related to errors appearing in SMASH +#1353
    • Continued with ghc-9.2 integration +#1339
    • Worked on an new fixing procedure for +#1348. +We try to make these procedures work also on older schema version, without the +need to migrate to newer schema, which can be very useful for fixing existing +snapshots.

    · One min read
    Kostas Dermentzis

    High level summary

    After spending the last months on improving DBSync and releasing 13.1.0.0 the DBSync team focused +the last weeks on integrating upstream changes and tech debt. This includes integrating CHaP, the +new leger core and ghc-9.2.4

    Lower level summary

    • Integrate CHaP +#1331
    • Integrate new ledger core 0.1.1.1 and ghc-9.2 +#1332
    • Technical debt: Add code formatter fourmolu +#1334
    • Preparing and tracking Conway and UTxO integration

    · One min read
    Kostas Dermentzis

    High level summary

    The DBSync team continued testing release 13.1.0.0. The QA team has reported that no issues have +been found. The DBSync team also worked on cherry-picks back to master and on fixing bugs.

    Lower level summary

    • Release is cherry-picked back to master, which uses the new rollback mechanism which uses +reverse indexes, same as the release +#1320 +This also fixes a bug number of issues on master.
    • Depenencies upgrade and CHaP integration +#1324
    • AdaPots fix #1323. This +fixes an issue where the per epoch AdaPots didn't match the epoch boundary, but +they also included changes from the first block of the epoch.
    • Deposits Event fix #3212. This pr +adjusts the Deposits ledger events, so that it can be better used by db-sync. This can reduce the +number of queries that db-sync does during syncing an make syncing faster.
    + + + + \ No newline at end of file diff --git a/tags/db-sync/page/3/index.html b/tags/db-sync/page/3/index.html new file mode 100644 index 00000000000..fca2344ea71 --- /dev/null +++ b/tags/db-sync/page/3/index.html @@ -0,0 +1,85 @@ + + + + + +14 posts tagged with "db-sync" | Cardano Development Updates + + + + + + + + + + + + +
    +

    14 posts tagged with "db-sync"

    View All Tags

    · One min read
    Kostas Dermentzis

    High level summary

    The DB Sync team prepared a release 13.1.0.0-rc2 which includes many improvements for db-sync, +it makes rollbacks and syncing much faster, simplifies the schema, fixes bugs and introduces +migrations. This release finalises the objectives that were set for db-sync for the previous +3 months period and part of the syncing speed objective set for the next period +Changelog

    Lower level summary

    • Branch release/13.1.0.x +includes all the improvements related to the release. The release is passing through the testing +phase and a number of bugs and issues have been fixed, like +#1312 +#1311. +Also many new unit tests have been added.

    • Part of the release branch is cherry-picked back into master, in a way that it respects the new +release and development process, so that it takes into account migrations +release process

    • The DB Sync team has also tagged release 13.0.6 which better supports preview and preprod for +docker.

    · One min read
    Kostas Dermentzis

    High level summary

    The DBSync team is preparing a release which introduces schema simplifications, removes indexes, +unique and foreign keys. It also provides a way to fix older values and migrates without the need to +resync from genesis.

    Lower level summary

    Schema simplifications

    Indexes, Unique and Foreign keys are removed in order to speedup syncing +#1295 +The same pr also introduces a different way to rollback, which doesn't rely on foreign keys and +indexes.

    Performance

    The DBSync team ran a big number of benchmarks and investigated ways to speedup syncing. A +conservative number of these will be included in the next release and the rest can be found in +performance view.

    Migrations and resyncing

    The next release will be 13.1.0, it will enable a migration without the need to resync. It will also +introduce a procedure that fixes bytes values of Datum and RedeemerData in existing databases +#1294

    Release

    The release has been mostly cherry-picked from master +#1294 and its scope can be seen +release view

    · 2 min read
    Kostas Dermentzis

    DBSync Update

    Fast restarts

    We fixed a long overdue issue in db-sync which caused long delays on restarts +1266. This has been +one of db-sync main objectives for this period. Restarts are now very fast, +because db-sync deletes almost nothing from the db, it just replays the ledger rules until it +reaches the tip of the db. The fix also improves reconnection speed, in cases where the node +restarts or the connection is temporarily lost. It also speeds up even more in cases where due to a +deployment mess up a very old snapshot or no snapshot at all is used.

    Property based testing

    We added stateful property based testing, using quickcheck-state-machine +1269. These tests use empty or +almost empty blocks to test the new behaviour of restarts and rollbacks.

    These tests generate arbitrarily a list of symbolic commands from these:

    RollForward Int
    RollBack BlockNo
    StopDBSync
    StartDBSync
    RestartNode
    AssertBlockNo BlockNo

    The commands are translated into real commands. For example RollForward Int will forge a new block +that fits on the current chain. These real commands are executed against db-sync using the mock +chain-sync server. The symbolic commands are executed against a vesy simplistic Model of db-sync +which looks like this:

      Model
    { serverTip :: BlockNo
    , dbSyncTip :: BlockNo
    , dbSynsIsOn :: Bool
    , dbSynsHasSynced :: Bool
    }

    Finally a number of postconditions are checked, related to the eventual block number of db-sync.

    Tech Debt

    We handled a number of tech debt in +1275 +This improves the code format of db-sync, deletes many queries that were never used and groups the +others. This tech debt resolution not only improves the experience of working in db-sync, but can +facilitate some of our other objectives, as it makes it very explicit which queries are used +during syncing and which indexes are necessary.

    Smash

    We worked on fixing an issue related to fetching pool metadata +1276. +The issue which is described in +1270

    · 2 min read
    Kostas Dermentzis

    DBSync Update

    New Tag

    We created a new db-sync tag 13.0.5 which addresses shortcomings of the last +release 13.0.4. It is currently under testing. +The Changelog is +here and in more details:

    • We fixed fees for tx with phase 2 failure that didn't include a total collateral field. +1248

    • We fixed an issue that could cause db-sync to crash if a specific rollback occured. +1247

    • DBSync will now avoid reserialising data, especially Datums, which not only slows down db-sync but +could result in the wrong CBOR encoding being inserted. +1217

    • All the fixes above come with unit tests which validates the fix.

    • Added support for preprod and preview from docker. DBSync no longer needs to include the configs +for different networks, these are directly fetched from the cardano world. +1254

    • We added better support from docker for the new disable options and the overall documentation. +1260

    All the above were also backported to the master branch

    Open source

    We made the db-sync board public, so +everyone can have access on the issues we prioritise. +We also added new tasks to the board, some of them could be approachable to newcomers or people who +want to contribute.

    Progress on tech debt and new features

    • 1223 was merged, which removes the +foreign keys from the db schema. This opens the road to a number of optimizations.

    • An additional fix on top of the previous work was added +1250

    • An initial version where DBSync does not rollback on restart is done here +1266. +This allows db-sync to restart much faster, without the need to delete data and reinsert them. In +the future it can also facilitate migrations in cases where the ledger snapshots have a breaking +change, without the need to resync everything from genesis.

    + + + + \ No newline at end of file diff --git a/tags/devx/index.html b/tags/devx/index.html new file mode 100644 index 00000000000..f13ef202860 --- /dev/null +++ b/tags/devx/index.html @@ -0,0 +1,24 @@ + + + + + +2 posts tagged with "devx" | Cardano Development Updates + + + + + + + + + + + + +
    +

    2 posts tagged with "devx"

    View All Tags

    · 2 min read
    Moritz Angermann

    High level summary

    The Developer Experience team has been dealing with day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, CI migration from Cicero to Hydra, and Buildkite to GitHub Actions. iohk-nix, haskell.nix, and devx have seen improvements.

    Lower level summary

    build support & maintainance

    The DevX team has helped troubleshoot a few CI issues, and focused on helping to migrate from Cicero to Hydra, as well as from Buildkite to GitHub Actions.

    compiler upgrades

    Compatibility with 9.6 has been continued and most of our libraries are not 9.6 compatible. Only a few are not, we hope to have this done by the end of the month. We've also started preliminarily adding GHC 9.8 to our infrastructure for early compiler regression tests.

    Hydra Tools

    Our repository, input-output-hk/actions, has seen quite some improvements to facility the hydra <-> github integration.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of preliminary GHC 9.8 support.

    devx

    The devx repository has seen significant improvements, including the addition of GitHub Codespaces, and DevContainers. Integrated with our actions/devx GitHub Actions, we have a consistent set of tooling for

    • nix develop shells
    • GitHub CodeSpaces integration
    • VSCode DevContainer support
    • GitHub Actions integration

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    · 3 min read
    Moritz Angermann

    High level summary

    The Developer Experience team has been devoted to day-to-day troubleshooting and support of various elements including build failures, compiler upgrades, the maintaince of our cardano-haskell-packages (CHaP), and infrastructure like GitHub Actions, iohk-nix, haskell.nix, and devx. Furthermore, we have also contributed to upstream tooling improvements.

    Lower level summary

    build support & maintainance

    Our DevX team has been instrumental in troubleshooting and fixing a wide range of issues, from broken windows builds and obscure LoadDLL errors to blst integration across Nix and Github CI. We've also initiated automatic uploads for release assets. Our efforts in streamlining complex CI setups have paid off, with some repositories like cardano-base experiencing significant reductions in CI complexity.

    compiler upgrades

    After the support for 9.2 across our libraries, we have started working on 9.6 compabilitiy as well. This move brings us closer to the upstream compiler, facilitating the contribution of patches and enabling early detection of regressions. In addition, we're prioritizing compaining even stronger for better backwards compatibility.

    CHaP (cardano-haskell-packages)

    We relocated the underlying tooling, (foliage), for CHaP into the IOG organization. Furthermore, we have introduced improved tooling to quickly add constraints to packages, better error reporting for add-revision and better hackage url compatibility to facilitate easer usage of CHaP.

    GitHub Actions

    Our repository, input-output-hk/actions, now houses the necessary actions for installing pre-requisites to build Cardano projects using GitHub Actions. Leveraging the base and haskell install actions has allowed us to simplify workflows in the repos, focusing primarily on invoking cabal.

    iohk-nix

    The iohk-nix repository has undergone a major revamp and now provides pre-built packages of the cryptographic libraries IOG utilizes for GitHub Runners. The key components we use, sodium, blst, and secp256k1, are also fixed to certain revisions within the iohk-nix repository.

    haskell.nix

    Haskell.nix has been maintained and updated with the addition of GHC 9.6.2 and GHC 8.2.8. After discovering performance regression in the native bignum backend, we switched the default bignum backend to gmp.

    devx

    The relatively new devx repository is where we experiment with a single nix development shell that aims to suffice for most use-cases at IOG. This initiative is expected to eliminate a number of CI failures related to project-build and shell interaction problems. The devx repository's readme has been updated to reflect its purpose and usage guidelines.

    upstream tooling

    Our team remains committed to enhancing upstream tooling, with ongoing contributions to GHC, Cabal, and Nix.

    + + + + \ No newline at end of file diff --git a/tags/embedding-quality/index.html b/tags/embedding-quality/index.html new file mode 100644 index 00000000000..b3f358dace3 --- /dev/null +++ b/tags/embedding-quality/index.html @@ -0,0 +1,25 @@ + + + + + +One post tagged with "embedding-quality" | Cardano Development Updates + + + + + + + + + + + + +
    +

    One post tagged with "embedding-quality"

    View All Tags

    · One min read
    Dorin Solomon

    High level summary

    We made good progress on most of the Action Items we agreed on Lisbon, like:

    • Cardano System Tests was fully open to public (tools, tests, results) +See cardano-node-tests webpage.
    • We defined an user-facing-functionality template that is used with the cardano-cli team
      • this includes acceptance criteria & user stories, and definition of done
    • We are in the process of running the cardano-node-tests at commit & PR level in cardano-node (we are affected by the Cicero migration right now but we did most of the work already)
    • We started to apply a labelling convention on cardano-node issues that will be used to generate some visual dashboards with some metrics [TBD]
    • Ziyand Liu started an End-to-End Development and Testing Process for Plutus Features
    + + + + \ No newline at end of file diff --git a/tags/goedel/index.html b/tags/goedel/index.html new file mode 100644 index 00000000000..7dc9f744b02 --- /dev/null +++ b/tags/goedel/index.html @@ -0,0 +1,49 @@ + + + + + +18 posts tagged with "goedel" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "goedel"

    View All Tags

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and testing the +performance analysis tool

    Details

    • drafting processs calculus semantics of mini protocol programs

    • testing the new performance modelling tool

    • further work on specification of mini protocols

    • extension of mini protocol framework to support communication of +programs with local environments via synchronous channels

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • working on collating and open sourcing performance analysis prototype

    • improvements to Ouroboros Praos specification in Isabelle

    • working on formalising chain sync mini-protocol

    • reviewing an alternatice semantics for DeltaQ

    • Seminar talk at U. Bergen on algebraic properties of timeliness

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • finalising a presenting performance analysis internship work to the +formal methods team

    • developed a new Isabelle mini-protocol framework and examples

    • planning an extended version of the ICE DeltaQ paper

    • working on algebraic rules for properisation of any-to-finish

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is currently formalising mini protocols and also further +developing the performance modelling prototype.

    Details

    • Development of an automated prover for showing conformance of +programs to state machines (as part of the mini-protocol framework)

    • Completion of the documentation of the (current state of the) +mini-protocol framework

    • Discussion about two DeltaQ lectures with two practical sessions as part +of 4th year masters course on distributed systemsby colleagues at UC +Louvain in the Autumn

    • Discussion about four DeltaQ lectures by colleagues at U. Bergen as part +of a 5th year Masters course in the Autumn

    • Adapted original DeltaQ implementation to the new typeclasses and +wrote property tests for its algebraic laws

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is formalising mini protocols and also further developing the +performance modelling prototype.

    Details

    • Developing new framework for specification and verification of +mini-protocols which is closer to the Haskell implementation.

    • Developed a new internal representation for the DeltaQ algebra that +allows for more modularity in backend implementations

    • Discussions regarding the Cardano networking specification

    + + + + \ No newline at end of file diff --git a/tags/goedel/page/2/index.html b/tags/goedel/page/2/index.html new file mode 100644 index 00000000000..529caac6f2f --- /dev/null +++ b/tags/goedel/page/2/index.html @@ -0,0 +1,46 @@ + + + + + +18 posts tagged with "goedel" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "goedel"

    View All Tags

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is working on formalising mini protocols, the performance +modelling prototype and also finishing off their ICE papers.

    Details

    • Formalization of the chain synchronization mini-protocol in the +thorn calculus

    • Final pre-publication steps for ICE 2023 papers

    • Developing approach for specification and verification of +mini-protocols

    • Started work on porting the DeltaQ framework to a new, more concrete +backend based on piecewise-polynomials

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the teams have been working on finalising their ICE papers +for publication in EPTCS, formalising concensus, and investigating chain +sync.

    Details

    • Preparing final versions of ICE papers

    • Reviewing the chain sync design and documentation

    • Refactoring the thorn calculus

    • First draft of Praos specification

    • Developing bounding factors on timeouts

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the teams presented two papers at ICE 2023.

    Details

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on giving and preparing public +talks, also on preparing final versions of their ICE 2023 papers, and +on analysing chain selection.

    This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

    Details

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on final revisions for the +pre-proceedings versions of two ICE 2023 papers.

    Details

    + + + + \ No newline at end of file diff --git a/tags/goedel/page/3/index.html b/tags/goedel/page/3/index.html new file mode 100644 index 00000000000..ac805505911 --- /dev/null +++ b/tags/goedel/page/3/index.html @@ -0,0 +1,46 @@ + + + + + +18 posts tagged with "goedel" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "goedel"

    View All Tags

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team had two paper accepted for ICE 2023 +(https://www.discotec.org/2023/ice). The event will be held in Lisbon +on 19th June 2023. The papers will be published in EPTCS.

    Details

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    The team is working on porting an existing formalisation of Ouroboros +Praos to a newer foundation.

    Details

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has submitted two papers for publication, carried +out consultancy with other teams and has an opening for an intern.

    Details

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on final drafts of two papers +for internal review and planning next steps of analysis of consensus +design refiniments.

    Details

    • Preparing final draft of DeltaQSD algebra paper for internal review

    • Preparing final draft of verifying design refinements for +distributed system design for internal review

    • Planning next phase of consensus design refinement analysis

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers +improving the deltaQ tutorial, consulting on performance design, and +the final version of the Djed paper.

    Details

    • Preparing draft of DeltaQSD algebra paper for ICE 2023

    • Successful outcome of Marlowe consultancy leading to substantial +improvement in performance

    • Preparing sections on the communication language and bisimulation +proofs for draft paper about verifying design refinements for +distributed system design

    • Camera ready version of Djed paper under preparation

    + + + + \ No newline at end of file diff --git a/tags/goedel/page/4/index.html b/tags/goedel/page/4/index.html new file mode 100644 index 00000000000..871b39d609b --- /dev/null +++ b/tags/goedel/page/4/index.html @@ -0,0 +1,47 @@ + + + + + +18 posts tagged with "goedel" | Cardano Development Updates + + + + + + + + + + + + +
    +

    18 posts tagged with "goedel"

    View All Tags

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, improving the deltaQ tutorial, consulting on +performance design, and the Djed paper has been accepted for +publication.

    Details

    • Preparing draft of DeltaQSD algebra paper for FORTE 2023

    • Extending the technical report on which the above paper is based

    • Consulting with an external company on performance engineering of Plutus contracts

    • Planning improvements and collecting material for the deltaQ +tutorial based on experience with systems that manage risk at +multiple timescales

    • Preparing sections on the communication language and idempontency +laws for draft paper about verifying design refinements for +distributed system design

    • Studying Cardano chain sync protocol

    • "Djed: A Formally Verified Crypto-Backed Autonomous Stablecoin +Protocol" has been accepted for publication at IEEE ICBC 2023

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been working on drafts of two papers and one +technical report, distributivity properties of deltaQ, and consulting +on performance design with the Marlowe team.

    Details

    • Processing reviews on performance engineering paper and planning +paper revisions accordingly

    • Investigating distributivity properties of DeltaQ

    • Preparing sections on the thorn calculus and idempotency laws for +draft paper about verifying design refinements for distributed +system design

    • Consulting on performance design with Marlowe team

    · One min read
    James Chapman

    The team works on applied research and consulting in formal methods +that is directly applicable to evidence based engineering in Core Tech +and beyond.

    High level summary

    This sprint the team has been preparing several papers for peer review +and knowledge sharing and consulting within IO and the community.

    Details

    • R&D Seminar on experience participating in a member based organisation
    • Full day tutorial on performance engineering presented at HiPEAC +2023 conference
    • Finished preparing and submitted a paper on performance engineering +to an ACM workshop
    • Preparing a draft paper for future submission about verifying design +refinements for distributed system design
    • Consulting on performance design of other IO projects
    + + + + \ No newline at end of file diff --git a/tags/hydra/index.html b/tags/hydra/index.html new file mode 100644 index 00000000000..d431c156948 --- /dev/null +++ b/tags/hydra/index.html @@ -0,0 +1,105 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team conducted a packed Monthly Review meeting, +featuring demonstrations and the preparation of the monthly report. They +addressed flakiness in tests and enhanced the logs json schema, +improving overall test reliability. Additionally, the team successfully +built MacOS ARM64 (aarch64-darwin) binaries in CI, expanding platform +support. They further improved the network configuration by detecting +incompatible persisted states, contributing to overall system +robustness. Finally, the team released version 0.14.0, highlighting +their commitment to delivering regular updates and improvements.

    What did the team achieve this week

    • Monthly Review +meeting +packed with demonstrations and prepared monthly report +#1189
    • Fixed several flaky tests and improved the logs json schema +#1188#1190#1192
    • Built MacOS ARM64 (aarch64-darwin) binaries in CI +#1182
    • Improved network configuration by detecting incompatible persisted +states #1174
    • Released version 0.14.0

    What are the goals of next week

    • Start work on incremental decommit
    • Continue shepherding contributed PRs to completion
    • Finish stateless-observation work
    • Open a head on a Conway network

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team spent significant time opening a head among +themselves on mainnet using the release candidate, revealing and +addressing lurking bugs such as +#1174. Also +required was this change to dynamically calculate the min utxo value +#1176, a +necessary adjustment following the switch to inline datums. The team +engaged with cardano-cli / cardano-api maintainers to discuss recent +changes and collaborated on drafting feature ideas, including providing +Conway support +for the Hydra roadmap. As part of ongoing improvements, they +experimented with writing the specification in markdown instead of +LaTex.

    What did the team achieve this week

    • Opened head among us on mainnet and uncovered a few lurking bugs like +#1174 in the +release candidate
    • Calculate the min utxo value instead of hard-coding it +#1176, which is +needed since we switched to inline datums.
    • Met with the cardano-cli / cardano-api maintainers to discuss +recent changes and way forward
    • Drafted features ideas to provide Conway +support on the +Hydra roadmap
    • Experimented in writing the specification in markdown instead of LaTex

    What are the goals of next week

    • Have the Monthly review meeting with several demos
    • Release version 0.14.0 with this +scope
    • Complete tidying up chain layer via stateless observation changes in +hydra-node +#1096
    • Update dependencies to prepare for Conway +#1114

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team made several impactful updates. They addressed +misleading errors regarding collect com transactions, resolved a security +advisory (CVE-2023-42806), and simplified the Hydra Head protocol by using +inline datums. The team also tackled minor inconsistencies in specifications and +implementation, documented reasons for potentially dropped close transactions by +the cardano-node, and collaborated with SundaeLabs on an offline mode for +hydra-node. Additionally, they engaged in discussions with researchers about +incremental de-/commits.

    What did the team achieve this week

    • Removed misleading errors about collect com transactions #839
    • Addressed security advisory CVE-2023-42806 in PR #1161
    • Changed the head protocol to use inline datums, simplifying things in the hydra-node #1162
    • Addressed minor inconsistencies in spec and implementation #1104
    • Documented why close transacations might be dropped by the cardano-node (cant fix) #1039
    • Tidy up a few things here and there
    • Worked with SundaeLabs on the offline mode for hydra-node
    • Discussed incremental de-/commits with researchers

    What are the goals of next week

    • Start work on incremental decommits protocol specification #1057
    • Provide support to Hypix
    • Address all open bugs
    • Release version 0.14.0 with this scope
    • Update dependencies to prepare for Conway #1114
    • Shepherd off-line mode PR over the finish line
    • Complete tidying up chain layer via stateless observation changes in hydra-node #1096

    · 2 min read
    Sebastian Nagel

    High-level summary

    The last two weeks, the Hydra team achieved several milestones. They published +the monthly report for October, providing updates on project developments. The +team delivered a presentation and workshop at the Cardano Summit, contributing +to community engagement. They implemented a \"dirt road\" solution for the +\"Ignored init tx\" notification and moved the hydra-poll example project to a +dedicated repository. Additionally, the team built a hydra-chain-observer tool +for Hydra Heads, updated the toolchain to GHC 9.6.3, and made various +improvements to tooling and code formatting. They addressed specific issues, +such as fixing the gen-hydra-keys command and resolving concerns with the +rewritten hydra-tui. The team also enhanced the hydra-cluster smoke test +suite by fetching network configurations dynamically. Lastly, they actively +reviewed pull requests and architectural decision records from the community, +including contributions from SundaeSwap. An experiment, the Hydra tally, was +completed and successfully deployed to the mainnet by the Cardano Foundation.

    What did the team achieve this week

    • Published the monthly report for +october
    • Given a presentation / workshop at the Cardano summit +#1109
    • Dirt road implementation for \"Ignored init tx\" notification +#529 (without +stateless observation)
    • Completed and moved hydra-poll example project into a +dedicated +repository
    • Built a first version of a chain observation tool for Hydra Heads +#1096
    • Switched toolchain to GHC 9.6.3 and various improvements on tooling +and code formatting +#1135#1152#1151#1154
    • Fix gen-hydra-keys command to not overwrite existing +keys #1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Fetch network configurations instead of packaging them into +hydra-cluster (smoke) test suite +#1156
    • Reviewing PRs and ADRs from the community (SundaeSwap) +#1118#1157
    • Hydra tally experiment (Cardano Foundation) deployed to mainnet

    What are the goals of next week

    • Tackle reported bugs
    • Shepherd contributed off-line mode PR to the main codeline
    • Improve chain observation tool to include more data and refactor +existing code towards more stateless observation
    • Start work on incremental decommits

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team fixed the gen-hydra-keys command to avoid +overwriting existing keys, and resolved issues related to the rewritten +hydra-tui. They also worked on a \"dirt road\" implementation for the +\"Ignored init tx\" notification, improving the robustness of the system.

    The team finalized preparations for the Cardano Summit presentation, including +implementation of the hydra-poll example DApp.

    If you happen to read this and attend the Summit in Dubai, make sure to check +out our Masterclass about \"Developing Hydra + Mithril for Scaling Cardano\" on +Friday, November 3 at 14:00-15:30 local time in the \"Al Dar\" room!

    What did the team achieve this week

    • Fix gen-hydra-keys command to not overwrite existing keys +#1136
    • Fixed the rewritten hydra-tui#1113#1137
    • Finalized cardano summit preparation +#1109
    • Implemented the hydra-poll example DApp link to +repository
    • Dirt road implementation for \"Ignored init tx\" notification +#529

    What are the goals of next week

    • Attend cardano summit and deliver presentation
    • Clarify / close user created issues
    • Build aarch64-darwin binaries in CI
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/10/index.html b/tags/hydra/page/10/index.html new file mode 100644 index 00000000000..73e648c3dd0 --- /dev/null +++ b/tags/hydra/page/10/index.html @@ -0,0 +1,31 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team kicked off a new project together with Catalyst, the Cardano Foundation and researchers from IO: a proof of concept for voting on Hydra. The concluded work on validating the Head protocol using model-based testing and formulated next steps, fixed the transaction cost benchmark reporting on the website and reduced the cost for commit transactions by ~30% with the help of reference scripts.

    The year is coming to an end and velocity will slow down a bit while the team focuses on wrapping up loose ends. The updates here will pause until January 2023.

    What did the team achieve this week

    • Kicked-off Hydra Voting project with Catalyst, CF, and IO Research.
    • Reduce commit transaction costs by ~30% with reference scripts.
    • Prepared an RFP for external audit of the Hydra Head solution.
    • Fixed transaction cost benchmarks for abort tx #631.
    • Recorded decision to use model-based testing (ADR22) and improved Model documentation.
      • Concluding the first increment on Validate coordinated Head protocol #194.
      • Formulated next step / follow-up on testing the Soundness property of our protocol #656.
    • Switched to using nix flakes for development setup and CI build #646.

    What are the goals of next week

    • Push ADR21 & tx validity gap over the finish line (smoke tests missing).
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Close & recap on the year with another monthly report (+ blog post).

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has worked on completing to "Validate coordinated head protocol against formal model", this is a huge step to verify the implementation is secure. They also worked on implementing ADR21 related to bounded tx validity which is now under review. HydraPay project, from Obsidian Systems, is coming to an end of the first phase at least, so team did a review and submitted couple of issues they found in the process. The team had a meeting with the Director of CyberSecurity - topic was the RFP that is currently in flight that should scope the work of future auditors. Also, the team completed the hydra-tutorial review created by our colleague Thomas Vellecoop from the education team, and we are close to integrate it to our official site. From the development side, they have fixed a bug on the CI when running the benchmark jobs to calculate the cost of abortTx and a flaky spec which checks a plutus merkle-tree is always balanced.

    What did the team achieve this week

    • Document model based testing #194 & #641
    • Got ADR21, reducing gaps between implementation and specification, under review.
    • Complete review on hydra-tutorial.
    • Complete first round of review on HydraPay work #634
    • Meeting with Director of CyberSecurity frio IOG to unblock "the RFP prepared for the external audit" #606
    • Remove vasil-dev and testnet from smoke-test because they were not working #630
    • Fix flaky plutus-merkle-tree test #642
    • Refactor NetworkSpec to improve legilibility.
    • Fix benchmark cost for abortTx #631
    • Adapt nix.conf to the recent hydra-ci nix cache migration.

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation.
    • Integrate the hydra-tutorial.
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec.
    • Get Cicero (new CI) working.
    • Use reference inputs to reduce the cost of the commitTx.

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has worked on cleaning up several things in progress +after last week's summit. They have extended their model-based testing (MBT) +approach with transaction creation & observation +#410, solved +AcquirePointTooOld problems of the hydra-node with by changing the wallet +initialization #439. +Also, the Hydra researchers updated the security proofs of the Coordinated Hydra +Head, which are bound to be included in the Hydra HeadV1 specification.

    What did the team achieve this week

    • Monthly review & report - will also be published on our website #644
    • Extended the model-based testing (MBT) with transaction creation/observation #410
    • Solve AcquirePointTooOld problems with new wallet initialization #439
    • Fixed our hydraw deployments (EC2 instances)
    • Created & discussed ADR21 within tx validity work
    • Received & discussed security proofs of Coordinated Hydra Head (requires more work)

    What are the goals of next week

    • Get ADR21 accepted & close tx validity gap in our implementation
    • Complete review & integrate the Hydra tutorial
    • Review latest hydra-pay work
    • Have a LaTeX write-up of the HeadV1 (Coordinated Hydra Head) spec
    • Get Cicero (new CI) working

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team attended the Cardano Summit in Lausanne, where Sebastian gave a presentation about Hydra and the whole team connected with the Cardano Community. After the public event, th Hydra team also conducted a workshop, which provided room for a retrospective, various planning sessions and they hacked together on different ideas.

    What did the team achieve this week

    What are the goals of next week

    • Monthly report & review meeting
    • Tie up several loose ends / branches.
    • Resolve Tx validity discussions & PRs.
    • Review cicero PR & try it out.

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team released version 0.8.1, which includes several fixes and a user-wished extension of the persistence introduced by 0.8.0 of replaying server outputs to make clients like the hydra-tui be aware of the latest hydra-node state. The team also worked on the specification and closing gaps in the on-chain scripts, collaborated with the education team on a Hydra tutorial and also renamed the repository from hydra-poc to hydra!

    What did the team achieve this week

    • Implemented replaying of server outputs to address #580
    • Released version 0.8.1 containing this and other fixes Release notes
    • Worked on the bounded tx validity as one of the on-chain script fixes, but couldnt finish it just yet #615
    • Collaborated with the education team on a Hydra tutorial.
    • Discovered and discussed issues with the seen ledger.
    • Renamed the Hydra repository hydra-poc -> hydra

    What are the goals of next week

    • Create and discuss an ADR about handling tx validity correctly.
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET
    • Have a team workshop / hackathon after the summit:
      • Retrospective
      • Roadmapping session
      • Hack on something complex or useful
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/11/index.html b/tags/hydra/page/11/index.html new file mode 100644 index 00000000000..e2b13196445 --- /dev/null +++ b/tags/hydra/page/11/index.html @@ -0,0 +1,35 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team published together with Obsidian Systems a light paper +on our "Hydra for Payments" project (Link). They have created a draft scope RFP for the external audit and worked with the internal audit team to clear up the specification. From the development side, they have fixed a bug with chain-following when using persistence and improved logs for better observability of hydra-node processes.

    What did the team achieve this week

    • Published Hydra for Payments light paper (Link)
    • Have a draft RFP ready for a first review internally
    • Answered the internal auditors questions
    • Fixed a bug with following the chain when starting with persistence (#599)
    • Minor improvements to logging for better observability (#598, #600)
    • Non-achievement: Needed to work around flaky TUI ci, follow-up issue if anyone wants to have a look (#590)

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Close more gaps #452
    • Attend the Cardano Summit in Lausanne. Hydra will be topic of one talk! Save the date+time: "Developing Hydra" on Day 2, Nov 21st, 13:50 CET

    · One min read
    Sebastian Nagel

    High level summary

    This week, the hydra team first re-deployed the latest Hydra scripts to the re-spun preview network, see 0.8.0 release notes. They also completed implementation of ADR18 and worked on the validators, but development got impacted by some CI flakyness. The team also met to discuss hard forks & protocol parameter updates #195 and alignment of the specification document with auditors.

    What did the team achieve this week

    • Complete and merge ADR18 #579
    • Re-deploy hydra scripts to respun preview network, see 0.8.0 release notes #595
    • Have first gap of #452 in review.
    • Non-achievement: Flaky CI for TUI was impacting us, so we investigated this a lot.
    • Engineering meeting to discuss hard forks and protocol parameter updates #195
    • Met the internal audit team on the specification to set scope, expectations and collected requirements/open questions.
    • Drafted project scope for an external audit RFP.

    What are the goals of next week

    • Implement event-sourced persistence #580
    • Answer the internal auditors questions
    • Have a draft RFP ready for a first review internally
    • Close some gaps #452

    · One min read
    Sebastian Nagel

    High level summary

    This week, the hydra team completed several user experience improvements to the +hydra-tui and hydra-node, and delivered a first version of persisted head +states by publishing release version +0.8.0. +Besides this, they met with researchers on topic of the HeadV1 specification and +kicked-off work on the RFP for an external audit of the Hydra Head protocol and implementation.

    What did the team achieve this week

    • Completed the UX improvements on the hydra-tui
    • Released version 0.8.0, which delivers a first version of persisted head states
    • Met with researchers on the HeadV1 specification
    • Started work on the RFP for our external audit

    What are the goals of next week

    • Complete ADR18 implementation and get it merged
    • Start work on event-sourced persistence #580
    • Have a first plutus script gap closed #452
    • Revamp CI to use flakes and build macos artifacts (stretch goal: migrate to cicero for nix builds)

    · One min read
    Sebastian Nagel

    High level summary

    This week, the hydra team reviewed and addressed several open comments on the +new HeadV1 specification, completing a list the of identified gaps between +specification and implementation while doing so. In the wake of the recent +demonstration of SundaeSwap running their DEX in a Hydra Head, they met with +them to capture feature ideas & incorporate their feedback on the roadmap, as +well as potential research avenues.

    What did the team achieve this week

    What are the goals of next week

    • Complete the last two items required for a version 0.8.0.
    • Cut the next release, version 0.8.0
    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Have the CI build macos artifacts

    · 2 min read
    Sebastian Nagel

    High level summary

    This week, the hydra team worked on implementing ADR18 to get backup & restore functionality of the hydra-node over the line. Although not fully there yet, an early version of that feature was already needed and succesfully tested by SundaeSwap in their recent demonstration of their DEX running on Hydra. The team also worked on the updated specificaton, met with the researchers and discussed a solution for how to secure rollbacks "past the opening of a Head". We also reponded to recent requests for static executables and prioritized that feature higher, implemented it and merged it.

    What did the team achieve this week

    • Last week we thought we were done with ADR18, but were not ...
    • ... instead, SundaeSwap has been preparing their Rare bloom Hydra demo & needed assistence.
    • Implemented a first version for persistence #187 in response.
    • Enhanced CI to publish test results on our website
    • Engineering meeting -> discussed rollbacks and discovered a solution for the rollback past open problem!
    • Pulled static executable feature #200 into scope, implemented it and merged it!
    • Received and read through a project proposal by a vendor (building a Hydra platform).

    What are the goals of next week

    • Get backup/recovery #187 done with proper event sourcing (ADR18)
    • Cut the next release, version 0.8.0
    • Address open comments on specification document & complete the list of identified gaps between specification and implementation #452
    • Have the CI build macos artifacts
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/2/index.html b/tags/hydra/page/2/index.html new file mode 100644 index 00000000000..f5a55b4bf31 --- /dev/null +++ b/tags/hydra/page/2/index.html @@ -0,0 +1,51 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team mainly focused on preparing a masterclass and workshop for #CardanoSummit2023.

    In addition, they improved the Hydra node API's submit-transaction endpoint to accept three different encoding types: Base16 encoded CBOR string, TextEnvelope type, and JSON. +This improvement offers users greater flexibility and ease of interaction with the API.

    Finally, the team has followed up on the TUI brick upgrade to version 1.10. +This effort has resulted in addressing minor details and enhancing the overall user experience with the TUI.

    What did the team achieve this week

    • Prepare presentation and workshop for Cardano Summit.
    • More TUI fixes and improvements.
    • Upgrade GHC from 9.2.8 -> 9.6.2 #1105
    • Solved user issue related to submitting transactions in cbor format #1111.
    • Fix hydraw connection issue making it more stable #1121.

    What are the goals of next week

    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team's primary focus was on finalizing the new network resilience layer. This involved adding persistency to ensure data integrity.

    They also completed the exploration of potentially moving the Plutus validator scripts to Aiken.

    Additionally, the team dedicated some attention to our TUI by upgrading the Brick framework. They also undertook a comprehensive refactoring of the project's structure and addressed various bug fixes. These efforts are aimed at enhancing the overall user experience of our project.

    What did the team achieve this week

    • Network Resilience Persistence (#1101)[https://github.com/input-output-hk/hydra/pull/1101].
    • Upgrade brick on TUI (#1103)[https://github.com/input-output-hk/hydra/pull/1103].
    • Aiken commit validator translation (#1072)[https://github.com/input-output-hk/hydra/pull/1072].
    • Fixed some bugs in our TUI client.

    What are the goals of next week

    • Prepare presentation and workshop for Cardano Summit.
    • Work on hydra-poll dApp for Cardano summit.
    • Start the work on packaging hydra-node and related services.

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team released version 0.13.0, which includes fixes and extensions for state persistency and the ability to draft a commit transaction using inline datums.

    The team also delivered the first version of the network resilience layer, significantly increasing head availability.

    Additionally, they have been providing support to several funded Catalyst projects that want to build on Hydra.

    Last but not least, they updated and published security policy and vulnerability disclosure policy reports on how to handle security vulnerabilities within Hydra.

    What did the team achieve this week

    • Release 0.13.0
    • Published vulnerability reports #1088
    • Merged network resilience work part I #1074
    • Planning for Cardano Summit participation
    • Discussions with funded Catalyst projects wanting to build on Hydra for support
    • Merged typos fix PR from @omahs #1095

    What are the goals of next week

    • Complete Aiken commit validator script #1072
    • Complete Kupo integration #1078
    • Brick upgrade on TUI #1103
    • Clean backlog
    • Prepare and rehearse demo and talk for Cardano Summit

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team mainly focused on having a working new reliability +network layer; and specified its expected behavior in a new ADR.

    They also revisited the security policy and vulnerability disclosure policy on +how to handle security vulnerability within Hydra, and in particular how to +handle so-called "Silent fixes".

    What did the team achieve this week

    • Updated security policy and vulnerability disclosure policy #1088
    • Adr/network reliability #1082

    What are the goals of next week

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team conducted the monthly review meeting in +collaboration with Mithril, enhancing project coordination.

    The team improved the gen-hydra-key node command for smoother usability +and identified concrete steps to enhance network resiliency in feature +items #188, +#1080, and +#1079. +Additionally, they contributed the aiken-mode editor integration to the +aiken-lang organization, updated dependencies to utilize cardano-api +8.20, and published the Hydra security advisory CVE-2023-42806 with a +workaround available for users.

    These efforts demonstrate the team\'s commitment to project improvement, +security, and open-source community collaboration.

    What did the team achieve this week

    • Conducted the monthly review meeting together with Mithril
    • Improved gen-hydra-key node command +#1077
    • Established a clear plan to improve resiliency of network and manifested +feature items #188, +#1080 and +#1079
    • Moved aiken-mode (created by SN) +to aiken-lang organization
    • Updated dependencies to using cardano-api 8.20 +#1075
    • Published security advisory +CVE-2023-42806 +(workaround available)

    What are the goals of next week

    • Write-up the monthly report for September
    • Finish "network resilience to disconnects" +#188
    • Finish kupo integration with hydra +#1078
    • Discuss and decide on using aiken or not
    • Address the published security advisory +CVE-2023-42806 +(to not require workaround)
    • Ideally, release 0.13.0
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/3/index.html b/tags/hydra/page/3/index.html new file mode 100644 index 00000000000..8ca50fa0580 --- /dev/null +++ b/tags/hydra/page/3/index.html @@ -0,0 +1,67 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · One min read
    Sasha Bogicevic
    Sebastian Nagel

    High-level summary

    This week, most of the Hydra team was attending a cardano scaling workshop in +Nantes, France. They used this oportunity to meet fellow mithril team and spend +some time together to hack on some code and, as always, reflect on the past work +and find optimal path forward for both projects. They also fixed a bug that +caused hydra-node to crash when querying L1, worked on a new network resillience +proof-of-concept and accepted a new ADR related to stateless transaction +observation.

    What did the team achieve this week

    • Cardano scaling workshop with members of hydra and mithril teams
    • Accepted user contribution for possible new use-case #1048
    • Fix for the hydra-node crash related to internal wallet query #1053
    • Collected experimental CI findings #1070
    • Propose first POC for the network resilience #1074

    What are the goals of next week

    • Monthly review meeting & report including updates from Mithril
    • Review POC and discuss our options for the network resilience
    • Update cardano-api to version 8.20
    • Address TODOs on aiken commit validator #1072
    • Complete hydra-support in kupo kupo#117

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team improved the commit process with support for inline +datums. They simplified the chain layer by refactoring how the chain state is +persisted. Updates to the Hydra tutorial were completed, including CI workflows +to keep it up-to-date. The team engaged in discussions with researchers about +incremental commits & decommits, and drafted an architectural decision record +for a resource-based API. They also explored simpler solutions for the upcoming +network resilience feature.

    What did the team achieve this week

    • Support InlineScriptDatum in commit +#1043
    • Refactored chain state persistency +#1049
    • Completed tutorial updates (by adding CI and some cleanup) +#997
    • Intersect Open Source committee meeting
    • Experimented with various models to better express the \"Network +resilience problem\" to find a KISS solution for +#188
    • Drafted and discussed incremental de-/commit features within team +and with researchers +#199 and +#1057
    • Created ADR for a resource based overhaul of the API +#1028

    What are the goals of next week

    • Meetup of Hydra & Mithril contributors in Nantes, France
    • Integrated cardano-api 8.15 to have GHC 9.6 support
    • A clear design for incremental commits (decommits are already +understood)
    • An ADR for improving tx construction & observation to not need chain +state

    · One min read
    Sasha Bogicevic

    High-level summary

    This week, the Hydra team focused primarily on changes needed in the network +layer and have the first draft document related to needed design. They also +improved the user experience by allowing a commit using inline datums. +Discussed the off-chain governance with researchers and improved internal model +tests.

    What did the team achieve this week

    • Monthly report published
    • Small changes to hydraw and tutorial in light of the Masterclass
    • Investigated a bug and saw it was solved by recent developments
    • Improved the model tests by fully validating L1 transactions
    • Enhanced the /commit API to also allow commit from scripts with inline datums (user request)
    • Discussed off-chain governance with IOG and CF researchers
    • Drafted a first network specification document in the context of Network resilience

    What are the goals of next week

    • Have a clear understanding of the changes we need for the "Improve network resiliency" feature
    • Groomed and agreed plan on incremental commits/decommits
    • Updated tutorials including CI workflows to check consistency
    • Update to GHC 9.6 and latest cardano dependencies (ledger/plutus)

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team conducted the monthly review meeting for Agust,which +continously ensures transparent communication and project evaluation.

    In terms of community engagement, the Hydra team gave a Hydra master-class at +RareEvo workshop as an educational initiative for the community. +Additionally, the team updated the Hydra demo and tutorial to include Mithril +and latest release changes.

    They also focused on exploring the Hydra network resiliance in order to improve +hydra-node availability, as it becomes stuck very easily and that leads to a +bad user experience.

    What did the team achieve this week

    • Hydra master-class at RareEvo workshop!
    • Monthly report & review meeting
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Groomed network resilience and explorer features #188
    • New ADR for “Resourced based API” #1028

    What are the goals of next week

    • Have a poc on network resilience working #188
    • Fix issue #931: “Chain state in head state not updated on replayed observation”
    • Fix issue #1039: "Close transaction dropped from cardano-node"

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team released version 0.12.0, a significant update that +brings support for cardano-node 8.1.2, along with performance enhancements and +various API improvements. Additionally, the team successfully onboarded a new +contributor who is now actively participating in operating a Hydra Head. They +took part in a meeting of the Intersect open source committee and prepared the +Hydra master-class for RareEvo, an educational initiative for the community.

    If you happen to be at RareEvo, register for the Hydra master-class using this +form. +We hope to make it possible to follow along on-line as well and will announce +details on the Hydra announcements channel on the IOG discord +server.

    What did the team achieve this week

    • Released version 0.12.0 which adds support for cardano-node 8.1.2, performance +and several API improvements. Release notes
    • Replaced commit via websocket with external draft + submit. #954
    • Onboarded new contributor to the point where he actively participates in operating a Head now.
    • Joined a first meeting of the Intersect open source committee
    • Prepared the Hydra master-class for RareEvo.

    What are the goals of next week

    • Monthly review meeting
    • Run the Hydra master-class at RareEvo!
    • Updated Hydra tutorial including Mithril and re-record demo/tutorial stuff
    • Clear out red bin items (technical debt)
    • Groom network resilience and explorer features
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/4/index.html b/tags/hydra/page/4/index.html new file mode 100644 index 00000000000..52b7bdf8889 --- /dev/null +++ b/tags/hydra/page/4/index.html @@ -0,0 +1,61 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · One min read
    Franco Testagrossa
    Sebastian Nagel

    High-level summary

    This week, the Hydra team updated hydra-node to support cardano-node version +8.1.2, ensuring compatibility with the latest mainnet release. The team also +participated in discussions about a "cardanonical" JSON schema and added it as a +submodule to the project, contributing to improved data modeling and +interoperability.

    In terms of community engagement, the team successfully onboarded a new +contributor, also participated in a RareEvo Twitter space, and continued +preparations for the Hydra master-class.

    What did the team achieve this week

    • Updated dependencies to support cardano-node 8.1.2 #1007
    • Engaged in discussions about a cardanonical json schema and +add it as submodule to the project +#1013
    • Onboarded a new contributor to the hydra project (@locallycompact)
    • Joined RareEvo twitter space and continued preparation of hydra master-class

    What are the goals of next week

    • Update & streamline tutorial to work with latest version of hydra-node
    • Remove the internal commit functionality #954
    • Release 0.12.0

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team achieved notable progress in various aspects of the +project. The team updated the use case section for auctions on the /unstable +branch of the website, improving the understanding of Hydras applicability.

    From the development side, the team successfully completed event-sourced +persistence, a key enhancement in the projects architecture which improves +off-chain transaction processing performance. They also added a +submit-transaction endpoint to the API.

    In addition to project-related progress, the team actively engaged in community +reviews for several catalyst proposals related to Hydra and Mithril, +contributing to the wider Cardano ecosystem.

    Finally, the full report for the month of July was also published here.

    What did the team achieve this week

    • Published the monthly report for July
    • Updated the use case section for auctions (published on /unstable branch)
    • Completed event sourced persistence #913
    • Added a submit-transaction endpoint to the API #966
    • Community reviews for several catalyst proposals related to Hydra and Mithril
    • Created a network testing tool (hydra-net) #1006

    What are the goals of next week

    • Update hydra-node to work with cardano-node version 8.x
    • Remove the internal commit functionality
    • Release version 0.12.0
    • Update & streamline tutorial to work with latest version of hydra-node

    · 2 min read
    Sebastian Nagel

    High-level summary

    During this week, the Hydra team achieved significant progress in various areas. +They conducted the monthly review meeting for July, which continously ensures +transparent communication and project evaluation. The team migrated the core +logic of the node to an event-sourced architecture and incremental writes of +events to persistence, enhancing the projects performance and maintainability. +Furthermore, the team added the ability to read protocol parameters via the API +and fixed the CI workflows to support pull requests from forks of external +contributors, streamlining the development process for community involvement.

    What did the team achieve this week

    • Held the monthly review meeting for July (recording)
    • Migrate the core logic of the node to an event-sourced architecture #999
    • Updated persistence to faster incremental writes of events #1000
    • Added ability to read protocol parameters via API #735
    • Fix CI workflows to support pull requests from forks of external contributors #993
    • Updated to GHC 9.2.8 #1005
    • Prepared an updated use cases section on https://hydra.family (published with next release)

    What are the goals of next week

    • Publish monthly report
    • Complete user transaction submission work #966
    • Remove commit from internal wallet (deprecated) #954

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team updated the specification to align with recent +off-chain protocol changes, completed refactoring the snapshot emission +in preparation for event-sourced protocol logic, and updated to GHC +9.2.7, resulting in improved compile times and slightly smaller Plutus +scripts.

    What did the team achieve this week

    • Updated the specification to match the recent off-chain protocol +changes to complete +#728
    • Refactored the snapshot emission logic in preparation for event +sourced protocol logic.
    • Updated to GHC 9.2.7, which led to improved compile times and +slightly smaller plutus scripts.

    What are the goals of next week

    • Monthly review meeting next wednesday and July report
    • Reflect latest information onto our roadmap.
    • Actual implemention of event-sourced persistence +#913.
    • Update the use cases section on https://hydra.family
    • Remove deprecated internal commit +#954.

    · One min read
    Franco Testagrossa
    Sasha Bogicevic

    High-level summary

    This week the team focused on exploring the event sourced persistence in order +to improve hydra-node performance. Because of this work the team noticed we +need to refactor the emit snapshot emission logic and update the spec in the +light of new changes. They also took the time to revisit their goals and product +plans for the next quarter as well as doing some security fixes related to +multisignatures.

    What did the team achieve this week

    • Finished spike about performance improvements of event sourced persistence #963.
    • Refactor snapshot emission in protocol logic.
    • Revisited our roadmap and goals.
    • Prepared and conducated a learning session on lean-waste.
    • Improve security of multi-signature checks, see this Github security advisory.
    • Implemented a cache friendly way to version our binaries #962.

    What are the goals of next week

    • Implement Event sourced persistence #913.
    • Remove deprecated internal commit #954 and close #728.
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/5/index.html b/tags/hydra/page/5/index.html new file mode 100644 index 00000000000..1493f93689c --- /dev/null +++ b/tags/hydra/page/5/index.html @@ -0,0 +1,58 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · One min read
    Franco Testagrossa
    Sasha Bogicevic

    High-level summary

    This week the Hydra team accomplished some nice progress. They secured the +network layer further by implementing authentication of the messages between the +peers in the Head protocol. In the process they also managed to separate +HeartBeat messages from the protocol ones which somewhat improved the quality of +code in Hydra. The team also finished work related to sending only transaction +ids in ReqSn messages, fixed an issue in the smoke tests, and improved benchmark +publishing on the website.

    What did the team achieve this week

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Add new endpoint for submitting client transactions
    • Remove commit from internal wallet

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team wrote and published the monthly report for June, +implemented the end-to-end functionality for external commits, and tested it on +the preview environment. They also listed Hydra as a tool on the Cardano +developer portal, providing more visibility for the project. The team clarified +the path forward for L2 protocol improvements and explored an alternative CI +approach using cabal instead of nix. Additionally, they released version 0.11.0, +marking another milestone in the projects development.

    What did the team achieve this week

    • Written and published the monthly report for June
    • Implemented external commits end-to-end incl. tested it on preview #215
    • Listed Hydra as a tool on cardano developer portal
    • Cleared up path forward on L2 protocol improvements #728
    • Established an alternative CI using more cabal tools #923
    • Release version 0.11.0

    What are the goals of next week

    • Spike on performance improvements of event sourced persistence #913
    • Complete ReqSn only sends transaction ids #728
    • Groom and plan last items for 0.12.0 (remove internal commit)
    • Improve reliability of benchmarks

    · One min read
    Franco Testagrossa
    Pascal Grange

    High-level summary

    This week, the Hydra team shared progress updates during the monthly review +meeting (monthly report and video recording available soon) and started +experimenting on preview network with the new commit from external wallet +feature.

    What did the team achieve this week

    • Monthly report & review meeting, demonstrating commit from external +wallet
    • Published regular benchmarks for +Hydra
    • Moved forward the journey for external commits using multiple script UTxOs +#903
    • Changed the API to only put transaction id in snapshots, instead of the full +transactions #922 -> this +is now evolved into fully addressing #728
    • Fuel marking is now optional as one can now commit from an external wallet +#924
    • Add flag option to display node version on tui +#934

    What are the goals of next week

    • Complete external commits using multiple script UTxOs #903
    • New release 0.11.0
    • Dirtroad solution of improved persistence performance #913

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team focused their efforts on continuing to investigate and +experiment operating a head on mainnet. They collected several bugs and issues +and worked on fixing them. Now the team is soon to release a new version, +0.11.0, which comes with a lot of improvements and bug fixes.

    What did the team achieve this week

    • Restored and fixed a bug which stalled our head on mainnet #927
    • Solved one user issue #914
    • Reduced significantly local state size and logs by removing the full scripts from it #928
    • (pending review) Reduced snapshot size in the API, by only including tx ids #922

    What are the goals of next week

    • New release 0.11.0
    • Monthly report & review meeting.
    • Fix some minor bugs discovered when operating our head on mainnet
    • Complete journey for external commits using multiple script UTxOs #903
    • Publish benchmarks and provide regular benchmarks for Hydra #186

    · 2 min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team worked on multiple fronts. They finished the +investigation about the broken head on mainnet and re-opened their persistent +head instance. The team also fixed the monthly report publication on their +website and started sketching ideas and further improvements. Also, they are on +the last mile to deliver a new feature which will allow parties to commit funds +from extern wallets. Finally the team started to work on optimizing the +performance on their benchmarks.

    What did the team achieve this week

    • Finished investigation on broken head on mainnet #897 and re-opened it.
    • Added support for externally committing regular utxo #887
    • Fix monthly report publication on docs website and published the monthly report. Odd problems when publishing monthly report:
      • Make us think about if we should change something about the website #908
      • Open issue to docusaurus #9036
    • Fixed a bug in the benchmark process #910
    • Explored performance of the hydra-node{.verbatim} and identified a +bottleneck.
    • Timed transaction feature is being used by the auction project 🎉

    What are the goals of next week

    • Complete performance analysis and start/plan improvements and provide +regular benchmarks for Hydra #186
    • Add hydra as tool to developer platform #872.
    • Authenticate network messages #727.
    • Complete journey for external commits using multiple script UTxOs #903
    • Start implementing Option B for external commits #215.
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/6/index.html b/tags/hydra/page/6/index.html new file mode 100644 index 00000000000..429b3f23b38 --- /dev/null +++ b/tags/hydra/page/6/index.html @@ -0,0 +1,60 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · 2 min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team has put their effort on finding solutions on many +different problems, such as our broken head on mainnet +#897, our fragile monthly +report publications on the website and implementing Option A for +external commits #215. +Although most of these items are still open, huge progress has been made. To +accelerate the investigation, they improved their logging to give more precise +errors when a transition requirement fails, and to reduce duplication on effets +logged content. Last but not least, the team is exploring formal methods and +attended a workshop on formalizing cryptographic protocols in Agda.

    What did the team achieve this week

    • Continued investigating broken head and opened an issue to keep track #897.

      As part of this issue, improvements were made to the node logs:

      • Give a precise error when a transition requirement fails #895.

      • Reduce duplication for effects logged content by using sequential eventId and effectId pair #896.

    • Fixed references in the hydra specification #893.

    • Attended a workshop on formal methods and crypto in Agda.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete journey for external commits implementing Option A and start implementing Option B #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.
    • Fix monthly report publication on docs website.

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team accomplished several important tasks. They held their +monthly review meeting and drafted the report for May. They made progress on +implementing the first end-to-end journey for external commits using "Option A" +for normal UTxOs, while still considering "Option B". The team also integrated a +Spanish translation contributed by the community, created micro-benchmarks for +transaction validation and deserialization, and made improvements to +hydra-node's version reporting. Last but not least, they implemented the ability +to commit multiple UTxOs to a head at once.

    What did the team achieve this week

    • Held the monthly review meeting (recording + slides) & drafted the report for May.
    • Have a first end-to-end journey for external commits implementing Option A +for normal UTxOs #887 (still considering Option B).
    • Integrated the spanish translation #866.
    • Created micro-benchmarks for transaction validation and deserialization #884.
    • Improve hydra-node version reporting on non-released builds #849
    • Some minor CI improvements following up last weeks changes.
    • Allow commit transactions with multiple UTxO #774.

    What are the goals of next week

    • Investigate and re-open our team-internal head on mainnet.
    • Improve and provide regular benchmarks for Hydra #186.
    • Complete external commits with script UTxOs #215.
    • Authenticate network messages #727.
    • Add hydra as tool to developr platform #872.

    · 2 min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team has worked on several fronts, including improvements of their CI speed, logs, documentation pages and adding the support for timed transactions. They also updated the "Coding Standards" for the project, improved the troubleshooting page on their website and wrote a section about how to operate a hydra node. Finally the team completed a feature request that allows clients to submit and validate transactions to their hydra nodes using time validity ranges, ensuring isomorphism with L1.

    What did the team achieve this week

    • Complete validation of timed transactions feature #196.
    • Write ops instructions and troubleshooting #569 and improve logs.
    • Remove --ledger-genesis argument to hydra-node options #863.
    • Fix issue with garbage collected caches by using a new cardano-scaling.cachix in more workflows #877.
    • Use nix to build test binaries to increase CI speed #867.
    • Updated our Coding Standards.

    What are the goals of next week

    • Monthly report & review meeting.
    • Have a first end-to-end journey for external commits implementing "Option A" #215.
    • Integrate spanish translation #866.
    • Improve and provide regular benchmarks for Hydra #186.
    • Allow commit transactions with multiple UTxO #774.
    • Explored stateless observation and refined hydra explorer ticket #696.

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team achieved a number of milestones, including the release +of the first mainnet compatible version. Besides this they also addressed +inconsistencies in rollback handling, added an architecture page to the website, +reducing the size of logs using event IDs. They also had productive discussions +with researchers on plans for incremental commits/decommits and had a whiteboard +session on DeFi and lending protocols. The goals for next week include +completing the validation of the timed transactions feature, exploring stateless +observation, refining the Hydra explorer ticket, writing ops instructions and +troubleshooting, and implementing the first end-to-end journey for external +commits.

    What did the team achieve this week

    • Released first mainnnet compatible version 0.10.0
    • Addressed inconsist handling of rollbacks #784
    • Added architecture page and fixed haddock links on our website #838
    • Opened a new hydra head on mainnet
    • Talked with researchers on initial plan for incremental commits/decommits
    • Had a Whiteboard session on DeFi and lending protocols
    • Reduced size of logs using event ids #859
    • Published the monthly report for April

    What are the goals of next week

    • Complete validation of timed transactions feature #196
    • Explored stateless observation and refined hydra explorer ticket #696
    • Write ops instructions and troubleshooting #569 and improve logs
    • Have a first end-to-end journey for external commits implemented #215

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team held their Monthly review meeting and drafted the +report which likely is published next week. They put the spec into the +repository and website, addressed a user issue and fixed the TUI peer list. +Furthermore, they updated dependencies, conducted a Twitter space on Auctions +use cases, covered the rollback bug with tests and implemented a solution. +Looking ahead, their goals for next week include releasing 0.10.0, implementing +timed transactions support, writing a Query API ADR, and grooming work items +like off-chain benchmarks.

    What did the team achieve this week

    • Held the Monthly review meeting and drafted the report (to be published next week)
    • Added the spec into the repository +#693 and published on +the +website
    • Groom and addressed user issue #823
    • Covered the rollback bug with tests and implemented a solution (to be reviewed) #784
    • Fixed the TUI peer list
    • Updated dependencies to match cardano-node master
    • Conducted a twitter space on Auctions use cases

    What are the goals of next week

    • Release 0.10.0
    • Support timed transactions solution drafted and validated API with users
    • Write Query API ADR and groom a concrete step
    • Groom and solve PostTxOnChainFailed UX problem #832
    • Groom off-chain benchmarks idea #186 and turn it into a feature
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/7/index.html b/tags/hydra/page/7/index.html new file mode 100644 index 00000000000..1ce55366b89 --- /dev/null +++ b/tags/hydra/page/7/index.html @@ -0,0 +1,53 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team worked on several fronts, including fixing state +machine continuity on-chain, discussing voting project solutions, exploring +adding Hydra support to kupo, and improving API navigation with a sidebar. The +team also updated dependencies and fixed issues in their test suites. Moving +forward, the team plans to hold the next monthly review meeting, address a user +issue, prepare for the 0.10.0 release, and work on a dirt road fix for the +rollbacks issue with proper test coverage.

    What did the team achieve this week

    • Fixed scripts to enforce state machine continuity on-chain #777.
    • Took part in a twitter space on Scaling Cardano.
    • Joined a CBIA meeting to discuss Cardano network protocols & how to specify them.
    • Discussed potential solutions of ensuring vote uniqueness in the voting project.
    • Updated dependencies to match cardano-node master to prepare for upcoming releases and hard-forks
    • Explored adding Hydra support to kupo, a lightweight Cardano chain indexer - some more work required.
    • Improved navigation of the API Reference with a sidebar, see unstable API version.
    • Fixed two things in our test suites (random port conflicts and an arithmetic underflow in smoke test)

    What are the goals of next week

    • Monthly review meeting (join via Discord or AddEvent) & report
    • Dirt road fix for rollbacks #784 properly covered by a test.
    • Groom and ideally address user issue #823.
    • Put the spec into the repo #693 and prepare release 0.10.0.

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team focused on improving the smoke test, fixing developer +tooling, and improving the API for voting use cases. They reviewed progress on +auction, payments, and voting projects and made worked on reproducing a bug with +handling rollbacks. Moving forward, the team plans to update dependencies, +implement a dirt road fix for the rollbacks bug, and explore adding Hydra +support to kupo.

    What did the team achieve this week

    • Reviewed progress on auction, payments and voting projects
    • Improved smoke tests so they can run on mainnet
    • Fixed a regression in the development environment and updated cardano-node +used in tests
    • Improved API with more configurability to unblock voting use case
      • Exclude utxo in SnapshotConfirmed outputs #808
      • Addressed a user request by only sending Greetings once #813
    • Reproduced the rollback bug by improving our model-based test suite #784

    What are the goals of next week

    • Update dependencies to match cardano-node master
    • Dirt road fix for rollbacks #784
    • Update Hydraw to maintain state locally
    • Explore adding Hydra support to kupo
    • Put disclaimer texts and closing mainnet compatibility feature #713

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team published the monthly report for March, created +separate links for different versions of documentation, and clarified potential +solutions for the Rollbacks bug. The team also discussed Query API requests for +the Hydra Voting project and met with community members to answer questions +about Hydra. Moving forward, the team plans to integrate the specification into +the repository, implement a short-term fix for the Rollbacks issue, and draft a +Query API ADR.

    What did the team achieve this week

    • Published monthly reports on website
    • Separate last released and latest versions of docs (e.g. normal released vs. /unstable)
    • Discussed Query API concerns from Hydra Voting project (link)
    • Clarified rollbacks bug and defined possible solutions (short and long term) #784
    • Met with community members to answer questions about Hydra

    What are the goals of next week

    • Finally get the docs integrated into the repository #693
    • Dirt road fix for rollbacks #784
    • Disclaimer text and detail known issues about mainnet compatibility +#713

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra continued work on finishing mainnet compatibility. The +semi-automated smoke tests and some missing documentation is still preventing +from calling that fully done. They fixed smaller issues and made a step in the +Head protocol more robust. Besides development, they met with interested people +from the community who want to get started collaborating on communication and +marketing materials.

    What did the team achieve this week

    • Groomed and followed-up on GetUTxO user request discussion #797
    • Fixed hydra-node crashes after forks #560
    • Made collectCom more robust and aligned with spec #786
    • Completed configurable API feature #380
    • Met potential contributors about Hydra communication and marketing materials
    • Versioned documentation: we have a unstable bleeding edge version available as well now, seperate from the last released version

    What are the goals of next week

    • Follow-up backlog and roadmap clean-up
    • Complete mainnet compatibility feature #713 (documentation updates)
    • Integrate Hydra specification into repository #693

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra had a team workshop and conducted the monthly review +meeting for March. They demonstrated a Hydra Head on mainnet, which was running +the hydraw demo application. While this marks an important milestone, they also +emphasized that more features are still to be added as needed for applications +to run on Hydra. Besides this, the roadmap is getting cleaned up to encourage +discussions and provide more space for user requests.

    What did the team achieve this week

    • Monthly review meeting slides/recording, full report of March next week
      • Opened a head on mainnet with hydraw demonstration
      • Hydra pay updates
    • Team workshop in Austria
      • Hydra presentation at the Cardano Foundation in Zurich
      • In-person grooming session, marked many items as candidates to be rather :idea: dicussions
      • Improved head protocol #786 and investigated a potential bug in rollback handling #784
      • Team building and retrospective

    What are the goals of next week

    • Follow-up on backlog and roadmap clean-up
    • Complete mainnet compatibility feature (documentation updates)
    • Make API more configurable #380
    • Integrate Hydra specification into repository #693
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/8/index.html b/tags/hydra/page/8/index.html new file mode 100644 index 00000000000..a6d917e72b2 --- /dev/null +++ b/tags/hydra/page/8/index.html @@ -0,0 +1,66 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has continued work on the mainnet compatibility of the +hydra-node. They added a golden test suite for hydra-plutus scripts, added +some detection of hydra-node misconfiguration, established a limit of 100 ADA +per commit and other smaller tasks to prepare for a mainnet beta release.

    Next week there will be a small team workshop to push for demonstrating a Hydra +Head on the Cardano mainnet, ideally just in time for the monthly review +meeting. See the hydra channels on the IOG Technical Community discord server +for details.

    What did the team achieve this week

    • Implement a 100 ADA hard-coded commit limit in the hydra-node +#763
    • Pay back funds to faucet after smoke-test run +#773
    • Setup custom github runner for smoke-tests on mainnet +#775
    • Created golden tests to assure the script hash stays the same between +changes #772
    • Removed hardcoded error codes in plutus scripts +#768
    • Detect misconfiguration of a hydra-node given persistent state +#767
    • Met with potential users for hydra-pay
    • Prepared hydra workshop

    What are the goals of next week

    • Hydra monthly meeting
    • Open a multi-party head on mainnet
    • Complete mainnet compatibility feature

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team addressed issues with committing complex UTxOs into a +Hydra Head, prepared the hydra-node to be run on mainnet (soon) and improved +the test suite of the hydra-plutus scripts. The specification is constantly +getting improved upon reviewer feedback on overleaf - this week the graphical +notation was refined to be more transaction-focused.

    What did the team achieve this week

    • Clarified bug of committing UTxOs with reference scripts to a Hydra head #737
    • Prepare usage of hydra-node on mainnet by updating command line options #715
    • Improved our mutation test suite to all expected errors #705
    • Re-opened our persistent hydraw demo head on preprod using version 0.9.0
    • Updated on-chain graphs to be more transaction-focused in the specification

    What are the goals of next week

    • Complete mainnet compatibility feature
    • Prepare the Hydra workshop
    • Address all todo’s in the Hydra specification
    • Unblock the auctions project with commit from script a solution

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team released version +0.9.0 - a version +of the hydra-node with fully specified behavior of on-chain scripts and +off-chain head-logic, decreased costs for opening/closing a Head and scalable +contestation deadline semantics. Check out the full release notes for details.

    Furthermore, they published the monthly +report of the Hydra project +and conducted a review meeting with an increasingly wider audience. The team +plans to extend invitations through the new Hydra +#announcements discord channel for the next +months, stay tuned!

    What did the team achieve this week

    • Monthly review meeting with report published on website
    • Fixed smoke tests #726
    • Reduced the cost of opening/closing a Head (error codes #748 + head reference script #701)
    • Released version 0.9.0
    • Conducted a first experiment on mainnet compatibility #713
    • New discord category with #announcements channel
    • Received a demo about the Hydra for Voting project
    • Lightning talk on mutation-based testing (to be shared)
    • New themes view in on our roadmap and some rearranging as we align it with high-level objectives
    • Clarified things with researchers, but mostly identified action items for them

    What are the goals of next week

    • Redraw transaction graphs and address TODOs specification
    • Run hydraw with 0.9.0 on preprod
    • Make smoke tests on mainnet possible
    • Groom the explorer item
    • Unblock the auctions projecth with commit from script a solution

    · One min read
    Franco Testagrossa

    High-level summary

    This week, the Hydra team continue closing many gaps and aligning the +implementation with the specification. More over, they have groomed a plan to +make Hydra Mainnet compatible. Also, they continue moving forward with the +internal auditing and have published some auditing guidelines to receive +contributions from the community.

    What did the team achieve this week

    • Completed #452 (what is +remaining in there)
    • Aligned the Head protocol logic implementation with the specification
    • Completed full minting policy implementation and spec +#720
    • Clarified message authentication with researchers
    • Groomed what is left to do for Mainnet compatibility +#713 and drafted a +0.10.0 version
    • Added a tutorial by @perturbing to the +website LINK
    • Published auditing guidelines +LINK
    • Made hydra-node work for macos +#746 and added support +for building on aarch64 +#673
    • Met with a potential customer of Hydra for Payments

    What are the goals of next week

    • Have the monthly review meeting incl. the report
    • Have smoke tests fixed and running regularly
    • Release 0.9.0 with updated scripts
    • Redraw transaction graphs for specification

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team completed work on dealing differently with contests +during the contestation period. These will now always push out the deadline and +hence contestation periods are easier to pick (depending on the network a Head +runs on). Furthermore, they added an important acceptance test and completed +internal refactoring of the protocol logic making future changes easier.

    What did the team achieve this week

    • Push contestation deadline on each contest #716
    • Wrote an acceptance (property) test can always close/fanout when collect is successful
    • Internal refactoring of our HeadLogic
    • Groomed remaining things from #452 into dedicated features

    What are the goals of next week

    • Complete full minting policy #720
    • Release 0.9.0 with updated scripts
    • Plan mainnet milestone and a 0.10.0 version
    • Redraw transaction graphs for specification (upon feedback)
    • Have smoke tests fixed and running regularly
    + + + + \ No newline at end of file diff --git a/tags/hydra/page/9/index.html b/tags/hydra/page/9/index.html new file mode 100644 index 00000000000..df57062e7f0 --- /dev/null +++ b/tags/hydra/page/9/index.html @@ -0,0 +1,66 @@ + + + + + +55 posts tagged with "hydra" | Cardano Development Updates + + + + + + + + + + + + +
    +

    55 posts tagged with "hydra"

    View All Tags

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team closed several gaps to align the Hydra scripts +implementation further with the specification. This also resulted in a slight +improvement on Hydra script size and costs. They consequently analysed the +asymptotic complexity of collect and fanout and how they relate. Also plutus-tx +profiling toolchain was evaluated and set up for future improvements on Hydra +on-chain performance. In discussions with researchers and internal auditors, +they also uncovered next steps on further securing the Head protocl using a +"full" minting policy.

    What did the team achieve this week

    • Closed several gaps to align script implementation with specification #452
      • Allow contest only once #680
      • Optimization through head output at index 0 #700
      • Value is preserved #702 + optimized exact value equality #709
    • Analysed asymptotic complexity of some of our scripts and set up profiling toolchain to #721
    • Fixed our tooling around the Haskell language server
    • Discussed full minting policy with researchers
    • Started grooming “what we need for mainnet” on this idea ticket and milestone

    What are the goals of next week

    • Implement full minting policy
    • All remaining protocol discrepancies are implemented or groomed as individual features
    • Ideally release 0.9.0 with updated scripts
    • Discuss what we need for mainnet (milestone planning)
    • Redraw transaction graphs for specification (upon feedback)

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team completed the Hydra specification with a section about +rollbacks and updated graphs +(#448). In a next step, +the specification will be made more approachable and an open standard. They +improved their hydra-cluster tool to launch a local --devnet sandbox +environment and continued aligning the hydra-plutus scripts with the +specification by hardening the checks on close and contest transactions.

    What did the team achieve this week

    • Completed the specification with a section about rollbacks and updated graphs +#448, with a follow-up on making it more approachable and an open standard.
    • Continued spec review with internal auditor and incorporated changes.
    • Talked to TxPipe about how Demeter and Hydra could work together
    • The hydra-cluster executable can be used to launch a local --devnet sandbox environment.
    • Reproduced the “head being stuck on network outage” bug
      • relates to what liveness guarantees we can / want to give on the protocol level and needs to be discussed.
    • Progressed with higher velocity by addressing more and more gaps #677

    What are the goals of next week

    • Upstream our JSON instances to the ledger
    • Close all transaction security related on-chain gaps
    • Ideally release 0.9.0 with updated scripts
    • Groom & plan (or not) protocol changes yielded from specification discussions -> updated roadmap

    · One min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team had a monthly review meeting with their stakeholders, +contributors and interested people from the community. The monthly repot for +January 2023 is a digest +of the things presented and also includes a summary of the meeting. The Hydra +specification was getting discussed and the team is incorporating suggested +changes of reviewers. Last but not least, they compute and publish script +information on every PR and also on the +website +now.

    What did the team achieve this week

    • Had the monthly review meeting with a broader audience
    • Published the monthly report for January 2023
    • Reviewed the spec and discussed individual aborts with researchers
    • Compute and publish script information along benchmarks on every PR and website

    What are the goals of next week

    • Add rollback section to Hydra spec, update pictures and publish it as part of repository
    • Discuss bigger spec findings (full minting policy, individual aborts, split fanout) as change/pull requests on the spec in the repository.
    • Groom & plan actions required for a maintainable Head explorer + break down align gaps feature.

    · 2 min read
    Sebastian Nagel

    High-level summary

    This week, the Hydra team has been focusing on the write-up of the Hydra HeadV1 +specification. Of which a first version has been aggregated and is currently +under review. They aligned the on-chain scripts of reimbursing funds on abort +like defined in the specification, improved the mutation test framework to have +more control when testing plutus scripts. The added HeadId in the API and the +TUI example client make hydra-node easier to use and a first experiment of a +Hydra Head explorer was showing the utility of this - see what Heads exist on +the preview network here.

    What did the team achieve this week

    • HeadId to API and display in the TUI #678
    • Experiment of creating a hydra explorer, first result hosted here
    • Improved mutation framework allowing to fail for the right reason #679
    • Correctly reimburse funds in abort (matching the spec) #670
    • Finished a first write-up of the Hydra HeadV1 spec: Read it on overleaf (Communication channels for feedback)

    What are the goals of next week

    • Monthly review meeting with a broader audience
    • Groom & plan actions required for a maintainable Head explorer
    • Break “align gaps” feature into smaller chunks (at least on- /off-chain) and groom it
    • Review the spec & discuss individual aborts with researchers (a bigger open question)

    · 2 min read
    Sebastian Nagel

    High-level summary

    Since last weekly update before christmas, the Hydra team worked on the +technical specification, closed gaps in hydra-plutus scripts, made the unique +headId available to Hydra clients through the API, allow the hydra-node to +explicitly synchronize from genesis (if configured), and fixed smaller log and +build issues reported by new users.

    Besides this, a retrospective blog +post +was published by Matthias Benkort (CF) on Hydra, summarizing our progress made +in 2022 also an outlook where Hydra is headed for in 2023. Also, the team had +some first sessions on the voting project with Catalyst and the CF.

    A full digest monthly digest for December 2022 can be found on the hydra +website.

    What did the team achieve this week

    • Had some first sessions on the voting project with Catalyst and CF
    • Published retrospective blog +post +by Matthias Benkort (CF) on Hydra, summarizing our progress made in 2022 also +an outlook where Hydra is headed for in 2023.
    • Worked on the LaTeX spec for HydraHeadV1, not final or published yet - latest +version in this repository.
    • Add unique headId to API and hence make it available to clients.
    • Allow hydra-node to explicitly synchronize from genesis using --start-chain-from 0.
    • Closed gaps in hydra-plutus scripts
      • bounded transaction validity (ADR21)
      • enforcing contract continuity via state token in output
    • Fixed JSON for some logs and smaller build issues reported by new users.

    What are the goals of next week

    • Reach out to have hydra-tutorial integrated.
    • Plan the next couple of months.
    • Complete checking reimbursing of commits in head validator.
    • Align plutus scripts to spec and simplify them (identified some simplifications)
    • Improve mutation framework to be sure we fail tests for the right reasons
    • Complete the spec except the open points (<5) and also discuss them with researchers.
    + + + + \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 00000000000..94b12bb1912 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,24 @@ + + + + + +Tags | Cardano Development Updates + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tags/ledger/index.html b/tags/ledger/index.html new file mode 100644 index 00000000000..123d87393d2 --- /dev/null +++ b/tags/ledger/index.html @@ -0,0 +1,51 @@ + + + + + +30 posts tagged with "ledger" | Cardano Development Updates + + + + + + + + + + + + +
    +

    30 posts tagged with "ledger"

    View All Tags

    · 2 min read
    Alexey Kuleshevich

    High level summary

    This period we reached a major milestone, namely we now have an initial version of Conway +conformance testing working. We are now able to generate random valid data with the help +of constraint based testing framework, apply that data to Conway Ledger rules and verify +that the output matches to the one produced by the executable version of the Formal Ledger +Specification, when it is applied to the same random data.

    We also had a couple of Conway bugs fixed and a few new predicate check implemented. Get +Constitutional Committee query is complete and tested. Various improvements to the +testing tools. Addition of more test cases.

    Low level summary

    Conway

    • pull-3888 - Add checks for valid ProtVer when a proposal is a HardFork
    • pull-3902 - Fix pvCanFollow usage in Conway and improve clarity in Shelley
    • pull-3855 - Remove unreachable proposals
    • pull-3903 - Add lenient decoder for Addr
    • pull-3878 - Committee query - implement next epoch change

    Testing

    • pull-3893 - Move tree-diff dependency to tests together with all instances
    • pull-3896 - Fix Brute force failure
    • pull-3904 - New ListWhere Pred added to the Constrained Solver.
    • pull-3907 - cardano-ledger-conformance: Remove CHANGELOG.md from cabal file
    • pull-3883 - Committee QuerySpec Imp Test
    • pull-3909 - Make impAnn a bit more useful, by making the logs scoped by impAnn
    • pull-3908 - Use upstream testing instances for very basic types
    • pull-3912 - Removed call to tail, and the 'watchPulser' test
    • pull-3852 - Added constrained generators to conformance tests - Part 1

    Improvements and releasing

    · 2 min read
    Alexey Kuleshevich

    High level summary

    Last two weeks progress was mainly on testing, bug fixes and improvements to clarity of +CDDL specification. Important bugfixes include:

    • Fix deserialization of ValueNotConservedUTxO predicate failure that could not +previously report zero ADA.
    • Fix deserialization of CostModels in the PParamsUpdate. Invalid CostModels are no +longer allowed, only CostModels for unrecognized Plutus versions are allowed starting +with Conway
    • Fix returning of Deposits for ProposalProcedures

    Testing tooling has been improved and new tests have been implemented for Conway era.

    Low level summary

    Conway

    • pull-3858 - Restructure computing Refunds and Deposits in a TxBody across all eras
    • pull-3860 - Removed mock/crypto.cddl, added optional tag to sets
    • pull-3864 - Fix Proposal deposits and add deposit tests to imp tests
    • pull-3859 - Rename ProposalsSnapshot to Proposals
    • pull-3867 - MaryValue fixes
    • pull-3869 - Indicate that tag 258 is optional for OSet. Fix rational CDDL
    • pull-3863 - Improve deposits refunds re-usability
    • pull-3861 - Fail PParamsUpdate deserialization for invalid costmodels in Conway
    • pull-3875 - Fix cddl spec for CostModels in Conway
    • pull-3876 - Change 4 PParam fields from EpochNo to EpochInterval
    • pull-3884 - Relax requirement on the Set tag 258 to be enforced in the next era

    Testing

    • pull-3868 - Improvements to support property tests on Traces with simple Tx with DRep related Certs
    • pull-3792 - RATIFY and GOV constraint tests
    • pull-3885 - Added a test for genTxAndNewEpoch
    • pull-3886 - QuickCheck Imp integration

    Improvements and releasing

    · 6 min read
    Kevin Hammond

    High level summary

    We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

    Initial CIP-1694 Security Analysis and Responses

    Section: The constitutional committee


    • “For example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

    There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


    Section: Size of the constitutional committee


    • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

    Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


    Section: Terms


    • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

    Thanks. Yes, that suggestion is a bit easier to read.


    Section: Registered DReps


    • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

    Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


    Section: Ratification


    • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

    These correspond exactly to the groups that are administered by the Parameter Committee.


    • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

    Yes, it’s not about harming the system, since Info +actions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

    Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


    Section: Content


    • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

    Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


    Section: Protocol Parameter groups


    • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

    These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


    • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

    All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


    Section: Votes


    • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

    They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


    Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


    • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

    There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


    Section: Changes post Edinburgh workshop (July 2023)


    • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

    It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


    Section: Reduced deposits for some government actions


    • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

    Indeed. We have no plans for this at the moment.

    · 3 min read
    Alexey Kuleshevich

    High level summary

    This update contains mostly improvements to quality of Conway era implementation and +tooling that we use for testing Ledger. Major Conway bugs that were discovered and +squashed are:

    • PParamsUpdate proposals will now correctly use DRep thresholds for ratification
    • Treasury withdrawals are now properly enacted.
    • Corrected snapshotting and DRep Stake Distribution Pulser initialization
    • Delegation to non-existent Stake pool is no longer possible

    Other important quality of life improvements are addition of reusable interfaces for an +ordered set OSet and ordered map OMap. Which allowed us to disable duplicate +certificates and proposals in a transaction. As a precursor to PlutusV3 integration, a +serious reorganization of Plutus related functionality was performed.

    Conway related additions that are noteworthy: Conway Ledger events, disallowing voting on +expired proposals, addition of Anchor to Constitutional Committee resignation proposals.

    Significant improvements have been made to a specialized "Imp" test library that allows us +writing concise stateful unit tests for verifying the Ledger logic. Serious progress has +been made on the conformance testing, where we can now interface with Haskell generated +code from the Agda specification. Serialization testing has been extended to increase +binary conformance coverage.

    Low level summary

    Conway

    • pull-3808 - Enhance CommitteeMembersState query to return quorum and NoConfidence
    • pull-3801 - Fix epoch rule and tests
    • pull-3803 - Fix delegation validation
    • pull-3759 - Reshuffle things to the DRepPulser incorporates some snap shot things
    • pull-3779 - Prevent duplicate certs and proposals
    • pull-3794 - Added anchor to resign certs
    • pull-3797 - Cleanup JSON instances for Conway governance
    • pull-3848 - Plutus modules restructure
    • pull-3840 - Fix anomalies in Deposits in the Conway Era
    • pull-3856 - Add governance related ledger events
    • pull-3825 - Prevent voting on expired GovActions
    • pull-3831 - Treasury withdrawal fix
    • pull-3791 - Use a Data.OMap.Strict to replace ProposalsSnapshot
    • pull-3836 - PParamsUpdate enactment fix
    • pull-3846 - Revert argument order swap.

    Testing

    • pull-3782 - Move ImpTest to Shelley testlib
    • pull-3842 - Imp improvements
    • pull-3844 - Add mappings to Agda types
    • pull-3853 - Fix strange assertion failure, which hides real Block too big problem.
    • pull-3809 - CDDL roundtrip testing
    • pull-3832 - Treasury withdrawals tests
    • pull-3839 - Added cardano-ledger-conformance
    • pull-3841 - Add sha256 to cardano-ledger-executable-spec

    Improvements and releasing

    • pull-3843 - Add ...WithLogs versions of evalScripts and friends
    • pull-3795 - Bump plutus to 1.15
    • pull-3798 - Bump urllib3 from 1.26.17 to 1.26.18 in /doc
    • pull-3799 - Changes needed for 8.6 release
    • pull-3807 - Add invalidBeforeL and invalidHereAfterL functions
    • pull-3819 - Fixups needed for a release
    • pull-3829 - Post release CHANGELOG version bumps
    • pull-3830 - Bump aeson to 2.2
    • pull-3833 - Backport release cardano-ledger-conway-1.10.1.0
    • pull-3828 - Add changelog for node release 8.6

    · One min read
    Alexey Kuleshevich

    High level summary

    The Ledger team has been shifting focus from implementing Conway related features to +testing. For this reason there is a very little amount features that are reported this +time aorund. Notable Conway related changes are a specialized ledger query for getting +Constitutional Committee state and prevention of submitting proposal procedures that have +no valid path to enactment.

    Testing related work was mainly on a constraint base system as well as on roundtrip +serialization. As a result of this extra testing a bug in Conway Genesis serialization +was eliminated.

    Low level summary

    Conway era

    Integration and releasing

    Testing

    • pull-3769 - Add roundtrip testing by validating FlatTerm
    • pull-3783 - Update TranslationInstance.hs
    • pull-3775 - Refactor and improve constraint based STS tests
    • pull-3793 - Fix sums with negative RHS.
    + + + + \ No newline at end of file diff --git a/tags/ledger/page/2/index.html b/tags/ledger/page/2/index.html new file mode 100644 index 00000000000..a09a33d8d62 --- /dev/null +++ b/tags/ledger/page/2/index.html @@ -0,0 +1,46 @@ + + + + + +30 posts tagged with "ledger" | Cardano Development Updates + + + + + + + + + + + + +
    +

    30 posts tagged with "ledger"

    View All Tags

    · 3 min read
    Alexey Kuleshevich

    High level summary

    Few important Conway related features were completed in this two week period:

    • Constitutional Committee was the last missing Conway related entity that has now been +fully implemented.
    • Treasury withdrawals governance actions have been fixed and now behave as expected.
    • Current treasury amount supplied in the transaction is now enforced by the rules.
    • DRep's expiry is prevented by delaying the expiry for all DReps whenever there are no +proposals to vote on.
    • Semantics of how CostModels are updated with Protocol Parameters have been changed to +allow for individual Plutus language version updates, rather than requiring a complete +replacement of all CostModels

    Besides the new features there were also important performance and testing improvements:

    • In particular stake distribution computation and native script handling received some +optimizations.
    • New testing DSL has been implemented that drastically simplifies writing unit tests for +ledger rules.
    • Integration tests and benchmarks are now possible for Conway era because of the overhaul +of functionality for initial funds and staking injection whenever node starts up in +Conway, while bypassing all previous eras.

    Low level summary

    Conway era

    • pull-3729 - DRep expiry update after a contiguous set of epochs with no proposals to vote on
    • pull-3739 - Rename some PParams to be consistent with Agda specification
    • pull-3743 - Move DRepDistr from VState to ConwayGovState
    • pull-3746 - Implement tcTranslationContextL for Shelley
    • pull-3737 - Implement EraTransition
    • pull-3749 - Add predicate failure: current treasury value mismatch in LEDGER
    • pull-3748 - Apply enacted treasury withdrawals
    • pull-3745 - Constitutional Committee Ratification
    • pull-3763 - Plutus interface improvements
    • pull-3771 - Changed how costmodel updates are applied
    • pull-3766 - Prevent updating protocol version with PParamUpdate

    Performance

    • pull-3765 - Improve native script handling
    • pull-3747 - Use (CompactForm Coin) in IncrementalStake, DRepDistr (and other places) instead of Coin
    • pull-3758 - Cardano-Perf regression: UMap.size regression fix
    • pull-3754 - Use Alonzo-style TxOut encoder when possible

    Releasing

    • pull-3742 - Update fourmolu, ghcid and hls. Update haskellNix and iohkNix flakes
    • pull-3744 - Changelog 8.4
    • pull-3752 - Patch release of cardano ledger conway 1.8.1.0
    • pull-3753 - Minor cleanup and changelog entries
    • pull-3760 - Fixup issues for release
    • pull-3764 - Bump plutus deps to 1.13

    Testing

    • pull-3734 - Removed Shaped instance for Rep
    • pull-3735 - Simplify the implementations of hasOrd and hasEq
    • pull-3728 - STS tests based on constraints
    • pull-3714 - Implement the remaining upgradable families
    • pull-3733 - Add some unit tests for Conway features
    • pull-3762 - Update CDDL for praos headers.

    · 2 min read
    Alexey Kuleshevich

    High level summary

    The Ledger team's focus is still mainly on the Conway era implementation.

    We were able to add ability to specify initial Constitutional Comittee and the initial +version of Constitution. Priority in which Governance Action are now enacted matches the +specification. DRep's deposits are now properly accounted for. Governance actions that are +not allowed to be voted on by Stake Pool operators and Constitutional Committee members +are prevented by transaction submission failure, rather than simply being ignored. There +was a few important CDDL fixes as well as a lot of new round trip serialization +tests. Constraint based testing framework has also received a lot of improvements.

    Low level summary

    Conway era

    • pull-3681 - Conway Genesis additions
    • pull-3690 - Preserve the order of ProposalProcedures
    • pull-3705 - Removed ProtVer from EnactState
    • pull-3700 - Add conway-specific certs to deposit/refunds
    • pull-3704 - Add comments on deprecating certs to Conway CDDL
    • pull-3698 - Reordering of governance actions
    • pull-3712 - Disallow empty fields in ConwayTxBodyRaw
    • pull-3716 - Abstract threshold calculation
    • pull-3725 - Fix mistaken use of dollar sign in cddl files
    • pull-3718 - Predicate failure for mismatched Voter GovAction
    • pull-3721 - Committee expiration, validation and modification

    Improvements and releasing

    Testing

    • pull-3730 - Implement Show instance for Rep using IsTypeable
    • pull-3697 - Rewrite testEql using Typeable to make it impossible to forget cases
    • pull-3709 - Add many new features to the Constrained modues in cardano-ledger-test
    • pull-3726 - Conway and other eras serialization roundtrip tests
    • pull-3713 - Improve CI resiliency against GitHub issues

    · 2 min read
    Alexey Kuleshevich

    High level summary

    Broadly speaking the Ledger team focused on a few main areas of Conway era:

    • Creation of voting state snapshots in order to correctly delay ratification for one epoch
    • Validation of the Governance Actions sequencing and ordering
    • Proper expiry of DReps and Proposal Procedures
    • Expanding Conway Genesis functionality
    • Utilization of some of the new Protocol Parameters in ledger validation rules

    Low level summary

    Conway era

    • pull-3659 - Validate Network for ProposalProcedure and TreasuryWithdrawal
    • pull-3637 - Avoid using sequence of tuples, by adding GovActionId to GovActionState
    • pull-3651 - Inactive DReps
    • pull-3664 - Track proposal expiry
    • pull-3668 - Add min committee size predicate to NewCommittee
    • pull-3669 - Add Proposal deposit check against PParam
    • pull-3676 - Fix inactive PoolStake not counting as Drep Stake
    • pull-3635 - Make snapshots of GovActionsState
    • pull-3670 - Validate previously enacted govAction
    • pull-3694 - Improve error reporting on the positive coin decoder
    • pull-3674 - Added RATIFY thresholds
    • pull-3684 - Add proposal delaying, remove predicate failure from ENACT
    • pull-3688 - DRep Refunds and update evalTransactionBalance

    Improvements and releasing

    • pull-3677 - Minor patch that fixes the DRep distribution computation
    • pull-3686 - Post patch release fixup
    • pull-3695 - Changelog for cardano-node-8.3 release
    • pull-3683 - Add two new bench mark programs

    Testing

    · 2 min read
    Alexey Kuleshevich

    High level summary

    The ledger team made great progress in advancing Conway era forward. In particular, voting +for DRep and Stake Pool Operators is now at the state that can be used by downstream +components. Addition of new ledger state queries makes it possible to verify changes to +the governance state, such as placement of votes, submission of governance proposals, +inspecting DRep stake distribution and more. Addition of treasury withdrawals concludes the +ability to enact all of the governance actions, except for the hard fork initiation.

    Low level summary

    Conway progress

    • pull-3577 - Move PParams to GovState
    • pull-3609 - Adjust thresholds for sanchonet
    • pull-3604 - README: update CIP-1694 link
    • pull-3616 - Switch TreasuryWithdrawals to use RewardAcnt
    • pull-3599 - Add governance action well-formedness check
    • pull-3607 - Rename governance to gov
    • pull-3601 - Added DRep anchors
    • pull-3615 - Add optional previous GovActionId in some ProposalProcedures
    • pull-3596 - Upgradeable families
    • pull-3625 - Change constitution to use Anchor
    • pull-3592 - Added pulsing incremental computation of the DRep distribution
    • pull-3523 - Treasury donations
    • pull-3633 - Prevent state changes on phase2 failure
    • pull-3634 - Disable serialization of protocolVersion param update
    • pull-3630 - Implemented DRep refreshing
    • pull-3640 - Remove crypto parameterization from AnchorData
    • pull-3636 - Implement DRep ratification with an "always passing"; threshold
    • pull-3648 - Governance queries
    • pull-3650 - Change environment for ShelleyPOOLREAP rule
    • pull-3658 - Set DRep ratify threshold to 51%
    • pull-3628 - DELEG, POOL, GOVCERT conformance with Spec v0.8

    Testing

    Improvements and releasing

    • pull-3660 - Fix bounds and versions
    • pull-3661 - Adjust versions, bounds and CHANGELOGs to account for the latest release

    · 2 min read
    Alexey Kuleshevich

    High level summary

    The ledger team was working almost exclusively on the Conway era implementation. In +particular, the main focus was directed towards solidifying transaction related types and +their binary representation. We also directed some effort into unblocking Plutus team with +respect to PlutusV3 integration.

    Low level summary

    Conway progress

    • pull-3552 - Allow Constitutional Committee Hot Key to be ScriptHash
    • pull-3581 - Make Constitutional Committee Cold Key to be ScriptHash
    • pull-3571 - Implement a portion of the TICKF rule.
    • pull-3556 - Add Script to Constitution
    • pull-3576 - Add optional Anchor to ConwayRegDRep certificate
    • pull-3495 - Implement refund logic for Proposal deposits
    • pull-3579 - Change voting procedure in the transaction to a nested Map
    • pull-3585 - Rename CommitteeCert into a GovCert
    • pull-3587 - Remove DelegStakeTxCert from the COMPLETE pragma for TxCert
    • pull-3586 - Add CurrentTreasuryValue to TxBody
    • pull-3588 - Rename key roles
    • pull-3557 - Update NewCommittee action to use RewardAcnt and add more info
    • pull-3595 - Add ConwayUpdateDRep constructor to ConwayTxCertGov type
    • pull-3600 - Filter out zero TxOuts on Byron/Shelley boundary instead of Babbage/Conway
    • pull-3597 - Update ProposalProcedure return address to be a RewardAcnt

    Testing

    • pull-3374 - New features for generation subject to constraints
    • pull-3519 - Basic Conway features test

    Bugfixes

    Plutus integration

    • issue-3538 - A fairly complete specification was created for the PlutusV3 context
    • pull-3593 - Conway TxInfo for PlutusV3 is now compatible with all pre-Conway functionality

    Improvements and releasing

    • pull-3574 - Improve clarity and performance of collateral Non-ADA validation:
    • pull-3573 - Update top-level CHANGELOG.md with cardano-node relevant changes
    • pull-3555 - Bump pygments from 2.12.0 to 2.15.0 in /doc
    • pull-3575 - Bump certifi from 2022.12.7 to 2023.7.22 in /doc
    • pull-3567 - Backport mint field translation bugfix
    • pull-3568 - Fixed typo in byron ledger spec
    • pull-3572 - Release/backport tickf bugfix
    + + + + \ No newline at end of file diff --git a/tags/ledger/page/3/index.html b/tags/ledger/page/3/index.html new file mode 100644 index 00000000000..52342968212 --- /dev/null +++ b/tags/ledger/page/3/index.html @@ -0,0 +1,50 @@ + + + + + +30 posts tagged with "ledger" | Cardano Development Updates + + + + + + + + + + + + +
    +

    30 posts tagged with "ledger"

    View All Tags

    · 2 min read
    Alexey Kuleshevich

    High level summary

    Our focus was on planning and implementing Conway features that we would like to see deployed and running on Sanchonet. +All members of the ledger team participated in the CIP-1694 workshop and had an in-person meeting, where we discussed plans forward for the Conway era. +We also investigated some transaction validation issues that occurred on preview with the latest node (for 8.2 release). +Additionally, we did some preparatory work that will help us define the types we need for Plutus V3 and integrate with the new version when it will become available. +We also made progress on the constraint-based generators, which can now generate valid transactions and ledger states.

    What we achieved

    • [pull-3521] [pull-3554] Improved Governance model (GovernanceProcedures, ProposalProcedure)
    • [pull-3520] Improved Governance-related naming (Renamed Tally to Gov and VDel to GovCert )
    • [pull-3531] Refactored and simplified code interacting with Plutus
    • [pull-3558] Fixed a bug that was breaking validation on preview, related to refernce inputs witnesses. We backported and released the fix.
    • [pull-3550] For Conway to run on Sanchonet, we updated the era Translation to remove zero-ADA outputs. This was necessary because such outputs exist on mainnet, but in Conway they are not allowed.
    • [pull-3551] [pull-3546] [pull-3472] Updated tools and added some small improvements
    • [issue-3146] [pull-3498] Introduced Conway protocol parameters
    • [issue-2948] [pull-3499] Implemented ConwayGenesis with the new protocol parameters

    What is currently in progress

    · 2 min read
    Jared Corduan

    High level summary

    The ledger team made progress on the conway ledger era. In particular, the design and implementation +of the new certificates is near complete, we refactored some of our data structures +to be able to support DReps, we cleaned up the serialization format, and renamed things to make +clearer the differences with Shelley.

    The team also completed integration work for the next node release, namely 8.1.0. +And, as always, we continue to address technical debt.

    Low level summary

    Conway progress

    • pull-3408 - Improve conway delegation certificates
    • pull-3428 - Get rid of Constitutional in favor of Genesis and Committee
    • pull-3426 - Add DRep to internal data struture (UMap)
    • pull-3425 - Improve witness logic needed for conway
    • pull-3423 - Rename ShelleyDelegCerts constructors to distinguish them from Conway
    • pull-3421 - Rename DCert -> TxCert
    • pull-3454 - conway CDDL minor fixes

    Improve testing

    • pull-3403 - Add Plutus script context golden tests

    Integration work

    • pull-3410 - Update chaps index
    • pull-3416 - Bump cardano-ledger-alonzo-test version
    • pull-3414 - Bump cardano-ledger-shelley-test minor version
    • pull-3420 - Bump cardano-ledger-shelley-ma-test version
    • pull-3441 - Release cardano-ledger-[alonzo|babbage]-1.2.1

    Technical debt

    • pull-3409 - Unit test - no such thing as a reference datum
    • pull-3407 - Fixup release process documentation
    • pull-3404 - Create TotalDeposits events during all eras
    • pull-3402 - Fix broken references in the Shelley spec
    • pull-3424 - Remove no longer used cardano-ledger-shelley-ma package
    • pull-3432 - Add an example on how to bump up versions in the changelog
    • pull-3440 - Revert back to the group serialization for ProtVer for PParams

    · 2 min read
    Jared Corduan

    High level summary

    The ledger team focused mainly on the conway ledger era and node integration. +For conway, we completed a large structural change that now allows +for delegation certificates to be parameterized by era, and introducing +new certificates for the first time since Shelley. +We also continue to build out our contraint based generators that we will +use to property test the conway era. +In particular, we can now generate an entire ledger state and a +transaction which is balanced with respect to the ledger state.

    Low level summary

    Conway certificates

    Certificiates are now abstracted as a type family in the ledger codebase. +Moreover, there are new certificates in the Conway era to support CIP-1694, +and MIR certificates have been removed.

    Constraint based testing

    Our plan for property testing in the conway era is to no longer use the trace generators, +but instead generate ledger states and transactions based on constraints. +We hit a milestone this week, namely the ability to generate a balanced transaction in the context +of a ledger state, all based on our ever growing constaint language.

    Integration work

    Technical debt

    · One min read
    Jared Corduan

    High level summary

    We continued to make progress on CIP-1694 and the conway ledger era. +In particular, the conway era now supports Plutus V3. +Finally, we made small improvements to the ledger API and now host +our Haskell code documentation (haddocks) on github pages.

    Low level summary

    Conway ledger era

    Haddocks hosted on github pages

    Small improvements to the API

    Technical Debt

    • [pull-3367] Fix cost model json instances.
    • [pull-3371] UMap cleanup.
    • [pull-3373] Upgrade to ghc 9.2.7 and cabal 3.10.1.
    • [pull-3375] Sadly, we had to revert the TICKF optimizations. There was a regression we do not yet understand.
    • [pull-3377] Fix cabal warnings.
    • [pull-3383] Fix multi-asset test.

    · 2 min read
    Kevin Hammond

    Incident reporting: Cardano block production temporary outage

    On Sunday, January 22, 2023, an incident occurred resulting in block production pausing for a brief period of time (approximately two minutes, similar to the usual pause at an epoch boundary). Around 50% of block-producing nodes and relays restarted during this period. Having restarted, nodes continued to produce blocks without failure. While the network continued to operate, the issue did have the potential to affect network integrity, so was flagged as a ‘critical’ incident, thus warranting immediate response and investigation by IOG engineers. +The investigation (with SPO & Cardano Foundation collaboration) quickly revealed the cause of the issue – a complex bug in data structure handling code related to the precise order of insertion/deletion of multi-asset tokens into the internal ledger record. Input Output Global (IOG) engineers, along with SPOs and DApp developers, collectively identified how to reproduce the issue as a unit test that could be included in the standard Cardano node test suite. +Following successful testing, this led to a bug fix being implemented, tested, benchmarked, and deployed as a hotfix in the node v.1.35.5 release on Friday, January 27, 2023. Care was taken not to highlight the exact cause of the bug during this process so that it could not be exploited prior to SPOs deploying this new node version. +With the fix deployed, the Cardano SPO and developer community have not seen any further instances of this issue.

    Further Details

    You can read more details on the incident and how it was managed from SundaeSwap’s Pi Lanningham here. Thanks again to all the community for its support in identifying and fixing this bug.

    + + + + \ No newline at end of file diff --git a/tags/ledger/page/4/index.html b/tags/ledger/page/4/index.html new file mode 100644 index 00000000000..59b956f8615 --- /dev/null +++ b/tags/ledger/page/4/index.html @@ -0,0 +1,91 @@ + + + + + +30 posts tagged with "ledger" | Cardano Development Updates + + + + + + + + + + + + +
    +

    30 posts tagged with "ledger"

    View All Tags

    · 2 min read
    Jared Corduan

    High level summary

    We are still heavily involved in work related to preparing the next release. +The other main thing we have worked on is experimentation about how we will +handle the DRep stake distribution for CIP-1694 in the conway ledger era. +Lastly, we merged a fix for +node-4826 +into our main branch (there will be a post-mortem shortly).

    Low level summary

    Support for the next release

    • pull-3363 - Fix problems relating to Arbitrary instances used by consensus.
    • pull-3361 - Remove the alonze genesis from the conway genesis.
    • pull-3360 - Translate bad pointer addresses to valid ones in conway.
    • pull-3357 - Fix a bug relating to zero valued ADA in the script context.
    • pull-3356 - Added needed instances (Arbitrary and Serialization) for conway integration.
    • pull-3345 - Added helper functions for the CLI.
    • pull-3342 - Fix a bug with a CLI helper function (having to do with deposit tracking).

    Experiments for DRep stake distribution

    Adding another stake distribution to the ledger state presents some new challenges. +We would like to be able to use the current stake distribution at the epoch boundary +for DRep voting so that people can always vote themselves in time for any proposal. +To this end, we have a prototype of an incremental computation based on the incremental +lambda calculus, together with tests and benchmarks (which are very promising). +See pull-3344.

    Additionally, more of the ledger state is going to need to be rearranged to accomodate +the new incremental computations. +We have two draft PRs up for possibles solution. +See pull-3353 and pull-3364.

    Technical debt and bug fixes

    Documentation changes

    • pull-3354 - Rename "optional datums" with "supplemental datums" in the alonzo spec.
    • pull-3352 - Add a section to the Shelly errata about the individual deposit tracking.
    • pull-3351 - Further clarify the details regarding the script integrity hash.
    • pull-3350 - Some cleanup of the Babbage spec.

    · 2 min read
    Jared Corduan

    High level summary

    We made further progress on the conway ledger era. +In particular, we expanded the ledger API significantly, including lots of governance features. +We also made progress on the specification and corresponding work in the Haskell implementation.

    We also continued to integrate the latest ledger packages into cardano node and addressed +technical debt.

    Low level summary

    Expanded ledger API

    The ledger API was significantly expanded to include:

    • a lot of protocol parameter support
    • versioning support (type level ledger eras and protocol versions)
    • auxiliary data support
    • many new lenses
    • support for witnesses
    • support for conway governance

    See pull-3328.

    Conway ledger rules

    We have made progress on the formal ledger specification for the Conway era. +Moreover, the corresponding Haskell updates were also completed:

    Incremental SPO/DRep stake distribution computation

    We have a working (and correct) proof of concept for how to use the incremental lambda calculus +to maintain several of the stake distributions incrementally. +For the per-SPO distribution, this is a performance improvement. +For the (conway) per-DRep distribution, this is will allow those who have delegated their votes +to a DRep to have time to react to any votes that they disapprove of. +(Sorry, no code to share just yet, more to come.)

    Technical debt

    · 2 min read
    Jared Corduan

    High level summary

    We have focused the last two weeks on CIP-1694, integration of the last several months of ledger +work into consensus and node, and testing infrastrutcture that we will use in the conway ledger era.

    Low level summary

    Conway rules

    We made a major update to the conway era so that the implementation is now in sync with the spec +with respect to the ratification and enactment logic.

    See the notes in pull-3291 for more details.

    Constraint based generators

    This week we hit a major milestone in our efforts to build out better property based testing +support for the main ledger properties. +The new constraint based generators can now generate full ledger states with what is probably +very close to the real constraints (if anything, it is under constrained). +Next we will work on generating a transaction in the context of a ledger state, which would allow +us to actually start using these generators for real tests.

    See pull-3219.

    Preparing a release, now with proper versioning

    After quite some time, we are ready to release a version of ledger that will work with a new +version of consensus, using CHaPs.

    See pull-3308.

    Technical debt

    • We cleaned up the redeemer serialization code (to prevent future mistakes). See pull-3269.
    • We added a note to the Alonzo spec, specifying that the transaction inputs are +lexicographically ordered in the Plutus script context. See pull-3306.
    • We fixed a problem with the address deserialiazation +(we mistakenly fixed a bug in the Babbage era which cannot be fixed until Conway). +See pull-3307.
    • We fixed a problem with our nix build. See pull-3311.
    • We fixed a problem with our NoThunks tests. See pull-3310.
    • We improved our nightly tests. See pull-3316.

    · 3 min read
    Jared Corduan

    High level summary

    This past two weeks saw many months worth of ledger changes integrated with the cardano-base +and ouroboros-network repositories. +The vast majority of the effort involved all the changes to the ledger serialization libraries +(and the interplay with cardano-base) which now support proper versioning. +Supporting the conway ledger era, and in particular allowing the ledger state to transition +to a whole new system of governance, also played a noticeable part in the integration.

    Besides the integration work, the team continues to address technical debt, improve the +documentation, make our testing infrastructure better (such as experimenting with better +nightly tests), and formally specifying more parts of CIP-1694.

    Lower level summary

    Integration work

    Below is all the integration work completed, which will enable a release to node from +the current ledger master. Many thanks to +Alexey for this colossal undertaking!

    Technical debt

    Starting in major protocol version 9, zero-valued multi-assets will no longer be permitted +in the CBOR specification. See pull-3241.

    We now have our .cabal files being checked for a consistent formatting given by +cabal format in our CI. See pull-3286.

    We are still experimenting with better nightly tests for our long running +property based tests. See pull-3276 and pull-3296.

    Small documentation improvements

    The hand proofs of the preservation ADA property have been added back to the +Shelley ledger specification. See pull-3295.

    We have clarified how the script integrity hash is computed in the CDDL description. +See pull-3290.

    Specifying CIP-1694

    Our new formal specifications backed by Agda have seen a lot of progress! +Upgrading to Agda 2.6.3 fixed our main build infrastructure problems, +and we no longer have to rely on our custom fork. See pull-50.

    Our progress on formally specifying CIP-1694 can be followed here:

    Constraint based testing

    We are still actively working on our new constraint based property testing framework. +We have nearly all of the constraints for an entire ledger state +hooked into generators, and tests that the generators do indeed obey the constraints. +The variable count in the constraints is over 100! +There is still much work to do on shrinking, making the generators faster, +and writing actual property tests for the ledger, but the approach still seems viable and +we are hopeful that it could replace our trace generators. +The WIP can be followed here: pull-3219.

    · 2 min read
    Jared Corduan

    High level summary

    Much of the work the past two weeks involved integration efforts, +cleaning up and debugging some serialization issues, +adding tests, and work on large projects that are still ongoing. +We also released a CIP this week that aims to make the ledger +a registered CIP category.

    Lower level summary

    Ledger evolution CIP

    We published a +CIP +that will make the Cardano ledger a registered category of the CIP process.

    Serialization issues

    We had previously thought that we had found a serialization problem with the redeemers, +but it turned out to just be particularly confusing code. +We have now clarified the issue for the future.

    See pull-3263, pull-3269, and pull-3268.

    Starting in protocol version 9, we will no longer accept duplicate keys in CBOR maps.

    See pull-3277.

    New tests

    We added a new property test suite for some of our custom containers.

    See pull-3270.

    Progress on a better cost model serialization situation.

    We are still working our way through issue-2902. +Towards this end, we are now properly gating the new flexible encoders +until version 9.

    See pull-3274.

    Nightly tests

    We are still experimenting with moving more CI actions to GitHub actions.

    See pull-3276.

    Constraint based generators

    We continue to add to our proof of concept for constraint based generators. +See the previous ledger update for more information about this project.

    + + + + \ No newline at end of file diff --git a/tags/ledger/page/5/index.html b/tags/ledger/page/5/index.html new file mode 100644 index 00000000000..6ae88cf87a1 --- /dev/null +++ b/tags/ledger/page/5/index.html @@ -0,0 +1,188 @@ + + + + + +30 posts tagged with "ledger" | Cardano Development Updates + + + + + + + + + + + + +
    +

    30 posts tagged with "ledger"

    View All Tags

    · 3 min read
    Jared Corduan

    High level summary

    The ledger team completed some preliminary ground work in preparation for CIP-1694 +(restructuring the ledger state), +fixed the PDF hosting problem (mostly the formal specs), +built out more of the new user-friendly ledger API, +finished a proof of concept for constraint-based generators for property tests +(with the hopes of being able to replace our trace generators one day), +and addressed technical debt.

    Lower level summary

    Restructuring the ledger state

    The existing governance structures will be replace in the conway ledger era, +as described in CIP-1694. +In particular, the ledger rules will be restructured as follows:

       BBODY
    |
    |-------------------------------|
    v v
    TICK LEDGERS
    | |
    |---------| |
    v v v
    RUPD ~NEWEPOCH~ ~LEDGER~
    | |
    |----------| |--------|-------------------|-----------|
    v v v v v
    ~EPOCH~ +ENACTMENT+ DELEGS UTXOW +TALLY+
    | | |
    |---------|------------| v |
    v v v DELPL v
    SNAP POOLREAP -UPEC- | UTXO
    |--------| |
    v v v
    POOL DELEG ~UTXOS~

    -..- Removed
    +..+ Added
    ~..~ Modified

    Moreover, the ledger state will also be restructured in accordance with the new rules. +In the conway code, we have now removed UPEC, added TALLY, and stubbed ENACTMENT. +We have also adapted all the data structures in the ledger state.

    See:

    PDF hosting

    We now build all of our PDFs using a GitHub action which is triggered by pushing a tag +with a specific form, cardano-ledger-spec-YYYY-MM-DD. +The action creates a GitHub release containing the PDFs. +The links in the main ledger README now point to the PDFs in the latest release.

    See:

    Powering the new ledger API

    We have now removed all the HasField instances from the protocol parameter data types, +and replaced them with lenses. +This is probably the last major restructuring that the ledger team will do on the code base +for the API for a while +(the Plutus tools team will be working on it next, see here). +We also added a new helpful function ensureMinCoinTxOut.

    See:

    Constraint-based generators

    Our largest scale property tests generate an initial ledger state and a long sequence of valid blocks +which span several epochs, mimicking a real network. +These tests are, in theory, excellent for checking properties. +They are, however, very difficult to maintain and are not as random as we would like +(a lot of bias has to be introduced to keep the ledger state in enough order to keep generating blocks).

    We would like to switch to tests which instead generate a random ledger state representative +of not just an initial state, generate a single random valid block, and then test our properties. +The hope is that these will be much more random and easier to maintain.

    We have finished a proof of concept are encouraged that this approach could work!

    See:

    Technical debt

    • pull-3244 massive CI speedup
    • pull-3249 better types for fees in the protocol parameters
    • pull-3264 move our annotator code to the cardano-ledger-binary package where it belongs
    • pull-3239 move the Wdrls type to the Core module.

    · 5 min read
    Jared Corduan

    High level summary

    The ledger team finished up the remaining work for tracking individual depots, +built out the new Conway era transaction body (in line with CIP-1694), +greatly reduce some problematically large calculations on the epoch boundary, +and addressed technical debt.

    Lower level summary

    Finishing the deposit tracking

    The initial work on the individual deposit tracking project focused only on correctness. +As this is a large data structure +(since its size is linear with respect to the number of registered stake credentials), +it is very important that we also reduce the memory overhead as much as possible. +Fortunately, we were able to add very little overhead for the deposits by using existing +efficient data structures. The extra tracking now only incurs one word (8 bytes) +per registered stake credential.

    See:

    New Conway era transaction

    We implemented the Conway era transaction body, which is in line with CIP-1694. +Note that the Conway era implements, losing speaking, the parts of CIP-1694 that are not +related to the liquid democracy (the "DReps"). +The new transaction body adds the new governance actions and votes, +while also deprecating the old governance structures +(i.e. the old protocol parameter updates and MIR certificates).

    We also now have the wire specification (CDDL file) and serialization code in place. +The wire specification is still subject to change while we work on the Conway era, +but it is now usable and has proper testing support +(so that, for example, the serialization round-trips, etc).

    See:

    Optimizing the TICKF transition

    Every since the release of the Shelley era, we have been working to reduce the computational load +placed on the node by the ledger at the epoch boundary. +While still not perfect, we believe that we have removed one of the final problematically long +epoch boundary computations that exacerbate situations like +this. +In particular, the problem involved the way in which the consensus layer obtains a view of the +ledger for the purposes of checking the leadership schedule in a new epoch. +We implemented a stopgap measure which now only incurs a single multi-second cost once per epoch +instead of potentially several multi-second costs while the networks waits for the first block +of a new epoch to be minted.

    See:

    Technical debt

    We closed the year out with a lot of reduction to the technical debt!

    Improved ledger event

    • pull-3212 - The ledger events are not guaranteed to appear in any given order within a block. +For this reason, motivated by the use case in db-sync, the TotalDeposits event now +includes a transaction ID and emits the change in deposits instead of the value.

    Improved type saftey

    • pull-3208 - We replaced NominalDiffTime with a newtype wrapper. The problem was that our CBOR +encoders and decoders were using the wrong level of precision, having to due with with +the Shelley genesis file. We removed the potential problem with a newtype wrapper.
    • pull-3167 - We now use a GADT to ensure consistency of the Plutus language in the types +for TransactionScriptFailure and PlutusDebug.

    Code/Module organization

    • pull-3175 - The Allegra and Mary eras had an unusual relationship in our codebase, +due to the uncertainly of release dates while we were implementing them. +In particular, they were coupled in way that is different from the rest of the code base. +With hindsight on our side, we split the combined shelley-ma Haskell package into two +separate ledger era packages, which is now consistent with the rest of the repository +and module structure.
    • pull-3184 - We created a core test sub-library, cleaning up a lot of our property test +generator code.
    • pull-3210 - We moved the KeyPair type to the test library. Outside of testing, +the ledger does not need to deal with signing keys, and since this is a topic that +deserves the utmost care, it is best to make it clear that our use of signing keys +is only for testing.
    • pull-3229 - We split the Cardano.Ledger.Alonzo.Data module, which is more consistent with the rest +of the codebase.

    Revert pointer address deprecation

    Thanks to one of our excellent internal auditors, +@jmhrpr, +we now have a better plan for deprecating pointer addresses. +This meant that we had to revert the previous work to deprecate them.

    See:

    Miscellaneous

    • pull-3205 - We removed deprecated type synonyms.
    • pull-3218 - We cleaned up the address deserialization.
    • pull-3223 - We fixed faulty address deserialization tests.
    • pull-3222 - We switched to a general type family TxOut from concrete ones, +reducing many constraints.
    • pull-3224 - ShelleyGenesis is now parameterized by crypto instead of by era.
    • pull-3170 - We set the cabal-version to 3.0 in our projects.
    • pull-3172 - We removed the now useless EncodeMint/DecodeMint classes.
    • pull-3225 - We switch from ormolu to +fourmolu. +The reason was to be able to finally have more diff friendly code!

    · 3 min read
    Jared Corduan

    High level summary

    The Plutus tools team at IOG has started helping the ledger team to build out a user friendly +cardano-ledger-api package! +A GitHub project +will be filled out in the days ahead, +people interested in the API can use it to follow along and join in on the conversations.

    The ledger team has started using +architectural decision records +to leave a record of important decisions that the team makes. +We will retroactively go back through past decisions and make ADRs for them.

    The logic to track individual deposits is now nearly in place. +We are prioritizing correctness with our first pull request, and will follow up with +performance optimizations and general cleanup next.

    Pointer addresses are being deprecated with the Cardano major protocol version 8. +See CPS-0002 +for more context.

    Lower level summary

    Cardano ledger API

    The Plutus tools team has taken our minimal cardano-ledger-api package and started filling it +out and adding much needed documentation. +They have also added doctests! +In the days to come, the Plutus tools team will map out a lot more work for the API and record +it in this +GitHub project.

    See

    Architectural Decision Records (ADRs)

    We are now providing more context and leaving a record of important decisions that are made +in the ledger. The first ADR explains the very lightweight process.

    See

    Tracking individual deposits

    See ADR-3 +for background. +We now have the logic in place to track individual deposits, and a host of property tests +to make sure that the logic is correct. +The current implementation uses more memory than it needs to, and we will address that next, +with our hope being to only use one word (8 bytes) per registered stake credential. +There is a fair amount of other cleanup needed for general maintainability.

    See

    Removing pointer addresses

    Pointer addresses, which have never seen any real use +(there are something like eleven on mainnet), are being deprecated starting at Cardano major +version 9. +CPS-0002 gives the context. +We are disabling them by first preventing transaction outputs containing them +from being serialized by the node at the moment we switch to version 9. +At the hard fork after that, we will translate the existing few pointer addresses +to enterprise addresses.

    See

    Technical debt

    • pull-3162 - Sometimes we have to put safeguards in place for hard forks which may never +be exercised. After we have passed the given hardfork, we are able to clean up the code +and simplify our logic. We removed all of the ones that we are currently easily able to.
    • pull-3165 - We improved the type safety of our code while also discovering and fixing +a serialization bug.
    • pull-3172 - We removed dead code.
    • pull-3175 - The Allegra and the Mary code used to be coupled in a particular way the we grew to +dislike. We made these two ledger eras now uniform with the rest of our code base.
    • pull-3184 - We organized our property testing code.
    • pull-3200 - The Plutus tools teams fixed an outstanding bug in the translation from the +ledger state to the Plutus script context.

    · 3 min read
    Jared Corduan

    High level summary

    We released CIP-1694, +our proposal for entering the Voltaire phase. +Please come join the discussion, this will be an incredibly exciting transition for +Cardano and we want everyone to participate!

    We now have a sensible way to version all of the serialization schemes used in the ledger. +The draft pull request was polished, reviewed, and merged this week. +This solves many problems that have vexed us since the beginning of the Shelley ledger era.

    Everyone working on the Cardano node is working together to improve our release process, +and the ledger team in particular dedicated one engineer to help with these efforts +for the next release.

    Lower level summary

    The Conway ledger era

    The current proposal in CIP-1694 encompasses two new ledger eras. +The first era will be called Conway, after the English mathematician John Horton Conway. +The community facing aspects of the Conway ledger era will be very minimal, +but it will pave the way for introducing liquid democracy. +The details can be viewed here. +We do not yet have a formal specification for the Conway era. +Our plan is to debut the +formal ledger model. +Briefly, the Conway ledger era will:

    • introduce SPO voting for hard forks (in the spirit of the now abandoned CIP-47)
    • provide an on-chain mechanism for rotating the governance keys
    • re-plumb the ledger rules involving governance to be in line with CIP-1694

    Versioned CBOR

    We now have the ability to easily tie our serialization schemes to the Cardano +major protocol version. +We still aim to preserve backwards compatibility as much as possible, but we now have a principled +plan for resolving problems (see CIP-ledger-cbor). +In particular, we can now address several long standing issues, such as +issue-2444, issue-2965, and issue-3003.

    The final (and massive!) pull request which brought us the versioning is pull-3138.

    Deposit tracking

    The draft pull request which was exploring how best to track individual deposits +is much closer now to being ready to take out of draft (pull-3127). +For background on the issue, see issue-3113. +This is quite an invasive change which effects many of our tests, which we are now addressing.

    Technical debt

    As always, we keep working on technical debt. +We have deduplicated a some things: pull-3129, pull-3162. +We have memoized a problematic computation (though more due diligence is needed before we can +merge): pull-3141.

    Node release

    We have been helping with the node release efforts. See pull-4608.

    · 3 min read
    Jared Corduan

    High level summary

    I am extremely excited to say that we now have a pull request up which introduces our new versioned +CBOR serialization. This was an enormous effort, but it will solve a host of problems that we have +had since the Shelley phase. It will take time to properly review it, and we will +need to put in a lot of effort to integrate it with the downstream components, but this is a huge +milestone. Additionally, we have a new CIP proposing a deprecation cycle for the transaction +serialization schemes.

    We also have a draft pull request that reworks how deposits are tracked. Users of the system will +not notice any difference, but it is a necessary change needed to prepare the way for +decentralizing the governance of Cardano.

    Finally, we continued to address technical debt. In particular, we continued to make progress on +bringing coherency and consistency to the code base with a common naming convention, and +improving some error messages.

    Lower level summary

    • We have a pull request up for our new versioned CBOR serialization. +When we encounter a problem with our deserializers, it can be very difficult to implement a fix. +It is difficult because we can only fix such issues during a hard fork, and leading up to the +hard fork we must maintain two serializations for the same type in order to not cause unintended +network splitting (the problematic version must be used before the hard fork, +and the fixed version is used afterwards). +This can be especially tricky with the FromCBOR typeclass, since it is not always easy to +search for where all the problematic uses are located. +The new versioned CBOR serialization allows us to gracefully handle this transition. +See [pull-3138].
    • We proposed a CIP for backwards compatibility of the transaction serialization schemes. +See [pull-372].
    • We have draft for the new deposit tracking. +This draft is not as memory efficient as the final version will be, +but it is a sufficient proof of concept that we can write property tests against, ensuring +that we have not changed the semantics. +We will optimize after we are sure of the correctness. +See [pull-3127].
    • We now provide better support for debugging failed Plutus scripts in an important helper +function, named evaluateTransactionExecutionUnits. +In particular, it now returns all the information needed to rerun the script with exactly the +same arguments. This feature will end up appearing in the CLI and other tools from the Plutus +tools team. +See [pull-3135].
    • We did a lot more renaming to bring coherency and consistency to the code base. +See [pull-3126], [pull-3120], [pull-3118], and [pull-3116].
    • We have added a few things to the ledger repository to make it conform to the +Cardano Engineering Handbook +See [pull-3139].
    + + + + \ No newline at end of file diff --git a/tags/ledger/page/6/index.html b/tags/ledger/page/6/index.html new file mode 100644 index 00000000000..a630688a67c --- /dev/null +++ b/tags/ledger/page/6/index.html @@ -0,0 +1,154 @@ + + + + + +30 posts tagged with "ledger" | Cardano Development Updates + + + + + + + + + + + + +
    +

    30 posts tagged with "ledger"

    View All Tags

    · 3 min read
    Jared Corduan

    High level summary

    We have made the decision to use the +formal ledger repository +in place of a LaTeX spec for the next ledger era, and have added a lot of basic infrastructure +to the model. In particular, we now have a lot of support for axiomatic set theory. +While the next ledger era is still in the design phase, most of the team remains working +on technical debt. +In particular, we have moved a lot more code out of the Shelley specific modules and into +a ledger core module, we have finished up our benchmarking around the problematic TICKF +ledger transition (while improving the performance), made conveniences to the development +environment, cleaned up all the recent changes to the cost model, added a lot of documentation, +fixed some flaky tests, and deleted some dead code.

    Lower level summary

    Axiomatic Set Theory

    The formal ledger model now has support for much of the set theory that we make use of in +the formal ledger specifications. See [pull-20].

    Completed Technical Debt

    • We have addressed issues with two of our most problematic and flaky tests. +See [pull-3039] and [pull-3093].
    • We have added more documentation and tests to the Twiddler module. This is a module which +makes our CBOR serialization round-trip tests much more robust, and will also hopefully +help enforce the mandate for downstream libraries to never re-serialize data that needs +to be hashed. See [pull-3073] and [pull-3095] +(we cannot merge 3095 just yet, due to a preference for merging other features).
    • We have finished our long analysis of the problematic TICKF transition. +We now have a lot of benchmarks surrounding this code, and have added performance improvements. +See [pull-3068] and [issue-3035].
    • We have restored support for +ghcid +in our repository. This is a tool for developing with Haskell that many of us find greatly +improves our productivity by providing us with constant feedback from the type checker. +See [pull-3112].
    • After much activity on the cost model, we have done some final clean up of the code. +See [pull-3075] and [pull-3101].
    • We moved a lot of the existing user facing documentation regarding native tokens into the +ledger repository, and cleaned it up +(most of the heavy lifting was done by our amazing technical writers). +See [pull-3091].
    • We removed dead code. See [pull-3089].
    • We moved a lot of code from the Shelley specific libraries to the ledger core library. +See [pull-3109] and [pull-3110].
    • We've removed more of the awkward legacy template Haskell names. +See [pull-3108].

    · 3 min read
    Jared Corduan

    High level summary

    The ledger team is still primarily focused on addressing +technical +debt. +We now have the infrastructure for versioning our serialization schemes, +which we continue to put into action. +We have made first steps towards getting proper support for the +formal ledger repository +(in particular, we've added nix builds and +continuous integration support). +We are wrapping up an investigation of the performance of a critical +function used by the consensus layer for leader checks. +Finally, we are improving the packaging and versioning of our code.

    Lower level summary

    Completed Technical Debt

    • Because the Shelley ledger era was a complete re-write of the Byron ledger era, a lot of +our code lives in the cardano-ledger-shelley package, though with hindsight we can say that +much of it should live in cardano-ledger-core. +We continue to move things to cardano-ledger-core, and have much more to come. [pull-3059]
    • We now have the infrastructure to support versioned serialization schemes. +The inability to do this has caused us a lot difficulties, +such as [issue-3003], [issue-2965] and [issue-2444]. +We are still in the process of switching to the versioned serialization scheme +(such as [pull-3078]), +but the infrastructure was completed in [pull-3063].
    • We now have proper nix and CI support for the formal ledger project. [pull-19]
    • A separate team is helping bring support for +CHaP +to all the cardano-node repositories. +We have been helping out with this effort.
    • A separate team continues working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. +We have been helping out with this effort.

    In-progress Technical Debt

    We also have several fairly large pull-requests in review +that we are working on.

    • In an on-going attempt to build out a more user-friendly API, +we continue to remove HasField instances in place of using micro-lenses. +The protocol parameters, in particular, are being worked on. [pull-3045]
    • We are also renaming record fields to be consistent across the repository. [pull-3062]
    • We are now cleaning up all the work we did to understand the performance +of the TICKF transition. We have some improvements to the computatation +as well. [pull-3068]
    • We are adding more documentation, in particular to our Twiddler functionality. [pull-3073]
    • The formal ledger is adding support for finite set theory. [pull-20]

    · 3 min read
    Jared Corduan

    Ledger Update

    We have continued focusing nearly entirely on addressing technical debt. +A lot of design work has begun for the next ledger era, +but we do not yet have anything concrete to share.

    Technical debt issues completed

    • [issue-1676][pull-2992] We have finally removed the ledger dependency on the +cardano-prelude package. It was barely used in the ledger repository, and it added a dependency +that we did not want to maintain. It was a bit difficult to remove, and we had +to coordinate removing it from cardano-base. +A lot ended up going into pull-2992, due to the coordination effort, and we ended +up updating Plutus as well. +This means that we've now also made a lot of progress on the problematic cost model serialization +issues described in issue-2902. +In particular, after we resolve issue-3014, we will not have to wait an epoch before +releasing a cost model for a new version of Plutus, as we had to do for the Vasil HF.
    • [issue-3046][pull-3055] We moved a module that is now only used in Byron to a Byron package.
    • [issue-3047][pull-3054] We improved the interface to the Value (multi-asset) type.
    • [pull-3044] We debugged and fixed a tricky compilation issue. Certain kinds of field updates +were adding approximately 20 minutes to our compile time!
    • [issue-2932][pull-3036] As a part of our ongoing re-organization of the codebase, we +have added a Cardano.Ledger.[Era].Core module to each ledger era that has a TxBody class. +Most classes defined in the era should go in this new module. +We also re-export the Cardno.Ledger.Core module and the previous Cardano.Ledger.[Era].Core +modules from each era.

    Technical debt in progress

    • [issue-3034][issue-3035][node-issue-4421] We are continuing to write benchmarks to understand exactly where +all the time is being spent on executing the TICKF transition. +The consolidation of the per-stake-credential stake distribution to the per-stake-pool +distribution does seem to account for a large amount of time (near a second as written, which we +have down to about half a second with some optimizations), +but this does not account for everything. +Applying the reward update may also be a big contributing factor.
    • [pull-3033][pull-3038][pull-3041] A separate team is working on upgrading all the +cardano-node repositories to work with ghc 9.2.4. We have been helping out with this effort.
    • The nix scripts used to build our new +formal ledger model +do not work consistently for everyone, and we have been working on fixing these issues.
    • [issue-3014] We are still working on adding a versioning scheme to all of the ledger +serializers.

    · 2 min read
    Jared Corduan

    Ledger Update

    We have been focused nearly entirely on addressing technical debt.

    • We introduced more consistent naming across eras, this time for the auxiliary data. +See 3032.
    • We made clear how the consumed functions differs between eras (which was a previous source of +confusion), and added some related support to the fledgling ledger API. +See 3016.
    • We added clarity and organizational consistency to the main ledger era type synonyms. +See 3017.
    • We removed code duplication related to the input data hashes. +See 3018.
    • We split up a large module into smaller components. The large module was actually causing our +CI to time out. +See 3020.
    • We cleaned up stale information in our cabal files, and upgraded cabal 3.8. +See 3023, +3031, +and 3028.
    • We made consistent, standalone TxOut (transaction output) modules for every era. +See 3024.
    • We brought consistency to a maddening inconsistent use of type variables indicating the specific +choice of cryptographic primitives. In particular, all uses of crypto have been renamed to c. +See 3027.
    • We did a clean up of the types in the Alonzo era. In particular, we switched to more parametric +types that will compose better in the future and which simplifies the constraints. +See 3029.
    • We consolidated some existing fragmented logic regarding how we gather the scripts needed for a +given transaction. This is a much needed cleanup to prevent future mistakes. +See 3019.
    • We fixed a problem with our generators that was causing a fair number of our property tests to +fail in CI. +See 3039.
    • We have started the work to update Plutus. This will bring support for SECP in the next major +protocol version, and also address a +problem +that we current have evolving the cost models. +See 3030.
    • We addressed a small issue that came up when integrating the conway era downstream, namely +the lack of some serialization instances. +See 3022.

    · 2 min read
    Jared Corduan

    Ledger Update

    Since finishing up support for the Vasil Hardfork, the ledger team has been +focused on two main things: a new ledger era and technical debt.

    New minimal ledger era

    We have implemented a new ledger era named conway which is nearly identical +to the babbage era. This has been the first time that we have been able to see +what a minimal ledger era looks like. We have finished this task, modulo any +integration issues that might come up. The only thing that the conway era +does differently from the babbage era is provide support for rotating +the master keys using the hardfork combinator's state translation. +We may end up adding features to the conway era, but it is a nice exercise +seeing what it looks like to get a minimal ledger era supported in all the +downstream components.

    Addressing technical debt

    We have been addressing technical debt, mostly in an effort to make the +repository a more friendly code base to work in.

    • We have begun work on a ledger API, called cardano-ledger-api.
    • We have done a big re-design of the major type classes used in the ledger. +With hindsight on our side, we now have something much more organized and +easier to use.
    • We have done a lot of re-naming. The names across eras are now much more +uniform, avoid certain confusions that plagued us, and are clearer in where +they are from.
    • We have reduced a lot of code duplication that could lead to bugs if you +do not have the whole code base in your head.
    • We have added a handful of performance improvements.
    • We added type safety in a number of locations. In particular, the type of +values that can be minted in a transaction no longer allow for Lovelace +in the type, and some functions which used to handle both timelock scripts +and plutus script now correctly enoforce at the type level that only one of +them can be used.
    • We made our generators so that they now produce a much richer set of +valid serializations. There is room within CBOR to serialize the same +data structure in multiple ways, and it is helpful to have the generators +use a wide variety.
    • We have begun re-organizing our test suites.
    + + + + \ No newline at end of file diff --git a/tags/mithril/index.html b/tags/mithril/index.html new file mode 100644 index 00000000000..a9ba8b31e23 --- /dev/null +++ b/tags/mithril/index.html @@ -0,0 +1,24 @@ + + + + + +34 posts tagged with "mithril" | Cardano Development Updates + + + + + + + + + + + + +
    +

    34 posts tagged with "mithril"

    View All Tags

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team made progress in adapting the Mithril client library for WASM compilation and providing a JavaScript API for it. They also completed the optimization of the aggregator's performance. Additionally, the team initiated the implementation of a testing Mithril network for SanchoNet and conducted threat modeling and risk analysis for P2P networking.

    Finally, they enhanced the developer experience of the Mithril client library by providing ready-to-run examples in the repository and implemented a workflow to manually publish libraries on crates.io.

    Low level overview

    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Create a test network on Sanchonet #1173
    • Worked on the issue Upgrade breaking changes crates #1357
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Completed the issue Enhance aggregator REST API performances #1327
    • Completed the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Make mithril-client examples full crates #1385
    • Completed the issue Manual publication to crates.io with GitHub action #1380
    • Completed the issue Remove sqlite dependency from mithril-client crate #1390

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team released the initial version of the Mithril client library, enabling developers to integrate core Mithril features into their applications. They also released a new distribution, 2347.0, which includes support for slim certificate production by the aggregator, along with bug fixes and performance improvements.

    The team also introduced the initial version of Cardano/Mithril node communication enhancements, implemented by TxPipe as part of the Catalyst project. They made progress in decentralizing Mithril networks, including testing the Mithril peer-to-peer (P2P) relay on a test network and conducting threat modeling and risk analysis for P2P networking. Additionally, they started working on adapting the Mithril client library for WASM compilation and made progress in optimizing aggregator performance.

    Finally, they fixed inaccuracies in the verbosity level of logs across most nodes and worked on troubleshooting for some users.

    Low level overview

    • Release of the mithril-client library crate
    • Publication of a dev blog post about the released Mithril library
    • Released the new distribution 2347.0
    • Worked on the issue Light Wallet: Release mithril-client WASM library #1336
    • Worked on the issue Enhance Mithril/Cardano node communication #1315
    • Worked on the issue P2P threat modeling and risk analysis #1350
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Support P2P relay in infrastructure #1361
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue mithril-client verbosity not following usage menu #1325
    • Completed the issue Error message for mithril-client snapshot download #1375

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team made progress in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, completing the first prototype implementation of the Mithril relay, which enables P2P signature broadcasting. They also made progress in optimizing the performance of the aggregator. Additionally, the team completed some enhancements on the CI/CD that will help manually deploy experimental Mithril networks for SanchoNet, as well as for the new P2P network layer.

    Finally, they investigated occasional runtime issues causing delays for certain SPOs and started preparing for the next distribution release.

    Low level overview

    • Completed the issue Prototype a P2P relay with libp2p #1326
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312
    • Completed the issue Manually deploy a test Mithril network #1356
    • Completed the issue Make Cardano node version custom in CI/CD #1355
    • Worked on the issue Support P2P relay in infrastructure #1361
    • Completed the issue mithril-client fails to extract archive #1352

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team completed the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof-of-concept, achieving the implementation of P2P signatures broadcast with the relay in the end-to-end tests. Additionally, the team completed the proof-of-concept for the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they continued addressing some performance issue associated with the 'release-mainnet' aggregator, and fixed a bug with the tool used to process batch certificate hash re-computation.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Completed the issue Light Wallet: Release mithril-client library #1311
    • Completed the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Completed the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Fix certificate hashes re-computation in aggregator #1343
    • Completed the issue Remove unstable tag in unstable release #1235
    • Worked on the issue Enhance aggregator REST API performances #1327
    • Worked on the issue Signer runtime is stuck for some SPO #1312

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team continued working on completing the adaptation of the Mithril client as a library. They progressed in decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, achieving the implementation of a very basic working demo with a peer-to-peer publish-subscribe (pub-sub) mechanism. Additionally, the team continued working on the deterministic computation of the UTXO/transactions set from the immutable files.

    Finally, they resolved the naming issue of the Docker package responsible for storing images of the new Mithril client CLI, and continued addressing a performance issue associated with the 'release-mainnet' aggregator.

    Low level overview

    • Worked on the issue Prototype a P2P relay with libp2p #1300
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Light Wallet: Compute deterministic Cardano UTxO/transactions set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client Docker package is incorrect #1322
    + + + + \ No newline at end of file diff --git a/tags/mithril/page/2/index.html b/tags/mithril/page/2/index.html new file mode 100644 index 00000000000..102920c1f60 --- /dev/null +++ b/tags/mithril/page/2/index.html @@ -0,0 +1,24 @@ + + + + + +34 posts tagged with "mithril" | Cardano Development Updates + + + + + + + + + + + + +
    +

    34 posts tagged with "mithril"

    View All Tags

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept. They progressed with the adaptation of the Mithril client as a library, and worked on its full WASM compatibility in a proof of concept. The team kept working on the deterministic computation of the transactions from the immutable files, and fixed some unreachability issue on the release-mainnet aggregator.

    Finally, they implemented new Docker images that build the Mithril nodes on the 'devnet' faster and fixed some regressions in the Mithril client CLI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Fix devnet Mithril Docker images [#1272](https://github.com/input-output-hk/mithril/issues/1272
    • Worked on the issue Light Wallet: Release mithril-client library #1311
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Completed the issue Client regressions in snapshot list and download #1321

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team released a new distribution 2342.0. This release includes support for SPO tickers displayed in the Mithril explorer and the ability to produce slim Docker images for Mithril nodes.

    They also kept working on decentralizing the Mithril networks with the peer-to-peer (P2P) networking proof of concept, progressed with the adaptation of the Mithril client as a library, and worked on the deterministic computation of the UTXO set from the immutable files.

    Finally, they fixed the bottleneck of the key registration in the aggregator, investigated some unreachability on the release-mainnet aggregator, and enhanced the Mithril explorer UI.

    Low level overview

    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Completed the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano UTxO set PoC #1283
    • Completed the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Worked on the issue Fix devnet Mithril Docker images #1272
    • Worked on the issue release-mainnet aggregator is unreachable #1310
    • Worked on the issue Build mithril-common and mithril-client in WASM PoC #1284
    • Completed the issue Display a summary of signers before the full list in explorer #1133
    • Completed the issue Add certificates list in explorer #1184
    • Completed the issue CoreVerifier setup does not compute total_stake correctly #1306

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team started working on the decentralization of the Mithril networks with a proof of concept of peer-to-peer (P2P) networking between nodes. The team kept working on the adaptation of the Mithril client as a library, on the deterministic computation of the transaction history of an address from the immutable files, and on the refactoring that will fix the bottleneck of the key registration in the aggregator. Additionally, they published a security advisory for the Mithril relay.

    Finally, they enhanced the CI/CD to publish multiple packages to crates.io and started improving the developer experience with the Mithril devnet.

    Low level overview

    • Published the security advisory Mithril relay could expose Cardano block producer internal IP when updated #GHSA-9m3h-72xj-x2gq
    • Worked on the issue P2P Networking - Proof of Concept #1300
    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Publish multiple packages to crates.io #1298
    • Completed the issue Rename public key published in releases #1292
    • Completed the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Fix devnet Mithril Docker images #1272

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team worked on the distribution of the Mithril client as a library that will be distributed on crates.io, the Rust dependencies repository. The team also worked on the deterministic computation of the transaction history of an address from the immutable files and started fixing a bottleneck in the aggregator that limits the ingestion of signatures.

    Finally, they kept working on the activation of Cloudflare on the infrastructure and fixed some bugs in the Nix CI.

    Low level overview

    • Worked on the issue Make mithril-client crate a library #1141
    • Worked on the issue Compute deterministic Cardano transactions history PoC #1283
    • Worked on the issue ProtocolKeyRegistration creates performance bottleneck in aggregator #1187
    • Completed the issue Update Rust compiler in nix CI #1282
    • Worked on the issue Mithril networks infrastructure maintenance #1218
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team updated a proposal for implementing Mithril in a light wallet and created a discussion on implementing Mithril in a light wallet to receive feedback and contributions from the community.

    They also completed a proof of concept to run a Mithril client in a browser with WASM and worked on enhancing the explorer UI with SPO tickers displayed next to the pool IDs. Additionally, the team finalized a tool for benchmarking aggregator performance over a range of signer and client loads and for visualizing the results of these benchmarks.

    Finally, the team added a root page to the aggregator endpoint, created a status page for the Mithril networks, and added a section about KES key rotation in the signer documentation for SPOs.

    Low level overview

    • Created the discussion Implement Mithril in a light wallet #1273
    • Completed the issue Run client in browser WASM PoC #1254
    • Completed the issue Benchmark aggregator performances #1220
    • Worked on the issue Add SPO tickers in explorer #1185
    • Completed the issue Add a non 404 status code on the aggregator endpoint #1103
    • Completed the issue Use source attribute in errors #1265
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Completed the issue Configure status page and alerting #1277
    • Completed the issue Upgrade dependencies #1274
    + + + + \ No newline at end of file diff --git a/tags/mithril/page/3/index.html b/tags/mithril/page/3/index.html new file mode 100644 index 00000000000..03e15cf6271 --- /dev/null +++ b/tags/mithril/page/3/index.html @@ -0,0 +1,24 @@ + + + + + +34 posts tagged with "mithril" | Cardano Development Updates + + + + + + + + + + + + +
    +

    34 posts tagged with "mithril"

    View All Tags

    · One min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has released a new distribution 2337.0, which includes the following enhancements: support for zstandard compression of snapshot archives, support for the Cardano node version in snapshot metadata, and support for recording snapshot download statistics in the aggregator.

    They also completed the refactoring and standardization of the errors in the Mithril nodes and published an Architectural decision record on the documentation website. Additionally, they kept working on adding Cloudflare protection to the infrastructure.

    Finally, the team fixed a performance issue on the stress test tool for the aggregator and made some improvements to the documentation for SPOs.

    Low level overview

    • Completed the issue Release new 2337 distribution #1219
    • Completed the issue Errors refactoring #798
    • Completed the issue Client traffic creates performance bottleneck in aggregator #1207
    • Completed the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Completed the issue Create a SPO checklist for KES keys update #1267
    • Worked on the issue Spike: Run client in browser WASM PoC #1254
    • Worked on the issue Benchmark aggregator performances #1220
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230

    · One min read
    Jean-Philippe Raynaud

    High level overview

    This week, the Mithril team has completed the refactoring of the terraform deployment workflows in GitHub actions, and the implementation of snapshot compression parameters in the deployments. They kept working on the refactoring and standardization of the errors in the Mithril nodes. The team also completed the implementation of Cloudflare protection for the aggregator infrastructure and started working on its deployment and activation in the Mithril networks. Additionally, they worked on recording download statistics on the aggregator which will be used to produce usage reports.

    Finally, they kept working on the aggregator performance bottleneck that occurs with high client traffic and started creating a new distribution.

    Low level overview

    • Completed the issue Add snapshot compression parameters in infrastructure deployments #1200
    • Completed the issue Add Cloudflare protection of infrastructure #986
    • Worked on the issue Record statistics about the downloaded snapshot in the aggregator #1127
    • Worked on the issue Error refactoring #798
    • Worked on the issue Activate Cloudflare protection of infrastructure #1230
    • Worked on the issue Release new 2337 distribution #1219
    • Completed the issue Upgrade dependencies #1238

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has released a new distribution 2335.0 which brings enhancements to the client: support for simultaneous downloading and unpacking of the snapshot archives, support for one line command restoration of the latest snapshot, and availability of machine readable progress information.

    They have also worked on snapshots enhancements: implementation of the zstandard compression to produce smaller archives, and providing the version of the Cardano node used to create the archive in the snapshot artifacts. They have completed the second phase of the implementation of the stress test tool to benchamrk the aggregator. Additionally, they have kept working on refactoring and standardizing errors in the Mithril nodes.

    Finally, they have worked on adding Cloudflare protection to the infrastructure, and they have fixed some bugs that occurred during restoration of a snapshot by a client.

    Low level overview

    • Completed the issue Use 'zstandard' compression for snapshot archives #876
    • Completed the issue Design & implement stress test tool for aggregator - phase 2 #1155
    • Completed the issue Provide progress information with '--json' option in Client #1095
    • Completed the issue Make client download and extract the archive simultaneously #1115
    • Completed the issue Add aggregator Cardano node version in snapshot artifact #948
    • Completed the issue Make Cardano node version part of the Mithril network configuration #947
    • Completed the issue Post deployment 'mainnet' infrastructure #1091
    • Worked on the issue Errors refactoring #798
    • Worked on the issue Add Cloudflare protection of infrastructure #986
    • Completed the issue Failed to restore recent snapshot with strange error #1160
    • Completed the issue Update 'ed25519-dalek' to '2.0.0' #1188
    • Completed the issue Add target networks blocks in release notes #1151
    • Completed the issue Fix end to end 'wait_for_the_expected_time' test #1191
    • Completed the issue Fix docs 'git checkout' command #1174

    · One min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team created an explorer page with the registered signers to give recognition to the SPOs already running on mainnet. They also worked on refactoring and standardizing errors in the Mithril nodes, and they enhanced the clarity and reduced verbosity of the logs for the signer and aggregator nodes. Additionally, they started working on the implementation of zstandard compression of the snapshot archive, and streaming its download and decompression in the client.

    Finally, they implemented machine readable progress information in the client, and streamlined the process of verifying the registration status of a signer.

    Low level overview

    • Completed the issue Create explorer page with registered signers #1097
    • Completed the issue Simplify logs on the Signer/Aggregator #1106
    • Completed the issue Refactor (de)serialization of crypto entities #668
    • Completed the issue Mithril client last snapshot download #1078
    • Completed the issue Use the '/signers/registered' route to verify if a signer is registered #1152
    • Worked on the issue Provide progress information with '--json' option in Client #1095
    • Worked on the issue Use 'zstandard' compression for snapshot archives #876
    • Worked on the issue Make client download and extract the archive simultaneously #1115

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the Mithril protocol’s mainnet beta launch: the release-mainnet network is now consistently producing new certificates and snapshots! The team has released a new distribution 2331.1 which includes some optimizations and bug fixes: the bootstrap time of a Cardano node restored from a Mithril snapshot has been significantly reduced, and a bug that made the aggregator produce corrupted archives has been fixed. They also kept working on the implementation of the stress test tool for benchmarking the aggregator: the first phase has been implemented, as well as a monitoring feature. Additionally, they kept implementing the refactoring of the serialization/deserialization of the entities of the cryptographic library, and working on the post deployment of the mainnet infrastructure.

    Finally, they completed the rewriting and enhancements of the documentation website, and they completed the runbook for operating a production Mithril network.

    Low level overview

    • Released the new distribution 2331.1
    • Completed the epic Release 'mainnet' Mithril network #918
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Completed the issue Design & implement basic stress test tool for aggregator - phase 1 #991
    • Worked on the epic Post deployment 'mainnet' infrastructure #1091:
      • Completed the issue Create Production Infrastructure Runbook #1085
      • Completed the issue Ingest 'mainnet' metrics/logs in Grafana #1122
    • Worked on optimizations:
      • Completed the issue Add a 'clean' file to extracted database in client #1131
      • Worked on the issue Create explorer page with registered signers #1097
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on bugs:
      • Completed the issue Client fails to unpack some snapshot archive #1137
      • Completed the issue The 'release-preprod' network stopped producing certificates #1114
      • Completed the issue The 'release-mainnet' network does not show up in the explorer #1111
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.2' #1090
    • Worked on troubleshooting:
      • Completed the issue Signer can't sign with 'Invalid signature for party' error #1125
    + + + + \ No newline at end of file diff --git a/tags/mithril/page/4/index.html b/tags/mithril/page/4/index.html new file mode 100644 index 00000000000..b140918542e --- /dev/null +++ b/tags/mithril/page/4/index.html @@ -0,0 +1,24 @@ + + + + + +34 posts tagged with "mithril" | Cardano Development Updates + + + + + + + + + + + + +
    +

    34 posts tagged with "mithril"

    View All Tags

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team launched Mithril protocol’s mainnet beta: the release-mainnet network is now open for signer registrations, and its genesis certificate has been created. The team is monitoring the network, and expects it to start producing certificates during the next Cardano epoch.

    They have released a new distribution 2329.0, which is running on the release-mainnet network. They also kept working on the implementation of the stress test tool for benchmarking the aggregator. The team kept working on the refactoring of the serialization/deserialization of the entities of the cryptographic library. Additionally, they completed the cleanup of the legacy store adapters in the aggregator.

    Finally, they have worked on enhancing the documentation for onboarding SPOs and setting up a Mithril signer, and fixing installation bugs of the binary artifacts produced in the CI.

    Low level overview

    • Created the dev blog post Mithril Protocol’s Mainnet Beta Launch
    • Released the new distribution 2329.0
    • Closed the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Deploy 'mainnet' infrastructure #988
      • Completed the issue Handle Secrets management #989
    • Worked on the epic Release 'mainnet' Mithril network #918
      • Completed the issue Prepare SPO on-boarding guide #1049
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Enhance the configuration of Mithril relay #1080
      • Completed the issue Remove legacy store adapters from aggregator #1053
      • Completed the issue Add a 'sign' sub-command to 'genesis' command in aggregator #1081
    • Worked on refactoring:
      • Worked on the issue Refactor (de)serialization of crypto entities #668
    • Worked on documentation:
      • Completed the issue Enhance 'Run a Mithril Signer node (SPO)' guide #1055
    • Worked on bugs:
      • Completed the issue Shared library error in CI binaries #1073
      • Completed the issue Debian package does not install cleanly on older ubuntu versions #834
      • Completed the issue Aggregator panics with new (de)serialization of 'ProtocolVerificationKey' #1083

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team created a new 2327.0 distribution. They focused on preparing the beta launch on the mainnet: they tested the new production signer deployment model with the pioneer SPOs, they prepared an SPO on-boarding guide, and they kept working on the deployment and monitoring of the mainnet infrastructure. The team also worked on the implementation of a simple stress test tool for benchmarking the aggregator. Additionally, they completed the refactoring of the interface to the cryptographic library.

    Finally, they fixed a bug that sporadically prevented the latest signer registration of a SPO to be used in the associated signing epoch, they fixed a bug in the epoch gap detection of the certificate chain in the aggregator, and worked on multiple other optimizations and bugs.

    Low level overview

    • Released the new distribution 2327.0
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Add infrastructure monitoring #987
      • Worked on the issue Deploy 'mainnet' infrastructure #988
      • Worked on the issue Handle Secrets management #989
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on optimizations:
      • Completed the issue Remove certificate hash from Artifact #932
      • Completed the issue Check vulnerabilities in CI #1037
      • Completed the issue Add 'created_at' in Mithril Stake Distribution messages #1030
      • Completed the issue Add a 'run-only' option in end to end test #1048
    • Worked on refactoring:
      • Completed the issue Factorize protocol crypto operations #669
      • Completed the issue Refactor aggregator dependency injection and services #1058
      • Completed the issue Build static binaries in CI #874
    • Worked on documentation:
      • Completed the issue Prepare SPO on-boarding guide #1049
      • Completed the issue Add instructions to set firewall using iptables #1040
      • Completed the issue Update ufw command to set firewall on Mithril Signer installation instructions #1041
    • Worked on bugs:
      • Completed the issue Aggregator does not detect certificate chain epoch gap #952
      • Completed the issue 'testing-preview' network does not create certificates #1015
      • Completed the issue SQLite compatibility in aggregator #837
      • Completed the issue Q&A followup fixes #1035
      • Completed the issue E2E tests are flaky in CI #1023

    · 3 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the design of the signer deployment model for the SPOs to run Mithril on their Cardano mainnet infrastructure, and implemented the associated Mithril Relay in the Mithril networks. They started working on the design and implementation of a stress test tool for benchmarking the aggregator performances. They worked on the refactoring of the Mithril Stake Distribution entity and the uniformization of the date types in the nodes. They also worked on implementing a new tool command in the aggregator and its first sub-command that helps avoiding re-genesis of the certificate chain when the structure of the certificate is updated. Additionally, they worked on implementing some monitoring for the Mithril infrastructure, and worked on a retry mechanism for the artifact creation of the aggregator.

    Finally, they fixed some bugs, and they completed the upgrade of the Mithril networks to Cardano node v.8.1.1.

    Low level overview

    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Add infrastructure monitoring #987
    • Completed the epic Prepare Mithril Signer deployment model for SPO #862:
      • Completed the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
      • Completed the issue Adapt infrastructure to use Mithril Relay #1018
      • Completed the issue Announce the new signer deployment model in a dev blog post #1017
    • Worked on the epic Benchmark performances of Mithril Aggregator #904:
      • Worked on the issue Design & implement basic stress test tool for aggregator #991
    • Worked on bugs:
      • Completed the issue Aggregator does not exit on critical error #993
      • Completed the issue Computation of master certificate of an epoch is incorrect #1006
      • Completed the issue End to end tests are flaky #954
      • Worked on the issue 'testing-preview' network does not create certificates #1015
    • Worked on optimizations:
      • Completed the issue Dates format is not standardized #946
      • Completed the issue Add 'recompute-certificates-hash' command to aggregator #1001
      • Completed the issue Add a retry mechanism for artifact creation in aggregator #984
      • Completed the issue Log node version at startup in Aggregator/Signer #944
      • Completed the issue Reactivate Publish Results job in CI #978
      • Completed the issue Clean 'pending_snapshot' directory of aggregator #983
      • Completed the issue Update OpenAPI spec examples #1000
    • Worked on refactoring:
      • Completed the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Refactoring client #982
      • Completed the issue Refactor download code in client #1010
      • Worked on the issue Factorize protocol crypto operations #669
    • Worked on dependencies:
      • Completed the issue Upgrade Cardano node to '8.1.1' #973

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the implementation of the new sub-command for restoring a Mithril stake distribution in the client. They also updated the client’s developer documentation and architecture documentation, and did some refactoring on the client and its dependency injection mechanism. Additionally, they completed and deployed infrastructure enhancements on the test Mithril networks. They also completed the performance tests of the new stake distribution computation on the Cardano mainnet.

    Finally, the team worked on fixing a bug on the client multi-platform test, a bug on the aggregator state machine, and some flakiness on the CI.

    Low level overview

    • Completed on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Create the sub-command for 'Mithril Stake Distribution' in client #896
      • Completed the issue Adapt end to end tests to handle new types of data #899
      • Completed the issue Update client documentation #897
      • Completed the issue Update architecture documentations for new types of data #898
      • Completed the issue Refactoring client #960
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Completed the issue Enhance terraform infrastructure #930
    • Completed the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Check performance impact of new stake distribution command on the 'mainnet' #962
    • Worked on the epic Prepare Mithril Signer deployment model for SPO #862:
      • Worked on the issue Design recommended deployment model for SPOs on 'mainnet' and 'preview'/'preprod' #961
    • Worked on bugs and optimizations:
      • Completed the issue Aggregator does not always detect new immutable file #953
      • Completed the issue CI tests fail with Rust '1.70.0' #958
      • Worked on the issue End to end tests are flaky #954
      • Worked on the issue Certificate dates in metadata are not on the same timezone #946
      • Worked on the issue Refactor 'MithrilStakeDistribution' entity #967
      • Completed the issue Fix 'Mithril Client multi-platform test' with new client interface #956
      • Completed the issue Enhance 'ImmutableDigesterError::NotEnoughImmutable' error #969
      • Completed the issue Client 'snapshot download' command fails with option '--download-dir' #979

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2321.1 distribution that fully implements the mechanism developed to sign generic data. They completed the upgrade of the Cardano node in the Mithril networks to v.8.0.0 and the implementation of the new computation of the stake distribution. They refactored the state machines of the signer and aggregator, and the signed entity service of the aggregator. Additionally, they worked on adapting the client and implementing a new sub-command for restoring the Cardano immutable file snapshots.

    Finally, the team worked on adding a new certificate list route in the aggregator REST API, and started enhancing the infrastructure of the Mithril networks.

    Low level overview

    • Released the new distribution 2321.1
    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the issue Enhance MessageAdapter for Artifact in aggregator REST API #925
      • Completed the issue Create the sub-command for 'Cardano Immutable Files Full' in client #895
      • Completed the issue Enhance state machines Aggregator/Signer #933
      • Completed the issue Adapt the aggregator REST API to list certificates #892
      • Worked on the issue Adapt end to end tests to handle new types of data #899
      • Worked on the issue Update client documentation #897
      • Worked on the issue Update architecture documentations for new types of data #898
    • Worked on the epic that prepares the Mithril infrastructure for mainnet #767:
      • Worked on the issue Enhance terraform infrastructure #930
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the issue Upgrade Cardano node to '8.0.0' #920
    • Completed the issue Add export path in Client CLI #512
    + + + + \ No newline at end of file diff --git a/tags/mithril/page/5/index.html b/tags/mithril/page/5/index.html new file mode 100644 index 00000000000..6f6642244e7 --- /dev/null +++ b/tags/mithril/page/5/index.html @@ -0,0 +1,24 @@ + + + + + +34 posts tagged with "mithril" | Cardano Development Updates + + + + + + + + + + + + +
    +

    34 posts tagged with "mithril"

    View All Tags

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2318.0 distribution that implements the last migration phase of the aggregator stores and embeds a bug fix for the signer registration. They also completed the implementation of the interfaces defined to provide certification for the immutable full snapshot of Cardano files and Mithril stake distribution. They finalized the implementation of the framework to sign generic types of data in the aggregator and the signer nodes. They also updated the runtime of the aggregator to handle open messages associated with the available types, and evolved the REST API of the aggregator to deliver the artifacts for these types. Additionally, they have upgraded the network explorer in order to display the artifacts and certificates for these different types.

    Finally, the team started designing an on-chain decentralized signer registration process, and started implementing the new stake distribution computation available from Cardano node 8.0.0 (along with the backward compatibility for previous 1.35.x versions).

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the handling of multiple types of signed entity in the aggregator runtime #907
      • Completed the adaptation of the signer runtime to use the signable builder service #854
      • Completed the adaptation of the aggregator runtime to use the artifact builder service #869
      • Completed the appending of the next AVK to all protocol messages #888
      • Completed the adaptation of the aggregator REST API to retrieve the list/details of the artifacts produced #893
      • Completed the adaptation of the explorer to handle new artifact routes of the aggregator #927
    • Worked on the epic that implements the computation of the stake distribution for mainnet #880:
      • Completed the implementation of the new stake distribution computation in the chain observer #919
      • Worked on upgrading the Cardano node to 8.0.0 #920

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team completed the implementation of the new certifier service of the aggregator, which is in charge of producing certificates for multi-signatures. They also finished implementing the interfaces defined to provide certification for the full immutable Cardano files snapshot and the Mithril stake distribution. Additionally, they have completed the refactoring of the multi-signer in the aggregator. The team also fixed the bug in the signer registration that was responsible for gaps during the signature phase for some signers, and they upgraded the Cardano node used in the Mithril testnets and devnet to version 1.35.7.

    Finally, they have worked on designing a decentralized registration for the signers that takes place on the Cardano chain.

    Low level overview

    • Worked on the epic that designs and implements generic signing/verification of entity services #780:
      • Completed the implementation of the Certifier service in the aggregator #850
      • Completed the implementation of the signable builder for the Mithril Stake Distribution #851
      • Completed the implementation of the artifact builder for the Mithril Stake Distribution #870
      • Completed the implementation of the signable builder for the Full Immutables Snapshot #852
      • Completed the implementation of the artifact builder for the Full Immutables Snapshot #871
      • Completed the adaptation of the aggregator runtime to use the signable builder service #853
      • Worked on the adaptation of the signer runtime to use the signable builder service #854
      • Completed the definition of the entity service interface for verification/restoration #868
      • Completed the refactoring of the OpenMessage type #878
    • Completed the epic that simplifies the multi-signer in the aggregator #398:
      • Completed the extraction of the single signature registration from the multi-signer #643
    • Completed the upgrade of the Cardano node to version 1.35.7 #881
    • Fixed the bug that created a discrepancy of the signer verification keys between signers and aggregators #873

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2315.0 distribution that implements the first part of the migration of the aggregator stores along with minor improvements and bug fixes. They finished the migration of the aggregator stores to a relational design by completing the adaptation and migration of the signed entity, signer and single signature stores. They also created a new tick service that provides beacons to other services of the aggregator. Additionally, they started implementing the new new certifier service of the aggregator that is in charge of producing certificates for multi-signatures.

    Finally, they completed the design and definition of the interfaces that must be implemented to provide certification for a new type of data in a Mithril network.

    Low level overview

    • Released the new distribution 2315.0
    • Completed the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the signed_entity table #816
      • Completed the creation of the signer table #814
      • Completed the migration/adaptation of the single_signature table #829
    • Worked on the epic that designs and implement generic signing/verification of entity services #780:
      • Completed the definition of the interface of the generic entity service for signing #847
      • Worked on the implementation of the Certifier service in the aggregator #850
      • Completed the extension of the SignedEntityType type #848
      • Completed the implementation of the Tick service in the aggregator #849
      • Worked on implementing the signable builder for the Mithril Stake Distribution #851

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2313.0 distribution that implements minor improvements and bug fixes. They continued implementing the migration of the aggregator stores to a relational design. They finished adaptating and migrating the certificate, epoch settings, signed entity type, signer registration and open message stores. Additionally, they completed the refactoring of the dependency injector of the aggregator and simplified its multi-signer in order for it to sign multiple concurrent messages.

    Finally, the team has worked on designing the new architecture of the network to support signing multiple types of data and upgraded the version of the Cardano node used in the Mithril testnets and devnet to 1.35.6.

    Low level overview

    • Released the new distribution 2313.0
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed the migration/adaptation of the epoch_settings table #813
      • Completed the migration/adaptation of the signed-entity-type table #815
      • Completed the migration/adaptation of the certificate table #817
      • Completed the migration/adaptation of the open_message table #827
      • Completed the migration/adaptation of the signer_registration table #828
    • Completed the refactoring of the dependency injection of the aggregator #823
    • Completed the cleanup of the multi-signer of the aggregator #824
    • Completed the upgrade of the Cardano node to 1.35.6 #843

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2310.0 distribution that activates the era switch mechanism. They also kept implementing the migration of the aggregator stores to a relational design with the first adaptation of the stake pool store, and then the adaptation of the epoch settings & signed entity type stores. They have implemented the handling of the network API version from the Open API specifications and its automatic switch at era transition. Additionally, they optimized the stake distribution computation that now happens only once per epoch, and also enhanced the client multi-platform workflow to test the Docker images.

    Finally, they have successfully completed the tests to create certificates and snapshots on a network running on the Cardano mainnet and they have fixed some bugs.

    Low level overview

    • Completed the epic that implements eras behavior switch #707:
      • Completed handling the API version switch at era transition #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Completed on the migration/adaptation of the stake_pool table #787
      • Worked on the migration/adaptation of the epoch_settings table #813
      • Worked on the migration/adaptation of the signed-entity-type table #815
      • Completed the creation of a stake distribution service #799
    • Completed the testing of Mithril with Cardano mainnet network #777
    • Completed qualifying the computation of the stake distribution #810
    • Completed the testing of the Docker client in the Mithril Client multi-platform test workflow #794
    • Worked on bugs and optimizations:
      • Fixed a bug that made computation of the stake distribution occur multiple times during an epoch #804
      • Fixed a bug that created deadlocks on the SQLite connection #807
      • Optimized the error message and the behavior of the signer node when KES keys have expired #820
      • Upgraded the infrastructure of the testing-preview and pre-release-preview networks #801
      • Re-genesis of the testing-preview network #803
      • Re-genesis of the pre-release-preview network #818
    + + + + \ No newline at end of file diff --git a/tags/mithril/page/6/index.html b/tags/mithril/page/6/index.html new file mode 100644 index 00000000000..fd8007b0a3e --- /dev/null +++ b/tags/mithril/page/6/index.html @@ -0,0 +1,24 @@ + + + + + +34 posts tagged with "mithril" | Cardano Development Updates + + + + + + + + + + + + +
    +

    34 posts tagged with "mithril"

    View All Tags

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team worked on deploying the era activation mechanism to their test networks and preparing the upgrade procedure to be implemented on the signer nodes run by the SPOs. They also refactored the state machines of the aggregator and signer nodes so that they can better handle critical errors, which lead to node panic, from recoverable errors. Additionally, the team continued the deployment of a new test network that runs on the Cardano mainnet and computes the stake distribution with the optimized unreleased Cardano CLI command.

    Finally, they have designed the certification of generic types of data by a Mithril network and they have started implementing its first phase. Also they fixed a bug that made the client Docker image crash at startup.

    Low level overview

    • Worked on the epic that implements eras behavior switch #707:
      • Completed the deployment of the era behavior switch to the test networks #752
      • Completed the enhancement of datum generation for era markers #786
      • Worked on handling the API version with an era switch #727
    • Worked on the epic that implements a relational store in the aggregator #779:
      • Worked on the migration/adaptation of the stake_pool table #787
    • Completed the refactoring of errors in the signer and aggregator state machines #665
    • Worked on testing Mithril with a mainnet Cardano network #777
    • Worked on fixing bugs with the Docker client image:
      • Fixed a bug that made the Docker client container crash at startup #769
      • Fixed a bug that prevented the restoration of a snapshot with a Docker client #791
      • Worked on testing the Docker client in the Mithril Client multi-platform test workflow #794

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2306.0 distribution that implements minor fixes and updates and completes the wiring of the era activation markers reader into the signer and aggregator nodes. They also designed an event store in the aggregator and completed its implementation as a monitoring solution to provide figures for deployment rates of versions on signer nodes before activating an era switch. Additionally, the team created a dedicated command on their nodes’ CLI that allows generating and signing an era marker’s payload to be stored on the Cardano chain, as well as creating dynamic cases for the end-to-end tests they run on the CI.

    Low level overview

    • Released the new distribution 2306.0
    • Completed the epic that implements signer versions deployment monitoring #718:
      • Completed the implementation an event producer/consumer via channel #738
      • Completed the creation of a database and its configuration to save the events on the consumer side #740
      • Completed the creation of events and sending them on the channel on the producer side #741
      • Completed the creation of the signer registration event #742
      • Completed the creation a query to extract the node versions stakes distribution #743
    • Worked on the epic that implements eras behavior switch #707:
      • Completed the loading of era reader adapters from config in the signer and the aggregator #732
      • Completed the implementation of an era cli command in the aggregator #755
      • Completed the implementation of a dynamic matrix of cases in CI end to end tests #760
    • Fixed some bugs:
      • Fixed the unsupported unixepoch() function #757
      • Fixed the problem that prevented some signers from signing on the testing-preview network #730
      • Update SQLite version to 3.40 in aggregator infrastructure #765

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2304.1 distribution that enables the backward/forward compatibility mechanism implemented for seamlessly rolling out soft updates to Mithril networks. They completed the implementation of the era reader trait that powers the era switch behavior. The team finalized the development of the era reader adapter that retrieves era activation markers from transactions on the Cardano chain. They also completed the relational design of the aggregator store.

    Finally, they created new SPO nodes on the Mithril networks and upgraded the Cardano node to version 1.35.5 on their devnet and infrastructure.

    Low level overview

    • Released the new distribution 2304.1
    • Fixed a bug that prevented some signers to sign with 2304.0-prerelease #716
    • Completed the implementation of an EraChecker that checks if an era is active #708
    • Completed the implementation of an EraReader that gathers era activation data #709
    • Completed the implementation of an EraReader adapter with on chain transaction as source #710
    • Completed the relational design of the aggregator store #476
    • Completed adding a new SPO on the testing-preview network #729
    • Completed the upgrade of the Cardano node to 1.35.5 #725
    • Fixed flakiness in the CI #734

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team released a new 2302.0 distribution that activates the optimization of the snapshot digest computation on the signer and aggregator nodes. They have implemented a backward/forward compatibility mechanism for handling seamless soft updates of the Mithril networks without using synchronous updates when possible. The team also worked on the proof of concept to rely on an on-chain transaction to synchronously trigger the era switch of all the signer and aggregator nodes.

    Finally, they finished upgrading the devnet, fixed the flakiness issues in the end-to-end tests of the CI, and upgraded the SPO documentation to set up a Mithril signer node.

    Low level overview

    • Released the new distribution 2302.0
    • Implemented a backward/forward compatibility mechanism for API messages #688:
      • Implement the mechanism for the signer registration #689
      • Implement the mechanism for the signature registration #693
      • Implement the mechanism for epoch settings #695
      • Implement the mechanism for certificate pending #696
      • Implement the mechanism for certificate #697
      • Implement the mechanism for snapshots list #698
      • Implement the mechanism for snapshot #699
      • Update enforcement of API version with Semver #705
    • Completed the PoC implementation of backward compatibility with protobuf #677
    • Completed the PoC implementation of backward compatibility with avro #678
    • Completed the PoC to Read/Write transaction on chain for Era activations #672
    • Completed the upgrade Cardano devnet to 1.35.4 #523

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has been designing a mechanism for handling seamless updates of the Mithril networks in case of breaking-changes that require synchronous update of the signer nodes. This design has been formalized in an ADR. They have been working on an implementation of a proof of concept to rely on an on-chain transaction to synchronously trigger the version switch of all the signer nodes. They have also worked on implementing prototype solutions to minimize the use of breaking changes where soft updates are possible.

    Finally, they have worked on upgrading the devnet and fixing some flakiness in the end to end tests of the CI.

    Low level overview

    • Implemented the redaction of an ADR for handling graceful updates of the Mithril Network #671
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with protobuf #677
    • Worked on a proof of concept to handle backward compatibilty of exchanged messages with avro #678
    • Worked on a proof of concept for reading/writing era activation markers with a Cardano chain transaction #672
    • Worked on upgrading the Cardano node of the Mithril devnet, as well as fixing flakiness of the CI #523
    • Prepared and tested the new 2302 distribution pre-release 2302.0-prerelease
    • Updated the documentation for SPO to build a signer node in order to better reflect the new release process #681
    + + + + \ No newline at end of file diff --git a/tags/mithril/page/7/index.html b/tags/mithril/page/7/index.html new file mode 100644 index 00000000000..2dcc43813b4 --- /dev/null +++ b/tags/mithril/page/7/index.html @@ -0,0 +1,24 @@ + + + + + +34 posts tagged with "mithril" | Cardano Development Updates + + + + + + + + + + + + +
    +

    34 posts tagged with "mithril"

    View All Tags

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team has released the new distribution 2248.1 of their nodes. They have published the first version of the Mithril cryptographic library on crates.io, the Rust community’s crate registry. They have implemented an optimization on the individual signatures that no longer embed the verification key and stake. They have also enhanced their testing strategy by implementing a workflow that tests that the client binaries produced for multiple platforms (Linux, MacOS and Windows) are able to verify and restore snapshots.

    Finally, they have kept on simplifying the aggregator node's multi-signer by removing the signer registration and the certificate creation from its responsibilities.

    Low level overview

    • Implemented removing verification key and stake from single signatures #619
    • Completed the extraction of the signer registration from the multi-signer #642
    • Completed the extraction of the certificate creation from the multi-signer #638
    • Implemented a workflow to test client binaries (Linux / MacOS / Windows) #601
    • Completed the signature of the artifacts produced by the CI #587
    • Fixed the protocol parameters transition #627
    • Worked on optimizing the snapshot digest computation #510
    • Worked on enforcing the API protocol versions in the client and signer #633
    • Worked on deactivating the non certified signer registration mode #621
    • Worked on the re-genesis of the test networks #651

    · 2 min read
    Jean-Philippe Raynaud

    High level overview

    The Mithril team worked on finalizing their release process by adding new features: publishing their cryptographic library to the Rust community, adding node versions manifest in the release notes, and signing the binaries embedded in the distributions. They deprecated the declarative signer node registration that will be decommissioned in a few weeks. The team also completed the automatic store upgrade process for the signer and aggregator nodes.

    Finally, the team continued working on the redaction of the CIP that will allow the decentralization of Mithril by using the Cardano networking layer.

    Low level overview

    • Implemented custom Mithril SPOs on testing/pre-release networks #563
    • Deprecated Signer Declarative Pool Id registration mode #585
    • Completed the second stage of the store automatic migration process #600
    • Completed the deployment pipelines to crates.io registry #588
    • Completed automatic generation of nodes/libraries versions manifest in releases notes #599
    • Completed CI/CD handling of PR from forks #597
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #586
    • Worked on signing the artifacts released in the distributions by the CI/CD #587
    • Worked on multi-platforms end to end test #601
    • Worked on the refactorizaton of the aggregator multi-signer engine #398

    · 2 min read
    Iñigo Querejeta Azurmendi

    High level overview

    The Mithril team has released their second distribution 2246.1 following the activation of the alpha version of the new release process. They continued refining its implementation and added a new set of artifacts to the distributions, such as Debian packages and macOS/Windows binaries. The team also enhanced the Mithril Explorer, which now provides more detailed information about epoch settings and easier access to multiple aggregators for the users. They have also worked on an enhanced mechanism for node versioning, storage, and communication protocol. They also implemented version detections for the signer and aggregator nodes, designed the automatic store upgrade feature for these nodes, and enhanced the documentation of the configuration parameters of the several Mithril networks.

    Finally, the team continued working on the elaboration of the CIP that will allow the decentralization of Mithril by relying on the Cardano node network layer.

    Low level overview

    • Released a new Mithril distribution 2246.1
    • Completed the first stage of the store migrations process #562
    • Added a Mithril API version that is now exposed in the headers of the requests sent and received by the nodes #565
    • Enhanced the explorer UI with epoch settings information and aggregators management on browser local storage #576
    • Prepared a Daedalus synchronization benchmark video with/without Mithril #606
    • Upgraded the Cardano nodes of the testing Mithril networks to 1.35.4 #594
    • Worked on implementing SPO tests nodes on testing Mithril networks #563
    • Worked on the CIP design for Mithril piggybacked on the Cardano network layer #588
    • Worked on the refactorizaton of the aggregator multi signer engine #398

    · 2 min read
    Iñigo Querejeta Azurmendi

    This sprint, the team has been working on the new continuous integration and delivery (CI/CD) pipelines and the automated deployment of environments as part of the new version of the release process. They also coordinated the migration of the pioneer SPO nodes to these new Mithril networks. They have been implementing the automatic data storage upgrade of the signer and the aggregator nodes. Finally, on the crypto side of things, we've implemented an efficiency improvement on the size of the mithril certificates.

    Low level overview

    • We have been moving forward on the implementation of the release process #500:
      • Setup of the new hosted environments for testing-preview, pre-release-preview and release-preprod with their terraform and GitHub environments #542
      • Adapted the CI workflows to work with the new release process #543
      • Publication of an ADR3
      • Publication of a dev blog post about Mithril networks evolution
      • Releasing our first Mithril distribution 2244.0
    • Worked on the API versioning mechanism #565
    • Worked on the implementation of the stores migration process for the signer and aggregator nodes #562
    • Prepared a Mithril devnet video demo #526
    • Implemented a batch Merkle Tree proof, which reduces the size of certificates considerably #484
    + + + + \ No newline at end of file diff --git a/tags/network/index.html b/tags/network/index.html new file mode 100644 index 00000000000..0af530648fa --- /dev/null +++ b/tags/network/index.html @@ -0,0 +1,81 @@ + + + + + +24 posts tagged with "network" | Cardano Development Updates + + + + + + + + + + + + +
    +

    24 posts tagged with "network"

    View All Tags

    · One min read
    Marcin Szamotulski

    High-level overview of sprint 48

    Bootstrap Peers

    We continued reviewing bootstrap peers, ouroboros-network#4555.

    IOClasses / IOSim

    We prepared slides for a Haskell meetup were we presented a talk on IOSimPOR. +The recording will be availble on YouTube.

    We also used the opportunity to do some refactoring of the IOSim code base: io-sim#117. +We released io-sim-1.3.0.0 on Hackage: io-sim#119.

    We also added forkFinally to MonadFork (not included in 1.3.0.0 release): io-sim#123.

    Tech debt

    We refactored Resource used by the DNS subsystem: ouroboros-network#4707. +We continued reviewing the ouroboros-network#4625 PR, which refactors +RootPeersDNS module.

    · 2 min read
    Marcin Szamotulski

    High-level overview of sprint 47

    Bootstrap Peers

    We continued to review the process of bootstrap peers, see ouroboros-network#4555

    CI / Tests

    We investigated our CI issues. We found a memory leak in typed-protocols +function used for testing codecs which triggered out of memory manager (OOM) on +some platforms (typed-protocols#43); we also found a bug in the connection manager which resulted in CI +timeouts (see connection-manager-fix).

    KeepAlive client

    We found two small issues with the keep-alive client, which were addressed +by Karl Knutsson (Cardano Foundation), ouroboros-network#4689.

    Galois

    We merged two large PRs prepared by Galois:

    Cardano Network Service Assurance (CNSA)

    Galois made the following progress on CNSA:

    • a simple [InfuxDB] database backend has been added;
    • the documentation has been updated;
    • internal improvements to the code;
    • progress on a new "CSNA analysis" that provides, for each sampler node, the +block download throughput in bytes over time.

    New CHaP Release

    We cut a new release of ouroboros-netowrk packages to CHaP: chap#547

    More details

    CI / Tests

    We improved the memory footprint of some of our tests by analysing a stream of +IOSim traces without retaining them, see ouroboros-network#4696

    As a safety measure, we introduced an upper bound for heap memory used by test +artefacts in our nix tests. We use 200MB limit for all tests except for +network-mux tests which use 350MB limit, see ouroboros-network#4702.

    We refactored one of our tests to use ephemeral ports thus allowing it to +run concurrently, see ouroboros-network#4702.

    We merged ouroboros-network#4623 which fixes a bunch of test failures.

    All of them were due to a bug in test logic rather than a bug in production +code.

    Release Process

    We updated our release process & associated scripts, see +ouroboros-network#4705.

    · One min read
    Marcin Szamotulski

    High-level overview of sprint 46

    Bootstrap Peers

    We continued reviewing of bootstrap peers, see ouroboros-network#4555.

    Towards Typed Protocols 0.2.0.0

    We diagnosed the performance regression of the new design. The work on +typed-protocols will be postponed. For more details see the +typed-protocols#3. As an outcome of the performance debugging we prepared +PR which updates the demo-ping-pong and +demo-chain-sync applications.

    Peer Sharing

    We made progress in review of ouroboros-network#4644, which simplifies the +peer sharing and fixes the ouroboros-network#4642 issue.

    Tech Debt

    We reviewed the ouroboros-network#3836 PR which inspects all the uses of +error in ouroboros-network. The PR was prepared by Galois.

    · 3 min read
    Marcin Szamotulski

    High-level overview of sprint 45

    Bootstrap Peers

    We started reviewing the bootstrap peers PR, ouroboros-network#4615.

    Towards Typed Protocols 0.2.0.0

    We discovered a performance regression when using typed-protocols-0.2.0.0, and we +started investigating where it comes from. Currently, we see that +typed-protocols-0.2.0.0 can outperform typed-protocols-0.1.0.0 when running +in isolation with a simple ping-pong protocol, so the regression might be in +the new block fetch implementation which comes with typed-protocols-0.2.0.0 +See typed-protocols#3.

    Tech Debt

    We merged two PRs written by Galois engineers:

    • a pull request which refactors the main entry function for P2P, see ouroboros-network#3834;
    • a pull request which reviews usage of unsafe function in the network code based.

    Galois also made progress with the following two issues:

    IO-Sim

    IOSimPOR

    We found and fixed a bug in IOSimPOR. We'd like to thank Prof. John Hughes +(Quviq AB) for helping us with debugging the issue.

    We also provided a more uniform API for IOSimPOR, and added ways to make the +debugging similar problems in the future easier.

    Technical Details on IOSim refactoring
    We removed the usage of `unsafePerformIO` from `IOSimPOR`, which also means removing parallel evaluation of discovered races. We found out that it gives only 25% better performance. In the future QuickCheck will offer running different cases in parallel which should provide better performance as there are no dependencies between the evaluation of different test cases, while schedules are discovered while running which limits the possible gains from running them concurrently. The performance was not the only factor though. When using parallelism in the lazy `ST` monad we'd need to rely on memory guarantees of `STRefs`. In `GHC-9.6` they share the implementation with `IORef`s, but it might not be the case in the future.

    IOSim

    To prepare for the next release, we consolidate packages taking advantage of +the public sublibraries supported now both by cabal and Hackage. This is +a work in progress, io-sim#114.

    Cardano Newtork Service Assurance

    Galois made the following progress:

    • A test run of spinning up a CNSA instance was done, as a result documentation +was updated.
    • Based on the IOG code review of the CNSA code, updates to the CNSA code were +made.
    • Galois has started the design for adding a CNSA analysis for "fetched bytes +over time while node is syncing".

    P2P adoption

    In the last two weeks, we've seen increase in P2P adoption. +P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays. +node versions

    Open Source

    We upstreamed our FFI bindings to Windows named pipes to Win32 package, the +PR was accepted and merged.

    We also received an external contribution which enhanced our documentation, see +ouroboros-network#4676.

    · 2 min read
    Marcin Szamotulski

    High-level overview of sprint 44

    Bootstrap Peers

    In this sprint, we focused on developing bootstrap peers.

    Thanks to the input from Samuel Leathers (IOG) and John Lotoski (IOG), we +identified a possible improvement to bootstrap peers. A more detailed +description is available here.

    Cardano-Node-8.4.0 Release

    We also were responsible for the cardano-node-8.4.0-pre release. A final +integration PR is currently being merged. We published +new versions of ouroboros-consensus, cardano-api and cardano-cli.

    Towards Typed Protocols 0.2.0.0

    We also updated the future typed-protocols-0.2.0.0 and its integration with +cardano-node. This is towards our goal which we planned for the next +quarter. The identified tasks are to fix breaking tests, and then measure and +address possible performance regressions.

    Tech Debt

    Mark Tullsen (Galois) submitted two more PRs: ouroboros-network-#4663, +ouroboros-network-#4664. We provided feedback on their other pull requests: ouroboros-network-#4661 and +ouroboros-network-#4660.

    P2P adoption

    In the last two weeks, there was a regression in P2P adoption concerning +the number of SPOs or stakes, although the number of overall P2P relays has +increased. Karl Knutsson (Cardano Foundation) is investigating +this issue. +P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

    Data has been kindly provided by Cardano Foundation and their mainnet +monitoring infrastructure.

    Open Source

    We are in the process of upstreaming our ffi to Windows Named Pipes API to the Win32 package, see [win32-220].

    + + + + \ No newline at end of file diff --git a/tags/network/page/2/index.html b/tags/network/page/2/index.html new file mode 100644 index 00000000000..cbbc4106419 --- /dev/null +++ b/tags/network/page/2/index.html @@ -0,0 +1,128 @@ + + + + + +24 posts tagged with "network" | Cardano Development Updates + + + + + + + + + + + + +
    +

    24 posts tagged with "network"

    View All Tags

    · 3 min read
    Marcin Szamotulski

    High-level overview of sprint 43

    In this sprint, we received contributions from CF & Galois. Karl Knutsson +(CF) has addressed various issues regarding peer churning in P2P, timeouts +and our WireShark dissector. While the Galois developers focused on +addressing issues from their review last year. See below for more details.

    We continued working on bootstrap peers ouroboros-network-#4661.

    We refactored our test suites: they are split into io-tests which require to +be run natively on all platforms (these tests mostly contain tests that +require IO system calls) and sim-tests which are platform independent. We +run io-tests on all supported platforms (e.g. x86_64-linux, +x86-64-darwin, aarch64-darwin and x86_64-w64-mingw32 (Windows)) natively. +The sim-tests are not executed on Windows due to memory limitations on +GitHub Actions runners. ouroboros-network-#4653

    We also started rebasing typed-protocols refactoring branches.

    Marcin was appointed as the cardano-node release engineer for the 8.4.0-pre +version. So far he integrated cardano-ledger-conway-1.8 and +ouroboros-network-0.9.1.0 to ouroboros-consensus, cardano-cli and +cardano-api. Once we will have an integration branch for cardano-node, +cardano-ledger-conway-1.8 and ouroboros-consensus packages can be released +to CHaP and PRs can be merged once they go through review & CI.

    We also fixed some smaller issues regarding peer sharing (both were discovered +by Karl from CF). More details are included below.

    Progress on P2P addoption

    SPO relays

    There are currently ~2000 relays running P2P +enabled nodes that belong to 557 pools with a combined stake of 7900Mil Ada. On +16th of August it was ~1700 relays, 531 pools with a combined stake of 7700Mil +Ada.

    P2P relays

    The following graphs show several different versions of relays running on the mainnet. The +green line NodeToNodeVersionV10.True denotes P2P relays, which slowly +increase over time. The V9 and earlier versions of the node-to-node +the protocol indicates nodes version 1.35.x or earlier. +node versions

    Data has been kindly provided by CF and their mainnet monitoring +infrastructure.

    IOG relays

    As of this week, 90% of IOG relays are running a P2P setup. In the next sprint all +IOG relays will be running P2P.

    Detailed description

    In this sprint, we got a few contributions from CF:

    • Karl made peer churning mechanism less aggressive ouroboros-network-#4656; and
    • he added timeouts for idle states in ChainSync & KeepAlive +miniprotocols. These timeouts help a node remove idle connections from the +responder (server) side ouroboros-network-#4648.
    • he improved the WireShark dissector by adding support for the peer-sharing mini-protocol ouroboros-network-#4656.

    Galois has been making progress in addressing some of the issues they raised in their review (last year):

    Peer Sharing

    • Light peer sharing is only enabled when peer sharing is turned on ouroboros-network-#4652;
    • Handshake incorrectly reports peer sharing value. It's supposed to relay the +remote value, but instead, it returns the local value. ouroboros-network-#4642 (in review).

    Async Demotion Test Fix

    • We fixed an async demotion test failure which turned out to be a weakness of +the test itself rather than a bug in the connection manager. ouroboros-network-#4655

    · 3 min read
    Marcin Szamotulski

    High-level overview of sprint 42

    Eclipse Evasion

    We merged and released a new version of the ouroboros-network package (version +0.9.0.0) which includes big ledger peers feature. +This is the primary peer selection mechanism to defend against eclipses. We +also prepared a PR to updated ouroboros-cosnensus +and ekg-forward packages.

    CDDL specs for protocol codecs

    We made the cddl spec for network codec more inline with the implementation +which is highly polymorphic. cddl doesn't have the notion of polymorphism, +but has any which can generate any valid cbor term. We matched it with an +Any type on the Haskell side and made all remaining tests & specs use it. +This simplified the specifications and made it easier to understand which parts +are defined in the spec, and which parts are left unspecified. See +ouroboros-network#4595.

    Ouroboros-Network-Framework API changes

    We also released ouroboros-network-framework and other network components. +The ouroboros-network-framework package contains a redesign of API exposed to +ouroboros-consensus. We consolidated, cleaned it and made it easier to +extend in the future if there will be new arguments that need to be passed to +mini-protocol initiator and responders which comes from the low-level network +layer.

    Nix setup (CI)

    We also made a major review of our nix setup. With help from our DevX team +we ended up with a clean flake.nix file which can:

    • compile & test the code on x86_64-linux, x86_64-darwin and aarch64-darwin
    • cross-compile to Windows on x86_64-linux

    And provides a shell which contains all the build tools, including ghc-9.6, +hls, cddl, and more. See ouroboros-network#4640, +ouroboros-network#4643.

    Other contributions

    Cardano Network Service Assurance

    • The work and writeup in finishing up the CNSA, first stage (first +contract).
    • Getting Sam Cowger (Galois Inc) up to speed.
    • The IOG Networking team carried a reivew of CNSA project progress: a limitted +code & design review.

    Galois Review

    Sam Cowger and Mark Tullsen (Galois Inc) have made some progress on each of the tech debt issues

    scoping, requirements, and getting started.

    CI

    We added a nightly run for GitHub actions and made the GitHub actions test be +executed with extra concurrency ouroboros-network#4637, ouroboros-network#4649.

    We also added GitHub's dependabot ouroboros-network#4650.

    Bootstrap Peers

    We settled on implementation design of bootstrap peers which is being +implemented, ouroboros-network#4615.

    · 2 min read
    Marcin Szamotulski

    High-level overview of sprint 41

    24th July - 6th August 2023

    We started the implementation of bootstrap peers. Bootstrap peers are designed +to provide a safety guarantee for nodes joining the network while still taking +advantage of the distributed network for nodes that are synced. This will be +an intermediate step before Genesis which will allow for further distribute the +system. The bootstrap peers will be run by some trusted partners like CF, +Emurgo or IOG. They are primarily designed for leaf nodes (e.g. full node +wallets), which often end up syncing and require access to the honest chain. See +ouroboros-network#4615 for a more detailed implementation plan.

    Other contributions

    We started to use nothunks library to discover if we have any unevaluated +thunks which can lead to memory leaks ouroboros-network#4633. We found +a small one in the peer metric component of the P2P networking stack. Fixing +it put us on a small detour of fixing the API of the strict-checked-vars +package: cardano-base#431, cardano-base#432, as well as adding NFData +instance to io-classes. We also improved nothunks +library to make debugging easier and we provided a NoThunks instance for +ThreadId which we will need in the future (see nothunks#33).

    We released a new version of io-classes (version 1.2.0.0) and related +packages to Hackage.

    We addressed all review comments on the eclipse evasion PR which introduces big +ledger peers, ouroboros-network#3886.

    We fixed how SIGHUP signal handlers are registered, so it's not possible to +shutdown a node which was starting while trying to update network topology, +see cardano-node#5421.

    I didn't mention that in the previous update, so here it goes: in the previous +sprint we released ouroboros-network-0.8.2.0 and +ouroboros-network-framework-0.7.0.0.

    · 3 min read
    Marcin Szamotulski

    Network Update (Sprints 39 & 40)

    The network updates got distracted. Mostly because of me leaving for the meeting in Edinburgh, Scotland and the being away. +It was great to see and talk to so many of the community members.

    Sprint 39 (Jun 26 - Jul 09)

    Major changes

    Now the following list of traces will be turned on by default:

    node-to-client protocol
    • LocalConnectionManagerTracer
    • LocalInboundGovernor
    • LocalHandshake
    • LocalServer
    node-to-node protocol
    • Server

    See cardano-node#5353. This will be released in node-8.2.0.

    We made sure that cardano-client-0.1.0.x library (which is db-sync) is not using the experimental node-to-client protocol. +The cardano-client-0.2.0.0 was not affected. +See ouroboros-network#4612.

    We merged the dynamic block production feature to ouroboros-consensus (also available in the cardano-node-8.2.0 release). +Dynamic block production enables hot-swap p2p nodes, which are important for the p2p deployment of block-producing nodes. +See ouroboros-network#3159, [ouroboros-consensu#140].

    We continued to review the implementation of big ledger peers for eclipse evasion, see ouroboros-network#4462.

    Minor changes

    Sprint 40 (Jul 09 - Jul 23)

    Major changes

    We integrated ouroboros-network-0.8.2.0 with the master branch of cardano-node for the 8.2.0 release (the version match between ouroboros-network and cardano-node is purely accidental). +This includes:

    • integration with dynamic block production feature. +This feature is documented in the following PR.
    • Warm valency for local root peers (see below).

    For the full list of features included in the 8.2.0 release from the network side, please take a look at the pre-release nodes.

    We improved the memory footprint of peer metrics measured by the P2P stack. +Peer metrics are used to decide which peers to demote every churn interval (roughly every hour with some probabilistic fluctuation). +See ouroboros-network#4620. +The improvement will be available in cardano-node-8.2.0.

    We added an optional explicit warm valency to local root peers of the P2P topology file. +Previously we used an implicit valency, e.g. the node keeps connections to all of the local roots; with local warm valency the node will pick only that many peers from the local root peers group to connect to. +The hot valency (previously known simply as valency) hasn't changed, but it must be smaller than the warm valency as hot peers are selected from warm ones. +Warm valency is a useful feature to limit resource consumption if one of the domain names in the local root peer group resolves to many IP addresses. +See ouroboros-network#4575, cardano-node#5409.

    · 2 min read
    Marcin Szamotulski

    Network Update

    Key contributions

    We held a series of session to review the implementation of big ledger peers +(eclipse evasion). See #4462.

    We get a request from a 3rd party to clarify an inconsistency between CDDL spec +and protocol implementation. We worked out a nice solution which takes +advantage of the any notion available in CDDL. On the Haskell side we +provide Any type which gen generate almost any CBOR term (some are excluded +only because they are not decoded back to the same form, and we relay on that +property). See #4580.

    We fixed a bunch of problems of the cardano-cli ping command. It also now has +a limited support of node-to-client mini-protocol (the -c option is +ignored, as it cannot be supported by node-to-client protocol). Note that +the format of messages has changed, timestamps are printed in ISO8601 format. +See #4601, #5326, #5313, #30

    In order to provide a new flag in the topology file which enables ledger peers +when the chain is close to the tip, we continued to work on #4530. This is +currently in review, the consensus team will need to provide us with the new +api. This feature is useful for two reasons: makes it easier to maintain +a topology file, it will also limit the traffic on public roots generated by +for example full node wallets and distribute it to ledger peers.

    We also continued to work on a blog post which describes the journey of design +& implementation of the dynamic P2P network layer. Too be announced soon :).

    Other smaller changes

    We limit the concurrency of resolving dns names. Up to 8 root peers or ledger +peers DNS names are resolved concurrently, and at most 2 local root peer DNS +names. See #4596.

    We fixed handshake query timeout in #4603.

    We renamed one of the block-fetch decision constructors as requested by the +consensus team, see #4608.

    + + + + \ No newline at end of file diff --git a/tags/network/page/3/index.html b/tags/network/page/3/index.html new file mode 100644 index 00000000000..55e99773587 --- /dev/null +++ b/tags/network/page/3/index.html @@ -0,0 +1,88 @@ + + + + + +24 posts tagged with "network" | Cardano Development Updates + + + + + + + + + + + + +
    +

    24 posts tagged with "network"

    View All Tags

    · 3 min read
    Marcin Szamotulski

    Network Update

    Key contributions and advances

    We merged light peer sharing feature, which allows to include inbound peers +into outbound governor known peers. This is the primary way for new +unregistered nodes to enter the network, which then can be shared using peer +sharing. Note that peer sharing is an experimental feature which is disabled +until genesis & eclipse evasion as fully implemented. See #3596.

    We are making progress reviewing eclipse evasion, #3886.

    We fixed another bug in local root peers. We found out that if the local roots +where ignored until the first domain name was resolved, see #4583. The bug +fix was backported and released in ouroboros-network-0.8.1.1.

    We re-started working on dynamically enabling block forging to address issue +#3159, which will enable us to release P2P on block producing nodes. See #140.

    New cardano-ping / cardano-cli ping release

    We prepared a new release of cardano-ping library which supports the new +query feature (query supported versions). See #4589, #4593 and #5313. +The new version of cardano-cli ping will use ISO8601 formatted +timestamps; also the formatting of ping results is slightly improved, and it +will introduce the new --query-versions (-Q) switch. If the remote site +supports the query parameter, the command will print:

    redacted-ip:port network rtt: 0.064
    redacted-ip:port handshake rtt: 0.064010896s
    redacted-ip:port Queried versions [NodeToNodeVersionV11 764824073 InitiatorAndResponder,NodeToNodeVersionV10 764824073 InitiatorAndResponder,NodeToNodeVersionV9 764824073 Initiat
    orAndResponder,NodeToNodeVersionV8 764824073 InitiatorAndResponder,NodeToNodeVersionV7 764824073 InitiatorAndResponder]

    otherwise it will print the negotiation results

    redacted-ip:port network rtt: 0.045
    redacted-ip:port handshake rtt: 0.101867615s
    redacted-ip:port Negotiated version NodeToNodeVersionV10 764824073 InitiatorAndResponder

    Note that in that case cardano-cli ping offers InitiatorAndResponder, which +allows us to detect whether the remote side is an InitiatorOnly or +InitiatorAndResponder. Also cardano-cli ping will no longer announce +itself as InitiatorAndResponder, except for the case mentioned above.

    Other smaller contributions

    On a request from the Marlow Team, we published haddocks of typed-protocols, +which are now available here (#40, #41).

    We made a new release of strict-stm-1.1.0.1 on Hackage, which fixed a bug in +package description file, #101 .

    We also helped to debug a deadlock when using named pipes on Windows in the new +RawBearer API. The API is being used to store secret keys only in memory. +The PR #4395 is under review.

    We also have two more PRs which are under review:

    • #4530: enabling ledger peers on a fixed number of slots before the tip of the chain;
    • #4580: a PR which fixes inconsistencies in one of our cddl specs.

    · One min read
    Marcin Szamotulski

    High level summary

    We continued working on eclipse-evasion. We also analysed and fixed a bug +when using DNS names in local root peers. We continued working on engineering +blog post about P2P. We released a new version of packages for +cardano-node-8.1.0 release.

    We improved our CI, removed obsolete scripts add extra validation which checks +if CHANGELOG.md files were updated.

    We also improved release scripts.

    Detailed summary

    • Eclipse evasion: #4462
    • Local root peers bug fix: #4559
    • Release to CHaP: #4573
    • CI improvements: #4572
    • Release script improvements: #4573

    · 2 min read
    Marcin Szamotulski

    High level summary

    We started working on a new way to switch between root & ledger peers (see +below). We continued to work on eclipse-evasion. We merged changes to +Handshake contributed by Galois Inc. We made improvements to our tests (fixed +a flaky test, added cddl specs for NodeToNodeVersionData and +NodeToClientVersionData). We improved our CI and automated the process of +releasing new package version to CHaP.

    Detailed summary

    We continued to work on testing eclipse-evasion.

    We came up with an idea to limit how full node wallets relay on root peers +(currently operated by IOG, in future also CF and Emurgo). We designed +a switch to use ledger peers if the node tip is close enough to the current +time. For more details see #4530.

    We merged changes to the handshake mini-protocol which allow one to query +server's node-to-node / node-to-client parameters. We are grateful to +Galois Inc. for implementing it, #4256 and #4538. We published new version +of packages to CHaP chap-#253.

    We added DiffusionError wrapper. Thanks to it, ouroboros-consensus will +not duplicate diffusion errors messages in the log, #4537.

    We fixed an issue which caused one of our tests to be flaky, #4515.

    We added cddl tests for NodeToNodeVersionData and NodeToClientVersionData: +#4540, #4544 (in review).

    We wrote scripts which will help us release packages as well as verify that we +released all the package necessary to build the newest set of packages, +#4542.

    We renamed the consensus startup tracer and make sure it doesn't log +ExitSuccess exceptions, consensus-#71.

    We reviewed PR which adds RawBearer API, #4395.

    We made series of improvements to our CI:

    • #4539: we don't need to install cryptographic libraries in CI;
    • #4545: Javier Sagredo (consensus) cleaned up CI after consensus moved +to a new repo;
    • #4546: we switched to use GitHub merge queues;
    • #4549: we made it possible to trigger building haddocks manually;
    • #4553: we fixed and enhanced caching of building dependencies.

    · 2 min read
    Marcin Szamotulski

    High level summary

    The networking team has released the following packages to Hackage:

    We published an announcement blog post. We made progress +also on another blog post which will describes the design of the P2P networking +layer.

    After moving ouroboros-consensus to its own repository, we made +ouroboros-network compatible with GHC 9.4 and 9.6.

    We made cardano-client library independent of +ouroboros-consensus-diffusion.

    We prepared release of network packages for cardano-node-8.0.

    Detailed log

    Ouroboros-Network

    IO-Sim

    • io-classes-1.0.0.0, and following up releases: 1.0.0.1 (ghc-9.6 +support), 1.1.0.0 (documentation fix).
    • Fixed timeouts and delays in io-sim in a series of PRs: io-sim#81, +io-sim#82, io-sim#86, io-sim#87.
    • Renamed a module: io-sim#88.
    • Fixed a failing registerDelayCancellable test: [io-sim#80].
    • Use GitHub merge queue in io-sim repository.
    • CI: download stylish-haskell: io-sim#83.

    Typed Protocols

    · 2 min read
    Marcin Szamotulski

    High level summary

    In the last spring we released cardano-node-1.35.6 with dynamic P2P +functionality.

    We received reports from some SPOs who encountered problems with their non +P2P block producing nodes not being able to connect to their P2P relay. Karl +Knutsson (from Cardano Foundation) reproduced this issue between two nodes (a +non P2P and a P2P one) on mainnet. Karl and the IOG Networking Team analysed +it and found a bug in the legacy non p2p code. The bug is only possible to +trigger with a P2P node which is binding its outbound connection port to +a fixed IP address and port (default in p2p). A possible solution was found. +For more information see #4465.

    We released cardano-ping-0.1.0.0 package to CHaP. cardano-ping is no +longer available as a standalone binary, but instead it will become part of +cardano-cli (see #4664)

    We are testing cardano-node with peer sharing functionality (#4019).

    We are working on eclipse evasion. We added new class of peers: big ledger +peers to the outbound governor, implemented tests and fixed found issues +(#4462). We also made the information if a given peer plays the role of +a big ledger peer to the mini-protocols. This will allow to modify +mini-protocol applications for such peers. As part of this functionality we +refactored some core types in the network code which simplifies exposed API.

    Together with Moritz Angerman we started to update io-sim to ghc-9.6.1 (see +#73).

    We merged a fix of configuration of accepted connections limit in +cardano-node (see #4902).

    + + + + \ No newline at end of file diff --git a/tags/network/page/4/index.html b/tags/network/page/4/index.html new file mode 100644 index 00000000000..026aa460780 --- /dev/null +++ b/tags/network/page/4/index.html @@ -0,0 +1,106 @@ + + + + + +24 posts tagged with "network" | Cardano Development Updates + + + + + + + + + + + + +
    +

    24 posts tagged with "network"

    View All Tags

    · 2 min read
    Marcin Szamotulski

    High level summary

    In the current sprint the networking team focused on fixing bugs and pushing +forward implementation of eclipse evasion. We also found a bug in our +simulation testing setup (in integration of test node). We also overviewed the +work on extending handshake protocol which is delivered by Galois Inc.

    We published ouroboros-network-0.4.0.1 and +ouroboros-network-protocols-0.3.0.0 to CHaP.

    We also fixed a bug in cardano-node which results in not being able to +configure inbound connection limits, see PR #4902.

    Together with Karl Knutsson (CF) we realised an issue in cardano-cli: it's +validation of DNS names, IP address & ports when registering a stake pool +should be more strict to protect against common mistakes which we identified on +the chain. See issue #4929.

    Detailed work log

    In PR #4385 we fixed two bugs in peer state actions. First one results in +a busy loop if demotion from hot to warm times outs. This busy loop is +eventually exited when mux exits (we reported this in our previous report). +This fix made it to 1.35.6 release as well.

    In addition the PR #4385 also fixes another bug which results in hot -> warm +-> hot demotion / promotion busy loop.

    The PR #4385 also fixed a bug in a node only used in simulation which +resulted in not using chain-sync or block-fetch mini-protocols. In the +review process, we realised that the header-body split in the simulated node +requires further work (see PR #4419, which is under review).

    The PR #4385 also extend our generators, which together with the above fix, +cover the hot -> warm -> hot demotion / promotion busy loop.

    In PR #4419 we introduce a ChainDB for our simulation node, which plays +similar role to ChainDB in the ouroboros-consensus: a persistent (across +simulated restarts) store of blocks which does chain selection. This ensures +that the simulated node is using block-fetch to download blocks announced by +chain-sync mini-protocol.

    We also made progress with reviewing PR #4019 - peer sharing.

    We also fixed issue #4370 - a connection manager test failure, see PR #4384.

    · One min read
    Marcin Szamotulski

    High level summary

    Recently QA found a bug in P2P code, which results in busy loops. We added one +fix to 1.35.6 release, another one will likely be part of next release. The +first one is already included in ouroboros-network-0.3.0.1 release. These +bugs could only affect nodes which are out of sync and thus should not impose +risk on well maintained nodes on mainnet. We also advertise to deploy at most +one of the relays as a P2P node, which shields from possible consequences.

    We recently finished design phase of eclipse evasion and we started +implementing it (see issue #3886 for progress).

    Galois finished implementing Handshake extension which will allow to query +network protocol versions (see pr #4256).

    We also recently released a newer set of network packages to be integrated with +cardano-node master branch, this includes:

    * monoidal-synchronisation-0.1.0.2
    * cardano-client-0.1.0.2
    * network-mux-0.3.0.0
    * ouroboros-network-api-0.1.0.0
    * ouroboros-network-protocols-0.2.0.0
    * ouroboros-network-testing-0.2.0.1
    * ouroboros-network-mock-0.1.0.0
    * ouroboros-network-framework-0.3.0.0
    * ouroboros-network-0.4.0.0 (it doesn't not yet include the fix we included
    in `0.3.0.1`)

    · 2 min read
    Marcin Szamotulski

    High level summary

    We have been working towards cardano-node-1.35.5 release. QA & benchmarking +teams gave a green light for the release, and we made decent progress with some +CI problem which we encountered on the way (PR #4612). We are also working on +peer sharing, making improvements in our testing infrastructure, reducing +technical debt and making progress towards io-sim-1.0.0.0. Galois is making +progress on Handshake improvements.

    Low level summary

    Our diffusion simulation network now includes a mixed network of initiator +only and initiator and responder nodes. issue #4222

    We are now reviewing the peer sharing pull request.

    We are also reviewing pull request which introduces handshake query flag. PR #4256

    We fixed a bug in our network simulator. The bug was triggered when a node +died when performing a simultaneous TCP open (a corner case of a corner case!). PR #4265

    We also refactored Snocket interface and removed the bearer construction from +its methods. PR #4260

    We are working towards releasing io-sim-1.0.0.0 on Hackage, which includes +reviewing two PRs: PR #57 and PR #60 as well as writing an announcement +blog post.

    · One min read
    Marcin Szamotulski

    High level summary

    In last sprint the team focused on preparations for the conference talk at +OPODIS 2022. We also worked on preparations to publish io-sim and related +packages on Hackage (PR #57, PR #60).

    We also started reviewing:

    • ouroboros-network
    • cardano-node
    • cardano-ledger +repositories for open-source readiness (PR #4128).

    We prepared a PR which changes how node-to-node and node-to-client protocol +versiones are serialised in cardano-node log (PR #4691).

    · 4 min read
    Marcin Szamotulski

    Stake-Driven Data Diffusion Release for Relays

    IOG networking team decided to release the Stake-Driven Data Diffusion with +Robust Optimised Peer Selection also more commonly known as P2P. In the +last update, we informed about a performance regression, but it turns out it +only affects block producers, and thus we highly advise against running it on +such nodes. Further investigation is required to find the cause of it.

    On IOG's benchmarking cluster we have seen quite a good performance improvement +on block propagation itself. The cluster is running a static topology with +valency 6 (each node is connected to 6 other nodes). In which every of the 50 +nodes are block producers. The setup of this network is the same as mainnet. +We've seen 40-50% performance improvement on block propagation comparing to the +same cluster deployed with the same topology but using non-P2P nodes. We think +this performance improvement is caused by using full duplex connections. Quite +likely the transaction traffic floating in both directions on the same TCP +connection helps to keep the TCP window open. Note that in a cluster of 50 +nodes with valency 6 the probability of having at least one duplex connection +is more than 50%. We don't expect the same improvement on mainnet because the +network is much wider and the transaction traffic is not as large.

    Just before the release we squashed two small bugs:

    • issue #4163 - top level integration bug in keep-alive;
    • issue #4177 - a bug in outbound-governor;
    • PR #4165 - a fix cardano-ping support of NodeToNodeV_10.

    Peer Sharing

    We were carrying a review of peer sharing PR.

    DeltaQ

    Neil Davies was invited to give a guest lecture entitled Avoiding System Catastrophes at UCLouvain.

    What have we achieve last sprint

    • issue #4163: we found out that a control message is not passed to the +keep-alive mini-protocol, this results in every demotion executing demotion +timeout rather than a graceful termination. With the fix the node will no longer log:

      { "kind": "PeerStatusChangeFailure"
      , "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"
      , "reason": "TimeoutError"
      }
    • issue #4177: we fixed an assertion failure in the outbound-governor; now +we don't try demoted peers which are being demoted already.

    • PR #4155: we refactored ouroboros-network packages. There's a top level +ouroboros-consensus-diffusion package which integrates network +& consensus code. We also introduced:

      • ouroboros-network-api package which contains the API shared between +network & conensus;
      • ouroboros-network-mock package which contains mock API used for testing +(e.g. a mock chain & chain producer, etc.)
      • ouroboros-network-protocols package which contains implementation of all +(but handshake) mini-protocols, exposes a testlib and contains test +and cddl components.

      This made the dependency tree of network & consensus packages much +cleaner.

    • PR #4169: we described the usage of release branches in CONTRIBUTING.md +doc.

    • PR #4165: we fixed cardano-ping support of NodeToNodeV_10 protocol.

    DeltaQ

    The abstract of the talk:

    An essential step to ensuring that distributed systems are fit for +purpose.

    Distributed systems have become an integral part of our society and +daily lives. We are, both implicitly and explicitly, individually as well as +collectively, placing ever more trust in them.

    Are they worthy of this trust? Our need for them to be ‘fit-for-purpose’ goes +well beyond notions of functional correctness (i.e. never getting the wrong +answer). We need them to deliver the desired outcomes in a timely, robust, +reliable, resilient fashion, at scale and in a sustainable way (both +economically and environmentally).

    This all sounds like a worthy aspiration, but what would be a practical +approach to capturing and reasoning about these issues? How can we ensure that +systems can meet their fit-for-purpose objectives, not just in their design but +as they are deployed, encounter the imperfect world, are scaled to become +economic, and proceed into ongoing maintenance?

    This talk will illustrate how the notions of Outcomes and Quality Attenuation +(as captured by ‘∆Q’) are being used to both frame the necessary notions and +provide a basis for assuring the refinement and reification of such systems, +from initial concept to operational infrastructure.

    You can download the slides from here.

    + + + + \ No newline at end of file diff --git a/tags/network/page/5/index.html b/tags/network/page/5/index.html new file mode 100644 index 00000000000..1c71b9cb409 --- /dev/null +++ b/tags/network/page/5/index.html @@ -0,0 +1,117 @@ + + + + + +24 posts tagged with "network" | Cardano Development Updates + + + + + + + + + + + + +
    +

    24 posts tagged with "network"

    View All Tags

    · 2 min read
    Marcin Szamotulski

    High-level summary

    In last sprint we got a performance report of P2P performance testing cluster +(which consists of 50 nodes). There is a performance regression in the header +notification metric. The P2P cluster is constructed with the same +topology as the non-p2p reference one this indicates some regression which +needs to be further investigated. This poses a risk for releasing P2P.

    We also continued to work on peer sharing: pull #4019.

    We continued working on dynamic block production which is required for P2P +release for BP nodes: pull #3159.

    We simplified the P2P topology format: issue #4559, pull #3888.

    We added a new trace point for asynchronous demotions of local peers with +Warning severity. This trace is important for SPOs.

    Detail description

    Performance regression

    Below we include a graph which shows the performance regression of the P2P code base vs non P2P.

    On the x axis is time in seconds which measures the delay from the start of +the slot to when a header was received. The y axis is the percentile of nodes +that received a header. We are currently investigating possible causes of the +regression.

    New P2P topology form

    The new topology file format is described in this issue #4559.

    Tracing improvements

    • We improved a handshake error reporting, pull #4136
    • We added TraceDemoteLocalAsynchronous rendered as DemoteLocalAsynchronous +in json format, pull #4127. Such demotions should be investigated by the +pool operator. They can indicate a problem in the deployed system, but also +they could indicate a remote problem in arranged connections with other SPOs.

    Open Source Improvements

    We improved documentation of io-sim and typed-protocols for open-source +contributors and/or maintenance tasks: pull #22, pull #45, pull #48.

    · 3 min read
    Marcin Szamotulski

    High-level summary

    The team has focused on debuging & fixing bugs for the P2P single relay release, which included

    • diagnosing, fixing and writing tests for a bug in peer-state-actions which +fortunately hasn't been released;
    • diagnosing & preventing misconfiguration of DNS

    We also focused on developing peer sharing. We also held a session with +the scientists on eclipse evasion.

    Detailed description

    P2P Network Stack

    During the past two weeks the team focused on p2p single relay release and peer +sharing. We found and fixed an important bug recently introduced in one of the +components of p2p networking stack (fortunately never released). Together with +a fix, we designed a unit test diffusion simulation as well as quickcheck +property test (both could reproduce it). We also changed the code in a way that +if such a bug is reintroduced in the future, it will be obvious to diagnose. +For more see:

    Initial benchmarking run of the P2P code was executed. The results where +unlike what we see on the mainnet. We found a possible misconfiguration of the +cluster (caused by 0 TTL on domain names), which could be the direct cause of +it. We wrote a PR which rules out such misconfiguration. We are awaiting on +the next benchmarking results. See more at:

    ouroboros-network#4106

    We also started working on P2P single relay release. The PR +ouroboros-network#4120 +includes 108 patches cherry-picked from the master branch. We started +working toward integration these changes against the release branch of +cardano-node. Early next week we ought to be able to have an early version +of cardano-node with non experimental P2P support!

    For more detailed release plan please see P2P - Single +Relay +issue.

    Consensus

    We identified and fixed missing error reporting in consensus +initialisation phase. See more at +ouroboros-network#4015

    Cardano Node

    We also made changes in cardano-node in order to give better experience for +node operators. This includes updating severities of some of the traces as +well as implementing new format of the p2p topology file. For more see:

    Peer Sharing

    We continued working on implementation of peer sharing. We have an early +implementation which will be reviewed and analysed in next weeks. We started +working on cardano-node integration. We need +PR #4392 to be merged +before such integration will be able to land in cardano-node, although this +is not blocking us currently. See more at:

    Eclipse Evasion

    We held a session which included Alexander Russel, Sandro Coretti-Drayton and +Nick Frisby from the consensus team. We discussed high lever design of the +eclipse evasion scheme, which is important for the design and implementation of +ouroboros-genesis. We got a positive feedback from the researchers.

    IO-Sim

    In this period we made little progress towards releasing IO-Sim on Hackage. +A single PR which added +a few missing instances of the STM monad.

    Open Source

    We made sure the CI runs for PRs which comes from forks (which is important to +accept contributions from 3rd parties).

    Mithril Cardano Integration

    We held initial discussions with Arnaud Bailly about possible path to integrate +mithril to cardano-node and take advantage of the ouroboros-network +diffusion layer.

    · 3 min read
    Marcin Szamotulski

    Network Update

    Ouroboros Network

    Ouroboros Consensus

    • Recently we found out that the consensus does not log exceptions thrown during +intiialisation. This was fixed in +PR input-output-hk/ouroboros-network#4015 +As part of this pull request we also changed that all exceptions rethrown by +the connection handler thread are wrapped in ExceptionInHandler.

    Some older items, which were not announced

    • We identified and fixed an issue related to socket activation (socket options +where not set for sockets passed through socket activation). +PR input-output-hk/cardano-node#3979 +This fix will be released in the next cardano-node release.

    Cardano Node

    • We extended the NixOs service module so that one can modify socketPath, +runtimeDir, databasePath, traceSocketPathAccept, +traceSocketPathConnect and stateDir options. +PR input-output-hk/cardano-node#4196

    IO-Sim

    We resolved a number of issues before release of io-sim on hackage:

    See PR #24.

    We also improved experience for contributors of io-sim and typed-protocols by adding issue templates:

    Typed Protocols

    Input Endorsers Simulation

    New features include:

    • Histograms of block arrival frequency, for both network (inbound) and CPU +(block validation). This is interesting to check that we're not overloading +the CPU block validation capacity, or network link capacity. Or alternatively +to observe the behaviour in an overload situation if we set the block +generation rate high enough.

    • Pie chart of utilisation of TCP links. This shows how small a fraction of +links are being used at any one time, and shows that once the system "warms +up" and is operating stably, most block delivery is ballistic.

    • Showing off the new screen layout combinators, that let us put multiple +charts, titles etc on screen at once and scale them to whatever screen or +video resolution we like without having to tweak numbers (this example is +scaled to fit 1080HD video resolution).

    · One min read
    Marcin Szamotulski

    The networking team took an active part in the project iteration (PI) planning +session, see cardano-node backlog for detailed +outcomes.

    • We started working on a detailed design / implementation plan for gossip.

    • We merged input-output-hk/ouroboros-network#3859 which +sets the ouroboros-network repository for the single relay release.

    • We identified a bug in the network simulator, which is fixed in the +input-output-hk/ouroboros-network#3852. +The above PR was reviewed.

    • We set the tracing configuration for nodes which we deploy and fixed and +identified some deployment hiccups. We identified some bugs in the RT view +which were registered by the maintainers. +input-output-hk/ouroboros-network-ops#4

    • We fixed typos in network-mux library: +input-output-hk/ouroboros-network#3921

    • For easy of debugging we renamed a trace point: +input-output-hk/ouroboros-network#3922

    • Duncan iterated on his simulation / visualisation. He also was able to +identify and fix a bug in the simulator. The simulation contains 50 nodes. +Dashed lines indicate and established connection, while solid lines indicate +a TCP connection with fully open TCP window.

    + + + + \ No newline at end of file diff --git a/tags/open-source/index.html b/tags/open-source/index.html new file mode 100644 index 00000000000..8ef07a550e2 --- /dev/null +++ b/tags/open-source/index.html @@ -0,0 +1,45 @@ + + + + + +One post tagged with "open-source" | Cardano Development Updates + + + + + + + + + + + + +
    +

    One post tagged with "open-source"

    View All Tags

    · 2 min read
    Marcin Szamotulski

    High Level Summary

    • We've been working toward publishing Cardano Backlog, currently its in +review by the IOG communication team.
    • We identified a number of libraries which can be published.
    • We setup and enhanced cardano-updates.

    Detailed description

    I am glad to announce that I was given the role of open-source advocate for +cardano project. In last few weeks we were making steps towards publishing our +backlog. It's currently under review by the communication team, although most +of the issues are already visible across various repositories.

    The open-source initiatives have their own +project. It is set up +to help us track our major open-source activities. Right now there are two +work streams:

    We identifies a number of libraries across all the teams which contribute to +Cardano which we would like publish to publish, see the following +link. Arnauld Bailly recently published +quickcheck-dynamic +library on Hackage. The networking team is slowly progressing towards +publishing io-sim and related packages, checkout the progress +here.

    Thanks to Arnaud Bailly our Cardano Updates website has +a new look & feel! It's using docusaurus.io.

    Christian Taylor carried recently a detailed analysis of our open-source +repositories. He collected many interesting metrics, which allows us to see +where we need to improve as an open-source project to make the Cardano project +and many smaller related libraries which we maintain be more open and available +for open-source contributors.

    The graph below shows which documents the 55 most important Cardano +repositories are missing the most: +Documentation Adoption +You can expect we will improve in these metrics in the coming weeks.

    + + + + \ No newline at end of file diff --git a/tags/performance-tracing/index.html b/tags/performance-tracing/index.html new file mode 100644 index 00000000000..edf85c0746c --- /dev/null +++ b/tags/performance-tracing/index.html @@ -0,0 +1,62 @@ + + + + + +25 posts tagged with "performance-tracing" | Cardano Development Updates + + + + + + + + + + + + +
    +

    25 posts tagged with "performance-tracing"

    View All Tags

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: Release benchmarking for node 8.7.0. Also, we performed the first-ever Conway benchmarks.
    • Development: Conway capability of our workload generator has been implemented and merged to master.
    • Infrastructure: Changes to our workbench facilitating easy access and archiving of raw benchmarking data.
    • Tracing: Quality-of-life improvements to tracing output and addition of a test suite.
    • Nomad cluster: Expand the list of benchmarking profiles that can be run on Nomad; generalize cluster topology generation.

    Low level overview

    Benchmarking

    A full set of benchmarks for node 8.7.0 has been performed, with the focus of enabling the next mainnet release. We've measured slight performance improvements of 8.7.0 over 8.6.0, and can confirm no regressions have been introduced.

    Furthermore, we've run system integration level benchmarks in the Conway era for the first time, on the same node version. +Only Babbage-compatible workloads have entered comparison as to ascertain performance consequences of only changing the ledger version, and nothing else. The results are very promising, as we could show that switching ledger versions for existing workloads does not come with a performance penalty.

    Development

    Our transaction generator has been extended to be able to submit all present benchmarking workflows in the Conway era. +Currently, we're looking into adding Conway-exclusive features, such as DRep registration. Those would be submitted at the very beginning of a run, as we're interested in seeing potential performance implications of maintaining DRep sets of varying size in ledger. Furthermore, this will serve as the basis for future development Conway-exclusive workloads, such as governance actions or vote tallying.

    Infrastructure

    As our workbench will be pivotal in orchestrating and organizing benchmarking runs on the Nomad cloud backend, we've +improved how raw benchmark data is tagged, which metadata is documented in an automated manner. This enhances both access to existing run sets, as well as maintaining an archive for benchmarking data.

    Tracing

    The new tracing system is currently receiving usability improvements as we're reworking the output of several trace messages. +Additionally, we're setting up a rigorous test suite to provide safety for future development of and component integration inte the system.

    Nomad backend

    We've been working on adapting various benchmarking workloads, which are defined by our workbench's profiles, to running on the new infrastructure. This mainly concerns a workload utilizing Plutus, as well as peer-to-peer flavoured workloads. Furthermore, we're implementing a solution to create all possible cluster topologies algorithmically, instead of still using fixed literal definitions for some cases.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: Release benchmarking for node 8.6.0 as well as benchmarks scrutinizing GHC versions and the new tracing system.
    • Development: PlutusV3 capability of our workload generator has been implemented.
    • Tracing: First round of optimization of the cardano-tracer service has completed, awaiting validation.
    • Nomad backend: A significant PR has landed addressing automation features and debugging capabilites.
    • Workbench: Configurable remote environments and improvements to run documentation have been merged to master.

    Low level overview

    Benchmarking

    We've performed and analyzed a full set of benchmarks for node 8.6.0, both in comparison to recent release tags +and mainnet version 8.1.2. A lot of development work has entered the system since then, so it is crucial +we can rule out any potential performance risks for the next mainnet release.

    Additionally, we've been benchmarking GHC9.6.3 builds of cardano-node. Overall, we've observed reliable optimization behaviour by that compiler version - which is much more in line with expectations than what we've seen on GHC9.2.7. Getting evidence on how predictable (and malleable, by code annotations) performance is when building with a certain compiler version is essential for settling on a version as supported release platform.

    A last set of benchmarks was dedicated to the new tracing system with node 8.6.0. We were able to show that +there is no performance risk to enabling the new system, even when forwarding all trace messages to a cardano-tracer +service on the receiving end. Key metrics for block forging, as well as block diffusion, did not exhibit any regression.

    Development

    For future benchmarks to be built around PlutusV3, we've equipped our transaction generator with basic integration and tests for the upcoming Plutus version. This enables us to target the new cost model and potential changes +to the execution budgets by developing specialized workloads.

    Tracing

    The cardano-tracer service has received its first batch of optimizations. Profiling output is promising; to measure +performance for a long service run time, we're currently equipping the service binary with the same capability to +emit regular resource traces as cardano-node. Analysis of those will be the basis for validating this and possible future optimization efforts.

    Nomad backend

    Many improvements for the nomad backend have been implemented and merged to master. This encompasses a unified naming schema for all nomad profiles, improved internal management of cluster topology, a more fine-grained healthcheck service, +more detailed automated documentation of underlying hardware, as well as lazy resource release. The latter enables +our team to investigate and debug interrupted runs for the exact moment and in the exact cluster state a potential failure occurred.

    Workbench

    Our performance workbench has seen upgrades in documenting and reporting cardano-node builds. This ranges from capturing package versions and commit ids of key dependencies, to querying a deployed node for its build compiler. +When alternating between compiler versions and benchmarking custom built branches, automating such documentation is essential.

    Furthermore, the workbench is now able to access several remote deployments on all active clusters. This allows for fetching data, analyzing, comparing and reporting on all benchmarks from just one centralized workbench instance.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: Continued benchmarking of UTxO-HD and performed benchmarks for the new tracing system.
    • Consensus QTAs: Our protoype approach is applied to potential regression fixes with GHC 9.2.7.
    • Development: We've developed strategies for future benchmarks of PlutusV3 and UTxO-HD's on-disk backing store.
    • Tracing: The machine-readable tracer configuration has been merged. Optimization of cardano-tracer started.
    • Nomad backend: Ongoing variance analysis and refined cluster topology.

    Low level overview

    Benchmarking

    Performing and analyzing benchmarks for the UTxO-HD feature is an ongoing effort; we can reliably assess the +performance of the in-memory backing store and evaluate possible optimizations (or regressions) for it.

    Furthermore, benchmarks of our new tracing system after several rounds of optimization have been performed. The results +show all key metrics now being unaffected by the choice of tracing system (legacy or new) - with the new system being able to provide more features and flexibility in comparison. The benchmarks also highlighted further points for optimization, with the focus now on the cardano-tracer service.

    Consensus QTAs

    The Quantitative Timeliness Agreements (QTA) prototype is being used in coordination with Consensus and DevX to validate a series of patches that address optmization opportunities which GHC8.10 seizes, but GHC9.2 misses. The +feedback from this approach is much more immediate than running benchmarks at system integration level. But once we eventually do, we expect to reproduce the relevant observations - which would mean a big step towards maturing the prototype.

    Development

    Benchmarking UTxO-HD's on-disk backing store needs special attention: in virtualized environments, disk I/O is not a reliable metric as it passes several layers of indirection. As this is the very metric which will influence overall performance of this UTxO-HD flavour, we developed a plan to monitor such nodes, connected to a running network, on dedicated hardware - having direct SSD access. Replicating this setup for an entire benchmarking cluster of such nodes will be a future effort.

    PlutusV3 will come with new builtins and a new cost model. It will take a specialized benchmark to ascertain the soundness of that model running a full cluster of nodes, possibly stressing expensive builtins. At the same time, +we'd like to validate the many improvements that have gone into the Plutus evaluator.

    Tracing

    The focus for further optimization of the new tracing system has shifted to cardano-tracer - the service +receiving and processing traces from one (or more) nodes. Whilst undisputed that the code living in cardano-node is +more performance critical, the receiving service must still minimize its resource footprint. Moreover, it can +generate load for a running node when querying data points from it - which calls for tight control of that mechanism and its possible configurations.

    Nomad backend

    Variance analysis of new nomad backend has revealed a necessary adjustment of the cluster's topology. We repeated +the same analysis and now see even better confidence in the measurements taken with nomad. This concludes the work on the backend proper for the time being. The last steps before production use will focus on the interface between backend and our workbench, which provides all high-level benchmark definitions and analysis machinery.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed both low-level network and high-level variance analysis of our benchmarking clusters.
    • Infrastructure: Our reporting pipeline was adjusted to classify various workloads easily reducing rework time.
    • Tracing: Work on machine-readable tracing of tracer configuration is ongoing.
    • Nomad backend: We've been able to eliminate several possible confounders on the nomad cluster.
    • Team: We're currently onboarding a new team member: Welcome to Cardano Performance & Tracing, Baldur Blöndal!

    Low level overview

    Benchmarking

    As part of the effort to bring the Nomad backend into production use, we've been equipping both that and the existing benchmarking +backend with means to measure and document network latency for each run. Furthermore we've implemented means to +capture TCP packets for a limited time window during a benchmarking run - which will allow us to spot differences +in the behaviour of the underlying networking stack at OS level.

    Additionally, we're running variance analysis in parallel on both backends to ascertain confidence in metrics originating from either. We've concluded that baseline profile runs aren't directly comparable between the two, so we decided +to compare standard deviations instead to validate the measurements from nomad.

    Infrastructure

    Reporting on benchmarks does require human time and effort to rework the final document. Improvements to the reporting pipeline +have been merged to master. They reduce the time necessary to do so by various changes to the template and the workload classification logic in analysis.

    Beyond that, we've looked into issues where services would quit with an unjustified exit failure upon shutdown - under rare circumstances. By reworking shutdown logic for trace-dispatcher and tx-generator we were able to address those issues.

    Tracing

    After various steps in constructing a configuration upon node startup, it is vital to document +which runtime configuration the node arrived eventually. We're working on providing a machine-readable JSON/YAML +trace message for that purpose.

    This will facilitate hot-reloading a node's tracer configuration in the future: users will be able to take such a trace message, apply their intended change and hot-reload it immediately into the node.

    Nomad backend

    As with the existing benchmarking cluster, nomad is currently under scrutiny with regard to the reliability of metrics it +produces, as well as the behaviour of its OS-level network stack. For instance, differing kernel versions can have an +impact on our measurements, as we'd be basically using two different instruments to take them.

    Along the way we've already been successful in eliminating some possible confounders that had been introduced by the nomad service +or the slightly different system architecture of the new cluster.

    New team member

    Baldur Blöndal is an extremely capable and experienced Haskell developer. Also, he's an excellent fit for our existing team. +So I'm very pleased to welcome him onboard with IOG, and with Performance & Tracing. He will be working on cardano-tracer, the component receiving, processing and making available node traces and metrics.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed and analysed feature benchmarks for both UTxO-HD and the current P2P stack.
    • Infrastructure: Various improvements of our analysis pipeline have been merged to master, supporting safe log truncation.
    • Tracing: Namespace consistency checks have been merged to master along with a curated configuration for benchmarking.
    • Nomad backend: We're productively using the new backend to measure new vs. legacy tracing system, adding many quality-of-life improvements.

    Low level overview

    Benchmarking

    We've completed various runs and analyses targeting two distinct features of the node: UTxO-HD and Peer2Peer.

    With our UTxO-HD benchmark we could clearly localize one point where this new way of maintaining ledger state is still costly, but at the same time confirm that in basically all other aspects UTxO-HD makes no difference in performance.

    The Peer2Peer benchmarks focused on the effects that enabling this feature on a block producing node has on propagation times, as well as scrutinized a proposed change to the Peer2Peer network stack.

    Infrastructure

    As a result of optimizing in-memory representation of log objects, which are constructed from a node's traces, we can now analyse runs that last longer in total. For runs that exceed their expected duration, analysis now supports a truncation +operation that keeps the interdependencies of block events intact.

    Truncation might happen at a slightly different point +in time - and therefore in its log object stream - for each node in the cluster. An additional step validating the block hash timeline of the cluster has been implemented for the pipeline. It provides early feedback on whether a specific truncation will lead to a valid full analysis, which requires much more time.

    Tracing

    Consistency checking of namespace implementation and configuration when using the new system has been completed. +This feature enables feedback on when tracer implementation details in some component might have changed. It's also able to detect when a configuration used for operating a cardano-node shows inconsistencies with the namespaces the system provides - and hence needs attention.

    Furthermore, we've created a fine-grained configuration of the new system that caters to benchmarking's need of very many +detailed trace messages. It's aimed at mirroring the same amount of trace messages, and information, we're seeing from our usage of the legacy system; an important step in making benchmarks between systems comparable.

    Nomad backend

    The new backend is currently being used for further validation with regard to the existing cluster. Additionally, we're using it in production mode to comparatively benchmark both tracing systems after merging past month's optimizations - which is the +first real-life application of the nomad cluster. Hands-on experience in that phase translates into many small improvements which can be immediately applied to enhance user experience for the new backend.

    + + + + \ No newline at end of file diff --git a/tags/performance-tracing/page/2/index.html b/tags/performance-tracing/page/2/index.html new file mode 100644 index 00000000000..84ffb6c69fb --- /dev/null +++ b/tags/performance-tracing/page/2/index.html @@ -0,0 +1,37 @@ + + + + + +25 posts tagged with "performance-tracing" | Cardano Development Updates + + + + + + + + + + + + +
    +

    25 posts tagged with "performance-tracing"

    View All Tags

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: Benchmarking node version 8.2.1 has concluded. Additionally we're developing benchmarking setups for GHC9.6 and UTxO-HD.
    • Infrastructure: Our analysis pipeline has received improvements reducing memory footprint.
    • Tracing: Another batch of optimizations for the new tracing system has been merged; work on namespace consistency guarantees is ongoing.
    • Nomad backend: We're performing and analysing various runs for validation purposes on the new hardware cluster.

    Low level overview

    Benchmarking

    We've performed and analysed the benchmarks for the 8.2.1 version of cardano-node as part of our release benchmarking cycle.

    Setting up cluster benchmarks requires completing full system integration. This applies to both supporting a new build platform, as is GHC9.6, as well as targeting a specific feature, like a UTxO-HD enabled node. Currently, we're working on respective integrations on both those paths.

    Infrastructure

    As cluster runs increase in duration, more and more data is accumulated for analysis. Batch analysis mode needs all data to be held +in memory, which wouldn't fit anymore even on a 64GB RAM machine. Changes to the in-memory data representation improving on compactness were able to reduce the RAM requirements of our analysis pipeline.

    Tracing

    The next portion of optimizations has been completed and merged to master, getting rid of Haskell's native String representation on critical code paths. This concludes the optimization phase of the new tracing system for all its components used by cardano-node.

    The implementation for validation of consistent naming and configuration is ongoing. We're splitting out everything that's verifiable at compile time into a seperate test case which we hope to integrate into CI - leaving only configuration constraints to be verified at or before node startup.

    Nomad backend

    The verification phase of the nomad cloud backend is ongoing. We're able to perform full runs on the new hardware cluster +and porting profiles and configurations from the legacy one. The goal is to reproduce with confidence known regressions, or improvements, between runs performed on the legacy cluster and runs performed with the new backend.

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We've concluded benchmarking node version 8.2.0.
    • Tracing: Optimization of the new tracing system has been merged; we're currently working on self-documenting tracing configuration.
    • Nomad backend: A PR that makes our backend take advantage of added flexibility of the new hardware cluster has been merged.

    Low level overview

    Benchmarking

    As part of our release benchmarking cycle, we've completed and analysed the runs for the 8.2.0 version of cardano-node. In addition to the adjustment of sanity checks in our automation, we had to implement small changes in the analysis pipeline as well to accomodate the new version.

    Tracing

    A significant amount of optimizations for the new tracing system has finally been merged to master. At the moment, +we're working on having a trace message self-document the final tracing configuration of a running node. Apart from adding +insight into the system, this feature also aims at making future hot reloading of tracing configuration explicit and straightforward.

    Furthermore, we're setting up a final round of system integration level benchmarks comparing new against legacy tracing.

    Nomad backend

    The new hardware cluster permits greater flexibility as far as SSH access is concerned. By using nomad for a consistent +and reliable deployment, but taking advantage of direct connections for healthchecks and data transfer we believe we were +able to reduce overall network latency in the nomad cluster. This improves confidence when capturing all network related measurements during our benchmarks.

    A PR that adds these capabalities to our nomad backend - along with very many quality-of-life improvements - has been merged to master.

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We're adjusting the benchmarking cluster to handle runs for node version 8.2.0.
    • Tracing: We've finished optimization of the new tracing system and added extra robustness with regard to namespacing.
    • Infrastructure: We've been working on making all benchmarking code compliant with the latest GHC9.6.
    • Nomad backend: The new backend has seen adjustments due to a change of underlying hardware. Additionally, we've successfully performed various benchmarking runs on it.

    Low level overview

    Benchmarking

    The 8.2.0 version of cardano-node required adjustment of some of the sanity checks that are part of our benchmarking +cluster automation. We've pinpointed the necessary changes and are currently setting up the cluster for the new node version.

    Tracing

    The optimization efforts for the new tracing system have been completed and have significantly reduced the resource footprint +when using it as default for a running node.

    A linchpin of the new system is the organization of traces into a namespace hierarchy. This affects configuration, self-documentation as well as rendering of desired trace messages. The new system is now equipped to detect any +inconsistency in the whole set of tracers, defined across all components, even if they are never turned on in a running node. +This feature adds another layer of robustness to the whole system.

    Infrastructure

    A potential switch to GHC9.6 (or higher) required some work on our code bases to make it compliant with recent compiler +versions. We've future-proofed our benchmarking code.

    Nomad backend

    The hardware cluster that our nomad backend was accessing has been changed, and we were able to adjust our backend +accordingly without touching its higher level abstractions and functionality. Moreover, with the new hardware and cluster setup, certain tasks such as retrieving run artifacts or healthcheck monitoring have become more performant.

    The validation phase is ongoing. We were able to perform successful runs and analyses for various 8.x node versions, including 8.2.0-pre. With parallel runs on the current cluster, we hope to measure the same effects we've observed with the +nomad backend - which will be a big step towards production use.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: The peformance investigation into the compiler switch to GHC9 is ongoing. Additionally, a roadmap for implementing Consensus QTAs has been developed.
    • Infrastructure: Our workbench has undergone some refactoring to seamlessly integrate its profiles into all available backends.
    • Tracing: Optimization of the new tracing system is ongoing and yielding good performance results.
    • Nomad backend: We developed a new feature for the nomad backend which allows pinning deployments to specific machines.

    Low level overview

    Benchmarking

    Our analysis of the GHC9 build of cardano-node has produced several locations in the code base where the new compiler seems to miss opportunities for optimization. Our hypothesis is, that those can account for the difference in resource usage we observe when benchmarking with a full cluster run. Instructing the compiler on how to perform the optimizations which GHC8 apparently applied out of the box requires further investigation.

    In an effort to define Quantitative Timeliness Agreements (QTAs) on a per-component basis, we have coordinated with the Consensus team and developed a roadmap for providing those on consensus level. Making use of the insight that system-level benchmarks allow, we intend to set up and calibrate a benchmark that can reliably predict a regression or optimization for select metrics before needing full integration into cardano-node. This will help tremendously in various ways: catching regressions much earlier, localizing them much easier, avoiding repeated component integration and much shorter feedback cycle.

    Infrastructure

    We have worked on seamless integration of our benchmarking profiles into the many available backends that the workbench provides. The goal was to be backend-agnostic, to guarantee that all benchmarking run artifacts be structurally identical as far as their file name, format and location are concerned. This lead to refactoring work and has already landed in master.

    Tracing

    Much effort went into further optimization of the new tracing system. After working on configuration to align both new and legacy tracing system with regard to their trace frequencies, we could uncover some increase in resource usage. This occurred for corner cases under very heavy load. These cases have been addressed already, and do now surpass the legacy tracing system in terms of performance.

    Nomad backend

    For reliable benchmarking results it is vital to introduce as few confounding factors as possible when performing runs. This includes hardware and network topology. The nomad backend has been outfitted with a mechanism to pin the nomad job for some node in our benhcmarking cluster to a specific machine instance. This greatly increases confidence in the metrics observed from a run.

    Furthermore this feature will detect any change in the underlying hardware or topology so it can be taken into account. The new feature has been merged to master.

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed several new benchmarks and a performance investigation in preparation of switching the default compiler to GHC9.
    • Infrastructure: The first batch of refactoring and documentation for our tx-generator has been merged to master.
    • Tracing: We've looked into an issue where the tracing system's concurrency could prevent a graceful node shutdown.
    • Nomad backend: Our new cloud backend has seen various improvements regarding deployment and monitoring; validation runs for the backend are ongoing.

    Low level overview

    Benchmarking

    The compiler switch to GHC9 as the default build platform for cardano-node and its components still has noticeable effects on system-wide performance metrics. An investigation into the different resource usage profiles of compiler versions does seem to indicate GHC9's significantly different inlining behaviour may produce those effects. We're currently locating the specific places in component code that have the most extensive effect in that regard.

    Using the forge-stress approximation we set up, we could determine that above effect is not due to a range of RTS parameters, as for example the number of capabilites used by the node.

    Infrastructure

    The tx-generator is a crucial part of our tooling responsible for producing very specific workloads for our benchmarking cluster. In an effort to flesh out an API to make it reusable for more general use cases, a first set of refactorings has been merged to master. Additionally, this merge contained systematic documentation both for internal and for exposed areas of the code base.

    Tracing

    The tracing system's concurrency could under certain conditions prevent a graceful shutdown of the node. This issue did occur only after adding specific new traces on a development branch. We could localize and address that issue.

    Nomad backend

    With the data gathered from running the new nomad cloud backend, we've been able to address many, many small and medium-sized improvements. The deployment process has been restructured for better efficiency, and the healthcheck system could be fine-tuned to recognize severity of various conditions that might occur. Optimization of fetching all run data from the cloud for evaluation is in progress.

    Additionally, we're continuing the new backend's validation by setting up test runs and looking into comparative analyses with metrics gathered from the current cluster backend.

    + + + + \ No newline at end of file diff --git a/tags/performance-tracing/page/3/index.html b/tags/performance-tracing/page/3/index.html new file mode 100644 index 00000000000..bf54a67e61f --- /dev/null +++ b/tags/performance-tracing/page/3/index.html @@ -0,0 +1,75 @@ + + + + + +25 posts tagged with "performance-tracing" | Cardano Development Updates + + + + + + + + + + + + +
    +

    25 posts tagged with "performance-tracing"

    View All Tags

    · 2 min read
    Michael Karg

    High level summary

    • Benchmarking: We've continued release benchmarking and established a new baseline for 8.0.0.
    • New tracing: Our benchmarking profile for measuring new vs. legacy tracing performance has been refined.
    • Nomad backend: The healthcheck system for the the nomad cloud has been completed. We've performed the first full runs on the new backend.

    Low level overview

    Benchmarking

    In our release benchmarking cycle, we established a new performance baseline for 8.0.0. Additionally, we've measured +performance under various workloads for 8.1.1-pre; the results look promising and validate the optimization efforts +done on several system components.

    In the meantime, we've finalized a build plan with GHC9.2 that matches the current one with GHC8.10; a requirement for +benchmarking as a large amount of differences in the dependency graph can confound the results for the application code proper.

    Tracing

    The legacy and the new tracing system differ fundamentally in design, implementation and handling. So for metrics to be +meaningful in a comparison, benchmarking profiles have to be tuned such that not only log line frequency but frequency of specific +trace messages are closely aligned. We've found that higher granularity in this regard was necessary, and done additional work on our dedicated profiles.

    Additionally, we've had a first glance of what additional traces could be valuable in the context of benchmarking UTxO-HD.

    Nomad backend

    As the new backend's healthcheck system in its first iteration can now serve as a guardrail to ensure sanity of a full-length run, we've performed our first 52-node cluster runs on nomad cloud. We're currently smoothing the edges around cluster deployment, and analysing the metrics gathered from those runs.

    This means the backend is entering validation phase, where we systematically compare all metrics taken from the new +infrastructure to the existing ones, including determining reproducibility and variance.

    · 3 min read
    Michael Karg

    High level summary

    • Benchmarking: We've performed and analysed first benchmarks with GHC9.2 builds. Additionally we have developed an early indicator for how build config changes might reflect on metrics from our model cluster.
    • New tracing: Collaboration with Galois led to the new tracing system to be equipped with a re-forwarding mechanism.
    • Nomad backend: Porting the 52 node model cluster to nomad cloud is ongoing, with the focus on deployment and health checks.

    Low level overview

    Benchmarking

    The first set of runs with GHC9.2 as a build platform are in. We've discovered a significant difference in resource profile usage compared to GHC8.10. Further investigation uncovered the need for benchmarking another parameter change in the build +configuration: As it stands, the ghc-bignum package is using the Haskell native-backend as a default. We strive +to benchmark a build with the gmp-backend next.

    A variant of our forge-stress local benchmark has been set up to serve as an early indicator for the resource usage profile +we'd expect to observe on the model cluster. This provides us with a much tighter feedback loop, as local run duration is way +shorter. This indicator is specific to changes in the configuration of build and the runtime systems, and will be of great +support when evaluating different compiler versions or RTS flags incrementally.

    Tracing

    The hub of the new tracing system cardano-tracer is designed with a fixed output behaviour, which is limited to various +logging options. Thanks to the contribution from Galois, that design is now extended to be able to re-forward all, or a pre-filtered portion, of traces from the node in a configurable manner. This will enable downstream applications to +directly receive the set of trace values relevant to their logic, without any additional cost for the node itself at all.

    Nomad backend

    We're currently working out the details of efficiently deploying and monitoring a fleet of 50+ nodes, along with +job definitions for tracing and transaction generation. Scaling up to those many instances, and monitoring an ongoing +benchmarking run required us to fine-tune communications with the nomad server.

    Related to that, the new cloud backend will provide a monitoring and health-checking mechanism which is far more flexible +and offers more detailed insight than the previous iteration in cardano-ops. The backend will enable you to formulate +very specific conditions for an ongoing run to be considered healthy, and offer automation of certain actions should these conditions not be met.

    · 4 min read
    Michael Karg

    High level summary

    • Benchmarking: We're preparing our model cluster to perform GHC9.2 benchmarks, as well as experimenting with increased dataset sizes.
    • New tracing: After optimization work on the new tracing system, another cycle of validation and documentation is due.
    • Analysis pipeline: First steps on implementing incremental analysis have been untertaken.
    • Open Sourcing: Exhaustive dataflow charts for both our analysis tool locli and our workbanch have been merged to master
    • Nomad backend: The first set of CI-centric workbench profiles have been adjusted and run on the nomad backend; currently we're porting the definition of our model cluster.
    • P&T Meetup: We had a very productive personal meetup in Lugano, Switzerland.
    • Offboarding: Sadly, we have to say goodbye to our team lead. Currently, we're busy with the handover.

    Low level overview

    Benchmarking

    As a compiler switch to GHC 9.2.7 for cardano-node's default build environment is around the corner, we're setting up our benchmarking cluster to +handle the new version. Special attention is given to the fact that we might need more flexibility in switching compiler versions in the future. This +also involves choosing a reliable baseline as reference point for inter-version comparisons.

    Additionally we've been working on refining our model cluster: by increasing UTxO and delegation map sizes to closer match those of current mainnet, +we strive to have a more accurate model - and thus be able to make more detailed predictions regarding performance. However, this still needs to +be balanced against resource demand for all our cluster's nodes.

    Tracing

    For our new tracing system, we're currently validating the behaviour of the system after optimizations have been applied. Furthermore, some +quality-of-life details that have changed required us to revision the system documentation.

    Analysis

    As a mid-term goal, we aim to provide incremental analysis of our benchmarking metrics. While currently, we can only reliably process runs that have been +normally (or abnormally) terminated, we see the possibility of incrementally analysing ongoing runs, or any data source yielding our key metrics, as a +huge opportunity to increase our operational flexibility. All in all, this approach entails building completely new features for our pipeline. A first effort to accomodate incrementally incoming data points has been undertaken.

    Open Sourcing

    A very involved and exhaustive documentation and visualization effort has been undertaken to make the data flow through our key benchmarking +copmonents more accessible. As a result, detailed charts for both our LogObject CLI locli and our workbench have been merged to master.

    Nomad backend

    While our Nomad backend is reaching completion, and hardware setup is being implemented in collaboration with SRE, we've been adjusting +those profiles of our workbench that target CI-oriented workloads to the new backend. Those profiles should demonstrate the full functionality +of the nomad cloud backend.

    Additionally, we're porting a first deployable version of our model cluster to nomad cloud, which will form the basis for validation of our actual key metrics with regard to those from the existing cluster.

    Performance & Tracing Meetup

    We held a personal team meetup in Lugano, Switzerland. In an amazing location, and with a great seminar room to focus, we had 2 very productive +days together. Being able to discuss live and in colour, we could effectively synchronize on where the team is at, and how we want to develop in the future. +Also, it was a great opportunity to finally meet in person.

    Offboarding

    Last not least we regret that our team lead is leaving at the end of May. Currently, he's handing over all his obligations, which requires reorganisation +of team structure, and responsabilities of team members for specific tasks. Serge, we all want to thank you for your excellent and reliable lead; we very much enjoyed the time with you, and wish you all the best for your future endeavours!

    · 2 min read
    Michael Karg
    • Benchmarking: The benchmarks and performance investigations for the new 8.0 release branch are ongoing.
    • New tracing: Performance optimization of the new tracing system is paying off and we could notably shrink its resource footprint.
    • Analysis pipeline: An exhaustive documentation and dataflow diagram for our analyses is being worked on.
    • Infrastructure: The plutus-apps flake input for cardano-node has finally been removed.
    • Nomad backend: A PR implementing placement of benchmarking clusters has been merged.

    Benchmarking

    The performance investigations on the 8.0 release branch have lead to pinpointing and addressing incosistent behaviour. For that, +we created yet another local reproduction with the workbench's forge-stress benchmark.

    Currently we're working on scaling up the dataset size (UTxO and delegations) on the AWS cluster to gain further insight into 8.0 and +subsequent releases.

    Additionally, we've refined the trace-bench family of profiles that target benchmarking our own new tracing system.

    Tracing

    Optimization of the tracing system has identified several locations where inefficient serializations were used; those were not originally +intended to run on a performance-critical codepath. We've worked on improving those, as well as eliminating cases of redundant +conversion between different serialization formats. This has brought down both memory and CPU impact of the tracing system.

    Infrastructure & Analysis

    Dataflow documentation

    The LogObject CLI locli is at the heart of our analysis and reporting pipeline. To increase its accessibility and facilitate +further development, we're creating a detailed and illustrated documentation of all dataflows that happen during analysis and reporting.

    Remove redundant Plutus flake input

    This step is the conclusion of porting Plutus benchmarking scripts to our own library. By finally removing the now unnecessary flake input, +we simplify the dependency graph for cardano-node, as well as enable immediate feedback when developing Plutus benchmarks.

    Nomad backend

    Sophisticated placement of nodes across various regions of the globe is a cornerstone of the model cluster we use for benchmarking. +This capability has now been added to the Nomad backend and can be controlled with Nomad job descriptions. A PR with this, along +with various quality-of-life improvements, has been merged to master.

    · 3 min read
    Michael Karg
    • Benchmarking: We performed a series of benchmarks aimed at the new 8.0 release branch and built a timeline from the 1.35 releases to that branch.
    • New tracing: Work on safeguarding the new tracing system performance-wise is ongoing. A practical use case for data points is being tackled with Galois.
    • Analysis pipeline: We're working on automatically obtaining a detailed manifest for each run.
    • Infrastructure: The library for benchmarking Plutus scripts has been merged. Also, we've laid the ground for including GHC profiling data into our workbench.
    • Nomad backend: The first iteration of a distributed / multi-client Nomad cluster has been merged.

    Benchmarking

    We have performed various cluster runs targeting the 8.0 release branch. That way we were able to catch an inconsistency in behaviour early on. This led to the creation of a specialized workbench profile epoch-transition for local reproduction of what we observed on the benchmarking cluster.

    Furthermore, we bridged the gap between the run data from the 1.35.x releases to the the new 8.0.x release branch. This included walking the +master branch backwards and pinpointing the order, as well as the dates and commits of all relevant component bumps. This timeline is absolutely crucial +in locating possible regressions for the new release branch, as it provides the exact points in history we would need to target with a comprehensive set of +benchmarks.

    Tracing

    In-depth performance analysis of the new tracing system has already yielded results and helped us smoothing some rough edges. However, this work is still +ongoing.

    In coordination with Galois, who are developing a system assurance service by observing a number of cardano-nodes, we're working with the implementation +of data points which the node provides during runtime. While making the view on data points expressive enough for the external service, the computational +burden inside the node needs to be kept to an absolute minimum. We're currently in ideation about whether cardano-tracer could be extended with a richer +feature set to that end.

    Infrastructure & Analysis

    Detailed manifest

    A run manifest documents, among other things, the component dependencies that were used for a specific build the run has been performed with. +These dependencies come from different package sources, have different versioning policies, and an identical package version might provide different +performance characteristics depending on the exact commit used for the build. This manifest will greatly increase insight into where changes in measured behaviour might have originated +by making all component bumps visible and accessible.

    GHC profiling inside workbench

    The workbench has been equipped with a new -profnix profile flavour. This enforces a -fprof-auto build for all node-related packages. The type of +profiling data generated by the GHC runtime can be customized and will enter statistical analysis. The relevant PR for this new feature has already +been merged to master.

    Nomad backend

    The added feature for a multi-client Nomad cluster greatly enhances how jobs are organized by the backend and mapped within specific instances. +This results in great maintainability while not giving up on flexibility. However, work on that feature is still ongoing.

    + + + + \ No newline at end of file diff --git a/tags/performance-tracing/page/4/index.html b/tags/performance-tracing/page/4/index.html new file mode 100644 index 00000000000..175171822ee --- /dev/null +++ b/tags/performance-tracing/page/4/index.html @@ -0,0 +1,43 @@ + + + + + +25 posts tagged with "performance-tracing" | Cardano Development Updates + + + + + + + + + + + + +
    +

    25 posts tagged with "performance-tracing"

    View All Tags

    · 3 min read
    Michael Karg
    • Benchmarking: We worked on adjusting our infrastructure to the new 8.0 release branch and performed a (very) early run.
    • New tracing: We're profiling the new tracing system for minimizing its resource footprint and guarantee high throughput.
    • Analysis pipeline: Variance analysis both for reporting and for serving as a point of comparison has been merged.
    • Infrastructure: A library for Plutus scripts will be integrated in our tooling and benchmarking profiles. Also, a profile family aimed at the tracing systems has been added.
    • Nomad backend: Various specializations of the backend are currently being implemented, along with streamlining credentials management.

    Benchmarking

    We have adapted our benchmarking cluster to the requirements of the 8.0 release branch. Testing runs of a very early feature branch for 8.0 +helped us localize an important issue in collaboration with the other teams. We look forward to gathering preliminary metrics for 8.0 soon.

    Tracing

    Analysis of resource usage profiles of both the legacy and new tracing system, with and without trace forwarding, have lead us to gather very +detailed profiling data for each possible setup. This is to ensure we keep resource usage within the node to an absolute minimum, while still providing +the highest possible throughput of data for forwarding to cardano-tracer.

    Additionally, we've worked on a very practically-oriented document targeted at end users of the new tracing system. It provides tested step-by-step instructions +for tunneling trace forwarding from a node to cardano-tracer via an easy to manage system service, which will match the production setup of most users.

    Infrastructure & Analysis

    General

    Variance analysis as a full-fledged entity in our tooling has been merged. Not only is this type of analysis now part of our reporting pipeline - variance +analysis can be fed back and serve as an additional point of comparison.

    Furthermore, we've created a profile family for the workbench that's specifically aimed at measuring and comparing tracing system configurations.

    Plutus library

    We opened a PR containing a new package for benchmarking - an extendable library that holds all Plutus scripts we use in our benchmarking profiles. +This will enable us in the future to iteratively work on customizing any given script, and the way is called in the context of a specific profile. +It is a refinement of current affairs, where we have additional build inputs solely to generate a static script file tied to an external commit.

    Nomad backend

    The nomad backend is being specialized in three ways: using a podman driver locally, using nomad agents supporting nix installables, and using nomad cloud agents. This supports having a common surface independent of the actual backend driver being used. In addition, vault retrieval and management of cloud access credentials is +being improved to minimize any friction for the backend user.

    · 3 min read
    Michael Karg
    • Benchmarking: We performed benchmarks for the new tracing system, and started benchmarking for varying GHC RTS configurations.
    • New tracing: Backwards compatibility with legacy tracer nomenclature has been merged; we're currently improving documentation and creating setup guidelines for end users.
    • Analysis pipeline: Our refined metrics PR has been merged. We're working on including variance analysis to our reporting machinery.
    • Infrastructure: Support for Conway genesis in our workbench has been merged. At the moment, we're laying the groundwork for enabling GHC 9.2 in our benchmarks.
    • Open Sourcing: The API demo has reached prototype phase; work on documenting the API and providing exemplifying use cases is ongoing.
    • Nomad backend: The nomad-exec based task driver has been merged. The backend has been equipped with the capability for genesis distribution via S3 bucket.

    Performance

    New tracing

    The new tracing system has undergone various benchmarking runs with variance analysis, and comparison to a baseline using legacy tracing. We could observe +a slight shift in the resource usage profile from memory to CPU, but no regressions in block propagation metrics. Variance was observed to be notably smaller, which gives the new system a much better predictability. From this angle, we consider the new system fit for production use.

    GHC RTS parametrization

    We're currently prerforming various runs on the cluster to explore the space of different GHC RTS settings for running nodes. The main focus lies +on different configurations for the garbage collector, as well as increasing the number of CPU cores the node may use.

    Open Sourcing

    Our API demo has reached prototype stage, and operates on live data from the production database. Making use of the experience gained, we're refining version 1 of the API to provide optimized usability, and creating documentation that both is descriptive of the API endpoints, and focuses on practical, exemplary use cases.

    Tracing

    For the new tracing system we're currently undertaking an effort to multi-layered documentation: a condensed version, as well +as a setup guide with pragmatical focus, will be provided alongside the in-depth documentation. This effort should cater to different audiences, and provide distinct entry points +for users of the new system, depending on their wants and needs.

    Infrastructure & Analysis

    General

    Having included Conway genesis in the workbench, as a next step in future-proofing out benchmarking infrastructure, we're laying the foundation for a switch in compiler version to GHC 9.2. Additionally, we considered variance analysis of our runs to merit inclusion into our reporting pipeling - which will +increase confidence in specific metrics.

    Nomad backend

    We have implemented an appropriate mechanism for genesis distribution: Only after a benchmarking cluster has been deployed successfully, genesis +is patched and uploaded to an AWS S3 bucket for the nodes to retrieve - as a final step before initiating the actual run. We're confident that this deferred approach will provide clearer evidence for genesis patches, as well as minimize startup time for all runs by factoring in deployment re-tries.

    · 2 min read
    Michael Karg
    • Release benchmarking: We again performed benchmarks for the next 1.35.6 release candidate.
    • New tracing: Backwards compatibility with legacy tracer nomenclature is being implemented to smoothe the transition for end users.
    • Analysis pipeline: A major refinement of benchmarking metrics has been realized, along with a structural improvementents regarding metrics denomination.
    • Open Sourcing: Work on going live with our benchmarking data has begun, as well as creating an API demo and documentation.
    • Nomad backend: The backend was adapted to a major refactoring in workbench and is being equipped with a nomad-exec based task driver.

    Performance

    1.35.6 release

    Benchmarking the second release candidate for 1.35.6 could again attest to a perfectly clean bill of health.

    Analysis pipeline

    Our analysis pipeline has seen an introduction of additional metrics, especially when focusing on the block producing node. They allow us to better +differentiate the timing of ledger ticking and mempool snapshotting in the forging loop - a feature that promises much deeper insight into UTxO-HD performance. +Additionally, a restructuring of metrics names has been undertaken along with improvements in their data dictionary; a measure that will make benchmarking +data more easily accessible.

    Open Sourcing

    As a prerequisite for going live with our benchmarking data, we're currently working on consolidation of existing analyses, such as to provide a common foundation when accessing them externally. Additionally, we've begun working on a small visualization demo and interactive API documentation. Those will enable +third parties to make use of that data much more easily, by having reliable guidelines and a working example.

    Tracing

    The new tracing system is being outfitted with a comprehensive mapping of its structure to the legacy tracer nomenclature. This feature will make +the switch to the new system as smooth as possible for end users, allowing them to gradually adapt their tooling without breaking any functionality in the process.

    Infrastructure

    Nomad backend

    The Nomad backend was adapted to the latest major refactoring in workbench. Work was done on making stateful Nomad clients more autonomous, which will greatly facilitate any automation building on that backend. A task driver based on nomad-exec is currently being implemented.

    · 3 min read
    Michael Karg
    • SECP benchmarking: we concluded our benchmarking runs and analyses of the new SECP primitives for the Valentine hard-fork.
    • Release benchmarking: we performed a round of benchmarks for the 1.35.6 release.
    • UTxO-HD benchmarking: we performed first runs for UTxO-HD and are currently refining the benchmarking setup.
    • New tracing: for better accessibility, the new tracing system is being outfitted with introspective capabilities.
    • Infrastructure: with the Nomad cloud workbench backend we were able to perform our first test cluster runs successfully on SRE infrastructure.
    • Infrastructure: the initial NixOps workbench backend has been completed; a PR containing this work, along with many quality-of-life improvements of our tooling, got merged.

    Performance

    SECP

    1. For SECP, we settled on a fixed tx count per block, while simultaneously spending as much as possible of the block budget. Thus we were able to minimize the impact of per-SC-call overhead.
    2. The final runs were performed with various fractions, e.g. half, of the current block budget to ascertain how these workloads would fare compared to a value-only run.
    3. The SECP machinery and profiles are currently being generalized into an approach to aim for very specific aspects of a smart contract for benchmarking.

    UTxO-HD

    1. After analyzing initial UTxO-HD runs, it turned out that mempool snapshotting had to be throttled for benchmarking; it affects a lock that UTxO-HD had to introduce into the forging loop.
    2. We're currently adapting the benchmark setup to that, and will then perform a new combination of baseline and UTxO-HD runs.

    1.35.6 release

    Benchmarking the 1.35.6 release candidate could attest to a perfectly clean bill of health.

    Tracing

    Work on the new tracing system's introspective capabilites is ongoing: Immediate use cases of the new API include being able to statically validate generated tracer documentation, as well as providing information of a specific tracing setup in the node via traces themselves. These features will make the new system both more robust, and more accessible.

    Infrastructure

    Nomad backend

    1. Work on the cloud deployment capability of the Nomad workbench backend continued; for testing we can automate multiple Nomad clients.
    2. Locality assumptions were removed and job monitoring was refactored.
    3. To facilitate directly-executable derivations, Nomad Job specification files are now self contained with GitHub references and configs needed to run a cluster.
    4. We're currently evaluating different options for genesis distribution in said cluster.

    NixOps backend

    The NixOps workbench backend has reached an initial functional stage. Consequently, the relevant PR was merged. It also contained many improvements to our analysis tooling, as well as a structural overhaul of workbench itself. We consider this an important step of future-proofing our benchmarking machinery.

    · 3 min read
    Serge Kosyrev

    High level summary

    1. SECP benchmarking: we ran several rounds of SECP benchmarks, refining the benchmark setup as we discovered the properties of the system. After formulating an initial suggested change to the protocol parameters, we're currently running what we consider the final benchmark, to validate the underlying assumptions.
    2. Release benchmarking: we've performed a round of benchmarks for the hotfix 1.35 release update and initiated the 1.35.6 benchmarks.
    3. New tracing: the improvement in the tracing API, with the underlying restructuring, was completed and merged into the node.
    4. New tracing: before going live, we're performing the documentation update, as well as reworking the end user migration guide.
    5. Open sourcing: the benchmarking data publishing has been completed and deployed. After populating it with relevant benchmark data and providing basic user documentation we can go live.
    6. Infrastructure: the cloud workbench backend is progressing well, the networking aspects of multi-region deployment are currently being worked on.
    7. Infrastructure: the NixOps workbench backend is still being worked on, as part of migration from cardano-ops and benchmarking infrastructure unification.

    Performance

    We are approaching the end of a chain of SECP benchmarks, as we gradually eliminated deficiencies in the setup as we were discovering them and answering newly appearing questions:

    • we improved the tx/block filling strategy in the generator, to maximise the per-block utilisation of resources and so better approximate the worst-case,
    • after a discovery of what looked like significant per-SC-call overhead, we again tweaked the the tx/block filling strategy,
    • finally, we're redoing all benchmarks together with a value-only run against the backdrop of Mainnet-sized datasets, to balance the suggested adjustment. That also ran into difficulties wrt. limitations of our benchmarking hardware.

    In addition, we started benchmarks of the 1.35.6 release.

    Tracing

    A rework of the new tracing system's internals and API was merged. It extended the system with introspection, which enabled a range of improvements, some of which were implemented along the way.

    Specifically, we were able to completely short-cut processing of messages generated by the tracers that were made provably ineffective by current tracing configuration. Further, now ongoing work enabled by the introspection facilities, includes static validation of documentation and enhanced node state reporting.

    Infrastructure

    On the opensourcing/transparency front, the benchmark data publishing machinery was finally fully assembled and put online. As resources permit, we'll work on populating it with benchmarking data, preparing basic documentation and engaging the stakeholders.

    The work on the cloud deployment capability of the Nomad workbench backend continued with focus on setting up inter-node networking and removal of locality assumptions. A major step besides those, was completion of a switch-over to the directly-executable derivations, which eliminate the need for creation and distribution of images -- thereby increasing the speed of deployment.

    The Nixops workbench backend progressed steadily, reaching minimal deployment capability. The remaining parts are proper shared configuration generation, and porting of the run control functionality from cardano-ops.

    + + + + \ No newline at end of file diff --git a/tags/performance-tracing/page/5/index.html b/tags/performance-tracing/page/5/index.html new file mode 100644 index 00000000000..cc9c431acd4 --- /dev/null +++ b/tags/performance-tracing/page/5/index.html @@ -0,0 +1,32 @@ + + + + + +25 posts tagged with "performance-tracing" | Cardano Development Updates + + + + + + + + + + + + +
    +

    25 posts tagged with "performance-tracing"

    View All Tags

    · 2 min read
    Serge Kosyrev

    High level summary

    Since our last update, we focused on infrastructure work: benchmark enablement, tracing system, benchmark environment merge and open source support:

    1. SECP benchmarking enablement is underway: enabling SECP runs in our cardano-ops benchmarking environment is still in progress.
    2. The new tracing system: the improved API of the new tracing system was implemented, and we're now porting the tracing integration layer over.
    3. Infrastructure: the mainnet protocol parameter history is now encoded in the workbench profile machinery at epoch-level granularity, which gives us a systematic approach towards description of past and future benchmarks.
    4. New benchmark deployment infrastructure: we've made some progress on Nomad deployment backend, shared by both of the data publishing and benchmarking needs.
    5. Legacy benchmarking: we've started merging the legacy benchmark deployment infrastructure into the workbench.
    6. Open sourcing: the benchmarking data publishing tool was adapted to the Nomad execution environment provided by SRE, pending final deployment.

    Performance

    The AWS cluster infrastructure necessary for SECP benchmarking is still being worked on.

    Tracing

    The improved tracing internals were implemented, and we're now into the phase of updating the tracing integration, which is also mostly done.

    Infrastructure

    Thanks to collaboration with the DevX team, we have identified and pursued a design that would enable our Nomad workbench backend to execute deployments of both the benchmarking cluster and our data publishing components.

    On the benchmark parametrisation front, we have eliminated a long-standing weakness in the way we were specifying the protocol parameters. +We now have a very clear and granular method to keep track of protocol parameter evolution -- e.g. the mainnet history changes are now tracked at epoch granularity, while also allowing for systematically described change overlays. This makes the benchmark profile definition much more clear and robust against mistakes.

    We also started a merge of the legacy benchmarking environment (based on cardano-ops) into the workbench. The separation between environments was too costly, causing us to reimplement any benchmarking change twice -- first, during development, in the workbench, then in cardano-ops. In addition, maintenance of compatibility code was incurring additional costs, slowing benchmark data analysis development. +Once this merge is complete, this will allow us to sharply cut the benchmark development cycle and overheads.

    · 4 min read
    Serge Kosyrev

    High level summary

    1. SECP benchmarking enablement was completed: we are now able to do local runs of the SECP workloads. The next step is to port this to the AWS environment.
    2. A new workstream for Plutus cost modeling improvement: we've planned and started implementing the smart contract call overhead measurement machinery.
    3. The new tracing system: after doing more benchmarking to address inter-run variance, we discovered that the regression, while still there, is small enough not to be release critical. Nevertheless, we're continuing with the further performance-oriented rework of the internals.
    4. Infrastructure: a significant refactoring of the workbench internals was merged. We also started improving the denotation for ever-evolving protocol parameters. Comparative analysis of multi-run batches implementation started.
    5. Open sourcing: our plans matured sufficiently so that we now expect actual deployment work to start this week.

    Performance

    The SECP benchmarking workload has been fully implemented in the workbench. We are now porting it over to AWS, and after that we'll be running the model cluster workload.

    We've also started implementing mechanics for the upcoming investigation of the Plutus smart contract call overhead, which is expected to lead us to improved Plutus cost modeling.

    Tracing

    After the initial model-scale performance data caused us to panic, among other things we've done more benchmarks, and it turned out that inter-run variance increase was the culprit. The actual regression averages to barely noticeable 1-2% in key metrics -- which is certainly not release critical.

    To understand the impact of the new tracing system, we have to bear in mind the extra functionality it provides:

    1. We are now processing all messages generated by the system, without making any shortcuts that the old system had to resort to. That causes the new tracing to do more work, but is more useful for all users and developers involved -- since it leads to a simple, non-confusing configuration. Incidentally, that's also the area where we are reworking the internals, to deduce and enable the optimisations that are implied by the particular configuration.
    2. The new tracing system is benchmarked with remote tracing as the default backend (whereas the old one was using local, builtin log storage mechanism). In some sense it's the fair benchmark, because that's the way we expect SPO's to set up tracing. That, however also causes it to do more work.

    All that said, since we've established the performance of the new system to be adequate for the release, we won't be delaying it much further.

    In addition, we're still pursuing our performance-enhancing rework of the new tracing internals.

    Infrastructure

    After implementing the multi-backend capability in the workbench, we got the opportunity to reassess the generic/backend boundaries and perform some long-awaited cleanups and simplifications in that area. The results of this work have been merged and will serve as a solid foundation for the CI and cloud backends.

    Moving to analysis, we've also improved provenance of the raw data, by collecting more identification information and statistics about it. +This means, e.g. that we now record checksums, message frequencies and timestamps from the log files coming into analysis. +This will be used to enable us to see more data anomalies earlier, and lift that information directly into the generated reports.

    A new feature is now under implementation -- the ability to provide comparative analysis of multi-run batches. +Previously we only had automation for two aspects separately, so we only could either:

    • compare individual runs (used for different node configurations / versions)
    • collect variance statistics from a batch of runs (used to enhance statistical confidence for a single node configuration / version) +Naturally, combining these two capabilities was a long-desired feature of our analysis pipeline.

    · 2 min read
    Serge Kosyrev

    High level summary

    1. Benchmarks for the 1.36 first pre-release bump of the internal components have been delivered, and data shows the component bump is clear for release.
    2. SECP benchmarking enablement is underway: the necessary generator features have been implemented, and are now being integrated into the workbench.
    3. The new tracing system: in response to the performance regression we previously discovered we are working on pre-planned implementation improvements, and doing more benchmarks.
    4. Infrastructure: the Nomad-based workbench backend has been made closer to a cloud deployment scenario. Cleanup in preparation for Cicero CI/CD integration started.
    5. Open sourcing: ongoing SRE collaboration on production deployment of performance data publishing.

    Performance

    We have ran benchmarks for the first component bump of the upcoming 1.36 release, and we don't see any significant performance changes. The component bumps are therefore clear for release.

    Tracing

    For the tracing system regression that we spotted -- even before, we already had plans for further efficiency improvement, and now we are actively pursuing them. +The idea is to collect more statically-available information to enable shifting of more tracing decisions from message delivery time to configuration time.

    To support this effort, we also started running more benchmarks and enhanced data analysis with relevant metrics.

    Infrastructure

    Generation support for Plutus V2 has been implemented and so, with the help of the previously made looped signature-verifying script, the generator is now capable of producing two SECP workloads: verifying either ECDSA or Schnorr signatures. This is now being integrated into the infrastructure -- the generator parametrisation API is being enhanced and the workbench is being extended to handle the new parametrisation.

    In addition the workbench is now being enhanced to handle protocol-version-based choices for the Plutus cost model.

    The intermediate cloud compatibility iteration of the workbench cloud enablement effort was merged. +We are now doing some cleanup work in preparation for starting the Cicero backend, which will bring us nearly completely to the CI/CD integration.

    We continue collaboration with SRE on production deployment of data publishing. We now have a gradual rollout plan, which respects the plans for SRE infrastructure feature availability.

    We are working on recovering the software dependency manifest feature that was lost with the organisation-wide transition to CHaP.

    As usual, a number of smaller workbench, data analysis & reporting improvements have been made.

    · 2 min read
    Serge Kosyrev

    High level summary

    1. P2P performance investigation is ongoing, in support of the networking team.
    2. SECP benchmarking enablement is underway: we already have the script and are working on Plutus V2 generation support.
    3. Unexpected setback in the new tracing system: full scale benchmarks have shown a performance regression: local chain syncing benchmarks were an improvement over legacy tracing.
    4. On the open sourcing front we added an integrated data dictionary, which is necessary for explaining ourselves to the world. SRE collaboration on production deployment of performance data publishing has started.
    5. We have started bringing the Nomad-based workbench backend closer to a cloud deployment scenario.

    Performance

    We are supporting the networking team on P2P performance investigation. Generation support for Plutus V2 was started. We have collaborated with the Plutus team to get a SECP benchmark script, which is now ready for use, pending Plutus V2 support. The transaction generator has also been updated to the cardano-api changes.

    Tracing

    We ran an initial round of full-scale benchmarks for the new tracing system -- which uncovered a regression relative to legacy tracing, which is contrary to the local chain syncing benchmarks, that showed improvement instead. We added tracing to cardano-tracer, fixing some minor bugs on the way. Network and disk IO metrics are now collected once again and are integrated into analysis.

    Infrastructure

    The first iteration of the Nomad-based local workbench backend was completed -- it has reached feature parity with the existing supervisor backend. The next iteration started, bringing it closer to the cloud scenario, by deploying to separate Nomad tasks connected by a virtual network. This will serve as basis for CI and full cloud backends.

    We designed and implemented the authoring pipeline for the performance data dictionary, which will be henceforth embedded in our performance reports. We are collaborating with SRE on production deployment of data publishing.

    A number of smaller workbench, data analysis & reporting improvements have been made.

    · 2 min read
    Serge Kosyrev

    High level summary

    On the performance side, the team ran benchmarks for the the P2P feature and the 1.35.4 release. We finished a prototype for performance data publishing. We almost finished the local deployment backend for the workbench using the new SRE deployment infra. We worked on fixing and improving our data analysis pipeline.

    On the tracing side, the team worked on isolating a critical issue causing message loss in the remote tracing backend. The issue was resolved and we now have proper end-to-end coverage for the scenario.

    Executive summary

    • The new tracing system public release is getting closer, as we're resolving remaining rough edges that are discovered in full-scale deployments. The local benchmarks we ran were already showing improvement relative to legacy tracing, so we expect similar results at full scale.
    • The first (local deployment) iteration of benchmarking adopting the new SRE deployment infra is nearly done. We thank Michael Fellinger and Robin Stumm for their assistance. Two further phases remain: CI integration and cloud deployment.
    • The benchmarking data publishing prototype is ready. This serves as a springboard for both opening our performance assessment workflow (to support the wider Cardano developer community), and for data provision to the business community. Our next steps are to secure a permanent deployment for this mechanism and to integrate it into the benchmarking infrastructure. This requires collaboration with SRE.
    + + + + \ No newline at end of file diff --git a/tags/release/index.html b/tags/release/index.html new file mode 100644 index 00000000000..20f31d29733 --- /dev/null +++ b/tags/release/index.html @@ -0,0 +1,81 @@ + + + + + +5 posts tagged with "release" | Cardano Development Updates + + + + + + + + + + + + +
    +

    5 posts tagged with "release"

    View All Tags

    · 2 min read
    Marcin Szamotulski

    High level summary

    We have been working towards cardano-node-1.35.5 release. QA & benchmarking +teams gave a green light for the release, and we made decent progress with some +CI problem which we encountered on the way (PR #4612). We are also working on +peer sharing, making improvements in our testing infrastructure, reducing +technical debt and making progress towards io-sim-1.0.0.0. Galois is making +progress on Handshake improvements.

    Low level summary

    Our diffusion simulation network now includes a mixed network of initiator +only and initiator and responder nodes. issue #4222

    We are now reviewing the peer sharing pull request.

    We are also reviewing pull request which introduces handshake query flag. PR #4256

    We fixed a bug in our network simulator. The bug was triggered when a node +died when performing a simultaneous TCP open (a corner case of a corner case!). PR #4265

    We also refactored Snocket interface and removed the bearer construction from +its methods. PR #4260

    We are working towards releasing io-sim-1.0.0.0 on Hackage, which includes +reviewing two PRs: PR #57 and PR #60 as well as writing an announcement +blog post.

    · One min read
    Samuel Leathers

    Node Reelease Update

    2022-11-02 - 2023-01-13

    Executive Summary

    A 1.35.5 release for single relay P2P is nearly completed and should be released this month. This release is based on +release/1.35 branch and does not bump cardano-ledger.

    The team successfully integrated an interim release bump of ledger and consensus into cardano-node master. +This work will not be released in a node version, but will be continued by the current dependency bump in progress.

    We anticipate once this dependency bump is completed, regular 2 week releases will be feasible again.

    The 1.35.4 release is being ran by more than 70% of stake pools. Planning for the mainnet hard fork date is in progress.

    Completed

    In Progress

    · One min read
    Marcin Szamotulski

    High level summary

    In last sprint the team focused on preparations for the conference talk at +OPODIS 2022. We also worked on preparations to publish io-sim and related +packages on Hackage (PR #57, PR #60).

    We also started reviewing:

    • ouroboros-network
    • cardano-node
    • cardano-ledger +repositories for open-source readiness (PR #4128).

    We prepared a PR which changes how node-to-node and node-to-client protocol +versiones are serialised in cardano-node log (PR #4691).

    · 4 min read
    Marcin Szamotulski

    Stake-Driven Data Diffusion Release for Relays

    IOG networking team decided to release the Stake-Driven Data Diffusion with +Robust Optimised Peer Selection also more commonly known as P2P. In the +last update, we informed about a performance regression, but it turns out it +only affects block producers, and thus we highly advise against running it on +such nodes. Further investigation is required to find the cause of it.

    On IOG's benchmarking cluster we have seen quite a good performance improvement +on block propagation itself. The cluster is running a static topology with +valency 6 (each node is connected to 6 other nodes). In which every of the 50 +nodes are block producers. The setup of this network is the same as mainnet. +We've seen 40-50% performance improvement on block propagation comparing to the +same cluster deployed with the same topology but using non-P2P nodes. We think +this performance improvement is caused by using full duplex connections. Quite +likely the transaction traffic floating in both directions on the same TCP +connection helps to keep the TCP window open. Note that in a cluster of 50 +nodes with valency 6 the probability of having at least one duplex connection +is more than 50%. We don't expect the same improvement on mainnet because the +network is much wider and the transaction traffic is not as large.

    Just before the release we squashed two small bugs:

    • issue #4163 - top level integration bug in keep-alive;
    • issue #4177 - a bug in outbound-governor;
    • PR #4165 - a fix cardano-ping support of NodeToNodeV_10.

    Peer Sharing

    We were carrying a review of peer sharing PR.

    DeltaQ

    Neil Davies was invited to give a guest lecture entitled Avoiding System Catastrophes at UCLouvain.

    What have we achieve last sprint

    • issue #4163: we found out that a control message is not passed to the +keep-alive mini-protocol, this results in every demotion executing demotion +timeout rather than a graceful termination. With the fix the node will no longer log:

      { "kind": "PeerStatusChangeFailure"
      , "peerStatusChangeType": "WarmToCold (ConnectionId {localAddress = 192.168.0.10:7000, remoteAddress = 3.129.186.40:3000})"
      , "reason": "TimeoutError"
      }
    • issue #4177: we fixed an assertion failure in the outbound-governor; now +we don't try demoted peers which are being demoted already.

    • PR #4155: we refactored ouroboros-network packages. There's a top level +ouroboros-consensus-diffusion package which integrates network +& consensus code. We also introduced:

      • ouroboros-network-api package which contains the API shared between +network & conensus;
      • ouroboros-network-mock package which contains mock API used for testing +(e.g. a mock chain & chain producer, etc.)
      • ouroboros-network-protocols package which contains implementation of all +(but handshake) mini-protocols, exposes a testlib and contains test +and cddl components.

      This made the dependency tree of network & consensus packages much +cleaner.

    • PR #4169: we described the usage of release branches in CONTRIBUTING.md +doc.

    • PR #4165: we fixed cardano-ping support of NodeToNodeV_10 protocol.

    DeltaQ

    The abstract of the talk:

    An essential step to ensuring that distributed systems are fit for +purpose.

    Distributed systems have become an integral part of our society and +daily lives. We are, both implicitly and explicitly, individually as well as +collectively, placing ever more trust in them.

    Are they worthy of this trust? Our need for them to be ‘fit-for-purpose’ goes +well beyond notions of functional correctness (i.e. never getting the wrong +answer). We need them to deliver the desired outcomes in a timely, robust, +reliable, resilient fashion, at scale and in a sustainable way (both +economically and environmentally).

    This all sounds like a worthy aspiration, but what would be a practical +approach to capturing and reasoning about these issues? How can we ensure that +systems can meet their fit-for-purpose objectives, not just in their design but +as they are deployed, encounter the imperfect world, are scaled to become +economic, and proceed into ongoing maintenance?

    This talk will illustrate how the notions of Outcomes and Quality Attenuation +(as captured by ‘∆Q’) are being used to both frame the necessary notions and +provide a basis for assuring the refinement and reification of such systems, +from initial concept to operational infrastructure.

    You can download the slides from here.

    · One min read
    Samuel Leathers

    Node Reelease Update

    2022-10-19 - 2022-11-02

    Executive Summary

    The team is formalizing the new release process and team structure. Both preview/preprod environments have been reset, +a temporary pv8 environment has been created for testing SECP before preview is updated to protocol version 8.

    1.35.4 release candidates have been created and are being tested internally and externally.

    Completed

    In Progress

    + + + + \ No newline at end of file diff --git a/tags/security/index.html b/tags/security/index.html new file mode 100644 index 00000000000..aeae0e79e7d --- /dev/null +++ b/tags/security/index.html @@ -0,0 +1,25 @@ + + + + + +One post tagged with "security" | Cardano Development Updates + + + + + + + + + + + + +
    +

    One post tagged with "security"

    View All Tags

    · 6 min read
    Kevin Hammond

    High level summary

    We have undertaken an initial high-level security analysis of the CIP-1694 design. We summarise the analysis and our responses here.

    Initial CIP-1694 Security Analysis and Responses

    Section: The constitutional committee


    • “For example, if we consider the hypothetical Constitution rule "The Cardano network must always be able to produce new blocks" - In this example, if the governance action to reduce block size to 0 is passed, then there will be no way of passing or enacting further proposals. That is, this governance action is completely non-reversable. Suggestion: Instating a built-in mechanism that checks (and perhaps enforces) that the proposed governance actions, if passed, can be reverted in the future.

    There is a 'guardrails document' in preparation which captures issues such as these. Some of them may be automatable, as suggested; others will need to be evaluated by humans.


    Section: Size of the constitutional committee


    • A possible issue with very large committee sizes (or large number of proposals/voters in general) is that it may take longer to have votes appear on-chain, which in extreme cases may require longer voting periods.

    Thanks. Yes, we’ve been thinking about this issue for a long time, see for example the section ‘Final safety measure, post bootstrapping’. We don’t consider this as an issue for the CC since they need to be elected while DReps can just register, so we expect the number of CC members to be much less than the number of DReps


    Section: Terms


    • The following sentence is a bit awkward to read: “For example, a committee of size five with a threshold of 3/5 a minimum size of three and two expired members can still pass governance actions if two non-expired members vote Yes.” —> Suggestion: “For example, if we have a committee of size five with a threshold of 3/5, then a committee of three non-expired and two expired members can still pass governance actions if two non-expired members vote Yes.”

    Thanks. Yes, that suggestion is a bit easier to read.


    Section: Registered DReps


    • “Additionally, registered DReps will need to vote regularly to still be considered active.” - There is a minor issue with requiring “voting regularly”. That is, if there are no proposals to vote on for a long time, this means that no DRep can vote regularly (or they have to issue bogus proposals just to vote on them).

    Thanks. We’ve added a mechanism to prevent that issue in the spec/code where if there’s nothing to vote on for an entire epoch, we increment the epoch that each DRep expires.


    Section: Ratification


    • It is a bit unclear why protocol changes: network group and technical group are two separate groups.

    These correspond exactly to the groups that are administered by the Parameter Committee.


    • I didn’t understand the rationale for requiring 100% “Yes” votes to pass “Info” type governance actions? It seems they have the least potential to harm the system.

    Yes, it’s not about harming the system, since Info +actions have no direct effect on the operation of Cardano. The motivation is simply to record the actual level of support for the action.

    Once an action is enacted it’s no longer possible to vote on it. So if there was e.g. a threshold of 50%, then there is no way of telling whether the support for it might eventually have reached 90% or higher if it was not immediately enacted when the threshold was reached.


    Section: Content


    • For Hard-fork initiation, the changed parameters should probably also be required as part of Additional data.

    Protocol parameters can be changed in arbitrary ways by the hard fork and new ones might be introduced, so anything this action pins down might not actually be the value that will be present after the hard fork.


    Section: Protocol Parameter groups


    • It is a bit unclear to the reader what some of these parameters mean, for example: monetary expansion (rho) and treasury expansion (tau). Suggestion: Include brief explanations for the non-obvious parameters.

    These are existing protocol parameters, described in e.g. https://cips.cardano.org/cips/cip9/9 or The Cardano Protocol Parameters Guide.


    • With the current set of governance actions, it seems that it is not possible to add new types of protocol parameters, or categories of governance voting thresholds. Suggestion: Consider possibility of incorporating governance actions that allow addition of new protocol parameters, deletion of defunct protocol parameters, or modification of governance voting threshold categories.

    All of this needs to be done via a hard fork. If we had an action that added a parameter then there is no way of giving it semantics anyway, since that must be done by logic in the code.


    Section: Votes


    • Is a constitutional committee member also a DRep? If so, do they vote twice, once as a committee member and once as a DRep?

    They may or may not be (and they could also be an SPO). Note that this is fine, since these are completely separate tallies. This is also not preventable, since we don’t have an on-chain mechanism for identity. And yes, each credential gets to vote on each action for all roles in the governance system it has.


    Section: Separation of Hard Fork Initiation from Standard Protocol Parameter Changes


    • It is unclear whether there would be automated checks for whether a proposal is indeed a soft fork or hard fork, which would reduce human error in categorising proposals.

    There is no on-chain mechanism that could enforce this, the best we could do is some kind of certificate. However, this may not be trustworthy, of course. We will consider this in future versions of Voltaire.


    Section: Changes post Edinburgh workshop (July 2023)


    • “All governance actions are enacted one epoch after they are ratified.” - I’m not sure if this line is currently in the main body of the CIP?

    It is, but it is phrased differently: ‘All governance actions are enacted on the epoch boundary after their ratification.’


    Section: Reduced deposits for some government actions


    • Another downside of requiring endorsement from the constitutional committee is that this likely does not apply to constitutional committee-related proposals, such as no-confidence votes.

    Indeed. We have no plans for this at the moment.

    + + + + \ No newline at end of file diff --git a/tags/sre/index.html b/tags/sre/index.html new file mode 100644 index 00000000000..951cf6a1026 --- /dev/null +++ b/tags/sre/index.html @@ -0,0 +1,24 @@ + + + + + +15 posts tagged with "sre" | Cardano Development Updates + + + + + + + + + + + + +
    +

    15 posts tagged with "sre"

    View All Tags

    · 4 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • The cardano-node nixos service now supports SIGHUP p2p topology reloading when the useSystemdReload option is enabled

    Lower level summary

    Capkgs

    • Update cardano-db-sync and offchain-metadata-tools package paths and/or references: capkgs-compare

    Cardano-node

    • Optionally have cardano-node nixos service utilize SIGHUP p2p topology reload: cardano-node-pull-5537
      • Creates a useSystemdReload bool option for the cardano-node nixos service
      • This will move the topology file(s) to /etc/cardano-node/topology-$i.yaml and inject systemd reload hooks for p2p configured cardano-node instances
      • Moving topology files to /etc also allows for manual topology updates when a quick test is needed and full service re-deployment isn't desired

    Cardano-parts

    • Adds a metadata server profile and a number of other features and improvements: cardano-parts-pull-20
      • Adds a new metadata-service profile
      • Adds metadata service and pkg configuration options for cardano-groups to utilize the metadata-server profile
      • Adds a cardano-webserver profile for multiple virtualHosts and TLS ACME server aliases for a cluster's static needs, with each cached behind varnish
      • Adds extra node list producers and public producers for cardano-node-topology profile
      • Adds delegation amounts to cardano-postgres psql prepared query show_pools_block_history_in_epoch
      • Adds select systemd metrics reporting to grafana-agent profile
      • Adds a bookRelay multivalue DNS option to disambiguate with groupRelay multivalue DNS
      • Adds an opsLib library to the cardano-parts lib flakeModule and refactors some common code into it
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds job-gen-env-config for both release and pre-release configuration files to support configuration book generation
      • Adds support for grafana recording rules in the template files
      • Improves cardano-group profile handling of producers with respect to multiple instance nodes
      • Improves grafana-agent profile metrics handling for multi-instance cardano-node servers
      • Improves smash service preStart handling while waiting for a node socket
      • Updates Justfile for ERA_CMD demo support
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to grafana alert and recording rule templates
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Defaults cardano-postgres profile psqlrc use to false

    Cardano-playground

    • Adds a new testnet metadata server, cluster webserver, and other improvements: cardano-playground-pull-6
      • Adds a new metadata server
      • Adds a new webserver for the cluster's static virtualhost needs
      • Adds support for sops secret traversing from target path up instead of cwd up, thereby supporting secrets use-cases outside of the repo
      • Adds systemd metrics monitoring to the cluster
      • Resizes sanchonet machines to support the growing chain
      • Completes migration of preprod from world
      • Updates groups to utilize both bookRelay and groupRelay multivalue DNS attributes
      • Updates Justfile for ERA_CMD demo support
      • Defaults to using an updated systemd reload nixos service feature for p2p networks in cardano-group profile
      • Migrates book static code to playground from world, with refactor, cleanup and updates
      • Migrates default grafana cloud node exporter, varnish alert and recording rules to declarative grafana alert and recording rules

    Offchain-metadata-tools

    • Adds db password option with obfuscation plus misc improvements: offchain-metadata-tools-pull-61
      • Adds db password connection option and obfuscates passwords in output for metadata server, sync, webhook services
      • Updates the nixos service for metadata-webhook service to optionally use an environmentFile for secrets: cfg.environmentFile
      • Moves from std use in the nix flake to standard flake schema
      • Fixes hydra CI failures
      • Builds update-docs in hydra to avoid long local build times
      • Removes deprecated tullia
      • Removes deprecated check-hydra from pkgs
      • Removes deprecated bors files and references

    · 3 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains have largely completed their migration to the cardano-playground stack

    Lower level summary

    Capkgs

    Cardano-parts

    • General migration support PR for cardano-world to cardano-playground cardano-parts-pull-18
      • Iohk-nix and iohk-nix-ng were updated support the migration of cardano-world networks to cardano-playground
      • Sops-secrets dependent systemd services were fixed to ensure restart upon sops secrets changes
      • Db chain utilities (db-{analyser,synthesizer,truncater}) had -ng variants created to operate on both release and pre-release network chains
      • The profile-cardano-postgres nixos module received preset variables and prepared statements via pgsqlrc for faster and easier analysis of network state
      • The flakeModule jobs now has support for the cardano-cli era command in each of the job scripts by passing the $ERA_CMD variable
      • Default cardano-node-ng package is now 8.6.0-pre, dbsync on sanchonet is now sancho-2-2-0
      • For scripts using a nix-shell shebang, the cardano-parts devShell menu can be disabled from injecting itself into stdout by passing NOMENU=true
      • Template updates include:
        • Adds optional TF AZ declaration on ec2 resources
        • Adds a cardano node p2p dashboard to the grafana cloud stack
        • Adds a dbsync pool performance analysis query
        • Updates python distribute and delegation scripts from world for playground compatibility
        • Starts a python script lib to reduce shared code among the python scripts
        • Several justfile improvements and new recipes
      • More detail is available in the PR description
    • Update submit action script for 8.6 cardano-parts-pull-19
    • Update scripts for 8.6.0-pre cardano-parts-pull-21
      • Fixes subcommand names based on ERA_CMD
      • Adds deposits to some commands
      • Separates CC cold/hot key generation as host authorization has to occur after action is approved
      • CC voting enabled in vote job

    Cardano-playground

    • Migration PR to largely complete the network migration from cardano-world to cardano-playground: cardano-playground-pull-5
      • Adds re-spun private chain network
      • Migrates shelley-qa chain network from world
      • Justfile improvements and new recipes
      • Improve concurrent environment chain support
      • More detail is available in the PR description

    Iohk-nix

    • Migration to play: iohk-nix-pull-561
      • Migrate cardano-lib networks from world.dev.cardano.org to play.dev.cardano.org
      • Remove deprecated cardano-lib p2p network environment
      • Update sanchonet chain with respin changes
      • Update private chain with respin changes
      • Bump private and shelley-qa chains to sanchonet equivalent conway genesis
      • Bump preview, preprod chains to sanchonet equivalent conway genesis for node 8.6.0-pre pre-release testing

    Sanchonet-demo

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Cardano-world testnets of preprod, preview, sanchonet and some private test chains are in the process of being migrated to the cardano-playground stack

    Lower level summary

    Capkgs

    • Adds offchain-metadata-tools, dbsync sanchonet updates: capkgs-compare

    Cardano-parts

    • General package updates, modules improvements and template recipes to support network migration from world to playground cardano-parts-pull-17
      • Bumps cardano-db-sync-ng to sancho-2-0-0 tag
      • Bumps iohk-nix-ng to mig-sancho branch for sanchonet pool migration from world to play
      • Adds more machine system bins and devShell bins for scripting and debug purposes
      • Adds cardano-show-kes-period alias on any node machine importing profile-cardano-node-group module
      • Adds profile-cardano-node-topology module for a simplified interface to most common topology needs
      • Adds a job-delegate-rewards-stake-key job as an optional follow on to pool creation and registration jobs
      • Adds a topology function to filter self from group machines with an allowList for matching infixes
      • Adds metadata-server and related offchain-metadata-tools bins from capkgs
      • Updates justfile template with:
        • a new query-all recipe for getting status of multiple concurrent running environments
        • a new set-default-cardano-env recipe for fast switching between environments
        • a new start-demo recipe for forking a custom env into conway
        • a new start-node recipe for generic environment start
        • a new stop-node recipe for generic environment stop
        • updated list-machines recipe for handling of empty nixos machine config and empty ssh_config conditions
        • updated query-tip recipe to a generic query tip compatible with each environment

    Cardano-playground

    · 3 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was updated to 8.5.0-pre.
    • Cardano-parts now supports cardano-db-sync, cardano-smash, cardano-faucet and grafana cloud monitoring

    Lower level summary

    Capkgs

    • Various improvements and fixes including:
      • Add GHA cron schedule
      • Add nix auto-gc to avoid running out of storage during large package set builds
      • Add new packages to capkgs
      • Reduce runner storage requirement leaving more room for builds
      • Restructure capkgs attribute names to avoid package name collisions
      • Return to non-musl builds for cardano packages to retain journald compatability
      • Update cache usage to from file level to folder level to reduce network and latency overhead
      • Commit diff: capkgs-compare

    Cardano-parts

    • Updates cardano-node-ng to 8.5.0-pre and adds a Conway era automation job: cardano-parts-pull-16
    • Dbsync, smash, faucet and more: cardano-parts-pull-15
      • Adds cardano-db-sync, cardano-faucet, cardano-postgres, cardano-smash, profiles and/or services and related changes
      • Adds nginx vhost metrics exporter profile
      • Adds smash registered-relay-dump service and exporter for use until legacy relay nodes are scaled down
      • Adds bash *-ng autocompletion compatible wrappers
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds downstream grafana cloud dashboard as templates
      • Adds downstream grafana cloud alerts as templates
      • Updates grafana-agent profile with new exporter scrape hooks: cardano-db-sync, cardano-faucet, nginx-vts, varnish
      • Updates the basic profile with IOG cache and commonly used bins
      • Updates the pre-release profile to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates flakeModule jobs with new conway era automation and additional IO encryption shimming and file type checks
      • Updates .sops.yaml template for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the Justfile template with terraform fixes for workspace switching and provider auto-reconfiguration
      • Updates the cloudFormation terraformState template with stack modifications to preserve all resources in case of deletion
      • Updates the colmena template with dbsync, smash, faucet machines profiles and roles
      • Improves prior cardano-postgres modules to now automatically tune pg parameters based on machine cpuCount, memMiB and desired conns
      • Bumps capkgs node-ng to 8.5.0-pre

    Cardano-playground

    • Dbsync, smash, faucet and more: cardano-playground-pull-3
      • Adds a list-machines just recipe using nushell dataframe outer joins and scj ssh_config parser for fast cluster evals of machine state overview
      • Adds dbsync, smash, faucet machines and corresponding metrics exporters, dashboards and alerts
      • Moves the flake.cardano-parts.cluster.group attrSet name to groups to accurately reflect the plurality and the upstream corresponding change
      • Optimizes machine sizes
      • Updates .sops.yaml for supporting faucet secrets, workbench secrets, state-demo secrets
      • Updates the cloudFormation terraformState file with stack modifications to preserve all resources in case of deletion
      • Updates the cluster isNg definition to support cardano-db-sync, cardano-faucet, cardano-smash *-ng versioning
      • Updates the Justfile with terraform fixes for workspace switching and provider auto-reconfiguration

    Cardano-world

    Sanchonet-demo

    • Update for cardano-node 8.5.0, conway job recipes and cardano-parts interface changes: sanchonet-demo-commit

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent changes, updates or improvements include:

    • Sanchonet environment was re-spun starting from slot 7171200 and updated to cardano-node 8.4.0-pre.
    • The use of cardano-node docker hub will be deprecated in preference of GHCR

    Lower level summary

    Capkgs

    • Refactor parsing scripts, add github action automation, various bugfixes and cleanup: capkgs-compare

    Cardano-parts

    • Updates secrets layout scheme, adds sops enc/dec for jobs, adds cloud monitoring profile, updates flake templates and other improvements/fixes: cardano-parts-pull-8

    Cardano-playground

    • Updates for new cardano-parts secrets handling and layout, TF workspace handling, group multivalue DNS support, grafana cloud monitoring and other improvements: cardano-playground

    Cardano-world

    + + + + \ No newline at end of file diff --git a/tags/sre/page/2/index.html b/tags/sre/page/2/index.html new file mode 100644 index 00000000000..1786d1507f2 --- /dev/null +++ b/tags/sre/page/2/index.html @@ -0,0 +1,24 @@ + + + + + +15 posts tagged with "sre" | Cardano Development Updates + + + + + + + + + + + + +
    +

    15 posts tagged with "sre"

    View All Tags

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet environment was updated to 8.3.0-pre.
    • Cardano-parts now enables downstream consumers to spin up multiple cardano-networks per repository, an example of which is here.

    Lower level summary

    Capkgs

    • Add a readme, optimize flake inputs, improve nu and ruby parsing scripts: capkgs-compare

    Cardano-ops

    Cardano-parts

    • Utilize content addressed binaries to significantly improve eval, build and devShell performance: cardano-parts-pull-8
    • Add an aws flakeModule for obtaining ec2 specs, fix node.socket devShell error: cardano-parts-pull-10
    • Fix warns thrown during some builds and devShell usage: cardano-parts-pull-11
    • Add flakeModules and nixosModules in preparation for cardano-node grouped deployments: cardano-parts-pull-12
    • Enable group deployments by: adding several module, profile and role nixosModules; updating flakeModules; adding sops age secrets handling: cardano-parts-pull-13

    Cardano-perf

    • Modify the wireguard network from mesh to star, enable ICMP, enable Nomad raw_exec and add hydraJobs: cardano-perf-compare

    Cardano-playground

    Cardano-world

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Work on cardano-parts repo continues and was utilized by the sanchonet-demo repository for demonstration purposes
    • Work on a new capkgs repository started -- "Content Addressed Packages"
      • This repository provides common Cardano release and pre-release binaries in a pure content addressed nix package type via flake output
      • These packages don't have the associated IFD, long eval times and large source dependencies that the originating source repositories often do
      • Consumers of such packages, such as devShells or nixos machines, can benefit from the improved performance this offers

    Lower level summary

    Capkgs

    • Content addressed packages -- new repo: capkgs

    Cardano-ops

    • Cardano p2p relay updates, dbSync snapshots server update, monitoring adjustments: cardano-ops-compare

    Cardano-parts

    Cardano-perf

    Cardano-world

    Sanchonet-demo

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Sanchonet and shelley-qa environments were updated to 8.2.1-pre.
    • Work on two new repos utilizing flake parts for cardano cluster generation, automation and operation.

    Lower level summary

    Cardano-ops

    Cardano-parts

    Cardano-perf

    Cardano-playground

    Cardano-world

    Inputs-check

    • A flake parts module to check input closure sizes recursively for optimization considerations: inputs-check

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent updates or improvements include:

    • Preprod and preview envionments were updated to 8.1.2.
    • Sanchonet and shelley-qa environments were updated to 8.2.0-pre.
    • Work on a new cardano performance repo which utilizes a lightweight Cloudformation/Rain to Terraform infra bootstrap and Nomad environment has begun.

    Lower level summary

    Cardano-ops

    Cardano-perf

    Cardano-world

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements and general environment maintenance.

    Some notable recent improvements include:

    • Re-spin sanchonet for testing a new node version followed by fork to Conway
    • Deploying a sanchonet compatible faucet to sanchonet
    • Migrate shelley qa legacy environment to cardano-world

    Lower level summary

    Cardano-node

    Cardano-ops

    • Mainnet relays are 50% migrated to p2p topology and 1 relay per region dedicated for ledger peers: cardano-ops-compare

    Cardano-world

    Iohk-nix

    + + + + \ No newline at end of file diff --git a/tags/sre/page/3/index.html b/tags/sre/page/3/index.html new file mode 100644 index 00000000000..7db21e0a935 --- /dev/null +++ b/tags/sre/page/3/index.html @@ -0,0 +1,47 @@ + + + + + +15 posts tagged with "sre" | Cardano Development Updates + + + + + + + + + + + + +
    +

    15 posts tagged with "sre"

    View All Tags

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on cardano environment improvements, supporting CI improvements, and general environment maintenance.

    Some notable recent improvements include:

    • Improved cardano-node entrypoint handling to allow for clean restarts in the Nomad environment
    • Explorer component updates
    • Spongix caching server rewrite for R2 Cloudflare support and various performance improvements

    Lower level summary

    Cardano-node

    Cardano-ogmios

    Cardano-ops

    • Improve storage resize script, workaround systemd node signal handling, rescale p2p relays: cardano-ops-compare

    Cardano-rosetta

    Cardano-world

    Spongix

    • Spongix caching server rewrite for Cloudflare R2 backend support plus misc improvements: spongix-simple-branch

    · One min read
    John Lotoski

    High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include:

    • A devx-ci cluster containing a Hydra build server and Linux build farm was stood up and is intended to replace Cicero functionality
    • Cardano Sanchonet environment was stood up to test Conway era functionality
    • Cardano-node nixos service was updated to support the latest p2p topology format and non-systemd socket activation use case
    • Cardano-node 8.1.1 was deployed to preview, preprod and mainnet environments

    Lower level summary

    Cardano-node

    • Update cardano-node nixos service for updated p2p topology and non-systemd socket activation: cardano-node-pull-5318

    Cardano-ops

    Cardano-world

    Ci-ops

    Ci-world

    • Add devx-ci cluster integration for caching, monitoring during cicero to devx-ci transition: ci-world-compare

    Devx-ci

    • A CI cluster with a hydra build server was stood up and is intended to replace usage of Cicero: devx-ci-repo

    Iohk-nix

    · 2 min read
    John Lotoski

    High level summary

    The SRE team continues work on CI and cardano environment improvements. Some notable recent improvements include: expanding the darwin CI cluster and providing new aarch64 builder support; adding bare metal bitte cluster capability with network overlay for high IOPS workload performance, such as explorer.

    Lower level summary

    Bitte

    • Equinix bare metal capability was added to bitte: bitte-pull-194
    • Update bitte nixpkgs, nix version, nomad driver, equinix lifecycle, misc bug fixes: bitte-pull-201

    Bitte-cells

    Cardano-graphql

    Cardano-node

    Cardano-ops

    Cardano-world

    Ci-ops

    • Update legacy darwin builders and buildkite agent for ci-world network overlay and monitoring: ci-ops-pull-108

    Ci-world

    Cicero

    • Implement a cicero webhook backoff with exponential decay plus jitter: cicero-pull-79

    Iohk-nix

    Openziti

    · 2 min read
    Michael Fellinger

    High level summary

    The SRE team continues work on Cicero, Tullia, and Bitte, as well as providing +support for cardano-world.

    Lower level summary

    Cicero

    • Fixed various race conditions around transformers.
    • Brought our CI up to date.
    • Migrated to the Nomad exec driver with Nix support for many actions.
    • Moved Nix builds to the Nomad clients for much better cache locality.
    • Ongoing work on vastly improving the action matching and evaluation speed.

    Tullia

    • Made it easier to support cloning from a PR's fork
    • Update to latest std
    • Add workaround for cgroup issue: nomad#12877
    • github preset: add github.ci.remote and (read|get)Repository functions
    • Fix various issues around CUE handling

    Bitte

    • Upgrade to NixOS 22.11
    • Prototype usage of Colmena for deploys instead of deploy-rs
    • Finalized work on Equinix Metal support
    • Prototype better secrets management with ragenix instead of sops-nix
    • Improve CI and bring it up to date

    cardano-world

    • Fixd various OOM issues on preview and preprod
    • Rotated KES keys on preview and preprod
    • Optimize mainnet db-sync to cope with higher load
    • Fix an issue where PostgreSQL would fail after a reboot

    bitte-world

    • Updated to NixOS 22.11

    ci-world

    • Updated to NixOS 22.11
    • Added Equnix cluster
    • Improve caching of Nix builds

    · 4 min read
    Michael Fellinger

    High level summary

    The SRE team is heavily working on the Equinix Metal migration, replacing Hydra +with Cicero, and a new version of Spongix.

    Lower level summary

    OpenZiti

    • Work is ongoing on our OpenZiti integration into Bitte in [bitte-zt].
    • CI-World deployment of Darwin CI Ziti service in [ci-world-commit-d40f4d].
    • Multiple issues filed, and a lot of discussion with the OpenZiti developers, +we're making pretty rapid progress thanks to them.
    • Work on getting Equinix baremetal machines integrated into AWS World Bitte +clusters utilizing a Ziti ZTNA network overlay to bridge the networking of +the two environments and get IAM extension to Equinix machine for Nomad +client onboarding.
    • A Nix Flake for most of our OpenZiti dependencies including the Console, +Controller, Edge Tunnel, and Router is now at [openziti-bins].
    • The Flake also includes a WiP NixOS modules for these components.
    • Tested Ziti Desktop Edge official app for Darwin x86_64 w/ GUI -- works with +no issues seen so far
    • Moved the console to traefik routing service (zac.$DOMAIN) and +controller/edge router stay at zt.$DOMAIN, but have registered consul +services

    Cicero & Tullia Integrations

    Cicero & Tullia Features

    • Improvements to Tullia task aggregation to make [cardano-addresses] build +correctly.
    • Better tullia CUE lib default for tags [tullia-commit-4df3c5d].
    • Put cache.nixos.org back in cache.iog.io's upstreams. This is now +considered a public cache again, and without it some Cicero evaluations had +to build huge packages.
    • Started working on a flake-parts module for Tullia.
    • Started working on cutting down Tullia task build time by putting facts in +JSON files.
    • Fixed running into kernel arg limit by reading tullia's DAG from a file
    • Merged [tullia-pull-9] that fixes several issues related to error reporting. +and escaping.
    • Added Mac builders in Cicero on CI-World.
    • Started work on Tullia invocation caching.

    Spongix

    • A lot of progress on an SQlite backed version of Spongix, it already supports +the full HTTP binary cache protocol but still lacks comprehensive testing and +some tuning, as well as recursive lookups.
    • First steps in the implementation of the nix-daemon ssh-ng protocol so +Spongix can be used via SSH and we can get rid of basic auth.

    Bugs

    • Discovered Cicero bug where Nomad reschedules cause the Github commit status +to get stuck in pending
    • Discovered Cicero race condition bug around concurrent transactions for +codependent actions.
    • Fixed tullia task order bug in [cardano-addresses]
    • Diagnose Cicero action not triggered in [abcirdc]
    • Fixed meta/description of the Tullia package in [tullia-pull-7]
    • Add Vault token loop alerts in [bitte-cells-pull-40]
    • Ongoing investigation on recurring Patroni and nomad-follower issues related +to token rotation.
    + + + + \ No newline at end of file diff --git a/tags/system-test/index.html b/tags/system-test/index.html new file mode 100644 index 00000000000..4557b04580b --- /dev/null +++ b/tags/system-test/index.html @@ -0,0 +1,28 @@ + + + + + +5 posts tagged with "system-test" | Cardano Development Updates + + + + + + + + + + + + +
    +

    5 posts tagged with "system-test"

    View All Tags

    · 2 min read
    Martin Kourim

    High level summary

    Since the last update (2023-03-26) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.7 and 8.0.0 releases.

    Workstreams

    Full list of closed PRs

    Framework improvements:

    • Make cardano-submit-api REST API service available and run corresponding regression tests by default
    • Update cabal build testing for 8.0.0
    • Add support for testing governance SPO poll
    • Use Poetry for Python dependency management
    • Check status of known GH issues during tests runtime and finish the test accordingly
    • Generate topology files with both IP addresses and DNS names
    • Log issues like failure to start a cluster instance and report errors during tests runtime

    Testing improvements

    • Add rollback testing:
      1. global consensus is reached after rollback, in situation where less than securityParam blocks were produced since cluster split
      2. global consensus is not reached when more than securityParam blocks were produced, and the result is permanent fork
    • Add tests to governance SPO poll commands

    Node:

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests

    · One min read
    Martin Kourim

    High level summary

    Since the last update (2023-1-13) we did more improvements on our Test Framework, added more automated tests, kept analyzing and fixing nightly jobs failures, tested the 1.35.5 and 1.35.6 releases (and their predecessing release candidates) and ran tests on branch with the UTxO-HD functionality.

    Workstreams

    Framework improvements:

    • improvements in searching for unexpected error messages in log files during test run
    • added support for UTxO-HD testing
    • added support for the new P2P topology format
    • added local cluster variant that has the same properties as mainnet (epoch length, fees, etc.)
    • added preliminary support for the Conway era
    • added support for running tests on the Preview testnet

    Full list of closed PRs

    Node:

    • ran tests on node branch with the UTxO-HD functionality
    • tested the 1.35.5 release
    • tested the 1.35.6 release

    DB-Sync:

    • improvements in db-sync sync tests
    • improvements in db-sync functional tests

    · One min read
    Dorin Solomon

    High level summary

    During the last 2 weeks we did more improvements on our Test Framework, ran some sanity tests related to the P2P Single +Relay functionality.

    We also update the Node & DB-Sync sync tets to build with Nix as the prebuilt files are no longer available at PR level.

    Workstreams

    Framework improvements:

    • extended the cardano-node-tests with the ability for anybody to fork the repo and run all our System Tests on GitHub Actions
    • added 2 new nightly pipelines - nightly-mixed and nightly-p2p - details here
    • some optimizations on how our regression tests are scheduled on pytest workers and how cluster instances are assigned to the tests;

    === 743 passed, 67 skipped, 24 xfailed in 9166.64s (2:32:46) === + to + === 753 passed, 67 skipped, 14 xfailed in 4654.80s (1:17:34) ===

    Node:

    • ran a couple of sanity runs of CLI a& sync tests on a local branch with P2P Single Relay enabled
    • started the preparations for testing the next tag - details here

    DB-Sync:

    • some improvements on db-sync sync tests

    · One min read
    Dorin Solomon

    High level summary

    During the last 2 weeks we did more improvements on our Test Framework, planned the testing of the P2P Single +Relay functionality, and also tested some DB-Sync tags.

    Workstreams

    Framework improvements:

    • moved the System Test CLI Pipelines from BuildKite to Github Actions
    • improved the reporting tools to support the rerun of the failled tests and update of the reports
    • added support for Github API in report-aggregator, so reports will be generated from the GitHub nightly jobs from now on
    • added support for mixed topology - P2P, legacy, mixed topologies
    • planned the P2P Single Relay system test activities
    • added support to start regression tests with PV8 + better selection of tests

    DB-Sync:

    • confirmed that DB-Sync release 13.0.5 is compatible with Node release 1.35.4 + Protocol Version 8 (on the Preview environment)
    • tested a couple db-sync tags - 13.1.0.0-rc1, 13.1.0.0-rc2

    · One min read
    Dorin Solomon

    High level summary

    We have been focused on:

    • Fully opening our test results (on top of the existing tests & tools):
      See cardano-node-tests webpage.
    • Started to test and automate the new functionalities added in the 1.35.4-rc1 node tag
      See test results tracking page.
    • Made some improvements to the automated db-sync sync tests
      See db-sync tests.
    • Multiple cleanups and updates to the cardano-node-tests framework
    • Updated the nightly pipelines for the cardano-node-tests after the Babbage HF
    + + + + \ No newline at end of file

    nv-a^PggtrpWV?y_yU)mEZ&-%(Q)bv6yV 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 literal 0 HcmV?d00001 diff --git a/images/p2p-relay-5.mp4 b/images/p2p-relay-5.mp4 new file mode 100644 index 00000000000..79c27bfc398 --- /dev/null +++ b/images/p2p-relay-5.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c47ba3e2aa570664b189bd12139959db071550c4efa3cadfd915193ddd4c39bd +size 86690301 diff --git a/img/doc-adoption.png b/img/doc-adoption.png new file mode 100644 index 0000000000000000000000000000000000000000..fe32333d9fbda7fe6272267e6df29a4f4b170f61 GIT binary patch literal 158649 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 z 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 literal 0 HcmV?d00001 diff --git a/img/docusaurus.png b/img/docusaurus.png new file mode 100644 index 0000000000000000000000000000000000000000..f458149e3c8f53335f28fbc162ae67f55575c881 GIT binary patch literal 5142 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 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ec9e8ffeb4425039184165f4d077bdc5a40c1cea GIT binary patch literal 3782 zcmb7{OKes}6o98%DhZJmD~O6M5fmQ;e^HFBuO^6S;?|h3^A%aLQ)81tP@@SZ7!uv6 zJB?H-Zn4*Egsop6Ytdf= zD;;0Vld{b{55f!#sEeiyD_~8Q!_>FW{)6=Iz*CM}_I(}w3(&Ujljz@rD`3e@-^|VQ zYm0H{?JtMRde}Ut%`h*fegQPra(&lW-O!gYguDu$+rT-Y>$lwkd!9Q%e-;iw6+gZC zGzIrU`OTjFZ}1TGZTc+2Mr?DiyYShDd=7qs8w>rj$e)1c({s%TDEpWLkHUtQIp%MC ztLy3W1ss9${QdUj(A;w!x+$2KXW4I@{uI2J$IZEpt*H)}Yojm>*2^7G)f;`=yglfD z2G6c;+1ERp1Y>iqx#4-brekw-7S6*ra3^emFX4Ci7$Wy?Mb;kqHHN$$+P=3Lr{8r3 zPQndfO0*2V`Ej@! zj=}eEJG3_Si*Ow__Z$J=kbUqKybsrdcHgD1;T7=yt^~h%9Lii=Y#-0xwc=j%wMLJF zdGQ*UM}rXSD62E3Q}7ww4PiIOJp=P6boOsSbsqHAs5NOlX>k;w-Hp_lj{B`4Mo>qhJjhN6)6M z1#A8^c;BAWE{Hws4}fn+se6L4Z_G(J107hfb_9}b*3fqFP1DzV@vZaCbL<=FTX-I< zVc$>fp1belVX&U`)wT^>!|^(pgk_GSDZ@rEFZSfIx+dPU-(YTC1*^b#+(%o}KgKU% z^9;uIiI)BS-YGD)@Q+?wnd6>`IsPel2jOQf4i)3jZ$P&bT&Hd=e&KKL|67j0bA_MZ zcNTtuO@)3p@*H?}k2&DG(ReC>XvQp`zGv%wta`uubt(OH2NhseVfGOLT|lP z?|?en@ZiFEVY}q<-_LHRGu<7@q%_@yf6~C;ds7;0qAm4k+M523T}xX_H^DjL~ B9!>xN literal 0 HcmV?d00001 diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..98007a29716e06efd5ea34d55641e27cc08d2376 GIT binary patch literal 91295 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 SC;R9J^P2X}tA(0~$NvXiO?B@8 literal 0 HcmV?d00001 diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 00000000000..c1895147a25 --- /dev/null +++ b/img/logo.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000000..284157d7b95 --- /dev/null +++ b/index.html @@ -0,0 +1,53 @@ + + + + + +Cardano Development Updates | Cardano Development Updates + + + + + + + + + + + + +

    fuNH?pZY)^U%-7L8I#$NWQMGgb`2c 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
    J6%VvmAk&IXmSMGRIl@uNCg)PT&$D-?TI%B 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 literal 0 HcmV?d00001 diff --git a/images/network/2023-09-14-p2p-relays.png b/images/network/2023-09-14-p2p-relays.png new file mode 100644 index 0000000000000000000000000000000000000000..8960e26e7ecf9d3efa0828a3780dee09499f6a22 GIT binary patch literal 326185 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%0D>o2;z+Rv>95h!2+@?VvLSZ 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%0D*FM3Y5%Thshm>^A-!pHlRgI_4s*o`$Yb`^&@G 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 Ggns~k7BV0J literal 0 HcmV?d00001 diff --git a/images/network/2023-09-14-relay-versions.png b/images/network/2023-09-14-relay-versions.png new file mode 100644 index 0000000000000000000000000000000000000000..b611d86543a84b4f1413d2e6fa99869dfddb5ff8 GIT binary patch literal 379198 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 UA20a`{`_mV#dmq%{_xZP0bkRM9{>OV literal 0 HcmV?d00001 diff --git a/images/consensus/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks.png b/images/consensus/2023-01-25-consensus-utxo-hd-read-and-flush-benchmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..2e9cbe7de3b9b06092638eef83b4e3225843a9e5 GIT binary patch literal 104414 zcmb@u2RxVW+dlp#LNX$hO~_XE$Vf@Z-ee`&du0oi2t~+V*;`h&1|fUzvNze=|9sQu zyPxOvJpbqC`>OBzllOh!*L_{reV)g89LIUTQjn9xxj=dWfk5C$-M_1ZK%5stAkI-^ zqQbvyCJW%e|DAs%BY78bg8W}%b$S>AL5+~Qdt2pc?9!;m!*`A~C%;#zsWCIXF`sHL zP+H^T@LcS^LZ_qjwYjbeMMqu>k1^&>+I26bJA5p!=53uzhDLqWXw4tFJaE9{yJqDQ zaV=AbG1~F2ib|bqL+G^J`*AAuLOMGxeiD0~FN=Hq5BquSTX&-OCMIuMi;lOa-i&EQ zjtzbkm@%~R&ORbcuu+K5K3)z&V4r;oxaW<2_DSMe-PtkT$(Qs|PXA4;6SLs#mx(55 z8fTvrxKUZpJ~5J_MBs~;S5}%w&kueywzSO6#rShB8b6!jEyU%ds;UtSUYU?cR?Ug2 zsh*F<^24}TX9p9Yvci|_?ZYS!k5;|ffBd-RF!#o?@!aWey%_?u#h-31^oFyjpU1$c ztf(;Kjt&haFt091PNrpGXz1?l9vv0Fb?b0x@FSaikzr#n&7Bt}B|~l%=g&^B5i)_A zGchqSTIuZO;)0HWq5b>$*47r6aodm9*3oiXLo>6567&9IElU@dJqr1QFI2|`kG@?9 zy4St;XJWinnb_;1IgO;@3(wAB&|bTiyZc$E(&=hYLveAjQA>n`q@?kaC(#em-o1M_ z(=On?Ya=Dq)Rii;YIJxuh646)=o+}Vxwx5GS!O*Minnjyh9Pvt=j5XByCaD$VNs+ zy1KiA?ioIMl#HJY6T-{OOG`^DB2qKjPfSF#cW}TrPKb}M@bKY79UV4H-CED1kL@Db zg^!+-U&A;Znpk=!Qyqag+WGSg*RNX-6wqA1ew~-MR5FAzGc%LIqA>qE~;f zt=))eWeAfR8Ywhv>`1y}I*xmKf<*4%QcCY{4uU#PPEL34-qq1Te!x&ajB1@J)&5w! z-prC;wJzQG^4G6lotHh&c2k`NZ;Qi|Ep!diAO;4888{u>qrQfQ28Q1B{Jf^7=AgU0 zkx}Zsl=)96uoKaH;YWh^%q&Q({mWH8;Iu8hn1EqYNZc24r`ayX5u|!9}Aw;Fr zPXSX=O)af^p5eiJeQwe+i@~mXb(jYdA|jq~dzey#FE2h-R5ahX_h)wmHKVeA9ISfW zL||+@yR>8xCs+2QHTv`C&%sqUI5~@oi#NZ&z1B4Y+wbD}FC(Aqr^)~9`5ZA@BJU?3 zT~^1c#r=Q$_(37$WHDUYIy^kw-oE-)lJb&x)xk<-wt7DAm5VeqG>(prc%p|kmX^!v zdLGjY3q#x3i;Iib+9{6jT3a-m}xa^cs;+#zt=7C&zC~ZYp{O&>1=1a zp=+4cC$Rtb0}9`&LsgmD>enmV!cTPg`y#P3U%S0x3s|G-o}R~3O<_6@ zAHKMFb$z9Bl~?p#csP$y^JR7Qei4uTA5mPh@Tbc&PHty=*m}ImMLDI@ggg4S?|Gi; z4;dNAr_RdC>e{{6yRFuq-Kpx2`u_wzF+Rt|zTCOFxq*QJSnluNzpG}eRi7LmbR{h< zEopvy^6As3<+196qn&Y4=arFbA-C*)Pe{;wHP5f!{*28r;yms_!v3(_=9jpqXU%44 zR#sMeysH^3Tcz`AJg?=D3`e!YTn9~zPK<{wM9i}vi3RYLxr?OS8HtJd5SEo(>HV&7KK`B(BH}vr{Vi`>-$wY9Z0 zE(|oZhZPQ)qc_p!iK4GEU68>%efGupdeh|-;)UIKE%$eKF=_H1etN_iMM_5I;o%V@ zI@sU8(-1^v8JlZ8UW1E!@<7XVdr4DS*>IW0S^3WvNsOs**?6+?IeZ{VF<$%K35SP=E43${BqWiEiHX8)+aom| z+JX-AU8x*3yR>w4cZWVyWCeDfJB#`b%CHU0`}3-8CmS*pQ$!AyKE8hadS~2AZ^3P= zfy~#I$fo1dQ` zVE@F*Y6bR-va)i%PGwrJSxZaHb9{!d%)&xjh|93@si~=x4M8zH=4z^{;amAgd{$R2 zkd|Mtg^xh+CYB>)^80sIMuo0lH?H?VZ--@`P4MzOKHNhl<%7>m%4zQ+BdPdps38|j zcm5Yi|1ynVWo0EkEjxSL`1p8htL4%DmXVQBV+d8*ekyX;mrJ5c!Itcx03gxa-rjFk zvNP(OP%PkixLfawu{v6*j;W}s$^*~%57YT7<8!?`3NN{$fYAgPm0vg1(7K zMzMfNN8)^U`s#3*Jm#;J6_H0@F@x@1qX?zswmgGub)}a{^m}`Iw*U|AQNmvDPM61~ z`EP(i_rC)LKmWi$h#SB@Ai0CsP@)lH}_vG+UFNCr3Lk@u)n9gfA!jRCvo6nn zKxa#3W3J|{(L6~>N$^yg@A$oa`!>O2d+_ZwNpW#;KYaDPhc~ZWq?kWG!=@F!+GSQp zGkmpC0`_V6wEX-7{r!AwY|F#ewc%!Zp1Z$Z!j@WJw}Wk0+CDiyKbS601$g{mwYC=f zg>dievwq6hPn;(oaquJt%w6d(U(r8Ww)Q%JKSHKmbnwj-$&eM8%x?iiA)?3S4i4RE zvas9F`_^}NbHN7=4r>T1dLCQh+1c5H77CC>bp}jvo-j{+{k?MaiS>tiQJ9=9Vvl9wF zdHMF47;*pTXwpwF4c>Azb8zR9$NuE8i9gDtRe9*WRd){W%EcFzlou{u%*oBQtT6^W zp{lCdWhg1xSW5O{Z+G`YYO1Dr?CFGDKnBzT`s~N@7h)UO+1bmi$E|8+kt-J|^vzMu z^V_%4q?=mfzr_7BMevqzgP6)a2iecD((~G$)jiuu)R~|A?!5U1i@~8&(eutg2cpJe zeyx?@5FnVm%wAV|F_u(yg51?Lb<|>=wHlp}KZSA~XJ=<8pY_EV}gIUJ}orB;L_mY9`kh(>UaMnfc4h^TS2W7ax;m z`{XEM5&cU!t`KJEdSLMi2VqHlR>t!b_PbTwX7g7tAp8p#rToKxApWV2Kcxlg8ced$ z5-tCHn=B=lz`OJ>CZLkmTz33=f;*?{rU|4MxKYpj`ScLsZ4IdYx;vqAf?sw)BJS;V zgcV%u&yTdG6Zb#*cEZ1*6Nmq(oljNVpKH8#ndA6n&Z-H^=|#LN3b!vHR;cx4$A5i! zncy-L1?OEEuk~6UDuEJ8#D3;McPGSH3=E6}Q7=!33sF%~SXfw)-Z_Kru5)02fp0^$OH2IVj`vndPEJl!*!9Zt@~3WY`MT9ZeP2$~Ma!E}%)OZU?EO1x zTR({=V3d$)jt)+8=6V|&C0+FaHYpj61g)lAhNs>-4=JzJsb3{?~`kqBuCH~YE5clB6 zE~NW4fhrIhxzcdpE&3q?{%C;R9r+}fexsc#zqdk znvupvEcQm;_@Nc7xq8a7iXMTR3 z!lf4~W{CS&0d6lWWObTIOG~dj6_=2Z0CbR^o?clAnR*uzcIpui56|A-9t1WB+uLhv znAq4XtgOW=M5lA@x8B@`kO3qQtPT`;up$r+kvqA+zrX%hqXYbA8mgeM>+*84vaM}x z$3K1XfK_@-AwN~1YgiTg9KWl%{-$o*+b^z7`@yBjfM+4Tay|KRBkF;6sl{NS;md@C zaVX=Qmxp>+umb}Foma<}r>BX?$w$^rJUot|Dz&$_hjQS3bhPX85KpceOZZ;YgS3W* zhHAH+CyyV$i--s&Z^UUs<6fBQsyL9TWvLSi9ew9~&F1`}EiI zmPihD6_u)uHX*pDEhyjVkSwN*ygVOi(5qLk#Qg&T0)Q*<_xA^s;UurEqB6C*I_@qn zCMITUYwPG(f-D%U0B6s(#bsw^YL;1zLS@Gw7t7ebh1`-rzE&bEZ5$k`-1pWu+C`~I zNh|E8oAnMSNWAu1^s1_=EQHw)W=$4RMob}=o%b~ut8(!=oTPe=U+uajEiaz{wY~%Q zDGuM8j@0u6{J?89G6375r>7@4b{pael6Kn=rlh2N@^SDnClF%`4uWA#mk9`zbaaGG zyFLI-w7p=IAl#0eD=`V+34At>EQK%pOaMyp!}Po}`>PZ_Ka;QAVdpXlQ72bFP!lkJn~oWbDO5orOon`vXcZty6AQpQ+?QfN{|~D z>hK>B0-!o_+gb6Li86+#7l?+z6iGaquW7O|c6N47D_$c8{9j(LVRVGH>Aq0!vEbLWl< z@~0=5LdXvv9uL5tNaP^5I5qVyE-ts%jF5mJf?a1}axyG3a&~ss_~RmS8Y&0_LYA)R zvFG^D`}Oe;xgwlz!XqnSKT|wHb>)hNw)U`lJMg#JSy>+%A&Xh^UEKKnTS`Xe;{-o) zk2xsZR+4yAQ=2P^qPaHRy!>8wOkQJUL)#C|#+dhq{NR4;_M0hCJL$q7IP^EX6mW-% zy#6Hu(Rxohx8J8-h5d;+w}WU-|ya zKSPEl{Rc5Ay+C^8LNO}O1w^s9KYS`V`23HePuVRkJv~wTnIFIbfTod_mZn?jB%9qE z5gCb1^MFCw&~Oq!1s5kLFl&wQ1@pd~tSshiJyM9n6pZ(2kw{uc7Ro6bo3-xNLqO@I zK~I`O>6dG4n%^-^Pfr7?_kaD`!o>lezI!P*+1M-xi;SR90G!GY#zapqfuw8Lk<7}* z&W^Lay>_jq2k0EXCmVA;O_9@cIhgd0n9gp@vIyJ@k1=lyG6};h3$N9k6ZePWTQTJx z@GQOk{W9|3o15)yYz6={;eW1A$~7OX^*Vw244$IYR>=IaQ1gw~KwNQl-nn$`9`J(m zZ#EN63E?W`l7}@)Z>>}fzyI)~m{armI2xOLj@7r`258V!nMmmvU_Bu~z#ZJY329bQ z@e&ys889nURO2g|kkAf~j$&4^Ffkd~*`Zb^MrM6WDEy%a26P3LCD{%Ay05PYbG?M& zVsjC@9_U7oo(!=hOAXLVU}!*;pM&rX4|;bz6h44caL9P!@2?FF+jE`Qcz8;#rB~Qa zz5s&o?^y|p#zAm&;#=SyadCHdcez-8Tfmpdjp^1F(K@r`T5Y6`+(i1!dt;cR%*1v$G$sw{RF58m=;ma>caDM6lXAIkmO5 z_02oL_GMyaUHXo7?b*?rT$0ZFre|ITRkAWJVo|;-3`2@l$a2PH>-rvL~W_`0l2Xg|C2mJiSVL-+JnJ`?p+@v$v+uIuu zq!nyB!1Pc*15vw^rJ7x_TY;QJ41Y3xoyRP^UlX_ziKQw3p+VD zSR9mki-?GrnwqMSUxx$Xr^1_n<&WI$&G4^b|8D_PpJJp9PlS?E2pzv#4{n;%f*tH()x@wY(r!3)h@P_C#&8Uc_Mq%en2d-mx z;ptnpU75db%XdhToi{xG(CRzJIGg zh6L`(uUe%ON5avdH`$3R~D*)RD!5@S;co?M*%+1W! zH#W#fN$-VFE(23eOsuA%VY0=79Ic@Lm_~WFT+hc2E^LBqhctB=}wGk&r+QKHSp6!p~nm-MPQN5B1#4%#77Y`Ar_4t)UWg zt=v+iJO|1>NP7SpW8S`1)Y1}!FFk&>ES@`+0?Fg!V@PR$B{^7Fggg(+dpVFAPywx0b)w}cbE$$#e0D}X zW;pB7#|SH)h{b0sN0)l022H_gL21;~OHj#_d)tA|=zLr{OaZO++(Bw#&M z++@M~|4O}Sw)cQL_wMajK)0MzD||lUk|!ad>es^C^Vb*vkU=fly|@MC>&emhi7*Jr zP&WdTttm))<;wfm*ebA3K=}*PLMiO}AuY{msu&mx*k&d*jUe?|@Wwn~pz)JS*RFbM zd;h+FNJu-#M!1x>24Jf?wP%{%W+q31$%^y2x{1WO=wfOQEw7u$o0}>U{o-7T*Uh(% z3i!Ss48;WO8ZSsmqKCimSk!XfgVF~|l!?jQ3mn+Rq#v%&IaI(^p|*zo2-RPPUacpE zK<=Q0)np3DE>cob@Jz$w2^JruF9W091p^6!J1i->hi4jGN?rBn6MF-58FRn9?P{=B z|L;Zub+#WqlHTl&zsmLG{e!eX5)SE@e@prQUTUh5@ghowSdT#F;a!{;3;fUmz2)Bu~`;jkDeuhyMd5C#Sc3;>(;UFCzBW=&eN zxc?|yCC}Gn>k*6eqRofm-^FPqi0{nV%N5k^%TJLrPyKTH9MS{>Y5-hUDvaT1zrVJ| z^Qa;rA)&UmHY`k8O|1_Q7zkisjS7&7WY;tjlNZ_haH?gyam(R|t=Kv!qkjezUXLLnnO)mZ+ zVLJIKyAPGR1no{Pk!ohLuZTVs`LIVr?a4u{^VD7N6s-y4%}4?jc|5v`jK@bS!AH-Y zJp)F%b>}s?Kv7nfwCfVMW1Je@Ah8t}bDQH3fO4hNxJh(-|5)dw23;zmIzP3&%s*EI z&4CbL4dpuJ$UD}l@HmcgPtBESEv1>{EecPy*a*%@pT$VaavOQ%n1pIB=dRk!Ynxlv zYN72=3AV2pR5%sxX8P7_Uh(eL?D%^0lFD-zoIcUKqI*+e{km?;fgCk&3{+rAw!M38 zeDF{>KQ`g)vM$@uIlslFh_txRMzM(^q<`DH1eO#`JyIdcN=h^B3AF}a&gZJdL`5;R z55U2Qf%s68s4QBM0;%RSCuXha^Z?xbBBjnqbk&dWtO8-h;k73-|2u+BTi0_BEL{sw zK!J;{g^L$?bZPn;r{HuWM%Mj7zt4{_iBdhAR}(q-h&(hEc(74(fXRg-8Iwj19&u2# zflGq*H;#9i0o9=h2kF!FrYL%(mK?Avw#O7xaO=ezo;4+z1>_j)lv^UvOJEG^Yio=w zEQCPspNA<2ZXA;af+GxMiuBa?;r2K;6sP1XhMCkLYXHquUZtYMLV83cW3w!g9&t~b z4?-rpmw}!>H7yNDH~~&hrJ+5bUhybzX~Y)-J>tM2y~2&A5m_S5t8$4dgWiacxB=g; ze>8)3E5*0w?w@m*gTyZMvbbv@qX(*`KL!@$lNSO12C5en?{k=wVvybNhu^ZKIT5K^68T=S(ppj$~z$>yjC z)lF1;(N*YoO};Sy#<#tMRJ6MegN=5QbBS9NW4FRhq}X7bBU@yVZu_aR&2Hb_Y`V*0 z)tzd7?i*>NKQGz|^)` zmWEztGKb=x)otPwN%4vslKo~)q-zxGh8*_zyd_fl+?4Ys`d~4bppHDHs>S0`mVr| zmMHI1ILQ{67?CP80JuIFjV?19({VAI{V@N?rl|x!} zXwy7pPO4^PP)i0~RhY0tfEZ09#gmB8`MTBXMj2hI^~Oai5y3AfICtKXw>m!-7WDz&hcU98(>Q$B zc|Rm~F5%nlYFrFg9F2V*V zv5*kG8uw2C&;V{iVtulB2?depI`Rd#fF>~FgwawnY($kv#Zsd=`6{h5O5)I}YI?wY zdO)AGSpwFa-}bp2WCbrOTDv@}qN-{MkORn{9g)P?Sn}5PE!alaII3K?79eYbjR|}% zJfyNM%vt~A+T`gf2`WO2uTgjjVP43sU$p5Q*A>CjG`gwND?4rZx$7#e`8~t1197cO z-R)XEB7_}S025N~1ziA5_~OL}V83o}&(F(?*p6wP0k~rH_%W+y(N{3$g5S||F6m_s z4-x?^?=^v9A+#R)e`gBKb&yUu8xGbWJk}$f^o)4TzN{=0wyhMi6hhWGnxZG%S&X=5 zINj|5D#%R+qXifPvi1+K%#3>;EJIBPl-4IuD_vXwZ{tu1ax*h8fFWQId|2bh+hvJ~ z)aE$m4X>}tpF9SJo5H2(9g}i%OA8)3KmOILgX?p7I+d^Q8AAO4?t|o%6fQ0YuCqoX>QmqolAPqCa&VGBEnqetm&>I35umP9fsXFCeg|ce162lna5+Ln3wXw(c(K zoj~lFfYLz2`SHnaqv($(_8Y=b?IBm@!iB8-{K)OcMn(es{P$%@D9DE@BEZT5H*kZS zTV;rx+oS_>-_G*zb)=w3b@P$my_C1OQh3q45WR;|rmC%bVC>LqY-kwsIythtXui;s2^Aq|f$|{N?`?=4qgQs^|=fTJxeEWpeFY-8nhR%Yh)ogM3%>(tbV<>eY$m#&hKlmX=lmW|$? zo*bwH>%38*{D1eW2%?mS($nouVI~^Y;)xI`&2tQHY*C7Gno(Wfhg5_73$Tl~ahP)x zDD-s#DzOa!z3PFCIDT@x1LUzrwW}kH3KkU>l7RvTcCnn?Sb@PE$gMD(5K3Wipb6Ox z0d9B-*0b@+U%w1^V`Le^@Ws=+*>tP;>FB;THqHX~ih)PD1dCER+fxioC|iv_tn&At z!77~$&$0UUZ!$U8JFDV}Ya6X{;o{?SUK%K* zxHU_0s&u?-`s?!U`jPZpyq}0tw3G_i=d#Xgmi)$1dg{-f@)vCj8lTXu{kfDoFD^1M zGMWs5K^y#}fC|7+NkvTDSHA%!1vND_-f?A3&CE`dedv;CJ>^H=TByF)52p(IiV>$D zrhPNZ1Vw%4m4KEEQEw=3X%j&P@-@jpL{;U!PD~n5AQd$@z`4~cHsTVuh};P z9s&RJ;Glr8a5a$gG&Hv{J3Bh?iI6`fhK;y1cR`8#37LtBep;^p0}H(2%Eg2#HuW>)f*vh~mgmK~x5+Y8?kDfH*6N z=d%mV+0e0UMc8RvqVkayY)rAt?d@|cbA0Db0sKP1t5;0y?D0Smz*FtvC0FwsBC8ly z&)Bc~YNJ{7PUgG#f-igItzd)Yd_Jer=tJ)ZWJiQGa-EwE@@2MHrYkH;`k1Cw#_o*y z#&{afoYiiowOnjE{7)j`@Mo$Phz?u8P!OlyogE0OV**N_ux_NRAUXOD74uORiKwcl zR0xs8%6aXqx|bbTA3TxAu+o5{JLlTCS!#WP_DZ%-kZEDei5u0|u`mD!A=u_~A?JGh z)8vvnp!a`l(1#(dJkI~7kOl5nx#mx0am>y2P=m|BrNRHbHv>-n6Np=2%R@hZUds(x z4Jr_morFE1Zao&2T(qh4CcJ)p7@A9GJFxGGIYUM7+X*K0h{HT&{=-~;ls z<^2pR;PISoPq035fob;q%3{ZIe}ZtuEMUQIR0TJ!_3E{fh}DNLjIy7sMbvP}E}|fs zZRJt=!260c23)$95qBOTcFA8Ip{bco&RTxbvG-Cm;xk9))x)ozzB#wl%&YQqVatih z5O3B+bDJt{v_dzKUWLOv*dW`#e=pe1fSX9f{ZnbH(1o8B9Av~&P0d zO@$F+0<0Nzq+9l346^%WUI%61%DDxO1~lFd{g z`4L-LlTVa@hwy#?#}0k6Pj{b$s}+!eG$GB`LMUn^*kxFG_pRLQ;m51)rxTuvmy7+R zO=rA6pdAAt#;`N=64qZ2^X|2BPwm+EdG5AKDtC2dEUP4Rp$;~jcqH}-+ zWoTw}9H}@Y3u_w7k*%7C&z?h2CjeBAO}GX56B0Q@A`lsn(FFMNnp1uuADR%;IOE}mOd0%G^~@83W>?fm|I z_14q1V$<$ZA7J96Tq8l*$I^p>itij&w?r&2&wn2xlVJ;LVC`D@0hPgU5l|jrxj#8R zS{;~QUiO&pqR+;iPXN{}z0(Ao8AETc>j8uTDx9_ktp+&+Am3ce0nFZclScwkSw4F~l z;t4TsqC_Ba3#sc|e?G$)b6c$jQ{0RY7^Va*25y*#NMq87zyw!S-2zt$u1GETD1m~| z)zyWeu!Z#X_qWFiAn^!z#(~=hfxg?U1SETL%&?}Ofq`-`;(_G_DsSkm0ni9$k>+R; zc($oUWdcJV=kCn=jA^Ww1S&cDf`+>k3OogwbyXpF%)lU2bG*Mu<-T^?&TbvRtDf6( z3E#MT_rjM7$3-=F_d}u8s!1Rs>LY>m`@iWHL>w?Xi8!Uq(xD||ja_3J5uTVu5g~&{ z$U&*J`XE?9{@~;5A09pc`q1TgZ+6So!_Y9LUjI$Xs{51#EP(OS`1#(^?l1bEn&(D?a`yvS((_&Vl_eBIQ(2dTjOJfboA15X z;T?eDtrseBKYVcNO9qo?=H(q9jGyT0=)^@vk`NF)+PaCfov+rO9K&KdO9o8M%tXY; zTXB;@OWSi~ZihAkc-mpFF2@6j^Bqi9d+{JL!vhIoI5OprKwShSwYswMN2}2alym1n zoa)T#M?-j<4J@#GN|(DO=4!C8E4BzPtwa}T?$dl9Wp6$vwSc{B7J;ro5Oi;HdYWE2 zNa@a47(Wc54hD*dhQumu&wlygsd_(|KZAE#2RN?7+kXttCtF z+(Ew~SdN!}3apBG1G~}cE7-_v`-*wRp#NU;ldvCid0c92B|yOq1pK9|G+!uy;v%ho z5jb!l3Lh|psZgq_s~dAhfpX6#ESb^?k7`d}Uoe%Z2-wtojkh;9L0_?`NiQk_Y`?iY z++Pt1DS=ONBT;Tn%~r~sDW*gOO~xFtDrl&x*aGRQEI9|U2vPwQeMm;IQ67vd(4q_t z+AyCVW}z4JpHz#rAO8-x)oOrvst}IG&XxRpj}nq z&>o7s+QVrMJSq|L%a`f=pgZ|L86cwmlL11#ArQ7fWwOhg)XPMX16hGlB_e)uJqS)i z6oi5ZTme|_zT<~bbGdtXlxTsplaBxBthYnRc?CSPP?}MKwbut7`-2cxbn6U+kJqm+ zrgSp;@jJ{Z+`HER+*>LahgLBo@JPQtKZm?L4ni!L3Bj0GZPvRO^6}MQUI1n?T~MZ+ zGF#NXP;@(wR}wcj<5s-aR5>@0+h>i6NYsT@8*=)8YmqRn%tk@f$&Fm1a~w1)_n{lc z&~S2Tkr0}D^h8mDXps-50bNoXFOdR5teGqMnUn5t?jN0W&Q*{?z)2To_y#hgF}f6z z<(G|dW}5 zPmJa^Y1{D%0So?sR&t&rO%#b67OFXPdN%ja!SbX)eX9J?jBMr8lM%Btk;E$21JJyD zYSCC!*6K41|IPR-&r8}c`w_j2FIQ!iHZ9~KHDuLVAd+e%EKL?7`~5BRP?knh*Utwl zX{&%*?2!GOi7`rAQSV2Vn7)1F=Kt6`N&sm3YyevZQi%_io@U0$u0#Nm)MrDQCNkP7 z2E!;C*>!#dM-B}xSiufJs3E&UycY&-m%6?!IcCP;te$?K==A&XIt}ba5#c4ac9jp! zjI%50VJ0+AU)-=QCQ&GZLH4vsORcY=Y1u9_F83cUG;ogS8#{#sC5O4DrulW_On_P5 zoX81FbloPc{H~?u)F0MT-P6|P__lZ!vdSBz0|b6I^y_|KQBh_5!rEgx8iVOM_G4$jE$7My;U z*{mJbg_;Vslh`F_p|5h;fM(~*APB0fgIe%t@e)(dO^-h&OvD`V3L|YdY#?2uzHis% z1;TgU?EFldJ=2Ij*&A7%JggX4v`Or*bK+u>0r-i~k3{yh{@rtUu)BMa^48O#V$)K} zx8ja#HHrv?xj@=1)mU(7$@r%dS4GVVhfdw$4M^}B;5O)kNA(&lEo8?j$N{snBrq}s zg^sr*K*#+PnlU0${a-W{NT47(1P4z2oZ?Xz zJaL?wkv|=AG!NoVK9clie#x1Hxdx{=cEQR|c;^AQ!>6X`{4%n#NO{au6ciLZJgObI zSy)=?>yad~I3~u+(mW#onqcw1h=UW(i-AMR4Ne3QN3oE$4rrN7>NNRqr^`1@77|WZ zoSR%z1zLN+5a!TS%lkPA$c6ga7jO!o4HZdD0#V1NS5pNIrO?SqC|>?Q=K9JjDzuQi z>3?MVW}6X+fIj4u>QM|3hLw|=;Ac6$Md63=>uezu=;kFtqO7)%ny|cr?%xqRO3%DF4 zN_%Lyn6ZJx#-?53Qnb19lKH|A1YmtOq}ha&G};=Rz+Qk!uiZN=7likdaDZL_q?3@4 zc6v8Bi_@S+xt1RE`ZX&Xo3P!Kf3eGSGZ8e?L+isLE)*wQMZE;KWL7;*Ogo;KiXoLV zbft%cJ0Oy{e}6**g~wuddOKJoft0fzt)L%uQot+(b1%pxzV$y(4f(N=k!AYzKEQZ2 zLl1!k?`c=K0XOM$e0ayh`u6tr#)jL}TS-6sKw>tCZrxzZA9r13gBgVhfOklYL2Gf* zuW(evQr%fRwQEbcm&;>h9h7?1gKQN3BN$zNBNYNunMezr8?MlfSPK;lIP@n!&Bh}e zzTwOO|0oFvX#J2c69Fq1^slO#cK;sVFpM) zmlN(MKd!{IHn3ggwRqq3So}nd@$wkqi*JpM&TGs2-U@8I z7t!AT(9F*LeRtJUi^qv%5^zqx;A?Z_8ZaI)Y6k>?K>UzwSx&ea`w6@aV5Dp0T(Lp z$>B6>muU4bA*Y9$v_8U0>hkT@zzYnF&O~|kA9Rlt%$~i5VP4z_zR)@#KhX{ zd3~7S*DpZN%^fn8OpA|M;|(o)cuII7$|z!=)d&$6LzG)7Kj50k2%(5unxk}v-cM$S zt6jTW2VX`*y6z%6jf|is)qf~;aIkE@X#=@ z;G;h8@p;!{_d)?BPdn()+e9jkRxwiJ=L@~W7g0U9Op3vQ1Lc^ke{KeadUri=fOH!DKGsZ>bZOK&Lv5rdeMq-8K0l%NnDmA-|JQDkoe7 zOMcl*P^9k~G5>AZ%UqXjRW2P~qvp~U$EQ_k{u)F+@bqT0mc~iSjqEPBJ8ZF# z7m>`7%Ix_2=rM7`!blanM1R#$yi+icVf}0LN+H}yZ5&C=l&iK_M3K*RKh`^?F!&?4 z`{%h`)*GbG6J%iOjkS@m99&sR z^t+(_h(>xAo5E8`CQLj|FFE6>_&1}ZIARMvGar9^lE{uK2J;7HDueDF(}A+`ASL#zLJ&m*n#nIfH@H ziL~x6LV7t%hG&Z-AtorQ&_%cM_*L?R6f^sswb2YLT5&X1gg3Ouw#EtV?9C={aB#FY zHATV8V-mG5KeV~_Fpr@(43h)`K-`Lc@7G)c|1T{uh(f;`5Ta1-Q}8ofE_||-jA`)9 zPT1c_n!usRudVobTLyiQ*X2uRcZ{3#IYI+7OE1U#?-ys|3H`9DbA=X)Fjnwn!0RA5 zs@9;@($wtz;R?u^MkCHV*XT#v_gd%O-s8lF zc#rlT(Ftpc_q&D-CDTS!eIDL>rZoPc&lRng%EI*hS6J9-I%#17)Nq2}4ivOF?=5&0 zhVaG@F1Tma>|W^B(uJNsk7{}Ab$DaNpI-5Tf*S$J(5N}Wn~|TdSD=3zv8Wd8)#jb1a}L#T1Sgbm7!}J zsvA&B5n}1xpC0Cc!uR;e6OfUSIJo9ug)8d*I}5S_%*dl1UAh$nEHahSY{P~15$&o^ zd43n*!J#RDH6~_6MGjj~VvIb=yjn{59EptXujNDijoSMZO)WBsc^)J6=VKBXm`0_U zm#vUf3>#^7Y6_P25MJV^1yGwr&mFw*AQNvp)jl1zECaZAwAn2W1kv^(6hPY01`aQR z8#abFo4|YIzy%s2m)`RIJHmTy%?6=SZew6(mUS;hv&2jl8mZye5~9Uz*nFR-_vF(< zPj@HPqv?jvSgN<<-2$g7Xz@{H#255&lSv@-QKX~@Ez~Yc2_=23q(rqVLZ!Dy`Okr zv|7II5y%x3@Xj6Ni_==B;YBa&g;~&_VI}q8!No5(1mkcKP=&95C6s>?MlQ1<~X620wWvPTKx7LsdE$s(TN+n^HM_WhXr^HJo7V0$`)ySi()G^@+5q>h;; zJ`UCoQ=>;W775+7!+eK><6JPh@S3pVMm>wZCTqk?O4sj?Igg-k(e6_$n_kglDR}uC zw5)*LrVPBNVAFKY?c%#1mn;-LLw&fY9GhBD&W0lR znuta1X%=nh%FX-etTC@2%CHnQKF|EAt8Z0P{_B0GEEOOMc zrz1>Cv;vaB(sX1+H;HnJ;b`u!O~ewsd!UnH2necJCh>=)53Pyc1u5~e#&7IW6cdu4 z{V_-JWA`#-ba6+UO^M#53Sd4|%hC9i8F0U%QU7uQIc_6Z4BbI~1FkptDp$jDJ~)|y z5xENO0^q}ur1F?Dj03d@B)gGN=mCJX%ID9Yzv?zYE(#hU|Li-erXF5_&gkz2%cK`l%hwO(k-Zf@y~DpLi` z?d$s0-~<87Q7s9p#{WmyTLuNyhS8#%k`CzxrMtU9K)SmGX^`%gR2n2CrMsjX1d;BR z2I-O(5V-I6ednBe=FHr4XZ(Z1u=jrV8|zumT5CH2g~f>W*cY+5$5zlp0elN^Z1aKE z3sA0*i~9X}8z&O3jcrc&>|JI?1}gLq(=;;jDvA)c8_4LgQ&MrGc<40{{hh`17)}? z@i{m(Knslkf&TlgFb0qhzy|^9=AXc&f8sMhmIjP?p*j#=Rf2{D5Q;$J)7(G3fU^JJ zRSnWjKw2bEAf*IBu}o#>UxJ#5KU{01pA}-P^jw)qwkV z9$UZ$1EM*Ac@+wh%>Dg$6THmt4x|(mPoVK?+o1nx@DfA`fzXZit+=X-mvfTm;FYcO zHIqDdYyr?dHPuBpXFTEPKDqu;i!(f;bQ7BrwB6NhIGRsqjH?#G+POsztR)lL~1AL{C| zab6phTn(h-NR3F(bJG)a)!f@3DBaG(HKxD2aA4&|f`XGekrhjV63YSppSyr9lu~9q zf}hk6;RTgV29&rlLe}H2_P{ySLQFXths#&Kg4> zHaYodB=T~N=n=TnbYlosrZ711sI9HeBQTK zAi*2|S5t)IJH^R6Y&T^fwE{}mW; zdC96bG8M^8ez{u@Z0gpE>f@m})z@er3I-ko+IC8WbJw&cy>Q@Plctv71S?&p;$COt zpD8>fR*ZhaK?{E|^aiI?=qMYjWH?fMJq+nzwgM}9!u+^>X=^8dnmQi9;>t=ScP8-M zrF1di1#x3MFD?Q&P>_nO5#Bc9)`WWYb3ryTCTr{|yIcb5&F)e17Q$O@O#Mt;_yI3^ zH99wMDH?+7Y~CH51?PDUh4BFYhFg2tSbCGa8ehpARwmf@1pg5e66}(n8nzmDv+fh( z#U&9b8ya6~diB`IsH+fr-%Bw2rmDWE;F>a3$Uz}f3uxm4*ZrG~eD8pG$S(K1X-zh< z2hKq_DG#T$Jr`RxM@F;Ft$>czTIl@*Iw*7g;T}R?aDN{kz9!?np~70mDyu|Fh6_be z;U9f{AeUc2tdVLWQbVpYw9%5M8B%|Np!KW|PREyEGD|WCLC%X%J51ckJwfY;F(l7&&!8&Q-m=53SEV zpXt2i)W3_&u#%ln)GZ-9vQ_sN572HFvx-VQ6)JuDy87sw6CDBOizmCL4|d7(ZPdK3 z)$aX1Nul?Zh{&eY`$7_i|4o(^vRtNbsOV?C?^Ilj+_hSN*&gx>Ky>yWX@uQB$-SjB z%If&{nMz2Ut(EI@vyA?rMBf_ z4t9@|3#7b&t>AS)`{@Uz9*gMb=Yn~EJ*=8-6rVC4u9DtA`+9!#=LI4Xia`5)>T_^; zB=-P>*>R#OoC0ImT7{Q$9};0FO&r%R&2qEE6FYIJ|C^E%E8i-g(a)qwQ&N5(;#~oS z^X(MjzoXmw@%O7e_RxRdnFH}OQ*ZXu*Vk0q*<@nBf`X{m_7l0BN>hWV-PqOt4t+?j zFj5scnx;h-p#B5#`~RqR{~_N%GUj~h zH-S1N_|p%`@AO+~QvO<_DP!z4GPxq)pUU}#`rNb@tka|j<-^G|r$XxgU56^`f+>ih zsx6z5j@y9f8>$(Y0*5bDGTiOKVlA5V8c(B{X(Nb#Gdm{vMz(o|=z~)c^*GU= zyV*svV{ULwIP5qE25MIISKtW?mEHRl+FG6Hj2J`Lk)MOMY6{2+1J)}bSq0LGfbJj| zAUs2Hivn06ck6d8@tb+y1)2{?$~b44XXJx3-ld3inqbR#mGC08%rc8+UaQ}lTcXyd zRrQoy`S(j4@;zayWk)Zov23p253;ZB5iW(2PM;wb%$$8bemR7&t&Lp8<$Uw9^i&O| z1rcS1!NK?I#)4Y)nb{J(Z~27vTNfQCS} zD2T)W=&xkiwjo>4J+f#YSgk*Q{tQs6QL~doI~;&Fp>GhI{1OSQ@ZUpTO5a_7pt5;q zG_8j+=1P917pQBsef_4N8W%Njb~>yqzCCz84eyGtnb(YOvWq^>1&G=H%LRbV2)g|t zl;*i}Bmmb1rZ{D`@QVS*;EeaE@1nuuG+)*hcWtJ+6n$zU}Is z(=6Qm)sgMLfGQ~;~H~5)Ja>71FaR66=NVNaAG>-fu9nlNCV$q=52Wk)xplblp z9iZ4NEiZ?IvXpmST7b1JAuSCUodsNe4S*2yaq~psVHvu-s6H})>?qDQM_$5{k!as({SM{w3t*kUk??Nym1xm6AT}F(;Lb_Q91f)^;rFE_wLp052UjE;#`9 z;vOVk0{1%0CIJvJq-SIRwtfw0>*_%0<^Tv_22EEPnP(7)afa&#trUD0c>YIgT~9`yE1*lq z3L#-)QgE6hNvrLt>`@%a!q)ru8`m(`zQyMRIJ6yUs$kjD?&uSDFg5I6G!l>0nL`{- zffJY$LW($N301@obSPwV0$@~BN>KJ`y$UNP*FGGxsX@v0!U1>ZJ&bA_Dl^#pS}C`q5nYsW=!-H3|-&x!=A~HerECnpDixaag#wVrUPkBJOrh1Zy}ifHDr_# z1ddjm!;%knbjl0oMua`?v?s>DBHp4RI{JQh2}M5OSXO?R@CkkC1|M15LCH{8_m}ax zUojW5F2oKb`asmt1)O-mqT&U*h1)K-AV|#b)(k8dz+g0i+{bWJ!YpM(2-MErn;+?b zY!=i(Up{@h0Fia&vqmqB#hJlE(h}6^Ui%8l50&P)BmQEowrS*^7^*9MN6ArD02cpU zQRi=Pq6MWdP5LXI?aB4KVK|^Xr!L2-^=eANEt~<+p(|apYrn7;43Dj60y9OOL=+zW zFYTv&;>E{Ey9nE=r15#uawh+?y>HFmahs~W(uBn>7R_@byCc5Lw{=jgsFx(0(MAVQ zNOLgVauDIyn@F68e&BLlYrtd6`e+xIieT!clBa6=fnd2~091%<&DS3`k#KBj&ucYu z8+jyMHSZb$_Vb*#1oVdyO6J3L@=xAx6p@gZO?qZSeI2jw{^g_l5v&p*Wrvcm=8dpW~wZg79PT2feRCmOR}g-}*zgl}Un$8B;`?nH8uT)~p8lR!mBJ?D5kSxzOpM)a^g{Pa-i*ST{` zbx$WVDkuDWh#dE>Ds_-6vI)BYiQc5b%JG#;$VK~YzZOn}95;?b69+%zPFYLJ;JMs& z7e=7+gt_iS0Ky>7%dwF#!D9G^X%^`llL#@-=2~QERZQpVcW(83jIXWJjMp{w-3zp{ z;5LHWlLbck(ld3jDv{D7*qji&gK(_$OId5(__(y>9ZV&^hn)rF4KA2B_5&k2 zKl)$o3ND05rf^GqvSRBbdF5Ib+3{TO#^^JlKwIho?YOd3jpS5VQ$8y3@%E=9mCL}h zDp9FRn;}{azcwz@u2K1fFpMe-brJW=%g3{9#Hjog<=?9V?z>DLohE@dY*bY|H_ssd zbQjQ|UR>UN>}-PRo>(v_x+HJEc({vfv4!3YFOpC(Iuhh!ur-~}EAQ-%+FLGZOjvg{ zziiE!6fL}2fB%9HuKU5?(T>+-oX-6;XtkkLqE&5(Yjz0JG2rgC_p9%Ch`v){C{kt{ zEo*By#2xl*^&-t-*IvVYoH*XurH)bZ5`U1+;2%)hVn#fKB&>_QX+8fzB;VEW>??G? z_GsWGxW#3ubeC0D8r7N)E_{6pSZlGnJt~T>WT2t{@@1T5aCn%6+gepu_cQ#vBU`sG zo=5PK#c)=QJ%yT-AEAOd(Sk8M))}!!JdKS(R1_@`$s6?2k72g=`Ra+NK!c)8%5gd;ytn z*Nazp{LLwYztB1;hpET>LOo(I<`ggwvv{6Pj;CVOE%7rJLfqS69^0CjHY4HwI7F9Z zqE>e$t~mA?x>w|_-DnW}-7Q1^`EztZ+4XQlXcOm&(?xUo6QA=9Nyb|#mO*A-Z&s67 z!;)0v7}%gS`Cfv!m{;lyg8T2!hrLd2PE7nF2hN@^OZo<<_+EFoPJHwrQ41szusxl{ zI;Hw9JMqSqB<)d)26waMr5h(ql<8;i%@O%R^<$8%48rTGf%XGvQv7Z=fie}O)`OU^ zU{RnBClhqD1~j@lZwjb;sS)`qH?ywmg|hZAUT3|3ebB!1@1E`XnUY4+;rH`gHLrj# zZVXdDZbc-&NA_HB))5d%~Xot#O=ht94{w(nv^f! z28cjllV5%q{$M-=Q?WjE((Zg7yRo{P2IuiPqQ5jTFIj0z$}K-hma$T9Qhq#*{orL) z{C5bFk}#0|n5C9K-2VHjB*A%}?JqLkTg=q3{Pg{-AH5bEH`g68I>yfVex2cVY3;w2 zqbY|AGK9aS$9WY$WLr6H|3PLrJxG}AC9haQXBUu)gQpw^3vie5j~>&Z-WocS<=1;@ zMpMk~AX|SGzBWDedTe*%CawgQldmt}w&L0*0(7z_S;$Ei9h>@w&$kD{Y~xZS%26Bq zI%U4IALj%g`)RY_+4`JUd`l%@-}5-;%_Aq_{C(PVc}e;rpj+$31C|GJD9MXGcxLb^ zBw+02`X?zE<_$2Af^B2yJnLc|NC;!@hOit{7lD3Cn{Jh!}qn;AFK^YtArmQ$i% zWrf36tGH$y7DePe=-cd6YP2qEaTuqt$+BuDk0DgD&V*LdQpiS8E@$V%<|VWUB>!a> z`C2?q&@n62{Cv|>YdK-Ds>YYo!e z0Mec076G4n0nGTj)pjBXpVg2b{0P2T1k(*WS+48lnCEe@vZTTQC_lIb{g$q6Ub3pJ zxT$@pdY3Bf**~^6_JG`6T1&B77slr~d-T}E(p5;8@%ysjjHBbOIG7ZhkLXG34Sdkg z{ah)tWHDn7Swm-lJa+}N14cOTJIO6NuCn+p{IJSfF8za9@zfqH zgdiQ`CuR5eiX<i8RoutfBuTYqA=V7xy7*Rc!WDYn+Z>Pd0Fj zm}8*%d0Jwj&o-P&MPTa^POfiM(yAuEs=R)TKXcJZm=5Ng-^{>7DNw?(>H{r%YU-=J zu``uNCs)Q>Q=iRbj0bDvb=ePVT3;CpGHQm0W2}=B!eT#ZH8w2zP`~L2Y`lGyJllr5 zr|^m;_Y<}oYzpX%D8gM&tBApLgI*~3QV|dvj5-Jd%hspCdXTkqYVrzL*8h>w=~vEy z=H%UBb#Dab>7RU{1cT>W4w!USW|DAyy;*-AJR?x{J+JpXNda9)wE47X^)c+c#YS+c zDyhT&Emnnk%{;y@1C?a8X}&A9y+4BW{U(xM{HyQUY;b;3TWT{9946%*5m(}85npGnYLfSh7)uz#-Q+ZDRQR{In-|ektYC7re;c-Y8yH^^r&WKhyJ-rvzUDmW9(e7Z4kof;w?mG)rY-ZyUdOHZxCX%SaS4X0`{v(Quem z#`L!?X+8S*dx6x~rGk@o$vDrmjDFx=*3CHo!Ku*VL{(|9?s-rG-Nb8gR;~hxP$r9# zgw^7Qy~|@3E|PFYLomTJ(KMQw1)pN93(=ZQ2LL>ggpIfI;$*y;$sXFZTi%?UILSLd zhOlT;VS<*2prGxyWMDdqW!V=yBd`%bQ1m|DxwEqCY$p4E6Vk0J#65Rsc}+LdaM)p; zW+9UaLB2pfN259?=lZ1P%kYT1X9T0g`c16Y7R^fISwP!*GKOCAJAVf*Cr#cYQ40RF z^=1_eut_31Fj8ZCJd_U+43C>c$tL`QK zA;jM6vvJ>YeGU8iOTIjiqs-E<8Y@Z}w&ecQJ~5&HVnDxnPvCM&W`BVlwp#?#;dS}O z`z@^Cz6MUrk(|}i$2M{VBa`+X9HftlTQNRTOTNh5IKUva#X%_8(ueuPGqR~#lPnl-& z%6gzB)f~~P9)D+PwG)jN|KU?Yp@A@OZO!ESpBj!ui+>nqa?zV2B$ueQF)_4sMy7Mp zoZ@_RHfl@2!L%k?xny9w`q`@aw{|^`@#Bg`zNEsE5sSROAHRrMA?sac$K9;Y=<0zZ zssU^TXYHjp2jn#ES+sKtM{)4L{orK#M2`x6H(%tcy~;R8!*iXL4vaNSE^KR1L1KL3 zFZNa`C31&d8U(1ja4T=l;t=MI)mQIz{Cwy5m(`QTo}SiV_8TOW-oT(9EGgYSlX*75 zsPd~Sa?!|a72KDRnWd|8hrfR6y)oJpWpr%HpZ@pBRXrAJKrPy&a)?5Fj1c2tE+alkQT(uUzAek?euQs=~hsi=?6ZTVFldm43xB5nNu44&K2uUkF|vtr8B?mTck5GM+}PHiswsB zgngV0;~v{@44!Y%Ab)%IZ_`3T(&;v?qk^2CzBS@=W#~)ySVmGwGA;Gp18jm!{4H8O zW+CszE>%%J^u3OcrEzpLu;R|s`@Ic1i}b=O7tg1Hj1^mNz#+ho3)uXENfJ*4Bw#jk$9`aXYa-QicH&XA@LVp1PS*)sJk@ zto%D$=3p|nBj`P9hY!>p$Rrt$(vvkcqA(?#LA=pXN>H`f(t8#A=ew_G+?X%EF}cr^ zk$-rOk0x%#;FRmdho}-E-^iaw`i|{w7nxlz^oEvA)c*M3&WBs>Q$5MfrGcAP6VL33 zr~o^NjdX zEI4#~xYbYC7 z*Pu18#_H$)J0tpNMRhqSKGaw*^`B)p7=FKsrG=}u6pqPEA7 zPozGu+03M+51*|(i`-{EXyRcz<+JN`>wYdKy4I7^;;)wYwG6rjTDlNo@2j}yuMc2@ zfMmSaEJ>?whUMEw(jvOh{pqAGE!`$u!b2ABA%Uxa#?Dk3(K~lCY@Z%H&A$?MJ=&ja zioX>WD9;QDwzLfX1B4uCr^tD2()OX&$;}Snw9* zOs-}Ykk<5O;#Q87eQkj_qm(#WV*jcZ)l5Ej?n}_K|EXiSnCX}~BZdpTWD^Q{-;T!t z#WxAt`hCII!#^H-KNcGzaWDDgf0)GTXfb2u9iDL?IsgHH4NeGh(mYYEw?a1(N3C^t zvWeVKjhkVTMXAD9Arh9t z4bGZe|eNivHzM!!32xwdE@1Uu{$vVDMR;y)Psi|x)YghQ-wvkkP=2*`|UX_{GT))y6yJHJY)+ceioH#>3i&W|lq9hlI{ zjP4h` z*`_#_DQ~giaB%5OUrJn5?PN#jl{u-oLQ;AP#Ti>}G!gWH1oz*Hz9;h(X}CO^kMOLw z0c+03RxbNbvxZpS>OxxtuHDF4(KA`%_*K0NAmKMz>^>r%o!hMKna@|OdUo9$kA7?~ zW#Q~{3=|zq!&bS0O>H>^Y^H8U5-(D}C#{A={8)vB0BM!~(y=S2vh;I#tk&gyz(H^n z+o09S)A>#r$LP)>vZB8tmHXFkC($_*p_ySB!h7nUwjy5Q)RwFhE^73}TnlRJw0d6O zKKG?!o4LHxQDbPW@-*fU6I7&{95T$#_YPXIHtzOQ}2@^ z$f_9ds2}B@Y^&u`qCKyFd^rKLq}1=jc|XiDP}p}@JYnfV0taoNq{+yk|Fnk>GNs@t z?ks$ZZt}uqs81Dgy1I30s@lu-ct>&hkYH7Y*_r!A=X@_tIvwBj)2C7;%;`8)wFX)P z7k)@p%IAA1d+ehr~j*24|VC@bW(ZU)$-cIru1`?3$*nOP07>i zm#AcS{fLjbPg^sU$XqUT5Bk`m^z!c+)zpH{zo(AR|5djXHG2CNPT2wq;Uxl0smag? z#SV8J!-DP_MJr?AQ;4M*Lx>M8l|pJ}t`%8ud)&)qBn@trl%=%oCK&_Y!O7m}jPc1f zs*%ysOWnkxqqE=bGWUJY?$6|xW_PK;rl+P}Z1+jBMFrvLq3-pr7qi^O7M|5l3(Do97}4FYROtbba&_ipmiChjWKFU6h@%$a+BD`jMY+FkYAyzC1^wGeu~Y&w1H zUWkyYZ-(I%e%avgDl_u_`$A^f(7+s*;_%n-p`=T=K|U+Ymi#ZoMwO@8lQdR)7La`} zINe)_&O+9fl)Hf~Cs@VHcK25>9ai%?aP)*Rc8?f^Flu6fX3-EFHacB{Ep19ZijGRe z_Q82=cOji*{_HY$>S|erZGFfD+&1zJDZ5>Ia@!%k*y zO8DGv;;mx@_>}0jHcgYD_z!RxJ>Ft(95q8+Oa*PTWHTY!niWb2YMFug*vb6S-o=C^m~O%tcQIOV7xeANFE z52_Ft4=HKe(TDwz7ZS zWZSA2hD%p(ndwk(do6v?IIsvgvBMCK{pv1+4bMN+BDRKVsObq&%A)5x%8zsim79$G zU*z>8FV&SkPm;ARl9ZWzfeTHby)Di?sbcp}=iCihSiUjKe9qEVH-$FUP8dg7{H*TC zxDWO&cgA!Uj*PD~Un+(LMw?UK!Bi8S)xag{OKh&VU4D>lsjFjY82Zgtb}4X6soLHG z1J%Pee*PyIs4YqYgPBgssErFAQdJ2Z$f=f@%*=ZeSAUkG8unhm$nLGdo_&_hwEPf5 zNS*uj_t77pW*a}(T`${tKQo6>fm>wDA`SOwPufDpT*mTML@NXnq5$a&G=bMLC@>arAS7@s3d*96D|oLg?50 z+1@5GAFDcqE&)~n6=Nz2)ZM2V(-gs8S=>=FNN#*YNLugT@Lzt9~tdd#q#2vY6KN1ocnTBH1gONN?;>4 zYdh5mP@owp8{Tv^RopW3UAzl8sTokvz;_p^Q_FEA3PKKtIS#EjSZ_^Y1fkhyt}@R9P1jE(8Ff zd%ZD&2SHB$#Wuqji~T1OhocrzS`-dT^f+z0y29=c)CwLZcjkSS{!+$76v;KSxMz0$ zjm}LkyCj6DVmtKTal3A0eFnh2UXk(5CXG;PQ&vz2P|1DyJu^0lphD^NJiQHt-Bmer znz2L@!8sVWN|;gwO;U?1H#kW*mhn^h;|dr0QF~Tp@rv*^zY{HOrZ)4?2k=51zUcY+S1B=J=biC>R?&;aUtmXSXXD)+F8n^`+RPBqNT9y4mRe+WgZhaH zBbGm)bnlI}1se2<3n$DcUG>36L=zX?r5qLdg-dVlHeex@F!nwXk*uo2XVGn^CBd!q z3U-tqrh7Y&DBR;~YgE*tMi~WuIrF4Y6oE7@k3ayU_9Mp`!dCR3cDzYhCdpq(*wCfN z{G|M0(xd6J->(-aLpL9iBU=u#PUq`L+5}z+OCPHZ*N+#;)Wn@Xcx12{)@k5^?t%RX z7ime&>L;ue??rfMiIqswZZCXEa=Cz76BF`Fg|)QG7<9_ObQsF!E7m7DI6--6?Jlt` zSQ#R#bYMmu6OEXVO3XwB)NSMo6?NhHQ`xox zWb%4F?yMYY?T2yn<)b_MK^qV@h(x+jFvP$6+;4*!6L0n+#>sX>uG zv>?;Z=f~5nG!Z1@Ms;74b*-O4ipo1+{q5at`(U0bXtI$JgsEqDq*l6?mdHkg+4V={ z#POyl2$TXisY+;noxym)!hxcP1P#z5K<)1GB)&gAO!9ohlMfGJseb08u9uBTM5q_4 z$UtyQxfKK<*lfWqc67{9E6FcHLrxaVqj@0 zbv-fuK7%iXM2kRg&+8`oarD#Alz6S8LVak0-h7YU-#c=vGk)Q-6~B?CzaS533la~C zt-d5-o9IqQ3oEyMPcmmC$robs*px=|8=f~2w_(qpg92*oXo})lV3X;T(Wg`f*^XQx z$Df5sMijqr6o|lHP%j?=cnWGVj5rNxe1TQbN>oWlAqo0_q}K4Q?yH496n|K~dT;UC z*RTr>r-p=ly;XT=Rkz97H9WKf_j`5TkK5oiUOsuzU6Y^=d4-jw_F}s3W>!oyZoj{3 zcb!i{oV#fJ)MPmEqcgQGShH0ikGWZ{vB0UCGWn2E6?yg_uI5 zcCB|#=LlEMs8g1=)e&MgLqt+-4Kk_+xhlQnugFrhi-^L)h=CdCjkCJ{+QNX)np63g z4*UMtr$D>fD}Z&QNeNrfAnRv_(SGtz=rrMWt=w8tCKo{C^{9=1(}dITpeg0R#|%f! zs+xpmZjmCK?mSjgVN<~5TD{oSUVHkJEEgf>`gU+qI%detHQb}Z_D456H6uezRk22| z%B(Jh&@~36xQCP2CEPkGnGcnWm}xxCcj|sB^lbYIHnsxc8uArgfVJ1w%%2*Y(F9)I zb=`%%ud*Ubuz#i4Dgd|QSGE&+OwY?gxQcC>%6mNBh8X^^8%YEyYc3K#3t(u{wV_?f zG|l}sHEuK~$7l6DY*1{>CU&R^bMcKiO_ZC)vt}D@T&TO^fG1nzi^JHuNL@*$3k>x3 zkipUOem}P1EP};CC5%fmL!>x^tGO1H$}wSlYLsZ^a{z=z@DmfdhHB#sWydxGc{lYXEmQagA1AAv;(}$Evtvwu}lRzL9Iv;1>L;)V9cV z?IVMoM>9{jc7tF4H$yhIIl;SA?g!^ruV$qC!3ia0a__&~@Z>y=C4zZiUrDAvuHPz< z@BP_Ux*Tnz5C>~|zX5uan`@h*Z)q_$w0JvRDVXzzx?b$TH_BEkmhmf)IBYv|@Us^R0fCg*$;LB#T{R7I=9 zTirMA_-;Fh{0%5laPo2eQ{TY{d8!;*<1v#_AV7eF^2?mg{Ih9QLazN?z|h8<-xJTJ z%3@w0G0;?XP=5?{={3rm30f(MPh??IMM_VaUy95x?uvgfSW$dQk$|TA2vb>0P z;jE61Lwh%h+=nrLa6jW3UVcHv=_Qm@weQ1E0H`jOUz`jFN z>Ep=)eHrWiSzwuYQpVRPnAdz(pEFr`X_f)K_}Wh4@0L~jYL&q!Q8N>R?2=jm(vj<7 zTEQfFJ}XF7mZ?Je3Fm9m%wNF0crpZq$4pMDcd0Li=23coAyfczinJS{yN<(BVs_C@ zn27QQu2G_{6?kMd6kaY7pDG2vGcGsTQC}_}MYdVcQhPm`X<;P9@?vCqX_ah;Gpl^L zF8&`NC9YBJHm$#oYRQppGI-CTHbhg|UYClf^%hnuASAga7?<(JFnOdhGiz2>x_aAP ze_aiYLG=HQ*XURJg^B%ZY?<5iPq6~kr%q;r%f&zn(aS57 zaFGb?=7NklMhjChJiF{C!PJamzs;ODuZyI$FRdZ-m!9_pEbX+kjhS}Yl3DAeM7gGe zRQ98b-Q_FG0sZ&^=m>#DUWeb3|M_JdIB62y;g$Iy0S)N{g ziIh5Zu96}dprswM7@9P_f$2W>7yCQ>=QG=B`~BD6wId4uzi%{lvP>~yyZ4qvCFYTC zECK*AKk{8A6YXswQGMp(86(rr=%zD>eWy|7?t2oT8(??Q+tqgz`6?UGqcVvD6~^Nq zcQY`dUJwTp@%zVAD;cxzqVmDRMm>xv-ZMI=If>F07?Gn#`Gj&NU}6>I@n zrM@e5THMbn58oOKXIv62Gg(t{pu12s!J_f@@xKyD6?_o=yRGo*xhqYkcpB=J`jmuk zot(qn0D|yKS*#gz>e*P1RDMxa-pfy*bKpH;;)?swM5$*kIn@95UjJJAOUdW*9m{LE zv^rCzl+HQD5KpmFyT)-i1B8{5~+Ce?92%$w5C#f73Y5;@zwwPh}ns!oA-5CNR|xI0D$xr7+|35bt*Ol*Y&^o z3=?!1Z`Nc5$!Evtep&L{INrNz88sb*Bj~J&PzBi5g~qU3z5LlYzG^GeOA0Hi);x8D|>FP)>K>Y>e|~{0z5wwtt=#b z;4=Nw|GJ$^Fs+>JRn6`Cf=u{;#j?{to8%l``}3IdyC-$afG7Kl4HP?9R8<##c^xLLel8Fn$D>zlww8OPUe9?tYJJ&AX)zWKnk%wD z7%o<$JIg$EZFW{b*lcshX#{QY@D%T7{rsFMCA(s}(6B)m_dcB7UexrXK(Smht}`43 zirc$oO9%{fd)xQF(%GhOvtL+@J)7GzcWK>YM@eG^FWd2uVAF|Xw6u%`;m7KROXC?M zF)ez{G;4pQe=?Mls0LmeF+#)Nxjig|KGrLKMXrt5rKd31!mGhZy2RdlTij*kW~b3A zirMo6ZqSmRz`FWuAO;hprPsQ8&mt5xdYUWlwl{xHo>@qI-uiLHT zM(PP;Cu|ovi&&z?%ZUV)r9bSkA;XUh^2*YN))h|5a!`t9q?&ku`vX9Jl<q{P8D@=hBf#7eJ745K$^1Z+fU@vA482RP_gZ9FO|1^Td7rG}*y zAwo@feW&jz(2S5ICb8zk>KGFED{F>o^PopDyZu!)C&tcy)q@WeT&nV&qOojLmwYLYekY~PP|~TArDqSskp9Vm4?y1eEd_RK7?A{YlN?DMVS}Xb zQu1hJA4w(y9~?Dq{gh68IVzGu9<7RDpo5Y5Ls^`CVk&fQ(#m@B(t6nLFkO0kmtU39 zmX1fv@&aKgY;V+fT6+{SwSR8oW5|_5{_d`w9KxZsZJ)~)Z6QL^!um$JD zL9NR+^=%Mk`P>d{(bGxFy)ghsWyNJSegj$^AsB^o<_#k|&tw=*6g10+_gJhwN3OJU z)#NzXX^jyee=1zasbWf=i{&QX5j7f8Epvqp;!^i0m`cCWTTYO-`#Se%&~o)!diWi> zQUBg$?Me{7AUkF}W~4Sbb6t&4!-;Usvtz zsqXmtVlFl+6g@*F({p;r7G~C7%q;kO7?=S@s(fs(({}czQn?6#*TNkA87Uz8NIp{| ztHa>=*Ua}DISG6hT+nO7Te1nZnCQ$_MKX*I&`1QiD5D23LGv~Um9>&sJ5|`InUrBn zR$LS?L2P_jb0Y5#?D;xyPp_AMP(~pNoo>&{02&I|1ZZUO=D&RxEQ8j8c~>?yko1h^ zVzqCr5kK|oab}9Or~#4C%^x?u7s#ocr09K^`53qKuaV{3!k3JhkDuvaR*}*LF0Ws0 z56gRJd#y2K+=Z4)eGR;tF|gnbC-bGhJ!z*#zpILb^?>n$Y9_~e@j&BE&7$sS+H#St z=1B`<3*GYYuUE;EattNL&mk;P2d|`}%`ZA#a8P8fOZoj^DX+$FK>gpumOX8rGblJX zr#ORey0|wfxtEQkgvEN=IqUuC>!mOG{v)j-Vu;~d-7IW9nt5gOYXYLj-UKffc8~rM zfro4w&Dv+3%hBXIi2cp)(bv4NDC)hZ_BGmh6u~P`lQ819exm>tuc}|1VAomslrq9S zXdS8>W;YWOK+XDev$S-sxvgt6pZh0HZ~+@-{R0N#O}(u-5rUjrkDztf8x%EBGE}8$ z7lL|A1lXW5y@U5^k*#f#D~+cV`xP8R43V`zs}XI1AWv}V*3M&8u5#&`yYj2xei8Bu zsD@F2z-KbnAsZ8|*;_|#Z)0{0$hXfnFbDKQtgoAtk){#Dy;U@~&FP^J8q1otEjf`f z?^xVbw8L`DIb}{*X;isGwI(4|yN)4tRw!srfPI^TFyY{R;`)FAnXZF6QXJNt2iyhJ zQZ{HoPGMlf{M*GEfQW>_D1gpNR1VYWWMIU-VJ{H zOLbvgTwq@BCEFqlsG+QHgAaL1=FW1y;(n z@Et2hGADL8N^Mho{7$hTLhSO94$D*TnaEH^-^1pi4oj222Kg`2b~jMoy{u!Gj*0yf zG6xP^7|Mo-sS~sKoeyQ=OnBVNXfW0vRmaL2rn_q%IcMz9=o0W#nFJAUDjq}?7>aR6 zUGExxX}hvR@p|??P9J^_iYum&J@{#kW55NW&L2UlA{ru;`lg;7qrKH^mrgB%8)$HD z&j1bSs+9jcl}xEpU(8lDAV2@@TrTYgRG`feeO?02Ya{GTB9#Aa1*f`5D3`M$1C4xg z9Us=KHa@JXeH(Xe96O&o%BD>UJ*$OL;b}GJCblVoA~f!kO5iA(M!Xa*eR4LD&Po;D z2I8^uy7Y-e6`)wEpq%BZKsReWa8Tlw-7dau@WpDZWadg=AJvlsGf?;Os z`0b{bO{>0*O8E_HV0h)q$G0H!xjFZwsD4A*&Fq;CVIuG(gS6jDGKFm!20T_;3>Jw> zc=P34h4Ge!&KBfoIVKCF@yIs3{+=nuObR_}*p4yt@)VbO{M!W%!61b)qe=VDKrva2 z=3(UE&FyKh;2pbc<=?L)mgkb@UO!pH@THoAu===}nJ+B@pL;R) zY7o0mh9v{5-DdFWp-_CN0 zy*AW++eEeB$dl_`yFW&rZIWx?Y3t6Z^j51)z6wU%#62`Ru`T=tf(p^XyUOEQ_nkIOq@?58^lSP{4c!nQ8i; zr^kT~vJDYeHa=s4&*iEW41`Exu?q_!wV1Cv)5AbPAzxiGj)$r_@sg7ag=cOEgdokO zpUjO|YBRMrpeHx*i>4SHg$@ga@$!feH(eW>)dFo>N`KP8a+g-UE6ld}UOMeK{?Ku> zZ@8~s6oi%0=ZKeNIwNw@MMP7q9Vt1RC+e2WGxSbT7jNap3iWsHZI(&cFPi#+J(n|k z6)rcqSvl(%M0o8WrxwEW>c_bqULg|ywKlq>phlD8SN%`&%y}j61ZK^ih%Uom@Mbc= zA93ZN>=MOQ#dl4^gYw^OI&gZVCp5V06NNYYKQw(~cwPO|^^R>Djnmjplg74f+iV&% zNn_hqW7}?Qv$2i$-2dl#za>{rj`se|nzd%l%$s?hi7IZ|(@#(e_mstQlK+0HZnOLc z7fT)x6P-VCs+4Ak@f}u-)w6*J3jOY~yhA)FeTs!tJX zM@3aP6)W{KKk@~BkL1HB4E=9N!j3o^y)_DRdK`|NbnF#{B$IQ&XJ3N>#T09=? z|FePbc4cF63frwoa-+T%l0OG+F_5X_RFG#T9Gxfnzt*^$AxH|w+;ufPtXBKza*2Rf zjjH#@O`YHNdwA5$PEZAn%~7RIN%aRH;}`O>Q5Q&Ht?AF<(_I-@yuBXmXw@LTQ7T0@ zweLgHt7X@^Q2tJHGMRF)%#Y@AKze~MRT}qSLjQo#bmPs&U|A&v$#pL!o{S7M>9OZa zgTz%w4qA$#R?PXo0hTknzaJ41Ap$|-6R^EIR;mbf&ry>AD_5airEIBobEvwIZu>rU zqubf<-cXJVaK6=dfx6e0gHB+V7(fETT3EJoZ+IvOxtS^MQ!0#Tf)yDw0zq@#1#Uqm zqgOm$?N?!vqV)@Kjrs$8V8m>!KWPe-VBacealoskH65&yV3B}>><0L>&=L2@VTAHa z%fR-(c}EIJ7ma%GK#d^@${}2tNv|(z%@D#&YT%+EpS**svjAw349GH)i$9O^{u3_F zDryFBtnD2F&giW1#A2wd{5y=3c~ZY5EpkQMM7l*c%~3-GQ+UWNxEjIvFu)&LKM^c= zY6x3EFR61-A<=<%bG!6yLmd`KY9fDRtl$C*><8@zz&rS^{uO49Rm&JB!=#q;v^qd> zEVs&b=dSl>(4nch4leMfZ4L%t9$Dt?fXX#9IOjm1x2C;g^eGYgMVcxhfZJj%fC9je ztw~OC5Q7JPX(P$}Jz3qL*JOHxj{+gwxJL&hYBTcU4IdmPXy|zXimnH-GRSgMtDh$x zs<;S<4G-m%VHVR%zmvXH0m4{|9GdCdG<@%pVeu92g z&aU>|ySKEeDr26NKmwkrZORo^Sjh;FR@<^?AY?E)Gq_V1(l_PVLI00zQWmKAT?CX)f7*TaQ;9)q8_sH+dn9zB}Rfal7kk_gvZ{+<(hN-ipan zcQMOgU-lZJhQyRlC7-8)8-`d6Hs(TyShjGKF?eBcP!HZ(=397-FHcmI*eJ@)PuJOL ztFfu+1tWe{284G{AdZrP)sIT0=ys?_xpLvLC>LuJIN&V9hhNhl*W6-&OriqH;;4(4E_9iNllD|>{qFI+32iSmrG)zx9Z9-(! zTzJ!PAM)-^BQIQ%^_!As=Awfeg|=QT0y{mhUvvd1US4$Sz~pYQl4&Ah0+dy>e>wLD^1NOx#O;oE_P~(zuTC~`?lH18(2BNv@IAwImGLl& z)&lUMP^jw6be2y+0>jg60-ac>zKP(1ih_Xd9%&F-WFO^u^@&WEJipNXDSB6COSq{Q z)kzHz(Fr!dhs_PldqtFob>N;r|2^R)$^XSZd17SXko|0zcZQDFdkfKp3@}ueLt9*z zcGoO>&-ZEr-)R#7Os!~k?nwIcl8CQiZ`NI_{?Nh+d9{OTPVR4){jv^ar|&8zHN2h# zBjL#%B!M}%P95F2CCFBv(A$#pe1{!%XQkaF8<{S`_saDZzMeevG{KhP#g=R)&eS7d z9S+YG)9erartVc=JPa|Uo13{jWx!NZxA^!TVnA<%_M^x1o7Bt(1jPLTAnp*(j-w9H z)Do^0cTVQYjCIw33-87Br3l(UDH;l}-c>=?Z?0a={gR2eHgS!#cCEL5c7Ui%{;dw4 zYj#7V^!VLM**gC8jqfO~CX`?AP)<8xc;t69(^ET!a7-+4-ihL@#_J&Q{&2&gEr_x9Z^Iue=oXXQ`@|M6O{hRf$X`q{foOyW{@(Y!ewd& z=4k&GD1<9-V=k*y<2uh1NxCb@?MOJy$&0X|YssD;=Jrc25+{h->#A-Xn&?OMc=xdz z46t= zgg{H;@k>3=t&w3ufDxt}-{=q#7gIA3_j3F;-5Fk)fSO2GScv`9O{(=cKw{o{43K{elcD_#GYS~Sgw*_ zy3^c&cipR_4gf1o2HFa8L z<%kVFyeFR2NZwFAb7o=8;KK?-S%W?blWH&9T!w!#IX2y9bjc!P>8)H?mihfMGz_`< zFG*GzvR9&tQMvEi?hToNg0bn*cM<8cySx3+(x?|5_)8LRa+{@80i|uI0hou*KOepP z1^&kGX-BjuQeP;|+lh6u=vtD(T{QGqR(Q;lr^*_(bkO->O1v_k{gTx9jst2}ljly& zO+Bk;;SKY=pZ89`AT>@PhL=}>J7Je77(471{L1wISTTfNSqTM$PwV5PD%UTqTa0-& zXIvZjYE|v!?BuPtJKM-EU3>)+$@fH6m#HtfKlhc7Lkc<#TFtrM=*0n=EBE4*Xk z3|T4{Mim2`N(C^*(FVDKv7DseU2ES*L8YS5lBaDc2i7!jV0av?rAd6$5(`k5d#{_A zZ8Jv{u98C1#pYEu7C<(%TaMZ_xD7$NQsBZJunV7TVIfjur1Z@(D&AbJK|e_pBg z;IgGwYxP5mHox&>Feu>PxO?$vT+Q};nr`Ws3-P`POMC8u16wp+tv<(ZH;2z059?D- z^)q_ilJ&}!FhWPCSM%)L2+epGnBL##z)ZTfN5WMgx$*n9kk~rEV+Dx>-9&qotr*i17#}fWo(Be`^cguxs7bDd4xBgOQm`|Jz z&9&x>*I)e1L1;ITxC7J~;U5g`^WMI{I6mz9g`zh#kVyUYlV|3D?V!C%d$S>2F3sj@ z65*)#%G^RQ2cH(YYT72GKnEXVk6iy~K2ep17V^s9GOqCm8N5$~2Cw{l$1 zSZiwB6#@`)!p)O&W#<+h9h?B7L=ju zQULcu`i$P?zMa^jXk0|FrWicHiK~1PCZwG`e`-a0odx-4(9uSTIa6IGEJ=3>nFlF% z#QE2HL(iLiN;5L%`zC1lcRY%ByJ?~bX%)0UmjBc+SDN^SfLoJpeE@8a;~vyEo}U-U z9$y(ZnUMoyRQa+@fVUgy=%Xhv1S1Q4Ldu1)UE|vwcejc@CLemMt=Ehj(lHB|o-Fca zFNw2aeLyp=XC#O$7E#Dw=I(_8`ad92sm}s9sY(IMSE@9f%-@vS*jooykiwqR%Pz!N zA&LD{&oG%EU%*I2({Jj3;0>{zvBbZ5Ly9QU73_kzp70gIrhnefRnSl5Q|3U1a1W>S zo-^rD(@Rdiux9!9s)}x2BCOG9rvIu>uh@ZH zCX{P;w?}UU&>-Y$qRhhv8aNkh^dFSp`hGK)a2Hf0b-&F~6@o-6HT*KE){+%;g?h@u zLv6`z+uL-6)X|k_WB0EPrJ{zA1CVnojOT5M*C_|XqQnQPQ3_a;bb^YPqw$C4b3x(3 ziOc`2g8x2B^cdS`Px%I}A!7WkvU6p7*N5PlkP#(yBPvsRVdtlbWDJdH62IvnJ9 zIj?Y8%)%;dPX)8r!TL0A`Zuwi$Vlmo46n^K?vI=tP3tUC(&Q`~dUnxWU1uY1jJV%d z{nK{l2UQiW>oCL7`jcdpa-IFv>}$da&z+av0aYuW=f2hBVKArWIsf>KNI7t2c zR|kP`O1r!-4%z&%!UE?womknMtxCUCRHj61sdx2#5mCU$=?YdzM&D!NN({tu<6kgg z8R`K#v_K2c#zRu7uD0}|b6klIJHi8kMgKi; z+9Pjalw?xdKdY`^yBtCkYLRWs4p;+qcYM}_t%XZ*5l>VeE5Eu^eANsEEsfjcWI^j_ z4HKm+tlS`I2n5`{pJaa)6wW%;&3k9&TlLLgYRThn+<#y5j~=b>m?N4&G7SF5=6%A* z?fm<~o9Pn&$_=;k9)QhY+r5lZDrRq$26OeY1}xPWfyQj`&FL4Ot`Vn7{(5AfzxHUQ z<4a_8gHQP_BFRb%OJD0Be$hL_JI+EHwnM9Agacq1s8Cx!tfo59fErvZ=Tku-|d1t zdsj|(TC6EG5tLHT<*;sUe>Fc?hn>?f9G@zPhOl%^RK0HfygjygMGWv2;%{g3YtdLl z&K>YZ6t2C;WeLZ&7-XJ{gqzn-XeSgdyY~z^hsf^-O+Wm}n(f;z(p@lw_b1a*OgW)q zqBl+I{bu|WgM=&e))7`Q>g#0?x?^-gb_3c6j^nvkdYl;6|bKoUj^NVG|#~`58 z&bzO3Da@V0Hw64EZkl75f)@#f>!*-L6WYDxc)<@J8XJnyi0%k*(pS-tv#)>koqEau z@{_Aj6ETXUJ9=;$C|$v58i|Cs-VQB&-e-O!ge0Hc9NbU)@2CMt)#LzGfI=D7(O*9- ze<&M8YVZ-ZZn+?Fys5dJG9J6l91})W(Mh#><5(~X0 z+`D{2k;I`df9EBcnwDjbVf_j=A|7;M z$Zwt5Dwf=jpZzQ)A>yc0?(<$gPO1458iQ+N2B>W#NFlg2&-S zfY<9qRyP7)$Lo(v%)@xXb5x?`$GecZkYf37*#Z`ib~2iYi`Yz@RVGByIEz9pd@P-> zf*VawAxxD4S3eoKs8Dqj5;;-ZPOf){nmzpOqO2CG$_PM=L?Pudi3+0U<&TbobX2oB z?NHXWu>wtAoB`frYzBG&;SYfB{PAJ+ZCXtW?&!w5;3uJ$-Mtf(Uv^GXddRQx_bBA- z{*R$?W0pkr>YSSEp&8&q*M@KApLe6+)t&{cQc+NEj5{VJN)O)y9 zHtaR#t^<_PvBAdl7g&QY51#3%CB90*{1lLvVsWkDPuJo<^}o>vt*F(=C~YO>*}P8w zSvol--?DsNdFwl7 zkdjYTOeg{f!+2gV$NpCN&x#<%KM9)+(u7!xY!d`_bMfkzH->|NOo#8C5Qu---!QlE zjXpZc_%ce#3kB6Pe0?!)LLPjl&j0sWQM134xM!yq!f#QW=@i}<%@vxA@O#u3jhYyi zHiFO&0k>#h;9YQc2?KvXgfncg$z+ZELUO56>F*EG>j>|p$a|UeOiBV{ds+?>7)4tF zXi}qo^@>Vx;U9ajd)j%&?xZ7jaAyVIpUY^n%`Mq7_>g{@0U#W*G*d3SZwdcr?}$AIP`mf- zK5HMfLR+v<9)nxDCn@qL56}Rv?F8XVqT77&$J(4AvntLAZTmpM&cM%ieL8_ z6_P9HPBt+$aKd>9uq$YCmC&FJw{$^GEdNNlYM3?xnHMh{R~(+?j>GLMC)jZTFWR~T zMtbgomefURskW*$A6RZrdMA%Bij$a?le+4%{57V5k&u=tkFKeJ^QL>cq~OF|G_#*r zvM44c2=~q^v4kfjt7h~Z{)Ay^A&b#tgtc5yDewSza<5pG2EBFsFu5yQ^2aeE<76VD zr~=%Y2zmaJ)i1uMd6;HHuyZnngKB++uG6y2NhV7ZWU;!&eKvH5k%_nL(<-{dyJYaH zg>+~D%ZO63gK`3FuWDA-m^0NP4kPU!$n{0;&76F#8#py5vEV;p;A9+D-RXJzp82H+<^riIYQHi3)Sb(;-dz2DTIP=mTZ3cP=TXM ze(w8*;RnmH)7)cspl>W>v;atqCI(~H);x(0Q(Dpg_k=18;&OT11S>b_<7is4+vf>| zQcO)mqK+b#cY3%+FJPdn;vTJ<4bSI2m6_$Jq*d2>{`&?t(5#KYbQyG;eW$~ioItfY zQr-0lE~xatIxyH;&$IGbc(MTS-Fc*}xQwm2st!&Fp>nN&ldBQ_OCta(S#%<~@Ua=w zH}wfDaB8sszM4EH`T5jNBHLzlc#c0W-UVh2=Ed5Vu6W(;q~rWf^Y?pxGay`FQl3rA zV-ZkdMf3T*$hCF!fKw&}?l}AYLOVC}cA5e0W8G_*4B?P|xe8|PiUUl7%c8kJ& zIkLgT#S3)QpB5~AbnDu<+;)ZCrby6(u9btTD_|IONtA4nV%@~P62Z$V4jh|cj1NUa zl)85vX_l2`8+fo(5e3pmAn|f$>*Z}s&5@pEr%FV}QFFDANna3xU-c)oe}>Ejz9EQ` z|Dn*uGhT|33W&%-cxnhQX&u7Tt9m=gp(Ar^oR#!jY%Kw4Ec&-vl(pEh7c22^Dd|GX zgtaN$I1@`>dFN%d-l>2uvIgPznwQJ`fDZXX@~ZsVS`LN?b1i>8&tPXM?I9lm$%pi2 zhCV;T^xU(QJh0Dw=lxxM}x?2_x$z?E-VwKg;iieqw0pY zem%U7#_I+pCE(T(0ftmO`$Z}2;wK{x-252Z3C_Pm2<|yH=g*EXjKo`DAMXo^q=8SJ z9+Ke?Ytd;>-*=Tz$)b;HGv8B7!=YQ3SQXHCJTwrPacbM$X z--|NnR)m0Et-;d=4v~b^$S8hT7JMURWUmwU#an^34DuJiM6EDMEB&icA732#$}h@g zDUYxB>_-e0HS5nr^`$%-WDtW?NJlvPmm}n$mxIe)UA;BMDS&tVErmYV)4O)nT&oBb zLp%lDzk;@J>6bwEfY+E*!$yRqnItT+S6$E%CXjukF$7sU8YDPPTVP|Fk^WsV;vlUd zE4FqU&RGhCWG9x7w#-I?!?G5Vt)$DXzKq-4hI&VpaMbmoq55X6z= zY>6%K12E<7n=NWddid;$FRPKbUSHRS#vjdFAWzemo zAB!SQB{{h}ChM&Ud%KaPW16#N^*$M$D(_dpCc+qF%-rlNpI!@=C!EcK-Fc@w z%N;~Tqt{ub6b(Xjwl!Sb- z`x@*VL6Iz76EUTm?$)>Gdh%Mc$_Lx^Wv5+W#S*Cf-W*rhFg|Ywg<2sw3cH4?I&T(}>ib)nDoIO0*V!r! zj164aF}dtdmbG&-M9Vg9<)56dDp>^kZ3IMSB67(Y`}}oM2h^_pwv=ft8^qv7psmavV@(5EZIrBiWDy$7e{YY16(xCIzpFfg=O z6@DbSm^g6)O^zuNdqN9KkcM9uogNOo0XY0ljlo3SrHEihfZ;;1d}g{9@QgUsV&)~@ zyK?%Na-9>aW`Avq0rqt^iLN{{-UOhMe-J6VLi zZ7@_vlm$CnCB@h9N|bv>#3&BnFx2eRW@{QI)F)0@%^~W@G~Di{1AYPaU)vYdHnzVC zN)XYy6Bdwu@n&o!A~E*{NoHR_g^&A|Z+MrpUQm;_+g|YeJ#*Wh#65B(UCvH!C<-Cs zbqGp78M9LMyyUS{gZQljN=y)YJb!<2jHeoe*zTeCy=hD86!PEMP>QMdtA!JOKOvS6 z1$~(O5x4HrYP#i(`6mV*AgQgN$K2Wx6GyAg$5$>hle{lQD+a|e3#9KcYWS4h3%Ge= zI`MyP)N{7|T1SYU$QDOO8J(t({ki>_9${f=j(&(t0WQ;*G-GXKudo!~`5mNEJr>)1 z!bx3LCx^{*xJth?@DwOycl)LfeNxUz`V~8AgvxKnvpefc8o!I!U8*GgFpEWf_sE}f z%ble8ek(Sb&|Q0#{SxN5mES0|jw%+9>bIPyl|>rx_Vyvfi7lYN-XiWnaIN6< zIe4q8V0vzi7aj1?;pWhW-81E->yMkWb=9Dl~qjZY_4eCE9PNt?#?6i8@j;7RgR@hJe)#>1_didxC3RD1Y zz!OP%rO~;pdj%WAS8W9bGGsmj87~lxyp)RV&H2M(Y>`nBJ+RKOpzAR`%d9WnscFYH zf>a<65txp)Rqb`cML+~RaB+7LBK|!kF=(M5y?T|dFiXm}pVyeF!B)2NwR9amXh(SA zAJ%TDJl1<&gCC!@sG`_u?m0u@o&=To@Dl=#p`*qVxDVMomdr$$v6`oaF}Uc-yr(8X zvmC;F-CwU*E-u+kWhBhhmEASUH`k9>74rCW}@4DJ9|H1y}nYx7}>?YIr zS5z}5k(vOX$1i`iP?zgA}0o#p{G8zJLxOfY+L z|H5x>b@lhJK;$E|#TW>#K(eub>_z2gsbA>(`r4WFN86)h8sf_T^O>zUg3smA!JC?D zx-`JnkMzJr68qt75qK^By9iENl3Hfk(OQ$`NDj&fBvQM?b@D>>u$O!OBmpl1Rp8@F zCew1Nj1+jkj1x!An)Wc|2n5{hs&BpGDHp%EPa%@Z z5^o&YRQ<`abxdq%o5s;X2FVRTH2&$EbU z{^|FssQ^La$gXgVBKx;PSk#4e(;D^-=%Gm~8{u%qqTi!GUa!?`4?joK&MsGhMeau} zXP1w|=L^77xHakeA&2H;yiiu?n`U31hL_&Z^>>T(eEFDBW*U*fu9fjh zRIkmxbENiqY}+!r0i!~8r#F&soaSAokF(swxW&+`lAMFmp3)OhSzzIvrMzX?bHNud zc?gzXX%*K95C4b82b~_&$24PiH~!9W5rJwJ>S~=I5^ExWUABbeeb$`$yoSh2VTAnc zf7#!=`@{XV@rFh2=jQQoW55aIq8k75MLMc1K>V_yl7nvH+IW)^uo^snlw6uF_2DeS zF92G0)xv*1Ul@!T*t{0iO-Dk;ck8av&z5xf!m>rec-Ot|T<7Q7%ch16bThJjw#_OF z9+wf-6WXc8XtDvm)E;M#Nr!Cja$41m_oAcVQM-4yNc|B^-~CRR+12499?@`e^dMEPq33yd{x%zU6Ll6#}ys}*7 z8bj@)Qn!#LZR`6M-;h1oaC3(tZu<_1lO0~-z<}XMc}#F!ScIy}i#{-nJcm(5iKWj*p&sf!UZ>TD`wj)c^r+-wUeRwD&6LYePd|y%C6ybna z&^Zci1jSKaSS+zNQb%5la5|9*s1c%=98bhJlUG!Vj@9l0oYil!o-bNuX{O!S_&BM# zBhooNOQfmo)*oOc+;12?dU(7}u-T3(U_RJZAR1AxlLe{*8k@;e^c7o&?KfBxTR@g0 z_eQ(&6LQ8~y%>+xeW|3ls=^=UWLotlsqD(|VhR1mi3_4sPI<&ieCIpswFK z#GbB&fGxihGpqu}W}>}s1RM7u1GxwNz2VJz2417$Lv|I-*OHBJHuzzYg2I(@iQWNs&n?!l|ak<)3gNpA;@) zuu2?qd<9(}Qo$w6eGk|=F?PS(#MW1=^sx)yHO)?J87Rc#WP^<~Kdb4pq$!N5|L?SJ zX<~rB3_sFv%H1YaLHgBai(@m%~xk8Q#mq>Qxe)iC>fWY_zs`QKvNuS%*E( zZL|3rtfwRYmQfk8xwq6?pTblQIW1?Gp7Yb-kO;bDJlFj7d3^uwEz-y9^CMWtCi{(p zfK5*2Tkcb6Gzzrz>V)m{kUC(|t`(L~C|tDnQ*?6PfIx?YF#tO-K7zK6(BEx(23kTY z>AXOB?fR`(2{2)C7n;sW!EtR{V_J@&JEIO~4mtd}@KB#%roPKUPy@3o)$qO9XYxjWQQJLWj{?m z<}^QPie~kTnu@nW^N4+stFALLm>zJhQ)t(2=o_x+W_+W{6P$K&ikQbdn4LuPVQV-Y zJOFl+ZX>IPn?kqfu>J9iLJ}RKS|%qD3L@3d)#Ii0DABxW_f1b1~@!CfQz zi!;@yeQc2*FCP&^bL%2~gu&kpjXXV{P7OZ2RaF!9Yq~+>+B4GAs~f+&ATuqkel8kP zzY=E;Wkf~iB;N=8Hjxk#zuTgIjD2ayiVxoZTc|6EtjD#h+C)P+G~ziRpDF6 z>ZVm@jK78%QrV}cl)z5l`ucI6Io&r7l9Un`^ds6WLat9x)!@j+TXf7qgjqme`O>)v z!}wweD_Lm4y<6QOfZO7@q)33yo=htB{e5>eC*@Hfo$Eo~=TT^tZdC%iL)ii5>T{Mv zaIu&c@8U)MBP}5Et$9xG#qZu7*wT8sno&Qvo}IeHGI&#e!D*(nY5tt{2MGG?85*-Z zKMI;iQt&_P-e10V-h|N62fDrJ$k{cDsn4_jSykpuPP5PPPdJt6t&d9wFZ6H}1>NR~v| z18!dgA+y3qGJa+S+ViYe~V~+>7~?u5dVa%jHC55<|f+4)GYi zgm=%wi(;uuv}Bp6D5R;Xzf1?Ic&4PXZ2{us$5U!4>T!h!>w>_@DSp6PuOxL4BSAg! zSfk5*$xAuvpcBRXgw|oZ7@{kA(#VH+Oz75qE06rNouVu@#btrpIf%9yG^8Fe5Qo>_ z!F4IY8CkdLOLMOl`1btqn#sowV^i(O{OAp$)Hb|fqrFCF1uCf4nc5qx>-qWD2VxMY zW9Q;(kp^pMs{ljve$Am{0V}Ot0DG7ArT{ z!NKmW^cej@8CEc-L3mvHq37oIxPcG&Om%%cK9r}VOK*A>o#HI0F$sA$vFalCT)0qH zwKIyRr6;zXI3WG(Uu4hXMHfz}Z!nrz*#4UL^h?|#Jd<@`L>(OW5eZinuJZS-iXeJ9 z=}*F5J?~IP_HBB#dfWV}UFnR4G#3_A1Qw@p7PV*ogE|m7f;etl^GAJU_I2UGE(>j+^E581J@=Pntadwv7RwEHd94y_qN zGj|Fyx8MseKgT{=EF6zgS`*`2F}K-C$o7oMzK+P{l&+O&3kP@PbQ%h*%6s9tFgu}n zX=YieY##r>8I%nUevbZAxI)By4$b~uB?&Ezwh)oE$O@B%$(#$iEJ-1#k?D!^U6gJ&&3}She^2xM7-XK1Wn{jr!4aWA0{K4q%m#nub*2^+dw1qbaIAfVywb}- zB~dtewE%0n7o&w&AiK-)B_tF)@0-&ziu5Vm;8hsH`=_4jZAfqcjN|8fGVt>{tZm+3$0|F z9L*lTuf7^rTlncNkGdE2Z0zIRZ)w&+_WWV^VshCZ1igMS0Cqbz#FCRKGj5Lzi3AGx z1SOJYoilk^^gxql^#A6P<1@2@{2@hcl6tGXm;JwHMr z2hPJ~2Gc8d5_TKpGXi;sK!1O1WMdFwIG0kMq*izUVZ&z%*OPW<=imAJQ+SzpYk!l! zJjYdw)zq8BjO=a#dVbzcmJB=6O;vJlhiX`eItwDa9$Mtd{ZUQtEQ&yj8wyJkFD zyuf9%&4s@Bd->tSm!r0a=46NH?>z^Ns-A#T^o=$TzlO&Z0?TzI^(BH^u zo4YT4264Jm8w9)g&K}j&fzS4xyn?E7e3{$kn`vJjFTc~&v$9zuK&ftiSN}eZF>FC} zn4VSoh25<{5Qtn@I}tA~@h z3Qli3e;>Gz)pYe&bSqwCm^%hzCRDe1T8g|ph4a-ra)~wp#OYETGL2SpE z>(+DjynX#dFdXbPX@nT1OT!M-aLr#~zj8`Y`!ei312PIF36rYvh(XmgMV`WAat8Vv z-~^((Fb4X#$X9cF%8qCbI69;EBw6_DXgZ+99*ER5;{n6;$+mz6Z$StRCpmrV zcwkA)P6wgno<5%q)o?ACA&+=&|4>?QU?%_RkuT5#^2KxRTws5Wpihc3U2?7^fR1%9 zw(ocJWI~;(dO}UW{nN6|e1n@0ay!4^$^mH+L6#T*g&&WzPGqlJ{)P05+7`K;W|S9R zu-`A<8mHA3wAjKKCHTTw1wapSe`k2PnEWPm?qYUE(Hc+R9U!UBG>R9XB0-?MFb*Pp zGL0F(3?@RG>8Q4pyEdI6q2>|i!Gm>1I)g7*q^5kf?pDYp2`yI^mY`pty>2Di| zN6qznw+m_a(cpk!^k{QeJF|DcOw?e=%N$>f`UUSjYanq9T2HEj8|b?t3tA37P;2f>`ass6D2Y} z7{igJ`|&p0l-Z4gi;<#=@Uzlu<5*dVV!@)zi*&Ix7#3DL0<^50Y!`z2eI^3#K|>msu2&Xs@dJ|B-A80SqvqGJVU zkJTCTIz;Z8ih_UE;kTJyxZeHKsd@WwB?^Llr-F$hgD1Vp!84LgVkZ~?zCqC-mzpLJ zhC`v%_Ql!AK*F_=@vJ!Ti{`$DyM#ZbO7ng6@+IixW>m_)I-do=dE`9lyr^dB6>qp& ztfOFC*PVSR&8}p{J%VW#tx2^MZp1yJO)J(>6HnvkcDV$^XHt=MB1 zqkGB`r#4@TD`9ssyJthT{uyx|25=;VFzm91V)^eSN3AFUs3K_6l0^7YP*YiZ+}qi= z)wpl9Y`et3*CU+bU3U$)d{#NdV$gpN{-d$PV#$cjmFYbT^8?+SSjCUu3^ekc<1}$+ z=fU07L)|yPCnMMw=xz!}jM57x0J1$0NDGfyNh2HD44l_1YnwB(2*s&b1{m`JH(xLJ zb?U;uv1V#0PC@xh4Lq=LB+(`&@O)!pi|u>~Z2rkUbptl3z|^5=fEqeK-E5kmC(!RT zS|c&QEyd?Frb^Ez%`1ldD67P{LUi8<(rH0}9hu~-x8JGr#eQ<$?%nw=Kp)3Tq1b&q z#h92Zxry^Ew1*jvPC`-S*KD!U6q3>-LNY0h3NBT`O*clFc-}Rh{2xBVM|o|7RBMsY zepTD;LUSQ33AQ9>(0h#y`LPTh?z|Yf6kXXj%&VUD(*)0fR%N9;7gEe1R_T0E$kO^W?oMa!90zMLy;#`#~Ahp6(}8- zVc~K(CR*$FKSsG7w}tKO?Ck9?K#OYu+m$*>28Qz$iyXg;)}!i1OBdK@h@WX~RRa>+ zUp_YMzBKa6iG1%}nO*vOnyz{Gf06qIFiYI|aKMgPBwQ-%S~PAg zmV7E)+j;G}NMevW5Z7HE{NU%6Hx8*Q{Qq#CiAR9Hzo5L(p7Gv0hnjD|zq`RXykCNz zB+2Bwxb}w-M0Xiqhrli}HHld)43@SK za$2iQ*(9p|M3$^YSNy|t6&0bZ+WeH`9DL9)Nd^#tXDnt`-B-GM*M3#B{aqKJyYRE6 z@}B08YO`Q_2);#yxUZ---THaBz-o|Q5BNf8L6v`C+i~gCte!_hQoPcXopA9X0)%_@ zmi@ETxeq8KCAPmNEDqHNXXW4`u@509+~U<}6ZtF}Qi96k#%w6I!c>S!w;?(J<-IY@ z&R;8=fm7G!=HK);VfY36Qc88E!0YL`O`z#ugz_m*bHL;DX|zL3%lNR9LK1Q(q^VWc zv7v8RI|1KDqiK=MNpn;!zv42zLGJ2bZggfPrg0KGB@3(Wd6Q-)MZ3y+J;&FjO=MLh zFR$$S7yiy<%Ls(W=l7$qD>qOwV1NBMUO9?SS8XOcb7@oSjkAS9Xq!Av<7HICui|pM zHq@uO;N1B&e!Xw{)k<3&f*%E$UrY(m%s%jx2mN+%?ZQs!QcnmZCxFGySPPvd%(QU( z(yqyObMzs29BBpzK~LZIfoJV>xKGX6Rk^%2(_1Dz4S4febXl@ebv&0)w#k_#D=R9F zHylmCxPRXi6&-RGOpjmUg<$fz0-&z=X-|Cgsy)) z*-)MZ&17<&ZCh)}mAYR?rhn8k7h_wbeIu5cV+H74*PJIDD9f=!W}u;}4n3=Tyit4H z`}IN=ML}1nsdb8Ju@XuQtxa00LMz+J`N2^uF@$4qM1>s7>8gKn#b$zskNmReTfL!K zEC-(q*!M9E?(Cv(5V^EkxJ0xxa^j;r5io}L8Tpvu{+lR)p}&j5k8n~j6EhFAI={{i z;3g#g^WSV1PQbGKq0Y-w5gmd1@IXYPh9V{m*Xn+cMmJIdBOQX{Vwo5{P(P$sAZBJ$0IsbTa(ux zSTA<$VkPA%LA@Y8r*GyGvgzD7;AObDL&;!j@<%*gxK;H?v7w~n?E)-_GA>)o!G|1V%fj_&!#A0|y_&5K; zahXA`{>&k7w`P4b%}&06L#w?DeF)?Mc<3!f1$F|FZMiib)E!+$0Tx`JADFJ=KI4)d z^dH@3u_qnf>~d{r(pZH45KtitB$L2y{7FKEZ=1X#RVF5>kX@KHf^Q{XjLpxTXNfR< zLZgZVP5TB3ZKlvJ!|@AO&Kt?wqq-t|I@{k0$-7qcx|EwmQR5rBRoiK0x+9?%j_eTr zVu!vmzjS(A>@5CTBirOx!M#PYjcRF}cQ?+Xl3CY6C&m8bAAx=h_ahST!7UOrv_Tnn z-w70l5jg108t52O)8)REaRqNwCg5@Z$4>+G;vS9mef}S7?;Vfj`}dElG_{aYlB}$d zA}ge9QQ3QxO_Z6fjYzUZl)VWV86^>sjEg8FBU_o-zvo5o&;7Z__wl$NzsG(3@$Tv! z*Lj}Dc^t3Ta~{^Jua^YjMQq&-^0LfG$G$vUvTUn@eKgDjqf@tbsP zZkW@sZ@>94;r0tI$%kLWH}UwYkerk|7ME9HGwM_=LjEFjNSH&1I&SB-i-{t>FSgSP zYBRBM%ZHz9z7=7o`>TuuUnz9U=9UqG;`tfL5c&_Vv^+~Maj~+H@-iO?X1wpG^mxIt z!g}wayE5C=(=S#gvifQ$Zu{WJPd;g2YMiID|C>a-W!uJZm52&=me2=s!joHju6o~N zVn3kBzSGNVH=EoBJ}-a^j6&rV?(*ov49pFe%x{a4kti9?^}kaylTJPxyLT7e$y*nA zqSQ$=sNLx91yeGUN>zVwx@U1xPO92F{;?zo>PL~SK6`d7&?8som6CagmMq;aV z@I1?Q0x9$7*e9w7NqA4vl0+)ivN4k!Oh7*Leg8X&bkZEO_uaC2{Di|NFPr~(z;{{j z?eDW9aQ)smwMEH_Dq@(hMK?wmva@DKzRrx>aEQ&IPkT-@?7lGRu#1Je|JHIe!SH zt+Os(%#?LyF|__MrDzZ>aDzcmFd|!>L`g}>aiYt8^b3#A8;YyXP52ZN0|KR;Bt162 z=ugbfe4>z3<@LtMN#si%oapNE#3yJr4^*dFzW5&-rc$v3uju4~V7i#IaO>0M-(gv%5LK>3G-`$M& zdy%$Fk@!qENxWCm**&?jFi(5aQJ3G3=N=3mX!*X!_yzxCk{!4BcqAL|a`~t+ZIao` zeO~ss_VtUb$Cb_Y&Puaw+Mj$%*3auw%%td+`hT(jRzWWYWhtg>SvR+zdi>u07enNk zRzld^!w*667tUY5dd$pAV>I<++jK>$?w?I03N;@xFP1pJp62wbsZ|Z$aw}80BJ2DP zEh@=s>3i?>6Qj;L-!>@5`nVM+<~`?nQfvE5Z6q$lIA^s(Lk zC0lE6m|T1G{B=_<)`M@iGNr4Wz0Au>LOywu#8ydBe8auZ55M0#+0#nDM_yX`XrVvL zDAk7fr|EAt(wtEr+#PY8VLPuqDY;KFOmJQ^TTX=!7>uUMON5yZGZjTW%+LwKfrT@)>U(ZyTl!ckuhq}6bVMfNr4vvn+o#QE7 z^M`N8jAtL+PJw5=to_Q`o1Rl!XKPiN>X_ZSwx|F8{rkfQnH#c3MobM;`ycje`S5PN z(V$fNMfp4q@$bL*=R)uJ`<^x}((SqLen!9fF@KipX~2eIyE~(5KkGA1Z5&0&&i*-n z`>y5gn&Ye69|s>7uZX(Gdxn{K=!&1DF-;s$li0duulS0rBx!jlSTCf6>SrXKViTPp zRf8|lZnZxwyxzq3#m+77rVmWUuEw>lt?$3;UC60lRr#1zqaZdmnKt8fjJVp3O-xSn@_Ne;kBl7P)QWF3 z%M6jR+bdi#QD)2hpRVrl(VkPc$9kOfEXkSbcE>nvv}|}L;_mJ~KR@4h)zi}x;J>TX zH7i5KZdX(=iTr;an2KheEGRmG=>{rYRtxF-d*OtbO7y+@yE2(O>z5F19$m-lX*?H)jt0vGFE5B?Wfvme+Hju zOT|B)N}Keo_!T7_U3$OYPAI zbmEA{zt4)lKQthK7~Fpzl(qXFbzj0j_P>8nc=O|J$G1}q9G-R&VZJSwFzHg-riHzV zWR(7WTJlVWT<5G8%tcTNj^ETmHrjw;`8jU)~^*J zFEHIbdxC=aH=A-@;%9HW!Zdr{(DAjdRwxd1ET|?lqu}e<~(d7ih`;=x))rw=$z% z(^Y{d*t`S3YzU}kJm_;*_IdM=m6u*t81ch5{B8;Ilc-Q3UcwIgrEuyaM^+Zv%8yV{ zCA5uTZ{0v*VxlEy;N6RxH*MOqy4<~5>O5uQFLnNMaHCn&*gcZO;$ObUrmJXd>Yno3 zKs~0@_Sn8k8YS#BPSgFT>c{(s`C8Ysv<`Xo^z=mN$oP@IQEBB1a+W&zq+y5e!-qCS z{h`6Z`$&9zd|YQoQ_|C;dh(ka&e1!bG$*qu`MrgtMp5*9VecbhR$rH2Z?~Fy)a>-f zM?BnbellWFz;*UG*PeIy-H4id>N*YUw`qy&dtXgZo32x|URHp&_m>i9I}eW)D(>w( zPkgAn14$l-GRHW4a~a8KA+75>mlH@5ZhvgU(G1;HK73vK&0c^0s;a8{4<6Wj$u_*N z?%wg*z~{|^fC2SD;#2F|ni^-&?b)%f`~m`nc0Uz^YV0%mpIo15Y;T_*e?1{3EgdBO zhleX_TKm2siB98PJ@*;H13HhJ_igrVZ`&cZI^ST4=L?swu7v4(%zqM|Ak8*!KK54H z<W!WS`t{{*jB8A8G&|xxeVL?tdEANS&>`Yi6zl4W1X(6U+&fklKytx? zg@j3XKK*;?T-V2sAC=ida*HkQOKmhrm3+t>;imR$X{y0=>u-FiY(w9Zp|(?37&ja( zy&*b6v|kqzxZPzl)K-Vp%Ux#MP1`cG`FVNm-=~?FF_FX@*O<~?6rDGEwXJ-ybHe0i z&jmkHuRO=)18?wM>DDE`r5?VYtQK4O?a$vObKwH%_3v+Pap?UqpSYc{w<6%qrmeeM zT3ZJO2F5$`$=-x=YBx1CJ#(McoNNvIm30?ix%`-X=EpRW7b88d- z2Ak5ER^DUw+x+0gKC?Wa#3gU=r%mOrMh`A*aF zOvLqAex~fth>5I16>-d^y=4o8td-T#PFEdO)s;W1bK;q|zg-X)&x^0rPE@?@R7vyv zh0pg+D_%bHV6Pe*j}y-uE6;6{uIIX{r^IVuzmHG6QFOr1c;Kv(X3&e2qbneena{fE zUJJ%h9_1H|vim;c_N%(fGOKj9BZ_}9YRY6R-}F-y8-t*>KE6o0J(TeH&C&x2z}Yube-zQ4Ug@OarzTdi^T?p@-yQFl6Z6S(Tyg)#<8 zhpCxt+gVsyy&E#6GL#nB7#PkaDETB?c3u{ikx1P`L4H|u6D5-rCq4c1yu4|A66~D= z%v0Ta(nU{4h}QFf43Ld#CW)F);+=F zJlHLB`EuZc2i0C1HU&$(^o~zVj0_LA`c{}TKr3mqy0XlmWVfw!b!9P#cjkhHvEJ{D^Wvcqv-rnBQ(o$D0Zbd^+8m>5F1jyYImC_VO;$v;3z-gD)O#CYfHq=+H4xDKbo#zn0G%ntKL zAB7*~-2C-j+{h^YWvs5=STzNCO0TK9Xeh6|MZQb*Bii#1cB`tTZSnDLStfh*@Zm#~ zkfS^n2?+@qTKO+?bCuN;6cqZ)!}cwEkR7{4*sH0jDdIZY!Zp3c5cdzZ|0xrW@Y=V*>pD-LhTsn-(AV-=qqjFt{Mc+$u_KR@5!zaDkXb7kIC!8w0I zz`;D5OPqm0N7nB>zGb@9?&l}PXrX)yLaKZiS58ijTybtk05d~VcEQtBeb1Y(d8CGh zhSW248vPto4lyw_eQ#iLd&{H8UH0ciL_|ABR>|Z??()9={tVsMY7)UIC#DxU!%5Z7 ze=BzQ`1Y;%>q`75L+$6!pCf7VpC6XFFQU|yFVB9hjZejhDkUCBA!KM5u!pGZc#c0E z$G=6i@A7{%S&LHXRB?B^oX;^C38PO@f)1FPDYHUxn#?kOjf0JGl9lh?F+#}9Z4g!7 zqUR$6v?3`{6yCz2m|8~Xv+V#Sqw3|$&)u$!G$&omr{bLukbB&c)4o17+i0bmbMo`4 z0s$+IGBfw*x9JHxj(&+1zY|V-HWCyq;q@*%6a(;XWWE2$@ zH8eDglzo)CMV9t!`o}i9E^EKW)(ma!0&7}o>SVT*eHbBcb&A`S8q-6~EFvPypP!$% zwzgJOR76Ki^!_tH&!#=|XKjR%2^NXbcNmzMD%;xB=l2ks!-&AqSHsz>aw|(e#a93H z2HcIff$x+rvyE#_it$KY_PMm3f?QTXA;a~t%r#|eN~WqolyS;HT46`~p{Dl@4OvZh zwuL;DE&UPSI>-2<(!28gd&1IA<$B>q6ig0QuO5jj1w1|hC%bmtubn2?m5&A-JZ17Rl#@})@6t+O;^)Q?2?@*yA*YG1 z<;CvRBYXG8o{3XCFDw)Pi9dWQB3`iQde1on1A~AgBEUlJ-hfu|H{fr*ST@kXijZmnc=QO;!RN{vmKV~A?(b|#y={3 z%F4=WDQ)s?C|cSI3@9{qHRhT&$T`_O6Z2g0VR@GQ@@12HSS)u@Q4u{oeXU((-s)zp z+*G^Pz2~Gd($lSKgV~a>_T2tlCuGQ>Y)MH;b>5Lk{l=V0TEpl_wWXrAHdQ*{h}iOU zkmGY(o)q;c6?ZWTa;{@lgOmLqB_$=Nel{E+-%5Nvc=6)J-MgfCXY5vHR{HnCqJqQ1 zELUyr9KChUHT--6{T|ZoysxY~hX)1{mxK4*b9~%V%6B_nu;#;uK|)&Cy?gf@duB%3 z_}Z_#yRTKZm6a9rmStdq5Q1e}W7a;^M6mdGw2s=Y-}M%8X)&oHso?m4w99qc~DoTJ20M zG_=2)=J$Kqb{{!&b9upmo15EMb@6HqX7DzOt4Ygr`6%W2Hr;xfnTIg@A0IXM;L&U5Jo=m*Z)>e{t;@7~RHa`TGjYefeWU-3(;;`6+~)NIC<;7g5h(qi*{l*T8F za4CrwV=~X27tf7Tn)=oAPF7Ynl6DOP+`TlFZPxgr)OGIDGm*uC`lq!V&+tj#3te{QarO`>!amDN4jQ zsU|nQk5`KF-ge`PAI`J1v@}FhKIEQShL)hPu&b-9Wz|>9t{cHeQ(Dd?9Bm9%-$Bu@ zLFyBzWJ2Q;5YYY7SRRN2?LydLIR4CjIgiyG2|MP?rwL2WQUC~doep2+zf$Q9Ojq^( z{qpjJ=bjxqgdB#0ZCzig9AKL4X6aMgK`hi`QWAeOn$B2#eWf6KUWGjiw@Yb;OmSC? zti;`h%=$MmE7M7sQU0heZJD|?H8stN3Y3A&@}aC#OT)jlPi#-Wf8x|Bd3pJ%+1cH@ zc7XA$Up}_wJoLRUG$`pE`Aloc?a)1N4T6A3%j-o!^6_h%F2Acc>PJtN2o4 z>PE((pZdroJd{lk3b`$ztjC5yd+769>6y`?g9lL_D*$!tqJ`(uvdS#lGNWJS6S0Z% zt{Bt4IUKE|m-@B);%t4CpxszUK28q+X`nZ49*{jSY^6h6;0ru0p6KR7)JHq zdGKU>Q(Xpex}jeKI=S=_%g;xv<1rfnXYe}~C5Ep>R1llozHc6L-ok1Abf zZ1OCvw9nl`q7AIP;!ko_9nc=CCWIm%XJm}s-$irU>dU2+5`Y!K)rGO`MIpE2hksHs z%hJ5VV_JYfiQLCKqjvp#n0 z*oz4wpxsD9e0hm8-rBtOj^vKiMzZyHTl`7)ufN-QX#4T?chtNT8td;)m@#FqzcctO zW3XZE?VH%Z|HBWYj!;cgBjlL4xVYHc=P3$rA|d%qx^^gDZQ`-dPM!VFr|Na97z+XP zA}TssvXVe>Xo{Cb+s=430GN}Wo{nX4>_Yf2Fax%GD9mZ^9QXxEHqS2ySbyo1u_%Zdl}|6s6t2uf7i|45OqEC z=EV90z)9U=`-SPD#1SE!VBAT9(^ibkCI6Q%U!qNVOgBnz*swuRoB1g5_1!RJ51pu$ zg#|mqovnKuot)Hn(9+V5jgDTpZ~+YIMR4C>*;o8}@!EC1*&7iNF*DTsv!1{E`0?XA z^D+`%J}IRj=jSgle0SgHaI^C&el~J%!Cu@`>SWYs6y)-mR&9o+6y>BZU%nKNCe%gX zE`N@COuS1cE^%>j(Rutaw6@OlMqRmo?;i89W39zuN_2P-tsp&dLKu)@IhYz6-dI_h zw52aK$nJ^lf-6PluIS|bLnWP zshzfHNw(lvTv*t$b?X5tDm3wY>rSn{f(KNyC@S&sOroM5;Kre$p<|KR#EbCvCeA!B z`j-U-bH9E;TX;uYaWVc+LPGL!L!Y02pr$&voZxR+o}y zEk3E2bLLqPhL`8MJy)0K_{Ih^-x2S@JH(pSUjKh4eugTzSJ@&-ufg~zCxhC!U43*Z zXH+T2wG6E$?|z|c-@bg@m3m4+KeIZUH*`|kCjQ{k6a0_+YSx#c8`X=%9TN5W6@L9R z7hp-Nw!Jg#_dJ9~#dKN~|H_j`{CipL-=DT|USQ`>{zR?ioNz8gDN6a?LVp=rtaMPkjCHPbm{N*xS_HylLacD_5^BFE699 z<>uzjbTY30#FA8kTG~wK)@7PAH-CXK#KpzUbdss?&8IA+x}XdVTh`w!0#-j8Pppz`}rv+Qenmmf6{oqMR?^-$?8o06Ws zJ|mo7Z|~GtL3e8hKj5Bwx&8W4w!|CG#}uC+%%zC5biQ^XvZ}45q$q`EVGr)!jZaAM zrxPp7%i{&7&Z$0I2Tv?*L zc*fA!m>|%({>xt0)Mgt;ARFtu{eF*I!oExF-${y=jLe6Z#vic+Mw(*F%U20$>SC)) zcE&TPmJm27Sro07GSOA>ioJYrkTab_J=1Nfp5Jp}h{egtX>1aA2O1vnXWu>8!_CP# zGdao5#x@V76jZLo!ok+|rT5`8H?NPhW`I5b+vz^oO}k~!k>d=;#>NoJR%hDu)ibn= zK~r63hDX}6OpT1}2R}bI6zLn+Z}B}Up0SPM-~Q0u%aTkbep_pZS7s;A3O*knsH>x+ z`0PxIt_So^Ztg6iDx9X4p(MwpQ}{VczZ__fs0H=+_nVlQghU?Vx7Lx9^L^=tIsf_d zXON+g(9qonPcm_FWr9`i8fWq>UONOi)4%;ud{lAmrdr(Cemw3?43~xE)8KnGTSJrFZ1_&zo!V&23=zJ2?4%~BT!aq(Mn34n%~nVAZ1T=f+HfH^jH z_DE6p1uQI-z~1q3(Q6%fsE+PH{6vu%oUjb46^6JaA^LwpIp(@^CCn$*Ar3BfIx9Q- zI%X~a0C^y)sgSVn#J8d;$T&bh6oF7z(Eqy&Z@jCiNf~g2F7hv=(?r^7P5;kGc;CDC zKKXK7aK9tUp-p#Jb+vR2#4eyN$v!v%DSWq7_4OqOqJ3&Dzn!KTZ4VjSD)Fk#i91#N zFB&{MIyRCoQ;didb)SFH}B`DKyky}>tNPvAtx{II5&42SCQS% zM`c3I6l)LxSCSk9Ql(#HD;e~Ts9Ek2TZ(PBFf@GrFh`5?;NQ{nTG+m02Rke4pP1G8 z7-*Pvb#)Maz_RLFA-Kb*sjRN{oFS+Kw7HC$=KgbXu^z<^BeO$EF^Tc<(gZf_=AnG7qx>FkX5G?Wule_t*`ZRGVHDcOV{>O?3>Lh_3yI#G`Le*@R0 zdec6fad+C_b>x@%wn4XlvH%5p)+eH0RRn8U^#W8 zfI_04q5{A!=WJmy{9mEGx#RXddz>5{MIA@Olai7`LR2+0!o7`5Ohloh;pFpQz8r4N z_!`M)8C)C2t^e%wwMf7a=ssy_Bk{69@Q7(BC|;sG-M+mM&_XE%z0twx_Jo`34~g-H zNCIV%Sozf0_D)*GfWL!Y)ptRq%j?7J!uVz_u3q0a;o;Q!`rRn>bZ2g6qsqK`^@`z1 zXz0MtpG4UJ<$E6$RfbNHE&3I)1HsQp9}S6#LGwIJL$f&Dd@(FII7-CT5ja=(wWI&T zhjtDQ%a|dk+aZz4i5DOzwHMyFiqdLpYy0T1ppur>0xU%IC!*AlVq%f{?%T&Vv(cNH z3Yc#;Ob&hbn5;@jsdi$z+0fM4GrfkTaRbbr9dRAyF*P+MAA&}Owi;Z4ZVn%59s-S= zg*i?SwFLr2XP$YG()0LuBj^)Qe``|%0s=})m&;dXxM9c{tFpl?7lr{TP3OK3YG|<8 zeh@2A7GCL=XnMr}mc^32kISw($6U5CKCF6Dvsg4)?;r4K#s)ah5G6>tZ(saD>i&TN z@Y(DJu~i-AYM35hziMluWzKiQIfY2V+RkweRo#7I+8Ir$ElVE_aQ@hk2j6`Gk(H`b zSI?C%Ra=%y^R|tK{IhU5rQu$JO9dNh9{Tj@Q-O77Q#w#qE8v%M`HL47@82hMv?4_$ z6>wy^Roi9;FcBO84nXn9{JW@<8$I?$?wSc7snbe==PwY zrl#J%KQui2%b#eE!XSPw1=;S^pEktm0q`VW{Mzt5luZ_~FAprvE%6 z&uv)oB>e2~qYWy2=nW%>K|tV7LYSVC8c`eTULl^q*{eL6rd1pKUkqe>;=Ukpffsz9 zhrYfLWVH&cb>G!%OaQq8)T7V6tEhljX8-%gd%#DOJKZujX9$bXc|3}seP<+BzJ1kpC44PPE3i|irIjz=X;0b;5{TsR4ZrDakfR9g#%AdMZ4Wr%VF8q6I(@wT{rz9RevRsVnvE<{75DJX z8y-o1lGyfBg`}b%!dEk&|87(hg z+`ow=@4}X_H^s2FL4Ft*8P(G@ZuEU1$C*Oo8yqw&$V>ZL7@*2Z!A z_6DD`&E9@~>5){8L*%=xcc&x7^sUs@X>oQe=$HaUASRBHsVUKdgeR{B{4BwQ7boYn zr9Z!6^MZB-h|Fr}MyjR}_?FoJMSn_*wHzn}h)crj2;dgY-gdq2(m(a;fm>P*#@>*W zl2W6sjB7p|`quxA#n)FE-hPMpEO9{aC^$Tb&y zvxE6(LyYGS9~LaLLrL9hr#SE^Dmdp02M_ALLzWmMC)`N&*C`nF;ZoZ}r7kmC`4%CV zC`y87&Xnj?OLiXA**F4{ejpI!#!?PTwWZA66*P?e^1m59|IVS(|3?nh^7bI{_$0#* ziqZ_SaY7XNU%q}7TO7@eBtReo$(|c*Jm1}EwX)NC_i-_?a&ktg<2r@Jhyx^ks91BT zCS9%*BF3a@>n;iu0qB63BXFL0FmzevD;>490D>$mEDzzB-S4_TG?yDb$i`|rS zReFqqTr=B1JZNr&f04V(uHe*IW9ymU)i2&8rI#<}Pm68tU%A+_VjvWE^*UoVTuZpw zCZD2;fXxAThyvNySJ$-j%mTd;VzQo}?8mthOQ&Szw{K^#v_M^Wc~vB!OKgPOuxS%! zI6F}sfGMGqYvSLO4g(5qT0w!6nb{x!UvyNIVw6DR^YdFvqgjY&&uD7q6m;!u2!EB5dlX<>$4E` zo#nh6;uIB%HsfauO|M@KIdqTyS;)VO z?Qm}~gFBe9>Nwchl|m7Qu=F?{3u^`>fuD#3)|n*x#dW(yvQXdh+BF(nI~&K)DP>Nq`UW;}o4ul9b%7Z+PtC?F;#Mt+dr z`ddv93nc|bFsT|!Ga@ONXCdvr&s>Jt;2Dm&qsu~G>g(-o&OV<;7=HZtF-Xn{LBaO! z?$yAH3CDcI_A@U}fBo?6cGFf*!Dz95*%8bL2bW8w|4@ZU8n7#UeSKri1SR08MPLtx z7iwulX9OIQt(}AX_w+Pz)br=~`1odKXRW{7zyP8Dpd1DQ?a`mV&$~oAeC!w7NLN5a z^)pUZR(Ata>n1;GgM;7x5nBU3bam+ky`Uf`BYXJc#})D-C?zlx!7=hV)U|-MGG@zW zln_Px{$>N@0lBzh`@RR-# zK;wD#>{&`mO5_s&U}$|gC4XHib*Q0x#jgbL#S#a4CYV%~UTtByplbCydU-<;=* ze8qrd?)4L*F3nvR#7+zh&!j-8ywXv(K>@Ztyk) zTAP{%1i4j}8P@rp!Yy&3vq8>!6?S%Z`SQeQ{lc_)y~U+VpD`OQDJe}t5;tvpAqi5W zAS-+MG@yq{hq^YBwI~C5@(c_NJIKh=I@>;eOpA>*KwldesGq9wQt(;la=e?j4Dpg^ zijnO2J7$|CTlaX~{ws3aRM{DJM{(USisg6f!09tpOI|4`#RyvbX^8!Br14ZeCP&QN-0=%G#z}rqJNJ@QjQ>r$CWEDyhqXc zOG=W$H3YmG_T_RmIN1@v*wPx}&3`v(p_b zwc{xTB_(7GYjg8#J^sJ-6rWb>zon@7)lh{m+B6u(J#NDsY7D&{y>KPsY*&O zO&gAkmCDJ>_xARdmXu&&p;q#v3L?%@ucFCk^FD690>yS|weVYzZ25??hcJ<*T8au< zX_;-muXnQKa(|dUeDcWfrO>%w|G5lhwtPoRj&Yl;0kro00Hq1qw8jwEIiSoyMrjK* z+|H+XMMvv~W!&8Nw``ad`MI1;C@n2LCdtgOfB*jX@82`nUfh9nB7Qqrx2OpK=vw|9 zRUl$-MBfkzzfTRsS2?0IxQnYZS)R*CH$@7eHzOq6;qUzcKzaBjRlq;%fm1#A@TGRG zQFwdo3i{w`8Ig0u$>a@y-P%(QrhJs4<4*SE)YJqbewwOJlri=W?Y`3MI*iw+gEM>g zkoYUMwULG-qx~r>EAufUP1vz1C6%3%v$NE-ASvnR?{3$D2vex>&(&7D`vx(aTaQn4 z-Dyyt!kovAu~CqzvId`m(glbwlitGT)Y-m}`_el)$ypj}8|> zHBr}dX6ELeK*9vIDgC*JoLns+Krwu7Im)Y?fH}AmqNr)!UvIoC}qEre`0JlsGZ8X=U9`aG@^A(W# zjy!WpYHE!XqT>Tyw6^me1B|91_@0j+pTH3tL>G@AJ7&^TaWAr#IBotBVo!+jti3vz zI|?RzWG)e3k4+p<=J-Yz13Z`FI^w>xx0_$IWM)8lNA$S=or~&}8ZY(VQjvF~UyeSe5+UZl??@NZseQ z;b*;eADsEcOD#bTxYGIn9|VDK+ysT)MMl3 z;(|nM50?wQh4%1asYi#QXto!!tT_;zJMQ=y2vod#7abi<_sRhg2iQq`EttY8B05=m zr54vV_*a~jHh5oEWpQ5|;zNsZ7|`E%d+tx{#-_zKZGd!+Yn&V$G^b21fE{1B04Jy( z4G>EWS}Ncm<~ww?$5Byku!vCtB_t$Ju5}BqzwPKK4s6(g5jkP7GeW%HdvD$a%meV+ zNCF092(guxy69`BrcOgm2}eX+22-3ky>A`MhW675F~nu;BpM_9eeVyiC(5+>ZeclQ zLZU#Q1VCpEdF?p1fY3SX{Bd$*ZEg_dXCpXPp35WpcrT1TUnNKc{;@oRLhjd(`A(Bs zoVy!qj7%vZm`#~C4IxoEB21B&FoM9V(3RD_PlrY`|MRDQjpjLtww>eq&-tS^q!28| zp1gR$uxC%ehD}?7Lqgb?F+~v1ASMsUDT5+E8UHVByG?IJG}e(})Og-_!w%j)J|X(>J%=!&m@TT){s1t5;6}{KR;!XtL$KdZh^4 z=)(t%oGbUdAve?`42JUl_U+sJ)8Qc@2|Kf!2LBcO{eKyKp0rWK=!n-bV#D{|w}1bZ z&71K-KT+$EuLCzhNzZf+gOI$LY`;}ki68^R3&XAM)B9uVzgyGi<>$Nihp68N)xCCY z86Hw~Rn_i8yo24VD^37v67hiKNQxnrivI8G<3p4zke?rJ8bzG;ne)KGF$yqvq|{bVmC@5gvin;yyh0eFyv&U1we((~itAnizP7ycIoQjId9s4DqjqD9X3+O6wKE=*% z0kJVLkzgbV9|{A4EL3<@)ab-Sx7Rxn7qaA9Sg*UNPkcvNw*+27Kn@+$8B-Kiz@I-i z74AKLyccT-(>p0K5td)+qXt$L(Ccqh$x12E$!zWHfbkyD3aeEQ6{L!~A3b^UC71A8 z8YhKUE51|GG%TFJln?`Wx9`01CCVBLcMzH3P z^-Sj&vVM^iA#!}sUYT7WHVah;PA=z>9BGBcSW{<^PZxL~b!N06BG-mwfy74I~1p2c#ggfVxyoERx)p zFZ1L-#fYs|QeM>1)Z{bKU(+kRZn5Dj@42{I(~*WeFQKEOliHe>n=1@w5TqqZ;VC$3 zm)BL|D2GCQVlOR*oKXVL_t>=*wKV;kJ)7<9rqFG0JTMLH7i&$>^z>ZCn)X6#o@ysdwtLaIdzLw z+7HptxB_QkKS*U`Bae_!F+ej!PW5L@$#<_3CFgb8E&xjyhFk3;0EJPkBfo>E@MXrm zps_c4tJ*s{u$g9Lgcsu!d%$JBta|K>RJ>%V2IsKRQ)a!l#ksFu>6N+7L*_(xC$=U; z5kffB)r9Z7z5;s?XD=%+k9lRGv1PbX`z$k*s6!$y_8`7SMtv3c$o3o-IDz(?Rkn}{ z{Ka59{;h~8Ft03(fV3PS$GHA0JxHFCoV;x(@r77>8d3TZIC0`SDxh30J`TmDtE&qf z7STW0z(O~E+?_N!kHOA6?ACpr(m-dYfti(+74R~#+fPiyJb8lmxyVdKIvwOSyJTTu zfmjz})A*oGyB7vI&wf4M?7u((XtjU8+E^m^1uQhPFncW2UrcUU^ZtGb>q}0)$kSQx>)%Pv#!$c7 zLX!WNRV`Fz^L=kz_ie?jMp9MNFcQN`$~>McZXt41hYodw>sH3C<*RTNzn-Eju^c<* z`vGzSwkOSW(k`uoi{V?Y(Ih1GUxAgNUH1O`85R~chqj53P5#%J`g~EI80~V8c|5R=-nh5U8q$Z!oXxz)zz-f&cMv;l*740I>kASYso%$FyhgxNP;Ns zHO~^w_}A}-$p8J=7ZQ{4Vrqw~jiCrPhQx&=c4Y7*+B z|G7e|)!)4YFB5jjF974o$tEr_T$oe0J3mSjWLUfa@sXgI*I!*|!vsi9xe61{!Xj03 zO+2}5(UnSO*rof^J@WVa1noIFjqp0ner|GLmv59-}pNVX)$#>N&FYUH}~ zR_!9capOjcR`aJ%-D_X8pSb2E8GeKG$02?}x^Ua&1q2=y@!FkxSIYzU884g#``e~5x4=Dm%R2evHxRBCz=WiGxJz?x&9(6k#>9! zBZ77k62E8u{tAfFBbI#fhy5Vsbt1A1*q5-E@{8LR!hzBq4u*RpHr|R zZ{EB)`1(LHoi#lv?#WKFpu|mQ>;I+d6v-Vs#>}jmab5Q0dg<)^_63(+|M{b#tqns8+Dlp418c9v zMT)8W(=|72V))}5mfd|6u1l1z(b2Q=)i>#=MNI;>#NPOKftahO$nHM`Vinfo$GB;McG@ zJUsK7ItN%5020mBQFnI)^WVO6N0PX+35~$d*Edqkvn*xEM({Bxjv2eFi_0@n_u_Hs z|CS?=h+k8bpqyNkK;+U1F%oR>i9VJ+p01r?l(lczRnqB4>*F^TpHNm|tOW)JHX@}& zH28?&Kc@iP)5uK&RT~eHz55(VQr>rHkc(cG+aiAfX?>knRuMimHg*ioE-pmK)!_g; z}QQR+g69S-ZpkJ##(%`}YuG#Hk!YA5r>N;CGoD zcZZ_klCQ5%CD_Iurc<6u>`ZnBKHl&{ku|IX`o&b~Myw9e`{}>o*GugnD$tJdV(3{J zLez*ksP{U#!+m{B3~iaq`Y%l1cx~ufO>mzuq)mvAC%VxHlnx`oh^ZxfyA&+WlD7>mWdm6kF=qLrk8b{StwBuIWV> z;;4;~!Om6ZiBihIr)cf4T7*LMUmDfG`G(l4!mbJ>KVb)m3PeXo>>0?( z`8_kU3@1Be^2d)KL^Q6VVn5N<`Sz_L<|cFuf0rYeGM}lAeA!CE$5D7%X+FZiA;m;v&#Tq3U9M zuj3gI_;^H*>BKyiFnb^$q1)mVuEIW}prn~H^hd)-TI??NqK&CaO7yK8?dFJ{U?|e8 z*Y%V-v=o$U?6`gs6x53dfRW+UKVnK$a4^v*L^iJjTPTy0lP!p`Y^k0!8CxL|FB6WF zc#Me;B`6hkNEEV#q5K(}o2TePb8#uJL|GGsr2~+yC?}^?WSd~JWv+PJ|D1+1ZbqRb z@;4a&xRU^YNN&Oq9oX5&PWJkuw+%iyzoh5CBhJx4u?ys2H z=cDyxiHP}5H_3AoGjiBg44ucHkO686;R|R(P2|VBoe&66GZ2=7!k}7!P4yh`_0f=t zj13(eJLbZX;D)5*?LApi_c!;A>j9;~07GKGmTrd?V0LAv+_|Z%KW#6}&sXy4<)%+4 zZulGkNoW)}9D)uIYd0%*1G39a%G<74Sq;<_gOXqqU=p%ym6dRIv-KWe7tvRYZRC?D zKag=ktP(QE^w?MRb|V{`3Dj^51~yoEU^66`CNK^lj#*svks~i~<*SRHs~2T|x72<7 zNF<#8jm+eM-rn2P)!Pt7G(WJPiV9F=C-sTg^z;jCh$ivz@E{%*=WTW|NR5D%j>N2# zANBL};^N|kKYvEQ7F?77|M=F~3BUcNtmfx*!1l8TsE^GKMz&uQC%NQ=ZL!383tKJz zuvVT~BesnwD=7sltP7XAeM8uM@v^Y+55kw*;c$%pspZJRMqVgZsn?_=B%tnCs3GN# zfC|E0<%{F50bGEJ&ehOEM_nGX@m%bAK!;2|lsruEgo9FXhqYeUqngE_3p8FVH%_fq z-UgX>5l)7M8g_m*6T_wu&HcNQpe4HiwNI4J=_MS0lArHz?%X*ksVbPG5=_YTfO7yj z?Ag6LGru0rJ2EpCVbd@pu^#3ox(@{6F57hE4T1SWum>c9c7nKzXWTPN%yy4z*84tz z#&^UGskJD-hwY?Jhe-%?`ye^_^W)`6-lKH6FOC(UX6`w1=8HFNYI3qhw!vF`_~P`C zvcvyLkRvV%yN=Fw26FN6N(CBkB8g>AmfkpmopOhS9n)VPrlX_VzuyrGAfiXuMb3Za z0SXy#J`|)QYV>RSsGW$wAteQ6+H*9gdblYa+dg_S&w^=EQH4Bxs*QpIc7Ze+AwfZv z3N6#29osBowc_RP9zWu>1-0JpJ%?pBB>glKNqd({mkSl1Bdwgs8j#P=eznQceLahZ zSX@p}LU;=vZE}ta#34#NZi0?ZAKT6S{3!zQk$_fg9E{AFx0@;4?@)N*_^J z!6pq9_f{_OyjOAw*wkZl-G*S{aAyu0^4a`P68*cpt+FQcu%YXD%^xe3=sjv}=7slv zH(l5)Fp|1YXEEb(R2Xqb`g+_%O+?B7)Ri?i5PNfxikU&Wf*3G>XGD|6kBBE1unqvn zJ5LM%GZT}5fWTo97nPKtr%#deY(nvZ%8M;sLa)A|O{AwEAA5psCHA|L(*IAN1m*=^ zgXcsjG=TE46A-?Z&%=k!bvdhOZ1ym9b6lEH#d^z4k-dYDLY#lpC(cT=Sj@n|GO)IW zxW6BXQfwYUB)B*alA$LmEivS%S?V~Z<>In{%1V>=6Nfor@vV3p_Bo~DmIJ_?K6UD; zn5PFg6rY{S7+N?a9e)Ciwzl>}wpqYJw>ksN}sdI+(zmxq6ct)3ywJ$yj;mTh>)ku*b4<8Y@Lsn5y507ku9;~AiRVF+mL)`NW%@IgnNF{(Y^qjCOGXn}OQPM{q<4~4- zxw3{vvgSC}OhS|ynkuSOu(7gobEK)NldWw>kzEp((01ZPSUC5h_VX`a>diJbHhcE$ zA&(Gscfo2TZkvr$G(eWIy}5Y`bqhjTZrS1sj+w%H*OeUhbL%a^NjmSeOtfMSc|FxI z6xfmJui{~%tDCCX>Xbwh7lsfhXz|{m?lmVlK9%Z|o1JOjpRDL-0zK=p{e%2Cr4(WY z5Pc2=m5mvI1-%V1Y_vawTt$i7@FoE<@OXf(B0E!g`Hyf_SB5TnB9@-q!GXU&n30nv zK2`_zS^2_nnu23xqIv+i29jkRX^;)NJy)0UL2#+NzLXNxoFm)$b2e_dCoXHIQyoAT zgWx7mtDA?$@Jz9TnVA`o6?S3=$G*(o-cVjN6!4Zml+*R&y44G6(%Rbka6f12t9*pN zgxAy<;{N_Bi2hKb=ihFn1GOEvvqzMg&!UC6kps<&gO9jJ3c&;zdV0n7=4i%f*^7AY z4f_oHdQfIn%ysSvouvEto~4LRrpIJqr02YJ3N@+dMG*8?{)YlWPCyVvuGVqh{gzVUkBw!YdeU+xwbSvfj+cwRVp z(9!g?@Y9Is_WGa8lLQl%*SX!%w5RcPkrPw>(h0MTAL{Ex5Q;!{*A+d8s4o*yx^fYfxpxDm}Ll8tX_E|8u@g;mD=(m6Sk_}eq=_(2ym5gHAs z0^Dq8*o_jr;EbuMsc2l?O9TAk;`KZ-y1Jd9A}ZS2uCNjySE3W%F{Ea2!8UlLCnFFP zI&wr&0*y&QPOby{A`uMqF+=VP-o^LX6CO){fGm(!iWYSj;^Db0z<%fLS&7Uzr8@)* z%+-15BZ#eHB4j15J=P!xE7U?PYoaFn++ZpY5Q;k1h>`^_@j7BDR|?s&UCW;I_(u=8 zFlfWQwhRo=lc&8lY`QyV=ne4EZv%b59Id~wFueODgb-p#0Z)7a^gOLIn0Y zwz!7rkq5pt2p6t(vpYVCP0;hv@{lQ#K$Cj%tTLeOEwh!*W<+x(~2Wc8rK36 zch-eXTfTf+D2%- za8h`9nEzKK3Z6mL#y|tQ5yd}b?R1e?Yqzq72#p;YL{VoY$MJQib%C8e(Pj2rnTp}R z*1?PFj?2-(l)tt02&Vt9>ngslp%#I14i66(PVy)s&!MHI_1(eFMtv4HZE@hK4VU(- z3n`7nv;4zY_iEE;-(xwqJ1(ZStjs?s`4lB<`hcBRh-3_Ys>5(gjn!!~ewZL}fPhQ& zTNYBDKfe_t>oha0%HZqo-#>8z_1l`N0`;3Hf}x9`VU1(2Rihc=3oHq@9|1&hW6Lcg z1Ex6|EnmwsKWxi}Tgz60=Lr$x*LYGFT(={Fws*g>x=j&JP-t7m z!aYWTO(f?oC9utzGj@@OoY;8^`AtkbVi@>aD8L5R=MBuoC3lT0KtbUUNjsMY;{ss1 zHQww0ocTx)-6j44fIZUAQRIv_X!yx-fbQ@?1`UR*3>cytCkawS`nV?~TeHFQq1 zRXVV(nbZmf&qYYey#zL$y@AC-)P%9ofhBUO>*U@Y?mhPoSbr;g>!2!z zrx;;>BumO}86X}2R!FrlT>4NvKymOwauVhYTKp%~VKm@-hT(9Oh`Cn;2jpaAh+7cx z=!2s|sY%aVYK=}7J=)Q6Udk)qbdcvqVB;fiXch}h?0tg zgn~#(DhWDLAaX|OCf5(3mGoboR}*Lg z;5ZmN7N&U|2wvErZVr5HJ%Pj|37P=be#Y#%;?huA+ z$mrqI7|+2SQH@-vtAorHbw2gd1^D>jOOsMloy#@KZF7E1^RQ(teIKNC`imIIvA3?2 zel5@)cuOY=rC$E`B~q&4ZnKnN2Sz04g*6+fYTz<1@7r#^!w;W6-Nf%GhS&mN@9FsT zxhIe+{YObawkqIP8p{g=$q0&L%wH9F7;FPy+;&h(6>SAOsX9q@b9B z1sxkpQZp$n41DH$aFGKn)rgHmk&^lEFa)nl>7th<5vpE0BChJCbF<@Jbw{b#hBX}@ z^6;EM`h?oDa2P?309GR#&}#tXnNOk6-y_?>ij^Sm7Mh#uR+Quw>b@d~ zdFd~){e+DN!wu(Un9F>t5#pN=CQ7w}hM`NGkv#eocyF)Ig!hj=W$}Fm7faOV2S=rB zZW4HnQBWgO*pLwXOIEOAgt_v<_Q(26{g8t!B>pm&^Py)EwDVaI-*W^1^$)@;zxnvn ze}IJo2az=-I1Xv3mHIYy_3KN?>JM%oGM^)o)sd94M>8HAZJ3{-+6)I+3_dV$&!jgJ zBP~!bFZIe@&+b{nLVT;gyNFo+4BHSIs&fhp69K*k0SrvzhiN#86dbhS)e!u7#9J`V z`}Xg=yLRL@V4Qg%KoCDQqXoYPgxzYu-#J9Ex%;W~1lJ44_-;kHnx3;tFB`!NU{5H% z`K#%^i(Xre2=`#LLLdZa?tlAB7m2iDr}yMZEDdak`Ts;e#gtaw!j3m45B5ixf>azi z4X%N5x-6(6kfWi|qyAQf_Z%D?Y(%NRPKWEyiO9$Ry-457M*R@+O`_U_Azd-zO70WF z51!YsLjSn+4Pp>4hxsEwllaY8LQ!!Ln$nW&e_f*yO%H*{23!~v1~w~w3()gBUaapo zbpIcb<);33YQ_dHGjenP0ZRwaeQbl6H=HDx7HU^uT%n5L2T^6-pcJ*uq`kAUb2h| zcF!Rm@3C9qBi-#lAw>URJv-;Aetb{w?Xg|$xK4;^C-1@#~WEc z0NzXV#S7@HUqN}hY!SiIaAQvR$(B>G+sH&@hlAknd3bPrqki%o&rwks1)&=+yM9>Z zMW6VSqoPSO49pv>4FAp)VU zJ*aaC@I4JkfhD#5j-hkuqw9|{iA=~xh9A$wKcWDTk^Zy>a4xl`F zbs5#X14zrl(vnOxi+jy3bREKpR>kY*4MGzRy;eLbke~IVEDoV=3nb-~ZW#X8l8xY= zWj4N#*n&k1)t1s5G9+NchDuR!~=W@zbLBq*u2k(Mv$#8I}ZkVy) zo`;j;CMju0hO#j9XK{jvEk2&?(YNaL^6}fBX6ss<8>UgT1;UL(tmV?OG&$n*k2X~{ z8s_cwRridQGi_OA)9rg8FjfHCNUKx1N&D z6DN=;i{Ho`1gs{AQb1Z5ChZ(N(z?1eB_TZpVJUFmE|5&U0h-x}4QizRFmgzDUPGs2 z<3m6qm^ze{m4V{|tGU$bY6k!^_V@QeS$GQWThKQa?kob=J4d^|{!DOZ?dDDR#)#(| zxF*lk^Mg=LUw;7-(LV?4j<9qfO?eE?oS?w)#a)9`h%K%YoJ!t9-U`)GVq6>#Se$LB zGb-h`c67u&waOec>FnrO8!gGAdY7Xqyq^feCc8L*?74gHBmzQrT#ihx8R$e zE9BPb4f3M>DO2x$T3kk4M8w3>djIM)dLSS0Gz5b1bMI(K%4>_m4QDW z`VKez0QQ8HclME36Rtg1&T^wfuPqclC8%}G`lw}wuLSt|vc`2bJ~Swa(TN8B(2?(D zq<*ans!O?)fT6|dhVmFBYbgiqS%^e1jJ7VAkt<88gh%kyUz}}%)c-+##p-nZ1r&ea zx^)hPZ#D}DRVwU9$fVaG_?<>VCl!?JH-HfU?FnFDpc>lJ6A=1zgPw_r&;sPQKLIy} z)0Bt;m_fwR6^0gTw1!((u8I_%p3(4cMZH5qV8YpgYP!#h+AZ>d)CXo)?yVqX%|>iH zoFMi41CtIE9wl4s6f{0U9odPw43AaQdD?W)7f&Y9ycaG9Es} zfBatHc2m>R0Lin0Y>c26P(29mb>K|~E=wRXMA>!%@&FLH(%X3$9fItNkUQ39KB@O* z!KAkaXjg9BxikdHHl@RI3W&42;y8=o*9}UZa&jI5+XT_B-s5sCsC)pFguY#rnjgA> zFevP`p~gj}eW`HD*KRdlN40n5X2X0zk`p;!R`*&TfS@3*CX@^9#0#h?b|_UnckF8qx+ zRo96WTf2w)r=Xhw(VETH9}^{;aNMp#R_}>wO}<_6$1x zQ&1FnGSL|CC2O|S7A3^YleWi~aipB6*)PuCg?Z(73)C>fGhUO%OW~cC@tcq|-(jo> zG2v$le}{k8*ywuq`r;cjHv#d$J6k6@@`;*nxp>~u_Aw%YJy5eESTBp8X|)`leh+5l z(p+9%)R1dZ+@Id;hdMt(9h#|{&=7Ke^I^o@w|5n_scwd@ez&w$FL8fegBY)4`4;61ARqh`)QnXj6~Yg9WjLYsrig0XDk~ z{CMQ`^{?(F{kvIq$)T^W{!aQlKW>_#hAX}~A)GNGTrPB7nm>x`*=T>aR@VcmR=xmy zTMU-J`+LmPkcK!??lK}N#PMDBOiQ}MwmWI+++h^sJlxbHu_)p2K1V!Sjq)}rg)#1s z^}WaXer~4={(T=N`frz6Ub^vb&m-)`H(F8#&T1b#-R9+&4PHL7QN&sFTv|60PD82^ zjLu(0w!V7V+piw>nbZk!NvQ-vILdI=ZZxrerj*emrg z%JE~74i8=L_F5L%PfnRh7d0vVeGelA22-jyV)yV|!|;KI0Y&QEnUw;u5x55kKko-{ z!~hG*S%2J#(ojMjtOeE`YC$ivdh(ziM)OpVx6u zyjyOlQpN4t2c%N>JqgRp7#M8ShrfC{&-4`yj0d~KtWO;nF?O$uOYtklO=K%DSVj=N z%yE7pMlP9wQ|w{NUV5?jeGL7Qq}`<UvYb=AbH=^c0uL7f6p1(XLDAh;DOOzrg?Fi_cm zfqcRGTfxj&gz0U2l&}_%hf(S=8APxWa>@L|{a6PBg^6OEaye5&@+JhuSN)M&~&o?s-q?A^(@~&#mkXB#+4Bk`)n{_83xVH)7-Dw43#UAiyTHxdd$(1?(Rvj!6 z=$L^-g&T^<;Z4Z&Dj+Wh@nQY>ei4*57oY@CR8|Iy4gxu0;Vbyy0dEEr5K1o3VGhOl zDZCw#t1&7bHQWnE(_bl25xWHo3&}kol0WcFo}pcV{ifpEot&x47lq;?@mNY6J`|EU z>*DMw#Ai$N`>FGpF4ZP8=yfSIh&6aG;wecnF%(eBN>!}F1i-@*urlKV1I^CR1wE|I z@)dN!!g?%~jt?PW5QE-iAOkAnK#BmxBs6s0OZE2lMnSAPw>Q)$h)<HL zCQStcpH*4nFGvijoCorQFBKZvvK-PhGoq23-UAKRR>2F>5BI)?O00^!@1>n~C2-mb z+(2WZ1JZ#m6_REuEL_~_iZ{S7_CoRO-KxjRce>RC$&{pw%o{5KKy=B$=liV$=;?ss zU0Yl8F#-${o`LWkQXhB(z)+zEa68igFlX=lJyQ|kbHrBpdLg9hGgOgj3gJ1L)VTxm z^0k8#$H^BCC)4;jo-2z|A?#(c7Bo@kGRi%48W<{&TH8ZUU|49V%W;R6r8@so`}NLXTLAkJ>KOy*$pmB*C7F>q_+FeJr|N#A37#th zwfNA$0Jwt@L&~|Ym*npU&hj!8AW4kniSZdkB&6_#K{AvqfSbhXaQ*_KmIrs?>robI~8D>vOrc<>ZvnRCC5OUJRV1qX={V<&BPq+L!)cCYOHL?@Q z?cdqItqr(hX9CY5OgKsbFD`ER#{!B&z@k6lQfewFl)nCfgM0W?uQeFzU91W)N;7~$ z0uYn-8zgW;*ocBl&@S(YxD(H7hF{eS2_a-=CB6s{NN-KBquro z8c41)-ux{-pYvS>6Q36u2bW!h?Jh-j8mNOb0Hs6&=N{l$hE{5rI{0^5??V$jAeB&f z+5>sydNhk6W6J|6KaiXts|c-81(ykwv7jd|1MlCJYK)owjmMH%eBnFxrI^XerZ;~$O^D-EZpL|_Zq^$qi+sig@8lJ{}l>L;5j@W)?J)C zZq&dQ5CAkE;!Ij5c+Lm3bqpLH`KdV-0GGm3M0Pcy7V9_4KGuC`Djzj#aqeg^ztcR*&n zOW1P!$qECX!s<-xLly-rH2R*%4YYiS7N%R0^uJa$Geb!3= zY}$`Jxh{3t8G&(!8xHmVYmmL3cRA04MHrNVxf@9g7>hN*y6*oy&MTNVo~hw}8wFq_ zz3%_BEW&OADHW!+Jokua`@e8Wre&1X&|RBLzre(8Q3I6eF!MN!Ouk-zoXk7D*q?Vop- z(<042o{VAW)v7$Q6ek&bxb zvEwv~qtp%`%5r~(p6EuXg-I(~nyy(Z#w?&$p?^YLLR`94id|m@0n2Ub*R`tCKe~$R z-`jlkI30KzEpa`N%IB$HJmT)>i^O~XPX{Z|Va#i4$g ztx83aVPF0vRUw3{sb~&?T)r#Of(0LlcGMSX7_K#N(kg{}=AlLQ9?`N=h=BswtsgjD zKPW}!(wk0YYv&Y=oosSVupMp_*S*=L9-Ms{w#Z}gU@(eqi^RB%W{^>Q6|-hVWu6#A zKF?OUxYBrL@VwAaZQJiYZZemGHmZzu6Fsd^bDulmkU`q8sYR3=CzpgukKHpCX?X9) z6)hg(AaBinfsf#I$6^Y`SbKj-P!O5>(#y3Km=|l??B{9y^aTuY+yl>sNG}SM?tZ+r zw4>X})yqv%&_1f5v5V7@^uEEbok`X=t{t`ror1PIuL_usve~i9pL)JD;aL{`f28QF zM~-D4O6G~_t43_}hVo@4H)D4mU}E%R^lXxS+e}84aDqVkusP zZ%=F0o`rG9SgabAG8l%jyQtPy_k@c+n_Kz-np5thdAh+9vD_yiT3;XR zjxlRqmtR9G!>XK#K(W2twTuC6YsKyPO$iw^gy7w0f0>#(w{IO7gfVWJ3RsHU z{?wJ2g+lJxn(X*w7&Bsv7X!HcUmxA8{mac-YIT^8KB^|@i5$4XDMFhZus+BPg)@|{ z12=EK)9RpMzg?HTG?Dtre=-fJ{_9@OQbY}9)tt2zi>rWHd;fJDL%Oa#rwV$}O_Ofz za0fZ@ZQb^iPbl~tS1%ElKZb^1!7lskYicPs=A~;GVQ=vS4dKR76E12n zfu5jULmrBj*ed7V;!8I5{ktsj(HfIcUde(^U&MpzU%C-bITJDn|?*kc?&_2hWr`%2GFFq>LZ2Vy6 z-j~_Xu1s#s&(z#Q_@Z!Ck)4WZ+)x8Yg#CZy*qK=`@*{~Dbm{IdY#O*jGuy}(u zb+2Rj=sJR&{7>>_(OlOmg~uTiXD=tUEaXBJw5&KgXZW%zuxP6=w07%OlEZ<9sl?Tz zbY+z|73P{NxrAwKgNKIn;*Lh52U+5xVbMKP%tq}t#8#-ng=JNXF!DssH?D4ReRD9Q z!ez-wD?{BWhs0zErt13typW1W5^LkfnS5n=4i$}qO^OG7FgOPj&|gx0eiO|*nTb@Kou**k{1r3}n zgsz$fj=ClrMt5W4ZJD&w`j}76uDx?h5=8BNbFP>>Tn)D_9Fc1D+mnJ5KgYrxU1$D| zuJ@UE!PRUSAhIE5z$F}O3{T-w<#TnoJr{qY-I!ZDQ*hpybAz*>buf}h2031f`AOLG z3FpbS9~&Nm_rriB1W+tw?hO9Nuw(`lQjvT^gNSj(goQj{Le<7nj7W%{^<|DP9r}_; zyVT(+6*eqVge)mqz5&RFp*;~yZNN~h<8=^UIk4#kqVVIHsQIqkFe)Mi`o3H3op&=B z5(#rYgvM>;BwS^Q^<6DOgy?D(t_uS?1;DGqAjMU$2)96?JT4*Y3zNh9Q75UvD{fjs zZX&{^P=!J#JG8!8a)KhFj2zHVdui)(ZPB!sa-mA}(ZtUpsLqB(FzzdErz_BePgvu2 z4nJGs9>CId!Iv=-S)F-c`DuCmZZEtK^@2cARM)HKxL3}3n6<0-<& zqvk}HXV?lQRS00wT8 zT=g8NV7k=-<{2RNLXm1SGul+`ot+6F4FJY6GBI&u(Oq~CXaJCrTCNb`gEm?UoW|(r zysm$?s9ERuq*M9koz@m7B)UGZHjpjiu?lL(JURKI8%zSdciTFp_0WZoMCz8F3{BFpl5wd^~u@hLey`6Bx)qFDj32GiHP)?0dIgmHA#p&&U2D!ahd-i+h{2`M=on z@8H*vm3{B-YW8g5BLJJ!n4!qPDI23-_pe{KwZbKwymmM;q`kcNcmv1cEs;9>C$S_y zr*h8~4U?^I+Dy!>m5e=#`MQS4fuoFa&tE7hMzPuXb?5UkfdaO)Ota8_S2bLqGQLvp z_y5pxVQ^ovR(4;|1Vt^hdVsI>{%+ER6Rfg-FhC;j7KqWHb&bFRe4O-D%R%^rdRCw> z5vUhHC0tZg1h!D~p!=t|bt|)r5m20|Hp%|lm|CX;Yb24PuY#Hl8?r?fDI%6ya{Bzn zi(c^u5O#8MJT#ep(y4vPP;jK*)AF)KmbJco^!U%CG!SjqoRgUxBx}V|KbAROw~r>vxaj4e$n8S+dg&;;kHR+ zaLo1%sV>-cD;z8L>vG&i>>V+5q=g4{?@XJY_RGN>r{(%W^;YqT9`(;OQ4lKB0z?)6 zf5L^VB6PY;5N0HtGJpFA2ta9m2lzk$1cn?%MMPpc4Q6kZjQ(ViM71SRTJRFKc zp%GXViYGoNT5gJ}s#V~J0L$x0d4H5WKvhU&q@UoPckVlTQM@4R)PL-ayo&e4e1;7k&y2RK$dYD3?KC zP_JQQ+gyA@wL*YH7wArbb_U>X1bBF8CIyhRU_k;MAsgdWTR6`luUvCeJWQOC*+If5 zloa}l>WyS+DsGFjJ!$9HxXT#)d@CIzwscRaCKapYnTv4P0gA1A4pHZ~?FsPxM{%ep zr=_Aq=D>GCx0(ZJ_lELSn-t~#mH2N!HTIv&{3LI%H?#@v?(Cqvrz{u5VWq~$qa3-Q zq(Azz06gELw)KY@3Sl-mClctWv+tNG_&F~=6ts%6IW9{NB;ndyqHuA50n%gBpzW5O zg9EE#;@uDOTYedx7?%H)>?kJFS|ni9!;-Ni{iUM9N+{4psY=&(bJXE0kvB7WgwxK@-oi0ft z{_d3C+1_Ipx>qx0pSA58=B=#Wn7^WNaK*fBoN)&zzxeZh(1pR*IR>g$>Tz#PC|)v9 zhGF|DskNE6pFKYI(u9Ym%q=kC9J3Z>{LB9jXdqMP6h!c3y7=+~L5q9pnB)`LlODoAjGcBKFCAc;#=+z(M zx_e3WZLYQ6-+4gK@nv8?cVn*T6MvIFCN0*vNHAGAu{J-*sWjcd)(YHAT;JuzDU3x;j0eXB}5UzPXF_LV0pH|nZre))LU?kbyw@mu=}oasWE}IG=Wc_&$pGWHg>paF63d}bM2=Va=KkXu z;~1ko=mu+ismG+ZOOD~VZdng@&0n^?@Hjy7-yOW=dr{4|o;rUJ-zOHtP(`WAzsB2$ zoB#KUBb;5v5}uPmYjMAtc6++7-~Cp(`1@c7DfI&FuWmCrJ+Ma^Y4OCyBqy7@bY|Yl zhv38RB@xeuIfA}%oj(q1|H~sL&2Y`CvA$Y|wzv^npM+!#ev>wc#mRcrH=k2B2*sqN z3YTlxwd(@PXQbFa`Y9gn`WN1A9qQ|5lv#ULCLww>ep@i^m6h%5Bo)+^8wsC74(`!S zIQFziTV*@cv(VdY-iRHlYqzr_6X*?C$WqoVL2YrNw-;qg)U9fI+$Ef z;EVEp=(viT5TJN(+qouRQ=QfD^AfHyv(C2eQ0^M<{e;6^69N*KOL%g_hC{C$9iCnk z#a+9;S-omEhI7s7FE>54wVfn%e3MjXG62aF#X}QJ&5)a3UK8_+j$3gHgatZi5q*xq zae<`Fb1$+YE zI44Qv-B71#3QYwk`zejd=?$=Hra272buCRdD5k0zG%tGWs*q%*ZStG)=+L|MxTFzQ zg{G5SWlPb?`(yk~7j|D<9<^EnMs-8{M-N42E5~i)@4o=FEth)C>>;5GLXG8t;g@IOWOBcT0DYaPioZ^TLI3 z!_t2>1=5NbSnbN2(I|&fmH1?Ya-*{{X^@+kTpO^yNz#tI*iKnx@BVP-;lK{X;8HWs zL!m|P?&XPy=~GG1hCh$BGRHk@>YIkj3J1SEd?>nC*M0Tw{N4|SjVLzq^Dpg`7u&wR zxZO`^nBkeruNZ=^zD3or)}li)`Z+uulZ9TUbj%M%hT6-BBL-|?v=(;<4K^97L}XGA zm23LMH_iqhu_8?_Fv|rQPa{e`_hfdgmRZu3`D~1yEuGG6Y+^dn-ND|!?^w9G-EW+l zAbn^}LK@<4E0^dm-%#uG3yrTZJQWv*wqOtOOOhcT<> z$~H^qbsEZ^a&Kz}ill&RuP&KbUr#p)V#ugmF{T;w6E~?*2x6#T(^#nXrM$Is*(i*q zL-zjg41dO4Q=pQ-iFNds)c5zQ43i4GpJulvPQI-TrcJ#x`!wql|D%aM2_ zv0^|oQJt4|mwReXSS#Z+(hDnVM7(foJ7&VD+os|b^^f&1)8_+;m7f!qvQEOf_=v`9|}ViLvF{%*;RhiUn!ta}sN zbL{Sf=bC)Y3(LV#nT!a7x10jY7inwK_J$NL%C|Kk!+Ce|=83=Q6O)|or!4HY=bqOH z#6RIIJdxK`T{?N(Rr8B-PUOA_^PXzKd625 zd^?O_kX&y3G_{Re?64ZLV-^PP#H32)zml%z&QcBdSI3HqUm^6D8b(7T zyV~~zliyY{QG=$Y%(#nQv(^H*VD9WdbWg>fW*yj2JI2Nnn=B2mo z8BftKAH_8qtShK-}D_k;(V-umL|#@+@M)P3(<(IHBsZLBNMoRU-yg-Kl>Y6WKE5 zh~|qADmq-xC0r3LwB5BqC_c@&%)XXLdT0O9V;rhqs|AfhtII>jRtKRH)VIvpT$Q_o zaUZdmFfb;OjFa8IR<8~x&5McMdsm;}$0R)_!A9!K{)Q#?DlXFz8QvSKGMefd4?aaZ zc*7jg*SS`4T$+cb%uFfG2D`(2&V_~VUG)C=gStJUYgXf!ahGEb5i;uZ z&|Son?~iLfX%0!Fbq=w9O z_G=w9#b3%p8KIl_sjEo%SrU6-F0GLDR$D>66ysU=#Rp28Zq;&0mj041OT)ti%VG0* z9JHhgOMz#rn%o^j*A6DME6$Zwdj=k4O5i!Bi51 zOxT?$dQ9gpaa1%|$zjVUQ)&24%`!x0+j}`MW8h|))4ghf&En`rrhf8+hc=GWNnzTr z+f+(6dM%hOY^uA@dh>o0ZJZz5aYWBG?MNFOSY8wfdeIB%L`Gd2YLk>#br(6hv({#{ zt<}nnQ~qjqVB{F9&>{tMvsl5R_T%HGsglTWuja$E#S>9OF~aFfTX@>f#`(Dw%lS8d z*ey=W+dHa?NzVPbC%}5+q2%*VL`P1qpcc6;z9CIWk@q7Vjb6lq!6b%gIaYByLTT~c zbjTdzx$K10-W=Cht&zp|4Y?c-)emH4#50!>o29P5{6CZAozDqH;!fYov|)%eg~tlx z3kg%-G{*~x_n|oDmiJGl`cyRaYjNY_ZMEE_-$($=LXwUDFz}BWmpr)7|9jb+!nHJF zq_Wxfyi9%Mxo1HMn~TlQFyg*FSHr5iKb7Pftsk?dJToguSka|U{f^y|X}3AcOnc1O z#}oNz-jgVGDAzZ(SZo59{?VtI&DS05$^x!5KaJ>8Sze&nNVLwXVU z4%_p?AX%gS%10eaPMWPhk9M=CqDC_pOZ(oP{b`*dz0u^z)qdmj#l7-|slDOFR65a* zHo`#yW9Rrk^dAT}E2$-HP#WZK&1;9w&|xOE420urSvJPTAO6&QQ+zgewd&_x>$Sc7RNe0seKH?Tw67MCp&4hh{G)DHhMl=O4?M-l#k}McMrNY zcy`r%Kl9!&njq8bJh72N_4w@tlspR$qB}y4VkKL4DVWf())y`VJ`2DuJwP{y7kzL5ZbitscL2#1F!KA z2(=UV`FLkW?w^@Y9j(+J%(5zCBV*)FHh(Xkb6?9U-4hTx}Q&WMj}*XN$zXCURMEErgoJ%axp?hrD=Rs6v(6HAk!J z%N!za_6@IP0?Nj@Hk#mmZuyD%=AKcjDv6M|agOSw8amd(#mtp%d;1H=)bhuAR`n9N zcI><+B?Zmm!ug}$(Vfi75_qB~TGIE&!{lEJteNFA+#w;LJf{@an^YRxdq*^?f~D(0 z>5rqjFtIDr`p5RE)`-YM_mBO~aCG644VDeJC|AXPM6sOw(P~^Z$DW0(j+@z)0p&M& zDwv%2cV+nZES!1guywM1#+rjWt7oyIQdBA;LMM-V?%X(d zdiguPP;+s_>*v*H2lZwKR{cpGm1u=CKVExga@pxrEO1P_ujoaGu}oPed3xMlHA|*l zV(b57fqoLUtKK#=Ror6ZL3b#aHSxp8NdHz;X6@uzeA#!6!d2gHzp6ZkZod@Zg?yUo z=9g}abx6c-eA6u3@$%zI93pYty(LdzH-cUJ+=DXeXH<>WiP_FffLTI<3IpZKh7!k4 z*H7&jik)KG59cZ$y=^=UH?M0!&MBi06K5QZIJSnlGN*jcD@<&$(Z*%m=^gxD*5UEp$Gfg_ zMvtC3pSM+$y3U{5R5HI*kcs;eEPn zFQosXAVVa?t_%-`n{h;~MHKcHA@lk=QlshAsp$`L=^f<;@2461NmSQH55Iho^2#MsCdvHXRpFmUC}lN*wKV^+ z;Bz^f{F}3t;{~s@{!yw8ul$H}y@w|Rlo&TQTn5?E=1NG_3rCI5$uF1+<-!SvHa<^W zBfv!-tK)lTn|4E0-25}do3cZ9Q` zwZ+d0UiUkq-7pS#_#7)~reE-|Wc|aX(F-MJzLlF-eO|;bO;3s5bZ$R78Mo}rN$Vg} zl!|!mQ8aljn%Wzoei$8Ccc}fms(TglKhNXpWf)M?a_D9_%onYq;#QGL$)D$rGWpjrG@BHg`^+KGQ-S&K5y90vbeowB_+N@2eRcWcA9*h5CYj zQ_;qZ(5FLsnJjZs_OtrKN2HtIS0uOJTUdf#SkF4YVlS|ZDS zm2j->(H1^Yv2!B2sWPV4M~&XE>6tZU2~W>p4jl*}bcA!PHn8m``q<6fdEw^4o}R9oAVL&|5${Pm8(SF!TN z@P_RsnR|J2aiS;U*L<+k`S<Td(YoR`=x}kAk zWTFOtamAq0uNjMjY=`p{ySb{EuZ3my!qh*PC*MAjFDOwk6woK%r{!$*vW;Dn7g^;y ze!Nz&PGWxv#Bt_|?a5gJNvC7;UmYD{d?jlWyW&pAA72bO$ok5eC~5FiI1Zn;HMw1L z5BHG9sBQWvy!3}-LgP-?M^S=Wtn{zfb6@y7#(N)?E4`A*vv6h=4VR`OJ>v>&-5&IQ zK;=m4>eo+n1)2P5&Dbi9hX`w_p7-{}?w|N!-rtA!enx!obEWqyV!BJE-WFkc=gziH z_f71AiE6spO+$zYul#6S5=jo#D*c+iV@LVuqhOSx(XpJIvQ8^!HM$=y+&P9fo+z=( zHKgiub@4uGyGP|{yeoq5`tjSDH$d*=0v`FycRoJs_M|W^pe?ajA5&PB6H&?27E&<4 zw0mdTS;v~CwX2t%8T)h~bOok5V9l>>wpUUtGc3eBoKsZt4io!XS$pIgoLEBrlX3R# z{LU_JhWuuYq4VwHIj^KjmsPm{`f`^9jjTEJ7Sj03&(3did6UqjR+o#v*-PzwCoU4g z1Zns|rV#D8R?!!yuGY{qJt;!Iwd6=bvnKt_Jh@Wx+x1B-uRpR_82$XJ*I9RS#|#ah zJ-GNXx{dAt~Fe*B!;!9>J4lrcT?ehq(pg;u(p7wNnGpqo*-e5=hzyze(>9M(HbUxg%)O0y?wICd{uBo$@M9bC(n$^Frv6hAj>sGS_6nV_ z&3?K@1ImHDYIy6DXZb0qS(&+X<7G)hp<_XeVFGh$G<^J88Rc$U3383iY!g-itF>tf ziv-d~imMCXq15{Inc1|$VrC5ICce6<-5K5t8rQ}fgqh9mw(+^wvA9^P?@=;+h!eG) zb5zwzx4zX?j>oR6HVNcYbC0+ANs|pRKPQ`C57T|fS*N+*((K1RiD8@PV)1i0$4;EX zZQvp9WqSVpJKGLx!&nAFt^Rv27=n>3*}u@}cS|?D>#W4@4ZB{rtsT_(9AuoTGGv>S z1k@(x5GuT*SwmirKPI-Iecoa|T&YV|@A5F#^ps)R*w5YAdRNr`UY!IcKIq`6MGUTA zWN$p3C1sFoIBFvX==6Skr%w7Gd_K;h{JfXG6P+!$@>Q$fhjsQ=*4gWI@0%se#HKWK ziDxMb>tU9A@lF;!UbC#hdi-j1RWY9 zSTCHNn>+lEHiQB6VB&`|MogtR#5p6M4(1I^g5Ew{7u z<~miXnq6C+fdvJooY$+keH)+a6j=Ezl=|mxUUl{ko!a?)x^JoFHM+j?Q)VJ*>x5!?lO* z_yM1iVh`ysF?_tujig-E6Ss%@N6!2h%u9K<5>^iOG&jq6OOlly&sSg^5z$prhD3}y z&JmPbuHCLYmTTR^GH$KZW+uFIRo&e5kpSUDf?A&m9IL~k6nnquc#NP$(_U{X;Ud;< zseY_335N?^(eg6A7B;~csv+;fc^_$Velll^ee4=Ed6T-Wy8f5^DdfYJP7B<*Aiqo< zr#q;^eiq?%6lybzW@!GM;7@Z=bQee2#DdZMk13I|SVOG2q~YtV>3yD4O3E&Qgt6G+5fx?=*O4T% z@>f=Kel5BS48p?sA{I|078~3-FKd(juJ{^ct8{)Hqvt+U<83qV9cV53k_def!NT_*W~(50g@Y%lkz_K9eHa*kYAP6k=v+VEB3`H><{0lD!N z#oZ>dp#mDnKp-&1;V6fA?i+cqNa(#u>?55&?H8RDu=$WQuFlyjm~yrJdzYaJq^|q9 zbQBJpDVa>Z-dFdZ(D^^IQczK~a}B&lMfE9K`bF9cpvFdIxKPWJy)UA+I}ieng*SY-mz^BRSNc@pYtcDfd-Zb3XWH+@{l zMAQBZ<>45dQ z6J-9;*4NM!Ty*y64+;Lf4V--JMbyP*=Pti>2GA_ukvET52AQV4!lh6w*?8LFwfX4| z`72%hlP&VuJ<7C{snegXp&_%}kE$38kVFzT1og`LKgu}DBfVSYbjU|v^9lUOJ+8q% z_#O~NId=T^b!0yM%U>2}eqeB#1>1y3z)vSGpTZTV?c%HM$oKsgh{5A$a!Z|aap!9K zCr8yC3R2`cq+|m#yu3q;pDn8U_LQpTObDK~_78W3#?kMZTfQRJ!o9KwjfwW@PYJcV z@Iu~j54=QI4IetIy;sU^8q-DOi_#6cZFlVOwL5kzs(S-LO%7_TBB^F4Qo z^VwmQ@tmHSa;_x<_yyhRRubN^lP(jv@Ay@P|Ltqp>5+r(P%CT_?+ljLBKsvW1CvMh zA4{$-7wDvR@E^^#%(v-Xl9e$zb*Ox>DpVoH5R-OiDVt- zx}%Pxoc*Uom_eca3<8OC`VX1sBNuZfhBck4u`U9x2M*%&uBT%3=Y*L$mUoa;eUUL! zdvy9`_tFg61-xG7H9p{`&Tv zhJyOHH3#B$_Pj+>eEHfW-a(@(S7Z>$Pls|x+SB{GQ~o@ubhISTQnvW4+ z)qT|$WT9gOow?zYC0^qTpgCPq)QdL}Fpe94bK#16$|X(R{|+nH-m>Ig&Pf(ot%S8U za$H1=FK0~t6qGoLs$+>n_iLBbVxZ;$fH!~Vd{CHaI3-L)*TbXn7T@!|2X=VnJ9LdZmq9Loy5Hb>9W7-mmAg z`B{*Eez@;9@AHqMEGjhFokBL8sY&~Fsy=zphkd;Y`;O-#Egr)zH86)}Hbi z4mFDTNX5`VhITviGI9c-&Ol;I5$G9ZNkc^pG%$~%NuR|Fh3oiEt0OD6Su2l8&)a|B zd`Q^h7yD8Ldw;zceWcr#L_Pd{@4Vb~ck@GhYt5KqmU`GlhUnpcSW{`dJ6E^ENqMMl z`{mh5X=%!xsBquuy~{yuvq4?B?DP6v{<^b4-O#xGhV71Qe+}yf*{7$!7;g}G^Gs~o zqCxzEl+d*&?B^|ac=9DitBx!sPK*ALuidp^v#slB{ka!cXTBx*O}n+>Xq*-09ZZY9 zy)w+xbo1sv;}@L!Laqg$Zy{ust29j~ji0s5h<)YYCUtJRyR(_tHaR=O$?UHq!uG?g zvKM%`YG_tOo;BZ)9&q_|XmVwEsinEx7D{96%g#z zWIEWKWlcNXs&u7^Z5`h$#~iky6wyad+g~mpG~gSmnJxKI&S5k8e5_aAEMlkMzTO>e ze;79Gb+TzvXgD#G>vNHby|}32RyZ**{!DVWh@)c#Iorn5&?I|O^1wNBzF0ABqSx!$ ze)PxfzKiPWo*NxKw=z|}9?Ik*5ZKmHxBx~>LC$&i_M1-fo{oD?sc0wIelk^)bX3|z zN>ATt0v{@<^LrDt0e%W!t1ClB3j)clEG+3i-d%c#yXzesx_QHz!dcFJhCUJ3Zwf_5 z`SJTmXgRY@j0ru6FcbVW`f^}CPN{ZUsL=dr$6WT$3%;x<`buVI{&|3*X-vqjtXyd6 z`Ql14W5oLHQ5Z}My)oSq>hI^?O4FDuXQbP01cpysM5M8` zHFb{_H4|!Stfr7o4GxY_J8Wl{lV0GHDfHwnM2( z9*j&>1K&Ii8v%6FCKeXC9i+M4IS-Gl;Vba_!UW@z<;Q4p1XF`=muJwso;^!!dXDl^ zXXV)OJ%Jr8lP_5*HPzSxc3PjB&*3z>{NWgL*TPemu3@c{pK>P3I@{KX0WPCZ>!jf} z#rc{NCdRgj8)e?NMCD5IpnRW=M+-jYWK}nO{C2}X<(GFprwbmMD?;@_n?qU7 zhVD zS!-J&rC9(KhDTRGz!v)#sr>6akX68F187~q!}gzFl$sn<$_o~T=K~RM(@08AV|AHCXj3cckkf z&w@xQ5dF3Qf!5Vx*I@hhOkmb^CYi2@AcO$wnKI~{@7|pVv;uT|M41%)kf(ce_Z%<* zKt2P1d|AnF<{BslO7q<|D!)Ipf}y*Co>LtK>2ISqx(U%TX(gMdTx}U3erKbQZc(6a zX2#9*W4zrC<*KL^=27lkdPHjX=6e~0AZlc=Ysvzo#fE`aJic>!tvd%lqviE03kGV` zS0Z?njuz|Gj8kAzj83yZ6IS~BDmETIDdR_2kvLGdB{=*#ZSCE3y7P3>@}UQ$_O@4T zk>DlTCmcBH_3)CLRNJ#%TQb@%o@kfeR=>+*o4|$pDzn++9dsHZWu&-E75`*Om53D2 zFAcq&zjLv`&E);>ueIj@cg%E2pZgMd5A)Q|4IRic6E8ZyMGY% z&yEG5e8hQ$U=m@VKz&+JJKi!cJu^*_NZ_6)5@fwR=<(?zLqf(u6^)G41y$i>r^D0> zO9@M94QJ=6v9|O`ZaIoQ5V`jc*7?A-T9kPRm6?cx1atk7H`4p6akSA){bBRfGR); z4h^MnH;uAQ1&;W-QP3EJk`4en!AR8n`21dlg&L^5xagfA{=2p*CN?$&Kys~}mC*+9 zMm|7^Gx>DbVmd`CasU1R2(->6X`4dooPxu`+~XyJmb6X#SEi~+W10X*xw-8lgn56) zpoEFxkeV9oJE`8I2}dT^T1S?9IB&mwb?PnC({QSx=Kk$j2mNdaC8c@u<1GMX*~;m`{-NkhAB@X9-dm0Ag;k(u_r+rz&8sB*~{Nq>o}F5l?GlnK)upp z?r}W-4|*ZvRZ-**ox^U+dM52IYr8joM zIdtY)2R9})O21gp-ME#VT^0&!r2iF)Prm2u?dAD(z`D>B(6Nnl?7LX+PywR$uDKa7 zKo5FjnmlNL3G^DmLPB=1?TA!zs_GCeD(;xQy2=sB%1j8K-%l6f2kRDmK9_xb2K{tg zR}6M5#zzOPoiGn=dvvo!_UxG{>^c)2XOeA12nA-oZ5uDuK;C{TG=~OYbo`&jjRsw7 znR2<3V;?7caI0+#t6W)DP*O54C&eiw#S%`)d5sj*3Vd)X0z(FM_o2n}yj1s>X&#}= zkxvIgUgF>YuY#|yZ{2BN345pYldiD-v;Ntru%sk@j*A29JU1GU;##9 zaf^we2m|k8kSbpo3`6ECyi;6K()g}0-zAW>KnJA2^=x~zoim|s&fD_#$7EMW5KTah z-w~fC(pc02mkMAuV2<}aIJEIQQ$_=Az`5aCKSgSMtV)=^Xf45#4Q(2&b3VR3Ii%4> zM&6!@*L$ws;2w-tnivukJSHgQ>3;tea}h7u!N+p<(FH7Z)7U_sp2H~uSq458PBonF zwQi4U>}dl==?~05QsH))d;IVrMK(h2kU&$s`zlAP>pJHMFe99{6#548W;qs>DG3R* zs=b?QO6{u6svIH!?)I5-lbqQ19j>2e1VQ=f;Dt zMG3&r5Y%zPBz0rhz~Er$>st|@4-%$q??KLs>Y9c;MQvJPo8IzEC4G#DjARS|>TTQh z?G#NhR9}=%JnD7X)%4$Br4V1us*MN7-T>pbhVJyi$c33LGb2OmfZTINwChv3rO&SE z8s}b=Vh@g_>xt;yq*2{6PoxVu1AH7P@BRp6(gCPnORJ0st=WUXj7^4R6tq_GCf)m(moPoxHeNskquHIk$r zJQ!A7w}FlTW#%5BltD0=f_oB!G62eChEP(0r7pGdCN&knBWlG-FjrQ9x`1&mn2~(b zXhMtNTGEz`=P(09kr!t7{^&68wF$|1cb&nbuol`$ae~$eQ!~^fNhDIh#tZtNpRLUy zNSFZrC?Hu1e^9mM7&#*h2fxL74?9KSW^PVD03egWsbh+nrV&i!GElWcScH~mY8VLs z)u?yz@u~T05@f&HnWp6rOAVG~AX?~#F$UohVD`oOMdYIeNB*Avkz%aJ;8%b$ zhsw~%C^V7}qB|f4CnqLqmC3=g!MvY?hxUQf%*xFzX0h2$QxhcmyK|eEbs+Q50a4N z4x(Euc!7!9g5SCKE^6GTe^F^i&;QU76C-@!uwbiSyqLda#KcTM{A%J5b=ifGFp{FR zffj#xMFmfacUgXa-$YPgQF;l2Y==YgUYiXB(5A2WSwf3Tbhlj_%tupM)%)@bV!V=z=nwr)!aM0fv(Ouj+%&X@w6<8Ysv+xg~5iz>_ z`x*fp&8*KY@>@o!jofSN>XsJ2q+(oPxd4`|nZEu$kQu)eg?>zFK6eE$RLpw}JLG9B zksQLju4k}ULV|(7Kg@}P1W{C+1P}@*?!bb^C}pk1)_;P}I@V z(lZ;#-9#H8_=C7QNK;c&LlfgZ-KXSj1zHc_RdkP1*1J<>$$=UE`^RJ)lzZq9$PfV{ z4Ru>N*tIP#Y=w&VnvF~-o3OI~))&`6FbU4aVg>=$J{ZDE*!RJEkD%!w$7cP*`F5Zp zSy??W+$#quG#Up>{tB>DuyUt3ZvWIn7*^*+%e#d(0A7yYBm#*nz(`A&-=8xKEGR`4 z2`bd)T}nz7Si%8Z6r0j_CnjdS>LtO@B*KX~HOyX7EQEhTc(8w1gN2pFhO&M8_6>$` zkT}Ud=E=eQYH709`H1?Ze8j32W}5+56GmEZB+o#(fsxkM+L|u_gGb2kKYs_i&*S6X;BT$Do`EE8 z?(bj0x)N(SSI@G?BcK{_g&#?86Hckz@Ab`$030uG05Z9_23`Ovh6Co1ZaEcX>lSAr z6D1jMy9f1`qZH@i!vst^1a{u886bG6ft0;5$8~@+9H^}8=9)NZzaF~&Th~kfCJo^? zhw(nJbTP`FQmnCsUIhcTlE=i|O@R%xgdjPp`(wAZC5P|{5#m|8+<(p4Qx*&Pk!y`f znMUF+-?7KA^6b=$`EQ>T0HdK~d~vtKI;)0B!^y!?`Nqbz#+>S_fRILR|9*Fz7!;8a zGO!pQ!h^Jrp>j9}V>ma%0fMafMJkzl;-LTHVmVZy_#@`DC0dP$R3Vb+?w>q2OL|y%$jDw1AcyzNfAuHo9V7 zCD}^L^KUJyz5ijI;WxbIWsvpE$?w}o)(-@c^r!%M*7;XwtCr`}W9CeGn8Q9;`u|`Z z2j?oW?oaGeIu}h4e}tymx>=5co3WCG*_z*QKg5Rr~Jtte!&-z~9zz1V+V zK$emKZ*Ogj%DhPRKYokkQ>AXUxgVa+i|yY1wxQwt$mmwQSE2mco0f{L{u|{u@ZWna zH34%KR6XeDy5$kDq|mYm8lF7)VcPSn7z|LDHL&)yv9Wk`!D#~~#y|C}Dp6e*B(2x%ug0Zo2?&;!|$+_XghOfXp0Z%MEzgX#3Ue3vX#IrZw zCJ3?+MAMPiXOuX|IDp$=*}1v>;IM&?M8JA`z?HP$j{%LBrct-nh~iJPv(cg614TAC zG$ej02c?9|n30q}x3{ZsB{CGIH$^RS)ERlWIJvy2J2hY>{2HQ%hO@$vZ+%JIw& z|G9ej$&b-0z(O%9FIWyU)2v^Qd3Lww!X(3T(Sx$-b+^!tF`Y$@L`tJ@4QyXMeK;vn zjc~35)WW{~c|TR^!EOcy7vs^?Ko6D62D6pPYo^%kACvFv#Rc%89n9CxLCs0ED}xX) z!N~dvs-}^VDMhA5V(4->V&8gh0E{E|%Q)fgALKcO^?z4=_Uel-{(W&6P|Bpcccp9_ z?*id#yc}Hf;#@~(X9TD8(fpnsmZ&*eNL`{66CDaoajyd_{h(5t6>k$OG(Tp0PtSP( z$#HqxpWW=gnQ|mptN$JepeT;PrHnoY3ize5W;!b z-tLYlE~FcN{kOuhv9GuVG786y7iNq%fNA%O_WXH+#TTCg?ON9&^Fe3ds{C8KyeOVt zDKnWQBYx`naA8#jx#zQQ)WY}5VGr^CrP2_Q?bE+ws{aD3am0t(V22@TN zgtwWNW^xWaqdcWG;ym-^N%GFlkdZ`(+ntTl9qe{7j!*ZRigp>=B%RE8Qhz?%%-~SU i3(7OuF`}DSwumhcpZrzPWJkFxr*&9IJx9&*`u_p8FGzp@ literal 0 HcmV?d00001 diff --git a/images/consensus/2023-Q2-beacon-graph.png b/images/consensus/2023-Q2-beacon-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..32c77ec19f44af23c396ac680b8d6b8688659cd4 GIT binary patch literal 164771 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

    nv-a^PggtrpWV?y_yU)mEZ&-%(Q)bv6yV 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 literal 0 HcmV?d00001 diff --git a/assets/images/2023-Q2-beacon-graph-ded65e814bfe6d927faa1c5c66bbbfad.png b/assets/images/2023-Q2-beacon-graph-ded65e814bfe6d927faa1c5c66bbbfad.png new file mode 100644 index 0000000000000000000000000000000000000000..32c77ec19f44af23c396ac680b8d6b8688659cd4 GIT binary patch literal 164771 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

    fuNH?pZY)^U%-7L8I#$NWQMGgb`2c zGu=S~7W*_z;>Y((^&-E}-?t2rnwg)c@qX(%+1Da=4))H1!Eb}v7fcwhgK38SLa&nv zNOlKm*9Gj^uLwqh9b6IxEKgf%pw9gxT}0qWb8!S!&Xx^;-&wp>u*=d#j|sJ-ZHpW6 zLViOCBoc*|HV4cG1zqkx2w#f(&RRt{RNnyhlRkPemv;_T?TF9Q#Alo{WGg$k_T~hvbX+c_ zMAvxH+(Hpi+DDLz7LNyFIs@hG7sIUx&} z$U}WJxd%~X^qkb9xefxaUObf6S=5Y@*D#yPGvGKK9@D)0cFv3CD5(1_el4K8X}4VW zhXZ*+GswFvfC@YU2W()m*&SPJclM7JC?JXZF&aH2sd&XZ@CFt#U8Z000Su$d!!D<) zyyk?}!3(pJ@wJ`mZ2vtFT6aK1M6?Av5cUOR!RrFS7tzD~*MR(D|0~sLtnd#AGP3su z{FvH7aq_QW@5IE&P%)82Ktjnmy;sPmC9)k*6&K4YcZ{}#bK9Y&KxH`a`Vr<1?ez2{ zZyFITm9pol{rI?X5iu2oT5>HjJOPFsQJgOSeK-DjUDf~y+gTiIUgd)$ljwNh>kTd} z?;?^BTJT?5m4gRHV6XFd&c5%(zP@?)_w>7LJI;V!-pGfT$-0dc33|5K{d;&8+E7qK zkSda80l&nNo7(K@Pf&X6ZtTh2tO`&Ij`D2(|TFm`23KF!9~d_{ZPoyjISehUJDH8bk8qRdLC2xhlk~|#s|Z{ z8#9uaPE=FrBA#ACfB)f4AFazyBL#*at7YO~GMCOt+g_>j?3mvBvp`aTrnUv8yg$OU9`2A@zD^9*M(DsnkKQ`?1OQ*; zm6DVuXxyQM5Xjgsi}PO2_m}%%E_f^&PhDd7(OjGF*S3p4>GO*6Wg1}keVcgc0Zx9t z(mR|02IeWr@jVd2|DxCKgo6Se&9#k%_Ye2Hd!=HR0T=6O*j~TjL*ax}j>zf*$T7o$ z5uN`|4gHCnqn~YbaY+fOY5WCQ1(PQV?ZOAw(<~~fl(KIlJ}RZYK@*N7sC2l$sRRJA z1R`4Djk+rzFi(0Gn249G^aur7bJ%{Y88EFo4xlEjS+T7YimI$XoTLs73=I@`W(Yof zzWdUG;?(h*IZMXWwP-ugtKgQrQPtLKmq(4hn3S%@Ims#w;{3uCj$$un^hZ`@|Nq_c ze$~!VOU3K6OZ!t{O-w(ELA^W}*PO#Aq`}TAxRa^64_vcBj7waHBx7g;`Jgg3uWkzu zjv$-dy>^#=$ot_HA+5g(-7j{2#VR}H-(1hnz}ShUuUsSQPR!l}cAlc4Gm{IEx;RYo z&;fa@69p=>{Jd8Z`#jg+@>5C}rtPFWpvsa6`3h+7QUM>4QzYPZ9~lH(7%&&ZNPV=r z_@hOvCIt_%l}F==!MjdH#XNTcd{u0rTJ zZ_fLrf1|@Thl#@PfF@zgDn}vrI_z5daxDJQ2F_@oX%7p|52{X&A9G+{UVnt5GpN%q zhEQwY&dyF;0R_gC8fWgG1_$Uv%K?FwnZW3M^?Rik@N0xfGXS%n{j_+g7Q#oDy%0sg zQ}!=fq)jFn?sezMa1|JXPuprx zr~##K0(<}Zis@m3aM5U{wx4e=>VZ=qF^7=nMubH(dyw~)ILHoI>xBUb8DXp^V0=Eb{lbI=Y+}qAUAb{rMv}-RA-BKT=o|mAL}8j1(&=M z3voqQJCDI*A`AM0So{wH+3l!PD-YRbNT7+L?0wVN3^|us_@{}h30q; zqJ_ATrVU9}gRx*}E1rgu8W_aeKV3iuNz$H+btW%oIQQ1VzlBA(wB;&I13#*rVuBw; z>tj$(k_v3bt0V3#(qRG?WG4F}g)J+CmRYaZaX;0Y)L2+EOwE2wKl_>~vYPqm6}0Ne z$^Ev-;DGCKb&uPTu=e#m{4N#Ykju*UcY6Z9BeZ&Xn=;QPRtY?>Je|bjY1eMKMUL|< zEcVkM8C#OyC5wGNx&pER_Ed6`_E^DGNc zvDEXZ_r;P+g)usZ2M6%4bzCK{gOu4UWaBNHLgG(`TL$}?YN5K-?1YQwuI-uEop{S` z`x4YMD?kg**{EJ&p004rhxICMpge``D})Ud}1u@Jt>F zmNAa#*Z?o$Z63vWaN~Ki{o}}NI2o?Sl{_%Az%Ey}1J9Xb;p(Y;^Kc{M@EbKL5na9D zI?;{IkOQLg>l~-wiYn{zw(o?{%NMkY=?vs}9Kl_F9{#)_<3{r*d&(Vx#okgo8&Uc7 zdM?BAauQ?qC{8&eJK+`{#9Cz$vphdZKIwL$nn;d7dT9(L>Av=N10sJ0U!&<{v0!RJ z20pS6T7403$YF7!0@O6ITR7s?w9a615`tLgpiNea>a97qPcsU2tH-T@pLQITEH{yF za4sbH8fzz0+`qdnp!0Ot&l@c9cngSiJQhL3Vpm#hg~b#eMs|Jy_cGu>J0SzFNusE# zcDx~)Tj{NDN~>UeN08=hTtE_9=hdU6nm}JqYMYTK;GPS|rHqsT!qHzNB@@cKwMPD} zX3?&S-1pl={%F;qYE^RcdD>_hkB!|%)i*s$R=L(wY7U_fvkFaNCLw5-$p%z}XZ60a z1^^-E-u*!DKxD1lR9>S2L=dmtw#e@cn1IE~xH?1J)DxH>SNd+x%Q;Tz&pji4dU&8p zWijS=O|gQ_#cA)qA&76eAWL4v|Kc|?oiE*d&m?d;&q_i0%w^4wX!{FnnGAj10XuD6 zoA@k3-=He53jFV|>x!kV&57ml5fg{=M-7+`jOS6;a%9g4u7%#e? zQH{&Itp`wVk_q&nyjgGkNTVi_;MsK(;l8h*Clg4S8YaY0qlQEfy^4BVrIH#>LQ$ct zeEIDui!r%Dv0?wjzTfR9%)j-mhFhvU3F-C^q1Te%wKfF&qoFkW3(CCV)|)qP$eI-H z^ASn(&#=!!*sL6T&?Ryu;sEY%m84thu->-|MCKlL`2BR^Cz5hkPz0@L)=JJTtQ`gYgdPs!& z<-KbXkHw1{W6;Nl<><7t=3JfHnN-h~U-WyR&j6lgy7?vla^AW{O?zjBmt zXOF}6q9e|^zf@!l6o_KtlaeYYZS0}bUm2l*`(ii>*BC`&nfCjFZxOMe7>Kq$cXe%F z6ZdjykO_SHu=mKp_=guc!xSR zWuao1bn1Oc8Ap5i?MXwDxFeH9J4B06vVHFxK`)I5Hr1RrBqTV-Nl;!#iz^~Jo->Ab zs`~gS+vI2~yYf;CIJJ_*jg5&mvp+ln$&Jn&_Qt)Lc)4tMMU}AOcXnN1?It{lU-6Q8 zHBoUdv0FCqQD`WmisWMoPHzQQ-@p=qgUx(|XU!4OI2+-zqeNJ%J^}{{KW!9@4A|*g%>k&Y zKI|(iSoTO?sjEyH8IjOwnx)<1UAT77rEt)eWs|jxXFLCmT!Gdtb1mO(v_~+WQ{yE1 z2-HqXd$~un$}^rh1vP|QAmUu4JbTG-=AU=hUWfjkD7D#Z5y10z8S-%q9Qqq3_P{7h ze&L_4n`LPau=@`scY=^KTsOIJFGxR=d_T=@0N2K}NGRyH4B3+h9?v|!=KQ_b(82ek zI_)L59{T$Tqs&5-MN2rELR?beij!D>oaz#N2Q(!I+K2Tgmi@elj=%IH3S(TP?LPKZ z-uil5b5Wo}xCwa6#Jl3gYjeLlq%{25d>G;zp&!E^s#Ikgkl)*8q~$Waa3{B2 z^|36sy#Fl02Jyk(V*XMwP57M-SL>WJO9)boRnh#YOZ`{-(l*{b)o=Sy?rw7Npr=#8 zG;K+4@!~3t_XI13KS$cnIS?uAKy-h_q?donPrN)})r#vxoU0>%*SAR zd?`=w`b29LDO`~_Ah3FunrC}`g3MmE?vWGi{r8mo9+HKlL*tF2QAcRXxkN@du>?zG z9~{*edM9cIXIEUROP!h>cgq4vm3_Egc@i;;3-={bu?HvHcQCD%r_sme-s|qmuLFJN zA4)cEto1A{Fhb9qHXXa+=$N*5YrDy5VlUWee*a~axW;mJm=O?cU{cEBZThA{I?_Uk-Bvf8FyQqnM(VHuMTB2YwUpJfipgfn z?^eORmt55vj?8_CmRv*aIcST?=&#Luy9aZ|b{Td4)rcI}OEO!-#TKo+Yg# zX;KkV@sP3*R)K;Y!?sih?oeFm-bOwNh%l zX!*7*;31KH5{}=0{@el^tyLdwAELWa$MY_swN>1AMu>0(ySOLl_^PQ#!sW3WolgRn zX$eBdM=P}pn^jCiQXXwV6%VkYAohUKQG6844FjU#pk> zfm)e3@v$A%BL8a&i6rz2%fxGsh)d!WAwF%;Gvd)#bBcmXj)C^8EhV73X+(=8XN zmpAKEaiGc$7E1TUaAP0%|6yqqFFk`=QcGa9#Gew|IA3O6LK~*^E38*ANzggoY2vr* zJ;#oSW$`U?&xU7ovRbOE`FYn4bw*7yV5lJQVZ#(g&67!DvYeVQ!y?EI{!(tSJ zvwq30@rkbYpJTTo;ZocrcZvW$Mpjb8WI`O!_JKH{rg5T^8m3n6^+^_7Id2LIdgFJ{ zZS20bykczaL^!xTAy?77MHu=DNv|L8$RV?N6NN~7Mqyj1*d zGngXxcE@U~fd$u)SH8_#{Mnp8mFu*O&TFexpD~$8;Wbg7?u(^xzpWkOLS!8%Tx>G+@0pZ45Ia*L zdnR_}8O1;3$Z-IUUis`#Fbn|Pp1Oa{YWh9ma92BxPl=s<9kC{#Th>7mPcZkz?NY-y ziUNfv+8;Jmi41?eEw{XaysL|$!{kh;av^gUXj#~}6Dg{M!uOpF8oW_vG{NM&aD#lE ze>3Z{s(ce}rG9UNl={RS5EhOJR$Jzg3nWccR?2RY%GWyGr5|^h>GXmw1RdnYn6pUJ- z%8=N#l}jv!fXG{Q`1Pb*YtwZ-jmG`ETgP=KzjMDVeEDGc=b~8V&;-)uYcJeJ33KPc zci*D`-DNYyj|jriPp@RdSXmQc0@2|g$k(o2Y>|&SeTCf@1%~hVE420Tb)0?e*QMm4 z<3zSpgZ6OGC)c54V%8itGUQSBVD_?t(A3%f2&-FxjHuYi`(Hy(m=z2>BNbFtA+`!w zT^z`F%=8APS)nj#-#d!TG;gBUC<-~2OBOWoICow_KX797i6_QVQdlTM5nCHO*3ozgt%|o6Ull;BHg^WzRd^tr-Qr8NkyBpI zkT1g|{E)b!<7yx|H4Da=J4C%xca1Qy5xx3S$~8Sb^<(?s;NV{4(`{@0MSOJKdV}cA zp>k;>LH`^PXkfD=0c_Qci-$EXKltC1m)i$MpVdc1cXN9_E>KPh@NCfjq@N1^ zwog9IJ8e|3)}@E@y&0&{lr%KdaSIN z_O<2MaXZHaerP|HgRG{Bc}AOIj`0iG8$WUCUN>ru=vJS;iCZW)b3N+ZX--hapOePd<>?s6?@?YAcl>iUF?hR=QI}P=4mcEdOx>QH4QF__!Y_(F3%-qeKcjV z?987{!SN+ULSrDQ|Wjm1ITuH%$B> za_4ZTG&c6oE3a%JK!;_mxOuokCOMj2>eu$s9|C@qa(kP*4^T^RW5s-O^L`$75>)jA zdINjjva8g(Q52XQ&i&|T``*nl0NdLw0O6ob!1Ti5S}n?bK}(KB*k0iXWrJ!aMK*pt z{i@&rLB`O-JZmHi3i?r(O#BMf$1oA1eFL3u6t?J{`&+X_Az~m}$n+i=orOiKI>fw% zXmUPpd`SED?K}{woN*kI7p9F)8fn2`h;>XZ-@;q$lv>+tMR(Z;<7=!f^UeW6qRJQ= zRtExrW{rE^*?;Nx(_N1VU`m;z^RvlPBW_P;-!q!d;~rZ--L3Cq58^c`so4Xmp^%)i zJ{|@LUG@uN`v@R$@Q;Fc`U-{@toD-~f5r?QL3g+-PgP5k7Az_%Uy(=E_n z`KZ-h#p2>`>m)aF4^*B>Pdxy~Z>@lsb8bZb)@(!-r!L>;{?gCKSsojKs`#+0jBA&G zy@4Dd_Ggri(On@bvIt2^N)q$ixu5o))0nL#!<1P$j+eZ7T1wfrqhJ2kp(h2Fc%B%^ z$YBQDgwxVat*?|H%YZ5y+ZJ%H527Fcn_6fp9$GfNfA}+IH-wzZG^wucN@L5B!W~Bk zhl=JF;`OH8iS4F*{NSTop(q=&71z_z0ma8waXe<=ige+ubz{r^2Ls~o(Yrz0$EuvY zf!Vsn1NW~{K~;fcI}j2S>>u^B2%=@N^*A8NqxYVM-LoPF31f9|C_@x_`>8%97CCc0 zgB~FH1v<%l-oPKBT01zW$}MXzL8^8%o)P0E z#3rNSZFcNyHB*ID8+SE>hD}F@aeF0%4wy_BTrqi?((FH$BRYL4NbMY#~vayfv!D-?= zVsh<_Skng2l@soy+^4p;vzc>$t6EE$PzV}Zzc@|*5Jz+qD$ zJxQ`cfAWHY>MCi47qh8LMUcnBb!WQp2=QqYRm;VXp`k~1LXhFT9TQV&LDhyv@6$o; zi-GA}i`h?_X2q^2Pvjh&@Sfk~xZS)qsE2sFNLUP8deU0o-Zh@H;yGx0!BERl2NAD)x%}3Gj*OwNW?nj{rR@HN+&bc%h{)iE>;pgV7->?u zi^&)D>jcr?iD4@^{qp0OlG<$XzAO5JTfF14OpmHbB)KTqV|`oIYp}CQ@}4~5y?VFF z;xyQ-Fe}*kHE~ChOgI|+Jic2Sv`d<{_A*FvT4T((b>T?GH5P`3>gaZ&cqHpXWzNX0 zQyFTVN2jWTw?PY}-2j5f~KeNQj0)a{TCrfqxtQ4?x)ZLjp`DQ9OeC>d^Jt z_|BK)lCEe>t(H*L#&s)O?`!=7Zd$9Y_YV!;DM|;xa7|b&>s~YZ!56>giTrh07W5jdUZEVfiRd@x$1SCpc94@|DRXVr8!x`#&B*_z&S{XjOXUXsD6SJ7J? z+||kqq}aJ@^66K6r)O^rOyb*3Op+}o+q<*w;b8Ml@{?!$^O1;ULVx0Ym>ZiNw(x>b z4nriaaH{n24v%8@4OJhNyz+*J40p?By7e+)(<`01Gn`Mbllw14vtEz8(<0#R z`~$;s&#cFT0kb~ziCtj<(S3X4-7iFi0Dvnb&+sfGaw*`Ikj%zMu`iFCx3ekg!KhQZ zr=AwLie!I@-(0L=S9EP=KWhJ$WZ*yg@|jzPD45*(u% zZRV|X26b|5_7=n6Sv#%vd!JdV>h2P47OtM~DJu1vjh6Zh1e3943A1A0;a@A0w!1_i zulb_v;Ltay{0G^yg5>lTyTCQPsFR%_V?M?5&_M_t78UjhxGSaOGFBgHYB#!N@V^|i zW1*-VSb6u=I~X~d`y6aU&3<&J70LL)-`bS7#crh=XlLDw{Pw*hu?K|3AYfUF9O!?W ztFZjeXDUcvT?^ZS1o_r#VzBlxf=mtgzGmZ^7F^Wt;JVc{(K4EZKvNup>*DIx;aztPT5zdY(q~m+ zj~KrDaTj8@fU^_}|Lgn(VAdyhO)2{FmJr=s)4%;rs!l_H?yx}N6crJM7k`clyG(k{ z21G{!fjwMfy&q&-{oLL@OG;V{5MAE^^AG8JRJfRIBJBK^uU`l4*x1-|;c_!|5zcH9 zQ=z!zoGv7fo*xcZ*K&e?kP zk9-8j)Do>X_E>f907}Z`r5AF4o9+8ylxC=UmKoK$V3g z-f||wg>m{6a2|R!ZE(~=Gv_=M%<-^{h=<(B*qGzf`MyTa;%OFghKr8Mm3OzKaz=_b zzDR(Knc%*-VgYl(2Q9=D2175&ML?bT$u493^yueFoxc6$x-c`UU)t#&i6eG<*O?nf zGP6f(y!%KNk)vl=>e+5N?`%h~+WIXy3> zdj*kPcYc+YRwB~6KqYT(Pym>)#R0d*b!%N~o*~~77X!Y@!|~q%pZ4}dMmAUJ59|E$ z?28NA2m_A!FvNbA%W>n|NSNA4RwAp#pB!~^x*Zxksi$T4!Y%TA1#cb6M_0G8$u^`s ziy(tWkp1>f6z&76)O|oY7%BBAqzXvj@Fo>xskn1QTK#3!A7#?%=*hTk)D{$6FABLv zuJu}WqQ))fM!KxwXmAo%h3pN5$%%8v;}fW*jt4(b61>?h;Z|O=`?yny>B|ZJ6SOZc z3+qdU>h9OXKYeT8$1{{av#S1KdGt_7=+1b)i|%)!mgemv-vSSg+uU4~$~A9R;**fL zjnDJ)l#aa}gru6XJ*!icVXi!am>r6gf%5+J+{}jwd>XAkuGwEUUOsG#OEb)S<8B<~4WW^lHjYeRc0x z;SLa@3vqCFVNBWWb@oi!=C)m9*`uqOa~beEvw@7H`i%iN(d4b?O=}(Ni zS)An-CTxu5FC1<(8h`Ad8yK)UlsfTI-IVW`N}N#KFj;>8Dks9nQ6pt2q| zO&>i@P-41$4fZ34&_4m3{QsMN&Oo4pU5FNT1@+E@r^r6wQX^e9kE6pJvToKpjbjs> zMzIYf_$0yLDi`yJgW@j}zztaxyFcaDFI051f52UL&Nu~W`Ho+kpem%4s{MF97&%n) ze(MPY@`-DuQWvgU1h^~ZjWzALB}E~G8wWP#Ub`)*l~vFTAYsZ@m+RC^0YM+v@>G%z zlwB$)8P99wlWGi2xdiDI*$qMlzWnNs$n!S1_WTujB5{6GQsu7al9Q6M`c<1myY##D z3%^wtG)8$9ojb5aUJ((w4Slp|9v{EDi%Vg|%xX^mW@^AYba`m(1cB0IeDGid@b`SV zsk8%t=4OSejo6sVW9{+H&OVy*#fF8ZZXa86=Drb!8P2c-BQ>mTaya2-{+GZh_9qlE zS83$){yt^U&2wi6N}el!6qB!k?*ETs61&?{W`W@6S0y6Mz?i1Y1xKrz&(wdToq7Jl zw14DI8M&648pu=CsMa!scXxUDF1^c$nCYp~_QTGpL(&K3)esw~mW+mKx-Y<+t^MGB zgq$4X>N>*LY+R`@(zcwC`kYrP3STv6XRv{fvY2#tC1rC8fdKeF>UP+nX!=*m7691y z18`cj=L4>aM=khV{fCNw@0}dbsP}z3IJ{sWOYIQ`&h&}UeUA*)hRU&8G}qPnn2T<0 zrCQ^#hw3(is{P+g1in)Jj#OWd(CM|Sc=qho86-8GE;UJn9#cS*`ani@&w4;BynBSf z!OEgNlsN$RdEaw#(#^2p`#qPajrFi^n6QSAtjQuC_?4U(6Q);jz-!F%X>>5dkv`*F zK*9~7mzFQ9GXf4C)y_XR_P`N9ym{#HD~m<>*}K1d(Tz0NsH6n^FBlR*ZxXx$Q-QYG zKBhHN^!6`1o|Q-C|Ae&*%s}0b-RFeiuc#$Zfl9IVZf>Yk9=(e4ze@w20F9i>+(;VA z2cf}bG!_O8OqhvMdQRYPB_t;gp@LP-VU+#xW=d*No?iz$h`LS5TR(#tPuS!4r;%6q zeFN180)jV%WOX0B)nJ|z)d@rl);x76UPL>S5o1=JN|Pqbd`wc5z9uAo*C=I`GmUubWBkLLjH1}6QoR}he(nMyB7Z(O z2v>BFt6MN}l*^F5hvI5!O58)a{!N6LB%cIZ!tvHg?!%rinmq4L@pTb!Mf~~4)6;Zt z>b&AYL=$duv!JC?9336wB0g{DS}qvtRNECrn2qo(FN^GX*xIIViXOaSI-&inVJs^l z&6KCGko9Ap-zEy)ul&POawYfU=xPgZr+#I^+A&?q)P%J|G;MJ_D*4U3JY5(X*0~!J zOIJ|+l|vF-2z>S$C4!O7zUZ-aMoelEzi|%X1i`{E#FBJ+fG#aohqC}=aK!w5%BRr_ zXTnwCdA)Tl(+sFSkYb~k+Oi}IC$?TjOa*8-I1Xvx)1&)GjLNk0^K7o)nx59t^{AQK z<~&_nt8_*#O<&oDJz+#QhmC~m|+njY<`pn;#y7rhvK#(io1+LTQz5d1M zGk=sCb;=N^k}toXw}rSjrpS3gl(F2EhN6gL>DTvya|d2|uWggQ4VERoeyxsVTil_h zqKli!{?yMO5Vd(H4qQiCV1vjLBGZ3~?h-+C2PgqW*tA#qq0{cMM|V4Xji%MeXXj?J zI%Eo}n(N@Pk`X1Gw5?5pRJbBYI03tfIaz<-r|Y@Q7fm2RY||e%0(w=6a`6-iA)ZW; z(Z7I5P0U|A_QATve=d%Vy-LFdD1Qk7FG=v+Fj5Cg;Q2Rv$zNe!PVCci5n|I+*TQzqb8+7$tlA z$vjiN;zM%~FRoHcjYu9PG!EEnsst$qFNGqZILjpAyd7A$Bln}+;KwmAxC&bs%Z7Ys zEIaKY16+({E>VM_+hD(j%Co5s#$|M#PkIxuy)vj%#IvU)=!sA-GsEYWPbx1OUoiW< z(E+|ecR`?OYw}q&mLNaA)gf&Sn@;JyZ@Dq_S69B;oW-$X4(%55f6rm7D`qGbVxM(A zNfRyA7g;F^e4I))SJsA1!nYGN{-Kju+>^AqcK78Y8`=_QIBj*WX zGaI@r>01P)4tO^_B(Q!Gx&2<2lh_6!b7ryFvq|XzwMX_P>h;yXuGsW{|6ZVNXFYeW zCZL>YlT{Rn-<>p|#RMDMIM0LaKL9U`InH1@nC91Xjx-s?% zF&KINSFSA~rqd#SNCdmO%^1-(X0MDnqNO>Aa^fKt&X^0AEtOHX~RG0vPdj?p{ z@Y%{rsuiIY^Ts9K!m`P1?fimos7JMJXPSHL7xnK4ZZ1hFzI{jG_edb4)(8&aKkZ+A zH(#j)(8VfC*Q4$N5leGf&>r0i^+F_D^)vki^ z3C?fEHWKzZhQn(Zdh+uD-hFI{U_5yLB!x*e^4#5;3?EYzq&>WsP$MLkhN5|U&@!PMJK+B=C829o39ew+`#bmUZTZSeGBzM6NRSRZ*9$`DT z=$7#}F=V(WW+f%Qx&A#q%0}7VMR)>#^;p^|PhK&W@*bpLJ!b_=VZ9Oxe#69z%r z1Aqmjg=l;ywIN~Q&rAoAF|V8vi0&G%Zu!9zb8)fw>D+nF&Hm! zaT+P)K4d8@JurZR;ta6bwidrV6aUmLa4Rk#Zd0FeKSW*IlC1gkt2S6_I++%$@p?)O zJ-g%$(M^%R8cXjRYKN)72M*vemb;1w!pDsq|J^Oo^LgZnh*8xaEx<3Sj}DaEjsY++ z`r|_4*ZoRb47s<7|Fts>+nKAue)1%^gba+(%P|rR9!`-GnyEl4?_1!yu$?`WjlKb_ zV=fz`niYoDrX`aZ^$_^y?%)ToWn{%{qv04W{zms*{X^vW`T4R>aCKdsmGzBZNqWLc zM*>V$qF&r>yokv%hSW!pOY#sfLxvD-E65I9w>i_Jl!)P>nLUkdy7w0HM8?iuGsMr0 z^bMSm5xGRi{H5e-xoc^<(^oD+htd}NFdDj~^LfMcf1mJXkSKF6Bkotgv?%@hOMS=$ z1lh$H-+#z1K&78A;p5;q%B!i#tW(r-fc>qX_x6`kBmYBNTP{|qA36eh@i^gbLb578 zFk1rEA#AN~GXiq8tC*N~|-}Xujz#^d9yFaWX^ld?i_upL%|Z zNJZ^FpL=a5Jp*N(s=0IZ=}S!#bH2gA`nk>jLq z!`nZ>9P|%gEdE0TLFj*tyasP;bh+&AB&O#142kLSUE7IlX>mGrgL#3Jhw@{lD%6z+~5kWOdkMqwZKFR&JgOvV{4ibJ$zQk(l+qVj(iNh(u z;eqnoIyyReHTQ#0Jw$6Jq@*w|iKV|&fYd~-yyceor!4=Z1VaYHULwf_igJYO2G65< zpF-?}T6?0k(IS(o9HhE}eau)M;T?UucwPdK-MpAA!+)ZyBl(MnN!1m;Kl|C^|Jpp5 z^!GZ()n=fAJJCP#J$L#bt~LKN@oZT*lC>wL6!y(x!d{&s=rQYuzO_O+7qsJM-+&?H zy?b%yWiR-hrzO?2)sj;?%(=-~rDOII;M$Yj;aUwiKVF4aCJrpEO&T0Z@BS2rx-CP5 zqu1F;P!gKG=>89RC@Hk36)R2o<+^u}XEfv+%r;MmGuI+qzT}B{{H$0JwV@q=!!D)y zSwUR6oa?Amsu&;>x29|*D_u#6cjzA|c(Edp|GynHK_GzsJqQGyKXe;Nes>u+*9%R0WsWf%K( z*q8%Zdw-4}(f4o+bVh{k{<2FV^AT%XTXp{fvqp9{HnIR=-Ao}uJk)v8kpqP%mnJjk zzfG7$$-h=I0s;cxu^+yR=yU(HXa+L{Ntdw#&+e|S#QuJrE(tq|rx1NIYHSr7ASB9{ zfy1eWvvbJ`!-b<$t@Q0(7F>H}29L^|#x|oO#^}|2d|sb&+sVlDT4nr2(_CgKhoHok z+(DZ!Lpmule5bNDOLzE$Cn+=NvK* z?TrZ+*h3O=3pKT62d}lN>;o4lH75@wd_6!hD)brqcl!iVeaHt7g4uyjTb03dSkqN* zwgT8^3(Eh|R(f+_!mcj={**7()g3`EKGw4`sQ>zuf4;RHeYk{E`Xxm;SYV-Y^EkBa z#0lexN)X_4M@?)h^ugE2w`kv?o%d~iiDLgZNhST*l=C6(RHk_)lhLRD&^kGQ*7<*W z-WRj~yyt4cxc-R=&X1Y`EUtto?tDnz4w}|X?>ak}|F6FEZ!r3>1i}s{NE}?kwMGsP z%Wjvw@2|FqI`#0UNJ5gH!U>i=obUsG$McOF4O=r`wBvTUlX@C!J!eZ4(#seIjwziBxy$!v!=PZ~xXpLr8V6G7m zH3IKoP^2CZ`xKLl`|M(MUTQZ@ex$g8B={q9`h~|9lgC{iM8`uZ=|)cbPqH8qV4w?w zD9=v^8TEf?4%VsBVborO!ilkn-4byr{d=)7C;dxD5I9*i?Jm0VuoCtwtxcXIdnlV= zB*JGfWt`#tu zr-G)ybovO}KTRsJE}{9mPt>to4~G!fo!4{2Ihw9o*{izLoNR91$wq6k5sB8 zR&@LJ3Sq0~e?E=;96T+Y91X$IhR&^48d8Q=T-O({!h5M?PxrU}AX9;znNb5)W&AOl zyB7d0Sg}Za0(Kz@al|ekT`jmuO`4}K8rH8|yyxh6vv2R^gEd8c4Nw^f^k%SFXs04z z*)}A$+#_Mxu%)$DkTLXoxT}6hlpo&x>htLSY~+ZZ(pw4;@HPqDD=bv>NSn3#Ym*`d zDe3mggE5c~c9<%V{xL%&&_Pno>RswjI(NvLgoB~E%$c%5fa(mz|wAzBs?`Hqfd z0X$xmKWWVS=QOj!X?|pMq>@iG2;bu<)%9wtN6i2)Rjwaza>*yf`t@syLC=_2uugJ2 z;r*E?7^z*`4Cb6i7%f$2~_6aRD=;j(c1MR3L24993f*7`Yry(HKsp`ebw%KbJbl@kKdr+ z;=fJZK|Tym1107E`ZPp<4kEdvVZhy7S*e%DKank$lA2nC+h_MV2z&RYeXa(gAKSnhfynVa3*NTjZ0YLxOuG~;9 zSha!FmK?FN=K3@4w32Lo-XtxQ74=~yTp9W;2fy}~p~t;+Oy^~2#3kJ4K|vz~zg(A3 zP{Plws;WDHn{OsTgGCaJH-N#$Prap&FgQr7@^^wNGS+PV#Xpq-HNjwv+AN~&V`d1l zrI5hT7Lu^}%(T1W)yy8|P;6NZh1)}+m9GcTKWvOz#mb!p6tc5Lrk6BI^410*d3Ec>5b_qOD=Le!hzvczxR9Y(}*hE2Nnl9 zhx!q7MF|*46r^iAje%L*;$Y%P;4X+J1~rM+V%ZmBbqf`VaQ8>B&WB0NMGJy2^m*^y zV-@q63x!%~m}=9VYt(uY%x^ylp7^o^4nc%LXtz;tWK&XZ~cwavv z{TO~`|V;KI|`n`?- zm>`dwk@N@0u}w?of8l9cfw*iP$tR49?SBZfP*Goi3aD|4Z^8Kt49qB?(!S?>O?w(< zQDghL#bz6axs8p6&UwAYA7gfdo;`n+owHN&b70l^7zQ`q_9F&r024X<7%<*58XbGk zV{}+X3Gi$Lf3p;3qqy4?r%v0^yt0qItcJZ>o{@XM;me=$a-{J!eT>DVhuSdrznz^6 za|^+8X8iM9G}YhQv+%#yo>g!10p)}6n(@}ZjfAoY@8tgA$mbnYvWD9_Q&HWfXFcGY z56c!qAg-F~OiBU{Z9Ft0d7(N4UlKj|JHJv}Ez!sx4aUKxoXD!pt}pL2Gpw)h0Hs~R zY}N}3H2lh4_YMf>(1Aw(?f(fA*$d18vVxCt>HhW!K=A!Plcqm?LJ6i2pweO^ywvd9 zt!v|&{s-rz*8(%tGxjgudAQV71
    J6%VvmAk&IXmSMGRIl@uNCg)PT&$D-?TI%B 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 literal 0 HcmV?d00001 diff --git a/assets/images/2023-09-14-p2p-relays-1b3da3da7ec3915f63ca8668bd38aff9.png b/assets/images/2023-09-14-p2p-relays-1b3da3da7ec3915f63ca8668bd38aff9.png new file mode 100644 index 0000000000000000000000000000000000000000..8960e26e7ecf9d3efa0828a3780dee09499f6a22 GIT binary patch literal 326185 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%0D>o2;z+Rv>95h!2+@?VvLSZ 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%0D*FM3Y5%Thshm>^A-!pHlRgI_4s*o`$Yb`^&@G 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 Ggns~k7BV0J literal 0 HcmV?d00001 diff --git a/assets/images/2023-09-14-relay-versions-a689a96e93e12ee1c78dfe14229f0ea9.png b/assets/images/2023-09-14-relay-versions-a689a96e93e12ee1c78dfe14229f0ea9.png new file mode 100644 index 0000000000000000000000000000000000000000..b611d86543a84b4f1413d2e6fa99869dfddb5ff8 GIT binary patch literal 379198 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